From 3d66e2fa2c3c147cf3ed71a7118f0ff08285cc6b Mon Sep 17 00:00:00 2001 From: cpengilly <29023967+cpengilly@users.noreply.github.com> Date: Fri, 21 Jun 2024 14:27:17 -0700 Subject: [PATCH 001/565] Create chain-monitoring.mdx --- .../tools/chain-monitoring.mdx | 61 +++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 pages/builders/chain-operators/tools/chain-monitoring.mdx diff --git a/pages/builders/chain-operators/tools/chain-monitoring.mdx b/pages/builders/chain-operators/tools/chain-monitoring.mdx new file mode 100644 index 000000000..fff0c0620 --- /dev/null +++ b/pages/builders/chain-operators/tools/chain-monitoring.mdx @@ -0,0 +1,61 @@ +--- +title: Chain Monitoring Options +lang: en-US +description: Learn the basics of onchain and offchain monitoring options for your OP Stack chain. +--- + +import { Callout } from 'nextra/components' + +# Chain Monitoring Options + +This explainer covers the basics of **onchain** and **offchain** monitoring options for your OP Stack chain. + +* Onchain monitoring services provide insights into the overall system and helps chain operators track and monitor onchain events. Some examples of onchain monitoring services include `chain-mon` and `dispute-mon`. +* Offchain monitoring allows chain operators to monitor the operation and behavior of nodes and other offchain components. Some examples of offchain component monitoring include `op-node`, `op-geth`, and `op-proposer`. + +## Onchain Monitoring Services + +Onchain monitoring services provide insights into the overall system and helps chain operators track and monitor onchain events. Some examples of onchain monitoring services include `chain-mon` and `dispute-mon`. + +### `chain-mon` + +description of service + how to enable metrics + +### `dispute-mon` + +description of service + how to enable metrics + +## Offchain Component Monitoring + +Offchain monitoring allows chain operators to monitor the operation and behavior of nodes and other offchain components. Some of the more common components that you'll likely want to monitor include `op-node`, `op-geth`, `op-proposer`, `op-batcher`, and `op-challenger`. +The general steps for enabling offchain monitoring is pretty consistent for all the OP components: + +* Expose the monitoring port by enabling the `-—metrics.enabled` flag +* Use Prometheus to scrape data from the metrics port +* Save the data in `influxdb` +* Share the data with grafana to build your custom dashboard + +### `op-node` + +`op-node` metrics and monitoring is detailed in the [Node Metrics and Monitoring](/builders/node-operators/management/metrics) guide. To enable metrics, pass the `--metrics.enabled` flag to the op-node. You can customize the metrics port and address via the `--metrics.port` and `--metrics.addr` flags, respectively. +See [this curated list](https://docs.optimism.io/builders/node-operators/management/metrics#important-metrics) for important metrics to track specifically for `op-node`. + +### `op-geth` + +description of component + how to enable metrics + +### `op-proposer` + +description of component + how to enable metrics + +### `op-batcher` + +description of component + how to enable metrics + +### `op-challenger` + +description of component + how to enable metrics + +## Next Steps + +* If you experience difficulty at any stage of this process, please reach out to [developer support](https://github.com/ethereum-optimism/developers/discussions). From 1d7be243562df4e38fc026732e3a74a273f8f731 Mon Sep 17 00:00:00 2001 From: cpengilly <29023967+cpengilly@users.noreply.github.com> Date: Fri, 21 Jun 2024 14:52:13 -0700 Subject: [PATCH 002/565] updates --- .../builders/chain-operators/tools/_meta.json | 1 + .../tools/chain-monitoring.mdx | 27 ++++++++++++++----- 2 files changed, 21 insertions(+), 7 deletions(-) diff --git a/pages/builders/chain-operators/tools/_meta.json b/pages/builders/chain-operators/tools/_meta.json index cef5e367d..7d311eb0c 100644 --- a/pages/builders/chain-operators/tools/_meta.json +++ b/pages/builders/chain-operators/tools/_meta.json @@ -1,3 +1,4 @@ { + "chain-monitoring": "Chain Monitoring", "explorer": "Block Explorer" } diff --git a/pages/builders/chain-operators/tools/chain-monitoring.mdx b/pages/builders/chain-operators/tools/chain-monitoring.mdx index fff0c0620..1e5794abb 100644 --- a/pages/builders/chain-operators/tools/chain-monitoring.mdx +++ b/pages/builders/chain-operators/tools/chain-monitoring.mdx @@ -8,10 +8,8 @@ import { Callout } from 'nextra/components' # Chain Monitoring Options -This explainer covers the basics of **onchain** and **offchain** monitoring options for your OP Stack chain. - -* Onchain monitoring services provide insights into the overall system and helps chain operators track and monitor onchain events. Some examples of onchain monitoring services include `chain-mon` and `dispute-mon`. -* Offchain monitoring allows chain operators to monitor the operation and behavior of nodes and other offchain components. Some examples of offchain component monitoring include `op-node`, `op-geth`, and `op-proposer`. +This explainer covers the basics of **onchain** and **offchain** monitoring options for your OP Stack chain. Onchain monitoring services allow chain operators to monitor the overall system and onchain events. +Offchain monitoring allows chain operators to monitor the operation and behavior of nodes and other offchain components. ## Onchain Monitoring Services @@ -23,7 +21,8 @@ description of service + how to enable metrics ### `dispute-mon` -description of service + how to enable metrics +Chain operators should consider running `op-dispute-mon`. It's an incredibly useful securities monitoring service to keep an eye on games, basically giving visibility into all the status of the games for the last 28 days. +Chain operators can easily create their grafana dashboard for Dispute Monitor using the following json file: [Download the Dispute Monitor JSON](/grafana/dispute-monitor-1718214549035.json). ## Offchain Component Monitoring @@ -38,7 +37,7 @@ The general steps for enabling offchain monitoring is pretty consistent for all ### `op-node` `op-node` metrics and monitoring is detailed in the [Node Metrics and Monitoring](/builders/node-operators/management/metrics) guide. To enable metrics, pass the `--metrics.enabled` flag to the op-node. You can customize the metrics port and address via the `--metrics.port` and `--metrics.addr` flags, respectively. -See [this curated list](https://docs.optimism.io/builders/node-operators/management/metrics#important-metrics) for important metrics to track specifically for `op-node`. +See [this curated list](/builders/node-operators/management/metrics#important-metrics) for important metrics to track specifically for `op-node`. ### `op-geth` @@ -54,7 +53,21 @@ description of component + how to enable metrics ### `op-challenger` -description of component + how to enable metrics +The `op-challenger` operates as the *honest actor* in the fault dispute system and defends the chain by securing the `OptimismPortal` and ensuring the game always resolves to the correct state of the chain. +For verifying the legitimacy of claims, `op-challenger` relies on a synced, trusted rollup node as well as a trace provider (e.g., [Cannon](/stack/protocol/fault-proofs/cannon)). See the [OP-Challenger Explainer](/stack/protocol/fault-proofs/challenger) for more information on this service. + +Enable the following metrics flags for `op-challenger`: + +``` + --metrics.addr value (default: "0.0.0.0") ($OP_CHALLENGER_METRICS_ADDR) + Metrics listening address + + --metrics.enabled (default: false) ($OP_CHALLENGER_METRICS_ENABLED) + Enable the metrics server + + --metrics.port value (default: 7300) ($OP_CHALLENGER_METRICS_PORT) + Metrics listening port +``` ## Next Steps From bf6e0812890133f4ebe5466ac20038199282074d Mon Sep 17 00:00:00 2001 From: cpengilly <29023967+cpengilly@users.noreply.github.com> Date: Tue, 25 Jun 2024 14:13:26 -0700 Subject: [PATCH 003/565] Update chain-monitoring.mdx --- .../chain-operators/tools/chain-monitoring.mdx | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/pages/builders/chain-operators/tools/chain-monitoring.mdx b/pages/builders/chain-operators/tools/chain-monitoring.mdx index 1e5794abb..7cbb2c01d 100644 --- a/pages/builders/chain-operators/tools/chain-monitoring.mdx +++ b/pages/builders/chain-operators/tools/chain-monitoring.mdx @@ -8,7 +8,7 @@ import { Callout } from 'nextra/components' # Chain Monitoring Options -This explainer covers the basics of **onchain** and **offchain** monitoring options for your OP Stack chain. Onchain monitoring services allow chain operators to monitor the overall system and onchain events. +This explainer covers the basics of **onchain** and **offchain** monitoring options for your OP Stack chain. Onchain monitoring services allow chain operators to monitor the overall system and onchain events. Offchain monitoring allows chain operators to monitor the operation and behavior of nodes and other offchain components. ## Onchain Monitoring Services @@ -29,14 +29,15 @@ Chain operators can easily create their grafana dashboard for Dispute Monitor us Offchain monitoring allows chain operators to monitor the operation and behavior of nodes and other offchain components. Some of the more common components that you'll likely want to monitor include `op-node`, `op-geth`, `op-proposer`, `op-batcher`, and `op-challenger`. The general steps for enabling offchain monitoring is pretty consistent for all the OP components: -* Expose the monitoring port by enabling the `-—metrics.enabled` flag -* Use Prometheus to scrape data from the metrics port -* Save the data in `influxdb` -* Share the data with grafana to build your custom dashboard +1. Expose the monitoring port by enabling the `-—metrics.enabled` flag +2. Customize the metrics port and address via the `--metrics.port` and `--metrics.addr` flags, respectively +3. Use Prometheus to scrape data from the metrics port +4. Save the data in `influxdb` +5. Share the data with grafana to build your custom dashboard ### `op-node` -`op-node` metrics and monitoring is detailed in the [Node Metrics and Monitoring](/builders/node-operators/management/metrics) guide. To enable metrics, pass the `--metrics.enabled` flag to the op-node. You can customize the metrics port and address via the `--metrics.port` and `--metrics.addr` flags, respectively. +`op-node` metrics and monitoring is detailed in the [Node Metrics and Monitoring](/builders/node-operators/management/metrics) guide. To enable metrics, pass the `--metrics.enabled` flag to `op-node` and follow the steps above for customization options. See [this curated list](/builders/node-operators/management/metrics#important-metrics) for important metrics to track specifically for `op-node`. ### `op-geth` @@ -53,10 +54,10 @@ description of component + how to enable metrics ### `op-challenger` -The `op-challenger` operates as the *honest actor* in the fault dispute system and defends the chain by securing the `OptimismPortal` and ensuring the game always resolves to the correct state of the chain. +The `op-challenger` operates as the *honest actor* in the fault dispute system and defends the chain by securing the `OptimismPortal` and ensuring the game always resolves to the correct state of the chain. For verifying the legitimacy of claims, `op-challenger` relies on a synced, trusted rollup node as well as a trace provider (e.g., [Cannon](/stack/protocol/fault-proofs/cannon)). See the [OP-Challenger Explainer](/stack/protocol/fault-proofs/challenger) for more information on this service. -Enable the following metrics flags for `op-challenger`: +To enable metrics, pass the `--metrics.enabled` flag to `op-challenger` and follow the steps above for customization options. ``` --metrics.addr value (default: "0.0.0.0") ($OP_CHALLENGER_METRICS_ADDR) From c1d71be488b7f67401f7b700bb25ac9a08e2e943 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Fri, 30 Aug 2024 11:46:28 +0100 Subject: [PATCH 004/565] added force withdrawal guide --- pages/stack/protocol/rollup/_meta.json | 3 +- .../protocol/rollup/forced-withdrawal.mdx | 70 +++++++++++++++++++ 2 files changed, 72 insertions(+), 1 deletion(-) create mode 100644 pages/stack/protocol/rollup/forced-withdrawal.mdx diff --git a/pages/stack/protocol/rollup/_meta.json b/pages/stack/protocol/rollup/_meta.json index 0e5361de9..6eb5f0c4c 100644 --- a/pages/stack/protocol/rollup/_meta.json +++ b/pages/stack/protocol/rollup/_meta.json @@ -2,5 +2,6 @@ "overview": "Rollup Overview", "deposit-flow": "Deposit Flow", "transaction-flow": "Transaction Flow", - "withdrawal-flow": "Withdrawal Flow" + "withdrawal-flow": "Withdrawal Flow", + "forced-withdrawal": "Forced Withdrawal" } \ No newline at end of file diff --git a/pages/stack/protocol/rollup/forced-withdrawal.mdx b/pages/stack/protocol/rollup/forced-withdrawal.mdx new file mode 100644 index 000000000..bf46859ac --- /dev/null +++ b/pages/stack/protocol/rollup/forced-withdrawal.mdx @@ -0,0 +1,70 @@ +--- +title: Forced Withdrawal +description: Learn the forced withdrawals and deposits flow during sequencer downtime. +--- + +import { Callout } from 'nextra/components' + +## Overview + +This guide explains the nuances of forced withdrawals and deposits transactions and their implications during sequencer downtime. + +Users are allowed to force-include deposit transactions, which can initiate withdrawals, at any time. +However, there are important nuances to understand about the chain derivation pipeline and sequencer behavior. + +## Key Concepts + +* **Sequencing Window**: A 12-hour rolling window to include L2 transactions based on L1 data. +* **Max Time Drift**: 15 minutes, the maximum delay for including a deposit transaction. +* **Sequencer Downtime**: Period when the sequencer is offline or not producing blocks. + +## Normal Operation + +Under normal circumstances: + +1. Deposit transactions are included within 15 minutes. +2. The sequencer processes transactions and produces blocks regularly. + +## Sequencer Downtime Scenarios + +### Short Downtime (< 15 minutes) + +* Deposits are still included within the 15-minute max time drift. +* Regular L2 transactions may be delayed. + +### Extended Downtime (15 minutes to 12 hours) + +1. Deposits are force-included within 15 minutes. +2. The L2 chain state remains uncertain until: + * The sequencer comes back online, or + * The 12-hour sequencing window expires. + +### Prolonged Downtime (> 12 hours) + +1. After 12 hours, nodes start generating blocks deterministically. +2. These blocks only include deposit transactions. +3. When the sequencer returns: + * All deposit transactions are included first. + * Regular L2 transactions resume afterwards. + +## Important Considerations + +* Forced deposits ensure timely execution of actions, mitigating risks like DEX price divergence during sequencer downtime. +* Actions remain speculative for up to 12 hours due to the sequencing window. +* The 12-hour window is a balance between operational reliability and minimizing potential L2 reorganizations. + +## Example Scenario + +If a deposit is initiated after the 15-minute mark but before the sequencing window expires: + +1. The deposit will be effective when the sequencing window expires (up to \~11 hours later). +2. Nodes reading data from L1 will produce a block with the deposit after the sequencing window expires. +3. The eventual L2 chain will include the deposit in a block with an onchain timestamp close to the L1 block where the deposit originated. + + + The sequencing window is a rolling 12-hour delay from when an L1 block is first known. This design allows the sequencer a grace period to come back online without causing L2 chain reorganizations. + + +## Conclusion + +The forced withdrawal/deposit mechanism on OP chains provides a robust way to handle sequencer downtime, ensuring that critical transactions like deposits are included in a timely manner. While the 12-hour sequencer window introduces a degree of uncertainty during downtime, the system is designed to guarantee eventual consistency and transaction inclusion. From dab703edf2da4c37fcfb85415857ab384434c36a Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Fri, 30 Aug 2024 11:58:56 +0100 Subject: [PATCH 005/565] Update pages/stack/protocol/rollup/forced-withdrawal.mdx Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> --- .../protocol/rollup/forced-withdrawal.mdx | 64 +------------------ 1 file changed, 1 insertion(+), 63 deletions(-) diff --git a/pages/stack/protocol/rollup/forced-withdrawal.mdx b/pages/stack/protocol/rollup/forced-withdrawal.mdx index bf46859ac..499b1b3c4 100644 --- a/pages/stack/protocol/rollup/forced-withdrawal.mdx +++ b/pages/stack/protocol/rollup/forced-withdrawal.mdx @@ -5,66 +5,4 @@ description: Learn the forced withdrawals and deposits flow during sequencer dow import { Callout } from 'nextra/components' -## Overview - -This guide explains the nuances of forced withdrawals and deposits transactions and their implications during sequencer downtime. - -Users are allowed to force-include deposit transactions, which can initiate withdrawals, at any time. -However, there are important nuances to understand about the chain derivation pipeline and sequencer behavior. - -## Key Concepts - -* **Sequencing Window**: A 12-hour rolling window to include L2 transactions based on L1 data. -* **Max Time Drift**: 15 minutes, the maximum delay for including a deposit transaction. -* **Sequencer Downtime**: Period when the sequencer is offline or not producing blocks. - -## Normal Operation - -Under normal circumstances: - -1. Deposit transactions are included within 15 minutes. -2. The sequencer processes transactions and produces blocks regularly. - -## Sequencer Downtime Scenarios - -### Short Downtime (< 15 minutes) - -* Deposits are still included within the 15-minute max time drift. -* Regular L2 transactions may be delayed. - -### Extended Downtime (15 minutes to 12 hours) - -1. Deposits are force-included within 15 minutes. -2. The L2 chain state remains uncertain until: - * The sequencer comes back online, or - * The 12-hour sequencing window expires. - -### Prolonged Downtime (> 12 hours) - -1. After 12 hours, nodes start generating blocks deterministically. -2. These blocks only include deposit transactions. -3. When the sequencer returns: - * All deposit transactions are included first. - * Regular L2 transactions resume afterwards. - -## Important Considerations - -* Forced deposits ensure timely execution of actions, mitigating risks like DEX price divergence during sequencer downtime. -* Actions remain speculative for up to 12 hours due to the sequencing window. -* The 12-hour window is a balance between operational reliability and minimizing potential L2 reorganizations. - -## Example Scenario - -If a deposit is initiated after the 15-minute mark but before the sequencing window expires: - -1. The deposit will be effective when the sequencing window expires (up to \~11 hours later). -2. Nodes reading data from L1 will produce a block with the deposit after the sequencing window expires. -3. The eventual L2 chain will include the deposit in a block with an onchain timestamp close to the L1 block where the deposit originated. - - - The sequencing window is a rolling 12-hour delay from when an L1 block is first known. This design allows the sequencer a grace period to come back online without causing L2 chain reorganizations. - - -## Conclusion - -The forced withdrawal/deposit mechanism on OP chains provides a robust way to handle sequencer downtime, ensuring that critical transactions like deposits are included in a timely manner. While the 12-hour sequencer window introduces a degree of uncertainty during downtime, the system is designed to guarantee eventual consistency and transaction inclusion. + * Regular L2 transactions resume afterward. From 6ad80740d18560e47c32f7e3cee2afd1e289eb4a Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Fri, 30 Aug 2024 11:59:22 +0100 Subject: [PATCH 006/565] add lang attribute --- pages/stack/protocol/rollup/forced-withdrawal.mdx | 1 + 1 file changed, 1 insertion(+) diff --git a/pages/stack/protocol/rollup/forced-withdrawal.mdx b/pages/stack/protocol/rollup/forced-withdrawal.mdx index bf46859ac..5f2efb729 100644 --- a/pages/stack/protocol/rollup/forced-withdrawal.mdx +++ b/pages/stack/protocol/rollup/forced-withdrawal.mdx @@ -1,5 +1,6 @@ --- title: Forced Withdrawal +lang: en-US description: Learn the forced withdrawals and deposits flow during sequencer downtime. --- From d10df7ca796ff528e324d361f5a01f8b8f756d09 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Fri, 30 Aug 2024 12:02:26 +0100 Subject: [PATCH 007/565] undo changes --- .../protocol/rollup/forced-withdrawal.mdx | 64 ++++++++++++++++++- 1 file changed, 63 insertions(+), 1 deletion(-) diff --git a/pages/stack/protocol/rollup/forced-withdrawal.mdx b/pages/stack/protocol/rollup/forced-withdrawal.mdx index a4863a45b..5f2efb729 100644 --- a/pages/stack/protocol/rollup/forced-withdrawal.mdx +++ b/pages/stack/protocol/rollup/forced-withdrawal.mdx @@ -6,4 +6,66 @@ description: Learn the forced withdrawals and deposits flow during sequencer dow import { Callout } from 'nextra/components' - * Regular L2 transactions resume afterward. +## Overview + +This guide explains the nuances of forced withdrawals and deposits transactions and their implications during sequencer downtime. + +Users are allowed to force-include deposit transactions, which can initiate withdrawals, at any time. +However, there are important nuances to understand about the chain derivation pipeline and sequencer behavior. + +## Key Concepts + +* **Sequencing Window**: A 12-hour rolling window to include L2 transactions based on L1 data. +* **Max Time Drift**: 15 minutes, the maximum delay for including a deposit transaction. +* **Sequencer Downtime**: Period when the sequencer is offline or not producing blocks. + +## Normal Operation + +Under normal circumstances: + +1. Deposit transactions are included within 15 minutes. +2. The sequencer processes transactions and produces blocks regularly. + +## Sequencer Downtime Scenarios + +### Short Downtime (< 15 minutes) + +* Deposits are still included within the 15-minute max time drift. +* Regular L2 transactions may be delayed. + +### Extended Downtime (15 minutes to 12 hours) + +1. Deposits are force-included within 15 minutes. +2. The L2 chain state remains uncertain until: + * The sequencer comes back online, or + * The 12-hour sequencing window expires. + +### Prolonged Downtime (> 12 hours) + +1. After 12 hours, nodes start generating blocks deterministically. +2. These blocks only include deposit transactions. +3. When the sequencer returns: + * All deposit transactions are included first. + * Regular L2 transactions resume afterwards. + +## Important Considerations + +* Forced deposits ensure timely execution of actions, mitigating risks like DEX price divergence during sequencer downtime. +* Actions remain speculative for up to 12 hours due to the sequencing window. +* The 12-hour window is a balance between operational reliability and minimizing potential L2 reorganizations. + +## Example Scenario + +If a deposit is initiated after the 15-minute mark but before the sequencing window expires: + +1. The deposit will be effective when the sequencing window expires (up to \~11 hours later). +2. Nodes reading data from L1 will produce a block with the deposit after the sequencing window expires. +3. The eventual L2 chain will include the deposit in a block with an onchain timestamp close to the L1 block where the deposit originated. + + + The sequencing window is a rolling 12-hour delay from when an L1 block is first known. This design allows the sequencer a grace period to come back online without causing L2 chain reorganizations. + + +## Conclusion + +The forced withdrawal/deposit mechanism on OP chains provides a robust way to handle sequencer downtime, ensuring that critical transactions like deposits are included in a timely manner. While the 12-hour sequencer window introduces a degree of uncertainty during downtime, the system is designed to guarantee eventual consistency and transaction inclusion. From dd81589e38c9b64081950d3a088b88ed391431e0 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Fri, 30 Aug 2024 12:06:55 +0100 Subject: [PATCH 008/565] updated a content --- pages/stack/protocol/rollup/forced-withdrawal.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/stack/protocol/rollup/forced-withdrawal.mdx b/pages/stack/protocol/rollup/forced-withdrawal.mdx index 5f2efb729..f56aeb841 100644 --- a/pages/stack/protocol/rollup/forced-withdrawal.mdx +++ b/pages/stack/protocol/rollup/forced-withdrawal.mdx @@ -8,7 +8,7 @@ import { Callout } from 'nextra/components' ## Overview -This guide explains the nuances of forced withdrawals and deposits transactions and their implications during sequencer downtime. +This guide explains the nuances of forced withdrawals and deposits transactions during sequencer downtime. Users are allowed to force-include deposit transactions, which can initiate withdrawals, at any time. However, there are important nuances to understand about the chain derivation pipeline and sequencer behavior. From 8db955f1fea4db397732ce220c737e086d7ff580 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Fri, 30 Aug 2024 12:19:38 +0100 Subject: [PATCH 009/565] remove a sign --- pages/stack/protocol/rollup/forced-withdrawal.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/stack/protocol/rollup/forced-withdrawal.mdx b/pages/stack/protocol/rollup/forced-withdrawal.mdx index f56aeb841..ba3b25852 100644 --- a/pages/stack/protocol/rollup/forced-withdrawal.mdx +++ b/pages/stack/protocol/rollup/forced-withdrawal.mdx @@ -58,7 +58,7 @@ Under normal circumstances: If a deposit is initiated after the 15-minute mark but before the sequencing window expires: -1. The deposit will be effective when the sequencing window expires (up to \~11 hours later). +1. The deposit will be effective when the sequencing window expires (up to ~11 hours later). 2. Nodes reading data from L1 will produce a block with the deposit after the sequencing window expires. 3. The eventual L2 chain will include the deposit in a block with an onchain timestamp close to the L1 block where the deposit originated. From 808889dc980d5147b02158bdb2da8665ee420f36 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Fri, 30 Aug 2024 12:23:45 +0100 Subject: [PATCH 010/565] updated the title --- pages/stack/protocol/rollup/_meta.json | 2 +- .../rollup/{forced-withdrawal.mdx => forced-deposit.mdx} | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) rename pages/stack/protocol/rollup/{forced-withdrawal.mdx => forced-deposit.mdx} (92%) diff --git a/pages/stack/protocol/rollup/_meta.json b/pages/stack/protocol/rollup/_meta.json index 6eb5f0c4c..c8733ef91 100644 --- a/pages/stack/protocol/rollup/_meta.json +++ b/pages/stack/protocol/rollup/_meta.json @@ -3,5 +3,5 @@ "deposit-flow": "Deposit Flow", "transaction-flow": "Transaction Flow", "withdrawal-flow": "Withdrawal Flow", - "forced-withdrawal": "Forced Withdrawal" + "forced-deposit": "Forced Deposit" } \ No newline at end of file diff --git a/pages/stack/protocol/rollup/forced-withdrawal.mdx b/pages/stack/protocol/rollup/forced-deposit.mdx similarity index 92% rename from pages/stack/protocol/rollup/forced-withdrawal.mdx rename to pages/stack/protocol/rollup/forced-deposit.mdx index ba3b25852..eaaa3d5fa 100644 --- a/pages/stack/protocol/rollup/forced-withdrawal.mdx +++ b/pages/stack/protocol/rollup/forced-deposit.mdx @@ -1,14 +1,14 @@ --- -title: Forced Withdrawal +title: Forced Deposit lang: en-US -description: Learn the forced withdrawals and deposits flow during sequencer downtime. +description: Learn the forced deposit flow during sequencer downtime. --- import { Callout } from 'nextra/components' -## Overview +## Forced Deposit Flow -This guide explains the nuances of forced withdrawals and deposits transactions during sequencer downtime. +This guide explains the nuances of forced deposits transactions during sequencer downtime. Users are allowed to force-include deposit transactions, which can initiate withdrawals, at any time. However, there are important nuances to understand about the chain derivation pipeline and sequencer behavior. From c341ffd69be1968d02006182a9949044d2dc5ef9 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Tue, 3 Sep 2024 11:36:07 +0100 Subject: [PATCH 011/565] Update pages/stack/protocol/rollup/forced-deposit.mdx Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> --- pages/stack/protocol/rollup/forced-deposit.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/stack/protocol/rollup/forced-deposit.mdx b/pages/stack/protocol/rollup/forced-deposit.mdx index eaaa3d5fa..7f4548308 100644 --- a/pages/stack/protocol/rollup/forced-deposit.mdx +++ b/pages/stack/protocol/rollup/forced-deposit.mdx @@ -46,7 +46,7 @@ Under normal circumstances: 2. These blocks only include deposit transactions. 3. When the sequencer returns: * All deposit transactions are included first. - * Regular L2 transactions resume afterwards. + * Regular L2 transactions resume afterward. ## Important Considerations From 710743b7c515c2abe20da9047ea63f13feb9c43a Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Tue, 3 Sep 2024 11:37:03 +0100 Subject: [PATCH 012/565] Update pages/stack/protocol/rollup/forced-deposit.mdx Co-authored-by: Matt Solomon --- pages/stack/protocol/rollup/forced-deposit.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/stack/protocol/rollup/forced-deposit.mdx b/pages/stack/protocol/rollup/forced-deposit.mdx index 7f4548308..a9ecf5e87 100644 --- a/pages/stack/protocol/rollup/forced-deposit.mdx +++ b/pages/stack/protocol/rollup/forced-deposit.mdx @@ -10,7 +10,7 @@ import { Callout } from 'nextra/components' This guide explains the nuances of forced deposits transactions during sequencer downtime. -Users are allowed to force-include deposit transactions, which can initiate withdrawals, at any time. +Users are able to force-include deposit transactions, which can initiate withdrawals, at any time. However, there are important nuances to understand about the chain derivation pipeline and sequencer behavior. ## Key Concepts From a3f994f06e934fb007fa8c9f28ab30d9624b6c88 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Mon, 16 Sep 2024 12:55:03 +0100 Subject: [PATCH 013/565] Update pages/stack/protocol/rollup/forced-deposit.mdx Co-authored-by: Matt Solomon --- pages/stack/protocol/rollup/forced-deposit.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/stack/protocol/rollup/forced-deposit.mdx b/pages/stack/protocol/rollup/forced-deposit.mdx index a9ecf5e87..b02b869a3 100644 --- a/pages/stack/protocol/rollup/forced-deposit.mdx +++ b/pages/stack/protocol/rollup/forced-deposit.mdx @@ -15,7 +15,7 @@ However, there are important nuances to understand about the chain derivation pi ## Key Concepts -* **Sequencing Window**: A 12-hour rolling window to include L2 transactions based on L1 data. +* **Sequencing Window**: A 12-hour rolling window to include L2 transactions, including native L2 transactions and deposit transactions. * **Max Time Drift**: 15 minutes, the maximum delay for including a deposit transaction. * **Sequencer Downtime**: Period when the sequencer is offline or not producing blocks. From d5bf9c9a1ab1683e8f9ec923bfaf03d644783b40 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Mon, 16 Sep 2024 12:56:03 +0100 Subject: [PATCH 014/565] Update pages/stack/protocol/rollup/forced-deposit.mdx Co-authored-by: protolambda --- pages/stack/protocol/rollup/forced-deposit.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/stack/protocol/rollup/forced-deposit.mdx b/pages/stack/protocol/rollup/forced-deposit.mdx index b02b869a3..2915008a3 100644 --- a/pages/stack/protocol/rollup/forced-deposit.mdx +++ b/pages/stack/protocol/rollup/forced-deposit.mdx @@ -16,7 +16,7 @@ However, there are important nuances to understand about the chain derivation pi ## Key Concepts * **Sequencing Window**: A 12-hour rolling window to include L2 transactions, including native L2 transactions and deposit transactions. -* **Max Time Drift**: 15 minutes, the maximum delay for including a deposit transaction. +* **Max Time Drift**: 15 minutes, the maximum delay for including a deposit transaction, relative to the L2 chain. * **Sequencer Downtime**: Period when the sequencer is offline or not producing blocks. ## Normal Operation From 07c9d62acaf5e5e4f761d152635d09f4b6c76641 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Mon, 16 Sep 2024 12:56:27 +0100 Subject: [PATCH 015/565] Update pages/stack/protocol/rollup/forced-deposit.mdx Co-authored-by: protolambda --- pages/stack/protocol/rollup/forced-deposit.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/stack/protocol/rollup/forced-deposit.mdx b/pages/stack/protocol/rollup/forced-deposit.mdx index 2915008a3..835b877c1 100644 --- a/pages/stack/protocol/rollup/forced-deposit.mdx +++ b/pages/stack/protocol/rollup/forced-deposit.mdx @@ -50,7 +50,7 @@ Under normal circumstances: ## Important Considerations -* Forced deposits ensure timely execution of actions, mitigating risks like DEX price divergence during sequencer downtime. +* Forced transactions, through deposits (no need for deposited value), ensure timely execution of actions, mitigating risks like DEX price divergence during sequencer downtime. * Actions remain speculative for up to 12 hours due to the sequencing window. * The 12-hour window is a balance between operational reliability and minimizing potential L2 reorganizations. From 87b56aeb0a553ae0a52ae5cef29e846e80001659 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Mon, 16 Sep 2024 12:57:27 +0100 Subject: [PATCH 016/565] Update pages/stack/protocol/rollup/forced-deposit.mdx Co-authored-by: protolambda --- pages/stack/protocol/rollup/forced-deposit.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/stack/protocol/rollup/forced-deposit.mdx b/pages/stack/protocol/rollup/forced-deposit.mdx index 835b877c1..75d1658f7 100644 --- a/pages/stack/protocol/rollup/forced-deposit.mdx +++ b/pages/stack/protocol/rollup/forced-deposit.mdx @@ -68,4 +68,4 @@ If a deposit is initiated after the 15-minute mark but before the sequencing win ## Conclusion -The forced withdrawal/deposit mechanism on OP chains provides a robust way to handle sequencer downtime, ensuring that critical transactions like deposits are included in a timely manner. While the 12-hour sequencer window introduces a degree of uncertainty during downtime, the system is designed to guarantee eventual consistency and transaction inclusion. +The forced transaction mechanism on OP Stack chains provides a robust way to handle sequencer downtime, ensuring that critical transactions are included in a timely manner. While the 12-hour sequencer window introduces a degree of uncertainty during downtime, the system is designed to guarantee eventual consistency and transaction inclusion. From 45affb8e7f1243e88a01e67dad580d2c003dd542 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Mon, 16 Sep 2024 15:32:54 +0300 Subject: [PATCH 017/565] updated the contents and changed file name --- pages/stack/protocol/rollup/_meta.json | 2 +- ...ced-deposit.mdx => forced-transaction.mdx} | 26 ++++++++++--------- 2 files changed, 15 insertions(+), 13 deletions(-) rename pages/stack/protocol/rollup/{forced-deposit.mdx => forced-transaction.mdx} (78%) diff --git a/pages/stack/protocol/rollup/_meta.json b/pages/stack/protocol/rollup/_meta.json index c8733ef91..bf5f987a5 100644 --- a/pages/stack/protocol/rollup/_meta.json +++ b/pages/stack/protocol/rollup/_meta.json @@ -3,5 +3,5 @@ "deposit-flow": "Deposit Flow", "transaction-flow": "Transaction Flow", "withdrawal-flow": "Withdrawal Flow", - "forced-deposit": "Forced Deposit" + "forced-transaction": "Forced Transaction" } \ No newline at end of file diff --git a/pages/stack/protocol/rollup/forced-deposit.mdx b/pages/stack/protocol/rollup/forced-transaction.mdx similarity index 78% rename from pages/stack/protocol/rollup/forced-deposit.mdx rename to pages/stack/protocol/rollup/forced-transaction.mdx index 75d1658f7..a3b9694d9 100644 --- a/pages/stack/protocol/rollup/forced-deposit.mdx +++ b/pages/stack/protocol/rollup/forced-transaction.mdx @@ -1,14 +1,14 @@ --- -title: Forced Deposit +title: Forced Transaction lang: en-US -description: Learn the forced deposit flow during sequencer downtime. +description: Learn the forced transaction flow during sequencer downtime. --- import { Callout } from 'nextra/components' -## Forced Deposit Flow +## Forced Transaction Flow -This guide explains the nuances of forced deposits transactions during sequencer downtime. +This guide explains the nuances of forced transactions during sequencer downtime. Users are able to force-include deposit transactions, which can initiate withdrawals, at any time. However, there are important nuances to understand about the chain derivation pipeline and sequencer behavior. @@ -16,26 +16,26 @@ However, there are important nuances to understand about the chain derivation pi ## Key Concepts * **Sequencing Window**: A 12-hour rolling window to include L2 transactions, including native L2 transactions and deposit transactions. -* **Max Time Drift**: 15 minutes, the maximum delay for including a deposit transaction, relative to the L2 chain. +* **Max Time Drift**: 30 minutes, the maximum delay for including a deposit transaction, relative to the L2 chain. * **Sequencer Downtime**: Period when the sequencer is offline or not producing blocks. ## Normal Operation Under normal circumstances: -1. Deposit transactions are included within 15 minutes. +1. Deposit transactions are included within 30 minutes. 2. The sequencer processes transactions and produces blocks regularly. ## Sequencer Downtime Scenarios -### Short Downtime (< 15 minutes) +### Short Downtime (< 30 minutes) -* Deposits are still included within the 15-minute max time drift. +* Deposits are still included within the 30-minute max time drift. * Regular L2 transactions may be delayed. -### Extended Downtime (15 minutes to 12 hours) +### Extended Downtime (30 minutes to 12 hours) -1. Deposits are force-included within 15 minutes. +1. Deposits are force-included within 30 minutes. 2. The L2 chain state remains uncertain until: * The sequencer comes back online, or * The 12-hour sequencing window expires. @@ -46,7 +46,9 @@ Under normal circumstances: 2. These blocks only include deposit transactions. 3. When the sequencer returns: * All deposit transactions are included first. - * Regular L2 transactions resume afterward. + * No regular L2 transactions are included until the L2 chain is within 12 hours of the chain. + + ## Important Considerations @@ -56,7 +58,7 @@ Under normal circumstances: ## Example Scenario -If a deposit is initiated after the 15-minute mark but before the sequencing window expires: +If a deposit is initiated after the 30-minute mark but before the sequencing window expires: 1. The deposit will be effective when the sequencing window expires (up to ~11 hours later). 2. Nodes reading data from L1 will produce a block with the deposit after the sequencing window expires. From a0d75206d50bbfba56b2160a487a9b46dadc3e77 Mon Sep 17 00:00:00 2001 From: Oleksandr Date: Tue, 17 Sep 2024 17:33:44 +0300 Subject: [PATCH 018/565] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 62aeb0d12..8089de3dc 100644 --- a/README.md +++ b/README.md @@ -20,5 +20,5 @@ You can track documentation [issues](https://github.com/ethereum-optimism/docs/i ## License -This project is licensed under the MIT License. +This project is licensed under the [MIT License](https://github.com/ethereum-optimism/optimism/blob/develop/LICENSE). From d4fa6ccaee66a7ede85f5f706a4eb3f97f4ec3a3 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Wed, 18 Sep 2024 03:19:16 +0300 Subject: [PATCH 019/565] revamp bridging tutorial --- .../tutorials/cross-dom-bridge-eth.mdx | 617 ++++++++++++------ 1 file changed, 433 insertions(+), 184 deletions(-) diff --git a/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx b/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx index 5c7d442c8..74de382fa 100644 --- a/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx +++ b/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx @@ -1,205 +1,358 @@ --- -title: Bridging ETH with the Optimism SDK +title: Bridging ETH With Viem lang: en-US -description: Learn how to use the Optimism SDK to transfer ETH between Layer 1 (Ethereum or Sepolia) and Layer 2 (OP Mainnet or OP Sepolia). +description: Learn how to use viem to transfer ETH between Layer 1 (Ethereum or Sepolia) and Layer 2 (OP Mainnet or OP Sepolia). --- -import { Callout, Steps } from 'nextra/components' -import { WipCallout } from '@/components/WipCallout' +import { Callout, Steps, Tabs } from 'nextra/components' +// import { WipCallout } from '@/components/WipCallout' - -# Bridging ETH to OP Mainnet With the Optimism SDK +# Bridging ETH to OP Mainnet With Viem +This tutorial guides you through transferring ETH between Ethereum Mainnet (L1) and Optimism (L2) using the viem/op-stack library. This updated tutorial replaces the deprecated @eth-optimism/sdk with the latest and most efficient methods available in the viem/op-stack - -This tutorial explains how you can use the [Optimism SDK](https://sdk.optimism.io) to bridge ETH from L1 (Ethereum or Sepolia) to L2 (OP Mainnet or OP Sepolia). -The Optimism SDK is an easy way to add bridging functionality to your JavaScript-based application. +This tutorial explains how you can use the [Viem](https://viem.sh/op-stack/) to bridge ETH from L1 (Ethereum or Sepolia) to L2 (OP Mainnet or OP Sepolia). +The Viem/OP-Stack library is an easy way to add bridging functionality to your JavaScript-based application. It also provides some safety rails to prevent common mistakes that could cause ETH or ERC-20 tokens to be made inaccessible. -Behind the scenes, the Optimism SDK uses the [Standard Bridge](/builders/app-developers/bridging/standard-bridge) contracts to transfer ETH and ERC-20 tokens. Make sure to check out the [Standard Bridge guide](/builders/app-developers/bridging/standard-bridge) if you want to learn more about how the bridge works under the hood. -## Supported Networks +## Prerequisites + +Before you begin, ensure you have the following: -The Optimism SDK supports any of the [Superchain networks](/chain/networks). -[Some Superchain networks](https://sdk.optimism.io/enums/l2chainid) are already included in the SDK by default. -If you want to use a network that isn't included by default you can simply [instantiate the SDK with the appropriate contract addresses](/builders/chain-operators/tutorials/sdk). +* Metamask or another Ethereum-compatible wallet installed +* Node.js (version 14 or later) +* Familiarity with bridging concepts between L1 and L2. +* An understanding of the [viem library](https://viem.sh/op-stack/) +* `pnpm` installed for managing packages. -## Dependencies +## Required Dependencies * [node](https://nodejs.org/en/) * [pnpm](https://pnpm.io/installation) +* [viem](https://viem.sh/op-stack/) + +Install `pnpm` if you haven't already: + -## Create a Demo Project +```bash +npm install -g pnpm -You're going to use the Optimism SDK for this tutorial. -Since the Optimism SDK is a [Node.js](https://nodejs.org/en/) library, you'll need to create a Node.js project to use it. +``` -{

Make a Project Folder

} + +{

Project Setup

} + +Let's create a new project and install the necessary dependencies. + +* Create a folder ```bash mkdir op-sample-project cd op-sample-project ``` -{

Initialize the Project

} +* Initialize the project: ```bash pnpm init ``` -{

Install the Optimism SDK

} +* Install dependencies: Install `viem`, and `dotenv` for managing environment variables. ```bash -pnpm add @eth-optimism/sdk +pnpm add viem dotenv ``` -{

Install ethers.js

} - -```bash -pnpm add ethers@^5 -``` - -
- - -Want to create a new wallet for this tutorial? -If you have [`cast`](https://book.getfoundry.sh/getting-started/installation) installed you can run `cast wallet new` in your terminal to create a new wallet and get the private key. - - -## Get ETH on Sepolia - -This tutorial explains how to bridge ETH from Sepolia to OP Sepolia. -You will need to get some ETH on Sepolia to follow along. - - -You can use [this faucet](https://sepoliafaucet.com) to get ETH on Sepolia. - - -## Add a Private Key to Your Environment +{

Configure Environment Variables

} You need a private key in order to sign transactions. +Create a `.env` file to securely store your environment variables Set your private key as an environment variable with the `export` command. Make sure this private key corresponds to an address that has ETH on Sepolia. + ```bash -export TUTORIAL_PRIVATE_KEY=0x... +touch .env ``` -## Start the Node REPL - -You're going to use the Node REPL to interact with the Optimism SDK. -To start the Node REPL run the following command in your terminal: +Add your Ethereum Layer 1 (L1) and Optimism Layer 2 (L2) RPC endpoints, and wallet private key in the `.env` file: ```bash -node +L1_RPC_URL=https://mainnet.infura.io/v3/YOUR_INFURA_PROJECT_ID +L2_RPC_URL=https://optimism-mainnet.infura.io/v3/YOUR_INFURA_PROJECT_ID +TUTORIAL_PRIVATE_KEY=0x... ``` -This will bring up a Node REPL prompt that allows you to run javascript code. + -## Import Dependencies + +Never share your private key and avoid committing this file to version control. + -You need to import some dependencies into your Node REPL session. - +## Import Dependencies -{

Import the Optimism SDK

} +You need to import some dependencies into your project. -```js file=/public/tutorials/cross-dom-bridge-eth.js#L3 hash=26b2fdb17dd6c8326a54ec51f0769528 -``` +Using `viem`, we will create an account using the private key and initialize L1 and L2 clients to interact with Sepolia and optimismSepolia. -{

Import ethers.js

} +```js -```js file=/public/tutorials/cross-dom-bridge-eth.js#L4 hash=69a65ef97862612e4978b8563e6dbe3a +// Import required modules +import { createPublicClient, http, createWalletClient, parseEther } from 'viem'; +import { sepolia, optimismSepolia } from 'viem/chains'; +import { privateKeyToAccount } from 'viem/accounts' +import { getL2TransactionHashes, publicActionsL2, walletActionsL1 } from 'viem/op-stack' +import * as dotenv from 'dotenv'; +// Load environment variables +dotenv.config(); ``` -
## Set Session Variables You'll need a few variables throughout this tutorial. Let's set those up now. - + + + Create an account from the private key. [`privateKeyToAccount`](https://viem.sh/docs/accounts/local/privateKeyToAccount#privatekeytoaccount) is a viem method used to sign transactions by passing a private key. + + + ```js + const account = privateKeyToAccount(process.env.PRIVATE_KEY); + ``` + + + + Set up our Viem Clients for the L1(Sepolia) and L2(optimismSepolia) + + {

L1 (Sepolia) publicClientL1

} + + ```js + const publicClientL1 = createPublicClient({ + chain: sepolia, + transport: http(process.env.L1_RPC_URL), + }); + ``` + + {

L2 (optimismSepolia) publicClientL2

} + + ```js + const publicClientL2 = createPublicClient({ + chain: optimismSepolia, + transport: http(process.env.L2_RPC_URL), + }).extend(publicActionsL2()); + ``` +
+
+ + + Set up wallet clients for L1 and L2. + + + {

L1 (Sepolia) walletClientL1

} + + ```js + const walletClientL1 = createWalletClient({ + account, + chain: sepolia, /* or mainnet */ + transport: http(process.env.L1_RPC_URL), + }).extend(walletActionsL1()); + ``` + + {

L2 (optimismSepolia) walletClientL2

} + + ```js + const walletClientL2 = createWalletClient({ + chain: optimismSepolia, + transport: http(process.env.L2_RPC_URL), + }).extend(walletActionsL1()); + ``` +
+
+
-{

Load your private key

} - -```js file=/public/tutorials/cross-dom-bridge-erc20.js#L6 hash=755b77a7ffc7dfdc186f36c37d3d847a -``` - -{

Create the RPC providers and wallets

} +## Get ETH on Sepolia -```js file=/public/tutorials/cross-dom-bridge-eth.js#L8-L11 hash=9afdce50665ae93bce602068071ffaa1 -``` +This tutorial explains how to bridge ETH from Sepolia to OP Sepolia. +You will need to get some ETH on Sepolia to follow along. -
+ +You can use [this faucet](https://sepoliafaucet.com) to get ETH on Sepolia. + ## Get ETH You're going to need some ETH on L1 that you can bridge to L2. You can get some Sepolia ETH from [this faucet](https://sepoliafaucet.com). -## Deposit ETH - -Now that you have some ETH on L1 you can deposit that ETH into the `L1StandardBridge` contract. -You'll then receive the same number of ETH on L2 in return. +### Check your wallet balance on L1 and L2 - +Before initiating the bridge, you can check the ETH balance on both L1 and L2. -{

Check your wallet balance on L1

} +```js +const checkBalances = async () => { + const l1Balance = await publicClientL1.getBalance({ address: account.address }); + const l2Balance = await publicClientL2.getBalance({ address: account.address }); -See how much ETH you have on L1 so you can confirm that the deposit worked later on. + console.log(`L1 Balance: ${l1Balance} wei`); + console.log(`L2 Balance: ${l2Balance} wei`); +}; -```js file=/public/tutorials/cross-dom-bridge-eth.js#L14 hash=3be1dd9a6019e9f59ad6fab38e168e99 +checkBalances(); ``` + +Balances will be returned in wei. You can convert them to ether if needed. + -{

Create a CrossChainMessenger instance

} - -The Optimism SDK exports a `CrossChainMessenger` class that makes it easy to interact with the `L1StandardBridge` contract. - -Create an instance of the `CrossChainMessenger` class: - -```js file=/public/tutorials/cross-dom-bridge-eth.js#L16-L21 hash=997b9c4cdd5fb1f9d4e0882a683ae016 -``` -{

Deposit your ETH

} +## Deposit ETH Now you can deposit your ETH into the Standard Bridge contract. You'll deposit a small amount of ETH just to demonstrate the process. -```js file=/public/tutorials/cross-dom-bridge-eth.js#L24-L25 hash=8bd6fdfe984274e8ec2368dc735118b4 -``` + + + + + {

Create the deposit transaction

} + + Use `buildDepositTransaction` to create the deposit transaction parameters on L2 + + ```js + const args = await publicClientL2.buildDepositTransaction({ + mint: parseEther(amount), // Specifies the amount of ETH to deposit, converted to wei. + to: account.address, // Sets the recipient address on L2 (same as the sender in this case). + }); + ``` + + {

Sends the deposit transaction

} + + Sends the deposit transaction on L1 and logs the L1 transaction hash. + + ```js + const hash = await walletClientL1.depositTransaction(args); + console.log(`Deposit transaction hash on L1: ${hash}`); + ``` + + {

Wait for L1 transaction

} + + Wait for the L1 transaction to be confirmed and logs the receipt. + + ```js + const receipt = await publicClientL1.waitForTransactionReceipt({ hash }); + console.log('L1 transaction confirmed:', receipt); + ``` + + {

Extract the L2 transaction hash

} + + Extracts the corresponding L2 transaction hash from the L1 receipt, and logs it. + This hash represents the deposit transaction on L2. + + ```js + const [l2Hash] = getL2TransactionHashes(receipt); + console.log(`Corresponding L2 transaction hash: ${l2Hash}`); + ``` + {

Wait for the L2 transaction to be processed

} + + Wait for the L2 transaction to be processed and confirmed and logs the L2 receipt to verify completion. + + ```js + const l2Receipt = await publicClientL2.waitForTransactionReceipt({ + hash: l2Hash, + }); + console.log('L2 transaction confirmed:', l2Receipt); + console.log('Deposit completed successfully!'); + ``` + +
+
+ + + + ```javascript + import { createPublicClient, http, createWalletClient, parseEther } from 'viem'; + import { sepolia, optimismSepolia } from "viem/chains"; + import { privateKeyToAccount } from 'viem/accounts'; + import { getL2TransactionHashes, publicActionsL2, walletActionsL1, walletActionsL2 } from 'viem/op-stack'; + + // Replace with your actual private key (Keep this secure!) + const PRIVATE_KEY = '0x....' + const account = privateKeyToAccount(PRIVATE_KEY); + + // Create L1 public client for reading from the Sepolia network + const publicClientL1 = createPublicClient({ + chain: sepolia, + transport: http(), + }); + + // Create L1 wallet client for sending transactions on Sepolia + const walletClientL1 = createWalletClient({ + account, + chain: sepolia, + transport: http(), + }).extend(walletActionsL1()); + + // Create L2 public client for interacting with OP Sepolia + const publicClientL2 = createPublicClient({ + chain: optimismSepolia, + transport: http('https://opt-sepolia.g.alchemy.com/v2/YOUR_ALCHEMY_KEY'), + }).extend(publicActionsL2()); + + // Create L2 wallet client for sending transactions on OP Sepolia + const walletClientL2 = createWalletClient({ + account, + chain: optimismSepolia, + transport: http('https://opt-sepolia.g.alchemy.com/v2/YOUR_ALCHEMY_KEY'), + }).extend(walletActionsL2()); + + async function depositETH(amount) { + try { + // Build the deposit transaction parameters + const args = await publicClientL2.buildDepositTransaction({ + mint: parseEther(amount), // Convert amount to wei + to: account.address, // Recipient on L2 (same as sender in this case) + }); + + // Execute the deposit transaction on L1 + const hash = await walletClientL1.depositTransaction(args); + console.log(`Deposit transaction hash on L1: ${hash}`); + + // Wait for the L1 transaction to be confirmed + const receipt = await publicClientL1.waitForTransactionReceipt({ hash }); + console.log('L1 transaction confirmed:', receipt); + + // Extract the corresponding L2 transaction hash + const [l2Hash] = getL2TransactionHashes(receipt); + console.log(`Corresponding L2 transaction hash: ${l2Hash}`); + + // Wait for the L2 transaction to be confirmed + const l2Receipt = await publicClientL2.waitForTransactionReceipt({ + hash: l2Hash, + }); + console.log('L2 transaction confirmed:', l2Receipt); + + console.log('Deposit completed successfully!'); + } catch (error) { + console.error('Error during deposit:', error); + } + } + ``` + + +
+ Using a smart contract wallet? As a safety measure, `depositETH` will fail if you try to deposit ETH from a smart contract wallet without specifying a `recipient`. Add the `recipient` option to the `depositETH` call to fix this. -Check out the [Optimism SDK docs](https://sdk.optimism.io/classes/crosschainmessenger#depositETH-2) for more info on the options you can pass to `depositETH`. -{

Wait for the deposit to be relayed

} - -You can use the `waitForMessageStatus` function to wait for the deposit to be relayed to L2. - -```js file=/public/tutorials/cross-dom-bridge-eth.js#L28 hash=659971675ab8d53bc2bd5196f72c873b -``` - -{

Check your wallet balance on L1

} - -You should now have less ETH on L1. - -```js file=/public/tutorials/cross-dom-bridge-eth.js#L31 hash=3be1dd9a6019e9f59ad6fab38e168e99 -``` - -{

Check your wallet balance on L2

} - -You should now have more ETH on L2. - -```js file=/public/tutorials/cross-dom-bridge-eth.js#L34 hash=7884641849eab1590b148118d709f0fd -``` - -
## Withdraw ETH @@ -207,77 +360,173 @@ You just bridged some ETH from L1 to L2. Nice! Now you're going to repeat the process in reverse to bridge some ETH from L2 to L1. - - -{

Start your withdrawal on L2

} - -The first step to withdrawing ETH from L2 to L1 is to start the withdrawal on L2. - -```js file=/public/tutorials/cross-dom-bridge-eth.js#L37-L38 hash=e9880eb7e7e95253637b5b88a4772074 -``` - -{

Check your wallet balance on L2

} - -You should now have less ETH on L2, but your wallet balance on L1 will not have changed yet. - -```js file=/public/tutorials/cross-dom-bridge-eth.js#L41 hash=7884641849eab1590b148118d709f0fd -``` - -{

Wait until the withdrawal is ready to prove

} - -The second step to withdrawing ETH from L2 to L1 is to prove to the bridge on L1 that the withdrawal happened on L2. -You first need to wait until the withdrawal is ready to prove. - -```js file=/public/tutorials/cross-dom-bridge-eth.js#L44 hash=e8b55ec0f16f90ba4d4197cf47ff8e6d -``` - - -This step can take a few minutes. -Feel free to take a quick break while you wait. - - -{

Prove the withdrawal on L1

} - -Once the withdrawal is ready to be proven, you'll send an L1 transaction to prove that the withdrawal happened on L2. - -```js file=/public/tutorials/cross-dom-bridge-eth.js#L47 hash=fee5f5e924472ee9daceb681ccae1cb9 -``` - -{

Wait until the withdrawal is ready for relay

} - -The final step to withdrawing ETH from L2 to L1 is to relay the withdrawal on L1. -This can only happen after the fault proof period has elapsed. -On OP Mainnet, this takes 7 days. - - -We're currently testing fault proofs on OP Sepolia, so withdrawal times reflect Mainnet times. - - -```js file=/public/tutorials/cross-dom-bridge-eth.js#L50 hash=55a41ac5586b8a688ffd6dfbb20f2d15 -``` - -{

Relay the withdrawal on L1

} - -Once the withdrawal is ready to be relayed you can finally complete the withdrawal process. - -```js file=/public/tutorials/cross-dom-bridge-eth.js#L66 hash=f8d30944dad1664d82b9fdf14da59f9e -``` - -{

Wait until the withdrawal is relayed

} - -Now you simply wait until the message is relayed. - -```js file=/public/tutorials/cross-dom-bridge-eth.js#L69 hash=c2c14a739c44011a058e9848a0019f15 -``` - -{

Check your wallet balance on L1

} - -You should now have more ETH on L1. - -```js file=/public/tutorials/cross-dom-bridge-eth.js#L72 hash=3be1dd9a6019e9f59ad6fab38e168e99 -``` - -
+ + + + {

Create the withdrawal transaction

} + + Uses `buildWithdrawalTransaction` to create the withdrawal parameters. + Converts the withdrawal amount to `wei` and specifies the recipient on L1. + + ```js + const args = await publicClientL2.buildWithdrawalTransaction({ + withdrawalAmount: parseEther(amount), + to: account.address, + }); + ``` + + {

Executing the Withdrawal

} + + This sends the withdrawal transaction on L2, which initiates the withdrawal process on L2 and logs a transaction hash for tracking the withdrawal. + + ```js + const hash = await walletClientL2.initiateWithdrawal(args); + console.log(`Withdrawal transaction hash on L2: ${hash}`); + ``` + + {

Confirming L2 Transaction

} + + Wait one hour (max) for the L2 Output containing the transaction to be proposed, and log the receipt, which contains important details like the block number etc. + + ```js + const receipt = await publicClientL2.waitForTransactionReceipt({ hash }); + console.log('L2 transaction confirmed:', receipt); + ``` + {

Wait for Withdrawal prove

} + Wait until the withdrawal is ready to prove. + + ```js + const { output, withdrawal } = await publicClientL1.waitToProve({ + receipt, + targetChain: walletClientL2.chain + }) + ``` + Build parameters to prove the withdrawal on the L2. + + ```js + const proveArgs = await publicClientL2.buildProveWithdrawal({ + output, + withdrawal, + }) + ``` + + {

Prove the withdrawal on the L1

} + + ```js + const proveHash = await walletClientL1.proveWithdrawal(proveArgs) + ``` + + Wait until the prove withdrawal is processed, this proof is crucial for the eventual finalization of the withdrawal on L1, it includes the L2 block number and withdrawal transaction hash. + + ```js + const proveReceipt = await publicClientL1.waitForTransactionReceipt({hash: proveHash}) + ``` + + {

Wait for withdrawal finalization

} + + Before a withdrawal transaction can be finalized, you will need to wait for the finalization period of 7 days. + + ```js + const awaitWithdrawal = await publicClientL1.waitToFinalize({ + targetChain: walletClientL2.chain, + withdrawalHash: withdrawal.withdrawalHash, + }) + + ``` + {

Finalize the withdrawal

} + + ```js + const finalizeHash = await walletClientL1.finalizeWithdrawal({ + targetChain: walletClientL2.chain, + withdrawal, + }) + ``` + + {

Wait until the withdrawal is finalized

} + + ```js + const finalizeReceipt = await publicClientL1.waitForTransactionReceipt({ + hash: finalizeHash + }) + ``` + +
+
+ + + + ```js + import { createPublicClient, http, createWalletClient, parseEther } from 'viem'; + import { sepolia, optimismSepolia } from "viem/chains"; + import { privateKeyToAccount } from 'viem/accounts'; + import { getL2TransactionHashes, publicActionsL2, walletActionsL1, walletActionsL2 } from 'viem/op-stack'; + + // Replace with your actual private key (Keep this secure!) + const PRIVATE_KEY = '0x....' + const account = privateKeyToAccount(PRIVATE_KEY); + + // Create L1 public client for reading from the Sepolia network + const publicClientL1 = createPublicClient({ + chain: sepolia, + transport: http(), + }); + + // Create L1 wallet client for sending transactions on Sepolia + const walletClientL1 = createWalletClient({ + account, + chain: sepolia, + transport: http(), + }).extend(walletActionsL1()); + + // Create L2 public client for interacting with OP Sepolia + const publicClientL2 = createPublicClient({ + chain: optimismSepolia, + transport: http('https://opt-sepolia.g.alchemy.com/v2/YOUR_ALCHEMY_KEY'), + }).extend(publicActionsL2()); + + // Create L2 wallet client for sending transactions on OP Sepolia + const walletClientL2 = createWalletClient({ + account, + chain: optimismSepolia, + transport: http('https://opt-sepolia.g.alchemy.com/v2/YOUR_ALCHEMY_KEY'), + }).extend(walletActionsL2()); + + async function withdrawETH(amount) { + try { + // Build the withdrawal transaction parameters + const args = await publicClientL2.buildWithdrawalTransaction({ + withdrawalAmount: parseEther(amount), // Convert amount to wei + to: account.address, // Recipient on L1 (same as sender in this case) + }); + + // Execute the withdrawal transaction on L2 + const hash = await walletClientL2.sendTransaction(args); + console.log(`Withdrawal transaction hash on L2: ${hash}`); + + // Wait for the L2 transaction to be confirmed + const receipt = await publicClientL2.waitForTransactionReceipt({ hash }); + console.log('L2 transaction confirmed:', receipt); + + // Get the withdrawal proof for L1 finalization + const withdrawalProof = await publicClientL2.getWithdrawalProof({ + blockNumber: receipt.blockNumber, + withdrawalHash: hash + }); + + console.log('Withdrawal initiated. Proof:', withdrawalProof); + console.log('Wait for the challenge period before finalizing on L1'); + + // Note: Additional steps are required to finalize the withdrawal on L1 + // after the challenge period (typically 7 days) has passed. + + } catch (error) { + console.error('Error during withdrawal:', error); + } + } + ``` + + +
## Next Steps From 9c84aead4987383d6696872bdc7244013f9544d4 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Wed, 18 Sep 2024 03:48:23 +0300 Subject: [PATCH 020/565] update some more codes --- .../tutorials/cross-dom-bridge-eth.mdx | 739 +++++++++--------- 1 file changed, 386 insertions(+), 353 deletions(-) diff --git a/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx b/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx index 74de382fa..c031de618 100644 --- a/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx +++ b/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx @@ -7,7 +7,6 @@ description: Learn how to use viem to transfer ETH between Layer 1 (Ethereum or import { Callout, Steps, Tabs } from 'nextra/components' // import { WipCallout } from '@/components/WipCallout' - # Bridging ETH to OP Mainnet With Viem This tutorial guides you through transferring ETH between Ethereum Mainnet (L1) and Optimism (L2) using the viem/op-stack library. This updated tutorial replaces the deprecated @eth-optimism/sdk with the latest and most efficient methods available in the viem/op-stack @@ -36,71 +35,66 @@ Before you begin, ensure you have the following: Install `pnpm` if you haven't already: - ```bash npm install -g pnpm ``` + {

Project Setup

} -{

Project Setup

} - -Let's create a new project and install the necessary dependencies. + Let's create a new project and install the necessary dependencies. -* Create a folder + * Create a folder -```bash -mkdir op-sample-project -cd op-sample-project -``` - -* Initialize the project: - -```bash -pnpm init -``` + ```bash + mkdir op-sample-project + cd op-sample-project + ``` -* Install dependencies: Install `viem`, and `dotenv` for managing environment variables. + * Initialize the project: -```bash -pnpm add viem dotenv -``` + ```bash + pnpm init + ``` -{

Configure Environment Variables

} + * Install dependencies: Install `viem`, and `dotenv` for managing environment variables. -You need a private key in order to sign transactions. -Create a `.env` file to securely store your environment variables -Set your private key as an environment variable with the `export` command. -Make sure this private key corresponds to an address that has ETH on Sepolia. + ```bash + pnpm add viem dotenv + ``` + {

Configure Environment Variables

} -```bash -touch .env -``` + You need a private key in order to sign transactions. + Create a `.env` file to securely store your environment variables + Set your private key as an environment variable with the `export` command. + Make sure this private key corresponds to an address that has ETH on Sepolia. -Add your Ethereum Layer 1 (L1) and Optimism Layer 2 (L2) RPC endpoints, and wallet private key in the `.env` file: + ```bash + touch .env + ``` -```bash -L1_RPC_URL=https://mainnet.infura.io/v3/YOUR_INFURA_PROJECT_ID -L2_RPC_URL=https://optimism-mainnet.infura.io/v3/YOUR_INFURA_PROJECT_ID -TUTORIAL_PRIVATE_KEY=0x... -``` + Add your Ethereum Layer 1 (L1) and Optimism Layer 2 (L2) RPC endpoints, and wallet private key in the `.env` file: + ```bash + L1_RPC_URL=https://mainnet.infura.io/v3/YOUR_INFURA_PROJECT_ID + L2_RPC_URL=https://optimism-mainnet.infura.io/v3/YOUR_INFURA_PROJECT_ID + TUTORIAL_PRIVATE_KEY=0x... + ```
-Never share your private key and avoid committing this file to version control. + Never share your private key and avoid committing this file to version control. - ## Import Dependencies You need to import some dependencies into your project. Using `viem`, we will create an account using the private key and initialize L1 and L2 clients to interact with Sepolia and optimismSepolia. -```js +```js // Import required modules import { createPublicClient, http, createWalletClient, parseEther } from 'viem'; @@ -112,69 +106,68 @@ import * as dotenv from 'dotenv'; dotenv.config(); ``` - ## Set Session Variables You'll need a few variables throughout this tutorial. Let's set those up now. - + Create an account from the private key. [`privateKeyToAccount`](https://viem.sh/docs/accounts/local/privateKeyToAccount#privatekeytoaccount) is a viem method used to sign transactions by passing a private key. - - ```js + ```js const account = privateKeyToAccount(process.env.PRIVATE_KEY); ``` + - - + Set up our Viem Clients for the L1(Sepolia) and L2(optimismSepolia) - - {

L1 (Sepolia) publicClientL1

} - ```js - const publicClientL1 = createPublicClient({ - chain: sepolia, - transport: http(process.env.L1_RPC_URL), - }); - ``` - - {

L2 (optimismSepolia) publicClientL2

} - - ```js - const publicClientL2 = createPublicClient({ - chain: optimismSepolia, - transport: http(process.env.L2_RPC_URL), - }).extend(publicActionsL2()); - ``` -
-
- - - Set up wallet clients for L1 and L2. - - - {

L1 (Sepolia) walletClientL1

} - - ```js - const walletClientL1 = createWalletClient({ - account, - chain: sepolia, /* or mainnet */ - transport: http(process.env.L1_RPC_URL), - }).extend(walletActionsL1()); - ``` - - {

L2 (optimismSepolia) walletClientL2

} - - ```js - const walletClientL2 = createWalletClient({ - chain: optimismSepolia, - transport: http(process.env.L2_RPC_URL), - }).extend(walletActionsL1()); - ``` -
-
+ + {

L1 (Sepolia) publicClientL1

} + + ```js + const publicClientL1 = createPublicClient({ + chain: sepolia, + transport: http(process.env.L1_RPC_URL), + }); + ``` + + {

L2 (optimismSepolia) publicClientL2

} + + ```js + const publicClientL2 = createPublicClient({ + chain: optimismSepolia, + transport: http(process.env.L2_RPC_URL), + }).extend(publicActionsL2()); + ``` +
+
+ + + Set up wallet clients for L1 and L2. + + + {

L1 (Sepolia) walletClientL1

} + + ```js + const walletClientL1 = createWalletClient({ + account, + chain: sepolia, /* or mainnet */ + transport: http(process.env.L1_RPC_URL), + }).extend(walletActionsL1()); + ``` + + {

L2 (optimismSepolia) walletClientL2

} + + ```js + const walletClientL2 = createWalletClient({ + chain: optimismSepolia, + transport: http(process.env.L2_RPC_URL), + }).extend(walletActionsL1()); + ``` +
+
## Get ETH on Sepolia @@ -183,7 +176,7 @@ This tutorial explains how to bridge ETH from Sepolia to OP Sepolia. You will need to get some ETH on Sepolia to follow along. -You can use [this faucet](https://sepoliafaucet.com) to get ETH on Sepolia. + You can use [this faucet](https://sepoliafaucet.com) to get ETH on Sepolia. ## Get ETH @@ -206,8 +199,9 @@ const checkBalances = async () => { checkBalances(); ``` + -Balances will be returned in wei. You can convert them to ether if needed. + Balances will be returned in wei. You can convert them to ether if needed. ## Deposit ETH @@ -215,322 +209,361 @@ Balances will be returned in wei. You can convert them to ether if needed. Now you can deposit your ETH into the Standard Bridge contract. You'll deposit a small amount of ETH just to demonstrate the process. + + + + {

Create the deposit transaction

} + + Use `buildDepositTransaction` to create the deposit transaction parameters on L2 + + ```js + const args = await publicClientL2.buildDepositTransaction({ + mint: parseEther(amount), // Specifies the amount of ETH to deposit, converted to wei. + to: account.address, // Sets the recipient address on L2 (same as the sender in this case). + }); + ``` + + {

Sends the deposit transaction

} + + Sends the deposit transaction on L1 and logs the L1 transaction hash. + + ```js + const hash = await walletClientL1.depositTransaction(args); + console.log(`Deposit transaction hash on L1: ${hash}`); + ``` + + {

Wait for L1 transaction

} + + Wait for the L1 transaction to be confirmed and logs the receipt. + + ```js + const receipt = await publicClientL1.waitForTransactionReceipt({ hash }); + console.log('L1 transaction confirmed:', receipt); + ``` + + {

Extract the L2 transaction hash

} + + Extracts the corresponding L2 transaction hash from the L1 receipt, and logs it. + This hash represents the deposit transaction on L2. + + ```js + const [l2Hash] = getL2TransactionHashes(receipt); + console.log(`Corresponding L2 transaction hash: ${l2Hash}`); + ``` + + {

Wait for the L2 transaction to be processed

} + + Wait for the L2 transaction to be processed and confirmed and logs the L2 receipt to verify completion. + + ```js + const l2Receipt = await publicClientL2.waitForTransactionReceipt({ + hash: l2Hash, + }); + console.log('L2 transaction confirmed:', l2Receipt); + console.log('Deposit completed successfully!'); + ``` +
+
+ + + ```javascript + import { createPublicClient, http, createWalletClient, parseEther } from 'viem'; + import { sepolia, optimismSepolia } from "viem/chains"; + import { privateKeyToAccount } from 'viem/accounts'; + import { getL2TransactionHashes, publicActionsL2, walletActionsL1, walletActionsL2 } from 'viem/op-stack'; + + // Replace with your actual private key (Keep this secure!) + const PRIVATE_KEY = '0x....' + const account = privateKeyToAccount(PRIVATE_KEY); + + // Create L1 public client for reading from the Sepolia network + const publicClientL1 = createPublicClient({ + chain: sepolia, + transport: http(), + }); + + // Create L1 wallet client for sending transactions on Sepolia + const walletClientL1 = createWalletClient({ + account, + chain: sepolia, + transport: http(), + }).extend(walletActionsL1()); + + // Create L2 public client for interacting with OP Sepolia + const publicClientL2 = createPublicClient({ + chain: optimismSepolia, + transport: http('https://opt-sepolia.g.alchemy.com/v2/YOUR_ALCHEMY_KEY'), + }).extend(publicActionsL2()); + + // Create L2 wallet client for sending transactions on OP Sepolia + const walletClientL2 = createWalletClient({ + account, + chain: optimismSepolia, + transport: http('https://opt-sepolia.g.alchemy.com/v2/YOUR_ALCHEMY_KEY'), + }).extend(walletActionsL2()); + + async function depositETH(amount) { + try { + // Build the deposit transaction parameters + const args = await publicClientL2.buildDepositTransaction({ + mint: parseEther(amount), // Convert amount to wei + to: account.address, // Recipient on L2 (same as sender in this case) + }); + + // Execute the deposit transaction on L1 + const hash = await walletClientL1.depositTransaction(args); + console.log(`Deposit transaction hash on L1: ${hash}`); + + // Wait for the L1 transaction to be confirmed + const receipt = await publicClientL1.waitForTransactionReceipt({ hash }); + console.log('L1 transaction confirmed:', receipt); + + // Extract the corresponding L2 transaction hash + const [l2Hash] = getL2TransactionHashes(receipt); + console.log(`Corresponding L2 transaction hash: ${l2Hash}`); + + // Wait for the L2 transaction to be confirmed + const l2Receipt = await publicClientL2.waitForTransactionReceipt({ + hash: l2Hash, + }); + console.log('L2 transaction confirmed:', l2Receipt); + + console.log('Deposit completed successfully!'); + } catch (error) { + console.error('Error during deposit:', error); + } + } + ``` + +
- - - - {

Create the deposit transaction

} + + Using a smart contract wallet? + As a safety measure, `depositETH` will fail if you try to deposit ETH from a smart contract wallet without specifying a `recipient`. + Add the `recipient` option to the `depositETH` call to fix this. + - Use `buildDepositTransaction` to create the deposit transaction parameters on L2 +## Withdraw ETH - ```js - const args = await publicClientL2.buildDepositTransaction({ - mint: parseEther(amount), // Specifies the amount of ETH to deposit, converted to wei. - to: account.address, // Sets the recipient address on L2 (same as the sender in this case). - }); - ``` +You just bridged some ETH from L1 to L2. +Nice! +Now you're going to repeat the process in reverse to bridge some ETH from L2 to L1. - {

Sends the deposit transaction

} + + + + {

Create the withdrawal transaction

} - Sends the deposit transaction on L1 and logs the L1 transaction hash. + Uses `buildWithdrawalTransaction` to create the withdrawal parameters. + Converts the withdrawal amount to `wei` and specifies the recipient on L1. - ```js - const hash = await walletClientL1.depositTransaction(args); - console.log(`Deposit transaction hash on L1: ${hash}`); - ``` + ```js + const args = await publicClientL2.buildWithdrawalTransaction({ + withdrawalAmount: parseEther(amount), + to: account.address, + }); + ``` - {

Wait for L1 transaction

} + {

Executing the Withdrawal

} - Wait for the L1 transaction to be confirmed and logs the receipt. + This sends the withdrawal transaction on L2, which initiates the withdrawal process on L2 and logs a transaction hash for tracking the withdrawal. - ```js - const receipt = await publicClientL1.waitForTransactionReceipt({ hash }); - console.log('L1 transaction confirmed:', receipt); - ``` + ```js + const hash = await walletClientL2.initiateWithdrawal(args); + console.log(`Withdrawal transaction hash on L2: ${hash}`); + ``` - {

Extract the L2 transaction hash

} + {

Confirming L2 Transaction

} - Extracts the corresponding L2 transaction hash from the L1 receipt, and logs it. - This hash represents the deposit transaction on L2. + Wait one hour (max) for the L2 Output containing the transaction to be proposed, and log the receipt, which contains important details like the block number etc. - ```js - const [l2Hash] = getL2TransactionHashes(receipt); - console.log(`Corresponding L2 transaction hash: ${l2Hash}`); - ``` - {

Wait for the L2 transaction to be processed

} + ```js + const receipt = await publicClientL2.waitForTransactionReceipt({ hash }); + console.log('L2 transaction confirmed:', receipt); + ``` - Wait for the L2 transaction to be processed and confirmed and logs the L2 receipt to verify completion. + {

Wait for Withdrawal prove

} - ```js - const l2Receipt = await publicClientL2.waitForTransactionReceipt({ - hash: l2Hash, - }); - console.log('L2 transaction confirmed:', l2Receipt); - console.log('Deposit completed successfully!'); - ``` + Next, is to prove to the bridge on L1 that the withdrawal happened on L2. To achieve that, you first need to wait until the withdrawal is ready to prove. -
-
+ ```js + const { output, withdrawal } = await publicClientL1.waitToProve({ + receipt, + targetChain: walletClientL2.chain + }) + ``` - - - ```javascript - import { createPublicClient, http, createWalletClient, parseEther } from 'viem'; - import { sepolia, optimismSepolia } from "viem/chains"; - import { privateKeyToAccount } from 'viem/accounts'; - import { getL2TransactionHashes, publicActionsL2, walletActionsL1, walletActionsL2 } from 'viem/op-stack'; - - // Replace with your actual private key (Keep this secure!) - const PRIVATE_KEY = '0x....' - const account = privateKeyToAccount(PRIVATE_KEY); - - // Create L1 public client for reading from the Sepolia network - const publicClientL1 = createPublicClient({ - chain: sepolia, - transport: http(), - }); + Build parameters to prove the withdrawal on the L2. + + ```js + const proveArgs = await publicClientL2.buildProveWithdrawal({ + output, + withdrawal, + }) + ``` - // Create L1 wallet client for sending transactions on Sepolia - const walletClientL1 = createWalletClient({ - account, - chain: sepolia, - transport: http(), - }).extend(walletActionsL1()); - - // Create L2 public client for interacting with OP Sepolia - const publicClientL2 = createPublicClient({ - chain: optimismSepolia, - transport: http('https://opt-sepolia.g.alchemy.com/v2/YOUR_ALCHEMY_KEY'), - }).extend(publicActionsL2()); - - // Create L2 wallet client for sending transactions on OP Sepolia - const walletClientL2 = createWalletClient({ - account, - chain: optimismSepolia, - transport: http('https://opt-sepolia.g.alchemy.com/v2/YOUR_ALCHEMY_KEY'), - }).extend(walletActionsL2()); - - async function depositETH(amount) { - try { - // Build the deposit transaction parameters - const args = await publicClientL2.buildDepositTransaction({ - mint: parseEther(amount), // Convert amount to wei - to: account.address, // Recipient on L2 (same as sender in this case) - }); - - // Execute the deposit transaction on L1 - const hash = await walletClientL1.depositTransaction(args); - console.log(`Deposit transaction hash on L1: ${hash}`); - - // Wait for the L1 transaction to be confirmed - const receipt = await publicClientL1.waitForTransactionReceipt({ hash }); - console.log('L1 transaction confirmed:', receipt); - - // Extract the corresponding L2 transaction hash - const [l2Hash] = getL2TransactionHashes(receipt); - console.log(`Corresponding L2 transaction hash: ${l2Hash}`); - - // Wait for the L2 transaction to be confirmed - const l2Receipt = await publicClientL2.waitForTransactionReceipt({ - hash: l2Hash, - }); - console.log('L2 transaction confirmed:', l2Receipt); - - console.log('Deposit completed successfully!'); - } catch (error) { - console.error('Error during deposit:', error); - } - } - ``` + {

Prove the withdrawal on the L1

} + Once the withdrawal is ready to be proven, you'll send an L1 transaction to prove that the withdrawal happened on L2. + + ```js + const proveHash = await walletClientL1.proveWithdrawal(proveArgs) + ``` -
-
+ ```js + const proveReceipt = await publicClientL1.waitForTransactionReceipt({hash: proveHash}) + ``` + {

Wait for withdrawal finalization

} - -Using a smart contract wallet? -As a safety measure, `depositETH` will fail if you try to deposit ETH from a smart contract wallet without specifying a `recipient`. -Add the `recipient` option to the `depositETH` call to fix this. - + Before a withdrawal transaction can be finalized, you will need to wait for the finalization period. + This can only happen after the fault proof period has elapsed. On OP Mainnet, this takes 7 days. + ```js + const awaitWithdrawal = await publicClientL1.waitToFinalize({ + targetChain: walletClientL2.chain, + withdrawalHash: withdrawal.withdrawalHash, + }) -## Withdraw ETH + ``` -You just bridged some ETH from L1 to L2. -Nice! -Now you're going to repeat the process in reverse to bridge some ETH from L2 to L1. + + We're currently testing fault proofs on OP Sepolia, so withdrawal times + reflect Mainnet times. + - - - - {

Create the withdrawal transaction

} + {

Finalize the withdrawal

} - Uses `buildWithdrawalTransaction` to create the withdrawal parameters. - Converts the withdrawal amount to `wei` and specifies the recipient on L1. + ```js + const finalizeHash = await walletClientL1.finalizeWithdrawal({ + targetChain: walletClientL2.chain, + withdrawal, + }) + ``` - ```js - const args = await publicClientL2.buildWithdrawalTransaction({ - withdrawalAmount: parseEther(amount), - to: account.address, - }); - ``` + {

Wait until the withdrawal is finalized

} - {

Executing the Withdrawal

} + ```js + const finalizeReceipt = await publicClientL1.waitForTransactionReceipt({ + hash: finalizeHash + }) + ``` - This sends the withdrawal transaction on L2, which initiates the withdrawal process on L2 and logs a transaction hash for tracking the withdrawal. + {

Check the withdrawal status

} + + ```js + const status = await publicClientL1.getWithdrawalStatus({ + receipt, + targetChain: walletClientL2.chain + }) + ``` +
+
+ + + ```js + import { createPublicClient, http, createWalletClient, parseEther } from 'viem'; + import { sepolia, optimismSepolia } from "viem/chains"; + import { privateKeyToAccount } from 'viem/accounts'; + import { getL2TransactionHashes, publicActionsL2, walletActionsL1, walletActionsL2 } from 'viem/op-stack'; + + // Replace with your actual private key (Keep this secure!) + const PRIVATE_KEY = '0x....' + const account = privateKeyToAccount(PRIVATE_KEY); + + // Create L1 public client for reading from the Sepolia network + const publicClientL1 = createPublicClient({ + chain: sepolia, + transport: http(), + }); + + // Create L1 wallet client for sending transactions on Sepolia + const walletClientL1 = createWalletClient({ + account, + chain: sepolia, + transport: http(), + }).extend(walletActionsL1()); + + // Create L2 public client for interacting with OP Sepolia + const publicClientL2 = createPublicClient({ + chain: optimismSepolia, + transport: http('https://opt-sepolia.g.alchemy.com/v2/YOUR_ALCHEMY_KEY'), + }).extend(publicActionsL2()); + + // Create L2 wallet client for sending transactions on OP Sepolia + const walletClientL2 = createWalletClient({ + account, + chain: optimismSepolia, + transport: http('https://opt-sepolia.g.alchemy.com/v2/YOUR_ALCHEMY_KEY'), + }).extend(walletActionsL2()); + + async function withdrawETH(amount) { + try { + const args = await publicClientL2.buildWithdrawalTransaction({ + withdrawalAmount: parseEther(amount), + to: account.address, + }); - ```js const hash = await walletClientL2.initiateWithdrawal(args); console.log(`Withdrawal transaction hash on L2: ${hash}`); - ``` - - {

Confirming L2 Transaction

} - Wait one hour (max) for the L2 Output containing the transaction to be proposed, and log the receipt, which contains important details like the block number etc. - - ```js const receipt = await publicClientL2.waitForTransactionReceipt({ hash }); console.log('L2 transaction confirmed:', receipt); - ``` - {

Wait for Withdrawal prove

} - Wait until the withdrawal is ready to prove. - ```js const { output, withdrawal } = await publicClientL1.waitToProve({ - receipt, - targetChain: walletClientL2.chain - }) - ``` - Build parameters to prove the withdrawal on the L2. - - ```js - const proveArgs = await publicClientL2.buildProveWithdrawal({ - output, - withdrawal, - }) - ``` - - {

Prove the withdrawal on the L1

} - - ```js - const proveHash = await walletClientL1.proveWithdrawal(proveArgs) - ``` - - Wait until the prove withdrawal is processed, this proof is crucial for the eventual finalization of the withdrawal on L1, it includes the L2 block number and withdrawal transaction hash. + receipt, + targetChain: walletClientL2.chain + }); - ```js - const proveReceipt = await publicClientL1.waitForTransactionReceipt({hash: proveHash}) - ``` - - {

Wait for withdrawal finalization

} + const proveArgs = await publicClientL2.buildProveWithdrawal({ + output, + withdrawal, + }); - Before a withdrawal transaction can be finalized, you will need to wait for the finalization period of 7 days. + const proveHash = await walletClientL1.proveWithdrawal(proveArgs); - ```js - const awaitWithdrawal = await publicClientL1.waitToFinalize({ - targetChain: walletClientL2.chain, - withdrawalHash: withdrawal.withdrawalHash, - }) + const proveReceipt = await publicClientL1.waitForTransactionReceipt({ hash: proveHash }); - ``` - {

Finalize the withdrawal

} + const awaitWithdrawal = await publicClientL1.waitToFinalize({ + targetChain: walletClientL2.chain, + withdrawalHash: withdrawal.withdrawalHash, + }); - ```js const finalizeHash = await walletClientL1.finalizeWithdrawal({ targetChain: walletClientL2.chain, withdrawal, - }) - ``` - - {

Wait until the withdrawal is finalized

} + }); - ```js const finalizeReceipt = await publicClientL1.waitForTransactionReceipt({ hash: finalizeHash + }); + + const status = await publicClientL1.getWithdrawalStatus({ + receipt, + targetChain: walletClientL2.chain }) - ``` -
-
+ console.log('Withdrawal completed successfully!'); + } catch (error) { + console.error('Error during withdrawal:', error); + } + } + ``` + +
- - - ```js - import { createPublicClient, http, createWalletClient, parseEther } from 'viem'; - import { sepolia, optimismSepolia } from "viem/chains"; - import { privateKeyToAccount } from 'viem/accounts'; - import { getL2TransactionHashes, publicActionsL2, walletActionsL1, walletActionsL2 } from 'viem/op-stack'; - - // Replace with your actual private key (Keep this secure!) - const PRIVATE_KEY = '0x....' - const account = privateKeyToAccount(PRIVATE_KEY); - - // Create L1 public client for reading from the Sepolia network - const publicClientL1 = createPublicClient({ - chain: sepolia, - transport: http(), - }); +## Important Considerations + +* **Challenge Period**: The 7-day waiting period is crucial for security. +* **Gas Costs**: Withdrawals involve transactions on both L2 and L1, each incurring gas fees. +* **Private Key Handling**: Use secure key management practices in real applications. +* **RPC Endpoint Security**: Keep your Alchemy API key (or any RPC endpoint) secure. - // Create L1 wallet client for sending transactions on Sepolia - const walletClientL1 = createWalletClient({ - account, - chain: sepolia, - transport: http(), - }).extend(walletActionsL1()); - - // Create L2 public client for interacting with OP Sepolia - const publicClientL2 = createPublicClient({ - chain: optimismSepolia, - transport: http('https://opt-sepolia.g.alchemy.com/v2/YOUR_ALCHEMY_KEY'), - }).extend(publicActionsL2()); - - // Create L2 wallet client for sending transactions on OP Sepolia - const walletClientL2 = createWalletClient({ - account, - chain: optimismSepolia, - transport: http('https://opt-sepolia.g.alchemy.com/v2/YOUR_ALCHEMY_KEY'), - }).extend(walletActionsL2()); - - async function withdrawETH(amount) { - try { - // Build the withdrawal transaction parameters - const args = await publicClientL2.buildWithdrawalTransaction({ - withdrawalAmount: parseEther(amount), // Convert amount to wei - to: account.address, // Recipient on L1 (same as sender in this case) - }); - - // Execute the withdrawal transaction on L2 - const hash = await walletClientL2.sendTransaction(args); - console.log(`Withdrawal transaction hash on L2: ${hash}`); - - // Wait for the L2 transaction to be confirmed - const receipt = await publicClientL2.waitForTransactionReceipt({ hash }); - console.log('L2 transaction confirmed:', receipt); - - // Get the withdrawal proof for L1 finalization - const withdrawalProof = await publicClientL2.getWithdrawalProof({ - blockNumber: receipt.blockNumber, - withdrawalHash: hash - }); - - console.log('Withdrawal initiated. Proof:', withdrawalProof); - console.log('Wait for the challenge period before finalizing on L1'); - - // Note: Additional steps are required to finalize the withdrawal on L1 - // after the challenge period (typically 7 days) has passed. - - } catch (error) { - console.error('Error during withdrawal:', error); - } - } - ``` - - - ## Next Steps -Congrats! -You've just deposited and withdrawn ETH using the Optimism SDK. -You should now be able to write applications that use the Optimism SDK to transfer ETH between L1 and L2. +* Develop a user interface for easier interaction with these bridging functions. +* Implement robust error handling and retry mechanisms for production use. + +You've just deposited and withdrawn ETH using `viem/op-stack`. +You should now be able to write applications that use `viem/op-stack` to transfer ETH between L1 and L2. Although this tutorial used Sepolia and OP Sepolia, the same process works for Ethereum and OP Mainnet. From 65352f96ca3b834063f54025e367e57bc8c11048 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Wed, 18 Sep 2024 03:52:18 +0300 Subject: [PATCH 021/565] updated meta tags --- pages/builders/app-developers/tutorials/_meta.json | 2 +- .../builders/app-developers/tutorials/cross-dom-bridge-eth.mdx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pages/builders/app-developers/tutorials/_meta.json b/pages/builders/app-developers/tutorials/_meta.json index 0f6a0b800..adf4de6f7 100644 --- a/pages/builders/app-developers/tutorials/_meta.json +++ b/pages/builders/app-developers/tutorials/_meta.json @@ -1,7 +1,7 @@ { "first-contract": "Deploying Your First Contract on OP Mainnet", "cross-dom-solidity": "Communicating Between Chains in Solidity", - "cross-dom-bridge-eth": "Bridging ETH With the Optimism SDK", + "cross-dom-bridge-eth": "Bridging ETH to OP Mainnet With Viem", "cross-dom-bridge-erc20": "Bridging ERC-20 Tokens With the Optimism SDK", "standard-bridge-custom-token": "Bridging Your Custom ERC-20 Token to OP Mainnet", "standard-bridge-standard-token": "Bridging Your Standard ERC-20 Token to OP Mainnet", diff --git a/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx b/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx index c031de618..a2fe08204 100644 --- a/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx +++ b/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx @@ -1,5 +1,5 @@ --- -title: Bridging ETH With Viem +title: Bridging ETH to OP Mainnet With Viem lang: en-US description: Learn how to use viem to transfer ETH between Layer 1 (Ethereum or Sepolia) and Layer 2 (OP Mainnet or OP Sepolia). --- From e3f407a95106b521a516f6dd95759b4465c23d98 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Wed, 18 Sep 2024 03:54:48 +0300 Subject: [PATCH 022/565] remove comments --- .../builders/app-developers/tutorials/cross-dom-bridge-eth.mdx | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx b/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx index a2fe08204..753954351 100644 --- a/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx +++ b/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx @@ -4,8 +4,7 @@ lang: en-US description: Learn how to use viem to transfer ETH between Layer 1 (Ethereum or Sepolia) and Layer 2 (OP Mainnet or OP Sepolia). --- -import { Callout, Steps, Tabs } from 'nextra/components' -// import { WipCallout } from '@/components/WipCallout' +import { Callout, Steps, Tabs } from 'nextra/components # Bridging ETH to OP Mainnet With Viem From a06ed1fc2d3dd425fa7d7a66951be38041c612f9 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Wed, 18 Sep 2024 03:56:57 +0300 Subject: [PATCH 023/565] update text --- .../builders/app-developers/tutorials/cross-dom-bridge-eth.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx b/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx index 753954351..e7ce47f70 100644 --- a/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx +++ b/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx @@ -11,7 +11,7 @@ import { Callout, Steps, Tabs } from 'nextra/components This tutorial guides you through transferring ETH between Ethereum Mainnet (L1) and Optimism (L2) using the viem/op-stack library. This updated tutorial replaces the deprecated @eth-optimism/sdk with the latest and most efficient methods available in the viem/op-stack This tutorial explains how you can use the [Viem](https://viem.sh/op-stack/) to bridge ETH from L1 (Ethereum or Sepolia) to L2 (OP Mainnet or OP Sepolia). -The Viem/OP-Stack library is an easy way to add bridging functionality to your JavaScript-based application. +The `viem/op-stack` library is an easy way to add bridging functionality to your JavaScript-based application. It also provides some safety rails to prevent common mistakes that could cause ETH or ERC-20 tokens to be made inaccessible. Make sure to check out the [Standard Bridge guide](/builders/app-developers/bridging/standard-bridge) if you want to learn more about how the bridge works under the hood. From 3409081eeb88a361a378b373dee587026dafd657 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Wed, 18 Sep 2024 08:30:40 +0300 Subject: [PATCH 024/565] fix lint issues --- .../builders/app-developers/tutorials/cross-dom-bridge-eth.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx b/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx index e7ce47f70..2fa68f7d1 100644 --- a/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx +++ b/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx @@ -4,7 +4,7 @@ lang: en-US description: Learn how to use viem to transfer ETH between Layer 1 (Ethereum or Sepolia) and Layer 2 (OP Mainnet or OP Sepolia). --- -import { Callout, Steps, Tabs } from 'nextra/components +import { Callout, Steps, Tabs } from 'nextra/components' # Bridging ETH to OP Mainnet With Viem From e944f4f7f4d7728df15b75c8b29fa846a6f93dba Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Thu, 19 Sep 2024 12:07:23 +0300 Subject: [PATCH 025/565] initial commit --- .../tutorials/sdk-estimate-costs.mdx | 204 +++++++++++------- 1 file changed, 130 insertions(+), 74 deletions(-) diff --git a/pages/builders/app-developers/tutorials/sdk-estimate-costs.mdx b/pages/builders/app-developers/tutorials/sdk-estimate-costs.mdx index 25b0f7894..8956dced5 100644 --- a/pages/builders/app-developers/tutorials/sdk-estimate-costs.mdx +++ b/pages/builders/app-developers/tutorials/sdk-estimate-costs.mdx @@ -1,17 +1,17 @@ --- title: Estimating Transaction Costs on OP Mainnet lang: en-US -description: Learn how to use the Optimism SDK to estimate the cost of a transaction on OP Mainnet. +description: Learn how to use the Viem/op-stack to estimate the cost of a transaction on OP Mainnet. --- -import { Callout, Steps } from 'nextra/components' +import { Callout, Steps, Tabs } from 'nextra/components' import { WipCallout } from '@/components/WipCallout' # Estimating Transaction Costs on OP Mainnet -In this tutorial, you'll learn how to use the [Optimism SDK](https://sdk.optimism.io) to estimate the cost of a transaction on OP Mainnet. +In this tutorial, you'll learn how to use the [Viem](https://viem.sh/op-stack/) to estimate the cost of a transaction on OP Mainnet. You'll learn how to estimate the [execution gas fee](/builders/app-developers/transactions/fees#execution-gas-fee) and the [L1 data fee](/builders/app-developers/transactions/fees#l1-data-fee) independently. You'll also learn how to estimate the total cost of the transaction all at once. @@ -19,50 +19,84 @@ You'll also learn how to estimate the total cost of the transaction all at once. Check out the full explainer on [OP Mainnet transaction fees](/builders/app-developers/transactions/fees) for more information on how OP Mainnet charges fees under the hood. -## Dependencies +## Prerequisites + +Before you begin, ensure you have the following: + +* Node.js (version 14 or later) +* An understanding of the [viem library](https://viem.sh/op-stack/) +* `pnpm` installed for managing packages. + +## Required Dependencies * [node](https://nodejs.org/en/) * [pnpm](https://pnpm.io/installation) +* [viem](https://viem.sh/op-stack/) -## Create a Demo Project +Install `pnpm` if you haven't already: + +```bash +npm install -g pnpm -You're going to use the Optimism SDK for this tutorial. -Since the Optimism SDK is a [Node.js](https://nodejs.org/en/) library, you'll need to create a Node.js project to use it. +``` + +## Create a Demo Project + {

Project Setup

} -{

Make a Project Folder

} + Let's create a new project and install the necessary dependencies. -```bash -mkdir op-sample-project -cd op-sample-project -``` + + {

Create a folder

} -{

Initialize the Project

} + ```bash + mkdir op-sample-project + cd op-sample-project + ``` -```bash -pnpm init -``` + {

Initialize the project

} -{

Install the Optimism SDK

} + ```bash + pnpm init + ``` -```bash -pnpm add @eth-optimism/sdk -``` + {

Install dependencies

} + + Install `viem`, and `dotenv` for managing environment variables. -{

Install ethers.js

} + ```bash + pnpm add viem dotenv + ``` +
-```bash -pnpm add ethers@^5 -``` + {

Configure Environment Variables

} + + You need a private key in order to sign transactions. + Create a `.env` file to securely store your environment variables + Set your private key as an environment variable with the `export` command. + Make sure this private key corresponds to an address that has ETH on Sepolia. + + ```bash + touch .env + ``` + + Add your wallet private key in the `.env` file. + You need a private key in order to sign transactions. + Make sure this private key corresponds to an address that has ETH on OP Sepolia. + + ```bash + RPC_URL=https://optimism-mainnet.infura.io/v3/YOUR_INFURA_PROJECT_ID + TUTORIAL_PRIVATE_KEY=0x... + ```
- -Want to create a new wallet for this tutorial? -If you have [`cast`](https://book.getfoundry.sh/getting-started/installation) installed you can run `cast wallet new` in your terminal to create a new wallet and get the private key. + + Never share your private key and avoid committing this file to version control. + ## Get ETH on OP Sepolia This tutorial explains how estimate transaction costs on OP Sepolia. @@ -72,19 +106,9 @@ You will need to get some ETH on OP Sepolia in order to run the code in this tut You can use the [Superchain Faucet](https://console.optimism.io/faucet?utm_source=docs) to get ETH on OP Sepolia. -## Add a Private Key to Your Environment - -You need a private key in order to sign transactions. -Set your private key as an environment variable with the `export` command. -Make sure this private key corresponds to an address that has ETH on OP Sepolia. - -```bash -export TUTORIAL_PRIVATE_KEY=0x... -``` - ## Start the Node REPL -You're going to use the Node REPL to interact with the Optimism SDK. +You're going to use the Node REPL to interact with the Viem library. To start the Node REPL run the following command in your terminal: ```bash @@ -96,17 +120,23 @@ This will bring up a Node REPL prompt that allows you to run javascript code. ## Import Dependencies You need to import some dependencies into your Node REPL session. +With `viem`, we will create an account using the private key and create the RPC provider - -{

Import the Optimism SDK

} + -```js file=/public/tutorials/sdk-estimate-costs.js#L3 hash=26b2fdb17dd6c8326a54ec51f0769528 -``` +{

Import the Viem

} -{

Import ethers.js

} +```js -```js file=/public/tutorials/sdk-estimate-costs.js#L4 hash=69a65ef97862612e4978b8563e6dbe3a +// Import required modules +import { createPublicClient, http } from 'viem' +import { privateKeyToAccount } from 'viem/accounts' +import { optimismSepolia } from 'viem/chains' +import { publicActionsL2 } from 'viem/op-stack' +import * as dotenv from 'dotenv'; +// Load environment variables +dotenv.config(); ```
@@ -116,59 +146,85 @@ You need to import some dependencies into your Node REPL session. You'll need a few variables throughout this tutorial. Let's set those up now. - - -{

Load your private key

} + + + To create the wallet instance, load your private key, using `privateKeyToAccount`. [`privateKeyToAccount`](https://viem.sh/docs/accounts/local/privateKeyToAccount#privatekeytoaccount) is a viem method used to sign transactions by passing a private key. -```js file=/public/tutorials/sdk-estimate-costs.js#L6 hash=755b77a7ffc7dfdc186f36c37d3d847a -``` + ```js + const account = privateKeyToAccount(process.env.PRIVATE_KEY); + ``` + -{

Create the RPC provider

} + + Set up our Viem Clients for the L1(Sepolia) and L2(optimismSepolia) -Here you're creating a standard Ethers RPC provider and wrapping it as an `L2Provider`, a class provided by the Optimism SDK. -This will add a few extra functions to the provider object that you'll use later in this tutorial. + ```js + const publicClient = createPublicClient({ + chain: optimismSepolia, + transport: http(process.env.RPC_URL), + }).extend(publicActionsL2()); + ``` -```js file=/public/tutorials/sdk-estimate-costs.js#L8 hash=1db780739476f924536f5fa58794b67f -``` + -{

Create the wallet instance

} - -```js file=/public/tutorials/sdk-estimate-costs.js#L9 hash=d315a1ba59b2ee3f43d178bab816e930 -``` - -
+ ## Estimate Transaction Costs -You're now going to use the Optimism SDK to estimate the cost of a transaction on OP Mainnet. +You're now going to estimate the cost of a transaction on OP Mainnet. Here you'll estimate the cost of a simple transaction that sends a small amount of ETH from your address to the address `0x1000000000000000000000000000000000000000`. {

Create the unsigned transaction

} -Ethers makes it easy to create unsigned transactions so you can estimate the cost of a transaction before you a user to sign it. +Viem makes it easy to create unsigned transactions so you can estimate the cost of a transaction before you sign it. Here you'll create an unsigned transaction that sends a small amount of ETH from your address to the address `0x1000000000000000000000000000000000000000`. -You can also create unsigned transactions that interact with contracts using [`Contract.populateTransaction`](https://docs.ethers.org/v5/api/contract/contract/#contract-populateTransaction). -```js file=/public/tutorials/sdk-estimate-costs.js#L11-L15 hash=22d44a7322d2d378e886a0ba5a0c6fec -``` + ```js + const tx = await publicClient.sendUnsignedTransaction({ + from: , + to: , + gasPrice: parseGwei('20'), + value: parseEther('1') + }) + ``` +{

Estimate Gas for a Transaction

} -{

Estimate the execution gas fee

} +Now that you have created an unsigned transaction that sends a small amount of ETH, we can estimate the gas for that transaction. We will use the `estimateGas` method from viem. -You can estimate the execution gas fee the same way you'd estimate the gas fee for any transaction on Ethereum. -Simply multiply the gas limit by the effective gas price. + ```js + const fromAddress = '0xYourAddress'; + const toAddress = '0xRecipientAddress'; + const value = 0.1n * 10n ** 18n; // 0.1 ETH in wei + + const gasEstimate = await client.estimateGas({ + from: fromAddress, + to: toAddress, + value: value, + }); + console.log(`Estimated Gas: ${gasEstimate}`); + ``` + + +{

Fetch Current Gas Price

} + +You can also fetch the current gas price on Op stack using the `getGasPrice` method from Viem. + + ```js + const gasPrice = await client.getGasPrice(); + console.log(`Current Gas Price: ${gasPrice}`); + ``` -```js file=/public/tutorials/sdk-estimate-costs.js#L18-L21 hash=8090c6513655722e1194d4d9f0f794af -``` {

Estimate the L1 data fee

} -You can estimate the L1 data fee with the [`estimateL1GasCost`](https://sdk.optimism.io/modules#estimateL1GasCost) function. -Under the hood, this function is estimating the amount of Ethereum gas required to publish this transaction on Ethereum and multiplying it by the current Ethereum gas price (as tracked by the L2). -This function returns the current cost estimate in wei. +On Op stack, transactions also incur an L1 Data Fee (or calldata fee) because data is posted to Ethereum (Layer 1). +This fee depends on the size of the calldata used by the transaction. + +```js + -```js file=/public/tutorials/sdk-estimate-costs.js#L24-L25 hash=c5b1b1754aede507d071419fa051e3d7 ``` {

Estimate the total cost

} From 86b86c3cfe618da6063ba866774306bb86db490c Mon Sep 17 00:00:00 2001 From: Franco Victorio Date: Fri, 20 Sep 2024 13:32:40 +0200 Subject: [PATCH 026/565] Add block numbers of network upgrades --- pages/builders/node-operators/network-upgrades.mdx | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/pages/builders/node-operators/network-upgrades.mdx b/pages/builders/node-operators/network-upgrades.mdx index 9560bcf95..8b5c26bef 100644 --- a/pages/builders/node-operators/network-upgrades.mdx +++ b/pages/builders/node-operators/network-upgrades.mdx @@ -23,11 +23,11 @@ that are pending governance approval. | Upgrade | Governance Approval | [OP Mainnet Activations](https://github.com/ethereum-optimism/superchain-registry/blob/main/superchain/configs/mainnet/superchain.toml) | [OP Sepolia Activations](https://github.com/ethereum-optimism/superchain-registry/blob/main/superchain/configs/sepolia/superchain.toml) | | ------------------------------------------------------------------- | ------------------------------------------------------------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------- | -| [Granite](https://specs.optimism.io/protocol/granite/overview.html) | [approved](https://gov.optimism.io/t/upgrade-proposal-10-granite-network-upgrade/8733) | Wed Sep 11 16:00:01 UTC 2024 (`1726070401`) | Mon Aug 12 16:00:00 UTC 2024 (`1723478400`) | -| [Fjord](https://specs.optimism.io/protocol/fjord/overview.html) | [approved](https://gov.optimism.io/t/upgrade-proposal-9-fjord-network-upgrade/8236) | Wed Jul 10 16:00:01 UTC 2024 (`1720627201`) | Wed May 29 16:00:00 UTC 2024 (`1720627201`) | -| [Ecotone](https://specs.optimism.io/protocol/ecotone/overview.html) | [approved](https://gov.optimism.io/t/upgrade-proposal-5-ecotone-network-upgrade/7669) | Thu Mar 14 00:00:01 UTC 2024 (`1710374401`) | Wed Feb 21 17:00:00 UTC 2024 (`1708534800`) | -| [Delta](https://specs.optimism.io/protocol/delta/overview.html) | [approved](https://gov.optimism.io/t/final-upgrade-proposal-3-delta-network-upgrade/7310) | Thu Feb 22 00:00:00 UTC 2024 (`1708560000`) | Fri Dec 22 00:00:00 UTC 2023 (`1703203200`) | -| [Canyon](https://specs.optimism.io/protocol/canyon/overview.html) | [approved](https://gov.optimism.io/t/final-upgrade-proposal-2-canyon-network-upgrade/7088) | Thu Jan 11 17:00:01 UTC 2024 (`1704992401`) | Tue Nov 14 17:00:00 UTC 2023 (`1699981200`) | +| [Granite](https://specs.optimism.io/protocol/granite/overview.html) | [approved](https://gov.optimism.io/t/upgrade-proposal-10-granite-network-upgrade/8733) | Wed Sep 11 16:00:01 UTC 2024 (`1726070401`) at block 125235812 | Mon Aug 12 16:00:00 UTC 2024 (`1723478400`) at block 15837930 | +| [Fjord](https://specs.optimism.io/protocol/fjord/overview.html) | [approved](https://gov.optimism.io/t/upgrade-proposal-9-fjord-network-upgrade/8236) | Wed Jul 10 16:00:01 UTC 2024 (`1720627201`) at block 122514212 | Wed May 29 16:00:00 UTC 2024 (`1716998400`) at block 12597930 | +| [Ecotone](https://specs.optimism.io/protocol/ecotone/overview.html) | [approved](https://gov.optimism.io/t/upgrade-proposal-5-ecotone-network-upgrade/7669) | Thu Mar 14 00:00:01 UTC 2024 (`1710374401`) at block 117387812 | Wed Feb 21 17:00:00 UTC 2024 (`1708534800`) at block 8366130 | +| [Delta](https://specs.optimism.io/protocol/delta/overview.html) | [approved](https://gov.optimism.io/t/final-upgrade-proposal-3-delta-network-upgrade/7310) | Thu Feb 22 00:00:00 UTC 2024 (`1708560000`) at block 116480612 | Fri Dec 22 00:00:00 UTC 2023 (`1703203200`) at block 5700330 | +| [Canyon](https://specs.optimism.io/protocol/canyon/overview.html) | [approved](https://gov.optimism.io/t/final-upgrade-proposal-2-canyon-network-upgrade/7088) | Thu Jan 11 17:00:01 UTC 2024 (`1704992401`) at block 114696812 | Tue Nov 14 17:00:00 UTC 2023 (`1699981200`) at block 4089330 | ## Summary of Changes From 7ee6b5355b102decd7e0d61cb6d2ea0148f68f94 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Fri, 20 Sep 2024 20:21:31 +0300 Subject: [PATCH 027/565] Finished the estimating tx cost tut --- .../tutorials/sdk-estimate-costs.mdx | 121 +++++++++++------- words.txt | 1 - 2 files changed, 73 insertions(+), 49 deletions(-) diff --git a/pages/builders/app-developers/tutorials/sdk-estimate-costs.mdx b/pages/builders/app-developers/tutorials/sdk-estimate-costs.mdx index 8956dced5..64a7248cc 100644 --- a/pages/builders/app-developers/tutorials/sdk-estimate-costs.mdx +++ b/pages/builders/app-developers/tutorials/sdk-estimate-costs.mdx @@ -1,14 +1,12 @@ --- -title: Estimating Transaction Costs on OP Mainnet +title: Estimating Transaction Costs on OP Stack lang: en-US description: Learn how to use the Viem/op-stack to estimate the cost of a transaction on OP Mainnet. --- import { Callout, Steps, Tabs } from 'nextra/components' -import { WipCallout } from '@/components/WipCallout' - -# Estimating Transaction Costs on OP Mainnet +# Estimating Transaction Costs on OP Stack In this tutorial, you'll learn how to use the [Viem](https://viem.sh/op-stack/) to estimate the cost of a transaction on OP Mainnet. @@ -16,7 +14,7 @@ You'll learn how to estimate the [execution gas fee](/builders/app-developers/tr You'll also learn how to estimate the total cost of the transaction all at once. -Check out the full explainer on [OP Mainnet transaction fees](/builders/app-developers/transactions/fees) for more information on how OP Mainnet charges fees under the hood. +Check out the full explainer on [OP Stack transaction fees](/builders/app-developers/transactions/fees) for more information on how OP Mainnet charges fees under the hood. ## Prerequisites @@ -130,10 +128,10 @@ With `viem`, we will create an account using the private key and create the RPC ```js // Import required modules -import { createPublicClient, http } from 'viem' +import { createPublicClient, createWalletClient, http, parseEther, parseGwei, formatEther } from 'viem' import { privateKeyToAccount } from 'viem/accounts' import { optimismSepolia } from 'viem/chains' -import { publicActionsL2 } from 'viem/op-stack' +import { publicActionsL2, walletActionsL2 } from 'viem/op-stack' import * as dotenv from 'dotenv'; // Load environment variables dotenv.config(); @@ -146,7 +144,7 @@ dotenv.config(); You'll need a few variables throughout this tutorial. Let's set those up now. - + To create the wallet instance, load your private key, using `privateKeyToAccount`. [`privateKeyToAccount`](https://viem.sh/docs/accounts/local/privateKeyToAccount#privatekeytoaccount) is a viem method used to sign transactions by passing a private key. @@ -155,13 +153,25 @@ Let's set those up now. ``` + + Set up our Wallet Clients for L2(optimismSepolia) + + ```js + const walletClient = createWalletClient({ + chain: optimismSepolia, + transport: http(process.env.L2_RPC_URL), + }).extend(walletActionsL2()) + ``` + + + Set up our Viem Clients for the L1(Sepolia) and L2(optimismSepolia) ```js const publicClient = createPublicClient({ chain: optimismSepolia, - transport: http(process.env.RPC_URL), + transport: http(process.env.L2_RPC_URL), }).extend(publicActionsL2()); ``` @@ -172,95 +182,107 @@ Let's set those up now. ## Estimate Transaction Costs You're now going to estimate the cost of a transaction on OP Mainnet. -Here you'll estimate the cost of a simple transaction that sends a small amount of ETH from your address to the address `0x1000000000000000000000000000000000000000`. - -{

Create the unsigned transaction

} +{

Creating a Transaction in Viem

} -Viem makes it easy to create unsigned transactions so you can estimate the cost of a transaction before you sign it. -Here you'll create an unsigned transaction that sends a small amount of ETH from your address to the address `0x1000000000000000000000000000000000000000`. +Viem makes it easy to prepare a transactions so you can estimate the cost of a transaction before you sign it. +Here you'll define an object with the required transaction fields and send a small amount of ETH from your address to the address `0x1000000000000000000000000000000000000000`. ```js - const tx = await publicClient.sendUnsignedTransaction({ - from: , - to: , - gasPrice: parseGwei('20'), - value: parseEther('1') - }) + const transaction = { + account, + to: '0x1000000000000000000000000000000000000000', + value: parseEther('0.1'), + gasPrice: parseGwei('20') + }; ``` -{

Estimate Gas for a Transaction

} +{

Estimate the execution gas fee

} + -Now that you have created an unsigned transaction that sends a small amount of ETH, we can estimate the gas for that transaction. We will use the `estimateGas` method from viem. +Now that you have prepared a transaction that sends a small amount of ETH, we can estimate the gas for that transaction by using the `estimateGas` method from viem. ```js - const fromAddress = '0xYourAddress'; - const toAddress = '0xRecipientAddress'; - const value = 0.1n * 10n ** 18n; // 0.1 ETH in wei - - const gasEstimate = await client.estimateGas({ - from: fromAddress, - to: toAddress, - value: value, - }); - console.log(`Estimated Gas: ${gasEstimate}`); + const gasLimit = await publicClient.estimateGas(transaction); + console.log(`Estimated Gas Limit: ${gasLimit}`); ``` + +{

Retrieve the current gas price

} -{

Fetch Current Gas Price

} +Retrieve the current gas price (effective gas price), Alternatively, given that you already set the gas price manually, you can use the `getGasPrice` method from viem. + + ```js + const effectiveGasPrice = await publicClient.getGasPrice(); + ``` +{

Calculate the execution gas fee

} -You can also fetch the current gas price on Op stack using the `getGasPrice` method from Viem. +To calculate the execution gas fee simply multiply the gas limit by the effective gas price. ```js - const gasPrice = await client.getGasPrice(); - console.log(`Current Gas Price: ${gasPrice}`); + const l2CostEstimate = gasLimit * effectiveGasPrice; + console.log(`Estimated Execution Gas Fee: ${formatEther(l2CostEstimate)} wei`); ``` +
{

Estimate the L1 data fee

} -On Op stack, transactions also incur an L1 Data Fee (or calldata fee) because data is posted to Ethereum (Layer 1). -This fee depends on the size of the calldata used by the transaction. +You can estimate the L1 data fee with the [estimateL1GasCost](https://viem.sh/op-stack/actions/estimateL1Gas) function. +Under the hood, this function is estimating the amount of Ethereum gas required to publish this transaction on Ethereum and multiplying it by the current Ethereum gas price (as tracked by the L2). +This function returns the current cost estimate in wei. + + ```js + const l1CostEstimate = await publicClient.estimateL1Gas(transaction) + console.log(`Estimated L1 data Fee: ${formatEther(l1CostEstimate)}`); + ``` -```js - -``` {

Estimate the total cost

} Once you've individually estimated the execution gas fee and the L1 data fee, you can sum these two values together to get the total cost of the transaction. -```js file=/public/tutorials/sdk-estimate-costs.js#L28-L29 hash=f7315f3dbf96423569a42c902eeee45c -``` + ```js + const totalSum = l2CostEstimate + l1CostEstimate; + console.log(`Estimated Total Cost: ${formatEther(totalSum)} `); + ``` {

Send the transaction

} Now that you've estimated the total cost of the transaction, go ahead and send it to the network. This will make it possible to see the actual cost of the transaction to compare to your estimate. -```js file=/public/tutorials/sdk-estimate-costs.js#L32-L34 hash=f0cc7ae37a28a884aa7f47f13b381681 +```js + const txHash = await walletClient.sendTransaction(transaction) ``` {

Check the actual execution gas fee

} Once you get back the transaction receipt, check the actual execution gas fee. -```js file=/public/tutorials/sdk-estimate-costs.js#L37-L38 hash=3b3ce48412906a44c1d2f6861a99c8a0 +```js +const l2CostActual = await publicClient.estimateL2Fee(txHash) + console.log(`l2CostActual gas fee: ${formatEther(l2CostActual)}`); ``` {

Check the actual L1 data fee

} You can also check the actual L1 data fee. -```js file=/public/tutorials/sdk-estimate-costs.js#L41-L42 hash=3438ad167823b837f3511759a06e73f3 +```js + const l1CostActual = await publicClient.estimateL1Fee(txHash) + console.log(`l1CostActual gas fee: ${formatEther(l1CostActual)}`); + ``` {

Check the actual total cost

} Sum these two together to get the actual total cost of the transaction. -```js file=/public/tutorials/sdk-estimate-costs.js#L45-L46 hash=d23b6db1b716cba154932fd3d261995e +```js + const totalActual = l2CostActual + l1CostActual; + console.log(`Total Actual Cost: ${formatEther(totalActual)}`); ``` {

Check the difference

} @@ -269,7 +291,10 @@ Finally, check the difference between the estimated total cost and the actual to This will give you a sense of how accurate your estimate was. Estimates will never be entirely accurate, but they should be close! -```js file=/public/tutorials/sdk-estimate-costs.js#L49-L50 hash=358adb5552c9f00484a6bb0580109fd8 +```js + const difference = totalSum - totalActual + console.log(`The difference - ${formatEther(difference)}`) + ```
diff --git a/words.txt b/words.txt index eec868c55..90467007b 100644 --- a/words.txt +++ b/words.txt @@ -101,7 +101,6 @@ EXTRADATA extradata Farcaster farcaster -Fastnode FDLIMIT fdlimit featureset From cefac45318b2d436143c39f60a4a72bfb3c6f691 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Fri, 20 Sep 2024 20:49:34 +0300 Subject: [PATCH 028/565] finish the tutorial --- .../tutorials/sdk-estimate-costs.mdx | 221 +++++++++--------- 1 file changed, 114 insertions(+), 107 deletions(-) diff --git a/pages/builders/app-developers/tutorials/sdk-estimate-costs.mdx b/pages/builders/app-developers/tutorials/sdk-estimate-costs.mdx index 64a7248cc..8777e5e50 100644 --- a/pages/builders/app-developers/tutorials/sdk-estimate-costs.mdx +++ b/pages/builders/app-developers/tutorials/sdk-estimate-costs.mdx @@ -8,13 +8,12 @@ import { Callout, Steps, Tabs } from 'nextra/components' # Estimating Transaction Costs on OP Stack - In this tutorial, you'll learn how to use the [Viem](https://viem.sh/op-stack/) to estimate the cost of a transaction on OP Mainnet. You'll learn how to estimate the [execution gas fee](/builders/app-developers/transactions/fees#execution-gas-fee) and the [L1 data fee](/builders/app-developers/transactions/fees#l1-data-fee) independently. You'll also learn how to estimate the total cost of the transaction all at once. -Check out the full explainer on [OP Stack transaction fees](/builders/app-developers/transactions/fees) for more information on how OP Mainnet charges fees under the hood. + Check out the full explainer on [OP Stack transaction fees](/builders/app-developers/transactions/fees) for more information on how OP Mainnet charges fees under the hood. ## Prerequisites @@ -60,7 +59,7 @@ npm install -g pnpm ``` {

Install dependencies

} - + Install `viem`, and `dotenv` for managing environment variables. ```bash @@ -68,7 +67,6 @@ npm install -g pnpm ```
- {

Configure Environment Variables

} You need a private key in order to sign transactions. @@ -80,28 +78,27 @@ npm install -g pnpm touch .env ``` - Add your wallet private key in the `.env` file. - You need a private key in order to sign transactions. - Make sure this private key corresponds to an address that has ETH on OP Sepolia. + Add your wallet private key in the `.env` file. + You need a private key in order to sign transactions. + Make sure this private key corresponds to an address that has ETH on OP Sepolia. - ```bash - RPC_URL=https://optimism-mainnet.infura.io/v3/YOUR_INFURA_PROJECT_ID - TUTORIAL_PRIVATE_KEY=0x... - ``` + ```bash + RPC_URL=https://optimism-mainnet.infura.io/v3/YOUR_INFURA_PROJECT_ID + TUTORIAL_PRIVATE_KEY=0x... + ```
Never share your private key and avoid committing this file to version control. - ## Get ETH on OP Sepolia This tutorial explains how estimate transaction costs on OP Sepolia. You will need to get some ETH on OP Sepolia in order to run the code in this tutorial. -You can use the [Superchain Faucet](https://console.optimism.io/faucet?utm_source=docs) to get ETH on OP Sepolia. + You can use the [Superchain Faucet](https://console.optimism.io/faucet?utm_source=docs) to get ETH on OP Sepolia. ## Start the Node REPL @@ -120,23 +117,20 @@ This will bring up a Node REPL prompt that allows you to run javascript code. You need to import some dependencies into your Node REPL session. With `viem`, we will create an account using the private key and create the RPC provider - - -{

Import the Viem

} - -```js - -// Import required modules -import { createPublicClient, createWalletClient, http, parseEther, parseGwei, formatEther } from 'viem' -import { privateKeyToAccount } from 'viem/accounts' -import { optimismSepolia } from 'viem/chains' -import { publicActionsL2, walletActionsL2 } from 'viem/op-stack' -import * as dotenv from 'dotenv'; -// Load environment variables -dotenv.config(); -``` - + {

Import the Viem

} + + ```js + + // Import required modules + import { createPublicClient, createWalletClient, http, parseEther, parseGwei, formatEther } from 'viem' + import { privateKeyToAccount } from 'viem/accounts' + import { optimismSepolia } from 'viem/chains' + import { publicActionsL2, walletActionsL2 } from 'viem/op-stack' + import * as dotenv from 'dotenv'; + // Load environment variables + dotenv.config(); + ```
## Set Session Variables @@ -153,7 +147,7 @@ Let's set those up now. ``` - + Set up our Wallet Clients for L2(optimismSepolia) ```js @@ -162,7 +156,6 @@ Let's set those up now. transport: http(process.env.L2_RPC_URL), }).extend(walletActionsL2()) ``` - @@ -174,127 +167,141 @@ Let's set those up now. transport: http(process.env.L2_RPC_URL), }).extend(publicActionsL2()); ``` - - ## Estimate Transaction Costs You're now going to estimate the cost of a transaction on OP Mainnet. - -{

Creating a Transaction in Viem

} - -Viem makes it easy to prepare a transactions so you can estimate the cost of a transaction before you sign it. -Here you'll define an object with the required transaction fields and send a small amount of ETH from your address to the address `0x1000000000000000000000000000000000000000`. - - ```js - const transaction = { - account, - to: '0x1000000000000000000000000000000000000000', - value: parseEther('0.1'), - gasPrice: parseGwei('20') - }; - ``` -{

Estimate the execution gas fee

} + + {

Creating a Transaction in Viem

} + + Viem makes it easy to prepare a transactions so you can estimate the cost of a transaction before you sign it. + Here you'll define an object with the required transaction fields and send a small amount of ETH from your address to the address `0x1000000000000000000000000000000000000000`. + + ```js + const transaction = { + account, + to: '0x1000000000000000000000000000000000000000', + value: parseEther('0.1'), + gasPrice: parseGwei('20') + }; + ``` + {

Estimate the execution gas fee

} -Now that you have prepared a transaction that sends a small amount of ETH, we can estimate the gas for that transaction by using the `estimateGas` method from viem. + Now that you have prepared a transaction that sends a small amount of ETH, we can estimate the gas for that transaction by using the `estimateGas` method from viem. - ```js - const gasLimit = await publicClient.estimateGas(transaction); - console.log(`Estimated Gas Limit: ${gasLimit}`); - ``` - + ```js + const gasLimit = await publicClient.estimateGas(transaction); + console.log(`Estimated Gas Limit: ${gasLimit}`); + ``` -{

Retrieve the current gas price

} + + {

Retrieve the current gas price

} -Retrieve the current gas price (effective gas price), Alternatively, given that you already set the gas price manually, you can use the `getGasPrice` method from viem. + Retrieve the current gas price (effective gas price), Alternatively, given that you already set the gas price manually, you can use the `getGasPrice` method from viem. ```js const effectiveGasPrice = await publicClient.getGasPrice(); + console.log(`effective Gas Price, ${effectiveGasPrice}`); ``` -{

Calculate the execution gas fee

} -To calculate the execution gas fee simply multiply the gas limit by the effective gas price. + {

Calculate the execution gas fee

} + + To calculate the execution gas fee simply multiply the gas limit by the effective gas price. ```js const l2CostEstimate = gasLimit * effectiveGasPrice; - console.log(`Estimated Execution Gas Fee: ${formatEther(l2CostEstimate)} wei`); + console.log(`Estimated Execution Gas Fee: ${formatEther(l2CostEstimate)}`); ``` +
-
- -{

Estimate the L1 data fee

} - -You can estimate the L1 data fee with the [estimateL1GasCost](https://viem.sh/op-stack/actions/estimateL1Gas) function. -Under the hood, this function is estimating the amount of Ethereum gas required to publish this transaction on Ethereum and multiplying it by the current Ethereum gas price (as tracked by the L2). -This function returns the current cost estimate in wei. - - ```js - const l1CostEstimate = await publicClient.estimateL1Gas(transaction) - console.log(`Estimated L1 data Fee: ${formatEther(l1CostEstimate)}`); - ``` + {

Estimate the L1 data fee

} + You can estimate the L1 data fee with the [estimateL1GasCost](https://viem.sh/op-stack/actions/estimateL1Gas) function. + Under the hood, this function is estimating the amount of Ethereum gas required to publish this transaction on Ethereum and multiplying it by the current Ethereum gas price (as tracked by the L2). + This function returns the current cost estimate in wei. + ```js + const l1CostEstimate = await publicClient.estimateL1Gas(transaction) + console.log(`Estimated L1 data Fee: ${formatEther(l1CostEstimate)}`); + ``` -{

Estimate the total cost

} + {

Estimate the total cost

} -Once you've individually estimated the execution gas fee and the L1 data fee, you can sum these two values together to get the total cost of the transaction. + Once you've individually estimated the execution gas fee and the L1 data fee, you can sum these two values together to get the total cost of the transaction. - ```js + ```js const totalSum = l2CostEstimate + l1CostEstimate; console.log(`Estimated Total Cost: ${formatEther(totalSum)} `); ``` -{

Send the transaction

} - -Now that you've estimated the total cost of the transaction, go ahead and send it to the network. -This will make it possible to see the actual cost of the transaction to compare to your estimate. + {

Send the transaction

} -```js - const txHash = await walletClient.sendTransaction(transaction) -``` + Now that you've estimated the total cost of the transaction, go ahead and send it to the network. + This will make it possible to see the actual cost of the transaction to compare to your estimate. -{

Check the actual execution gas fee

} + ```js + const txHash = await walletClient.sendTransaction(transaction) + console.log(`Transaction Hash: ${tx}`); + ``` -Once you get back the transaction receipt, check the actual execution gas fee. + {

Check the actual execution gas fee

} -```js -const l2CostActual = await publicClient.estimateL2Fee(txHash) - console.log(`l2CostActual gas fee: ${formatEther(l2CostActual)}`); -``` + Once you get back the transaction receipt, check the actual execution gas fee. + You can do so by accessing the `gasUsed` and `effectiveGasPrice` from the transaction receipt. + You can then multiply these values to get the actual L2 cost of the transaction -{

Check the actual L1 data fee

} + ```js + const receipt = await publicClient.getTransactionReceipt({ hash: txHash }); + console.log('Transaction receipt:', receipt); -You can also check the actual L1 data fee. + const l2CostActual = receipt.gasUsed * receipt.effectiveGasPrice; + console.log(`L2 Actual Cost: ${formatEther(l2CostActual)}`); + ``` -```js - const l1CostActual = await publicClient.estimateL1Fee(txHash) - console.log(`l1CostActual gas fee: ${formatEther(l1CostActual)}`); + {

Check the actual L1 data fee

} -``` + You can also check the actual L1 data fee. -{

Check the actual total cost

} + ```js + const l1CostActual = await publicClient.estimateL1Fee(txHash) + console.log(`l1CostActual gas fee: ${formatEther(l1CostActual)}`); -Sum these two together to get the actual total cost of the transaction. + ``` -```js - const totalActual = l2CostActual + l1CostActual; - console.log(`Total Actual Cost: ${formatEther(totalActual)}`); -``` + {

Check the actual total cost

} -{

Check the difference

} + Sum these two together to get the actual total cost of the transaction. -Finally, check the difference between the estimated total cost and the actual total cost. -This will give you a sense of how accurate your estimate was. -Estimates will never be entirely accurate, but they should be close! + ```js + const totalActual = l2CostActual + l1CostActual; + console.log(`Total Actual Cost: ${formatEther(totalActual)}`); + ``` -```js - const difference = totalSum - totalActual - console.log(`The difference - ${formatEther(difference)}`) + {

Check the difference

} -``` + Finally, check the difference between the estimated total cost and the actual total cost. + This will give you a sense of how accurate your estimate was. + Estimates will never be entirely accurate, but they should be close! + ```js + const difference = totalSum - totalActual + console.log(`The difference - ${formatEther(difference)}`) + ```
+ + +Estimates will never be entirely accurate due to network conditions and gas price fluctuations, but they should be close to the actual costs. + + +## Next Steps + +* Always estimate before sending: Estimating costs before sending a transaction helps prevent unexpected fees and failed transactions. +* Account for gas price volatility: Gas prices can change rapidly. Consider adding a buffer to your estimates or implementing a gas price oracle for more accurate pricing. +* Optimize transaction data: Minimize the amount of data in your transactions to reduce L1 data fees. +* Monitor network conditions: Keep an eye on network congestion and adjust your estimates accordingly. +* Use appropriate gas limits: Setting too low a gas limit can cause transactions to fail, while setting it too high can result in unnecessary costs. +* Implement retry mechanisms: If a transaction fails due to underestimated gas, implement a retry mechanism with adjusted gas parameters. From 354d2a74c56ad1482afe02cd3e91e823e99907a8 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Fri, 20 Sep 2024 21:35:52 +0300 Subject: [PATCH 029/565] push full code snippet --- public/tutorials/sdk-estimate-costs.js | 107 ++++++++++++++++--------- 1 file changed, 68 insertions(+), 39 deletions(-) diff --git a/public/tutorials/sdk-estimate-costs.js b/public/tutorials/sdk-estimate-costs.js index f223f0026..a4fb2509b 100644 --- a/public/tutorials/sdk-estimate-costs.js +++ b/public/tutorials/sdk-estimate-costs.js @@ -1,52 +1,81 @@ -(async () => { +import { createPublicClient, createWalletClient, http, parseEther, parseGwei, formatEther } from 'viem' +import { privateKeyToAccount } from 'viem/accounts' +import { optimismSepolia } from 'viem/chains' +import { publicActionsL2, walletActionsL2 } from 'viem/op-stack' +import * as dotenv from 'dotenv' -const optimism = require("@eth-optimism/sdk") -const ethers = require("ethers") +// Load environment variables +dotenv.config() -const privateKey = process.env.TUTORIAL_PRIVATE_KEY +// Set up the account +const account = privateKeyToAccount(process.env.PRIVATE_KEY) -const provider = optimism.asL2Provider(new ethers.providers.StaticJsonRpcProvider("https://sepolia.optimism.io")) -const wallet = new ethers.Wallet(privateKey, provider) +// Set up the public client +const publicClient = createPublicClient({ + chain: optimismSepolia, + transport: http(process.env.L2_RPC_URL), +}).extend(publicActionsL2()) -const tx = await wallet.populateTransaction({ - to: '0x1000000000000000000000000000000000000000', - value: ethers.utils.parseEther('0.00069420'), - gasPrice: await provider.getGasPrice(), -}) +// Set up the wallet client +const walletClient = createWalletClient({ + chain: optimismSepolia, + transport: http(process.env.L2_RPC_URL), +}).extend(walletActionsL2()) -console.log('Estimating L2 cost...') -const gasLimit = tx.gasLimit -const gasPrice = tx.maxFeePerGas -const l2CostEstimate = gasLimit.mul(gasPrice) -console.log(ethers.utils.formatEther(l2CostEstimate)) +async function estimateTransactionCosts() { + try { + // Prepare the transaction + const transaction = { + account, + to: '0x1000000000000000000000000000000000000000', + value: parseEther('0.1'), + gasPrice: parseGwei('20') + } -console.log('Estimating L1 cost...') -const l1CostEstimate = await provider.estimateL1GasCost(tx) -console.log(ethers.utils.formatEther(l1CostEstimate)) + // Estimate gas limit + const gasLimit = await publicClient.estimateGas(transaction) + console.log(`Estimated Gas Limit: ${gasLimit}`) -console.log('Summing total cost...') -const totalSum = l2CostEstimate.add(l1CostEstimate) -console.log(ethers.utils.formatEther(totalSum)) + // Get current gas price + const effectiveGasPrice = await publicClient.getGasPrice() + console.log(`Effective Gas Price: ${formatEther(effectiveGasPrice)} ETH`) -console.log('Sending transaction...') -const res = await wallet.sendTransaction(tx) -const receipt = await res.wait() -console.log(receipt.transactionHash) + // Calculate execution gas fee + const l2CostEstimate = gasLimit * effectiveGasPrice + console.log(`Estimated Execution Gas Fee: ${formatEther(l2CostEstimate)} ETH`) -console.log('Actual L2 cost:') -const l2CostActual = receipt.gasUsed.mul(receipt.effectiveGasPrice) -console.log(ethers.utils.formatEther(l2CostActual)) + // Estimate L1 data fee + const l1CostEstimate = await publicClient.estimateL1Gas(transaction) + console.log(`Estimated L1 Data Fee: ${formatEther(l1CostEstimate)} ETH`) -console.log('Actual L1 cost:') -const l1CostActual = receipt.l1Fee -console.log(ethers.utils.formatEther(l1CostActual)) + // Calculate total estimated cost + const totalEstimate = l2CostEstimate + l1CostEstimate + console.log(`Estimated Total Cost: ${formatEther(totalEstimate)} ETH`) -console.log('Actual total cost:') -const totalActual = l2CostActual.add(l1CostActual) -console.log(ethers.utils.formatEther(totalActual)) + // Send the transaction + const txHash = await walletClient.sendTransaction(transaction) + console.log(`Transaction Hash: ${txHash}`) -console.log('Difference:') -const difference = totalActual.sub(totalSum).abs() -console.log(ethers.utils.formatEther(difference)) + // Wait for the transaction to be mined + const receipt = await publicClient.waitForTransactionReceipt({ hash: txHash }) -})() + // Calculate actual costs + const l2CostActual = receipt.gasUsed * receipt.effectiveGasPrice + console.log(`Actual Execution Gas Fee: ${formatEther(l2CostActual)} ETH`) + + const l1CostActual = await publicClient.estimateL1Fee({ hash: txHash }) + console.log(`Actual L1 Data Fee: ${formatEther(l1CostActual)} ETH`) + + const totalActual = l2CostActual + l1CostActual + console.log(`Actual Total Cost: ${formatEther(totalActual)} ETH`) + + // Compare estimated vs actual costs + const difference = totalEstimate - totalActual + console.log(`Estimation Difference: ${formatEther(difference)} ETH`) + + } catch (error) { + console.error('Error:', error) + } +} + +estimateTransactionCosts() \ No newline at end of file From 7bfe5f3c72c404f04f12fdbeda2b8b05588c4bff Mon Sep 17 00:00:00 2001 From: soyboy <85043086+sbvegan@users.noreply.github.com> Date: Mon, 23 Sep 2024 12:11:14 -0700 Subject: [PATCH 030/565] Update json-rpc.mdx quick fix: this method doesn't need params --- pages/builders/node-operators/json-rpc.mdx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pages/builders/node-operators/json-rpc.mdx b/pages/builders/node-operators/json-rpc.mdx index c7d95b1b9..be9d30fee 100644 --- a/pages/builders/node-operators/json-rpc.mdx +++ b/pages/builders/node-operators/json-rpc.mdx @@ -973,13 +973,13 @@ TODO: add description ```sh curl -X POST -H "Content-Type: application/json" --data \ - '{"jsonrpc":"2.0","method":"admin_sequencerActive","params":[todo],"id":1}' \ + '{"jsonrpc":"2.0","method":"admin_sequencerActive","params":[],"id":1}' \ http://localhost:9545 ``` ```sh - cast rpc admin_sequencerActive [todo: add paramater options] --rpc-url http://localhost:9545 + cast rpc admin_sequencerActive [] --rpc-url http://localhost:9545 ``` From 09b8885f1c9ba36af1d53df93322f9a202cb1884 Mon Sep 17 00:00:00 2001 From: soyboy Date: Mon, 23 Sep 2024 12:46:15 -0700 Subject: [PATCH 031/565] adding the content eval back --- .github/ISSUE_TEMPLATE/docs_audit_results.md | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/.github/ISSUE_TEMPLATE/docs_audit_results.md b/.github/ISSUE_TEMPLATE/docs_audit_results.md index 616dc0dd9..98d360ff2 100644 --- a/.github/ISSUE_TEMPLATE/docs_audit_results.md +++ b/.github/ISSUE_TEMPLATE/docs_audit_results.md @@ -23,7 +23,6 @@ labels: 'docs-audit-2024-Q4,op-labs' - `p-medium`: (Could do) Tasks that need to be done but are less critical than high-priority tasks. These often improve processes or efficiency but can be postponed if necessary without immediate severe repercussions. - `p-high`: (Should do) Important tasks that contribute significantly to long-term goals but may not have an immediate deadline. Delaying these tasks could have considerable negative effects but are not as immediate as critical tasks. - `p-critical`: Tasks that have immediate deadlines or significant consequences if not completed on time. These are non-negotiable and often linked to core business functions or legal requirements. -
@@ -34,7 +33,15 @@ labels: 'docs-audit-2024-Q4,op-labs' - `s-M`: (1-2 weeks) Tasks that involve a moderate level of complexity and collaboration. - `s-L`: (several weeks) Complex tasks that require significant time investment and coordination across multiple teams. - `s-XL`: (> 1 month) Very large and complex projects that involve extensive planning, execution, and testing. +
+
+Content evaluation +- `a-delete`: don't need this page +- `a-duplicate`: some content lives elsewhere +- `a-minor`: needs small revisions +- `a-moderate`: needs moderate revisions +- `a-critical`: needs a lot of work
## MDX Metadata format From f68aba33f2f971bddb095ba42af15534e1f1a894 Mon Sep 17 00:00:00 2001 From: soyboy Date: Mon, 23 Sep 2024 12:54:41 -0700 Subject: [PATCH 032/565] adding op-deployer --- .github/ISSUE_TEMPLATE/docs_audit_results.md | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/ISSUE_TEMPLATE/docs_audit_results.md b/.github/ISSUE_TEMPLATE/docs_audit_results.md index 98d360ff2..778661d33 100644 --- a/.github/ISSUE_TEMPLATE/docs_audit_results.md +++ b/.github/ISSUE_TEMPLATE/docs_audit_results.md @@ -111,6 +111,7 @@ zdd-service snapman security-tools superchain-ops +op-deployer ``` From 85c8ef8f4370cc46faa71d6356624fd0f159a4b8 Mon Sep 17 00:00:00 2001 From: soyboy Date: Mon, 23 Sep 2024 12:56:47 -0700 Subject: [PATCH 033/565] fixing dropdown formatting --- .github/ISSUE_TEMPLATE/docs_audit_results.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/ISSUE_TEMPLATE/docs_audit_results.md b/.github/ISSUE_TEMPLATE/docs_audit_results.md index 778661d33..02e332e46 100644 --- a/.github/ISSUE_TEMPLATE/docs_audit_results.md +++ b/.github/ISSUE_TEMPLATE/docs_audit_results.md @@ -16,6 +16,7 @@ labels: 'docs-audit-2024-Q4,op-labs' > Choose the appropriate github issue labels for each page.
+ Priority - `p-on-hold`: (Defer) Tasks that are currently not actionable due to various reasons like waiting for external inputs, dependencies, or resource constraints. These are reviewed periodically to decide if they can be moved to a more active status. @@ -26,6 +27,7 @@ labels: 'docs-audit-2024-Q4,op-labs'
+ T-shirt size - `s-XS`: (< 1 day) Very simple tasks that require minimal time and effort. @@ -36,6 +38,7 @@ labels: 'docs-audit-2024-Q4,op-labs'
+ Content evaluation - `a-delete`: don't need this page - `a-duplicate`: some content lives elsewhere @@ -60,6 +63,7 @@ description: "A short description of the content."
Component tags + ``` op-node op-geth @@ -117,6 +121,7 @@ op-deployer
Engineering tags + ``` eng-platforms eng-growth From 62f9888eb2b1f86a032277ed3e856e1d092dbf5f Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Tue, 24 Sep 2024 14:29:58 +0300 Subject: [PATCH 034/565] resolved comments --- .../tutorials/cross-dom-bridge-eth.mdx | 41 ++++++++++--------- 1 file changed, 22 insertions(+), 19 deletions(-) diff --git a/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx b/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx index 2fa68f7d1..b880cdff4 100644 --- a/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx +++ b/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx @@ -8,8 +8,6 @@ import { Callout, Steps, Tabs } from 'nextra/components' # Bridging ETH to OP Mainnet With Viem -This tutorial guides you through transferring ETH between Ethereum Mainnet (L1) and Optimism (L2) using the viem/op-stack library. This updated tutorial replaces the deprecated @eth-optimism/sdk with the latest and most efficient methods available in the viem/op-stack - This tutorial explains how you can use the [Viem](https://viem.sh/op-stack/) to bridge ETH from L1 (Ethereum or Sepolia) to L2 (OP Mainnet or OP Sepolia). The `viem/op-stack` library is an easy way to add bridging functionality to your JavaScript-based application. It also provides some safety rails to prevent common mistakes that could cause ETH or ERC-20 tokens to be made inaccessible. @@ -20,7 +18,6 @@ Make sure to check out the [Standard Bridge guide](/builders/app-developers/brid Before you begin, ensure you have the following: -* Metamask or another Ethereum-compatible wallet installed * Node.js (version 14 or later) * Familiarity with bridging concepts between L1 and L2. * An understanding of the [viem library](https://viem.sh/op-stack/) @@ -90,8 +87,9 @@ npm install -g pnpm ## Import Dependencies You need to import some dependencies into your project. +Create a new file named `bridge-eth.ts` in your project directory and add the following code: -Using `viem`, we will create an account using the private key and initialize L1 and L2 clients to interact with Sepolia and optimismSepolia. +Using `viem`, we will create an account using the private key and initialize L1 and L2 clients to interact with `Sepolia` and `optimismSepolia`. ```js @@ -110,6 +108,11 @@ dotenv.config(); You'll need a few variables throughout this tutorial. Let's set those up now. + + + + + Create an account from the private key. [`privateKeyToAccount`](https://viem.sh/docs/accounts/local/privateKeyToAccount#privatekeytoaccount) is a viem method used to sign transactions by passing a private key. @@ -395,17 +398,17 @@ Now you're going to repeat the process in reverse to bridge some ETH from L2 to Build parameters to prove the withdrawal on the L2. ```js - const proveArgs = await publicClientL2.buildProveWithdrawal({ - output, - withdrawal, - }) + const proveArgs = await publicClientL2.buildProveWithdrawal({ + output, + withdrawal, + }) ``` {

Prove the withdrawal on the L1

} Once the withdrawal is ready to be proven, you'll send an L1 transaction to prove that the withdrawal happened on L2. ```js - const proveHash = await walletClientL1.proveWithdrawal(proveArgs) + const proveHash = await walletClientL1.proveWithdrawal(proveArgs) ``` ```js @@ -418,9 +421,9 @@ Now you're going to repeat the process in reverse to bridge some ETH from L2 to This can only happen after the fault proof period has elapsed. On OP Mainnet, this takes 7 days. ```js - const awaitWithdrawal = await publicClientL1.waitToFinalize({ - targetChain: walletClientL2.chain, - withdrawalHash: withdrawal.withdrawalHash, + const awaitWithdrawal = await publicClientL1.waitToFinalize({ + targetChain: walletClientL2.chain, + withdrawalHash: withdrawal.withdrawalHash, }) ``` @@ -434,8 +437,8 @@ Now you're going to repeat the process in reverse to bridge some ETH from L2 to ```js const finalizeHash = await walletClientL1.finalizeWithdrawal({ - targetChain: walletClientL2.chain, - withdrawal, + targetChain: walletClientL2.chain, + withdrawal, }) ``` @@ -443,17 +446,17 @@ Now you're going to repeat the process in reverse to bridge some ETH from L2 to ```js const finalizeReceipt = await publicClientL1.waitForTransactionReceipt({ - hash: finalizeHash + hash: finalizeHash }) ``` {

Check the withdrawal status

} ```js - const status = await publicClientL1.getWithdrawalStatus({ - receipt, - targetChain: walletClientL2.chain - }) + const status = await publicClientL1.getWithdrawalStatus({ + receipt, + targetChain: walletClientL2.chain + }) ```
From d09716789daefdfa5b803dba9a8e9fad6a816936 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Tue, 24 Sep 2024 14:36:04 +0300 Subject: [PATCH 035/565] updated header --- pages/builders/app-developers/tutorials/sdk-estimate-costs.mdx | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/pages/builders/app-developers/tutorials/sdk-estimate-costs.mdx b/pages/builders/app-developers/tutorials/sdk-estimate-costs.mdx index 8777e5e50..78f9aef19 100644 --- a/pages/builders/app-developers/tutorials/sdk-estimate-costs.mdx +++ b/pages/builders/app-developers/tutorials/sdk-estimate-costs.mdx @@ -115,10 +115,9 @@ This will bring up a Node REPL prompt that allows you to run javascript code. ## Import Dependencies You need to import some dependencies into your Node REPL session. -With `viem`, we will create an account using the private key and create the RPC provider - {

Import the Viem

} + {

Import the necessary packages

} ```js From 9ec6760bf86c0c8549cf299ae56f7d02e629ede2 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Tue, 24 Sep 2024 14:55:50 +0300 Subject: [PATCH 036/565] update description --- .../builders/app-developers/tutorials/sdk-estimate-costs.mdx | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/pages/builders/app-developers/tutorials/sdk-estimate-costs.mdx b/pages/builders/app-developers/tutorials/sdk-estimate-costs.mdx index 78f9aef19..614303f54 100644 --- a/pages/builders/app-developers/tutorials/sdk-estimate-costs.mdx +++ b/pages/builders/app-developers/tutorials/sdk-estimate-costs.mdx @@ -45,11 +45,12 @@ npm install -g pnpm Let's create a new project and install the necessary dependencies. - {

Create a folder

} + {

Create a folder and new file

} ```bash mkdir op-sample-project cd op-sample-project + touch estimate-costs.js ``` {

Initialize the project

} @@ -119,6 +120,8 @@ You need to import some dependencies into your Node REPL session. {

Import the necessary packages

} + In your project directory and add the following code in `estimate-costs.js`: + ```js // Import required modules From 5b33b4104e4844032acdaf3bc13213f9299a0fed Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Tue, 24 Sep 2024 14:53:46 +0100 Subject: [PATCH 037/565] updated the codebase --- .../tutorials/cross-dom-bridge-eth.mdx | 109 ++++++++---------- 1 file changed, 48 insertions(+), 61 deletions(-) diff --git a/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx b/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx index b880cdff4..f62b5b881 100644 --- a/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx +++ b/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx @@ -18,16 +18,10 @@ Make sure to check out the [Standard Bridge guide](/builders/app-developers/brid Before you begin, ensure you have the following: -* Node.js (version 14 or later) * Familiarity with bridging concepts between L1 and L2. * An understanding of the [viem library](https://viem.sh/op-stack/) -* `pnpm` installed for managing packages. - -## Required Dependencies - -* [node](https://nodejs.org/en/) -* [pnpm](https://pnpm.io/installation) -* [viem](https://viem.sh/op-stack/) +* [Node.js](https://nodejs.org/en/) (version 14 or later) +* [pnpm](https://pnpm.io/installation) installed for managing packages. Install `pnpm` if you haven't already: @@ -41,11 +35,12 @@ npm install -g pnpm Let's create a new project and install the necessary dependencies. - * Create a folder + * Create a folder and a file ```bash mkdir op-sample-project cd op-sample-project + touch bridge-eth.js ``` * Initialize the project: @@ -63,8 +58,7 @@ npm install -g pnpm {

Configure Environment Variables

} You need a private key in order to sign transactions. - Create a `.env` file to securely store your environment variables - Set your private key as an environment variable with the `export` command. + Create a `.env` file in your parent directory to securely store your environment variables Make sure this private key corresponds to an address that has ETH on Sepolia. ```bash @@ -74,8 +68,8 @@ npm install -g pnpm Add your Ethereum Layer 1 (L1) and Optimism Layer 2 (L2) RPC endpoints, and wallet private key in the `.env` file: ```bash - L1_RPC_URL=https://mainnet.infura.io/v3/YOUR_INFURA_PROJECT_ID - L2_RPC_URL=https://optimism-mainnet.infura.io/v3/YOUR_INFURA_PROJECT_ID + L1_RPC_URL=https://rpc.ankr.com/eth_sepolia + L2_RPC_URL=https://sepolia.optimism.io TUTORIAL_PRIVATE_KEY=0x... ```
@@ -86,18 +80,16 @@ npm install -g pnpm ## Import Dependencies -You need to import some dependencies into your project. -Create a new file named `bridge-eth.ts` in your project directory and add the following code: - -Using `viem`, we will create an account using the private key and initialize L1 and L2 clients to interact with `Sepolia` and `optimismSepolia`. +{

Import the necessary packages

} + In the `bridge-eth.js` file, import the `viem` package at the top: ```js // Import required modules import { createPublicClient, http, createWalletClient, parseEther } from 'viem'; import { sepolia, optimismSepolia } from 'viem/chains'; import { privateKeyToAccount } from 'viem/accounts' -import { getL2TransactionHashes, publicActionsL2, walletActionsL1 } from 'viem/op-stack' +import { getL2TransactionHashes, publicActionsL2, walletActionsL1, getL2TransactionHashes } from 'viem/op-stack' import * as dotenv from 'dotenv'; // Load environment variables dotenv.config(); @@ -108,22 +100,20 @@ dotenv.config(); You'll need a few variables throughout this tutorial. Let's set those up now. - - - - Create an account from the private key. [`privateKeyToAccount`](https://viem.sh/docs/accounts/local/privateKeyToAccount#privatekeytoaccount) is a viem method used to sign transactions by passing a private key. + Load your private key with `privateKeyToAccount`, after the imports above. + ```js const account = privateKeyToAccount(process.env.PRIVATE_KEY); ``` - Set up our Viem Clients for the L1(Sepolia) and L2(optimismSepolia) + Next, set up our viem clients for the L1(Sepolia) and L2(optimismSepolia) {

L1 (Sepolia) publicClientL1

} @@ -147,7 +137,7 @@ Let's set those up now.
- Set up wallet clients for L1 and L2. + Also set up wallet clients for L1 and L2. {

L1 (Sepolia) walletClientL1

} @@ -186,48 +176,45 @@ You will need to get some ETH on Sepolia to follow along. You're going to need some ETH on L1 that you can bridge to L2. You can get some Sepolia ETH from [this faucet](https://sepoliafaucet.com). -### Check your wallet balance on L1 and L2 +## Deposit ETH -Before initiating the bridge, you can check the ETH balance on both L1 and L2. +Now that you have some ETH on L1 you can deposit that ETH into the `L1StandardBridge` contract. You'll then receive the same number of ETH on L2 in return. -```js -const checkBalances = async () => { - const l1Balance = await publicClientL1.getBalance({ address: account.address }); - const l2Balance = await publicClientL2.getBalance({ address: account.address }); + + + - console.log(`L1 Balance: ${l1Balance} wei`); - console.log(`L2 Balance: ${l2Balance} wei`); -}; + {

Check your wallet balance on L1

} -checkBalances(); -``` + See how much ETH you have on L1 so you can confirm that the deposit worked later on. - - Balances will be returned in wei. You can convert them to ether if needed. - + ```js + const checkBalances = async () => { + const l1Balance = await publicClientL1.getBalance({ address: account.address }); + console.log(`L1 Balance: ${formatEther(l1Balance)} ETH`); + }; + checkBalances(); + ``` -## Deposit ETH + + We used `formatEther` method from `viem` to format the balance to ether. + -Now you can deposit your ETH into the Standard Bridge contract. -You'll deposit a small amount of ETH just to demonstrate the process. - - - {

Create the deposit transaction

} - Use `buildDepositTransaction` to create the deposit transaction parameters on L2 + Use `buildDepositTransaction` to build the deposit transaction parameters on the L2. ```js const args = await publicClientL2.buildDepositTransaction({ - mint: parseEther(amount), // Specifies the amount of ETH to deposit, converted to wei. - to: account.address, // Sets the recipient address on L2 (same as the sender in this case). + mint: parseEther('0.006942'), // Specify the amount of ETH to deposit. + to: account.address, // Sets the recipient address on L2 (same as the sender in this case). }); ``` - {

Sends the deposit transaction

} + {

Send the deposit transaction

} - Sends the deposit transaction on L1 and logs the L1 transaction hash. + Send the deposit transaction on L1 and log the L1 transaction hash. ```js const hash = await walletClientL1.depositTransaction(args); @@ -236,7 +223,7 @@ You'll deposit a small amount of ETH just to demonstrate the process. {

Wait for L1 transaction

} - Wait for the L1 transaction to be confirmed and logs the receipt. + Wait for the L1 transaction to be processed and log the receipt. ```js const receipt = await publicClientL1.waitForTransactionReceipt({ hash }); @@ -249,8 +236,8 @@ You'll deposit a small amount of ETH just to demonstrate the process. This hash represents the deposit transaction on L2. ```js - const [l2Hash] = getL2TransactionHashes(receipt); - console.log(`Corresponding L2 transaction hash: ${l2Hash}`); + const l2Hashes = getL2TransactionHashes(receipt); + console.log(`Corresponding L2 transaction hash: ${l2Hashes}`); ``` {

Wait for the L2 transaction to be processed

} @@ -259,7 +246,7 @@ You'll deposit a small amount of ETH just to demonstrate the process. ```js const l2Receipt = await publicClientL2.waitForTransactionReceipt({ - hash: l2Hash, + hash: l2Hashes, }); console.log('L2 transaction confirmed:', l2Receipt); console.log('Deposit completed successfully!'); @@ -272,7 +259,7 @@ You'll deposit a small amount of ETH just to demonstrate the process. import { createPublicClient, http, createWalletClient, parseEther } from 'viem'; import { sepolia, optimismSepolia } from "viem/chains"; import { privateKeyToAccount } from 'viem/accounts'; - import { getL2TransactionHashes, publicActionsL2, walletActionsL1, walletActionsL2 } from 'viem/op-stack'; + import { getL2TransactionHashes, publicActionsL2, walletActionsL1, walletActionsL2, getL2TransactionHashes } from 'viem/op-stack'; // Replace with your actual private key (Keep this secure!) const PRIVATE_KEY = '0x....' @@ -294,14 +281,14 @@ You'll deposit a small amount of ETH just to demonstrate the process. // Create L2 public client for interacting with OP Sepolia const publicClientL2 = createPublicClient({ chain: optimismSepolia, - transport: http('https://opt-sepolia.g.alchemy.com/v2/YOUR_ALCHEMY_KEY'), + transport: http('https://rpc.ankr.com/eth_sepolia'), }).extend(publicActionsL2()); // Create L2 wallet client for sending transactions on OP Sepolia const walletClientL2 = createWalletClient({ account, chain: optimismSepolia, - transport: http('https://opt-sepolia.g.alchemy.com/v2/YOUR_ALCHEMY_KEY'), + transport: http('https://rpc.ankr.com/eth_sepolia'), }).extend(walletActionsL2()); async function depositETH(amount) { @@ -321,12 +308,12 @@ You'll deposit a small amount of ETH just to demonstrate the process. console.log('L1 transaction confirmed:', receipt); // Extract the corresponding L2 transaction hash - const [l2Hash] = getL2TransactionHashes(receipt); - console.log(`Corresponding L2 transaction hash: ${l2Hash}`); + const l2Hashes = getL2TransactionHashes(receipt); + console.log(`Corresponding L2 transaction hash: ${l2Hashes}`); // Wait for the L2 transaction to be confirmed const l2Receipt = await publicClientL2.waitForTransactionReceipt({ - hash: l2Hash, + hash: l2Hashes, }); console.log('L2 transaction confirmed:', l2Receipt); @@ -488,14 +475,14 @@ Now you're going to repeat the process in reverse to bridge some ETH from L2 to // Create L2 public client for interacting with OP Sepolia const publicClientL2 = createPublicClient({ chain: optimismSepolia, - transport: http('https://opt-sepolia.g.alchemy.com/v2/YOUR_ALCHEMY_KEY'), + transport: http('https://rpc.ankr.com/eth_sepolia'), }).extend(publicActionsL2()); // Create L2 wallet client for sending transactions on OP Sepolia const walletClientL2 = createWalletClient({ account, chain: optimismSepolia, - transport: http('https://opt-sepolia.g.alchemy.com/v2/YOUR_ALCHEMY_KEY'), + transport: http('https://rpc.ankr.com/eth_sepolia'), }).extend(walletActionsL2()); async function withdrawETH(amount) { From 5606494c85b0956d60eb297ba74343912d9b9868 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Tue, 24 Sep 2024 15:21:14 +0100 Subject: [PATCH 038/565] updated codebase --- .../tutorials/sdk-estimate-costs.mdx | 14 +++++++++++--- public/tutorials/sdk-estimate-costs.js | 10 ++++++++-- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/pages/builders/app-developers/tutorials/sdk-estimate-costs.mdx b/pages/builders/app-developers/tutorials/sdk-estimate-costs.mdx index 614303f54..f93e98172 100644 --- a/pages/builders/app-developers/tutorials/sdk-estimate-costs.mdx +++ b/pages/builders/app-developers/tutorials/sdk-estimate-costs.mdx @@ -145,10 +145,18 @@ Let's set those up now. To create the wallet instance, load your private key, using `privateKeyToAccount`. [`privateKeyToAccount`](https://viem.sh/docs/accounts/local/privateKeyToAccount#privatekeytoaccount) is a viem method used to sign transactions by passing a private key. ```js + if (!process.env.PRIVATE_KEY) { + throw new Error('Error: PRIVATE_KEY is not defined in the environment variables.') + } const account = privateKeyToAccount(process.env.PRIVATE_KEY); ```
+ + To ensure that `process.env.PRIVATE_KEY` is defined before using it. If they are undefined, we add a check to provide a error messages when the environment variable is missing. + + + Set up our Wallet Clients for L2(optimismSepolia) @@ -227,7 +235,7 @@ You're now going to estimate the cost of a transaction on OP Mainnet. This function returns the current cost estimate in wei. ```js - const l1CostEstimate = await publicClient.estimateL1Gas(transaction) + const l1CostEstimate = await publicClient.estimateL1Fee(transaction) console.log(`Estimated L1 data Fee: ${formatEther(l1CostEstimate)}`); ``` @@ -290,8 +298,8 @@ You're now going to estimate the cost of a transaction on OP Mainnet. Estimates will never be entirely accurate, but they should be close! ```js - const difference = totalSum - totalActual - console.log(`The difference - ${formatEther(difference)}`) + const difference = totalEstimate >= totalActual ? totalEstimate - totalActual : totalActual - totalEstimate + console.log(`Estimation Difference: ${formatEther(difference)} ETH`) ```
diff --git a/public/tutorials/sdk-estimate-costs.js b/public/tutorials/sdk-estimate-costs.js index a4fb2509b..784533937 100644 --- a/public/tutorials/sdk-estimate-costs.js +++ b/public/tutorials/sdk-estimate-costs.js @@ -8,6 +8,12 @@ import * as dotenv from 'dotenv' dotenv.config() // Set up the account +if (!process.env.PRIVATE_KEY) { + throw new Error('Error: PRIVATE_KEY is not defined in the environment variables.') + } + if (!process.env.L2_RPC_URL) { + throw new Error('Error: L2_RPC_URL is not defined in the environment variables.') + } const account = privateKeyToAccount(process.env.PRIVATE_KEY) // Set up the public client @@ -45,7 +51,7 @@ async function estimateTransactionCosts() { console.log(`Estimated Execution Gas Fee: ${formatEther(l2CostEstimate)} ETH`) // Estimate L1 data fee - const l1CostEstimate = await publicClient.estimateL1Gas(transaction) + const l1CostEstimate = await publicClient.estimateL1Fee(transaction) console.log(`Estimated L1 Data Fee: ${formatEther(l1CostEstimate)} ETH`) // Calculate total estimated cost @@ -70,7 +76,7 @@ async function estimateTransactionCosts() { console.log(`Actual Total Cost: ${formatEther(totalActual)} ETH`) // Compare estimated vs actual costs - const difference = totalEstimate - totalActual + const difference = totalEstimate >= totalActual ? totalEstimate - totalActual : totalActual - totalEstimate console.log(`Estimation Difference: ${formatEther(difference)} ETH`) } catch (error) { From 70bf529e097c31ab3eb70d0eaa9f755c9b50b507 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Tue, 24 Sep 2024 15:23:32 +0100 Subject: [PATCH 039/565] updated amount --- pages/builders/app-developers/tutorials/sdk-estimate-costs.mdx | 2 +- public/tutorials/sdk-estimate-costs.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pages/builders/app-developers/tutorials/sdk-estimate-costs.mdx b/pages/builders/app-developers/tutorials/sdk-estimate-costs.mdx index f93e98172..54118b7b3 100644 --- a/pages/builders/app-developers/tutorials/sdk-estimate-costs.mdx +++ b/pages/builders/app-developers/tutorials/sdk-estimate-costs.mdx @@ -194,7 +194,7 @@ You're now going to estimate the cost of a transaction on OP Mainnet. const transaction = { account, to: '0x1000000000000000000000000000000000000000', - value: parseEther('0.1'), + value: parseEther('0.005'), gasPrice: parseGwei('20') }; ``` diff --git a/public/tutorials/sdk-estimate-costs.js b/public/tutorials/sdk-estimate-costs.js index 784533937..0f0fbce23 100644 --- a/public/tutorials/sdk-estimate-costs.js +++ b/public/tutorials/sdk-estimate-costs.js @@ -34,7 +34,7 @@ async function estimateTransactionCosts() { const transaction = { account, to: '0x1000000000000000000000000000000000000000', - value: parseEther('0.1'), + value: parseEther('0.005'), gasPrice: parseGwei('20') } From dbf93e8af977cc70fdae06c4870dab63ce76c736 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Tue, 24 Sep 2024 15:31:43 +0100 Subject: [PATCH 040/565] updated full codebase --- public/tutorials/cross-dom-bridge-eth.js | 140 +++++++++++------------ 1 file changed, 66 insertions(+), 74 deletions(-) diff --git a/public/tutorials/cross-dom-bridge-eth.js b/public/tutorials/cross-dom-bridge-eth.js index ba612e28b..619a2b35f 100644 --- a/public/tutorials/cross-dom-bridge-eth.js +++ b/public/tutorials/cross-dom-bridge-eth.js @@ -1,74 +1,66 @@ -(async () => { - -const optimism = require("@eth-optimism/sdk") -const ethers = require("ethers") - -const privateKey = process.env.TUTORIAL_PRIVATE_KEY - -const l1Provider = new ethers.providers.StaticJsonRpcProvider("https://rpc.ankr.com/eth_sepolia") -const l2Provider = new ethers.providers.StaticJsonRpcProvider("https://sepolia.optimism.io") -const l1Wallet = new ethers.Wallet(privateKey, l1Provider) -const l2Wallet = new ethers.Wallet(privateKey, l2Provider) - -console.log('L1 balance:') -console.log((await l1Wallet.getBalance()).toString()) - -const messenger = new optimism.CrossChainMessenger({ - l1ChainId: 11155111, // 11155111 for Sepolia, 1 for Ethereum - l2ChainId: 11155420, // 11155420 for OP Sepolia, 10 for OP Mainnet - l1SignerOrProvider: l1Wallet, - l2SignerOrProvider: l2Wallet, -}) - -console.log('Depositing ETH...') -tx = await messenger.depositETH(ethers.utils.parseEther('0.006942')) -await tx.wait() - -console.log('Waiting for deposit to be relayed...') -await messenger.waitForMessageStatus(tx.hash, optimism.MessageStatus.RELAYED) - -console.log('L1 balance:') -console.log((await l1Wallet.getBalance()).toString()) - -console.log('L2 balance:') -console.log((await l2Wallet.getBalance()).toString()) - -console.log('Withdrawing ETH...') -const withdrawal = await messenger.withdrawETH(ethers.utils.parseEther('0.004269')) -await withdrawal.wait() - -console.log('L2 balance:') -console.log((await l2Wallet.getBalance()).toString()) - -console.log('Waiting for withdrawal to be provable...') -await messenger.waitForMessageStatus(withdrawal.hash, optimism.MessageStatus.READY_TO_PROVE) - -console.log('Proving withdrawal...') -await messenger.proveMessage(withdrawal.hash) - -console.log('Waiting for withdrawal to be relayable...') -await messenger.waitForMessageStatus(withdrawal.hash, optimism.MessageStatus.READY_FOR_RELAY) - -// Wait for the next block to be produced, only necessary for CI because messenger can return -// READY_FOR_RELAY before the RPC we're using is caught up to the latest block. Waiting for an -// additional block ensures that the RPC is caught up and the message can be relayed. Users -// should not need to do this when running the tutorial. -const maxWaitTime = Date.now() + 120000 // 2 minutes in milliseconds -const currentBlock = await l1Provider.getBlockNumber() -while (await l1Provider.getBlockNumber() < currentBlock + 1) { - if (Date.now() > maxWaitTime) { - throw new Error('Timed out waiting for block to be produced') - } - await new Promise(resolve => setTimeout(resolve, 1000)) -} - -console.log('Relaying withdrawal...') -await messenger.finalizeMessage(withdrawal.hash) - -console.log('Waiting for withdrawal to be relayed...') -await messenger.waitForMessageStatus(withdrawal.hash, optimism.MessageStatus.RELAYED) - -console.log('L1 balance:') -console.log((await l1Wallet.getBalance()).toString()) - -})() +import { createPublicClient, http, createWalletClient, parseEther } from 'viem'; +import { sepolia, optimismSepolia } from "viem/chains"; +import { privateKeyToAccount } from 'viem/accounts'; +import { getL2TransactionHashes, publicActionsL2, walletActionsL1, walletActionsL2, getL2TransactionHashes } from 'viem/op-stack'; + +// Replace with your actual private key (Keep this secure!) +const PRIVATE_KEY = '0x....' +const account = privateKeyToAccount(PRIVATE_KEY); + +// Create L1 public client for reading from the Sepolia network +const publicClientL1 = createPublicClient({ + chain: sepolia, + transport: http(), +}); + +// Create L1 wallet client for sending transactions on Sepolia +const walletClientL1 = createWalletClient({ + account, + chain: sepolia, + transport: http(), +}).extend(walletActionsL1()); + +// Create L2 public client for interacting with OP Sepolia +const publicClientL2 = createPublicClient({ + chain: optimismSepolia, + transport: http('https://rpc.ankr.com/eth_sepolia'), +}).extend(publicActionsL2()); + +// Create L2 wallet client for sending transactions on OP Sepolia +const walletClientL2 = createWalletClient({ + account, + chain: optimismSepolia, + transport: http('https://rpc.ankr.com/eth_sepolia'), +}).extend(walletActionsL2()); + +async function depositETH(amount) { +try { + // Build the deposit transaction parameters + const args = await publicClientL2.buildDepositTransaction({ + mint: parseEther(amount), // Convert amount to wei + to: account.address, // Recipient on L2 (same as sender in this case) + }); + + // Execute the deposit transaction on L1 + const hash = await walletClientL1.depositTransaction(args); + console.log(`Deposit transaction hash on L1: ${hash}`); + + // Wait for the L1 transaction to be confirmed + const receipt = await publicClientL1.waitForTransactionReceipt({ hash }); + console.log('L1 transaction confirmed:', receipt); + + // Extract the corresponding L2 transaction hash + const l2Hashes = getL2TransactionHashes(receipt); + console.log(`Corresponding L2 transaction hash: ${l2Hashes}`); + + // Wait for the L2 transaction to be confirmed + const l2Receipt = await publicClientL2.waitForTransactionReceipt({ + hash: l2Hashes, + }); + console.log('L2 transaction confirmed:', l2Receipt); + + console.log('Deposit completed successfully!'); + } catch (error) { + console.error('Error during deposit:', error); + } +} \ No newline at end of file From acc5c8a2048bd2bc9d439f00c9bbe885a03ff613 Mon Sep 17 00:00:00 2001 From: Bradley Camacho <42678939+bradleycamacho@users.noreply.github.com> Date: Tue, 24 Sep 2024 14:24:19 -0700 Subject: [PATCH 041/565] Update cross-chain-messaging image --- .../op-stack/protocol/cross-chain-message.png | Bin 106082 -> 41799 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/public/img/op-stack/protocol/cross-chain-message.png b/public/img/op-stack/protocol/cross-chain-message.png index 11bf3e472a5cfd83d327b5634eee33fbf353ad38..67f7e2999b4eca5b4e2026f0342c5b8dd43c1895 100644 GIT binary patch literal 41799 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

UE4XUJ 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 z�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 Date: Tue, 24 Sep 2024 17:11:18 -0700 Subject: [PATCH 042/565] Make callouts fixed instead of sticky --- styles/global.css | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/styles/global.css b/styles/global.css index 498779c39..04c0aed60 100644 --- a/styles/global.css +++ b/styles/global.css @@ -54,8 +54,7 @@ span.shasum code { } div.custom-callouts { - position: -webkit-sticky; - position: sticky; + position: fixed; top: 65px; padding: 5px; background-color: #fefce8; From 78356117990a3dc9ebcea710e027f83193dbb6c9 Mon Sep 17 00:00:00 2001 From: Bradley Camacho <42678939+bradleycamacho@users.noreply.github.com> Date: Tue, 24 Sep 2024 17:34:41 -0700 Subject: [PATCH 043/565] Change from fixed to static --- styles/global.css | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/styles/global.css b/styles/global.css index 04c0aed60..5927869a4 100644 --- a/styles/global.css +++ b/styles/global.css @@ -54,12 +54,13 @@ span.shasum code { } div.custom-callouts { - position: fixed; - top: 65px; - padding: 5px; + position: static; + top: 45px; + padding-left: 0; + padding-right: 0; + width: 100%; background-color: #fefce8; border: 2px solid #ffdc00; - z-index: 9999; border-radius: 4px; } a.callout-link { From 4b884a3354aa065e945720ebc2c2cc9667c25835 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Wed, 25 Sep 2024 11:15:11 +0100 Subject: [PATCH 044/565] fix coderabbot warnings --- .../tutorials/cross-dom-bridge-eth.mdx | 13 ++----------- public/tutorials/cross-dom-bridge-eth.js | 2 +- 2 files changed, 3 insertions(+), 12 deletions(-) diff --git a/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx b/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx index f62b5b881..fba4d22fa 100644 --- a/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx +++ b/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx @@ -89,7 +89,7 @@ npm install -g pnpm import { createPublicClient, http, createWalletClient, parseEther } from 'viem'; import { sepolia, optimismSepolia } from 'viem/chains'; import { privateKeyToAccount } from 'viem/accounts' -import { getL2TransactionHashes, publicActionsL2, walletActionsL1, getL2TransactionHashes } from 'viem/op-stack' +import { getL2TransactionHashes, publicActionsL2, walletActionsL1 } from 'viem/op-stack' import * as dotenv from 'dotenv'; // Load environment variables dotenv.config(); @@ -164,15 +164,6 @@ Let's set those up now. ## Get ETH on Sepolia -This tutorial explains how to bridge ETH from Sepolia to OP Sepolia. -You will need to get some ETH on Sepolia to follow along. - - - You can use [this faucet](https://sepoliafaucet.com) to get ETH on Sepolia. - - -## Get ETH - You're going to need some ETH on L1 that you can bridge to L2. You can get some Sepolia ETH from [this faucet](https://sepoliafaucet.com). @@ -259,7 +250,7 @@ Now that you have some ETH on L1 you can deposit that ETH into the `L1StandardBr import { createPublicClient, http, createWalletClient, parseEther } from 'viem'; import { sepolia, optimismSepolia } from "viem/chains"; import { privateKeyToAccount } from 'viem/accounts'; - import { getL2TransactionHashes, publicActionsL2, walletActionsL1, walletActionsL2, getL2TransactionHashes } from 'viem/op-stack'; + import { getL2TransactionHashes, publicActionsL2, walletActionsL1, walletActionsL2 } from 'viem/op-stack'; // Replace with your actual private key (Keep this secure!) const PRIVATE_KEY = '0x....' diff --git a/public/tutorials/cross-dom-bridge-eth.js b/public/tutorials/cross-dom-bridge-eth.js index 619a2b35f..ef20f7b46 100644 --- a/public/tutorials/cross-dom-bridge-eth.js +++ b/public/tutorials/cross-dom-bridge-eth.js @@ -1,7 +1,7 @@ import { createPublicClient, http, createWalletClient, parseEther } from 'viem'; import { sepolia, optimismSepolia } from "viem/chains"; import { privateKeyToAccount } from 'viem/accounts'; -import { getL2TransactionHashes, publicActionsL2, walletActionsL1, walletActionsL2, getL2TransactionHashes } from 'viem/op-stack'; +import { getL2TransactionHashes, publicActionsL2, walletActionsL1, walletActionsL2 } from 'viem/op-stack'; // Replace with your actual private key (Keep this secure!) const PRIVATE_KEY = '0x....' From 05d4fe809940c7f0d4d91c99662323f1a7de8768 Mon Sep 17 00:00:00 2001 From: DannyThomx Date: Wed, 25 Sep 2024 13:50:01 +0200 Subject: [PATCH 045/565] added helper functions --- components/calculator/ChainParametersForm.tsx | 202 ++++ .../calculator/Inputs/CheckboxInput.tsx | 31 + components/calculator/Inputs/SelectInput.tsx | 46 + components/calculator/Inputs/TextInput.tsx | 50 + components/calculator/Inputs/index.ts | 5 + components/calculator/ResultsTable.tsx | 92 ++ pages/builders/tools/_meta.json | 3 +- pages/builders/tools/fee-calculator.mdx | 11 + pages/builders/tools/overview.mdx | 3 + pages/index.mdx | 4 + styles/calculator.css | 1 + utils/calculator-helpers.ts | 985 ++++++++++++++++++ utils/transaction-types.ts | 50 + 13 files changed, 1482 insertions(+), 1 deletion(-) create mode 100644 components/calculator/ChainParametersForm.tsx create mode 100644 components/calculator/Inputs/CheckboxInput.tsx create mode 100644 components/calculator/Inputs/SelectInput.tsx create mode 100644 components/calculator/Inputs/TextInput.tsx create mode 100644 components/calculator/Inputs/index.ts create mode 100644 components/calculator/ResultsTable.tsx create mode 100644 pages/builders/tools/fee-calculator.mdx create mode 100644 styles/calculator.css create mode 100644 utils/calculator-helpers.ts create mode 100644 utils/transaction-types.ts diff --git a/components/calculator/ChainParametersForm.tsx b/components/calculator/ChainParametersForm.tsx new file mode 100644 index 000000000..9af91c846 --- /dev/null +++ b/components/calculator/ChainParametersForm.tsx @@ -0,0 +1,202 @@ +import type { ReactElement } from "react"; +import { useState } from "react"; +import { TextInput, SelectInput, CheckboxInput } from "./Inputs"; +import { ResultsTable } from "./ResultsTable"; +import { + calculateImpliedStateProposalsPerDay, + getAvgEstimatedSizePerTx, + displayL1BlobBaseFeeScalar, +} from "@/utils/calculator-helpers"; +type ComparableTransactionType = "Base" | "Zora" | "Mint" | "Mode"; +type DataAvailabilityType = "Ethereum" | "AltDA Plasma Mode"; + + +export function ChainParametersForm(): ReactElement { + const [transactionsPerDay, setTransactionsPerDay] = useState(500000); + const [comparableTransactionType, setComparableTransactionType] = + useState("General OP Mainnet"); + const [dataAvailabilityType, setDataAvailabilityType] = useState("Ethereum"); + const [isFaultProofEnabled, setIsFaultProofEnabled] = useState("yes"); + const [targetDataFeeMargin, setTargetDataFeeMargin] = useState(5); + const [maxBlobsPerL1Transaction, setMaxBlobsPerL1Transaction] = useState(5); + const [maxChannelDuration, setMaxChannelDuration] = useState(5); + const [outputRootPostFrequency, setOutputRootPostFrequency] = useState(1 ); + const [isIncludeOutputRootCosts, setIsIncludeOutputRootCosts] = useState("yes"); + const [isAdvancedInputs, setIsAdvancedInputs] = useState(false); + + const comparableTransactionTypeOptions = [ + "General OP Mainnet", + "Base", + "Zora", + "Mint", + "Mode", + ]; + const dataAvailabilityTypeOptions = ["Ethereum", "AltDA Plasma Mode"]; + const booleanOptions = ["Yes", "No"]; + + const handleCalculateFee = async () => { + // const result = await displayL1BaseFeeScalar( + // stringToBoolean(isIncludeOutputRootCosts), + // stringToBoolean(isFaultProofEnabled), + // outputRootPostFrequency, + // transactionsPerDay, + // maxChannelDuration, + // comparableTransactionType, + // dataAvailabilityType, + // targetDataFeeMargin + // ); + }; + + const handleSubmit = async (e: any) => { + e.preventDefault(); + const result = await displayL1BlobBaseFeeScalar( + stringToBoolean(isIncludeOutputRootCosts), + stringToBoolean(isFaultProofEnabled), + outputRootPostFrequency, + transactionsPerDay, + maxChannelDuration, + comparableTransactionType, + dataAvailabilityType, + targetDataFeeMargin + ); + + // const result2 = calculateTotalAltDAPlasmaModeCommitmentL1Gas( + // transactionsPerDay, + // maxChannelDuration, + // comparableTransactionType + // ); + // const result4 = calculateImpliedStateProposalsPerDay(outputRootPostFrequency); + + // const result5 = calculateImpliedDataGasFeePerTxUsingL1Calldata( + // isIncludeOutputRootCosts, + // isFaultProofEnabled, + // outputRootPostFrequency, + // transactionsPerDay, + // maxChannelDuration, + // comparableTransactionType, + // dataAvailabilityType, + // targetDataFeeMargin + // ); + + // const xyz = calculateL1BaseFeeScalarUsingBlobs( + // isIncludeOutputRootCosts, + // isFaultProofEnabled, + // outputRootPostFrequency, + // transactionsPerDay, + // maxChannelDuration, + // comparableTransactionType, + // targetDataFeeMargin + // ) + + // const result5 = getL1GasBaseFee(); + // console.log("RESULT2:::", result2); + console.log("RESULT5:::e37", result); + // console.log("xyz:::", xyz); + }; + + const handleToggle = (val: any) => { + setIsAdvancedInputs(val); + }; + + // console.log("WHEW::", transactionsPerDay) + // console.log("JEDDB::", comparableTransactionType); + // console.log("XXAAB::", dataAvailabilityType); + // console.log("FFFAULTPRFF::", isFaultProofEnabled); + // console.log("OUTROOCOST::", isIncludeOutputRootCosts); + + const stringToBoolean = (value: string): boolean => { + return value === "yes" ? true : false + } + + + return ( +
+
+ + + + + + + + + +
+
+

+ Advanced Inputs +

+ +
+
+ {isAdvancedInputs && ( +
+

Advanced Inputs

+ + + + + +
+ )} + + + + +
+ ); +} diff --git a/components/calculator/Inputs/CheckboxInput.tsx b/components/calculator/Inputs/CheckboxInput.tsx new file mode 100644 index 000000000..3e63f5ac6 --- /dev/null +++ b/components/calculator/Inputs/CheckboxInput.tsx @@ -0,0 +1,31 @@ +import React from "react"; + +type Props = { + otherProps?: any; + className?: string; + label?: string; + description?:string; + handleToggle: (e: any) => void; +}; + +export const CheckboxInput: React.FC = React.memo( + ({ otherProps, label, description, className, handleToggle }) => { + function onCheckboxChange(e: any) { + const isChecked = e.target.checked; + handleToggle(isChecked); + } + return ( +
+ {label && } +

{description}

+ +
+ ); + } +); +CheckboxInput.displayName = "CheckboxInput"; diff --git a/components/calculator/Inputs/SelectInput.tsx b/components/calculator/Inputs/SelectInput.tsx new file mode 100644 index 000000000..95718d866 --- /dev/null +++ b/components/calculator/Inputs/SelectInput.tsx @@ -0,0 +1,46 @@ +import React from "react"; + +type Props = { + className?: string; + label?: string; + data: any[]; + otherProps?: any; + description?: string; + onSelect?: (e: any) => void; +}; + +export const SelectInput: React.FC = React.memo( + ({ className, description, otherProps, label, data, onSelect }) => { + const handleSelect = (e: any) => { + const value = e.target.value + onSelect(value) + } + return ( +
+ {label && ( + + )} +

{description}

+
+ + {/* */} +
+
+ ); + } +); +SelectInput.displayName = "SelectInput"; diff --git a/components/calculator/Inputs/TextInput.tsx b/components/calculator/Inputs/TextInput.tsx new file mode 100644 index 000000000..2900094f5 --- /dev/null +++ b/components/calculator/Inputs/TextInput.tsx @@ -0,0 +1,50 @@ +import React from "react"; + +type Props = { + placeholder?: string; + className?: string; + type: "text" | "email" | "password" | "number"; + label?: string; + labelClass?: string; + otherProps?: any; + description?: string; + error?: string; + isDisabled?: boolean; + onInputChange?: (e: any) => void; +}; + +export const TextInput = ({ + label, + placeholder, + className, + type, + otherProps, + isDisabled, + description, + labelClass, + onInputChange, +}: Props) => { + const handleInputChange = (e: any) => { + const val = e.target.value; + onInputChange(val); + }; + return ( +
+ {label && ( + + )} +

{description}

+ + +
+ ); +}; diff --git a/components/calculator/Inputs/index.ts b/components/calculator/Inputs/index.ts new file mode 100644 index 000000000..1447fe40e --- /dev/null +++ b/components/calculator/Inputs/index.ts @@ -0,0 +1,5 @@ +"use client"; + +export * from "./TextInput"; +export * from "./SelectInput"; +export * from "./CheckboxInput"; diff --git a/components/calculator/ResultsTable.tsx b/components/calculator/ResultsTable.tsx new file mode 100644 index 000000000..b406d6865 --- /dev/null +++ b/components/calculator/ResultsTable.tsx @@ -0,0 +1,92 @@ +import type { ReactElement } from "react"; +// import { useState } from "react"; +// import { TextInput, SelectInput, CheckboxInput } from "./Inputs"; + +export function ResultsTable(): ReactElement { + + return ( +
+
+

+ This construction is expected to have +0.006 ETH Margin on Data Costs + (5% Margin) at inputted L1 Gas Prices{" "} +

+

Implied Data Gas Fee per User Transaction: $0.0006

+
+
+

Results:

+ +
+

Fee Scalar Recommendations - Values to Set as Chain Inputs

+

+ Recommended fee scalar configurations to achieve your target Data + Margin, given the transaction type and volume are shown below{" "} +

+

+ Note: This is an estimation, see the Optimism Docs for steps on + modifying parameters if needed once the chain is on mainnet{" "} +

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
+ DA Recommendation: + + Blobs (EIP-4844) +
+ Scalar Type + + Chain Input + + Decimal-Adjusted (6 decimals) +
+ l1BlobBaseBaseScalar + + 810831 + + 0.810831 +
+ l1BaseFeeScalar + + 4244 + + 0.004244 +
+
+

+ Using Blobs (EIP-4844), posting transaction data will be 99.7% + cheaper than using L1 Calldata{" "} +

+
+
+

Fees Scalars Assume: 100% Blob Fullness and 5 Blobs per L1 Tx (Avg), Target a 5% Margin on DA and State, 5 hour Max Submission Window.

+

Implied Data Gas Fee Assumes: 0 gwei Blobgas Base Fee, 7.2 gwei L1 Base Fee, 2370 ETH/USD

+
+
+
+
+ ); +} diff --git a/pages/builders/tools/_meta.json b/pages/builders/tools/_meta.json index d89d5d509..670f6209a 100644 --- a/pages/builders/tools/_meta.json +++ b/pages/builders/tools/_meta.json @@ -3,5 +3,6 @@ "connect": "Connecting", "build": "Building", "monitor": "Monitoring", - "op-tools": "OP Tools" + "op-tools": "OP Tools", + "fee-calculator": "Fee Calculator" } diff --git a/pages/builders/tools/fee-calculator.mdx b/pages/builders/tools/fee-calculator.mdx new file mode 100644 index 000000000..4f363a4f5 --- /dev/null +++ b/pages/builders/tools/fee-calculator.mdx @@ -0,0 +1,11 @@ +--- +title: Fee Parameter Calculator +lang: en-US +--- + +import { ChainParametersForm } from '@/components/calculator/ChainParametersForm' + + +# Fee Parameter Calculator + + diff --git a/pages/builders/tools/overview.mdx b/pages/builders/tools/overview.mdx index cb146b2fa..e315426b6 100644 --- a/pages/builders/tools/overview.mdx +++ b/pages/builders/tools/overview.mdx @@ -57,4 +57,7 @@ If you are already familiar with [building on OP Mainnet](/chain/getting-started } /> } /> + + } /> + diff --git a/pages/index.mdx b/pages/index.mdx index 6c276002e..473db93e2 100644 --- a/pages/index.mdx +++ b/pages/index.mdx @@ -25,6 +25,7 @@ Whether you're a developer building a app on OP Mainnet, a node operator running } /> } /> + ## Featured Tools @@ -39,6 +40,9 @@ Check out these amazing tools, so you can get building with Optimism. } /> } /> + + } /> + ## Learn About Optimism diff --git a/styles/calculator.css b/styles/calculator.css new file mode 100644 index 000000000..5adf06d22 --- /dev/null +++ b/styles/calculator.css @@ -0,0 +1 @@ +/* Fee Parameter Calculator */ diff --git a/utils/calculator-helpers.ts b/utils/calculator-helpers.ts new file mode 100644 index 000000000..c4f348769 --- /dev/null +++ b/utils/calculator-helpers.ts @@ -0,0 +1,985 @@ +import { transactionTypes } from "./transaction-types"; + +const L1GasBaseFee = + "https://static.optimism.io/op-analytics/reference_data/market_data/outputs/suggest_base_fee.txt"; // E76 +const ethToUsdRate = + "https://static.optimism.io/op-analytics/reference_data/market_data/outputs/ethusd.txt"; // E77 +const blobBaseFee = + "https://static.optimism.io/op-analytics/reference_data/market_data/outputs/blob_base_fee.txt"; // E78 + +function calculateConstructionState( + stateOutputRootCostPerDay: number, // E58: number, + totalOutputRootCost: number, // E56: number, + totalExpectedMargin: number // E118: number +): string { + if (stateOutputRootCostPerDay < 0) { + return `This construction has ${ + Math.round(stateOutputRootCostPerDay * -1 * 1000) / 1000 + } ETH / day of estimated State Output root costs, not covered by Data Margin (${ + Math.round(totalOutputRootCost * 1000) / 1000 + } ETH Total Output Root Cost / Day) at inputted Blob/L1 Gas Prices`; + } else { + return `This construction is expected to have +${ + Math.round(stateOutputRootCostPerDay * 1000) / 1000 + } ETH Margin on Data Costs (${ + Math.round(100 * (stateOutputRootCostPerDay / totalExpectedMargin) * 10) / + 10 + }% Margin) at inputted L1 Gas Prices`; + } +} // output = C27 + +function calculateImpliedDataGasFee( + dataAvailabilityType: string, // E16: string + altDAPlasmaModeFee: number, // E66: number + blobDataFee: number, // E64: number + l1CalldataFee: number // E67: number +): string { + const fee = + dataAvailabilityType === "AltDA Plasma Mode" + ? altDAPlasmaModeFee + : blobDataFee > l1CalldataFee + ? blobDataFee + : l1CalldataFee; + return `Implied Data Gas Fee per User Transaction: $${ + Math.round(fee * 10000) / 10000 + }`; +} // output = C28 + +function determineTransactionType( + dataAvailabilityType: string, // E16: string, + impliedDataGasFeePerTxUsingBlobs: number, // E64: number, + impliedDataGasFeePerTxUsingL1Calldata: number // E67: number +): string { + if (dataAvailabilityType === "AltDA Plasma Mode") { + return "AltDA Plasma Mode"; + } else { + return impliedDataGasFeePerTxUsingBlobs > + impliedDataGasFeePerTxUsingL1Calldata + ? "L1 Calldata" + : "EIP-4844"; + } +} // output = F35 + +function calculateBlobTransactionCost( + dataAvailabilityType: string, // E16: string + altDATransactionCost: number, // E98: number + blobDataFee: number, // E64: number + l1CalldataFee: number, // E67: number + l1CalldataCost: number, // E96: number + blobCost: number // E94: number +): number { + return dataAvailabilityType === "AltDA Plasma Mode" + ? altDATransactionCost + : blobDataFee > l1CalldataFee + ? l1CalldataCost + : blobCost; +} // output = E37 + +function summarizeFeeScalars( + dataAvailabilityType: string, // E16: string + blobFullnessPercentage: number, // N25: number + blobsPerL1Transaction: number, // N26: number + targetDataMargin: number, // E18: number + isStateEnabled: string, // E24: string + maxChannelDuration: number // E22: number +): string { + const mode = + dataAvailabilityType === "AltDA Plasma Mode" + ? "AltDA Plasma Mode, " + : `${Math.round(blobFullnessPercentage * 100)}% Blob Fullness and ${ + Math.round(blobsPerL1Transaction * 10) / 10 + } Blobs per L1 Tx (Avg), `; + const state = isStateEnabled === "Yes" ? " & State" : ""; + return `Fee Scalars Assume: ${mode}Target a ${Math.round( + targetDataMargin * 100 + )}% Margin on DA${state}, ${ + Math.round(maxChannelDuration * 100000) / 100000 + } hour Max Submission Window.`; +} // output = G41 + +function calculateAltDAOrL1TransactionCost( + dataAvailabilityType: string, //E16 + altDAPlasmaModeCost: number, // F98 + blobDataFee: number, // E64 + l1CalldataFee: number, // E67 + l1CalldataAltCost: number, // F96 + blobAltCost: number // F94 +): number { + if (dataAvailabilityType === "AltDA Plasma Mode") { + return altDAPlasmaModeCost; + } else { + return blobDataFee > l1CalldataFee ? l1CalldataAltCost : blobAltCost; + } +} // output = E38 + +function resultsRowOneScalars( + dataAvailabilityType: string, // E16 + blobFullnessPercentage: number, // Advanced Inputs - N25 + blobsPerL1Transaction: number, // Advanced Inputs - N26 + targetDataMargin: number, // E18 + isStateEnabled: string, // E24 + maxChannelDuration: number // E22 +): string { + const mode = + dataAvailabilityType === "AltDA Plasma Mode" + ? "AltDA Plasma Mode, " + : `${Math.round(blobFullnessPercentage * 100)}% Blob Fullness and ${ + Math.round(blobsPerL1Transaction * 10) / 10 + } Blobs per L1 Tx (Avg), `; + const state = isStateEnabled === "Yes" ? " & State" : ""; + return `Fee Scalars Assume: ${mode}Target a ${Math.round( + targetDataMargin * 100 + )}% Margin on DA${state}, ${ + Math.round(maxChannelDuration * 100000) / 100000 + } hour Max Submission Window.`; +} // output = G41 + +function impliedDataGasFee( + dataAvailabilityType: string, // E16 + blobgasBaseFee: number, // E78 + l1BaseFee: number, // E76 + ethToUsdRate: number // E77 +): string { + const mode = + dataAvailabilityType === "AltDA Plasma Mode" + ? "AltDA Plasma Mode, " + : `${Math.round(blobgasBaseFee * 100) / 100} gwei Blobgas Base Fee, `; + return `Implied Data Gas Fee Assumes: ${mode}${ + Math.round(l1BaseFee * 10) / 10 + } gwei L1 Base Fee, ${Math.round(ethToUsdRate)} ETH/USD`; +} // output = G42 + +function convertToMillionUnits(value: number): number { + return value / 1000000; +} + +export async function getEthToUsdRate(): Promise { + const response = await fetch(ethToUsdRate); + const rate = await response.text(); + return parseFloat(rate); +} + +// transactionsPerDay === E14: number +// comparableTxnType === E15: string +// dataAvailabilityType === E16: string +// isFaultProofsEnabled === E17: boolean +// targetDataMargin === E18: number +// maxChannelDuration === E22: number +// outputRootPostFrequency === E23: number +// isStateEnabled: string, === E24: string + +/** + * Advanced Input - + * + * C8 | AvgEstimatedSizePerTx + * check which comparableTxnType user selects + * get AvgEstimatedSizePerTx for choice from constants or api + * return AvgEstimatedSizePerTx value for C8 + * + * C10 | impliedCTSL1Data = + * (impliedBlobsPerDay * Total_Blobgas_Per_Blob) / (AvgEstimatedSizePerTx * transactionsPerDay[aka E14]) + * + * C11 | impliedCTSL1Gas + * (AvgEstimatedSizePerTx * transactionsPerDay * estimatedSize_CalldataGasRatio + (Avg_Compressed_Overhead_Gas_Per_Blob * impliedL1Txs)) / (AvgEstimatedSizePerTx * transactionsPerDay) + * + * C12 algorithm | estimatedSizeBlobgasRatio + * check which comparableTxnType user selects + * get estimatedSizeBlobgasRatio for choice from constants or api + * return estimatedSizeBlobgasRatio value for C12 + * + * + * C13 | estimatedSize_CalldataGasRatio + * =INDEX($A$20:$G$32,MATCH('Chain Estimator'!$E$15,$A$20:$A$32,0),MATCH($B13,$A$20:$G$20,0)) + * check which comparableTxnType user selects + * get estimatedSize_CalldataGasRatio for choice from constants or api + * return estimatedSize_CalldataGasRatio value for C13 + * + * + * N19 | impliedMinimumBlobsPerDay = + * 24/ maxChannelDuration + * + * + * N20 | impliedEstimatedSizePerBlob = + * (N5 - N10 - N6) * estimatedSizeBlobgasRatio + * + * + * N21 | impliedL2TxsPerBlob = + * min((impliedEstimatedSizePerBlob / AvgEstimatedSizePerTx), (transactionsPerDay / (24 / maxChannelDuration))) + * + * N22 | impliedBlobsPerDay + * transactionsPerDay / impliedL2TxsPerBlob + * + * N23 | impliedCalldataGasUsedIfL1 + * impliedEstimatedSizePerBlob * impliedBlobsPerDay * (C11 / 16) + (N11 * N22) + * + * N24 | L1TxLevelImpliedBlobFullness + * MIN(N9,(C8*'Chain Estimator'!E14)*('Chain Estimator'!E22/24)/N20) + * + * N25 | blobLevelImpliedBlobFullness + * (impliedL2TxsPerBlob * AvgEstimatedSizePerTx) / impliedEstimatedSizePerBlob + * + * N26 | impliedBlobsPerL1Tx + * ROUND(MAX(N24/1,1),0) + * round(max(L1TxLevelImpliedBlobFullness/1, 1), 0) + * + * N27 | impliedL1Txs + * impliedBlobsPerDay / impliedBlobsPerL1Tx + * + * N30 | totalBlobCommitmentL1Gas + * impliedL1Txs * L1_Gas_per_Blob_Commitment + * + * N31 | totalAltDAPlasmaModeCommitmentL1Gas + * impliedBlobsPerDay * L1_Gas_Per_AltDA_Plasma_Mode_Commitment + * + * N33 | impliedStateProposalsPerDay + * (outputRootPostFrequency === 0 ? 0 : 24) / outputRootPostFrequency + * + * N34 | totalStateProposalL1Gas + * impliedStateProposalsPerDay * (isFaultProofsEnabled ? Avg_Total_Gas_Used_Per_L1_Fault_Proof_State_Proposal : Avg_Total_Gas_Used_Per_L1_State_Proposal) + * + * N35 | totalStateProposalL1GasCoveredByUsers + * isStateEnabled ? 1 : 0 * totalStateProposalL1Gas + * + * + * E64 | impliedDataGasFeePerTx:::: Using Blobs (EIP-4844) + * =('Advanced Inputs'!C8*(16*F94*E76+E94*E78)/1000000/1000000000)*E77 + * ((AvgEstimatedSizePerTx * (16 * L1BaseFeeScalar * L1GasBaseFee * L1BlobBaseFeeScalar * blobBaseFee) / 1000000) / 1000000000) * ethToUsdRate + * + * E67 | impliedDataGasFeePerTx:::: Using L1calldata + * =('Advanced Inputs'!C8*(16*F96*E76+E96*E78)/1000000/1000000000)*E77 + * ((AvgEstimatedSizePerTx * (16 * L1BaseFeeScalar[L1Calldata] * L1GasBaseFee * L1BlobBaseFeeScalar[L1Calldata] * blobBaseFee) / 1000000) / 1000000000) * ethToUsdRate + * + * + * E94 | L1BlobBaseFeeScalar::: Using Blobs (EIP-4844) + * if blobs ? ROUND((('Advanced Inputs'!C10/'Advanced Inputs'!N25/(1-E18))*1000000),0) : 0 + * const res = (impliedCTSL1Data / blobLevelImpliedBlobFullness) / (1-targetDataMargin) + * Math.round(res * 1000000) + * + * E96 | L1BlobBaseFeeScalar:::: Using L1Calldata = 0 + * + * E98 | L1BlobBaseFeeScalar ::: Using AltDA Plasma Mode = 0 + * check if AltDA mode = 0 + * + * E76 | L1GasBaseFee + * + * F94 | L1BaseFeeScalar + * =ROUND(((('Advanced Inputs'!N30+'Advanced Inputs'!N35)/(E14*(16*'Advanced Inputs'!C8)))/(1-E18))*1000000,0) + * const res = (totalBlobCommitmentL1Gas + totalStateProposalL1GasCoveredByUsers)/ transactionsPerDay * (16 * AvgEstimatedSizePerTx) / (1 - targetDataMargin) + * Math.round(res * 1000000) + * + * F96 | L1BaseFeeScalar:::: Using L1Calldata + * =ROUND(((('Advanced Inputs'!C11/16)/(1-E18))*1000000),0) + * Math.round(((impliedCTSL1Gas / 16) / (1-targetDataMargin))* 1000000) + */ + +///////////////// CUSTOM HELPERS //////////////////////////// +const _determineDAInUse = (dataAvailabilityType: string): string => { + return dataAvailabilityType === "AltDA Plasma Mode" + ? "AltDA Plasma Mode" + : dataAvailabilityType === "L1 Calldata" + ? "L1 Calldata" + : "EIP-4844"; +}; + + +// =INDEX($A$20:$G$32,MATCH('Chain Estimator'!$E$15,$A$20:$A$32,0),MATCH($B8,$A$20:$G$20,0)) +export const getAvgEstimatedSizePerTx = (comparableTxnType: string) => { + const output = transactionTypes[comparableTxnType].AvgEstimatedSizePerTx; + console.log("c8::", output); + return output; +}; // c8 done + +// =(N22*N5)/(C8*'Chain Estimator'!E14) +export const calculateImpliedCTSL1Data = ( + transactionsPerDay: number, + maxChannelDuration: number, + comparableTxnType: string +) => { + const n22 = calculateImpliedBlobsPerDay( + transactionsPerDay, + maxChannelDuration, + comparableTxnType + ); + const c8 = getAvgEstimatedSizePerTx(comparableTxnType); + const n5 = Total_Blobgas_Per_Blob; + const output = (n22 * n5) / (c8 * transactionsPerDay); ; + console.log("c10::", output); + return output; +}; // c10 done + +// =(C8*'Chain Estimator'!E14*C13 + N11*N27)/(C8*'Chain Estimator'!E14) +export const calculateImpliedCTSL1Gas = ( + transactionsPerDay: number, + maxChannelDuration: number, + comparableTxnType: string +) => { + const c8 = getAvgEstimatedSizePerTx(comparableTxnType); + const c13 = getEstimatedSizeCalldataGasRatio(comparableTxnType); + const n27 = calculateImpliedL1Txs( + transactionsPerDay, + maxChannelDuration, + comparableTxnType + ); + const numerator = + c8 * transactionsPerDay * c13 + Avg_Compressed_Overhead_Gas_Per_Blob * n27; + const denominator = c8 * transactionsPerDay; + const output = numerator / denominator; + console.log("c11::", output); + return output; +}; // c11 done + +// =INDEX($A$20:$G$32,MATCH('Chain Estimator'!$E$15,$A$20:$A$32,0),MATCH($B12,$A$20:$G$20,0)) +export const getEstimatedSizeBlobgasRatio = (comparableTxnType: string) => { + const output = transactionTypes[comparableTxnType].EstimatedSizeBlobgasRatio; + console.log("c12::", output); + return output; +}; // c12 done + +export const getEstimatedSizeCalldataGasRatio = (comparableTxnType: string) => { + const output = + transactionTypes[comparableTxnType].EstimatedSizeCalldataGasRatio; + console.log("c13::", output); + return output; +}; // c13 done + +// =24/'Chain Estimator'!E22 +const calculateImpliedMinimumBlobsPerDay = ( + maxChannelDuration: number +) => { + const output = 24 / maxChannelDuration; + console.log("n19::", output); + return output; +}; // n19 + +// =(N5-N10-N6)*C12 +export const calculateImpliedEstimatedSizePerBlob = ( + comparableTxnType: string +): number => { + const c12 = getEstimatedSizeBlobgasRatio(comparableTxnType); + const output = + (Total_Blobgas_Per_Blob - + Avg_Compressed_Overhead_Bytes_Per_Blob - + Overhead_Blobgas_per_Blob) * + c12; + console.log("n20::", output); + return output; +}; // n20 done + +// =MIN(N20/C8,'Chain Estimator'!E14/(24/'Chain Estimator'!E22)) +export const calculateImpliedL2TxsPerBlob = ( + comparableTxnType: string, + transactionsPerDay: number, + maxChannelDuration: number +) => { + const n20 = calculateImpliedEstimatedSizePerBlob(comparableTxnType); + const c8 = getAvgEstimatedSizePerTx(comparableTxnType); + const value1 = n20 / c8; + const value2 = transactionsPerDay / (24 / maxChannelDuration); + const output = Math.min(value1, value2); + console.log("n21::", output); + return output; +}; // n21 done + +// ='Chain Estimator'!E14/N21 +export const calculateImpliedBlobsPerDay = ( + transactionsPerDay: number, + maxChannelDuration: number, + comparableTxnType: string +) => { + const output = + transactionsPerDay / + calculateImpliedL2TxsPerBlob( + comparableTxnType, + transactionsPerDay, + maxChannelDuration + ); + console.log("n22::", output); + return output; +}; // n22 done + +// =N20*N22*(C11/16)+(N11*N22) +export const calculateImpliedCalldataGasUsedIfL1 = ( + comparableTxnType: string, + transactionsPerDay: number, + maxChannelDuration: number +) => { + const n20 = calculateImpliedEstimatedSizePerBlob(comparableTxnType); + const n22 = calculateImpliedBlobsPerDay( + transactionsPerDay, + maxChannelDuration, + comparableTxnType + ); + const c11 = calculateImpliedCTSL1Gas( + transactionsPerDay, + maxChannelDuration, + comparableTxnType + ); + const output = + n20 * n22 * (c11 / 16) + (Avg_Compressed_Overhead_Gas_Per_Blob * n22); + console.log("n23::", output); + return output; +}; // n23 done + +// =MIN(N9,(C8*'Chain Estimator'!E14)*('Chain Estimator'!E22/24)/N20) +export const calculateL1TxLevelImpliedBlobFullness = ( + comparableTxnType: string, + transactionsPerDay: number, + maxChannelDuration: number +) => { + const c8 = getEstimatedSizeCalldataGasRatio(comparableTxnType); + const n20 = calculateImpliedEstimatedSizePerBlob(comparableTxnType); + const result = (c8 * transactionsPerDay * (maxChannelDuration / 24)) / n20; + const output = Math.min(Max_No_Of_Blobs_Per_L1_Transaction, result); + console.log("n24::", output); + return output; +}; // n24 done + +// =(N21*C8)/N20 +export const calculateBlobLevelImpliedBlobFullness = ( + comparableTxnType: string, + transactionsPerDay: number, + maxChannelDuration: number +) => { + const n21 = calculateImpliedL2TxsPerBlob( + comparableTxnType, + transactionsPerDay, + maxChannelDuration + ); + const c8 = getAvgEstimatedSizePerTx(comparableTxnType); + const n20 = calculateImpliedEstimatedSizePerBlob(comparableTxnType); + const output = (n21 * c8) / n20; + console.log("n25::", output); + return output; +}; // n25 done + +// =ROUND(MAX(N24/1,1),0) +export const calculateImpliedBlobsPerL1Tx = ( + comparableTxnType: string, + transactionsPerDay: number, + maxChannelDuration: number +) => { + const n24 = calculateL1TxLevelImpliedBlobFullness( + comparableTxnType, + transactionsPerDay, + maxChannelDuration + ); + const maxValue = Math.max(n24, 1); + const output = Math.round(maxValue); + console.log("n26::", output); + return output; +}; // n26 done + +// =N22/N26 +export const calculateImpliedL1Txs = ( + transactionsPerDay: number, + maxChannelDuration: number, + comparableTxnType: string +) => { + const n22 = calculateImpliedBlobsPerDay( + transactionsPerDay, + maxChannelDuration, + comparableTxnType + ); + const n26 = calculateImpliedBlobsPerL1Tx( + comparableTxnType, + transactionsPerDay, + maxChannelDuration + ); + const output = n22 / n26; + console.log("n27::", output); + return output; +}; // n27 done + +// =N27*N7 +export const calculateTotalBlobCommitmentL1Gas = ( + transactionsPerDay: number, + maxChannelDuration: number, + comparableTxnType: string +) => { + const n27 = calculateImpliedL1Txs( + transactionsPerDay, + maxChannelDuration, + comparableTxnType + ); + const output = n27 * L1_Gas_per_Blob_Commitment; + console.log("n30::", output); + return output; +}; // n30 done + +// =N22*N8 +export const calculateTotalAltDAPlasmaModeCommitmentL1Gas = ( + transactionsPerDay: number, + maxChannelDuration: number, + comparableTxnType: string +) => { + const n22 = calculateImpliedBlobsPerDay( + transactionsPerDay, + maxChannelDuration, + comparableTxnType + ); + const output = n22 * L1_Gas_Per_AltDA_Plasma_Mode_Commitment; + console.log("n31::", output); + return output; +}; // n31 done + +// =IF('Chain Estimator'!E23=0,0,24/'Chain Estimator'!E23) +export const calculateImpliedStateProposalsPerDay = ( + outputRootPostFrequency: number +) => { + const output = + outputRootPostFrequency === 0 ? 0 : 24 / outputRootPostFrequency; + console.log("n33::", output); + return output; +}; // n33 done + +// =N33*IF('Chain Estimator'!E17="Yes",N16,N12) +export const calculateTotalStateProposalL1Gas = ( + outputRootPostFrequency: number, + isFaultProofsEnabled: boolean +): number => { + const n33 = calculateImpliedStateProposalsPerDay(outputRootPostFrequency); + const output = + n33 * + (isFaultProofsEnabled + ? Avg_Total_Gas_Used_Per_L1_Fault_Proof_State_Proposal + : Avg_Total_Gas_Used_Per_L1_State_Proposal); + console.log("n34::", output); + return output; +}; // n34 done + +// =IF('Chain Estimator'!E24="Yes",1,0)*N34 +export const calculateTotalStateProposalL1GasCoveredByUsers = ( + isStateEnabled: boolean, + outputRootPostFrequency: number, + isFaultProofsEnabled: boolean +) => { + const n34 = calculateTotalStateProposalL1Gas( + outputRootPostFrequency, + isFaultProofsEnabled + ); + const output = (isStateEnabled ? 1 : 0) * n34; + console.log("n35::", output); + return output; +}; // n35 done + +const _calculateL1BlobBaseFeeScalar = ( + determinedDAInUse: string, + transactionsPerDay: number, + maxChannelDuration: number, + comparableTxnType: string, + targetDataMargin: number +) => { + let output = 0; + const c10 = calculateImpliedCTSL1Data( + transactionsPerDay, + maxChannelDuration, + comparableTxnType + ); + const n25 = calculateBlobLevelImpliedBlobFullness( + comparableTxnType, + transactionsPerDay, + maxChannelDuration + ); + const e18 = _targetDataMarginInPercentage(targetDataMargin); + if (determinedDAInUse === "EIP-4844") { + output = (c10 / n25 / (1 - e18)) * 1000000; + } + + console.log("_calculateL1BlobBaseFeeScalar:::", output); + return Math.round(output); +}; + +export async function getL1GasBaseFee(): Promise { + const response = await fetch(L1GasBaseFee); + const baseFee = await response.text(); + console.log("L1GasBaseFee_response::",baseFee); + const output = parseFloat(baseFee); + console.log("e76:::", output); + return output; +} // e76 done + +export const getBlobBaseFee = async (): Promise => { + const response = await fetch(blobBaseFee); + const fee = await response.text(); + console.log("BlobBaseFee_response::", fee); + const output = parseFloat(fee); + console.log("e78:::", output); + return output; +}; // e78 done + +// =ROUND((('Advanced Inputs'!C10/'Advanced Inputs'!N25/(1-E18))*1000000),0) +export const calculateL1BlobBaseFeeScalarUsingBlob = ( + determinedDAInUse: string, + transactionsPerDay: number, + maxChannelDuration: number, + comparableTxnType: string, + targetDataMargin: number +) => { + const output = _calculateL1BlobBaseFeeScalar( + determinedDAInUse, + transactionsPerDay, + maxChannelDuration, + comparableTxnType, + targetDataMargin + ); + console.log("e94:::", output); + return output; +}; // e94 done + +export const calculateL1BlobBaseFeeScalarUsingL1Calldata = ( + determinedDAInUse: string, + transactionsPerDay: number, + maxChannelDuration: number, + comparableTxnType: string, + targetDataMargin: number +) => { + const output = _calculateL1BlobBaseFeeScalar( + determinedDAInUse, + transactionsPerDay, + maxChannelDuration, + comparableTxnType, + targetDataMargin + ); + console.log("e96::", output); + return output; +}; // e96 done + +export const calculateL1BlobBaseFeeScalarUsingPlasmaMode = ( + determinedDAInUse: string, + transactionsPerDay: number, + maxChannelDuration: number, + comparableTxnType: string, + targetDataMargin: number +) => { + const output = _calculateL1BlobBaseFeeScalar( + determinedDAInUse, + transactionsPerDay, + maxChannelDuration, + comparableTxnType, + targetDataMargin + ); + console.log("e98::", output); + return output; +}; // e98 done + +export const calculateL1BaseFeeScalarUsingBlobs = ( + isStateEnabled: boolean, + isFaultProofsEnabled: boolean, + outputRootPostFrequency: number, + transactionsPerDay: number, + maxChannelDuration: number, + comparableTxnType: string, + targetDataMargin: number +) => { + const n30 = calculateTotalBlobCommitmentL1Gas( + transactionsPerDay, + maxChannelDuration, + comparableTxnType + ); + const n35 = calculateTotalStateProposalL1GasCoveredByUsers( + isStateEnabled, + outputRootPostFrequency, + isFaultProofsEnabled + ); + const c8 = getAvgEstimatedSizePerTx(comparableTxnType); + const e18 = _targetDataMarginInPercentage(targetDataMargin); + const numerator = n30 + n35; + const denominator = transactionsPerDay * (16 * c8); + const result = numerator / denominator / (1 - e18); + return Math.round(result * 1000000); +}; // f94 done + +export const calculateL1BaseFeeScalarUsingL1Calldata = ( + targetDataMargin: number, + transactionsPerDay: number, + maxChannelDuration: number, + comparableTxnType: string +): number => { + const e18 = _targetDataMarginInPercentage(targetDataMargin); + const c11 = calculateImpliedCTSL1Gas( + transactionsPerDay, + maxChannelDuration, + comparableTxnType + ); + const value = c11 / 16 / (1 - e18); + const output = Math.round(value * 1000000); + console.log("f96::", output) + return output +}; // f96 done + +export const calculateL1BaseFeeScalarUsingPlasmaMode = ( + targetDataMargin: number, + transactionsPerDay: number, + maxChannelDuration: number, + comparableTxnType: string, + isStateEnabled: boolean, + outputRootPostFrequency: number, + isFaultProofsEnabled: boolean +) => { + const n31 = calculateTotalAltDAPlasmaModeCommitmentL1Gas( + transactionsPerDay, + maxChannelDuration, + comparableTxnType + ); + const n35 = calculateTotalStateProposalL1GasCoveredByUsers( + isStateEnabled, + outputRootPostFrequency, + isFaultProofsEnabled + ); + const c8 = getAvgEstimatedSizePerTx(comparableTxnType); + const e18 = _targetDataMarginInPercentage(targetDataMargin); + const value = (n31 + n35) / (transactionsPerDay * (16 * c8)) / (1 - e18); + const output = Math.round(value * 1000000); + console.log("f98::", output); + return output; +}; // f98 done + +const _targetDataMarginInPercentage = (targetDataMargin: number): number => { + return targetDataMargin / 100; +}; + +const _getCalculateImpliedDataGasFeePerTxParams = async ( + isStateEnabled: boolean, + isFaultProofsEnabled: boolean, + outputRootPostFrequency: number, + transactionsPerDay: number, + maxChannelDuration: number, + comparableTxnType: string, + targetDataMargin: number, + dataAvailabilityType: string +) => { + const c8 = getAvgEstimatedSizePerTx(comparableTxnType); + const f94 = calculateL1BaseFeeScalarUsingBlobs( + isStateEnabled, + isFaultProofsEnabled, + outputRootPostFrequency, + transactionsPerDay, + maxChannelDuration, + comparableTxnType, + targetDataMargin + ); + const f96 = calculateL1BaseFeeScalarUsingL1Calldata( + targetDataMargin, + transactionsPerDay, + maxChannelDuration, + comparableTxnType + ); + const e76 = await getL1GasBaseFee(); + const determinedDAInUse = _determineDAInUse(dataAvailabilityType); + const e94 = calculateL1BlobBaseFeeScalarUsingBlob( + determinedDAInUse, + transactionsPerDay, + maxChannelDuration, + comparableTxnType, + targetDataMargin + ); + const e96 = calculateL1BlobBaseFeeScalarUsingL1Calldata( + determinedDAInUse, + transactionsPerDay, + maxChannelDuration, + comparableTxnType, + targetDataMargin + ); + const e78 = await getBlobBaseFee(); + const e77 = await getEthToUsdRate(); + return { c8, e76, e77, e78, e94, e96, f94, f96 }; +}; + +const _getBaseFeeScalarCalculationParams = async ( + isStateEnabled: boolean, + isFaultProofsEnabled: boolean, + outputRootPostFrequency: number, + transactionsPerDay: number, + maxChannelDuration: number, + comparableTxnType: string, + targetDataMargin: number, + dataAvailabilityType: string +) => { + const determinedDAInUse = _determineDAInUse(dataAvailabilityType); + const e98 = calculateL1BlobBaseFeeScalarUsingPlasmaMode( + determinedDAInUse, + transactionsPerDay, + maxChannelDuration, + comparableTxnType, + targetDataMargin + ); + const e64 = await calculateImpliedDataGasFeePerTxUsingBlobs( + isStateEnabled, + isFaultProofsEnabled, + outputRootPostFrequency, + transactionsPerDay, + maxChannelDuration, + comparableTxnType, + dataAvailabilityType, + targetDataMargin + ); + const e67 = await calculateImpliedDataGasFeePerTxUsingL1Calldata( + isStateEnabled, + isFaultProofsEnabled, + outputRootPostFrequency, + transactionsPerDay, + maxChannelDuration, + comparableTxnType, + dataAvailabilityType, + targetDataMargin + ); + const e96 = calculateL1BlobBaseFeeScalarUsingL1Calldata( + determinedDAInUse, + transactionsPerDay, + maxChannelDuration, + comparableTxnType, + targetDataMargin + ); + const e94 = calculateL1BlobBaseFeeScalarUsingBlob( + determinedDAInUse, + transactionsPerDay, + maxChannelDuration, + comparableTxnType, + targetDataMargin + ); + const f94 = calculateL1BaseFeeScalarUsingBlobs( + isStateEnabled, + isFaultProofsEnabled, + outputRootPostFrequency, + transactionsPerDay, + maxChannelDuration, + comparableTxnType, + targetDataMargin + ); + const f96 = calculateL1BaseFeeScalarUsingL1Calldata( + targetDataMargin, + transactionsPerDay, + maxChannelDuration, + comparableTxnType + ); + const f98 = calculateL1BaseFeeScalarUsingPlasmaMode( + targetDataMargin, + transactionsPerDay, + maxChannelDuration, + comparableTxnType, + isStateEnabled, + outputRootPostFrequency, + isFaultProofsEnabled + ); + return { e98, e64, e67, e96, e94, f94, f96, f98 }; +}; + +export const calculateImpliedDataGasFeePerTxUsingBlobs = async ( + isStateEnabled: boolean, + isFaultProofsEnabled: boolean, + outputRootPostFrequency: number, + transactionsPerDay: number, + maxChannelDuration: number, + comparableTxnType: string, + dataAvailabilityType: string, + targetDataMargin: number +) => { + const { c8, f94, e76, e77, e78, e94 } = + await _getCalculateImpliedDataGasFeePerTxParams( + isStateEnabled, + isFaultProofsEnabled, + outputRootPostFrequency, + transactionsPerDay, + maxChannelDuration, + comparableTxnType, + targetDataMargin, + dataAvailabilityType + ); + const value = (c8 * (16 * f94 * e76 + e94 * e78)) / 1000000 / 1000000000; + const output = value * e77; + console.log("e64::", output) + return output +}; // e64 done + +export const calculateImpliedDataGasFeePerTxUsingL1Calldata = async ( + isStateEnabled: boolean, + isFaultProofsEnabled: boolean, + outputRootPostFrequency: number, + transactionsPerDay: number, + maxChannelDuration: number, + comparableTxnType: string, + dataAvailabilityType: string, + targetDataMargin: number +) => { + const { c8, f96, e76, e77, e78, e96 } = + await _getCalculateImpliedDataGasFeePerTxParams( + isStateEnabled, + isFaultProofsEnabled, + outputRootPostFrequency, + transactionsPerDay, + maxChannelDuration, + comparableTxnType, + targetDataMargin, + dataAvailabilityType + ); + const value = (c8 * (16 * f96 * e76 + e96 * e78)) / 1000000 / 1000000000; + const output = value * e77; + console.log("e67::", output); + return output; +}; // e67 done + +export async function displayL1BlobBaseFeeScalar( + isStateEnabled: boolean, + isFaultProofsEnabled: boolean, + outputRootPostFrequency: number, + transactionsPerDay: number, + maxChannelDuration: number, + comparableTxnType: string, + dataAvailabilityType: string, + targetDataMargin: number +) { + const { e98, e64, e67, e96, e94 } = await _getBaseFeeScalarCalculationParams( + isStateEnabled, + isFaultProofsEnabled, + outputRootPostFrequency, + transactionsPerDay, + maxChannelDuration, + comparableTxnType, + targetDataMargin, + dataAvailabilityType + ); + return calculateBlobTransactionCost( + dataAvailabilityType, + e98, + e64, + e67, + e96, + e94 + ); +} // e37 done + +export async function displayL1BaseFeeScalar( + isStateEnabled: boolean, + isFaultProofsEnabled: boolean, + outputRootPostFrequency: number, + transactionsPerDay: number, + maxChannelDuration: number, + comparableTxnType: string, + targetDataMargin: number, + dataAvailabilityType: string +) { + const { f98, e64, e67, f96, f94 } = await _getBaseFeeScalarCalculationParams( + isStateEnabled, + isFaultProofsEnabled, + outputRootPostFrequency, + transactionsPerDay, + maxChannelDuration, + comparableTxnType, + targetDataMargin, + dataAvailabilityType + ); + return calculateAltDAOrL1TransactionCost(dataAvailabilityType, f98, e64, e67, f96, f94); +} // e38 + +export const Total_Blobgas_Per_Blob = 131072; // N5 +export const Overhead_Blobgas_per_Blob = 1028; // N6 +export const L1_Gas_per_Blob_Commitment = 21000.0; // N7 +export const L1_Gas_Per_AltDA_Plasma_Mode_Commitment = 21532.0; // N8 +export const Max_No_Of_Blobs_Per_L1_Transaction = 5; // N9 +export const Avg_Compressed_Overhead_Bytes_Per_Blob = 406; // N10 +export const Avg_Compressed_Overhead_Gas_Per_Blob = 6385; // N11 +export const Avg_Total_Gas_Used_Per_L1_State_Proposal = 86847.5; // N12 +export const FastLZ_Intercept = -42585600; // N13 +export const FastLZ_Coefficient = 836500; // N14 +export const FatLZ_Min_Transaction_Size = 100; // N15 +export const Avg_Total_Gas_Used_Per_L1_Fault_Proof_State_Proposal = 420926.0; // N16 diff --git a/utils/transaction-types.ts b/utils/transaction-types.ts new file mode 100644 index 000000000..70f154ad6 --- /dev/null +++ b/utils/transaction-types.ts @@ -0,0 +1,50 @@ +export const transactionTypes = { + "General OP Mainnet": { + TransactionsPerDay: 489109, + AvgCalldataBytesPerTx: 1007.8, + AvgEstimatedSizePerTx: 474.6, + AvgBlobgasPerL2Tx: 361.6153521, + EstimatedSizeBlobgasRatio: 1.313, + EstimatedSizeCalldataGasRatio: 21.0, + }, + Base: { + TransactionsPerDay: 3227633, + AvgCalldataBytesPerTx: 632.3006064, + AvgEstimatedSizePerTx: 368.6, + AvgBlobgasPerL2Tx: 168.0497343, + EstimatedSizeBlobgasRatio: 2.193, + EstimatedSizeCalldataGasRatio: 35.09, + }, + Mode: { + TransactionsPerDay: 123889, + AvgCalldataBytesPerTx: 131.8318268, + AvgEstimatedSizePerTx: 144.3, + AvgBlobgasPerL2Tx: 102.9448416, + EstimatedSizeBlobgasRatio: 1.402, + EstimatedSizeCalldataGasRatio: 22.43, + }, + Zora: { + TransactionsPerDay: 126719, + AvgCalldataBytesPerTx: 318.8965479, + AvgEstimatedSizePerTx: 174.6, + AvgBlobgasPerL2Tx: 121.6317714, + EstimatedSizeBlobgasRatio: 1.435, + EstimatedSizeCalldataGasRatio: 22.96, + }, + Mint: { + TransactionsPerDay: 6341, + AvgCalldataBytesPerTx: 274.5535557, + AvgEstimatedSizePerTx: 206.9, + AvgBlobgasPerL2Tx: 317.11, + EstimatedSizeBlobgasRatio: 0.65, + EstimatedSizeCalldataGasRatio: 10.44, + }, + Metal: { + TransactionsPerDay: 430, + AvgCalldataBytesPerTx: 296.1833811, + AvgEstimatedSizePerTx: 237.2, + AvgBlobgasPerL2Tx: 947549.16, + EstimatedSizeBlobgasRatio: 0.0, + EstimatedSizeCalldataGasRatio: 0.0, + }, +}; From 0879dc7db17eaf6291eedbd4147ed58b7f2da641 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Wed, 25 Sep 2024 16:45:55 +0100 Subject: [PATCH 046/565] Update pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> --- .../app-developers/tutorials/cross-dom-bridge-eth.mdx | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx b/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx index fba4d22fa..0085c0385 100644 --- a/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx +++ b/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx @@ -533,10 +533,12 @@ Now you're going to repeat the process in reverse to bridge some ETH from L2 to ## Important Considerations -* **Challenge Period**: The 7-day waiting period is crucial for security. -* **Gas Costs**: Withdrawals involve transactions on both L2 and L1, each incurring gas fees. -* **Private Key Handling**: Use secure key management practices in real applications. -* **RPC Endpoint Security**: Keep your Alchemy API key (or any RPC endpoint) secure. + + - **Challenge Period**: The 7-day waiting period is crucial for security. + - **Gas Costs**: Withdrawals involve transactions on both L2 and L1, each incurring gas fees. + - **Private Key Handling**: Use secure key management practices in real applications. + - **RPC Endpoint Security**: Keep your Alchemy API key (or any RPC endpoint) secure. + ## Next Steps From 8d108863469333a71554a0dc397b37fc6e92bb85 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Wed, 25 Sep 2024 16:47:11 +0100 Subject: [PATCH 047/565] Update public/tutorials/cross-dom-bridge-eth.js Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> --- public/tutorials/cross-dom-bridge-eth.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/public/tutorials/cross-dom-bridge-eth.js b/public/tutorials/cross-dom-bridge-eth.js index ef20f7b46..f8e63033c 100644 --- a/public/tutorials/cross-dom-bridge-eth.js +++ b/public/tutorials/cross-dom-bridge-eth.js @@ -3,8 +3,8 @@ import { sepolia, optimismSepolia } from "viem/chains"; import { privateKeyToAccount } from 'viem/accounts'; import { getL2TransactionHashes, publicActionsL2, walletActionsL1, walletActionsL2 } from 'viem/op-stack'; -// Replace with your actual private key (Keep this secure!) -const PRIVATE_KEY = '0x....' +// Load private key from environment variable +const PRIVATE_KEY = process.env.PRIVATE_KEY; const account = privateKeyToAccount(PRIVATE_KEY); // Create L1 public client for reading from the Sepolia network From 4bdb8684da3d9af85f402e0e81c212efc626aab2 Mon Sep 17 00:00:00 2001 From: DannyThomx Date: Thu, 26 Sep 2024 11:04:00 +0200 Subject: [PATCH 048/565] implement fee calculator UI --- components/calculator/ChainParametersForm.tsx | 239 ++++++++---------- components/calculator/Inputs/SelectInput.tsx | 11 +- components/calculator/Inputs/TextInput.tsx | 4 +- components/calculator/ResultsTable.tsx | 126 +++++---- package.json | 1 - pnpm-lock.yaml | 141 ----------- public/img/icons/caret-down.svg | 4 + styles/calculator.css | 199 +++++++++++++++ styles/global.css | 1 + utils/calculator-helpers.ts | 238 ++++++++++++++++- 10 files changed, 631 insertions(+), 333 deletions(-) create mode 100644 public/img/icons/caret-down.svg diff --git a/components/calculator/ChainParametersForm.tsx b/components/calculator/ChainParametersForm.tsx index 9af91c846..1c81a3b69 100644 --- a/components/calculator/ChainParametersForm.tsx +++ b/components/calculator/ChainParametersForm.tsx @@ -3,14 +3,14 @@ import { useState } from "react"; import { TextInput, SelectInput, CheckboxInput } from "./Inputs"; import { ResultsTable } from "./ResultsTable"; import { - calculateImpliedStateProposalsPerDay, - getAvgEstimatedSizePerTx, + displayL1BaseFeeScalar, displayL1BlobBaseFeeScalar, + calculateTotalAltDAPlasmaModeCommitmentCostsInETH, } from "@/utils/calculator-helpers"; + type ComparableTransactionType = "Base" | "Zora" | "Mint" | "Mode"; type DataAvailabilityType = "Ethereum" | "AltDA Plasma Mode"; - export function ChainParametersForm(): ReactElement { const [transactionsPerDay, setTransactionsPerDay] = useState(500000); const [comparableTransactionType, setComparableTransactionType] = @@ -22,7 +22,6 @@ export function ChainParametersForm(): ReactElement { const [maxChannelDuration, setMaxChannelDuration] = useState(5); const [outputRootPostFrequency, setOutputRootPostFrequency] = useState(1 ); const [isIncludeOutputRootCosts, setIsIncludeOutputRootCosts] = useState("yes"); - const [isAdvancedInputs, setIsAdvancedInputs] = useState(false); const comparableTransactionTypeOptions = [ "General OP Mainnet", @@ -60,141 +59,125 @@ export function ChainParametersForm(): ReactElement { targetDataFeeMargin ); - // const result2 = calculateTotalAltDAPlasmaModeCommitmentL1Gas( - // transactionsPerDay, - // maxChannelDuration, - // comparableTransactionType - // ); - // const result4 = calculateImpliedStateProposalsPerDay(outputRootPostFrequency); - - // const result5 = calculateImpliedDataGasFeePerTxUsingL1Calldata( - // isIncludeOutputRootCosts, - // isFaultProofEnabled, - // outputRootPostFrequency, - // transactionsPerDay, - // maxChannelDuration, - // comparableTransactionType, - // dataAvailabilityType, - // targetDataFeeMargin - // ); - - // const xyz = calculateL1BaseFeeScalarUsingBlobs( - // isIncludeOutputRootCosts, - // isFaultProofEnabled, - // outputRootPostFrequency, - // transactionsPerDay, - // maxChannelDuration, - // comparableTransactionType, - // targetDataFeeMargin - // ) + const result2 = await displayL1BaseFeeScalar( + isIncludeOutputRootCosts, + isFaultProofEnabled, + outputRootPostFrequency, + transactionsPerDay, + maxChannelDuration, + comparableTransactionType, + targetDataFeeMargin, + dataAvailabilityType + ); + const res = await calculateTotalAltDAPlasmaModeCommitmentCostsInETH ( + transactionsPerDay, + maxChannelDuration, + comparableTransactionType + ) - // const result5 = getL1GasBaseFee(); - // console.log("RESULT2:::", result2); console.log("RESULT5:::e37", result); - // console.log("xyz:::", xyz); - }; - - const handleToggle = (val: any) => { - setIsAdvancedInputs(val); + console.log("RESULT5:::e38", result2); + console.log("RESULT6:::", res); }; - // console.log("WHEW::", transactionsPerDay) - // console.log("JEDDB::", comparableTransactionType); - // console.log("XXAAB::", dataAvailabilityType); - // console.log("FFFAULTPRFF::", isFaultProofEnabled); - // console.log("OUTROOCOST::", isIncludeOutputRootCosts); - const stringToBoolean = (value: string): boolean => { return value === "yes" ? true : false } - return (
-
- - - - - - - - - -
-
-

- Advanced Inputs -

- -
+ +
+

Chain Inputs

+ + + + + + + + +
- {isAdvancedInputs && ( -
-

Advanced Inputs

- - - - - -
- )} - - +
+

Advanced Inputs

+ + + + + +
+
diff --git a/components/calculator/Inputs/SelectInput.tsx b/components/calculator/Inputs/SelectInput.tsx index 95718d866..8ed61b844 100644 --- a/components/calculator/Inputs/SelectInput.tsx +++ b/components/calculator/Inputs/SelectInput.tsx @@ -6,11 +6,12 @@ type Props = { data: any[]; otherProps?: any; description?: string; + labelClass?: string; onSelect?: (e: any) => void; }; export const SelectInput: React.FC = React.memo( - ({ className, description, otherProps, label, data, onSelect }) => { + ({ className, labelClass, description, otherProps, label, data, onSelect }) => { const handleSelect = (e: any) => { const value = e.target.value onSelect(value) @@ -18,9 +19,13 @@ export const SelectInput: React.FC = React.memo( return (
{label && ( - + )} -

{description}

+

+ {description} +

+

- This construction is expected to have +0.006 ETH Margin on Data Costs - (5% Margin) at inputted L1 Gas Prices{" "} + This construction is expected to have +0.006 ETH Margin + on Data Costs (5% Margin) at inputted L1 Gas Prices{" "} +

+

+ Implied Data Gas Fee per User Transaction: $0.0006{" "}

-

Implied Data Gas Fee per User Transaction: $0.0006

-

Results:

+

Results

-
-

Fee Scalar Recommendations - Values to Set as Chain Inputs

-

+

-
- +
+
- - + + - - - - + + + + - - - - - + + + + + - - - - + + + +
- DA Recommendation: - - Blobs (EIP-4844) - DA Recommendation:Blobs (EIP-4844)
- Scalar Type - - Chain Input - - Decimal-Adjusted (6 decimals) -
Scalar TypeChain InputDecimal-Adjusted (6 decimals)
- l1BlobBaseBaseScalar - - 810831 - - 0.810831 -
l1BlobBaseBaseScalar8108310.810831
- l1BaseFeeScalar - - 4244 - - 0.004244 -
l1BaseFeeScalar42440.004244
-
+

Using Blobs (EIP-4844), posting transaction data will be 99.7% cheaper than using L1 Calldata{" "}

-
-

Fees Scalars Assume: 100% Blob Fullness and 5 Blobs per L1 Tx (Avg), Target a 5% Margin on DA and State, 5 hour Max Submission Window.

-

Implied Data Gas Fee Assumes: 0 gwei Blobgas Base Fee, 7.2 gwei L1 Base Fee, 2370 ETH/USD

+
+

+ Fees Scalars Assume: + 100% Blob Fullness and 5 Blobs per L1 Tx (Avg), + Target a 5% Margin on DA and State, 5 hour Max Submission Window. +

+

+ Implied Data Gas Fee Assumes:{" "} + + 0 gwei Blobgas Base Fee, 7.2 gwei L1 Base Fee, 2370 ETH/USD + +

diff --git a/package.json b/package.json index 7ea954ca7..8923e1b23 100644 --- a/package.json +++ b/package.json @@ -18,7 +18,6 @@ "@eth-optimism/contracts-ts": "^0.17.0", "@eth-optimism/tokenlist": "^9.0.9", "@feelback/react": "^0.3.4", - "@headlessui/react": "^2.1.0", "algoliasearch": "^4.23.3", "clsx": "^2.1.1", "escape-string-regexp": "^5.0.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 03596b6ff..cdac61a10 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -28,9 +28,6 @@ importers: '@feelback/react': specifier: ^0.3.4 version: 0.3.4(react@18.3.1) - '@headlessui/react': - specifier: ^2.1.0 - version: 2.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) algoliasearch: specifier: ^4.23.3 version: 4.23.3 @@ -570,27 +567,6 @@ packages: peerDependencies: react: '>=17' - '@floating-ui/core@1.6.2': - resolution: {integrity: sha512-+2XpQV9LLZeanU4ZevzRnGFg2neDeKHgFLjP6YLW+tly0IvrhqT4u8enLGjLH3qeh85g19xY5rsAusfwTdn5lg==} - - '@floating-ui/dom@1.6.5': - resolution: {integrity: sha512-Nsdud2X65Dz+1RHjAIP0t8z5e2ff/IRbei6BqFrl1urT8sDVzM1HMQ+R0XcU5ceRfyO3I6ayeqIfh+6Wb8LGTw==} - - '@floating-ui/react-dom@2.1.0': - resolution: {integrity: sha512-lNzj5EQmEKn5FFKc04+zasr09h/uX8RtJRNj5gUXsSQIXHVWTVh+hVAg1vOMCexkX8EgvemMvIFpQfkosnVNyA==} - peerDependencies: - react: '>=16.8.0' - react-dom: '>=16.8.0' - - '@floating-ui/react@0.26.17': - resolution: {integrity: sha512-ESD+jYWwqwVzaIgIhExrArdsCL1rOAzryG/Sjlu8yaD3Mtqi3uVyhbE2V7jD58Mo52qbzKz2eUY/Xgh5I86FCQ==} - peerDependencies: - react: '>=16.8.0' - react-dom: '>=16.8.0' - - '@floating-ui/utils@0.2.2': - resolution: {integrity: sha512-J4yDIIthosAsRZ5CPYP/jQvUAQtlZTTD/4suA08/FEnlxqW3sKS9iAhgsa9VYLZ6vDHn/ixJgIqRQPotoBjxIw==} - '@headlessui/react@1.7.19': resolution: {integrity: sha512-Ll+8q3OlMJfJbAKM/+/Y2q6PPYbryqNTXDbryx7SXLIDamkF6iQFbriYHga0dY44PvDhvvBWCx1Xj4U5+G4hOw==} engines: {node: '>=10'} @@ -598,13 +574,6 @@ packages: react: ^16 || ^17 || ^18 react-dom: ^16 || ^17 || ^18 - '@headlessui/react@2.1.0': - resolution: {integrity: sha512-/MizQk2xqR5ELkmCI1xWy3VgJULvR8gcAXtZhcK7sY53TNRCPeMdeODEXKSv9LPSSRlEAyzW1+NGJiaXq6dLRw==} - engines: {node: '>=10'} - peerDependencies: - react: ^18 - react-dom: ^18 - '@humanwhocodes/config-array@0.11.14': resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} engines: {node: '>=10.10.0'} @@ -816,37 +785,6 @@ packages: '@popperjs/core@2.11.8': resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==} - '@react-aria/focus@3.17.1': - resolution: {integrity: sha512-FLTySoSNqX++u0nWZJPPN5etXY0WBxaIe/YuL/GTEeuqUIuC/2bJSaw5hlsM6T2yjy6Y/VAxBcKSdAFUlU6njQ==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - - '@react-aria/interactions@3.21.3': - resolution: {integrity: sha512-BWIuf4qCs5FreDJ9AguawLVS0lV9UU+sK4CCnbCNNmYqOWY+1+gRXCsnOM32K+oMESBxilAjdHW5n1hsMqYMpA==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - - '@react-aria/ssr@3.9.4': - resolution: {integrity: sha512-4jmAigVq409qcJvQyuorsmBR4+9r3+JEC60wC+Y0MZV0HCtTmm8D9guYXlJMdx0SSkgj0hHAyFm/HvPNFofCoQ==} - engines: {node: '>= 12'} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - - '@react-aria/utils@3.24.1': - resolution: {integrity: sha512-O3s9qhPMd6n42x9sKeJ3lhu5V1Tlnzhu6Yk8QOvDuXf7UGuUjXf9mzfHJt1dYzID4l9Fwm8toczBzPM9t0jc8Q==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - - '@react-stately/utils@3.10.1': - resolution: {integrity: sha512-VS/EHRyicef25zDZcM/ClpzYMC5i2YGN6uegOeQawmgfGjb02yaCX0F0zR69Pod9m2Hr3wunTbtpgVXvYbZItg==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - - '@react-types/shared@3.23.1': - resolution: {integrity: sha512-5d+3HbFDxGZjhbMBeFHRQhexMFt4pUce3okyRtUVKbbedQFUrtXSBg9VszgF2RTeQDKDkMCIQDtz5ccP/Lk1gw==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - '@scure/base@1.1.6': resolution: {integrity: sha512-ok9AWwhcgYuGG3Zfhyqg+zwl+Wn5uE+dwC0NV/2qQkx4dABbb/bx96vWu8NSj+BNjjSjno+JRYRjle1jV08k3g==} @@ -3307,9 +3245,6 @@ packages: resolution: {integrity: sha512-7RnqIMq572L8PeEzKeBINYEJDDxpcH8JEgLwUqBd3TkofhFRbkq4QLR0u+36avGAhCRbk2nnmjcW9SE531hPDg==} engines: {node: ^14.18.0 || >=16.0.0} - tabbable@6.2.0: - resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==} - text-table@0.2.0: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} @@ -4346,31 +4281,6 @@ snapshots: '@feelback/js': 0.3.4 react: 18.3.1 - '@floating-ui/core@1.6.2': - dependencies: - '@floating-ui/utils': 0.2.2 - - '@floating-ui/dom@1.6.5': - dependencies: - '@floating-ui/core': 1.6.2 - '@floating-ui/utils': 0.2.2 - - '@floating-ui/react-dom@2.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@floating-ui/dom': 1.6.5 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - - '@floating-ui/react@0.26.17(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@floating-ui/react-dom': 2.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@floating-ui/utils': 0.2.2 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - tabbable: 6.2.0 - - '@floating-ui/utils@0.2.2': {} - '@headlessui/react@1.7.19(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@tanstack/react-virtual': 3.5.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -4378,15 +4288,6 @@ snapshots: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@headlessui/react@2.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@floating-ui/react': 0.26.17(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@react-aria/focus': 3.17.1(react@18.3.1) - '@react-aria/interactions': 3.21.3(react@18.3.1) - '@tanstack/react-virtual': 3.5.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - '@humanwhocodes/config-array@0.11.14': dependencies: '@humanwhocodes/object-schema': 2.0.3 @@ -4569,46 +4470,6 @@ snapshots: '@popperjs/core@2.11.8': {} - '@react-aria/focus@3.17.1(react@18.3.1)': - dependencies: - '@react-aria/interactions': 3.21.3(react@18.3.1) - '@react-aria/utils': 3.24.1(react@18.3.1) - '@react-types/shared': 3.23.1(react@18.3.1) - '@swc/helpers': 0.5.2 - clsx: 2.1.1 - react: 18.3.1 - - '@react-aria/interactions@3.21.3(react@18.3.1)': - dependencies: - '@react-aria/ssr': 3.9.4(react@18.3.1) - '@react-aria/utils': 3.24.1(react@18.3.1) - '@react-types/shared': 3.23.1(react@18.3.1) - '@swc/helpers': 0.5.2 - react: 18.3.1 - - '@react-aria/ssr@3.9.4(react@18.3.1)': - dependencies: - '@swc/helpers': 0.5.2 - react: 18.3.1 - - '@react-aria/utils@3.24.1(react@18.3.1)': - dependencies: - '@react-aria/ssr': 3.9.4(react@18.3.1) - '@react-stately/utils': 3.10.1(react@18.3.1) - '@react-types/shared': 3.23.1(react@18.3.1) - '@swc/helpers': 0.5.2 - clsx: 2.1.1 - react: 18.3.1 - - '@react-stately/utils@3.10.1(react@18.3.1)': - dependencies: - '@swc/helpers': 0.5.2 - react: 18.3.1 - - '@react-types/shared@3.23.1(react@18.3.1)': - dependencies: - react: 18.3.1 - '@scure/base@1.1.6': {} '@scure/bip32@1.3.2': @@ -8033,8 +7894,6 @@ snapshots: '@pkgr/core': 0.1.1 tslib: 2.6.2 - tabbable@6.2.0: {} - text-table@0.2.0: {} tinyurl@1.1.7: {} diff --git a/public/img/icons/caret-down.svg b/public/img/icons/caret-down.svg new file mode 100644 index 000000000..ea15ee513 --- /dev/null +++ b/public/img/icons/caret-down.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/styles/calculator.css b/styles/calculator.css index 5adf06d22..153c1e1ad 100644 --- a/styles/calculator.css +++ b/styles/calculator.css @@ -1 +1,200 @@ /* Fee Parameter Calculator */ +@import url('colors.css'); + +/**** Chain Inputs Form Styles ****/ + +button.calculator-button { + padding: 17px 17px; + background: var(--op-red-500); + color: var(--op-neutral-0); + border-radius: 10px; + margin-top: 30px; + margin-bottom: 10px; +} + +.calculator-heading_sub { + font-size: 23px; + margin-bottom: 40px; + text-align: center; +} + +.calcularor-label_description { + font-size: 11px; + margin-bottom: 3px; + color: var(--op-neutral-400) +} + +.calculator-label { + display: flex; + margin-bottom: 5px; +} + +.calculator-select { + width: 100%; + padding: 8px 12px; + border: 1px solid #d3d3d3; + border-radius: 10px; + appearance: none; + -webkit-appearance: none; + -moz-appearance: none; + background-image: url('../public/img/icons/caret-down.svg'); + background-repeat: no-repeat; + background-position: right 10px center; + background-size: 20px; +} + +.calculator-select, +.calculator-input { + margin-bottom: 20px; +} + +select.calculator-select :hover, +select.calculator-select :focus { + border-color: #a9a9a9; + outline: none; +} + +.calculator-form { + margin-top: 40px; + margin-bottom: 30px; + border: 1px solid #efefef; + padding: 35px 30px; + border-radius: 10px; +} + +.calculator-input { + border: 1px solid #dedede; + width: 100%; + border-radius: 10px; + padding: 8px 12px; +} + +/**** Construction Info Styles ****/ + +.construction-info { + margin-bottom: 50px; +} + +.construction-info p { + font-weight: 500; + font-size: 14px; + text-align: center; + padding: 0 40px; + color: var(--op-neutral-500) +} + +.construction-info p span { + font-weight: 700; +} + +/**** Results & Table Styles ****/ + +.results-extra-info, .additional-info p:first-of-type { + margin-bottom: 7px; +} + +.results-table-wrap div.calculator-text p { + font-style: italic; + font-weight: 500; + font-size: 12px; + text-align: center; + color: var(--op-neutral-700) +} + +table { + width: 100%; + border-collapse: collapse; + margin-bottom: 40px; +} + +th, +td { + border: 1px solid var(--op-red-200); + padding: 8px; + text-align: left; +} + +thead .sub-header { + background-color: var(--op-red-600) !important; + color: var(--op-neutral-0); +} + +tbody tr td, +thead tr:nth-of-type(2) th { + text-align: center; +} + +tbody tr td:first-of-type, +thead tr:nth-of-type(2) th:first-of-type { + text-align: right; +} + +div.calculator-results-wrap .results-container .results-table-wrap tbody { + font-size: 14px; + color: var(--op-red-600); + font-weight: 700; +} + +thead th[colspan="2"] { + text-align: right; +} + +div.calculator-results-wrap +.results-container +.results-table-wrap { + display: flex; + flex-direction: column; + align-items: center; + } + +div.calculator-results-wrap +.results-container +.results-table-wrap +table.results-table.table { + border: 1px solid #efefef; + padding: 30px; + border-radius: 10px; +} + +div.calculator-results-wrap +.results-container +.results-recommendations +.calculator-info { + padding: 20px 15px; + background: var(--op-blue-200); + color: var(--op-blue-500); + border-radius: 20px; + margin: 30px 0px; +} + +div.calculator-results-wrap +.results-container +.results-recommendations +.calculator-info.calculator-text a { + text-decoration: underline; + font-style: italic; +} + +.results-recommendations { + margin-bottom: 40px; +} + +div.calculator-results-wrap +.results-container +h3.calculator-heading_text { + font-weight: 100; + color: var(--op-neutral-500); +} + +div.calculator-results-wrap +.results-container .calculator-text { + font-size: 14px; + color: var(--op-neutral-500); +} + +div.calculator-results-wrap .results-container{ + border: 1px solid #efefef; + border-radius: 10px; + padding: 40px 30px 50px; +} + diff --git a/styles/global.css b/styles/global.css index 498779c39..2d455417f 100644 --- a/styles/global.css +++ b/styles/global.css @@ -2,6 +2,7 @@ @import url('https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400..700&display=swap'); @import url('colors.css'); @import url('theme.css'); +@import url('calculator.css'); /* Override Nextra so content gets more breathing room */ .nextra-content h2 ~ p, diff --git a/utils/calculator-helpers.ts b/utils/calculator-helpers.ts index c4f348769..2a033ac8e 100644 --- a/utils/calculator-helpers.ts +++ b/utils/calculator-helpers.ts @@ -166,7 +166,11 @@ export async function getEthToUsdRate(): Promise { // targetDataMargin === E18: number // maxChannelDuration === E22: number // outputRootPostFrequency === E23: number -// isStateEnabled: string, === E24: string +// isStateEnabled: boolean, === E24: string + +// ModeledExpectedStateCostsOnL1: number === e120 = n40 == e56 +// ModeledDACostsOnL1: number === e119 = e55 +// ModeledDAPlusStateRevenueOnL2: number === e118 /** * Advanced Input - @@ -281,7 +285,6 @@ const _determineDAInUse = (dataAvailabilityType: string): string => { : "EIP-4844"; }; - // =INDEX($A$20:$G$32,MATCH('Chain Estimator'!$E$15,$A$20:$A$32,0),MATCH($B8,$A$20:$G$20,0)) export const getAvgEstimatedSizePerTx = (comparableTxnType: string) => { const output = transactionTypes[comparableTxnType].AvgEstimatedSizePerTx; @@ -522,6 +525,22 @@ export const calculateTotalAltDAPlasmaModeCommitmentL1Gas = ( return output; }; // n31 done +// N22 * N5 +export const calculateTotalBlobgas = ( + transactionsPerDay: number, + maxChannelDuration: number, + comparableTxnType: string +) => { + const n22 = calculateImpliedBlobsPerDay( + transactionsPerDay, + maxChannelDuration, + comparableTxnType + ); + const output = n22 * Total_Blobgas_Per_Blob; + console.log("n32::", output) + return output; +}; // n32 + // =IF('Chain Estimator'!E23=0,0,24/'Chain Estimator'!E23) export const calculateImpliedStateProposalsPerDay = ( outputRootPostFrequency: number @@ -562,6 +581,76 @@ export const calculateTotalStateProposalL1GasCoveredByUsers = ( return output; }; // n35 done + +// =N30*'Chain Estimator'!E76/1000000000 +export const calculateTotalBlobCommitmentCostsInETH = async ( + transactionsPerDay: number, + maxChannelDuration: number, + comparableTxnType: string +) => { + const n30 = calculateTotalBlobCommitmentL1Gas( + transactionsPerDay, + maxChannelDuration, + comparableTxnType + ) + const e76 = await getL1GasBaseFee(); + const output = (n30 * e76) / 1000000000; + console.log("n36::", output) + return output; +} // n36 + + +// =N31*'Chain Estimator'!E76/1000000000 +export const calculateTotalAltDAPlasmaModeCommitmentCostsInETH = async ( + transactionsPerDay: number, + maxChannelDuration: number, + comparableTxnType: string +) => { + const n31 = calculateTotalAltDAPlasmaModeCommitmentL1Gas( + transactionsPerDay, + maxChannelDuration, + comparableTxnType + ) + const e76 = await getL1GasBaseFee(); + const output = n31 * e76 / 1000000000; + console.log("n37::", output) + return output; +} // n37 done + +// =N32*'Chain Estimator'!E78/1000000000 +const calculateTotalBlobgasCostsInETH = async ( + transactionsPerDay: number, + maxChannelDuration: number, + comparableTxnType: string +) => { + const n32 = calculateTotalBlobgas( + transactionsPerDay, + maxChannelDuration, + comparableTxnType + ) + const e78 = await getBlobBaseFee(); + const output = (n32 * e78) / 1000000000; + console.log("n38::", output); + return output; +} // n38 + +// =N23*'Chain Estimator'!E76/1000000000 +const calculateTotalL1CalldataCostsInETHIfL1 = async ( + comparableTxnType: string, + transactionsPerDay: number, + maxChannelDuration: number +) => { + const n23 = calculateImpliedCalldataGasUsedIfL1( + comparableTxnType, + transactionsPerDay, + maxChannelDuration + ) + const e76 = await getL1GasBaseFee(); + const output = (n23 * e76) / 1000000000; + console.log("n39::", output); + return output; +} // n39 + const _calculateL1BlobBaseFeeScalar = ( determinedDAInUse: string, transactionsPerDay: number, @@ -891,6 +980,48 @@ export const calculateImpliedDataGasFeePerTxUsingBlobs = async ( return output }; // e64 done +// =('Advanced Inputs'!C8*(16*F98*E76+E98*E78)/1000000/1000000000)*E77 +export const calculateImpliedDataGasFeePerTxUsingAltDAPlasmaMode = async ( + isStateEnabled: boolean, + isFaultProofsEnabled: boolean, + outputRootPostFrequency: number, + transactionsPerDay: number, + maxChannelDuration: number, + comparableTxnType: string, + dataAvailabilityType: string, + targetDataMargin: number +) => { + const { c8, e76, e77, e78} = + await _getCalculateImpliedDataGasFeePerTxParams( + isStateEnabled, + isFaultProofsEnabled, + outputRootPostFrequency, + transactionsPerDay, + maxChannelDuration, + comparableTxnType, + targetDataMargin, + dataAvailabilityType + ); + const { f98, e98 } = await _getBaseFeeScalarCalculationParams( + isStateEnabled, + isFaultProofsEnabled, + outputRootPostFrequency, + transactionsPerDay, + maxChannelDuration, + comparableTxnType, + targetDataMargin, + dataAvailabilityType + ); + + const part1 = 16 * f98 * e76; + const part2 = e98 * e78; + const sum = part1 + part2; + const result = sum / 1000000 / 1000000000; + const output = c8 * result * e77; + console.log("e66::", output); + return output; +}; // e66 + export const calculateImpliedDataGasFeePerTxUsingL1Calldata = async ( isStateEnabled: boolean, isFaultProofsEnabled: boolean, @@ -918,6 +1049,21 @@ export const calculateImpliedDataGasFeePerTxUsingL1Calldata = async ( return output; }; // e67 done +// =N34*'Chain Estimator'!E76/1000000000 +export const calculateTotalL1StateProposalCostsInETH = async ( + outputRootPostFrequency: number, + isFaultProofsEnabled: boolean +) => { + const n34 = calculateTotalStateProposalL1Gas( + outputRootPostFrequency, + isFaultProofsEnabled + ); + const e76 = await getL1GasBaseFee(); + const output = (n34 * e76) / 1000000000; + console.log("n40::", output) + return output; +}; // n40 done + export async function displayL1BlobBaseFeeScalar( isStateEnabled: boolean, isFaultProofsEnabled: boolean, @@ -969,7 +1115,93 @@ export async function displayL1BaseFeeScalar( dataAvailabilityType ); return calculateAltDAOrL1TransactionCost(dataAvailabilityType, f98, e64, e67, f96, f94); -} // e38 +} // e38 done + +// =E118-(E56+E55) | OverallL1DataAndStateCostsMargin +export const calculateOverallL1DataAndStateCostsMargin = async ( + transactionsPerDay: number, + comparableTxnType: string, + displayL1BlobBaseFeeScalar: number, + displayL1BaseFeeScalar: number, + dataAvailabilityType: string, + maxChannelDuration: number, + outputRootPostFrequency: number, + isFaultProofsEnabled: boolean +) => { + const e118 = await calculateModeledDAPlusStateRevenueOnL2(transactionsPerDay, comparableTxnType, displayL1BlobBaseFeeScalar, displayL1BaseFeeScalar) + const e55 = await calculateModeledDACostsOnL1( + dataAvailabilityType, + transactionsPerDay, + maxChannelDuration, + comparableTxnType + ) + const e56 = await calculateTotalL1StateProposalCostsInETH( + outputRootPostFrequency, + isFaultProofsEnabled + ) + const output = e118 - (e56 + e55); + console.log("e58::", output); + return output; +} // e58 + +// =(E14*'Advanced Inputs'!C8*(16*G38*E76/1000000000+G37*E78/1000000000)) +export const calculateModeledDAPlusStateRevenueOnL2 = async ( + e14: number, + e15: string, + e37: number, + e38: number +) => { + const c8 = getAvgEstimatedSizePerTx(e15); + const g38 = convertToMillionUnits(e38); + const g37 = convertToMillionUnits(e37) + const e76 = await getL1GasBaseFee(); + const e78 = await getBlobBaseFee(); + const part1 = (16 * g38 * e76) / 1000000000; + const part2 = (g37 * e78) / 1000000000; + const output = e14 * c8 * (part1 + part2); + console.log("e118::", output) + return output +} // e118 + +async function calculateModeledDACostsOnL1( + dataAvailabilityType: string, + transactionsPerDay: number, + maxChannelDuration: number, + comparableTxnType: string +): Promise { + let output = 0; + const f35 = _determineDAInUse(dataAvailabilityType); + const n36 = await calculateTotalBlobCommitmentCostsInETH( + transactionsPerDay, + maxChannelDuration, + comparableTxnType + ); + const n37 = await calculateTotalAltDAPlasmaModeCommitmentCostsInETH( + transactionsPerDay, + maxChannelDuration, + comparableTxnType + ) + const n38 = await calculateTotalBlobgasCostsInETH( + transactionsPerDay, + maxChannelDuration, + comparableTxnType + ) + const n39 = await calculateTotalL1CalldataCostsInETHIfL1( + comparableTxnType, + transactionsPerDay, + maxChannelDuration + ) + if (dataAvailabilityType === "AltDA Plasma Mode") { + output = n37; + } else if (f35 === "EIP-4844") { + output = n36 + n38; + } else { + output = n39; + } + console.log("e119::", output) + return output +} // e119 + export const Total_Blobgas_Per_Blob = 131072; // N5 export const Overhead_Blobgas_per_Blob = 1028; // N6 From 1d69758f6051dad5666e382f8f40c842129074cd Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Thu, 26 Sep 2024 11:30:37 +0100 Subject: [PATCH 049/565] updated the urls --- .../app-developers/tutorials/cross-dom-bridge-eth.mdx | 8 ++++---- public/tutorials/cross-dom-bridge-eth.js | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx b/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx index 0085c0385..fad77a894 100644 --- a/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx +++ b/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx @@ -272,14 +272,14 @@ Now that you have some ETH on L1 you can deposit that ETH into the `L1StandardBr // Create L2 public client for interacting with OP Sepolia const publicClientL2 = createPublicClient({ chain: optimismSepolia, - transport: http('https://rpc.ankr.com/eth_sepolia'), + transport: http(process.env.L1_RPC_URL), }).extend(publicActionsL2()); // Create L2 wallet client for sending transactions on OP Sepolia const walletClientL2 = createWalletClient({ account, chain: optimismSepolia, - transport: http('https://rpc.ankr.com/eth_sepolia'), + transport: http(process.env.L1_RPC_URL), }).extend(walletActionsL2()); async function depositETH(amount) { @@ -466,14 +466,14 @@ Now you're going to repeat the process in reverse to bridge some ETH from L2 to // Create L2 public client for interacting with OP Sepolia const publicClientL2 = createPublicClient({ chain: optimismSepolia, - transport: http('https://rpc.ankr.com/eth_sepolia'), + transport: http(process.env.L1_RPC_URL), }).extend(publicActionsL2()); // Create L2 wallet client for sending transactions on OP Sepolia const walletClientL2 = createWalletClient({ account, chain: optimismSepolia, - transport: http('https://rpc.ankr.com/eth_sepolia'), + transport: http(process.env.L1_RPC_URL), }).extend(walletActionsL2()); async function withdrawETH(amount) { diff --git a/public/tutorials/cross-dom-bridge-eth.js b/public/tutorials/cross-dom-bridge-eth.js index f8e63033c..6735e017c 100644 --- a/public/tutorials/cross-dom-bridge-eth.js +++ b/public/tutorials/cross-dom-bridge-eth.js @@ -23,14 +23,14 @@ const walletClientL1 = createWalletClient({ // Create L2 public client for interacting with OP Sepolia const publicClientL2 = createPublicClient({ chain: optimismSepolia, - transport: http('https://rpc.ankr.com/eth_sepolia'), + transport: http(process.env.L2_RPC_URL), }).extend(publicActionsL2()); // Create L2 wallet client for sending transactions on OP Sepolia const walletClientL2 = createWalletClient({ account, chain: optimismSepolia, - transport: http('https://rpc.ankr.com/eth_sepolia'), + transport: http(process.env.L2_RPC_URL), }).extend(walletActionsL2()); async function depositETH(amount) { From e1968a94ab3cdbbfd00358f62f734bb2aeb51ecd Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Thu, 26 Sep 2024 11:32:22 +0100 Subject: [PATCH 050/565] fix lint issues --- .../tutorials/cross-dom-bridge-eth.mdx | 24 +++++++++---------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx b/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx index fad77a894..4c4514787 100644 --- a/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx +++ b/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx @@ -82,7 +82,8 @@ npm install -g pnpm {

Import the necessary packages

} - In the `bridge-eth.js` file, import the `viem` package at the top: +In the `bridge-eth.js` file, import the `viem` package at the top: + ```js // Import required modules @@ -100,7 +101,6 @@ dotenv.config(); You'll need a few variables throughout this tutorial. Let's set those up now. - Create an account from the private key. [`privateKeyToAccount`](https://viem.sh/docs/accounts/local/privateKeyToAccount#privatekeytoaccount) is a viem method used to sign transactions by passing a private key. @@ -174,7 +174,6 @@ Now that you have some ETH on L1 you can deposit that ETH into the `L1StandardBr - {

Check your wallet balance on L1

} See how much ETH you have on L1 so you can confirm that the deposit worked later on. @@ -187,10 +186,9 @@ Now that you have some ETH on L1 you can deposit that ETH into the `L1StandardBr checkBalances(); ``` - + We used `formatEther` method from `viem` to format the balance to ether. - - + {

Create the deposit transaction

} @@ -383,12 +381,13 @@ Now you're going to repeat the process in reverse to bridge some ETH from L2 to ``` {

Prove the withdrawal on the L1

} + Once the withdrawal is ready to be proven, you'll send an L1 transaction to prove that the withdrawal happened on L2. ```js const proveHash = await walletClientL1.proveWithdrawal(proveArgs) ``` - + ```js const proveReceipt = await publicClientL1.waitForTransactionReceipt({hash: proveHash}) ``` @@ -528,19 +527,18 @@ Now you're going to repeat the process in reverse to bridge some ETH from L2 to } } ``` -
+
## Important Considerations - - **Challenge Period**: The 7-day waiting period is crucial for security. - - **Gas Costs**: Withdrawals involve transactions on both L2 and L1, each incurring gas fees. - - **Private Key Handling**: Use secure key management practices in real applications. - - **RPC Endpoint Security**: Keep your Alchemy API key (or any RPC endpoint) secure. + * **Challenge Period**: The 7-day waiting period is crucial for security. + * **Gas Costs**: Withdrawals involve transactions on both L2 and L1, each incurring gas fees. + * **Private Key Handling**: Use secure key management practices in real applications. + * **RPC Endpoint Security**: Keep your Alchemy API key (or any RPC endpoint) secure. - ## Next Steps * Develop a user interface for easier interaction with these bridging functions. From 933f4228276581d4cc43551813bee16e5b3da29d Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Thu, 26 Sep 2024 12:20:52 +0100 Subject: [PATCH 051/565] Added notice page for deprecation and banner --- pages/builders/notices/_meta.json | 3 +- pages/builders/notices/sdk-deprecation.mdx | 66 ++++++++++++++++++++++ theme.config.tsx | 8 +++ 3 files changed, 76 insertions(+), 1 deletion(-) create mode 100644 pages/builders/notices/sdk-deprecation.mdx diff --git a/pages/builders/notices/_meta.json b/pages/builders/notices/_meta.json index 0b387da16..c52a90569 100644 --- a/pages/builders/notices/_meta.json +++ b/pages/builders/notices/_meta.json @@ -1,4 +1,5 @@ { "granite-changes": "Preparing for Granite Breaking Changes", - "fp-changes": "Preparing for Fault Proofs Breaking Changes" + "fp-changes": "Preparing for Fault Proofs Breaking Changes", + "sdk-deprecation": "Preparing for Optimism SDK deprecation" } diff --git a/pages/builders/notices/sdk-deprecation.mdx b/pages/builders/notices/sdk-deprecation.mdx new file mode 100644 index 000000000..ab5d7a689 --- /dev/null +++ b/pages/builders/notices/sdk-deprecation.mdx @@ -0,0 +1,66 @@ +--- +title: Deprecation of the Optimism SDK +description: This page outlines the details of the Optimism SDK deprecation and guides developers to migrate to using `viem/opstack` library. +--- + +## Preparing for Optimism SDK deprecation + +The Optimism SDK will officially be deprecated on **\[insert deprecation date]**. We are shifting to the `viem/opstack` library for a more modern, efficient, and flexible development experience. This change affects all tutorials and resources that previously relied on the Optimism SDK, and we have updated relevant documentation accordingly. + +### Breaking Changes to Expect + +The migration from the Optimism SDK to `viem`/`opstack` brings several breaking changes: + +* **Transaction estimation**: Methods for estimating gas fees will now leverage `viem` APIs. +* **Bridging**: All token bridging actions must be updated to use the `opstack` bridging methods. +* **Cross-chain communication**: `opstack` simplifies the cross-domain messaging functionality. +* **SDK method removal**: All deprecated SDK methods will be unavailable after \[insert deprecation date]. + +We strongly encourage developers and users to transition to `viem/opstack` before the deprecation date to avoid disruptions. + +### Updated Tutorials + +The following tutorials have been updated to use `viem/opstack` library: + +* [Estimating Transaction Costs on OP Mainnet](../tutorials/transaction-cost-estimation)\ + Estimation of transaction costs now uses the `viem` gas estimation utilities. + +* [Triggering OP Mainnet Transactions from Ethereum](../tutorials/trigger-op-transactions)\ + Learn how to trigger transactions using `viem` to interact with the OP Mainnet. + +* [Tracing Deposits and Withdrawals](../tutorials/tracing-deposits-withdrawals)\ + The tracing functionalities have been adapted to use `opstack` for efficient results. + +* [Viewing Deposits and Withdrawals by Address](../tutorials/view-deposits-withdrawals)\ + This tutorial outlines updated methods in `viem` for querying deposits and withdrawals by address. + +* [Bridging Your Standard ERC-20 Token Using the Standard Bridge](../tutorials/bridge-standard-erc20)\ + The standard bridge tutorial now uses `opstack` for token transfers between Ethereum and OP Mainnet. + +* [Bridging Your Custom ERC-20 Token Using the Standard Bridge](../tutorials/bridge-custom-erc20)\ + Custom ERC-20 tokens can now be bridged via `opstack`, making the process more streamlined. + +* [Bridging ERC-20 Tokens to OP Mainnet With the Optimism SDK](../tutorials/bridge-sdk-erc20)\ + **Deprecated** – please use [Bridging Your Custom ERC-20 Token Using the Standard Bridge](../tutorials/bridge-custom-erc20). + +* [Bridging ETH to OP Mainnet With the Optimism SDK](../tutorials/bridge-sdk-eth)\ + **Deprecated** – please use [Estimating Transaction Costs on OP Mainnet](../tutorials/transaction-cost-estimation). + +* [Communicating Between OP Mainnet and Ethereum in Solidity](../tutorials/cross-chain-solidity)\ + Cross-chain communication now leverages `opstack` for all messaging. + +### For App Developers + +If your application currently depends on the Optimism SDK, you will need to migrate to using the `viem/opstack` library. Our tutorials have been updated to reflect these changes, and it is critical to update your applications before the deprecation date to maintain compatibility. + +### For Chain Operators + +Chain operators utilizing the SDK for cross-chain operations, bridging, or other functions should switch to the `viem/opstack`. The `viem/opstack` library offer more efficient methods to handle these operations. + +### For Node Operators + +Node operators will need to ensure that any scripts or services relying on the Optimism SDK are updated to use `viem/opstack` library. These updates will help align with future improvements and scalability efforts across the OP Stack. + +*** + +For further assistance or questions about this migration, feel free to reach out via the [community forum](https://community.optimism.io/) or [join our developer Slack](#). diff --git a/theme.config.tsx b/theme.config.tsx index a4b8adcca..b720e1a0e 100644 --- a/theme.config.tsx +++ b/theme.config.tsx @@ -28,6 +28,14 @@ const config: DocsThemeConfig = { ), darkMode: true, + banner: { + key: 'viem/op-stack', + text: ( +
+ 🎉 We are deprecating the Optimism SDK and migrating all tutorials to use viem/op-stack. Read more → + + ) + }, search: { component: Search, }, From 138050284dcf0c56a8fc8bdf582b901b4bd387bd Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Thu, 26 Sep 2024 12:38:05 +0100 Subject: [PATCH 052/565] updated docs --- pages/builders/notices/sdk-deprecation.mdx | 52 ++++++++++++++++++---- words.txt | 1 + 2 files changed, 44 insertions(+), 9 deletions(-) diff --git a/pages/builders/notices/sdk-deprecation.mdx b/pages/builders/notices/sdk-deprecation.mdx index ab5d7a689..459addbbf 100644 --- a/pages/builders/notices/sdk-deprecation.mdx +++ b/pages/builders/notices/sdk-deprecation.mdx @@ -9,18 +9,18 @@ The Optimism SDK will officially be deprecated on **\[insert deprecation date]** ### Breaking Changes to Expect -The migration from the Optimism SDK to `viem`/`opstack` brings several breaking changes: +The migration from the Optimism SDK to `viem/opstack` library brings several breaking changes: * **Transaction estimation**: Methods for estimating gas fees will now leverage `viem` APIs. -* **Bridging**: All token bridging actions must be updated to use the `opstack` bridging methods. -* **Cross-chain communication**: `opstack` simplifies the cross-domain messaging functionality. +* **Bridging**: All token bridging actions must be updated to use the `viem/opstack` library bridging methods. +* **Cross-chain communication**: `viem/opstack` library simplifies the cross-domain messaging functionality. * **SDK method removal**: All deprecated SDK methods will be unavailable after \[insert deprecation date]. We strongly encourage developers and users to transition to `viem/opstack` before the deprecation date to avoid disruptions. ### Updated Tutorials -The following tutorials have been updated to use `viem/opstack` library: +We've updated our tutorials and documentation to use `viem/opstack` library. Below, you'll find links to the updated versions of popular tutorials: * [Estimating Transaction Costs on OP Mainnet](../tutorials/transaction-cost-estimation)\ Estimation of transaction costs now uses the `viem` gas estimation utilities. @@ -51,16 +51,50 @@ The following tutorials have been updated to use `viem/opstack` library: ### For App Developers -If your application currently depends on the Optimism SDK, you will need to migrate to using the `viem/opstack` library. Our tutorials have been updated to reflect these changes, and it is critical to update your applications before the deprecation date to maintain compatibility. +If your application currently depends on the Optimism SDK, you will need to migrate to using the `viem/opstack` library. +Our tutorials have been updated to reflect these changes, and it is critical to update your applications before the deprecation date to maintain compatibility. + +Here are some key points to consider: + +Install new dependencies: Replace the Optimism SDK with `viem/opstack` in your project. + +```bash + pnpm remove @eth-optimism/sdk + npm install viem +``` + +* Update imports: Replace Optimism SDK imports with `viem/opstack` imports. +* Migrate SDK methods: Refactor your code to use equivalent `viem/opstack` methods. Refer to the viem documentation and opstack documentation for guidance. +* Test thoroughly: After migration, extensively test your application to ensure all functionality works as expected. ### For Chain Operators -Chain operators utilizing the SDK for cross-chain operations, bridging, or other functions should switch to the `viem/opstack`. The `viem/opstack` library offer more efficient methods to handle these operations. +Chain operators utilizing the SDK for cross-chain operations, bridging, or other functions should switch to the `viem/opstack`. +The `viem/opstack` library offer more efficient methods to handle these operations. + +Chain operators should be aware of the following: + +* SDK removal: Remove any dependencies on the Optimism SDK in your infrastructure. +* Update tooling: Ensure all tools and scripts are updated to use `viem/opstack`. +* Monitor performance: After migration, closely monitor your chain's performance to ensure smooth operation. ### For Node Operators -Node operators will need to ensure that any scripts or services relying on the Optimism SDK are updated to use `viem/opstack` library. These updates will help align with future improvements and scalability efforts across the OP Stack. +Node operators will need to ensure that any scripts or services relying on the Optimism SDK are updated to use `viem/opstack` library. +These updates will help align with future improvements and scalability efforts across the OP Stack. + +Node operators should take the following steps: + +* Update node software: Ensure your node software is compatible with the latest `viem/opstack` libraries. +* Review configuration: Check and update any configuration files that may reference the Optimism SDK. +* Test thoroughly: Perform comprehensive testing in a staging environment before updating production nodes. + +### Need Help? -*** +For further assistance or questions about this migration, feel free to reach out via the -For further assistance or questions about this migration, feel free to reach out via the [community forum](https://community.optimism.io/) or [join our developer Slack](#). +* [Community forum](https://community.optimism.io/) or +* [Join our developer Slack](#). +* Join our [Discord](#) for community support +* Open an [issue on our GitHub repository](#) +* Check our [FAQ](#) for common questions and answers diff --git a/words.txt b/words.txt index 90467007b..3fde99f89 100644 --- a/words.txt +++ b/words.txt @@ -230,6 +230,7 @@ offchain Openfort oplabs opnode's +opstack Opti pausable pcscdpath From 27d78480cea55c1cc3a32a0977228e957f742dae Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Thu, 26 Sep 2024 14:20:00 +0100 Subject: [PATCH 053/565] updated codebase --- .../tutorials/cross-dom-bridge-eth.mdx | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx b/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx index 4c4514787..0e1cf2296 100644 --- a/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx +++ b/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx @@ -257,14 +257,14 @@ Now that you have some ETH on L1 you can deposit that ETH into the `L1StandardBr // Create L1 public client for reading from the Sepolia network const publicClientL1 = createPublicClient({ chain: sepolia, - transport: http(), + transport: http(process.env.L1_RPC_URL), }); // Create L1 wallet client for sending transactions on Sepolia const walletClientL1 = createWalletClient({ account, chain: sepolia, - transport: http(), + transport: http(process.env.L1_RPC_URL), }).extend(walletActionsL1()); // Create L2 public client for interacting with OP Sepolia @@ -452,27 +452,27 @@ Now you're going to repeat the process in reverse to bridge some ETH from L2 to // Create L1 public client for reading from the Sepolia network const publicClientL1 = createPublicClient({ chain: sepolia, - transport: http(), + transport: http(process.env.L1_RPC_URL), }); // Create L1 wallet client for sending transactions on Sepolia const walletClientL1 = createWalletClient({ account, chain: sepolia, - transport: http(), + transport: http(process.env.L1_RPC_URL), }).extend(walletActionsL1()); // Create L2 public client for interacting with OP Sepolia const publicClientL2 = createPublicClient({ chain: optimismSepolia, - transport: http(process.env.L1_RPC_URL), + transport: http(process.env.L2_RPC_URL), }).extend(publicActionsL2()); // Create L2 wallet client for sending transactions on OP Sepolia const walletClientL2 = createWalletClient({ account, chain: optimismSepolia, - transport: http(process.env.L1_RPC_URL), + transport: http(process.env.L2_RPC_URL), }).extend(walletActionsL2()); async function withdrawETH(amount) { From 12a02e373f2ea4bec5faa2ae26196f45dd96b410 Mon Sep 17 00:00:00 2001 From: Bradley Camacho <42678939+bradleycamacho@users.noreply.github.com> Date: Thu, 26 Sep 2024 09:30:31 -0700 Subject: [PATCH 054/565] Make ETH and ERC-20 transfer clarification --- pages/stack/protocol/interop/explainer.mdx | 1 + 1 file changed, 1 insertion(+) diff --git a/pages/stack/protocol/interop/explainer.mdx b/pages/stack/protocol/interop/explainer.mdx index 31964d896..34300c465 100644 --- a/pages/stack/protocol/interop/explainer.mdx +++ b/pages/stack/protocol/interop/explainer.mdx @@ -19,6 +19,7 @@ Native OP Stack interoperability provides the ability to read messages and trans * lower fees and lower latency * less fragmentation across the Superchain * improved user experience for developers on the Superchain +* secure transfer of ETH and ERC-20s across L2s ## Secure Message Passing Superchain interop includes both the protocol layer message passing and the Superchain ERC20 token specification. From 8eec269204a31788fa08c2bd7f0c494ab2467540 Mon Sep 17 00:00:00 2001 From: DannyThomx Date: Thu, 26 Sep 2024 18:55:53 +0200 Subject: [PATCH 055/565] implemented calculator functionality --- components/calculator/ChainParametersForm.tsx | 150 +++++++-- components/calculator/Loader.tsx | 66 ++++ components/calculator/ResultsTable.tsx | 134 +++++--- styles/calculator.css | 8 + utils/calculator-helpers.ts | 307 ++++-------------- 5 files changed, 361 insertions(+), 304 deletions(-) create mode 100644 components/calculator/Loader.tsx diff --git a/components/calculator/ChainParametersForm.tsx b/components/calculator/ChainParametersForm.tsx index 1c81a3b69..04c7d0d35 100644 --- a/components/calculator/ChainParametersForm.tsx +++ b/components/calculator/ChainParametersForm.tsx @@ -1,12 +1,21 @@ import type { ReactElement } from "react"; import { useState } from "react"; -import { TextInput, SelectInput, CheckboxInput } from "./Inputs"; -import { ResultsTable } from "./ResultsTable"; +import { TextInput, SelectInput } from "./Inputs"; +import { ResultsParams, ResultsTable } from "./ResultsTable"; import { displayL1BaseFeeScalar, displayL1BlobBaseFeeScalar, - calculateTotalAltDAPlasmaModeCommitmentCostsInETH, + calculateOverallL1DataAndStateCostsMargin, + calculateModeledDAPlusStateRevenueOnL2, + calculateTotalL1StateProposalCostsInETH, + determineDAInUse, + calculateImpliedDataGasFeePerTxUsingBlobs, + calculateImpliedDataGasFeePerTxUsingL1Calldata, + calculateImpliedDataGasFeePerTxUsingAltDAPlasmaMode, + resultsFeeScalarsAssumed, + impliedDataGasFee } from "@/utils/calculator-helpers"; +import { Loader } from "./Loader"; type ComparableTransactionType = "Base" | "Zora" | "Mint" | "Mode"; type DataAvailabilityType = "Ethereum" | "AltDA Plasma Mode"; @@ -22,6 +31,9 @@ export function ChainParametersForm(): ReactElement { const [maxChannelDuration, setMaxChannelDuration] = useState(5); const [outputRootPostFrequency, setOutputRootPostFrequency] = useState(1 ); const [isIncludeOutputRootCosts, setIsIncludeOutputRootCosts] = useState("yes"); + const [resultsParams, setResultsParams] = useState({}); + const [isLoading, setIsLoading] = useState(false); + const [showResult, setShowResult] = useState(false); const comparableTransactionTypeOptions = [ "General OP Mainnet", @@ -33,22 +45,13 @@ export function ChainParametersForm(): ReactElement { const dataAvailabilityTypeOptions = ["Ethereum", "AltDA Plasma Mode"]; const booleanOptions = ["Yes", "No"]; - const handleCalculateFee = async () => { - // const result = await displayL1BaseFeeScalar( - // stringToBoolean(isIncludeOutputRootCosts), - // stringToBoolean(isFaultProofEnabled), - // outputRootPostFrequency, - // transactionsPerDay, - // maxChannelDuration, - // comparableTransactionType, - // dataAvailabilityType, - // targetDataFeeMargin - // ); - }; - const handleSubmit = async (e: any) => { e.preventDefault(); - const result = await displayL1BlobBaseFeeScalar( + setIsLoading(true); + setShowResult(false) + + //e37 + const l1BlobBaseFeeScalar = await displayL1BlobBaseFeeScalar( stringToBoolean(isIncludeOutputRootCosts), stringToBoolean(isFaultProofEnabled), outputRootPostFrequency, @@ -59,7 +62,8 @@ export function ChainParametersForm(): ReactElement { targetDataFeeMargin ); - const result2 = await displayL1BaseFeeScalar( + //e38 + const l1BaseFeeScalar = await displayL1BaseFeeScalar( isIncludeOutputRootCosts, isFaultProofEnabled, outputRootPostFrequency, @@ -69,19 +73,108 @@ export function ChainParametersForm(): ReactElement { targetDataFeeMargin, dataAvailabilityType ); - const res = await calculateTotalAltDAPlasmaModeCommitmentCostsInETH ( - transactionsPerDay, - maxChannelDuration, - comparableTransactionType - ) - console.log("RESULT5:::e37", result); - console.log("RESULT5:::e38", result2); - console.log("RESULT6:::", res); + // e58 + const overallL1DataAndStateCostsMargin = + await calculateOverallL1DataAndStateCostsMargin( + transactionsPerDay, + comparableTransactionType, + l1BlobBaseFeeScalar, + l1BaseFeeScalar, + dataAvailabilityType, + maxChannelDuration, + outputRootPostFrequency, + isFaultProofEnabled + ); + + //e56 + const totalL1StateProposalCostsInETH = + await calculateTotalL1StateProposalCostsInETH( + outputRootPostFrequency, + isFaultProofEnabled + ); + + // e118 + const modeledDAPlusStateRevenueOnL2 = + await calculateModeledDAPlusStateRevenueOnL2( + transactionsPerDay, + comparableTransactionType, + l1BlobBaseFeeScalar, + l1BaseFeeScalar + ); + + // e64 + const impliedDataGasFeePerTxUsingBlobs = + await calculateImpliedDataGasFeePerTxUsingBlobs( + isIncludeOutputRootCosts, + isFaultProofEnabled, + outputRootPostFrequency, + transactionsPerDay, + maxChannelDuration, + comparableTransactionType, + dataAvailabilityType, + targetDataFeeMargin + ); + + // e67 + const impliedDataGasFeePerTxUsingL1Calldata = + await calculateImpliedDataGasFeePerTxUsingL1Calldata( + isIncludeOutputRootCosts, + isFaultProofEnabled, + outputRootPostFrequency, + transactionsPerDay, + maxChannelDuration, + comparableTransactionType, + dataAvailabilityType, + targetDataFeeMargin + ); + + // e66 + const impliedDataGasFeePerTxUsingAltDAPlasmaMode = + await calculateImpliedDataGasFeePerTxUsingAltDAPlasmaMode( + isIncludeOutputRootCosts, + isFaultProofEnabled, + outputRootPostFrequency, + transactionsPerDay, + maxChannelDuration, + comparableTransactionType, + dataAvailabilityType, + targetDataFeeMargin + ); + + const dataAvailabilityInUse = determineDAInUse(dataAvailabilityType); + + const assumedFeeScalarMessage = resultsFeeScalarsAssumed( + comparableTransactionType, // e15 + transactionsPerDay, // e14 + dataAvailabilityType, // E16 + targetDataFeeMargin, // E18 + isIncludeOutputRootCosts, // E24 + maxChannelDuration // E22 + ); + const impliedDataGasFeeMessage = await impliedDataGasFee(dataAvailabilityType) + + const data = { + dataAvailabilityType, // e16 + l1BlobBaseFeeScalar, // e37 + l1BaseFeeScalar, // e38 + overallL1DataAndStateCostsMargin, // e58 + totalL1StateProposalCostsInETH, // e56 + modeledDAPlusStateRevenueOnL2, // e118 + dataAvailabilityInUse, // F35 + impliedDataGasFeePerTxUsingBlobs, // e64 + impliedDataGasFeePerTxUsingL1Calldata, // e67 + impliedDataGasFeePerTxUsingAltDAPlasmaMode, // e66 + assumedFeeScalarMessage, + impliedDataGasFeeMessage, + }; + setResultsParams(data); + setIsLoading(false); + setShowResult(true) }; const stringToBoolean = (value: string): boolean => { - return value === "yes" ? true : false + return value === "yes" || value === "Yes" ? true : false; } return ( @@ -179,7 +272,8 @@ export function ChainParametersForm(): ReactElement { Calculate - + {isLoading && } + {!isLoading && showResult && }
); } diff --git a/components/calculator/Loader.tsx b/components/calculator/Loader.tsx new file mode 100644 index 000000000..d437554b9 --- /dev/null +++ b/components/calculator/Loader.tsx @@ -0,0 +1,66 @@ +import React from "react"; + +export const Loader: React.FC = () => { + return ( +
+ + + + + + + + + + + +
+ ); + } + +Loader.displayName = "Loader"; diff --git a/components/calculator/ResultsTable.tsx b/components/calculator/ResultsTable.tsx index 259be2dc0..07c4d812b 100644 --- a/components/calculator/ResultsTable.tsx +++ b/components/calculator/ResultsTable.tsx @@ -1,36 +1,97 @@ +import { convertToMillionUnits } from "@/utils/calculator-helpers"; import type { ReactElement } from "react"; -// import { useState } from "react"; -// import { TextInput, SelectInput, CheckboxInput } from "./Inputs"; -// type Props = { -// isStateEnabled: boolean; -// isFaultProofsEnabled: boolean; -// outputRootPostFrequency: number; -// transactionsPerDay: number; -// maxChannelDuration: number; -// comparableTxnType: string; -// targetDataMargin: number; -// dataAvailabilityType: string; -// }; -// export function ResultsTable({ -// isStateEnabled, -// isFaultProofsEnabled, -// outputRootPostFrequency, -// transactionsPerDay, -// targetDataMargin, -// dataAvailabilityType -// }: Props): ReactElement { -export function ResultsTable(): ReactElement { - let var1, var2, var3 +export type ResultsParams = { + data: { + dataAvailabilityType: string; // e16 + l1BlobBaseFeeScalar: number; // e37 + l1BaseFeeScalar: number; // e38 + overallL1DataAndStateCostsMargin: number; // e58 + totalL1StateProposalCostsInETH: number; // e56 + modeledDAPlusStateRevenueOnL2: number; // e118 + dataAvailabilityInUse: string; // f35 + impliedDataGasFeePerTxUsingBlobs: number; // e64 + impliedDataGasFeePerTxUsingL1Calldata: number; // e67 + impliedDataGasFeePerTxUsingAltDAPlasmaMode: number; // e66, + assumedFeeScalarMessage: string; + impliedDataGasFeeMessage: string; + }; +}; + +export function ResultsTable({ + data +}: ResultsParams): ReactElement { + + const { + dataAvailabilityType, + l1BlobBaseFeeScalar, + l1BaseFeeScalar, + overallL1DataAndStateCostsMargin, + totalL1StateProposalCostsInETH, + modeledDAPlusStateRevenueOnL2, + dataAvailabilityInUse, + impliedDataGasFeePerTxUsingBlobs, + impliedDataGasFeePerTxUsingAltDAPlasmaMode, + impliedDataGasFeePerTxUsingL1Calldata, + assumedFeeScalarMessage, + impliedDataGasFeeMessage, + } = data; + + function calculateConstructionMessage( + _overallL1DataAndStateCostsMargin: number, // Corresponds to E58 + _totalL1StateProposalCostsInETH: number, // Corresponds to E56 + _modeledDAPlusStateRevenueOnL2: number // Corresponds to E118 + ): string { + const roundedE58IfNegative = + Math.round(_overallL1DataAndStateCostsMargin * -1000) / 1000; + const roundedE56 = + Math.round(_totalL1StateProposalCostsInETH * 1000) / 1000; + const roundedE58IfPositive = + Math.round(_overallL1DataAndStateCostsMargin * 1000) / 1000; + const marginPercentage = + Math.round(100 * (_overallL1DataAndStateCostsMargin / _modeledDAPlusStateRevenueOnL2) * 10) / 10; + const messageIfE58Negative = `This construction has ${roundedE58IfNegative} ETH / day of estimated State Output root costs, not covered by Data Margin (${roundedE56} ETH Total Output Root Cost / Day) at inputted Blob/L1 Gas Prices.`; + const messageIfE58Positive = `This construction is expected to have +${roundedE58IfPositive} ETH Margin on Data Costs (${marginPercentage}% Margin) at inputted L1 Gas Prices.`; + return _overallL1DataAndStateCostsMargin < 0 ? messageIfE58Negative : messageIfE58Positive + } + + function calculateDataGasFee( + _dataAvailabilityType: string, // Corresponds to E16 + _dataAvailabilityInUse: string, // Corresponds to F35 + _impliedDataGasFeePerTxUsingAltDAPlasmaMode: number, // Corresponds to E66 + _impliedDataGasFeePerTxUsingBlobs: number, // Corresponds to E64 + _impliedDataGasFeePerTxUsingL1Calldata: number // Corresponds to E67 + ): string { + let gasFee: number; + _dataAvailabilityType === "AltDA Plasma Mode" + ? (gasFee = _impliedDataGasFeePerTxUsingAltDAPlasmaMode) + : _dataAvailabilityInUse === "EIP-4844" + ? (gasFee = _impliedDataGasFeePerTxUsingBlobs) + : (gasFee = _impliedDataGasFeePerTxUsingL1Calldata); + + // Round the gas fee to 4 decimal places + const roundedGasFee = Math.round(gasFee * 10000) / 10000; + return `Implied Data Gas Fee per User Transaction: $${roundedGasFee}`; + } + return (

- This construction is expected to have +0.006 ETH Margin - on Data Costs (5% Margin) at inputted L1 Gas Prices{" "} + {calculateConstructionMessage( + overallL1DataAndStateCostsMargin, + totalL1StateProposalCostsInETH, + modeledDAPlusStateRevenueOnL2 + )}

- Implied Data Gas Fee per User Transaction: $0.0006{" "} + {calculateDataGasFee( + dataAvailabilityType, + dataAvailabilityInUse, + impliedDataGasFeePerTxUsingAltDAPlasmaMode, + impliedDataGasFeePerTxUsingBlobs, + impliedDataGasFeePerTxUsingL1Calldata + )}

@@ -61,7 +122,11 @@ export function ResultsTable(): ReactElement { DA Recommendation: - Blobs (EIP-4844) + {`${ + dataAvailabilityInUse === "EIP-4844" + ? `Blobs (EIP-4844)` + : dataAvailabilityInUse + }`} Scalar Type @@ -72,13 +137,13 @@ export function ResultsTable(): ReactElement { l1BlobBaseBaseScalar - 810831 - 0.810831 + {l1BlobBaseFeeScalar} + {convertToMillionUnits(l1BlobBaseFeeScalar)} l1BaseFeeScalar - 4244 - 0.004244 + {l1BaseFeeScalar} + {convertToMillionUnits(l1BaseFeeScalar)} @@ -90,15 +155,10 @@ export function ResultsTable(): ReactElement {

- Fees Scalars Assume: - 100% Blob Fullness and 5 Blobs per L1 Tx (Avg), - Target a 5% Margin on DA and State, 5 hour Max Submission Window. + {assumedFeeScalarMessage}

- Implied Data Gas Fee Assumes:{" "} - - 0 gwei Blobgas Base Fee, 7.2 gwei L1 Base Fee, 2370 ETH/USD - + {impliedDataGasFeeMessage}

diff --git a/styles/calculator.css b/styles/calculator.css index 153c1e1ad..eee6440db 100644 --- a/styles/calculator.css +++ b/styles/calculator.css @@ -198,3 +198,11 @@ div.calculator-results-wrap .results-container{ padding: 40px 30px 50px; } +.loader-container { + display: flex; + justify-content: center; + width: 100%; +} +.loader-container svg { + width: 40px; +} \ No newline at end of file diff --git a/utils/calculator-helpers.ts b/utils/calculator-helpers.ts index 2a033ac8e..be683809b 100644 --- a/utils/calculator-helpers.ts +++ b/utils/calculator-helpers.ts @@ -7,58 +7,18 @@ const ethToUsdRate = const blobBaseFee = "https://static.optimism.io/op-analytics/reference_data/market_data/outputs/blob_base_fee.txt"; // E78 -function calculateConstructionState( - stateOutputRootCostPerDay: number, // E58: number, - totalOutputRootCost: number, // E56: number, - totalExpectedMargin: number // E118: number -): string { - if (stateOutputRootCostPerDay < 0) { - return `This construction has ${ - Math.round(stateOutputRootCostPerDay * -1 * 1000) / 1000 - } ETH / day of estimated State Output root costs, not covered by Data Margin (${ - Math.round(totalOutputRootCost * 1000) / 1000 - } ETH Total Output Root Cost / Day) at inputted Blob/L1 Gas Prices`; - } else { - return `This construction is expected to have +${ - Math.round(stateOutputRootCostPerDay * 1000) / 1000 - } ETH Margin on Data Costs (${ - Math.round(100 * (stateOutputRootCostPerDay / totalExpectedMargin) * 10) / - 10 - }% Margin) at inputted L1 Gas Prices`; - } -} // output = C27 - -function calculateImpliedDataGasFee( - dataAvailabilityType: string, // E16: string - altDAPlasmaModeFee: number, // E66: number - blobDataFee: number, // E64: number - l1CalldataFee: number // E67: number -): string { - const fee = - dataAvailabilityType === "AltDA Plasma Mode" - ? altDAPlasmaModeFee - : blobDataFee > l1CalldataFee - ? blobDataFee - : l1CalldataFee; - return `Implied Data Gas Fee per User Transaction: $${ - Math.round(fee * 10000) / 10000 - }`; -} // output = C28 +// transactionsPerDay === E14: number +// comparableTxnType === E15: string +// dataAvailabilityType === E16: string +// isFaultProofsEnabled === E17: boolean +// targetDataMargin === E18: number +// maxChannelDuration === E22: number +// outputRootPostFrequency === E23: number +// isStateEnabled: boolean, === E24: string -function determineTransactionType( - dataAvailabilityType: string, // E16: string, - impliedDataGasFeePerTxUsingBlobs: number, // E64: number, - impliedDataGasFeePerTxUsingL1Calldata: number // E67: number -): string { - if (dataAvailabilityType === "AltDA Plasma Mode") { - return "AltDA Plasma Mode"; - } else { - return impliedDataGasFeePerTxUsingBlobs > - impliedDataGasFeePerTxUsingL1Calldata - ? "L1 Calldata" - : "EIP-4844"; - } -} // output = F35 +// ModeledExpectedStateCostsOnL1: number === e120 == n40 == e56 +// ModeledDACostsOnL1: number === e119 == e55 +// ModeledDAPlusStateRevenueOnL2: number === e118 function calculateBlobTransactionCost( dataAvailabilityType: string, // E16: string @@ -75,28 +35,6 @@ function calculateBlobTransactionCost( : blobCost; } // output = E37 -function summarizeFeeScalars( - dataAvailabilityType: string, // E16: string - blobFullnessPercentage: number, // N25: number - blobsPerL1Transaction: number, // N26: number - targetDataMargin: number, // E18: number - isStateEnabled: string, // E24: string - maxChannelDuration: number // E22: number -): string { - const mode = - dataAvailabilityType === "AltDA Plasma Mode" - ? "AltDA Plasma Mode, " - : `${Math.round(blobFullnessPercentage * 100)}% Blob Fullness and ${ - Math.round(blobsPerL1Transaction * 10) / 10 - } Blobs per L1 Tx (Avg), `; - const state = isStateEnabled === "Yes" ? " & State" : ""; - return `Fee Scalars Assume: ${mode}Target a ${Math.round( - targetDataMargin * 100 - )}% Margin on DA${state}, ${ - Math.round(maxChannelDuration * 100000) / 100000 - } hour Max Submission Window.`; -} // output = G41 - function calculateAltDAOrL1TransactionCost( dataAvailabilityType: string, //E16 altDAPlasmaModeCost: number, // F98 @@ -112,34 +50,45 @@ function calculateAltDAOrL1TransactionCost( } } // output = E38 -function resultsRowOneScalars( +export function resultsFeeScalarsAssumed( + comparableTxnType: string, // e15 + transactionsPerDay: number, // e14 dataAvailabilityType: string, // E16 - blobFullnessPercentage: number, // Advanced Inputs - N25 - blobsPerL1Transaction: number, // Advanced Inputs - N26 targetDataMargin: number, // E18 isStateEnabled: string, // E24 maxChannelDuration: number // E22 ): string { + const n25: number = calculateBlobLevelImpliedBlobFullness( + comparableTxnType, + transactionsPerDay, + maxChannelDuration + ) // n25 + + const n26: number = calculateImpliedBlobsPerL1Tx( + comparableTxnType, + transactionsPerDay, + maxChannelDuration + ); // n26 const mode = dataAvailabilityType === "AltDA Plasma Mode" ? "AltDA Plasma Mode, " - : `${Math.round(blobFullnessPercentage * 100)}% Blob Fullness and ${ - Math.round(blobsPerL1Transaction * 10) / 10 + : `${Math.round(n25 * 100)}% Blob Fullness and ${ + Math.round(n26 * 10) / 10 } Blobs per L1 Tx (Avg), `; const state = isStateEnabled === "Yes" ? " & State" : ""; return `Fee Scalars Assume: ${mode}Target a ${Math.round( - targetDataMargin * 100 + targetDataMargin )}% Margin on DA${state}, ${ Math.round(maxChannelDuration * 100000) / 100000 } hour Max Submission Window.`; } // output = G41 -function impliedDataGasFee( +export async function impliedDataGasFee( dataAvailabilityType: string, // E16 - blobgasBaseFee: number, // E78 - l1BaseFee: number, // E76 - ethToUsdRate: number // E77 -): string { +): Promise { + const blobgasBaseFee: number = await getBlobBaseFee()// E78 + const l1BaseFee: number = await getL1GasBaseFee(); // E76 + const ethToUsdRate: number = await getEthToUsdRate() // E77 const mode = dataAvailabilityType === "AltDA Plasma Mode" ? "AltDA Plasma Mode, " @@ -149,7 +98,7 @@ function impliedDataGasFee( } gwei L1 Base Fee, ${Math.round(ethToUsdRate)} ETH/USD`; } // output = G42 -function convertToMillionUnits(value: number): number { +export function convertToMillionUnits(value: number): number { return value / 1000000; } @@ -159,125 +108,7 @@ export async function getEthToUsdRate(): Promise { return parseFloat(rate); } -// transactionsPerDay === E14: number -// comparableTxnType === E15: string -// dataAvailabilityType === E16: string -// isFaultProofsEnabled === E17: boolean -// targetDataMargin === E18: number -// maxChannelDuration === E22: number -// outputRootPostFrequency === E23: number -// isStateEnabled: boolean, === E24: string - -// ModeledExpectedStateCostsOnL1: number === e120 = n40 == e56 -// ModeledDACostsOnL1: number === e119 = e55 -// ModeledDAPlusStateRevenueOnL2: number === e118 - -/** - * Advanced Input - - * - * C8 | AvgEstimatedSizePerTx - * check which comparableTxnType user selects - * get AvgEstimatedSizePerTx for choice from constants or api - * return AvgEstimatedSizePerTx value for C8 - * - * C10 | impliedCTSL1Data = - * (impliedBlobsPerDay * Total_Blobgas_Per_Blob) / (AvgEstimatedSizePerTx * transactionsPerDay[aka E14]) - * - * C11 | impliedCTSL1Gas - * (AvgEstimatedSizePerTx * transactionsPerDay * estimatedSize_CalldataGasRatio + (Avg_Compressed_Overhead_Gas_Per_Blob * impliedL1Txs)) / (AvgEstimatedSizePerTx * transactionsPerDay) - * - * C12 algorithm | estimatedSizeBlobgasRatio - * check which comparableTxnType user selects - * get estimatedSizeBlobgasRatio for choice from constants or api - * return estimatedSizeBlobgasRatio value for C12 - * - * - * C13 | estimatedSize_CalldataGasRatio - * =INDEX($A$20:$G$32,MATCH('Chain Estimator'!$E$15,$A$20:$A$32,0),MATCH($B13,$A$20:$G$20,0)) - * check which comparableTxnType user selects - * get estimatedSize_CalldataGasRatio for choice from constants or api - * return estimatedSize_CalldataGasRatio value for C13 - * - * - * N19 | impliedMinimumBlobsPerDay = - * 24/ maxChannelDuration - * - * - * N20 | impliedEstimatedSizePerBlob = - * (N5 - N10 - N6) * estimatedSizeBlobgasRatio - * - * - * N21 | impliedL2TxsPerBlob = - * min((impliedEstimatedSizePerBlob / AvgEstimatedSizePerTx), (transactionsPerDay / (24 / maxChannelDuration))) - * - * N22 | impliedBlobsPerDay - * transactionsPerDay / impliedL2TxsPerBlob - * - * N23 | impliedCalldataGasUsedIfL1 - * impliedEstimatedSizePerBlob * impliedBlobsPerDay * (C11 / 16) + (N11 * N22) - * - * N24 | L1TxLevelImpliedBlobFullness - * MIN(N9,(C8*'Chain Estimator'!E14)*('Chain Estimator'!E22/24)/N20) - * - * N25 | blobLevelImpliedBlobFullness - * (impliedL2TxsPerBlob * AvgEstimatedSizePerTx) / impliedEstimatedSizePerBlob - * - * N26 | impliedBlobsPerL1Tx - * ROUND(MAX(N24/1,1),0) - * round(max(L1TxLevelImpliedBlobFullness/1, 1), 0) - * - * N27 | impliedL1Txs - * impliedBlobsPerDay / impliedBlobsPerL1Tx - * - * N30 | totalBlobCommitmentL1Gas - * impliedL1Txs * L1_Gas_per_Blob_Commitment - * - * N31 | totalAltDAPlasmaModeCommitmentL1Gas - * impliedBlobsPerDay * L1_Gas_Per_AltDA_Plasma_Mode_Commitment - * - * N33 | impliedStateProposalsPerDay - * (outputRootPostFrequency === 0 ? 0 : 24) / outputRootPostFrequency - * - * N34 | totalStateProposalL1Gas - * impliedStateProposalsPerDay * (isFaultProofsEnabled ? Avg_Total_Gas_Used_Per_L1_Fault_Proof_State_Proposal : Avg_Total_Gas_Used_Per_L1_State_Proposal) - * - * N35 | totalStateProposalL1GasCoveredByUsers - * isStateEnabled ? 1 : 0 * totalStateProposalL1Gas - * - * - * E64 | impliedDataGasFeePerTx:::: Using Blobs (EIP-4844) - * =('Advanced Inputs'!C8*(16*F94*E76+E94*E78)/1000000/1000000000)*E77 - * ((AvgEstimatedSizePerTx * (16 * L1BaseFeeScalar * L1GasBaseFee * L1BlobBaseFeeScalar * blobBaseFee) / 1000000) / 1000000000) * ethToUsdRate - * - * E67 | impliedDataGasFeePerTx:::: Using L1calldata - * =('Advanced Inputs'!C8*(16*F96*E76+E96*E78)/1000000/1000000000)*E77 - * ((AvgEstimatedSizePerTx * (16 * L1BaseFeeScalar[L1Calldata] * L1GasBaseFee * L1BlobBaseFeeScalar[L1Calldata] * blobBaseFee) / 1000000) / 1000000000) * ethToUsdRate - * - * - * E94 | L1BlobBaseFeeScalar::: Using Blobs (EIP-4844) - * if blobs ? ROUND((('Advanced Inputs'!C10/'Advanced Inputs'!N25/(1-E18))*1000000),0) : 0 - * const res = (impliedCTSL1Data / blobLevelImpliedBlobFullness) / (1-targetDataMargin) - * Math.round(res * 1000000) - * - * E96 | L1BlobBaseFeeScalar:::: Using L1Calldata = 0 - * - * E98 | L1BlobBaseFeeScalar ::: Using AltDA Plasma Mode = 0 - * check if AltDA mode = 0 - * - * E76 | L1GasBaseFee - * - * F94 | L1BaseFeeScalar - * =ROUND(((('Advanced Inputs'!N30+'Advanced Inputs'!N35)/(E14*(16*'Advanced Inputs'!C8)))/(1-E18))*1000000,0) - * const res = (totalBlobCommitmentL1Gas + totalStateProposalL1GasCoveredByUsers)/ transactionsPerDay * (16 * AvgEstimatedSizePerTx) / (1 - targetDataMargin) - * Math.round(res * 1000000) - * - * F96 | L1BaseFeeScalar:::: Using L1Calldata - * =ROUND(((('Advanced Inputs'!C11/16)/(1-E18))*1000000),0) - * Math.round(((impliedCTSL1Gas / 16) / (1-targetDataMargin))* 1000000) - */ - -///////////////// CUSTOM HELPERS //////////////////////////// -const _determineDAInUse = (dataAvailabilityType: string): string => { +export const determineDAInUse = (dataAvailabilityType: string): string => { return dataAvailabilityType === "AltDA Plasma Mode" ? "AltDA Plasma Mode" : dataAvailabilityType === "L1 Calldata" @@ -286,14 +117,14 @@ const _determineDAInUse = (dataAvailabilityType: string): string => { }; // =INDEX($A$20:$G$32,MATCH('Chain Estimator'!$E$15,$A$20:$A$32,0),MATCH($B8,$A$20:$G$20,0)) -export const getAvgEstimatedSizePerTx = (comparableTxnType: string) => { +const getAvgEstimatedSizePerTx = (comparableTxnType: string) => { const output = transactionTypes[comparableTxnType].AvgEstimatedSizePerTx; console.log("c8::", output); return output; }; // c8 done // =(N22*N5)/(C8*'Chain Estimator'!E14) -export const calculateImpliedCTSL1Data = ( +const calculateImpliedCTSL1Data = ( transactionsPerDay: number, maxChannelDuration: number, comparableTxnType: string @@ -311,7 +142,7 @@ export const calculateImpliedCTSL1Data = ( }; // c10 done // =(C8*'Chain Estimator'!E14*C13 + N11*N27)/(C8*'Chain Estimator'!E14) -export const calculateImpliedCTSL1Gas = ( +const calculateImpliedCTSL1Gas = ( transactionsPerDay: number, maxChannelDuration: number, comparableTxnType: string @@ -332,13 +163,13 @@ export const calculateImpliedCTSL1Gas = ( }; // c11 done // =INDEX($A$20:$G$32,MATCH('Chain Estimator'!$E$15,$A$20:$A$32,0),MATCH($B12,$A$20:$G$20,0)) -export const getEstimatedSizeBlobgasRatio = (comparableTxnType: string) => { +const getEstimatedSizeBlobgasRatio = (comparableTxnType: string) => { const output = transactionTypes[comparableTxnType].EstimatedSizeBlobgasRatio; console.log("c12::", output); return output; }; // c12 done -export const getEstimatedSizeCalldataGasRatio = (comparableTxnType: string) => { +const getEstimatedSizeCalldataGasRatio = (comparableTxnType: string) => { const output = transactionTypes[comparableTxnType].EstimatedSizeCalldataGasRatio; console.log("c13::", output); @@ -355,7 +186,7 @@ const calculateImpliedMinimumBlobsPerDay = ( }; // n19 // =(N5-N10-N6)*C12 -export const calculateImpliedEstimatedSizePerBlob = ( +const calculateImpliedEstimatedSizePerBlob = ( comparableTxnType: string ): number => { const c12 = getEstimatedSizeBlobgasRatio(comparableTxnType); @@ -369,7 +200,7 @@ export const calculateImpliedEstimatedSizePerBlob = ( }; // n20 done // =MIN(N20/C8,'Chain Estimator'!E14/(24/'Chain Estimator'!E22)) -export const calculateImpliedL2TxsPerBlob = ( +const calculateImpliedL2TxsPerBlob = ( comparableTxnType: string, transactionsPerDay: number, maxChannelDuration: number @@ -384,7 +215,7 @@ export const calculateImpliedL2TxsPerBlob = ( }; // n21 done // ='Chain Estimator'!E14/N21 -export const calculateImpliedBlobsPerDay = ( +const calculateImpliedBlobsPerDay = ( transactionsPerDay: number, maxChannelDuration: number, comparableTxnType: string @@ -401,7 +232,7 @@ export const calculateImpliedBlobsPerDay = ( }; // n22 done // =N20*N22*(C11/16)+(N11*N22) -export const calculateImpliedCalldataGasUsedIfL1 = ( +const calculateImpliedCalldataGasUsedIfL1 = ( comparableTxnType: string, transactionsPerDay: number, maxChannelDuration: number @@ -424,7 +255,7 @@ export const calculateImpliedCalldataGasUsedIfL1 = ( }; // n23 done // =MIN(N9,(C8*'Chain Estimator'!E14)*('Chain Estimator'!E22/24)/N20) -export const calculateL1TxLevelImpliedBlobFullness = ( +const calculateL1TxLevelImpliedBlobFullness = ( comparableTxnType: string, transactionsPerDay: number, maxChannelDuration: number @@ -438,7 +269,7 @@ export const calculateL1TxLevelImpliedBlobFullness = ( }; // n24 done // =(N21*C8)/N20 -export const calculateBlobLevelImpliedBlobFullness = ( +const calculateBlobLevelImpliedBlobFullness = ( comparableTxnType: string, transactionsPerDay: number, maxChannelDuration: number @@ -456,7 +287,7 @@ export const calculateBlobLevelImpliedBlobFullness = ( }; // n25 done // =ROUND(MAX(N24/1,1),0) -export const calculateImpliedBlobsPerL1Tx = ( +const calculateImpliedBlobsPerL1Tx = ( comparableTxnType: string, transactionsPerDay: number, maxChannelDuration: number @@ -473,7 +304,7 @@ export const calculateImpliedBlobsPerL1Tx = ( }; // n26 done // =N22/N26 -export const calculateImpliedL1Txs = ( +const calculateImpliedL1Txs = ( transactionsPerDay: number, maxChannelDuration: number, comparableTxnType: string @@ -494,7 +325,7 @@ export const calculateImpliedL1Txs = ( }; // n27 done // =N27*N7 -export const calculateTotalBlobCommitmentL1Gas = ( +const calculateTotalBlobCommitmentL1Gas = ( transactionsPerDay: number, maxChannelDuration: number, comparableTxnType: string @@ -510,7 +341,7 @@ export const calculateTotalBlobCommitmentL1Gas = ( }; // n30 done // =N22*N8 -export const calculateTotalAltDAPlasmaModeCommitmentL1Gas = ( +const calculateTotalAltDAPlasmaModeCommitmentL1Gas = ( transactionsPerDay: number, maxChannelDuration: number, comparableTxnType: string @@ -526,7 +357,7 @@ export const calculateTotalAltDAPlasmaModeCommitmentL1Gas = ( }; // n31 done // N22 * N5 -export const calculateTotalBlobgas = ( +const calculateTotalBlobgas = ( transactionsPerDay: number, maxChannelDuration: number, comparableTxnType: string @@ -542,7 +373,7 @@ export const calculateTotalBlobgas = ( }; // n32 // =IF('Chain Estimator'!E23=0,0,24/'Chain Estimator'!E23) -export const calculateImpliedStateProposalsPerDay = ( +const calculateImpliedStateProposalsPerDay = ( outputRootPostFrequency: number ) => { const output = @@ -552,7 +383,7 @@ export const calculateImpliedStateProposalsPerDay = ( }; // n33 done // =N33*IF('Chain Estimator'!E17="Yes",N16,N12) -export const calculateTotalStateProposalL1Gas = ( +const calculateTotalStateProposalL1Gas = ( outputRootPostFrequency: number, isFaultProofsEnabled: boolean ): number => { @@ -567,7 +398,7 @@ export const calculateTotalStateProposalL1Gas = ( }; // n34 done // =IF('Chain Estimator'!E24="Yes",1,0)*N34 -export const calculateTotalStateProposalL1GasCoveredByUsers = ( +const calculateTotalStateProposalL1GasCoveredByUsers = ( isStateEnabled: boolean, outputRootPostFrequency: number, isFaultProofsEnabled: boolean @@ -581,9 +412,8 @@ export const calculateTotalStateProposalL1GasCoveredByUsers = ( return output; }; // n35 done - // =N30*'Chain Estimator'!E76/1000000000 -export const calculateTotalBlobCommitmentCostsInETH = async ( +const calculateTotalBlobCommitmentCostsInETH = async ( transactionsPerDay: number, maxChannelDuration: number, comparableTxnType: string @@ -599,9 +429,8 @@ export const calculateTotalBlobCommitmentCostsInETH = async ( return output; } // n36 - // =N31*'Chain Estimator'!E76/1000000000 -export const calculateTotalAltDAPlasmaModeCommitmentCostsInETH = async ( +const calculateTotalAltDAPlasmaModeCommitmentCostsInETH = async ( transactionsPerDay: number, maxChannelDuration: number, comparableTxnType: string @@ -678,7 +507,7 @@ const _calculateL1BlobBaseFeeScalar = ( return Math.round(output); }; -export async function getL1GasBaseFee(): Promise { +async function getL1GasBaseFee(): Promise { const response = await fetch(L1GasBaseFee); const baseFee = await response.text(); console.log("L1GasBaseFee_response::",baseFee); @@ -687,7 +516,7 @@ export async function getL1GasBaseFee(): Promise { return output; } // e76 done -export const getBlobBaseFee = async (): Promise => { +const getBlobBaseFee = async (): Promise => { const response = await fetch(blobBaseFee); const fee = await response.text(); console.log("BlobBaseFee_response::", fee); @@ -697,7 +526,7 @@ export const getBlobBaseFee = async (): Promise => { }; // e78 done // =ROUND((('Advanced Inputs'!C10/'Advanced Inputs'!N25/(1-E18))*1000000),0) -export const calculateL1BlobBaseFeeScalarUsingBlob = ( +const calculateL1BlobBaseFeeScalarUsingBlob = ( determinedDAInUse: string, transactionsPerDay: number, maxChannelDuration: number, @@ -715,7 +544,7 @@ export const calculateL1BlobBaseFeeScalarUsingBlob = ( return output; }; // e94 done -export const calculateL1BlobBaseFeeScalarUsingL1Calldata = ( +const calculateL1BlobBaseFeeScalarUsingL1Calldata = ( determinedDAInUse: string, transactionsPerDay: number, maxChannelDuration: number, @@ -733,7 +562,7 @@ export const calculateL1BlobBaseFeeScalarUsingL1Calldata = ( return output; }; // e96 done -export const calculateL1BlobBaseFeeScalarUsingPlasmaMode = ( +const calculateL1BlobBaseFeeScalarUsingPlasmaMode = ( determinedDAInUse: string, transactionsPerDay: number, maxChannelDuration: number, @@ -751,7 +580,7 @@ export const calculateL1BlobBaseFeeScalarUsingPlasmaMode = ( return output; }; // e98 done -export const calculateL1BaseFeeScalarUsingBlobs = ( +const calculateL1BaseFeeScalarUsingBlobs = ( isStateEnabled: boolean, isFaultProofsEnabled: boolean, outputRootPostFrequency: number, @@ -778,7 +607,7 @@ export const calculateL1BaseFeeScalarUsingBlobs = ( return Math.round(result * 1000000); }; // f94 done -export const calculateL1BaseFeeScalarUsingL1Calldata = ( +const calculateL1BaseFeeScalarUsingL1Calldata = ( targetDataMargin: number, transactionsPerDay: number, maxChannelDuration: number, @@ -796,7 +625,7 @@ export const calculateL1BaseFeeScalarUsingL1Calldata = ( return output }; // f96 done -export const calculateL1BaseFeeScalarUsingPlasmaMode = ( +const calculateL1BaseFeeScalarUsingPlasmaMode = ( targetDataMargin: number, transactionsPerDay: number, maxChannelDuration: number, @@ -854,7 +683,7 @@ const _getCalculateImpliedDataGasFeePerTxParams = async ( comparableTxnType ); const e76 = await getL1GasBaseFee(); - const determinedDAInUse = _determineDAInUse(dataAvailabilityType); + const determinedDAInUse = determineDAInUse(dataAvailabilityType); const e94 = calculateL1BlobBaseFeeScalarUsingBlob( determinedDAInUse, transactionsPerDay, @@ -884,7 +713,7 @@ const _getBaseFeeScalarCalculationParams = async ( targetDataMargin: number, dataAvailabilityType: string ) => { - const determinedDAInUse = _determineDAInUse(dataAvailabilityType); + const determinedDAInUse = determineDAInUse(dataAvailabilityType); const e98 = calculateL1BlobBaseFeeScalarUsingPlasmaMode( determinedDAInUse, transactionsPerDay, @@ -1170,7 +999,7 @@ async function calculateModeledDACostsOnL1( comparableTxnType: string ): Promise { let output = 0; - const f35 = _determineDAInUse(dataAvailabilityType); + const f35 = determineDAInUse(dataAvailabilityType); const n36 = await calculateTotalBlobCommitmentCostsInETH( transactionsPerDay, maxChannelDuration, @@ -1214,4 +1043,4 @@ export const Avg_Total_Gas_Used_Per_L1_State_Proposal = 86847.5; // N12 export const FastLZ_Intercept = -42585600; // N13 export const FastLZ_Coefficient = 836500; // N14 export const FatLZ_Min_Transaction_Size = 100; // N15 -export const Avg_Total_Gas_Used_Per_L1_Fault_Proof_State_Proposal = 420926.0; // N16 +export const Avg_Total_Gas_Used_Per_L1_Fault_Proof_State_Proposal = 420926.0; // N16 \ No newline at end of file From 95f80336e5fe4fb1b3a2df37d003873672f3858c Mon Sep 17 00:00:00 2001 From: DannyThomx Date: Thu, 26 Sep 2024 19:10:46 +0200 Subject: [PATCH 056/565] update: added missing dependency - @headlessui/react --- package.json | 1 + pages/index.mdx | 2 +- pnpm-lock.yaml | 158 ++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 160 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 8923e1b23..a81de2a22 100644 --- a/package.json +++ b/package.json @@ -18,6 +18,7 @@ "@eth-optimism/contracts-ts": "^0.17.0", "@eth-optimism/tokenlist": "^9.0.9", "@feelback/react": "^0.3.4", + "@headlessui/react": "^2.1.8", "algoliasearch": "^4.23.3", "clsx": "^2.1.1", "escape-string-regexp": "^5.0.0", diff --git a/pages/index.mdx b/pages/index.mdx index 473db93e2..3ad6a6487 100644 --- a/pages/index.mdx +++ b/pages/index.mdx @@ -41,7 +41,7 @@ Check out these amazing tools, so you can get building with Optimism. } /> - } /> + } /> diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index cdac61a10..432ebb0c7 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -28,6 +28,9 @@ importers: '@feelback/react': specifier: ^0.3.4 version: 0.3.4(react@18.3.1) + '@headlessui/react': + specifier: ^2.1.8 + version: 2.1.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1) algoliasearch: specifier: ^4.23.3 version: 4.23.3 @@ -567,6 +570,27 @@ packages: peerDependencies: react: '>=17' + '@floating-ui/core@1.6.8': + resolution: {integrity: sha512-7XJ9cPU+yI2QeLS+FCSlqNFZJq8arvswefkZrYI1yQBbftw6FyrZOxYSh+9S7z7TpeWlRt9zJ5IhM1WIL334jA==} + + '@floating-ui/dom@1.6.11': + resolution: {integrity: sha512-qkMCxSR24v2vGkhYDo/UzxfJN3D4syqSjyuTFz6C7XcpU1pASPRieNI0Kj5VP3/503mOfYiGY891ugBX1GlABQ==} + + '@floating-ui/react-dom@2.1.2': + resolution: {integrity: sha512-06okr5cgPzMNBy+Ycse2A6udMi4bqwW/zgBF/rwjcNqWkyr82Mcg8b0vjX8OJpZFy/FKjJmw6wV7t44kK6kW7A==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + + '@floating-ui/react@0.26.24': + resolution: {integrity: sha512-2ly0pCkZIGEQUq5H8bBK0XJmc1xIK/RM3tvVzY3GBER7IOD1UgmC2Y2tjj4AuS+TC+vTE1KJv2053290jua0Sw==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + + '@floating-ui/utils@0.2.8': + resolution: {integrity: sha512-kym7SodPp8/wloecOpcmSnWJsK7M0E5Wg8UcFA+uO4B9s5d0ywXOEro/8HM9x0rW+TljRzul/14UYz3TleT3ig==} + '@headlessui/react@1.7.19': resolution: {integrity: sha512-Ll+8q3OlMJfJbAKM/+/Y2q6PPYbryqNTXDbryx7SXLIDamkF6iQFbriYHga0dY44PvDhvvBWCx1Xj4U5+G4hOw==} engines: {node: '>=10'} @@ -574,6 +598,13 @@ packages: react: ^16 || ^17 || ^18 react-dom: ^16 || ^17 || ^18 + '@headlessui/react@2.1.8': + resolution: {integrity: sha512-uajqVkAcVG/wHwG9Fh5PFMcFpf2VxM4vNRNKxRjuK009kePVur8LkuuygHfIE+2uZ7z7GnlTtYsyUe6glPpTLg==} + engines: {node: '>=10'} + peerDependencies: + react: ^18 + react-dom: ^18 + '@humanwhocodes/config-array@0.11.14': resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} engines: {node: '>=10.10.0'} @@ -785,6 +816,37 @@ packages: '@popperjs/core@2.11.8': resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==} + '@react-aria/focus@3.18.2': + resolution: {integrity: sha512-Jc/IY+StjA3uqN73o6txKQ527RFU7gnG5crEl5Xy3V+gbYp2O5L3ezAo/E0Ipi2cyMbG6T5Iit1IDs7hcGu8aw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + + '@react-aria/interactions@3.22.2': + resolution: {integrity: sha512-xE/77fRVSlqHp2sfkrMeNLrqf2amF/RyuAS6T5oDJemRSgYM3UoxTbWjucPhfnoW7r32pFPHHgz4lbdX8xqD/g==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + + '@react-aria/ssr@3.9.5': + resolution: {integrity: sha512-xEwGKoysu+oXulibNUSkXf8itW0npHHTa6c4AyYeZIJyRoegeteYuFpZUBPtIDE8RfHdNsSmE1ssOkxRnwbkuQ==} + engines: {node: '>= 12'} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + + '@react-aria/utils@3.25.2': + resolution: {integrity: sha512-GdIvG8GBJJZygB4L2QJP1Gabyn2mjFsha73I2wSe+o4DYeGWoJiMZRM06PyTIxLH4S7Sn7eVDtsSBfkc2VY/NA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + + '@react-stately/utils@3.10.3': + resolution: {integrity: sha512-moClv7MlVSHpbYtQIkm0Cx+on8Pgt1XqtPx6fy9rQFb2DNc9u1G3AUVnqA17buOkH1vLxAtX4MedlxMWyRCYYA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + + '@react-types/shared@3.24.1': + resolution: {integrity: sha512-AUQeGYEm/zDTN6zLzdXolDxz3Jk5dDL7f506F07U8tBwxNNI3WRdhU84G0/AaFikOZzDXhOZDr3MhQMzyE7Ydw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + '@scure/base@1.1.6': resolution: {integrity: sha512-ok9AWwhcgYuGG3Zfhyqg+zwl+Wn5uE+dwC0NV/2qQkx4dABbb/bx96vWu8NSj+BNjjSjno+JRYRjle1jV08k3g==} @@ -803,12 +865,21 @@ packages: '@swc/helpers@0.5.2': resolution: {integrity: sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==} + '@tanstack/react-virtual@3.10.8': + resolution: {integrity: sha512-VbzbVGSsZlQktyLrP5nxE+vE1ZR+U0NFAWPbJLoG2+DKPwd2D7dVICTVIIaYlJqX1ZCEnYDbaOpmMwbsyhBoIA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + '@tanstack/react-virtual@3.5.0': resolution: {integrity: sha512-rtvo7KwuIvqK9zb0VZ5IL7fiJAEnG+0EiFZz8FUOs+2mhGqdGmjKIaT1XU7Zq0eFqL0jonLlhbayJI/J2SA/Bw==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + '@tanstack/virtual-core@3.10.8': + resolution: {integrity: sha512-PBu00mtt95jbKFi6Llk9aik8bnR3tR/oQP1o3TSi+iG//+Q2RTIzCEgKkHG8BB86kxMNW6O8wku+Lmi+QFR6jA==} + '@tanstack/virtual-core@3.5.0': resolution: {integrity: sha512-KnPRCkQTyqhanNC0K63GBG3wA8I+D1fQuVnAvcBF8f13akOKeQp1gSbu6f77zCxhEk727iV5oQnbHLYzHrECLg==} @@ -3245,6 +3316,9 @@ packages: resolution: {integrity: sha512-7RnqIMq572L8PeEzKeBINYEJDDxpcH8JEgLwUqBd3TkofhFRbkq4QLR0u+36avGAhCRbk2nnmjcW9SE531hPDg==} engines: {node: ^14.18.0 || >=16.0.0} + tabbable@6.2.0: + resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==} + text-table@0.2.0: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} @@ -4281,6 +4355,31 @@ snapshots: '@feelback/js': 0.3.4 react: 18.3.1 + '@floating-ui/core@1.6.8': + dependencies: + '@floating-ui/utils': 0.2.8 + + '@floating-ui/dom@1.6.11': + dependencies: + '@floating-ui/core': 1.6.8 + '@floating-ui/utils': 0.2.8 + + '@floating-ui/react-dom@2.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@floating-ui/dom': 1.6.11 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@floating-ui/react@0.26.24(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@floating-ui/react-dom': 2.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@floating-ui/utils': 0.2.8 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + tabbable: 6.2.0 + + '@floating-ui/utils@0.2.8': {} + '@headlessui/react@1.7.19(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@tanstack/react-virtual': 3.5.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -4288,6 +4387,15 @@ snapshots: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) + '@headlessui/react@2.1.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@floating-ui/react': 0.26.24(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/focus': 3.18.2(react@18.3.1) + '@react-aria/interactions': 3.22.2(react@18.3.1) + '@tanstack/react-virtual': 3.10.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + '@humanwhocodes/config-array@0.11.14': dependencies: '@humanwhocodes/object-schema': 2.0.3 @@ -4470,6 +4578,46 @@ snapshots: '@popperjs/core@2.11.8': {} + '@react-aria/focus@3.18.2(react@18.3.1)': + dependencies: + '@react-aria/interactions': 3.22.2(react@18.3.1) + '@react-aria/utils': 3.25.2(react@18.3.1) + '@react-types/shared': 3.24.1(react@18.3.1) + '@swc/helpers': 0.5.2 + clsx: 2.1.1 + react: 18.3.1 + + '@react-aria/interactions@3.22.2(react@18.3.1)': + dependencies: + '@react-aria/ssr': 3.9.5(react@18.3.1) + '@react-aria/utils': 3.25.2(react@18.3.1) + '@react-types/shared': 3.24.1(react@18.3.1) + '@swc/helpers': 0.5.2 + react: 18.3.1 + + '@react-aria/ssr@3.9.5(react@18.3.1)': + dependencies: + '@swc/helpers': 0.5.2 + react: 18.3.1 + + '@react-aria/utils@3.25.2(react@18.3.1)': + dependencies: + '@react-aria/ssr': 3.9.5(react@18.3.1) + '@react-stately/utils': 3.10.3(react@18.3.1) + '@react-types/shared': 3.24.1(react@18.3.1) + '@swc/helpers': 0.5.2 + clsx: 2.1.1 + react: 18.3.1 + + '@react-stately/utils@3.10.3(react@18.3.1)': + dependencies: + '@swc/helpers': 0.5.2 + react: 18.3.1 + + '@react-types/shared@3.24.1(react@18.3.1)': + dependencies: + react: 18.3.1 + '@scure/base@1.1.6': {} '@scure/bip32@1.3.2': @@ -4498,12 +4646,20 @@ snapshots: dependencies: tslib: 2.6.2 + '@tanstack/react-virtual@3.10.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@tanstack/virtual-core': 3.10.8 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + '@tanstack/react-virtual@3.5.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@tanstack/virtual-core': 3.5.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) + '@tanstack/virtual-core@3.10.8': {} + '@tanstack/virtual-core@3.5.0': {} '@testing-library/dom@9.3.4': @@ -7894,6 +8050,8 @@ snapshots: '@pkgr/core': 0.1.1 tslib: 2.6.2 + tabbable@6.2.0: {} + text-table@0.2.0: {} tinyurl@1.1.7: {} From 1a85deea2468f7b8f8a15c19f0ed022cbac76e95 Mon Sep 17 00:00:00 2001 From: Yusuf Kehinde Date: Thu, 26 Sep 2024 20:18:52 +0100 Subject: [PATCH 057/565] feat: added close callout btn --- components/WipCallout.tsx | 32 +++++++++++++++++++++++++------- styles/global.css | 31 ++++++++++++++++++++----------- 2 files changed, 45 insertions(+), 18 deletions(-) diff --git a/components/WipCallout.tsx b/components/WipCallout.tsx index ebd8590ba..c64f397cb 100644 --- a/components/WipCallout.tsx +++ b/components/WipCallout.tsx @@ -10,12 +10,19 @@ * `context` is not provided, it will display a default maintenance message. */ import type { ReactElement } from 'react'; +import { useState } from 'react'; + interface Props { context?: string; } export function WipCallout({ context }: Props): ReactElement { + const [closeCallout, setCloseCallout] = useState(false); return ( -
+
{context ? ( context @@ -34,6 +41,12 @@ export function WipCallout({ context }: Props): ReactElement {
)}
+
); } @@ -46,11 +59,12 @@ export function InfoCallout({ context }: Props): ReactElement { context ) : (
- Interop is currently in active development and not yet ready for production use. - The information provided here may change frequently. + Interop is currently in active development and not + yet ready for production use. The information provided here may + change frequently.

- We recommend checking back - regularly for the most up-to-date information. + We recommend checking back regularly for the most up-to-date + information.

)} @@ -67,8 +81,12 @@ export function AltCallout({ context }: Props): ReactElement { context ) : (
- The Alt-DA Mode feature is currently in Beta within the MIT-licensed OP Stack. Beta features are built and reviewed by the Optimism Collective’s core contributors, and provide developers with early access to highly requested configurations. -These features may experience stability issues, and we encourage feedback from our early users. + The Alt-DA Mode feature is currently in Beta within + the MIT-licensed OP Stack. Beta features are built and reviewed by + the Optimism Collective’s core contributors, and provide developers + with early access to highly requested configurations. These features + may experience stability issues, and we encourage feedback from our + early users.
)}
diff --git a/styles/global.css b/styles/global.css index 5927869a4..37060350c 100644 --- a/styles/global.css +++ b/styles/global.css @@ -54,13 +54,13 @@ span.shasum code { } div.custom-callouts { - position: static; - top: 45px; - padding-left: 0; - padding-right: 0; - width: 100%; + position: -webkit-sticky; + position: sticky; + top: 65px; + padding: 5px; background-color: #fefce8; border: 2px solid #ffdc00; + z-index: 9999; border-radius: 4px; } a.callout-link { @@ -68,12 +68,6 @@ a.callout-link { text-decoration: underline; } -@media only screen and (max-width: 767px) { - div.custom-callouts { - top: 105px; - } -} - html.dark div.custom-callouts { color: white; background-color: #432c11; @@ -81,3 +75,18 @@ html.dark div.custom-callouts { html.dark a.callout-link { color: #008ae6; } +.callout-close-btn { + position: absolute; + top: -9px; + right: -9px; + width: 25px; + height: 25px; + border-radius: 50%; + background-color: #fefce8; + display: flex; + justify-content: center; + align-items: center; + border: 2px solid #ffdc00; + color: red; + font-size: 14px; +} From 691d0be0a97d7634b30b7b3efecafcbed401abf3 Mon Sep 17 00:00:00 2001 From: Zain Bacchus Date: Thu, 26 Sep 2024 14:32:37 -0500 Subject: [PATCH 058/565] Update cross-chain-message.mdx Nit: Change 'native interop' to 'Superchain interop' --- pages/stack/protocol/interop/cross-chain-message.mdx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pages/stack/protocol/interop/cross-chain-message.mdx b/pages/stack/protocol/interop/cross-chain-message.mdx index 933f23917..615d852ab 100644 --- a/pages/stack/protocol/interop/cross-chain-message.mdx +++ b/pages/stack/protocol/interop/cross-chain-message.mdx @@ -13,7 +13,7 @@ A cross-chain message applies to any message sent across a chain. This applies t ## How It Works -To send a cross-chain message on the Superchain using [native OP Stack interoperability](explainer), these two aspects must be in place: +To send a cross-chain message on the Superchain using [Superchain interoperability](explainer), these two aspects must be in place: 1. Each interoperable chain runs a verifying node for each chain in the interoperable set. 2. Each cross-chain message has an **initiating transaction** on the source chain and a **finalizing transaction** on the destination chain. @@ -31,6 +31,6 @@ In the example above, `Ox123` sends 1 OP from OP Mainnet to Base, but this appli ## Next Steps -* More questions? Check out the FAQ section in the [OP Stack's Native Interop Explainer](explainer#faqs) or check out this [interop design video walk-thru](https://www.youtube.com/watch?v=FKc5RgjtGes). -* Ready to get started? Use [SuperSim](https://github.com/ethereum-optimism/supersim), a local dev environment that simulates interop for testing applications against a local version of the Superchain. -* For more info about how OP Stack interoperability works under the hood, [check out the specs](https://specs.optimism.io/interop/overview.html). +* More questions? Check out the FAQ section in the [Superchain Interop Explainer](explainer#faqs) or check out this [Superchain interop design video walk-thru](https://www.youtube.com/watch?v=FKc5RgjtGes). +* Ready to get started? Use [SuperSim](https://github.com/ethereum-optimism/supersim), a local dev environment that simulates Superchain interop for testing applications against a local version of the Superchain. +* For more info about how Superchain interoperability works under the hood, [check out the specs](https://specs.optimism.io/interop/overview.html). From 05234faf60f0a7b0ca814059e41e30007d0c1f46 Mon Sep 17 00:00:00 2001 From: soyboy Date: Thu, 26 Sep 2024 13:14:04 -0700 Subject: [PATCH 059/565] adding first draft --- .../builders/chain-operators/tools/_meta.json | 3 +- .../chain-operators/tools/op-deployer.mdx | 64 +++++++++++++++++++ pages/stack/_meta.json | 3 +- pages/stack/experimental/_meta.json | 3 + pages/stack/experimental/opcm.mdx | 37 +++++++++++ 5 files changed, 108 insertions(+), 2 deletions(-) create mode 100644 pages/builders/chain-operators/tools/op-deployer.mdx create mode 100644 pages/stack/experimental/_meta.json create mode 100644 pages/stack/experimental/opcm.mdx diff --git a/pages/builders/chain-operators/tools/_meta.json b/pages/builders/chain-operators/tools/_meta.json index 826e2e1db..908ae60d2 100644 --- a/pages/builders/chain-operators/tools/_meta.json +++ b/pages/builders/chain-operators/tools/_meta.json @@ -1,5 +1,6 @@ { "op-challenger": "Configure Challenger For Your Chain", - "op-conductor": "op-conductor", + "op-conductor": "Conductor", + "op-deployer": "Deployer", "explorer": "Block Explorer" } diff --git a/pages/builders/chain-operators/tools/op-deployer.mdx b/pages/builders/chain-operators/tools/op-deployer.mdx new file mode 100644 index 000000000..55832c746 --- /dev/null +++ b/pages/builders/chain-operators/tools/op-deployer.mdx @@ -0,0 +1,64 @@ +--- +title: Deployer +lang: en-US +tags: ["op-deployer"] +description: Learn how op-deployer can simplify deployment of the OP Stack. +--- + +import { Callout, Steps } from 'nextra/components' + +# Deployer + +This page will teach you what the `op-deployer` tool is and how it works on a high level. The purpose of this tool is to simplify the smart contract deployment process and the genesis file creation process for new OP Stack chains. It is similar to [Terrafrom](https://www.terraform.io/) where you can create intent files to describe how you want your chain to be configured. + +## Contract Deployment + +The `op-deployer` is a golang wrapper around [OP Contracts Manager](/stack/experimental/opcm). Here's a sample of its usage: + + + +### Initalize chain + +Initializes a chain intent and state file with the following command: + +```bash +todo: confirm the command and any necessary parameters +./op-deployer init +``` + +You can then modify the configuration files. Here's an example file with a standard configuration: + +```yaml +todo: add sample file +``` + +### Applies chain intent + +Use the following command to apply a chain intent to your network: + +```bash +todo: confirm the command and any necessary parameters +./op-deployer apply +``` + +### Inspect deployment + +Use the following command to inspect the details of your deployment: + +``` +todo: confirm the command and any necessary parameters +./op-deployer inspect +``` + + + +## Genesis Creation + +todo: is this baked into the commands above? + +The `op-deployer` will take the smart contract deployment artifacts and to generate the genesis file for your layer two network. + +## Next Steps + +* For more details checkout the tool and documnetation in the [monorepo](https://github.com/ethereum-optimism/optimism/tree/develop/op-chain-ops/cmd/op-deployer) +* For more details on OP Contracts Manger checkout these [opcm docs](/stack/experimental/opcm). \ No newline at end of file diff --git a/pages/stack/_meta.json b/pages/stack/_meta.json index a56d9ee02..f781654fe 100644 --- a/pages/stack/_meta.json +++ b/pages/stack/_meta.json @@ -8,5 +8,6 @@ "protocol": "Protocol", "transactions": "Transactions", "security": "Security", - "operators": "Operators" + "operators": "Operators", + "experimental": "Experimental" } diff --git a/pages/stack/experimental/_meta.json b/pages/stack/experimental/_meta.json new file mode 100644 index 000000000..f1e860151 --- /dev/null +++ b/pages/stack/experimental/_meta.json @@ -0,0 +1,3 @@ +{ + "opcm": "OP Contracts Manager" +} \ No newline at end of file diff --git a/pages/stack/experimental/opcm.mdx b/pages/stack/experimental/opcm.mdx new file mode 100644 index 000000000..7d5c5af7a --- /dev/null +++ b/pages/stack/experimental/opcm.mdx @@ -0,0 +1,37 @@ +--- +title: OP Contracts Manager +lang: en-US +tags: ["opcm"] +description: Learn how OP Contracts Manager deploys of the OP Stack with one transaction. +--- + +import { Callout, Tabs, Steps } from 'nextra/components' + +# OP Contracts Manager + +The OP Contracts Manager is a contract that deploys the L1 contracts for an OP Stack chain in a single transaction. It provides a minimal set of user-configurable parameters to ensure that the resulting chain meets the standard configuration requirements. + +The version deployed is always a governance-approved contract release. The set of governance approved contract releases can be found on the Optimism Monorepo releases page, and is the set of releases named `op-contracts/vX.Y.Z`. + +## Problem statement + +The current L2 chain deployment approach originates from a time with Hardhat, single L1 target, and a single monolithic set of features. Since then the system has migrated to Foundry and extended for more features, but remains centered around a single monolithic deploy-config for all its features. + +The interop team needs a way to configure new multi-L2 deployments: The number of ways to compose L2s in tests grows past what a single legacy config template can support. + +Outside of interop, deployment also seems increasingly complex and opaque, while it does not have to be, due to the same configuration and composability troubles. + +## Purpose + +OPCM simplifies the L1 contract deployments for new OP Stack chains. It addresses three aspects of deploying the OP Stack's L1 contracts: + +1. **Deploy Superchain Contracts.** Superchain contracts are shared between many OP chains, so this occurs only occasionally in production, but is needed for every OP chain deployment in devnet and testnet. +1. **Deploy Shared Implementation Contracts.** This occurs once per contracts release in production, but is needed for every OP chain deployment in devnet and testnet. +1. **Deploy OP Chain Contracts.** This occurs for every OP chain deployment in production, devnet, and testnet. + +In a future iteration, it also is meant to handle upgrading the smart contracts. + +## Learn more + +* Checkout the [OPCM specs](https://specs.optimism.io/experimental/op-contracts-manager.html) +* Checkout the [OPCM design document](https://github.com/ethereum-optimism/design-docs/blob/main/protocol/op-contracts-manager-arch.md) \ No newline at end of file From 2db308b41c88af87edbd9a89221b1c8615de7f6c Mon Sep 17 00:00:00 2001 From: soyboy Date: Thu, 26 Sep 2024 13:16:24 -0700 Subject: [PATCH 060/565] linting --- .../chain-operators/tools/op-deployer.mdx | 54 +++++++++---------- pages/stack/experimental/opcm.mdx | 12 ++--- words.txt | 3 ++ 3 files changed, 35 insertions(+), 34 deletions(-) diff --git a/pages/builders/chain-operators/tools/op-deployer.mdx b/pages/builders/chain-operators/tools/op-deployer.mdx index 55832c746..7602661b8 100644 --- a/pages/builders/chain-operators/tools/op-deployer.mdx +++ b/pages/builders/chain-operators/tools/op-deployer.mdx @@ -16,49 +16,47 @@ This page will teach you what the `op-deployer` tool is and how it works on a hi The `op-deployer` is a golang wrapper around [OP Contracts Manager](/stack/experimental/opcm). Here's a sample of its usage: + ### Initialize chain -### Initalize chain + Initializes a chain intent and state file with the following command: -Initializes a chain intent and state file with the following command: + ```bash + todo: confirm the command and any necessary parameters + ./op-deployer init + ``` -```bash -todo: confirm the command and any necessary parameters -./op-deployer init -``` + You can then modify the configuration files. Here's an example file with a standard configuration: -You can then modify the configuration files. Here's an example file with a standard configuration: + ```yaml + todo: add sample file + ``` -```yaml -todo: add sample file -``` + ### Applies chain intent -### Applies chain intent + Use the following command to apply a chain intent to your network: -Use the following command to apply a chain intent to your network: + ```bash + todo: confirm the command and any necessary parameters + ./op-deployer apply + ``` -```bash -todo: confirm the command and any necessary parameters -./op-deployer apply -``` + ### Inspect deployment -### Inspect deployment - -Use the following command to inspect the details of your deployment: - -``` -todo: confirm the command and any necessary parameters -./op-deployer inspect -``` + Use the following command to inspect the details of your deployment: + ``` + todo: confirm the command and any necessary parameters + ./op-deployer inspect + ``` -## Genesis Creation +## Genesis Creation todo: is this baked into the commands above? -The `op-deployer` will take the smart contract deployment artifacts and to generate the genesis file for your layer two network. +The `op-deployer` will take the smart contract deployment artifacts and to generate the genesis file for your layer two network. ## Next Steps -* For more details checkout the tool and documnetation in the [monorepo](https://github.com/ethereum-optimism/optimism/tree/develop/op-chain-ops/cmd/op-deployer) -* For more details on OP Contracts Manger checkout these [opcm docs](/stack/experimental/opcm). \ No newline at end of file +* For more details checkout the tool and docs in the [monorepo](https://github.com/ethereum-optimism/optimism/tree/develop/op-chain-ops/cmd/op-deployer) +* For more details on OP Contracts Manger checkout these [opcm docs](/stack/experimental/opcm). diff --git a/pages/stack/experimental/opcm.mdx b/pages/stack/experimental/opcm.mdx index 7d5c5af7a..afbe37f52 100644 --- a/pages/stack/experimental/opcm.mdx +++ b/pages/stack/experimental/opcm.mdx @@ -21,17 +21,17 @@ The interop team needs a way to configure new multi-L2 deployments: The number o Outside of interop, deployment also seems increasingly complex and opaque, while it does not have to be, due to the same configuration and composability troubles. -## Purpose +## Purpose OPCM simplifies the L1 contract deployments for new OP Stack chains. It addresses three aspects of deploying the OP Stack's L1 contracts: -1. **Deploy Superchain Contracts.** Superchain contracts are shared between many OP chains, so this occurs only occasionally in production, but is needed for every OP chain deployment in devnet and testnet. -1. **Deploy Shared Implementation Contracts.** This occurs once per contracts release in production, but is needed for every OP chain deployment in devnet and testnet. -1. **Deploy OP Chain Contracts.** This occurs for every OP chain deployment in production, devnet, and testnet. +1. **Deploy Superchain Contracts.** Superchain contracts are shared between many OP chains, so this occurs only occasionally in production, but is needed for every OP chain deployment in devnet and testnet. +2. **Deploy Shared Implementation Contracts.** This occurs once per contracts release in production, but is needed for every OP chain deployment in devnet and testnet. +3. **Deploy OP Chain Contracts.** This occurs for every OP chain deployment in production, devnet, and testnet. In a future iteration, it also is meant to handle upgrading the smart contracts. ## Learn more -* Checkout the [OPCM specs](https://specs.optimism.io/experimental/op-contracts-manager.html) -* Checkout the [OPCM design document](https://github.com/ethereum-optimism/design-docs/blob/main/protocol/op-contracts-manager-arch.md) \ No newline at end of file +* Checkout the [OPCM specs](https://specs.optimism.io/experimental/op-contracts-manager.html) +* Checkout the [OPCM design document](https://github.com/ethereum-optimism/design-docs/blob/main/protocol/op-contracts-manager-arch.md) diff --git a/words.txt b/words.txt index 90467007b..615f5a43c 100644 --- a/words.txt +++ b/words.txt @@ -227,6 +227,8 @@ nosyncserve Numba Offchain offchain +OPCM +opcm Openfort oplabs opnode's @@ -340,6 +342,7 @@ syncmode SYNCTARGET synctarget syscalls +Terrafrom therealbytes Thirdweb threadcreate From eb9d990ae785b426ca1c93dfac6bb0c7d0471d67 Mon Sep 17 00:00:00 2001 From: soyboy <85043086+sbvegan@users.noreply.github.com> Date: Thu, 26 Sep 2024 13:23:47 -0700 Subject: [PATCH 061/565] Apply suggestions from code review Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> --- pages/builders/chain-operators/tools/op-deployer.mdx | 6 +++--- words.txt | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/pages/builders/chain-operators/tools/op-deployer.mdx b/pages/builders/chain-operators/tools/op-deployer.mdx index 7602661b8..01966cb09 100644 --- a/pages/builders/chain-operators/tools/op-deployer.mdx +++ b/pages/builders/chain-operators/tools/op-deployer.mdx @@ -9,7 +9,7 @@ import { Callout, Steps } from 'nextra/components' # Deployer -This page will teach you what the `op-deployer` tool is and how it works on a high level. The purpose of this tool is to simplify the smart contract deployment process and the genesis file creation process for new OP Stack chains. It is similar to [Terrafrom](https://www.terraform.io/) where you can create intent files to describe how you want your chain to be configured. +This page will teach you what the `op-deployer` tool is and how it works on a high level. The purpose of this tool is to simplify the smart contract deployment process and the genesis file creation process for new OP Stack chains. It is similar to [Terraform](https://www.terraform.io/) where you can create intent files to describe how you want your chain to be configured. ## Contract Deployment @@ -58,5 +58,5 @@ The `op-deployer` will take the smart contract deployment artifacts and to gener ## Next Steps -* For more details checkout the tool and docs in the [monorepo](https://github.com/ethereum-optimism/optimism/tree/develop/op-chain-ops/cmd/op-deployer) -* For more details on OP Contracts Manger checkout these [opcm docs](/stack/experimental/opcm). +* For more details, check out the tool and documentation in the [op-deployer repository](https://github.com/ethereum-optimism/optimism/tree/develop/op-chain-ops/cmd/op-deployer). +* For more information on OP Contracts Manager, refer to the [OPCM documentation](/stack/experimental/opcm). diff --git a/words.txt b/words.txt index 615f5a43c..53e4d2a99 100644 --- a/words.txt +++ b/words.txt @@ -342,7 +342,7 @@ syncmode SYNCTARGET synctarget syscalls -Terrafrom +Terraform therealbytes Thirdweb threadcreate From 55ba456a4bbdfd3b06ac69fe26d7da0f2b27c6a6 Mon Sep 17 00:00:00 2001 From: Matthew Slipper Date: Thu, 26 Sep 2024 16:45:45 -0600 Subject: [PATCH 062/565] add more docs --- .../chain-operators/tools/op-deployer.mdx | 101 ++++++++++++------ 1 file changed, 70 insertions(+), 31 deletions(-) diff --git a/pages/builders/chain-operators/tools/op-deployer.mdx b/pages/builders/chain-operators/tools/op-deployer.mdx index 01966cb09..a20f340df 100644 --- a/pages/builders/chain-operators/tools/op-deployer.mdx +++ b/pages/builders/chain-operators/tools/op-deployer.mdx @@ -5,56 +5,95 @@ tags: ["op-deployer"] description: Learn how op-deployer can simplify deployment of the OP Stack. --- -import { Callout, Steps } from 'nextra/components' +import {Callout, Steps} from 'nextra/components' # Deployer -This page will teach you what the `op-deployer` tool is and how it works on a high level. The purpose of this tool is to simplify the smart contract deployment process and the genesis file creation process for new OP Stack chains. It is similar to [Terraform](https://www.terraform.io/) where you can create intent files to describe how you want your chain to be configured. +`op-deployer` simplifies the process of deploying the the OP Stack. It works similarly to [Terraform] +(https://www.terraform.io). Like Terraform, you define a declarative config file called an "intent," then run a +command to apply the intent to your chain. `op-deployer` will compare the state of your chain against the intent, +and make whatever changes are necessary for them to match. -## Contract Deployment +## Installation -The `op-deployer` is a golang wrapper around [OP Contracts Manager](/stack/experimental/opcm). Here's a sample of its usage: +`op-deployer` is currently under active development, and must be compiled from source. Assuming you have the Go +toolchain installed, you can install `op-deployer` by running `go install github. +com/ethereum-optimism/optimism/op-chain-ops/cmd/op-deployer@latest`. This will install the `op-deployer` binary to +your local `GOPATH`. - - ### Initialize chain +## Usage - Initializes a chain intent and state file with the following command: +### Configuring your Chain - ```bash - todo: confirm the command and any necessary parameters - ./op-deployer init - ``` +The first step to using `op-deployer` is to create an intent file. The intent file describes how you want your chain +to look when it is done being deployed. `op-deployer` has a utility for this. Run the following command to generate +an example intent file for a development chain: - You can then modify the configuration files. Here's an example file with a standard configuration: +``` +op-deployer init --l1-chain-id 11155111 --l2-chain-ids 12345 --workdir .deployer +``` - ```yaml - todo: add sample file - ``` +This command will create a directory called `.deployer` in your current working directory containing the intent file +and an empty `state.json` file. `state.json` is populated with the results of your deployment, and never needs to +be edited directly. - ### Applies chain intent +Your intent file will look something like this: - Use the following command to apply a chain intent to your network: +```toml +l1ChainID = 11155111 # The chain ID of the L1 chain you'll be deploying to +fundDevAccounts = true # Whether or not to fund dev accounts using the test... junk mnemonic on L2. +contractsRelease = "op-contracts/v1.6.0" # The version of the smart contracts to deploy. - ```bash - todo: confirm the command and any necessary parameters - ./op-deployer apply - ``` +# List of L2s to deploy. op-deployer can deploy multiple L2s at once +[[chains]] +# Your chain's ID, encoded as a 32-byte hex string +id = "0x0000000000000000000000000000000000000000000000000000000000003039" +# Various ownership roles for your chain. When you use op-deployer init, these roles are generated using the +# test... junk mnemonic. You should replace these with your own addresses for production chains. +[chains.roles] +proxyAdminOwner = "0x7759a8a43aa6a7ee9434ddb597beed64180c40fd" +systemConfigOwner = "0x8e35d9523a0c4c9ac537d254079c2398c6f3b35f" +governanceTokenOwner = "0x7759a8a43aa6a7ee9434ddb597beed64180c40fd" +unsafeBlockSigner = "0xbb19dce4ce51f353a98dbab31b5fa3bc80dc7769" +batcher = "0x0e9c62712ab826e06b16b2236ce542f711eaffaf" +proposer = "0x86dfafe0689e20685f7872e0cb264868454627bc" +challenger = "0xf1658da627dd0738c555f9572f658617511c49d5" +``` - ### Inspect deployment +See the comments for what each field does. By default, `op-deployer` will fill in all other configuration variables +with those that match our standard config. You can override these defaults by adding them to your intent file, but +that won't be covered here. - Use the following command to inspect the details of your deployment: +### Applying your Intent - ``` - todo: confirm the command and any necessary parameters - ./op-deployer inspect - ``` - +Now that you've created your intent file, you can apply it to your chain. Run the following command to do so: -## Genesis Creation +``` +op-deployer apply --workdir .deployer --l1-rpc-url --private-key +``` -todo: is this baked into the commands above? +This command will deploy the OP Stack to L1. It will deploy all L2s specified in the intent file. Superchain +configuration will be set to the Superchain-wide defaults - i.e., your chain will be opted into the Superchain pause +and will use the same protocol versions address as other chains on the Superchain. -The `op-deployer` will take the smart contract deployment artifacts and to generate the genesis file for your layer two network. +### Generating Genesis Files + +With the contracts deployed, you can generate a genesis file for any of your L2s. Run the following command to do so: + +``` +./bin/op-deployer inspect genesis --outfile genesis.json +``` + +This will write the genesis file to genesis.json. You can change the `--outfile` parameter to write it somewhere +else. You can run another member of the `inspect` family, `rollup`, to get the rollup.json file: + +``` +./bin/op-deployer inspect rollup --outfile rollup.json +``` + +## More Information + +`op-deployer` uses the OP Contracts Manager (OPCM) under the hood to deploy contracts. ## Next Steps From 6148655288b8784c21c96bbab46a93c532c39f1f Mon Sep 17 00:00:00 2001 From: soyboy Date: Thu, 26 Sep 2024 16:13:55 -0700 Subject: [PATCH 063/565] adding tags and fixing link --- pages/builders/chain-operators/tools/op-deployer.mdx | 5 ++--- pages/stack/experimental/opcm.mdx | 2 +- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/pages/builders/chain-operators/tools/op-deployer.mdx b/pages/builders/chain-operators/tools/op-deployer.mdx index a20f340df..85ca637e9 100644 --- a/pages/builders/chain-operators/tools/op-deployer.mdx +++ b/pages/builders/chain-operators/tools/op-deployer.mdx @@ -1,7 +1,7 @@ --- title: Deployer lang: en-US -tags: ["op-deployer"] +tags: ["op-deployer","eng-platforms"] description: Learn how op-deployer can simplify deployment of the OP Stack. --- @@ -9,8 +9,7 @@ import {Callout, Steps} from 'nextra/components' # Deployer -`op-deployer` simplifies the process of deploying the the OP Stack. It works similarly to [Terraform] -(https://www.terraform.io). Like Terraform, you define a declarative config file called an "intent," then run a +`op-deployer` simplifies the process of deploying the the OP Stack. It works similarly to [Terraform](https://www.terraform.io). Like Terraform, you define a declarative config file called an "intent," then run a command to apply the intent to your chain. `op-deployer` will compare the state of your chain against the intent, and make whatever changes are necessary for them to match. diff --git a/pages/stack/experimental/opcm.mdx b/pages/stack/experimental/opcm.mdx index afbe37f52..46acc1e7a 100644 --- a/pages/stack/experimental/opcm.mdx +++ b/pages/stack/experimental/opcm.mdx @@ -1,7 +1,7 @@ --- title: OP Contracts Manager lang: en-US -tags: ["opcm"] +tags: ["opcm","eng-security"] description: Learn how OP Contracts Manager deploys of the OP Stack with one transaction. --- From 7e0ff31cdcfc8872b1db9d1cee87c07ad704383d Mon Sep 17 00:00:00 2001 From: Bradley Camacho <42678939+bradleycamacho@users.noreply.github.com> Date: Thu, 26 Sep 2024 17:47:19 -0700 Subject: [PATCH 064/565] Update to correct security council threshold --- pages/chain/security/faq.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/chain/security/faq.mdx b/pages/chain/security/faq.mdx index 59da94f59..b000bb446 100644 --- a/pages/chain/security/faq.mdx +++ b/pages/chain/security/faq.mdx @@ -21,7 +21,7 @@ OP Mainnet and the OP Stack in general **may also contain unknown bugs that coul ## OP Mainnet Multisig The security of OP Mainnet is currently dependent on a multisig managed jointly by the [Optimism Security Council](https://gov.optimism.io/t/intro-to-optimisms-security-council/6885) and the Optimism Foundation. -This multisig is a [2-of-2 nested multisig](https://etherscan.io/address/0x5a0Aae59D09fccBdDb6C6CcEB07B7279367C3d2A) which is in turn governed by a [4-of-13 multisig](https://etherscan.io/address/0xc2819DC788505Aac350142A7A707BF9D03E3Bd03) managed by the Optimism Security Council and a [5-of-7 multisig](https://etherscan.io/address/0x847B5c174615B1B7fDF770882256e2D3E95b9D92) managed by the Optimism Foundation. +This multisig is a [2-of-2 nested multisig](https://etherscan.io/address/0x5a0Aae59D09fccBdDb6C6CcEB07B7279367C3d2A) which is in turn governed by a [10-of-13 multisig](https://etherscan.io/address/0xc2819DC788505Aac350142A7A707BF9D03E3Bd03) managed by the Optimism Security Council and a [5-of-7 multisig](https://etherscan.io/address/0x847B5c174615B1B7fDF770882256e2D3E95b9D92) managed by the Optimism Foundation. This multisig can be used to upgrade core OP Mainnet smart contracts **without upgrade delays** to allow for quick responses to potential security concerns. All upgrades to the OP Mainnet system must be approved by both component multisigs and either can veto an upgrade. From 8e233346fc732d35d77d530a91326f9c41107bd8 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Fri, 27 Sep 2024 15:57:00 +0100 Subject: [PATCH 065/565] Update fee-calculator.mdx --- pages/builders/tools/fee-calculator.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/builders/tools/fee-calculator.mdx b/pages/builders/tools/fee-calculator.mdx index 4f363a4f5..58510140e 100644 --- a/pages/builders/tools/fee-calculator.mdx +++ b/pages/builders/tools/fee-calculator.mdx @@ -1,5 +1,5 @@ --- -title: Fee Parameter Calculator +title: Fjord Fee Parameter Calculator lang: en-US --- From cb0bdeb931115d9c7edbe7c85344c12895198a90 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Fri, 27 Sep 2024 15:58:22 +0100 Subject: [PATCH 066/565] Update fee-calculator.mdx --- pages/builders/tools/fee-calculator.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/builders/tools/fee-calculator.mdx b/pages/builders/tools/fee-calculator.mdx index 58510140e..f297e1117 100644 --- a/pages/builders/tools/fee-calculator.mdx +++ b/pages/builders/tools/fee-calculator.mdx @@ -6,6 +6,6 @@ lang: en-US import { ChainParametersForm } from '@/components/calculator/ChainParametersForm' -# Fee Parameter Calculator +# Fjord Fee Parameter Calculator From 9b9359b891662efd14af3e7e0c943cdc8c002d28 Mon Sep 17 00:00:00 2001 From: soyboy <85043086+sbvegan@users.noreply.github.com> Date: Fri, 27 Sep 2024 10:39:33 -0700 Subject: [PATCH 067/565] Update pages/stack/experimental/opcm.mdx Co-authored-by: Matt Solomon --- pages/stack/experimental/opcm.mdx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pages/stack/experimental/opcm.mdx b/pages/stack/experimental/opcm.mdx index 46acc1e7a..0ecfd12cc 100644 --- a/pages/stack/experimental/opcm.mdx +++ b/pages/stack/experimental/opcm.mdx @@ -25,9 +25,9 @@ Outside of interop, deployment also seems increasingly complex and opaque, while OPCM simplifies the L1 contract deployments for new OP Stack chains. It addresses three aspects of deploying the OP Stack's L1 contracts: -1. **Deploy Superchain Contracts.** Superchain contracts are shared between many OP chains, so this occurs only occasionally in production, but is needed for every OP chain deployment in devnet and testnet. -2. **Deploy Shared Implementation Contracts.** This occurs once per contracts release in production, but is needed for every OP chain deployment in devnet and testnet. -3. **Deploy OP Chain Contracts.** This occurs for every OP chain deployment in production, devnet, and testnet. +1. **Deploy Superchain Contracts.** Superchain contracts are shared between many OP chains, so this occurs only occasionally in production. +2. **Deploy Shared Implementation Contracts.** This occurs once per contracts release in production. +3. **Deploy OP Chain Contracts.** This occurs for every OP chain deployment in production. In a future iteration, it also is meant to handle upgrading the smart contracts. From d53f6d59fc520012328719fc59d20e724f4973f5 Mon Sep 17 00:00:00 2001 From: Matthew Slipper Date: Sat, 28 Sep 2024 20:21:18 -0600 Subject: [PATCH 068/565] fix installation steps --- .../chain-operators/tools/op-deployer.mdx | 32 +++++++++++++++++-- 1 file changed, 29 insertions(+), 3 deletions(-) diff --git a/pages/builders/chain-operators/tools/op-deployer.mdx b/pages/builders/chain-operators/tools/op-deployer.mdx index 85ca637e9..761e941c0 100644 --- a/pages/builders/chain-operators/tools/op-deployer.mdx +++ b/pages/builders/chain-operators/tools/op-deployer.mdx @@ -16,9 +16,35 @@ and make whatever changes are necessary for them to match. ## Installation `op-deployer` is currently under active development, and must be compiled from source. Assuming you have the Go -toolchain installed, you can install `op-deployer` by running `go install github. -com/ethereum-optimism/optimism/op-chain-ops/cmd/op-deployer@latest`. This will install the `op-deployer` binary to -your local `GOPATH`. +toolchain installed, you can install `op-deployer` by following these steps: + + + ### **Clone the Monorepo**: + + Run the following command to clone the monorepo: + + ```bash + git clone https://github.com/ethereum-optimism/optimism.git + ``` + + ### **Build the Binary**: + + Run the following commands to build the binary: + + ```bash + cd op-chain-ops + make op-deployer + ``` + + ### (Optional) Move `op-deployer` Into `$PATH` + + Run the following command to move the `op-deployer` binary into your `$PATH`. Note that the path for your system + may be different: + + ```bash + sudo mv ./bin/op-deployer /usr/local/bin/op-deployer + ``` + ## Usage From a899a96857fff2fd7bc4901c8f779c15ec7d821a Mon Sep 17 00:00:00 2001 From: Franco Victorio Date: Mon, 30 Sep 2024 10:32:30 +0200 Subject: [PATCH 069/565] Apply feedback --- pages/builders/node-operators/network-upgrades.mdx | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/pages/builders/node-operators/network-upgrades.mdx b/pages/builders/node-operators/network-upgrades.mdx index 8b5c26bef..f64069070 100644 --- a/pages/builders/node-operators/network-upgrades.mdx +++ b/pages/builders/node-operators/network-upgrades.mdx @@ -23,11 +23,11 @@ that are pending governance approval. | Upgrade | Governance Approval | [OP Mainnet Activations](https://github.com/ethereum-optimism/superchain-registry/blob/main/superchain/configs/mainnet/superchain.toml) | [OP Sepolia Activations](https://github.com/ethereum-optimism/superchain-registry/blob/main/superchain/configs/sepolia/superchain.toml) | | ------------------------------------------------------------------- | ------------------------------------------------------------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------- | -| [Granite](https://specs.optimism.io/protocol/granite/overview.html) | [approved](https://gov.optimism.io/t/upgrade-proposal-10-granite-network-upgrade/8733) | Wed Sep 11 16:00:01 UTC 2024 (`1726070401`) at block 125235812 | Mon Aug 12 16:00:00 UTC 2024 (`1723478400`) at block 15837930 | -| [Fjord](https://specs.optimism.io/protocol/fjord/overview.html) | [approved](https://gov.optimism.io/t/upgrade-proposal-9-fjord-network-upgrade/8236) | Wed Jul 10 16:00:01 UTC 2024 (`1720627201`) at block 122514212 | Wed May 29 16:00:00 UTC 2024 (`1716998400`) at block 12597930 | -| [Ecotone](https://specs.optimism.io/protocol/ecotone/overview.html) | [approved](https://gov.optimism.io/t/upgrade-proposal-5-ecotone-network-upgrade/7669) | Thu Mar 14 00:00:01 UTC 2024 (`1710374401`) at block 117387812 | Wed Feb 21 17:00:00 UTC 2024 (`1708534800`) at block 8366130 | -| [Delta](https://specs.optimism.io/protocol/delta/overview.html) | [approved](https://gov.optimism.io/t/final-upgrade-proposal-3-delta-network-upgrade/7310) | Thu Feb 22 00:00:00 UTC 2024 (`1708560000`) at block 116480612 | Fri Dec 22 00:00:00 UTC 2023 (`1703203200`) at block 5700330 | -| [Canyon](https://specs.optimism.io/protocol/canyon/overview.html) | [approved](https://gov.optimism.io/t/final-upgrade-proposal-2-canyon-network-upgrade/7088) | Thu Jan 11 17:00:01 UTC 2024 (`1704992401`) at block 114696812 | Tue Nov 14 17:00:00 UTC 2023 (`1699981200`) at block 4089330 | +| [Granite](https://specs.optimism.io/protocol/granite/overview.html) | [approved](https://gov.optimism.io/t/upgrade-proposal-10-granite-network-upgrade/8733) | Wed Sep 11 16:00:01 UTC 2024 (`1726070401`) around block `125235812` | Mon Aug 12 16:00:00 UTC 2024 (`1723478400`) around block `15837930` | +| [Fjord](https://specs.optimism.io/protocol/fjord/overview.html) | [approved](https://gov.optimism.io/t/upgrade-proposal-9-fjord-network-upgrade/8236) | Wed Jul 10 16:00:01 UTC 2024 (`1720627201`) around block `122514212` | Wed May 29 16:00:00 UTC 2024 (`1716998400`) around block `12597930` | +| [Ecotone](https://specs.optimism.io/protocol/ecotone/overview.html) | [approved](https://gov.optimism.io/t/upgrade-proposal-5-ecotone-network-upgrade/7669) | Thu Mar 14 00:00:01 UTC 2024 (`1710374401`) around block `117387812` | Wed Feb 21 17:00:00 UTC 2024 (`1708534800`) around block `8366130` | +| [Delta](https://specs.optimism.io/protocol/delta/overview.html) | [approved](https://gov.optimism.io/t/final-upgrade-proposal-3-delta-network-upgrade/7310) | Thu Feb 22 00:00:00 UTC 2024 (`1708560000`) around block `116480612` | Fri Dec 22 00:00:00 UTC 2023 (`1703203200`) around block `5700330` | +| [Canyon](https://specs.optimism.io/protocol/canyon/overview.html) | [approved](https://gov.optimism.io/t/final-upgrade-proposal-2-canyon-network-upgrade/7088) | Thu Jan 11 17:00:01 UTC 2024 (`1704992401`) around block `114696812` | Tue Nov 14 17:00:00 UTC 2023 (`1699981200`) around block `4089330` | ## Summary of Changes From 1779109a440145bf0638489d9f5777649f7f0fb1 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Mon, 30 Sep 2024 16:22:37 +0100 Subject: [PATCH 070/565] initial commit --- .../tutorials/send-tx-from-eth.mdx | 164 ++++++++++-------- 1 file changed, 89 insertions(+), 75 deletions(-) diff --git a/pages/builders/app-developers/tutorials/send-tx-from-eth.mdx b/pages/builders/app-developers/tutorials/send-tx-from-eth.mdx index d7a53efe3..bd285f96a 100644 --- a/pages/builders/app-developers/tutorials/send-tx-from-eth.mdx +++ b/pages/builders/app-developers/tutorials/send-tx-from-eth.mdx @@ -1,37 +1,31 @@ --- -title: Triggering OP Mainnet Transactions from Ethereum +title: Triggering OP Mainnet Transactions from Ethereum using Viem lang: en-US -description: Learn how to force transaction inclusion without the OP Mainnet Sequencer. +description: Learn how to force transaction inclusion without the OP Mainnet Sequencer using Viem. --- import { Callout, Steps } from 'nextra/components' import { WipCallout } from '@/components/WipCallout' -# Triggering OP Mainnet Transactions from Ethereum +# Triggering OP Mainnet Transactions from Ethereum using Viem +OP Mainnet currently uses a single-Sequencer block production model. +This means that there is only one Sequencer active on the network at any given time. Single-Sequencer models are simpler than their highly decentralized counterparts but they are also more vulnerable to potential downtime. -OP Mainnet currently uses a single-Sequencer block production model. -This means that there is only one Sequencer active on the network at any given time. -Single-Sequencer models are simpler than their highly decentralized counterparts but they are also more vulnerable to potential downtime. +Sequencer downtime must not be able to prevent users from transacting on the network. As a result, OP Mainnet includes a mechanism for "forcing" transactions to be included in the blockchain. This mechanism involves triggering a transaction on OP Mainnet by sending a transaction on Ethereum. -Sequencer downtime must not be able to prevent users from transacting on the network. -As a result, OP Mainnet includes a mechanism for "forcing" transactions to be included in the blockchain. -This mechanism involves triggering a transaction on OP Mainnet by sending a transaction on Ethereum. - -In this tutorial you'll learn how to trigger a transaction on OP Mainnet from Ethereum. -You'll use the OP Sepolia testnet, but the same logic will apply to OP Mainnet. +In this tutorial you'll learn how to trigger a transaction on OP Mainnet from Ethereum using Viem. You'll use the OP Sepolia testnet, but the same logic will apply to OP Mainnet. ## Dependencies -* [node](https://nodejs.org/en/) -* [pnpm](https://pnpm.io/installation) +* [node](https://nodejs.org/en/) +* [pnpm](https://pnpm.io/installation) ## Create a Demo Project -You're going to use the `@eth-optimism/contracts-ts` package for this tutorial. -Since the `@eth-optimism/contracts-ts` package is a [Node.js](https://nodejs.org/en/) library, you'll need to create a Node.js project to use it. +You're going to use the `viem` package for this tutorial. Since Viem is a [Node.js](https://nodejs.org/en/) library, you'll need to create a Node.js project to use it. @@ -48,22 +42,10 @@ cd op-sample-project pnpm init ``` -{

Install the Contracts Package

} - -```bash -pnpm add @eth-optimism/contracts-ts -``` - -{

Install the Utils Package

} - -```bash -pnpm add @eth-optimism/core-utils -``` - -{

Install ethers.js

} +{

Install Viem

} ```bash -pnpm add ethers@^5 +pnpm add viem ```
@@ -75,8 +57,7 @@ If you have [`cast`](https://book.getfoundry.sh/getting-started/installation) in ## Get ETH on Sepolia and OP Sepolia -This tutorial explains how to bridge tokens from Sepolia to OP Sepolia. -You will need to get some ETH on both of these testnets. +This tutorial explains how to bridge tokens from Sepolia to OP Sepolia. You will need to get some ETH on both of these testnets. You can use [this faucet](https://sepoliafaucet.com) to get ETH on Sepolia. @@ -85,8 +66,8 @@ You can use the [Superchain Faucet](https://console.optimism.io/faucet?utm_sourc ## Add a Private Key to Your Environment -You need a private key in order to sign transactions. -Set your private key as an environment variable with the `export` command. +You need a private key in order to sign transactions. +Set your private key as an environment variable with the `export` command. Make sure this private key corresponds to an address that has ETH on both Sepolia and OP Sepolia. ```bash @@ -95,7 +76,7 @@ export TUTORIAL_PRIVATE_KEY=0x... ## Start the Node REPL -You're going to use the Node REPL to interact with the Optimism SDK. +You're going to use the Node REPL to interact with Viem. To start the Node REPL run the following command in your terminal: ```bash @@ -110,111 +91,144 @@ You need to import some dependencies into your Node REPL session. -{

Import the Contracts Package

} +{

Import Viem

} -```js file=/public/tutorials/send-tx-from-eth.js#L3 hash=02e8ca4ffb8e411c4b43d969c5533e24 -``` - -{

Import the Utils Package

} - -```js file=/public/tutorials/send-tx-from-eth.js#L4 hash=6e350dd75d29dff73d09b1f0cdd1fe78 -``` - -{

Import ethers.js

} - -```js file=/public/tutorials/send-tx-from-eth.js#L5 hash=69a65ef97862612e4978b8563e6dbe3a +```js +const { createPublicClient, createWalletClient, http, parseEther, formatEther } = require('viem'); +const { optimismSepolia, sepolia } = require('viem/chains'); ```
## Set Session Variables -You'll need a few variables throughout this tutorial. -Let's set those up now. +You'll need a few variables throughout this tutorial. Let's set those up now. {

Load your private key

} -```js file=/public/tutorials/send-tx-from-eth.js#L7 hash=755b77a7ffc7dfdc186f36c37d3d847a +```js +const privateKey = process.env.TUTORIAL_PRIVATE_KEY; ``` {

Create the RPC providers and wallets

} -```js file=/public/tutorials/send-tx-from-eth.js#L9-L12 hash=9afdce50665ae93bce602068071ffaa1 +```js +const l1PublicClient = createPublicClient({ chain: sepolia, transport: http() }); +const l2PublicClient = createPublicClient({ chain: optimismSepolia, transport: http() }); +const l1WalletClient = createWalletClient({ chain: sepolia, transport: http() }); +const l2WalletClient = createWalletClient({ chain: optimismSepolia, transport: http() }); ```
## Check Your Initial Balance -You'll be sending a small amount of ETH as part of this tutorial. -Quickly check your balance on OP Sepolia so that you know how much you had at the start of the tutorial. +You'll be sending a small amount of ETH as part of this tutorial. Quickly check your balance on OP Sepolia so that you know how much you had at the start of the tutorial. -```js file=/public/tutorials/send-tx-from-eth.js#L15-L16 hash=062c80bbd70e12144fe45532611a1846 +```js +const address = await l2WalletClient.account.address; +const initialBalance = await l2PublicClient.getBalance({ address }); +console.log(`Initial balance: ${formatEther(initialBalance)} ETH`); ``` ## Trigger the Transaction -Now you'll use the [`OptimismPortal`](https://github.com/ethereum-optimism/optimism/blob/62c7f3b05a70027b30054d4c8974f44000606fb7/packages/contracts-bedrock/contracts/L1/OptimismPortal.sol) contract to trigger a transaction on OP Sepolia by sending a transaction on Sepolia. +Now you'll use the `OptimismPortal` contract to trigger a transaction on OP Sepolia by sending a transaction on Sepolia. {

Create the OptimismPortal object

} -```js file=/public/tutorials/send-tx-from-eth.js#L18-L22 hash=75e09aebd1fe33724587ce7464f91940 +```js +const optimismPortalAbi = [ + { + inputs: [ + { internalType: 'uint256', name: '_gasLimit', type: 'uint256' }, + { internalType: 'bytes', name: '_data', type: 'bytes' }, + ], + name: 'depositTransaction', + outputs: [], + stateMutability: 'payable', + type: 'function', + }, +]; + +const optimismPortalAddress = '0x16fc5058f25648194471939df75cf27a2fdc48bc'; ``` {

Estimate the required gas

} -When sending transactions via the `OptimismPortal` contract it's important to always include a gas buffer. -This is because the `OptimismPortal` charges a variable amount of gas depending on the current demand for L2 transactions triggered via L1. -If you do not include a gas buffer, your transactions may fail. +When sending transactions via the `OptimismPortal` contract it's important to always include a gas buffer. This is because the `OptimismPortal` charges a variable amount of gas depending on the current demand for L2 transactions triggered via L1. If you do not include a gas buffer, your transactions may fail. -```js file=/public/tutorials/send-tx-from-eth.js#L25-L31 hash=a5ed372cf7ae78a6fea1e7a65c582cee +```js +const gasLimit = 100000n; +const data = '0x'; +const value = parseEther('0.000001'); + +const gasEstimate = await l1PublicClient.estimateContractGas({ + address: optimismPortalAddress, + abi: optimismPortalAbi, + functionName: 'depositTransaction', + args: [gasLimit, data], + value, +}); ``` {

Send the transaction

} -Now you'll send the transaction. -Note that you are including a buffer of 20% on top of the gas estimate. +Now you'll send the transaction. Note that you are including a buffer of 20% on top of the gas estimate. + +```js +const { hash: l1TxHash } = await l1WalletClient.writeContract({ + address: optimismPortalAddress, + abi: optimismPortalAbi, + functionName: 'depositTransaction', + args: [gasLimit, data], + value, + gas: gasEstimate * 120n / 100n, // 20% buffer +}); -```js file=/public/tutorials/send-tx-from-eth.js#L34-L43 hash=57a69ed74c2fb3bf2242b0452ed00f88 +console.log(`L1 transaction hash: ${l1TxHash}`); ``` {

Wait for the L1 transaction

} First you'll need to wait for the L1 transaction to be mined. -```js file=/public/tutorials/send-tx-from-eth.js#L46 hash=efcac85d794ab4711595112fbe2c7a8e +```js +const l1Receipt = await l1PublicClient.waitForTransactionReceipt({ hash: l1TxHash }); ``` {

Wait for the L2 transaction

} -Now you'll need to wait for the corresponding L2 transaction to be included in a block. -This transaction is automatically created as a result of your L1 transaction. -Here you'll determine the hash of the L2 transaction using the `@eth-optimism/core-utils` library and then wait for that transaction to be included in the L2 blockchain. +Now you'll need to wait for the corresponding L2 transaction to be included in a block. This transaction is automatically created as a result of your L1 transaction. Here you'll determine the hash of the L2 transaction and then wait for that transaction to be included in the L2 blockchain. -```js file=/public/tutorials/send-tx-from-eth.js#L49-L50 hash=28b3fcba963fc4b960e89cc96b20aea2 +```js +const l2TxHash = l1Receipt.logs[0].topics[1]; +const l2Receipt = await l2PublicClient.waitForTransactionReceipt({ hash: l2TxHash }); +console.log(`L2 transaction hash: ${l2TxHash}`); ```
## Check Your Updated Balance -You should have a little less ETH on OP Sepolia now. -Check your balance to confirm. +You should have a little less ETH on OP Sepolia now. Check your balance to confirm. -```js file=/public/tutorials/send-tx-from-eth.js#L53-L54 hash=b907d1590d7b39e8cfba4fb84886a8f9 +```js +const finalBalance = await l2PublicClient.getBalance({ address }); +console.log(`Final balance: ${formatEther(finalBalance)} ETH`); ``` Make sure that the difference is equal to the amount you were expecting to send. -```js file=/public/tutorials/send-tx-from-eth.js#L57-L58 hash=e44227b3ca6f46e6a16a10689b11ad39 +```js +const difference = initialBalance - finalBalance; +console.log(`Difference: ${formatEther(difference)} ETH`); ``` ## Next Steps -You've successfully triggered a transaction on OP Sepolia by sending a transaction on Sepolia. -Although this tutorial demonstrated the simple example of sending a basic ETH transfer from your L2 address via the OptimismPortal contract, you can use this same technique to trigger any transaction you want. -You can trigger smart contracts, send ERC-20 tokens, and more. +You've successfully triggered a transaction on OP Sepolia by sending a transaction on Sepolia using Viem. Although this tutorial demonstrated the simple example of sending a basic ETH transfer from your L2 address via the OptimismPortal contract, you can use this same technique to trigger any transaction you want. You can trigger smart contracts, send ERC-20 tokens, and more. \ No newline at end of file From 58fb20b9cfa957fd857061ab50ae617d5fb26f76 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Mon, 30 Sep 2024 16:26:15 +0100 Subject: [PATCH 071/565] update codebase --- .../app-developers/tutorials/send-tx-from-eth.mdx | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/pages/builders/app-developers/tutorials/send-tx-from-eth.mdx b/pages/builders/app-developers/tutorials/send-tx-from-eth.mdx index bd285f96a..492712ea2 100644 --- a/pages/builders/app-developers/tutorials/send-tx-from-eth.mdx +++ b/pages/builders/app-developers/tutorials/send-tx-from-eth.mdx @@ -5,17 +5,13 @@ description: Learn how to force transaction inclusion without the OP Mainnet Seq --- import { Callout, Steps } from 'nextra/components' -import { WipCallout } from '@/components/WipCallout' - # Triggering OP Mainnet Transactions from Ethereum using Viem OP Mainnet currently uses a single-Sequencer block production model. - This means that there is only one Sequencer active on the network at any given time. Single-Sequencer models are simpler than their highly decentralized counterparts but they are also more vulnerable to potential downtime. Sequencer downtime must not be able to prevent users from transacting on the network. As a result, OP Mainnet includes a mechanism for "forcing" transactions to be included in the blockchain. This mechanism involves triggering a transaction on OP Mainnet by sending a transaction on Ethereum. - In this tutorial you'll learn how to trigger a transaction on OP Mainnet from Ethereum using Viem. You'll use the OP Sepolia testnet, but the same logic will apply to OP Mainnet. ## Dependencies @@ -115,10 +111,10 @@ const privateKey = process.env.TUTORIAL_PRIVATE_KEY; {

Create the RPC providers and wallets

} ```js -const l1PublicClient = createPublicClient({ chain: sepolia, transport: http() }); -const l2PublicClient = createPublicClient({ chain: optimismSepolia, transport: http() }); -const l1WalletClient = createWalletClient({ chain: sepolia, transport: http() }); -const l2WalletClient = createWalletClient({ chain: optimismSepolia, transport: http() }); +const l1PublicClient = createPublicClient({ chain: sepolia, transport: http("https://rpc.ankr.com/eth_sepolia") }); +const l2PublicClient = createPublicClient({ chain: optimismSepolia, transport: http("https://sepolia.optimism.io") }); +const l1WalletClient = createWalletClient({ chain: sepolia, transport: http("https://rpc.ankr.com/eth_sepolia") }); +const l2WalletClient = createWalletClient({ chain: optimismSepolia, transport: http("https://sepolia.optimism.io") }); ``` From 8acc82f0bbc34c0276a5f38f37b3a2d747023636 Mon Sep 17 00:00:00 2001 From: soyboy Date: Mon, 30 Sep 2024 11:07:37 -0700 Subject: [PATCH 072/565] removing problem statement section --- pages/stack/experimental/opcm.mdx | 8 -------- 1 file changed, 8 deletions(-) diff --git a/pages/stack/experimental/opcm.mdx b/pages/stack/experimental/opcm.mdx index 0ecfd12cc..49687acfb 100644 --- a/pages/stack/experimental/opcm.mdx +++ b/pages/stack/experimental/opcm.mdx @@ -13,14 +13,6 @@ The OP Contracts Manager is a contract that deploys the L1 contracts for an OP S The version deployed is always a governance-approved contract release. The set of governance approved contract releases can be found on the Optimism Monorepo releases page, and is the set of releases named `op-contracts/vX.Y.Z`. -## Problem statement - -The current L2 chain deployment approach originates from a time with Hardhat, single L1 target, and a single monolithic set of features. Since then the system has migrated to Foundry and extended for more features, but remains centered around a single monolithic deploy-config for all its features. - -The interop team needs a way to configure new multi-L2 deployments: The number of ways to compose L2s in tests grows past what a single legacy config template can support. - -Outside of interop, deployment also seems increasingly complex and opaque, while it does not have to be, due to the same configuration and composability troubles. - ## Purpose OPCM simplifies the L1 contract deployments for new OP Stack chains. It addresses three aspects of deploying the OP Stack's L1 contracts: From db530a6c29c9760be415a0282783b28c48c120ab Mon Sep 17 00:00:00 2001 From: soyboy Date: Mon, 30 Sep 2024 13:15:35 -0700 Subject: [PATCH 073/565] carving out experimental section --- pages/stack/_meta.json | 6 +++++- pages/stack/experimental/_meta.json | 3 --- pages/stack/{experimental => }/opcm.mdx | 0 3 files changed, 5 insertions(+), 4 deletions(-) delete mode 100644 pages/stack/experimental/_meta.json rename pages/stack/{experimental => }/opcm.mdx (100%) diff --git a/pages/stack/_meta.json b/pages/stack/_meta.json index f781654fe..e2e98fa27 100644 --- a/pages/stack/_meta.json +++ b/pages/stack/_meta.json @@ -9,5 +9,9 @@ "transactions": "Transactions", "security": "Security", "operators": "Operators", - "experimental": "Experimental" + "--- Experimental": { + "title": "Experimental", + "type": "separator" + }, + "opcm": "OP Contracts Manager" } diff --git a/pages/stack/experimental/_meta.json b/pages/stack/experimental/_meta.json deleted file mode 100644 index f1e860151..000000000 --- a/pages/stack/experimental/_meta.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "opcm": "OP Contracts Manager" -} \ No newline at end of file diff --git a/pages/stack/experimental/opcm.mdx b/pages/stack/opcm.mdx similarity index 100% rename from pages/stack/experimental/opcm.mdx rename to pages/stack/opcm.mdx From f0b36ca58d9579a08d03b92e5d02bf81450c5c8b Mon Sep 17 00:00:00 2001 From: soyboy Date: Mon, 30 Sep 2024 14:10:49 -0700 Subject: [PATCH 074/565] removing issue templates --- .../ISSUE_TEMPLATE/suggest_attestation.yaml | 59 ------------- .github/ISSUE_TEMPLATE/suggest_faucet.yaml | 84 ------------------- .../ISSUE_TEMPLATE/suggest_rpc_provider.yaml | 79 ----------------- 3 files changed, 222 deletions(-) delete mode 100644 .github/ISSUE_TEMPLATE/suggest_attestation.yaml delete mode 100644 .github/ISSUE_TEMPLATE/suggest_faucet.yaml delete mode 100644 .github/ISSUE_TEMPLATE/suggest_rpc_provider.yaml diff --git a/.github/ISSUE_TEMPLATE/suggest_attestation.yaml b/.github/ISSUE_TEMPLATE/suggest_attestation.yaml deleted file mode 100644 index 502aafe7d..000000000 --- a/.github/ISSUE_TEMPLATE/suggest_attestation.yaml +++ /dev/null @@ -1,59 +0,0 @@ -name: Suggest an attestation app -description: Suggest an attestation app for developers to use when building with Optimism -title: "[ATT] Add PR title" -labels: ["documentation,attestation,community-request"] -body: - - type: markdown - attributes: - value: | - Before submitting this suggestion, be sure to read the [listing of current attestation apps](https://docs.optimism.io/identity/applications). - - type: markdown - id: project_info - attributes: - value: "## Project Info" - - type: input - id: att_name - attributes: - label: Attestation App Name - validations: - required: true - - type: textarea - id: att_description - attributes: - label: Attestation App Description - validations: - required: true - - type: input - id: att_URL - attributes: - label: Attestation App URL - description: Please provide the URL for us to link in the project description above. - validations: - required: true - - type: input - id: att_live_date - attributes: - label: When did the product go live? - description: We prioritize products that are battle-tested. - validations: - required: true - - type: dropdown - id: att_open_source - attributes: - label: Is the product open source? - description: We prioritize open source projects when possible. - options: - - "Yes" - - "No" - validations: - required: true - - type: input - id: att_github - attributes: - label: GitHub URL - description: If the project is open source, please provide a link to the product's repo. - - type: textarea - id: att_additional_context - attributes: - label: Additional context - description: Add any other context or screenshots about the product here. diff --git a/.github/ISSUE_TEMPLATE/suggest_faucet.yaml b/.github/ISSUE_TEMPLATE/suggest_faucet.yaml deleted file mode 100644 index 4ff2eb200..000000000 --- a/.github/ISSUE_TEMPLATE/suggest_faucet.yaml +++ /dev/null @@ -1,84 +0,0 @@ -name: Suggest a faucet -description: Suggest a faucet for developers to use when building with Optimism -title: "[FAUCET] Add PR title" -labels: ["documentation,faucet,community-request"] -body: - - type: markdown - attributes: - value: | - Before submitting this suggestion, be sure to read the [listing of current Faucets](https://github.com/ethereum-optimism/developers/blob/main/community/tools/faucets.md). - - type: markdown - id: project_info - attributes: - value: "## Project Info" - - type: input - id: faucet_name - attributes: - label: Faucet Name - validations: - required: true - - type: textarea - id: faucet_description - attributes: - label: Faucet Description - validations: - required: true - - type: input - id: faucet_URL - attributes: - label: Faucet URL - description: Please provide the URL for us to link in the project description above. - validations: - required: true - - type: checkboxes - id: faucet_networks - attributes: - label: Supported Networks - options: - - label: "OP Goerli" - required: false - - label: "OP Sepolia" - required: false - - label: "Base Goerli" - required: false - - label: "Base Sepolia" - required: false - - label: "Lyra Sepolia" - required: false - - label: "Mode Sepolia" - required: false - - label: "Orderly Sepolia" - required: false - - label: "PGN Sepolia" - required: false - - label: "Zora Sepolia" - required: false - validations: - required: true - - type: input - id: faucet_live_date - attributes: - label: When did the product go live? - description: We prioritize products that are battle-tested. - validations: - required: true - - type: dropdown - id: faucet_open_source - attributes: - label: Is the product open source? - description: We prioritize open source projects when possible. - options: - - "Yes" - - "No" - validations: - required: true - - type: input - id: faucet_github - attributes: - label: GitHub URL - description: If the project is open source, please provide a link to the product's repo. - - type: textarea - id: faucet_additional_context - attributes: - label: Additional context - description: Add any other context or screenshots about the product here. diff --git a/.github/ISSUE_TEMPLATE/suggest_rpc_provider.yaml b/.github/ISSUE_TEMPLATE/suggest_rpc_provider.yaml deleted file mode 100644 index 5c1cf16c7..000000000 --- a/.github/ISSUE_TEMPLATE/suggest_rpc_provider.yaml +++ /dev/null @@ -1,79 +0,0 @@ -name: Suggest an RPC provider -description: Suggest an RPC provider for developers to use when building with Optimism -title: "[RPC PROVIDER] Add PR title" -labels: ["documentation,rpc-provider,community-request"] -body: - - type: markdown - attributes: - value: | - Before submitting this suggestion, be sure to read the [listing of current RPC and Node Providers](https://github.com/ethereum-optimism/developers/blob/main/community/tools/node-providers.md). - - type: markdown - id: project_info - attributes: - value: "## Project Info" - - type: input - id: rpc_provider_name - attributes: - label: RPC Provider Name - validations: - required: true - - type: textarea - id: rpc_provider_description - attributes: - label: RPC Provider Description & Pricing - validations: - required: true - - type: input - id: rpc_provider_URL - attributes: - label: RPC Provider URL - description: Please provide the URL for us to link in the project description above. - validations: - required: true - - type: checkboxes - id: rpc_provider_networks - attributes: - label: Supported Networks - options: - - label: "OP Mainnet" - required: false - - label: "OP Goerli" - required: false - - label: "OP Sepolia" - required: false - validations: - required: true - - type: input - id: rpc_provider_live_date - attributes: - label: When did the product go live? - description: We prioritize products that are battle-tested. - validations: - required: true - - type: dropdown - id: rpc_provider_open_source - attributes: - label: Is the product open source? - description: We prioritize open source projects when possible. - options: - - "Yes" - - "No" - validations: - required: true - - type: input - id: rpc_provider_github - attributes: - label: GitHub URL - description: If the project is open source, please provide a link to the product's repo. - - type: input - id: rpc_provider_docs - attributes: - label: Documentation URL - description: Please provide a link to the product's technical documentation. - validations: - required: true - - type: textarea - id: rpc_provider_additional_context - attributes: - label: Additional context - description: Add any other context or screenshots about the product here. From 0e148dfe4c9225b6ede5de857903ec68e0f05f7a Mon Sep 17 00:00:00 2001 From: Matthew Slipper Date: Tue, 1 Oct 2024 12:48:22 -0600 Subject: [PATCH 075/565] updates from review --- pages/builders/chain-operators/tools/op-deployer.mdx | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/pages/builders/chain-operators/tools/op-deployer.mdx b/pages/builders/chain-operators/tools/op-deployer.mdx index 761e941c0..320e39719 100644 --- a/pages/builders/chain-operators/tools/op-deployer.mdx +++ b/pages/builders/chain-operators/tools/op-deployer.mdx @@ -97,9 +97,13 @@ Now that you've created your intent file, you can apply it to your chain. Run th op-deployer apply --workdir .deployer --l1-rpc-url --private-key ``` +Using a hardware wallet is currently not supported, but this deployer key has no privileges so an ephemeral hot wallet +can be used. + This command will deploy the OP Stack to L1. It will deploy all L2s specified in the intent file. Superchain configuration will be set to the Superchain-wide defaults - i.e., your chain will be opted into the Superchain pause -and will use the same protocol versions address as other chains on the Superchain. +and will use the same [protocol versions](https://github.com/ethereum-optimism/specs/blob/main/specs/protocol/superchain-upgrades.md) +address as other chains on the Superchain. ### Generating Genesis Files From ee9e13e4951eb4759af007c66f3fc8a1424e2d73 Mon Sep 17 00:00:00 2001 From: soyboy Date: Tue, 1 Oct 2024 12:02:18 -0700 Subject: [PATCH 076/565] fixing internal link --- pages/builders/chain-operators/tools/op-deployer.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/builders/chain-operators/tools/op-deployer.mdx b/pages/builders/chain-operators/tools/op-deployer.mdx index 320e39719..a7a1d1550 100644 --- a/pages/builders/chain-operators/tools/op-deployer.mdx +++ b/pages/builders/chain-operators/tools/op-deployer.mdx @@ -127,4 +127,4 @@ else. You can run another member of the `inspect` family, `rollup`, to get the r ## Next Steps * For more details, check out the tool and documentation in the [op-deployer repository](https://github.com/ethereum-optimism/optimism/tree/develop/op-chain-ops/cmd/op-deployer). -* For more information on OP Contracts Manager, refer to the [OPCM documentation](/stack/experimental/opcm). +* For more information on OP Contracts Manager, refer to the [OPCM documentation](/stack/opcm). From 2f9f18a8d17733562dadd9610184496157f3ab77 Mon Sep 17 00:00:00 2001 From: soyboy <85043086+sbvegan@users.noreply.github.com> Date: Tue, 1 Oct 2024 12:26:30 -0700 Subject: [PATCH 077/565] Apply suggestions from code review Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> --- pages/builders/chain-operators/tools/op-deployer.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/builders/chain-operators/tools/op-deployer.mdx b/pages/builders/chain-operators/tools/op-deployer.mdx index a7a1d1550..70cef0e42 100644 --- a/pages/builders/chain-operators/tools/op-deployer.mdx +++ b/pages/builders/chain-operators/tools/op-deployer.mdx @@ -9,7 +9,7 @@ import {Callout, Steps} from 'nextra/components' # Deployer -`op-deployer` simplifies the process of deploying the the OP Stack. It works similarly to [Terraform](https://www.terraform.io). Like Terraform, you define a declarative config file called an "intent," then run a +`op-deployer` simplifies the process of deploying the OP Stack. It works similarly to [Terraform](https://www.terraform.io). Like Terraform, you define a declarative config file called an "intent," then run a command to apply the intent to your chain. `op-deployer` will compare the state of your chain against the intent, and make whatever changes are necessary for them to match. From 42d71b1251df0d8bfa6db923c764eefd44c611c9 Mon Sep 17 00:00:00 2001 From: Emily Furlong Date: Wed, 2 Oct 2024 13:49:56 +0200 Subject: [PATCH 078/565] Update schemas to add new application attestation schema.mdx --- pages/chain/identity/schemas.mdx | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/pages/chain/identity/schemas.mdx b/pages/chain/identity/schemas.mdx index 8c38788a5..721b4091c 100644 --- a/pages/chain/identity/schemas.mdx +++ b/pages/chain/identity/schemas.mdx @@ -59,16 +59,17 @@ Used to associate metadata to a project. Re-issued each time there is a change t | metadataType | How the metadata can be accessed. 1 for ipfs, 2 for http | | metadataUrl | The storage location where the metadata can be retrieved | -### [Retro Funding Application](https://optimism.easscan.org/schema/view/0x88b62595c76fbcd261710d0930b5f1cc2e56758e155dea537f82bf0baadd9a32) +### [Retro Funding Application](https://optimism.easscan.org/schema/view/0x2169b74bfcb5d10a6616bbc8931dc1c56f8d1c305319a9eeca77623a991d4b80) -Used to identify a project's application to a specific Retro Funding Round. +Used to identify a project's application to a specific Retro Funding Round. This attestation is used for Retro Funding Round 6 and beyond. -| Schema UID | `0x88b62595c76fbcd261710d0930b5f1cc2e56758e155dea537f82bf0baadd9a32` | +| Schema UID | `0x2169b74bfcb5d10a6616bbc8931dc1c56f8d1c305319a9eeca77623a991d4b80` | | ----------------------- | ---------------------------------------------------------------------------------------------------------------- | | Issuer | Attestations issued as part of Retro Funding sign up are issued by: `0xF6872D315CC2E1AfF6abae5dd814fd54755fE97C` | | Recipient | Null | | round | The round number for which this application was submitted | -| projectRefUID | The unique identifier of the project that submitted this application | +| metadataType | How the metadata can be accessed. 1 for ipfs, 2 for http | +| metadataUrl | The storage location where the metadata can be retrieved | | farcasterID | The individual that submitted this application on behalf of the project. | | metadataSnapshot RefUID | The project metadata at the time the application was submitted. | @@ -146,6 +147,19 @@ Issued to those who held governance roles in the Collective, such as Grants Coun These schemas are no longer being actively issued, but capture valuable historical data. +### [Retro Funding Application](https://optimism.easscan.org/schema/view/0x88b62595c76fbcd261710d0930b5f1cc2e56758e155dea537f82bf0baadd9a32) + +Used to identify a project's application to a specific Retro Funding Round. This attestation was used for Retro Funding Rounds 4 and 5. + +| Schema UID | `0x88b62595c76fbcd261710d0930b5f1cc2e56758e155dea537f82bf0baadd9a32` | +| ----------------------- | ---------------------------------------------------------------------------------------------------------------- | +| Issuer | Attestations issued as part of Retro Funding sign up are issued by: `0xF6872D315CC2E1AfF6abae5dd814fd54755fE97C` | +| Recipient | Null | +| round | The round number for which this application was submitted | +| projectRefUID | The unique identifier of the project that submitted this application | +| farcasterID | The individual that submitted this application on behalf of the project. | +| metadataSnapshot RefUID | The project metadata at the time the application was submitted. | + ### [Retro Funding Badgeholders](https://optimism.easscan.org/schema/view/0xfdcfdad2dbe7489e0ce56b260348b7f14e8365a8a325aef9834818c00d46b31b) These attestations are considered "voting Badges" and allow an individual to vote in any given iteration of Retro Funding. They were used up to and including Retro Round 4. From 4e1f4f26c2d79050a3e35f8e65d21142ec4860fa Mon Sep 17 00:00:00 2001 From: Bradley Camacho <42678939+bradleycamacho@users.noreply.github.com> Date: Wed, 2 Oct 2024 06:36:47 -0700 Subject: [PATCH 079/565] Update style guide to align with MS guide --- pages/connect/contribute/style-guide.mdx | 62 +++++++++++++----------- 1 file changed, 33 insertions(+), 29 deletions(-) diff --git a/pages/connect/contribute/style-guide.mdx b/pages/connect/contribute/style-guide.mdx index 0c058bd9c..ddeead204 100644 --- a/pages/connect/contribute/style-guide.mdx +++ b/pages/connect/contribute/style-guide.mdx @@ -6,10 +6,12 @@ description: This guide explains how to write technical content for Optimism Doc import { Callout } from 'nextra/components' -# Docs Style Guide +# Docs style guide This Style Guide aims to assist Optimists in writing technical content with a consistent voice, tone, and style. See the [glossary](/connect/resources/glossary) for an alphabetical listing of commonly used words, terms, and concepts used throughout the technical docs and across the OP Collective. +This doc doesn't cover all questions or use-cases. Our guide is based off the [Microsoft Writing Style Guide](https://learn.microsoft.com/en-us/style-guide/welcome/). Please reference their guide for any use-case or situation we do not cover here. + * For docs-related questions or comments, create an issue in the [docs repo](https://github.com/ethereum-optimism/docs/issues). * For support-related questions or comments, create an issue in the [developers repo](https://github.com/ethereum-optimism/developers/issues). @@ -23,9 +25,9 @@ This Style Guide aims to assist Optimists in writing technical content with a co * [Content Types](#content-types) * [General Formatting](#general-formatting) -## Files, Folders, and Naming Conventions +## Files, folders, and naming conventions -### Folder Structure +### Folder structure The folder structure for the [docs.optimism.io](https://github.com/ethereum-optimism/docs) repository is organized into several high-level categories under the main `pages` folder such as `builders`, `chain`, `connect`, and `stack`. @@ -41,19 +43,19 @@ In general, filenames should be as short as possible (\~2 to 4 words) and all lo **Example:** `writing-a-guide.mdx` or `run-node.mdx` -### File Paths +### File paths File paths, when mentioned **within** a docs page, should be formatted as code snippets for readability and wrapped in backticks. **Example**: `/source/docs/assets/images/` -## Writing Style +## Writing style -### Voice and Tone +### Voice and tone Write in a friendly, yet professional tone. We are upbeat, knowledgeable, and **optimistic** about the development of the Optimism Collective, which we try our best to convey in our technical documentation. -### Clear and Concise Language +### Clear and concise language * Be consistent. Use the same terminology, voice, and tone throughout the documentation. * Be concise. Focus on providing key information and avoid including superfluous information. @@ -67,7 +69,7 @@ Write in a friendly, yet professional tone. We are upbeat, knowledgeable, and ** See below for when to use title or sentence case. -* Avoid using all caps as it slows down reading comprehension. If you need to make content prominent, use **bold** rather than all caps or italics. +* Avoid using all caps as it slows down reading comprehension. * Capitalize proper nouns in sentences.
**Example**: I use Visual Studio on my local machine. @@ -110,20 +112,20 @@ When creating content, ensure it is accessible to screen-reader users, visually * Don't use images of text, code samples, or terminal output. Use actual text. * Use SVG instead of PNG if available. SVGs stay sharp when users zoom in on the image. -## Content Organization +## Content organization We aim to use consistent organization that is also user-centered and accessible. This requires intentional work and planning to group technical content into sections instead of using long, dense paragraphs. This also gives readers a visual rest from a usability perspective and improves reading comprehension. * Use structured headings (H1, H2 or #, ##) to guide readers through the technical documentation. * Use numbered lists for chronological steps. * Use bulleted lists to visually separate content that does not require a specific order. -* Format text for optimal readability (bold vs. italics). Avoid using italics in web content as it decreases readability. Use bold if you need to make content prominent but use it sparingly. For instance, **bold** is appropriate to use when referring to a specific button or page name in technical documentation. +* Format text for optimal readability (bold vs. italics). Avoid using italics in web content as it decreases readability. For instance, **bold** is appropriate to use when referring to a specific button or page name in technical documentation. * Organize technical content to cover only one major concept or task at a time. - * **General rule of thumb**: documents with > 3 levels of structured headings (H4 or ####) and/or > than 20 minutes estimated reading time (ERT) need Revisions will typically involve editing for conciseness, splitting the document into multiple pages, or both. - * revisions will usually require editing for concision, breaking the document apart into multiple pages, or some combination of the two. + * **General rule of thumb**: documents with more than 3 levels of structured headings (H4 or ####) and/or more than than 20 minutes estimated reading time (ERT) need revisions will typically involve editing for conciseness, splitting the document into multiple pages, or both. + * Revisions will usually require editing for concision, breaking the document apart into multiple pages, or some combination of the two. * Organize content based on the audience's varying needs and prior knowledge. If pre-requisite knowledge is necessary to complete a task or understand a concept, then share it with users (including links to learn more), so they can easily get up to speed. -### Meta Tags +### Meta tags * Define the meta **title**, **language**, and **description** for each page to improve SEO ranking of the docs. Place meta tags at the top of the page before the H1 tag, with 3 dashes surrounding the block of text on either side. @@ -147,7 +149,7 @@ We aim to use consistent organization that is also user-centered and accessible. —-
-### Page Titles (H1) +### Page titles (H1) * Create concise page titles and format as H1. The title should be able to fit on 1-2 lines. * Every page must have an H1 heading, in addition to the page title being defined in the SEO meta tags. @@ -169,11 +171,11 @@ We aim to use consistent organization that is also user-centered and accessible. * Use headings in a logical manner, and the site will automatically generate anchor links for H2 and H3 tags and place them in a Table of Contents (TOC) in the right column. -* Avoid H4 levels and above within guide and template pages. As stated elsewhere in this style guide, technical documents with > 3 levels of structured headings (H4 or ####) usually indicates clarity, organization, or structural issues and should be revised. +* Avoid H4 levels and above within guide and template pages. As stated elsewhere in this style guide, technical documents with more than 3 levels of structured headings (H4 or ####) usually indicates clarity, organization, or structural issues and should be revised. * H4 headings are reserved (at this time) for glossary terms. This standardization will make it easier for us to extend glossary functionality across the docs in the future, such as tool tips. -### Listing Prerequisites (Before You Begin) +### Listing prerequisites (Before you begin) * Add a "Before You Begin" section at the top of the document if there are tasks a user needs to complete before continuing with the current task, e.g. installing a module, downloading a software update, etc. * Use the title "Before You Begin"and format as H2. It should follow the page overview/intro section or table of contents. @@ -186,7 +188,7 @@ We aim to use consistent organization that is also user-centered and accessible. ### Callouts -* Use callouts to direct users to information necessary to complete a task or information of special importance. When adding a callout to a document, use sentence case and use bold text sparingly. +* Use callouts to direct users to information necessary to complete a task or information of special importance. When adding a callout to a document, use sentence case. * Use the correct callout type based on the type of issue: a) info/general, b) warning, c) error. Our documentation platform supports 4 different callout types. * The default and info callouts are used to share non-sensitive, non-breaking info with users, such as suggestions or best practices that might make the installation or deployment easier. @@ -207,7 +209,7 @@ We aim to use consistent organization that is also user-centered and accessible. * Use callouts sparingly as too many can be confusing to readers. **As a general rule of thumb:** pages with more than 2 callouts likely needs revision and/or a discussion with an Optimism developer or product manager to ensure guide content accuracy. -### Code Samples +### Code samples * Use code samples as often as possible to help explain concepts. Can be used in guides or tutorials, but every tutorial should have at least one code sample to be useful to developers. * Any bits of code should be wrapped in backticks and use built-in syntax highlighting. Most documentation platforms automatically apply syntax highlighting when properly defined inside the code block. @@ -231,7 +233,7 @@ console.log('hello, world') * adding or showing the line numbers within the code block (easily refer to a certain code lines within the documentation) * highlighting lines or strings in the code block to draw user's attention to specific areas -### Images, Screenshots, & Icons +### Images, screenshots, & icons * Images, screenshots, and icons are stored in the `public/img` directory in the root folder. * Every image and screenshot should have descriptive alt text. @@ -280,7 +282,7 @@ clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allo Developers trust that we will lead them to sites or pages related to their reading content. In order to maintain that trust, it's important that links are transparent, up-to-date, and lead to legitimate resources. -### Internal Links +### Internal links * Internal links are automatically generated based on the H2 and H3 title tags. @@ -292,7 +294,7 @@ Developers trust that we will lead them to sites or pages related to their readi * To link to an anchor, such as an H3 tag within a page, you need to append it to the page name preceded by `#`, like this **example**: `[any descriptive text](/chain/getting-started/overview#test-your-application)`. -### Linking Across Pages +### Linking across pages * Use absolute or relative links when linking across pages in the site. Absolute links are cleaner and easier to work with when pages are nested, so they are the recommended option. @@ -314,7 +316,7 @@ Developers trust that we will lead them to sites or pages related to their readi **Example**: For more information, see [Article Title](/builders/app-developers/bridging/standard-bridge). -## Content Types +## Content types Content types help manage technical content by defining the purpose and common structure for each file type. All content types used in these technical docs have attributes or properties, as defined below. @@ -356,9 +358,9 @@ To maintain consistency, guides should include all these items: * one or more visual elements (e.g., images, screenshots, illustrations, and/or code samples) * next steps section: links to related tutorials, other guides, troubleshooting, etc. -### Quick Starts +### Quick starts -A Quick Start Guide should be brief (thus "quick"), easy to read, and focused on helping customers get started with only the basics of your product or service. It is usually a condensed version of a longer getting started guide (or a longer tutorial), so it is not a replacement but an accompaniment or companion piece to the docs set. +A Quick start guide should be brief (thus "quick"), easy to read, and focused on helping customers get started with only the basics of your product or service. It is usually a condensed version of a longer getting started guide (or a longer tutorial), so it is not a replacement but an accompaniment or companion piece to the docs set. As a rule, this content type should describe only one scenario. It's value lies in its simplicity and ability to speed up onboarding (e.g., installation, deployment, etc.) and developers' first steps, thus improving the developer experience. To maintain consistency, quick start guides should include these items: @@ -403,6 +405,8 @@ When writing tutorials or quick starts, steps should be written in parallel styl ### FAQs +Whenever possible, we should avoid using FAQs due to their lack of readability and difficulty of maintenance. + FAQs address common questions developers have/might ask about a product, feature, or service. FAQs should be written from the developer's perspective. If there are more than two steps in the answer, use a numbered list. Place FAQs onto their own separate pages, whenever possible, and link to the FAQ from within the respective guide or tutorial. To maintain consistency, FAQs should include all of these items: @@ -433,7 +437,7 @@ The heading level for FAQs will vary based on if it's an FAQ-only doc or if FAQs Include a category heading when you need to group related FAQ content (e.g., See the Optimism Glossary for a detailed example). Category headings are optional, but helpful, for longer FAQs. -### Troubleshooting Guides +### Troubleshooting guides Troubleshooting guides list common problems a developer might encounter while using a product or service, identifies the symptoms, and offers solutions to these problems. It is important to accurately capture symptoms produced by the system or interface (e.g., error messages, unexpected page refresh/reload, spinning wheel, etc.), so developers know if their system response aligns with one of the common problems identified in the troubleshooting guide. @@ -448,7 +452,7 @@ To maintain consistency, troubleshooting guides should include all of these item * solution (step-by-step) * next steps section: links to related tutorials, other guides, etc. -### Technical Reference +### Technical reference Technical references provide deep, theoretical knowledge of the internal workings of a system. These often come in the form of requirements or system specifications developers need to run the product efficiently, so lists and tables, such as API endpoints and error codes are commonplace. A technical reference page is usually quite long, so it is best practice to embed a table of contents (TOC) at the top of the page to help organize material for developers. From a usability perspective, this practice shows developers what will be covered in the reference in advance, and allows them to jump to a specific section, if desired. @@ -463,17 +467,17 @@ To maintain consistency, technical references should include all these items: Technical references often include more links throughout the document than other content types, often linking to other technical references, guides, tutorials, glossary definitions, etc. Since the purpose of technical reference material is to educate developers on a deeper level about the topic of their choosing, this is a common and expected practice and is a good indication of a strong technical reference. -## General Formatting +## General formatting ### Fonts Fonts in Optimism technical documentation are setup to follow brand guidelines established by marketing (e.g., heading fonts are different than body or paragraph font). Please do not change them. -### Bullets & Unordered Lists +### Bullets & unordered lists Please use `*` instead of `-` for items in a list. This maintains consistency across the docs. -### Date & Numbers +### Date & numbers * Use the full month, day, year format for dates whenever possible. Do not abbreviate the month. In a form or when space is limited, use slashes in the format of month/day/year without any leading zeros. From 5dec40d195d7c0fc891eb9a9bedbd4f63ce03d51 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Wed, 2 Oct 2024 14:52:28 +0100 Subject: [PATCH 080/565] updated tutorial to support CLI approach --- .../tutorials/cross-dom-bridge-eth.mdx | 299 ++++++++---------- 1 file changed, 135 insertions(+), 164 deletions(-) diff --git a/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx b/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx index 0e1cf2296..7c9081f4f 100644 --- a/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx +++ b/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx @@ -1,166 +1,140 @@ --- -title: Bridging ETH to OP Mainnet With Viem +title: Bridging ETH with Viem lang: en-US -description: Learn how to use viem to transfer ETH between Layer 1 (Ethereum or Sepolia) and Layer 2 (OP Mainnet or OP Sepolia). +description: Learn how to use Viem to transfer ETH between Layer 1 (Ethereum or Sepolia) and Layer 2 (OP Mainnet or OP Sepolia). --- -import { Callout, Steps, Tabs } from 'nextra/components' +import { Callout, Steps } from 'nextra/components' + # Bridging ETH to OP Mainnet With Viem -This tutorial explains how you can use the [Viem](https://viem.sh/op-stack/) to bridge ETH from L1 (Ethereum or Sepolia) to L2 (OP Mainnet or OP Sepolia). -The `viem/op-stack` library is an easy way to add bridging functionality to your JavaScript-based application. -It also provides some safety rails to prevent common mistakes that could cause ETH or ERC-20 tokens to be made inaccessible. +This tutorial explains how you can use [Viem](https://viem.sh) to bridge ETH from L1 (Ethereum or Sepolia) to L2 (OP Mainnet or OP Sepolia). +Viem is a TypeScript interface for Ethereum that provides low-level stateless primitives for interacting with Ethereum. +It offers an easy way to add bridging functionality to your JavaScript-based application. +Behind the scenes, Viem uses the [Standard Bridge](/builders/app-developers/bridging/standard-bridge) contracts to transfer ETH and ERC-20 tokens. Make sure to check out the [Standard Bridge guide](/builders/app-developers/bridging/standard-bridge) if you want to learn more about how the bridge works under the hood. -## Prerequisites +## Supported Networks -Before you begin, ensure you have the following: +Viem supports any of the [Superchain networks](/chain/networks). +The OP Stack networks are included in Viem by default. +If you want to use a network that isn't included by default, you can add it to Viem's chain configurations. -* Familiarity with bridging concepts between L1 and L2. -* An understanding of the [viem library](https://viem.sh/op-stack/) -* [Node.js](https://nodejs.org/en/) (version 14 or later) -* [pnpm](https://pnpm.io/installation) installed for managing packages. +## Dependencies -Install `pnpm` if you haven't already: +* [node](https://nodejs.org/en/) +* [pnpm](https://pnpm.io/installation) -```bash -npm install -g pnpm +## Create a Demo Project -``` +You're going to use Viem for this tutorial. +Since Viem is a [Node.js](https://nodejs.org/en/) library, you'll need to create a Node.js project to use it. - {

Project Setup

} +{

Make a Project Folder

} - Let's create a new project and install the necessary dependencies. +```bash +mkdir op-sample-project +cd op-sample-project +``` - * Create a folder and a file +{

Initialize the Project

} - ```bash - mkdir op-sample-project - cd op-sample-project - touch bridge-eth.js - ``` +```bash +pnpm init +``` - * Initialize the project: +{

Install the Optimism SDK

} - ```bash - pnpm init - ``` +```bash +pnpm add @eth-optimism/sdk +``` - * Install dependencies: Install `viem`, and `dotenv` for managing environment variables. +{

Install ethers.js

} - ```bash - pnpm add viem dotenv - ``` +```bash +pnpm add ethers@^5 +``` - {

Configure Environment Variables

} +
- You need a private key in order to sign transactions. - Create a `.env` file in your parent directory to securely store your environment variables - Make sure this private key corresponds to an address that has ETH on Sepolia. + +Want to create a new wallet for this tutorial? +If you have [`cast`](https://book.getfoundry.sh/getting-started/installation) installed you can run `cast wallet new` in your terminal to create a new wallet and get the private key. - ```bash - touch .env - ``` + - Add your Ethereum Layer 1 (L1) and Optimism Layer 2 (L2) RPC endpoints, and wallet private key in the `.env` file: +## Get ETH on Sepolia - ```bash - L1_RPC_URL=https://rpc.ankr.com/eth_sepolia - L2_RPC_URL=https://sepolia.optimism.io - TUTORIAL_PRIVATE_KEY=0x... - ``` - +This tutorial explains how to bridge ETH from Sepolia to OP Sepolia. +You will need to get some ETH on Sepolia to follow along. - - Never share your private key and avoid committing this file to version control. + +You can use [this faucet](https://sepoliafaucet.com) to get ETH on Sepolia. -## Import Dependencies +## Add a Private Key to Your Environment -{

Import the necessary packages

} +You need a private key in order to sign transactions. +Set your private key as an environment variable with the export command. +Make sure this private key corresponds to an address that has ETH on Sepolia. -In the `bridge-eth.js` file, import the `viem` package at the top: - -```js - -// Import required modules -import { createPublicClient, http, createWalletClient, parseEther } from 'viem'; -import { sepolia, optimismSepolia } from 'viem/chains'; -import { privateKeyToAccount } from 'viem/accounts' -import { getL2TransactionHashes, publicActionsL2, walletActionsL1 } from 'viem/op-stack' -import * as dotenv from 'dotenv'; -// Load environment variables -dotenv.config(); +```bash +export TUTORIAL_PRIVATE_KEY=0x... ``` +## Start the Node REPL -## Set Session Variables - -You'll need a few variables throughout this tutorial. -Let's set those up now. +You're going to use the Node REPL to interact with Viem. +To start the Node REPL run the following command in your terminal: - - - Create an account from the private key. [`privateKeyToAccount`](https://viem.sh/docs/accounts/local/privateKeyToAccount#privatekeytoaccount) is a viem method used to sign transactions by passing a private key. - - Load your private key with `privateKeyToAccount`, after the imports above. - - ```js - const account = privateKeyToAccount(process.env.PRIVATE_KEY); - ``` - - - - Next, set up our viem clients for the L1(Sepolia) and L2(optimismSepolia) - - - {

L1 (Sepolia) publicClientL1

} - - ```js - const publicClientL1 = createPublicClient({ - chain: sepolia, - transport: http(process.env.L1_RPC_URL), - }); - ``` - - {

L2 (optimismSepolia) publicClientL2

} - - ```js - const publicClientL2 = createPublicClient({ - chain: optimismSepolia, - transport: http(process.env.L2_RPC_URL), - }).extend(publicActionsL2()); - ``` -
-
- - - Also set up wallet clients for L1 and L2. +```bash +node +``` +This will bring up a Node REPL prompt that allows you to run JavaScript code. - - {

L1 (Sepolia) walletClientL1

} +## Import Dependencies - ```js - const walletClientL1 = createWalletClient({ - account, - chain: sepolia, /* or mainnet */ - transport: http(process.env.L1_RPC_URL), - }).extend(walletActionsL1()); - ``` +You need to import some dependencies into your Node REPL session. - {

L2 (optimismSepolia) walletClientL2

} +```js +const { createPublicClient, http, createWalletClient, parseEther } = require('viem'); +const { sepolia, optimismSepolia } = require('viem/chains'); +const { privateKeyToAccount } = require('viem/accounts'); +const { getL2TransactionHashes, publicActionsL2, walletActionsL1, walletActionsL2 } = require('viem/op-stack'); + +// Load private key from environment variable +const PRIVATE_KEY = process.env.PRIVATE_KEY; +const account = privateKeyToAccount(PRIVATE_KEY); + +// Create L1 public client for reading from the Sepolia network +const publicClientL1 = createPublicClient({ + chain: sepolia, + transport: http("https://rpc.ankr.com/eth_sepolia"), +}); + +// Create L1 wallet client for sending transactions on Sepolia +const walletClientL1 = createWalletClient({ + account, + chain: sepolia, + transport: http("https://sepolia.optimism.io"), +}).extend(walletActionsL1()); + +// Create L2 public client for interacting with OP Sepolia +const publicClientL2 = createPublicClient({ + chain: optimismSepolia, + transport: http("https://sepolia.optimism.io"), +}).extend(publicActionsL2()); + +// Create L2 wallet client for sending transactions on OP Sepolia +const walletClientL2 = createWalletClient({ + account, + chain: optimismSepolia, + transport: http("https://sepolia.optimism.io"), +}).extend(walletActionsL2()); +``` - ```js - const walletClientL2 = createWalletClient({ - chain: optimismSepolia, - transport: http(process.env.L2_RPC_URL), - }).extend(walletActionsL1()); - ``` -
-
-
## Get ETH on Sepolia @@ -179,11 +153,8 @@ Now that you have some ETH on L1 you can deposit that ETH into the `L1StandardBr See how much ETH you have on L1 so you can confirm that the deposit worked later on. ```js - const checkBalances = async () => { const l1Balance = await publicClientL1.getBalance({ address: account.address }); console.log(`L1 Balance: ${formatEther(l1Balance)} ETH`); - }; - checkBalances(); ``` @@ -244,41 +215,41 @@ Now that you have some ETH on L1 you can deposit that ETH into the `L1StandardBr - ```javascript - import { createPublicClient, http, createWalletClient, parseEther } from 'viem'; - import { sepolia, optimismSepolia } from "viem/chains"; - import { privateKeyToAccount } from 'viem/accounts'; - import { getL2TransactionHashes, publicActionsL2, walletActionsL1, walletActionsL2 } from 'viem/op-stack'; - - // Replace with your actual private key (Keep this secure!) - const PRIVATE_KEY = '0x....' - const account = privateKeyToAccount(PRIVATE_KEY); - - // Create L1 public client for reading from the Sepolia network - const publicClientL1 = createPublicClient({ - chain: sepolia, - transport: http(process.env.L1_RPC_URL), - }); - - // Create L1 wallet client for sending transactions on Sepolia - const walletClientL1 = createWalletClient({ - account, - chain: sepolia, - transport: http(process.env.L1_RPC_URL), - }).extend(walletActionsL1()); - - // Create L2 public client for interacting with OP Sepolia - const publicClientL2 = createPublicClient({ - chain: optimismSepolia, - transport: http(process.env.L1_RPC_URL), - }).extend(publicActionsL2()); - - // Create L2 wallet client for sending transactions on OP Sepolia - const walletClientL2 = createWalletClient({ - account, - chain: optimismSepolia, - transport: http(process.env.L1_RPC_URL), - }).extend(walletActionsL2()); + ```js + const { createPublicClient, http, createWalletClient, parseEther } = require('viem'); +const { sepolia, optimismSepolia } = require('viem/chains'); +const { privateKeyToAccount } = require('viem/accounts'); +const { getL2TransactionHashes, publicActionsL2, walletActionsL1, walletActionsL2 } = require('viem/op-stack'); + +// Load private key from environment variable +const PRIVATE_KEY = process.env.PRIVATE_KEY; +const account = privateKeyToAccount(PRIVATE_KEY); + +// Create L1 public client for reading from the Sepolia network +const publicClientL1 = createPublicClient({ + chain: sepolia, + transport: http("https://rpc.ankr.com/eth_sepolia"), +}); + +// Create L1 wallet client for sending transactions on Sepolia +const walletClientL1 = createWalletClient({ + account, + chain: sepolia, + transport: http("https://sepolia.optimism.io"), +}).extend(walletActionsL1()); + +// Create L2 public client for interacting with OP Sepolia +const publicClientL2 = createPublicClient({ + chain: optimismSepolia, + transport: http("https://sepolia.optimism.io"), +}).extend(publicActionsL2()); + +// Create L2 wallet client for sending transactions on OP Sepolia +const walletClientL2 = createWalletClient({ + account, + chain: optimismSepolia, + transport: http("https://sepolia.optimism.io"), +}).extend(walletActionsL2()); async function depositETH(amount) { try { @@ -440,10 +411,10 @@ Now you're going to repeat the process in reverse to bridge some ETH from L2 to ```js - import { createPublicClient, http, createWalletClient, parseEther } from 'viem'; - import { sepolia, optimismSepolia } from "viem/chains"; - import { privateKeyToAccount } from 'viem/accounts'; - import { getL2TransactionHashes, publicActionsL2, walletActionsL1, walletActionsL2 } from 'viem/op-stack'; + const { createPublicClient, http, createWalletClient, parseEther } = require('viem'); + const { sepolia, optimismSepolia } = require('viem/chains'); + const { privateKeyToAccount } = require('viem/accounts'); + const { getL2TransactionHashes, publicActionsL2, walletActionsL1, walletActionsL2 } = require('viem/op-stack'); // Replace with your actual private key (Keep this secure!) const PRIVATE_KEY = '0x....' From f9da7efd95f83f94d254a34c3db89de89becdf4c Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Wed, 2 Oct 2024 15:08:06 +0100 Subject: [PATCH 081/565] updated codebase --- .../tutorials/cross-dom-bridge-eth.mdx | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx b/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx index 7c9081f4f..4deb9fce1 100644 --- a/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx +++ b/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx @@ -4,7 +4,7 @@ lang: en-US description: Learn how to use Viem to transfer ETH between Layer 1 (Ethereum or Sepolia) and Layer 2 (OP Mainnet or OP Sepolia). --- -import { Callout, Steps } from 'nextra/components' +import { Callout, Steps, Tabs } from 'nextra/components' # Bridging ETH to OP Mainnet With Viem @@ -48,14 +48,10 @@ pnpm init {

Install the Optimism SDK

} -```bash -pnpm add @eth-optimism/sdk -``` - -{

Install ethers.js

} +Install `viem`, and `dotenv` for managing environment variables. ```bash -pnpm add ethers@^5 +pnpm add viem dotenv ``` @@ -99,13 +95,13 @@ This will bring up a Node REPL prompt that allows you to run JavaScript code. You need to import some dependencies into your Node REPL session. ```js -const { createPublicClient, http, createWalletClient, parseEther } = require('viem'); +const { createPublicClient, http, createWalletClient, parseEther, formatEther } = require('viem'); const { sepolia, optimismSepolia } = require('viem/chains'); const { privateKeyToAccount } = require('viem/accounts'); const { getL2TransactionHashes, publicActionsL2, walletActionsL1, walletActionsL2 } = require('viem/op-stack'); // Load private key from environment variable -const PRIVATE_KEY = process.env.PRIVATE_KEY; +const PRIVATE_KEY = process.env.TUTORIAL_PRIVATE_KEY; const account = privateKeyToAccount(PRIVATE_KEY); // Create L1 public client for reading from the Sepolia network @@ -167,9 +163,10 @@ Now that you have some ETH on L1 you can deposit that ETH into the `L1StandardBr ```js const args = await publicClientL2.buildDepositTransaction({ - mint: parseEther('0.006942'), // Specify the amount of ETH to deposit. + mint: parseEther('0.00010'), // Specify the amount of ETH to deposit. to: account.address, // Sets the recipient address on L2 (same as the sender in this case). }); + console.log(`Deposit transaction args ${args}`); ``` {

Send the deposit transaction

} From 21a29f8d3af19c18c991b202c99573287e54c336 Mon Sep 17 00:00:00 2001 From: Bradley Camacho <42678939+bradleycamacho@users.noreply.github.com> Date: Wed, 2 Oct 2024 07:14:31 -0700 Subject: [PATCH 082/565] Finish up missing content --- .../tools/chain-monitoring.mdx | 60 ++++++++++++++++--- 1 file changed, 52 insertions(+), 8 deletions(-) diff --git a/pages/builders/chain-operators/tools/chain-monitoring.mdx b/pages/builders/chain-operators/tools/chain-monitoring.mdx index 7cbb2c01d..f1c6eff5c 100644 --- a/pages/builders/chain-operators/tools/chain-monitoring.mdx +++ b/pages/builders/chain-operators/tools/chain-monitoring.mdx @@ -13,15 +13,55 @@ Offchain monitoring allows chain operators to monitor the operation and behavior ## Onchain Monitoring Services -Onchain monitoring services provide insights into the overall system and helps chain operators track and monitor onchain events. Some examples of onchain monitoring services include `chain-mon` and `dispute-mon`. +Onchain monitoring services provide insights into the overall system and helps chain operators track and monitor onchain events. Some examples of onchain monitoring services include `monitorism` and `dispute-mon`. -### `chain-mon` +### `monitorism` -description of service + how to enable metrics +Monitorism is a tooling suite that supports monitoring and active remediation actions for the OP Stack chain. Monitorism uses monitors as passive security providing automated monitoring for the OP Stack. They are used to monitor the OP stack and alert on specific events that could be a sign of a security incident. + +Currently. the list of monitors includes: + +- Global Events Monitor: made for to taking YAML rules as configuration and monitoring the events that are emitted on the chain. +- Liveness Expiration Monitor: monitors the liveness expiration on Safes. +- Withdrawals Monitor: checks for new withdrawals that have been proven to the OptimismPortal contract. Each withdrawal is checked against the `L2ToL1MessagePasser` contract. +- Balances Monitor: emits a metric reporting the balances for the configured accounts. +- Fault Monitor: checks for changes in output roots posted to the `L2OutputOracle` contract. On change, reconstructing the output root from a trusted L2 source and looking for a match. +- Multisig Monitor: The multisig monitor reports the paused status of the OptimismPortal contract. If set, the latest nonce of the configued Safe address. And also if set, the latest presigned nonce stored in One Password. The latest presigned nonce is identifyed by looking for items in the configued vault that follow a `ready-.json` name. The highest nonce of this item name format is reported. +- Drippie Monitor: tracks the execution and executability of drips within a Drippie contract. +- Secrets Monitor: takes a Drippie contract as a parameter and monitors for any drips within that contract that use the `CheckSecrets` dripcheck contract. `CheckSecrets` is a dripcheck that allows a drip to begin once a specific secret has been revealed (after a delay period) and cancels the drip if a second secret is revealed. It's important to monitor for these secrets being revealed as this could be a sign that the secret storage platform has been compromised and someone is attempting to exflitrate the ETH controlled by that drip. +- Faultproof Withdrawal: The Faultproof Withdrawal component monitors `ProvenWithdrawals` events on the `OptimismPortal` contract and performs checks to detect any violations of invariant conditions on the chain. If a violation is detected, it logs the issue and sets a Prometheus metric for the event. This component is designed to work exclusively with chains that are already utilizing the Fault Proofs system. This is a new version of the deprecated chain-mon faultproof-wd-mon. For detailed information on how the component works and the algorithms used, please refer to the component README. + +For more information on these monitors and how to use them, [check out the repo](https://github.com/ethereum-optimism/monitorism?tab=readme-ov-file#monitorism). ### `dispute-mon` Chain operators should consider running `op-dispute-mon`. It's an incredibly useful securities monitoring service to keep an eye on games, basically giving visibility into all the status of the games for the last 28 days. + +`dispute-mon` is set up and built the same way as `op-challenger`. This means that you can run it the same way (run `make op-dispute-mon` in the directory). + +A basic configuration option would look like this: + +``` +OP_DISPUTE_MON_LOG_FORMAT=logfmt +OP_DISPUTE_MON_METRICS_ENABLED=true +OP_DISPUTE_MON_METRICS_ADDR=0.0.0.0 +OP_DISPUTE_MON_METRICS_PORT=7300 + +OP_DISPUTE_MON_L1_ETH_RPC=.. +OP_DISPUTE_MON_ROLLUP_RPC=.. +OP_DISPUTE_MON_GAME_FACTORY_ADDRESS=.. + +OP_DISPUTE_MON_HONEST_ACTORS=.. +``` +`OP_DISPUTE_MON_HONEST_ACTORS` is a CSV (no spacing) list of addresses that are used for the honest op-challenger instance(s). + +Additional flags: +- `OP_DISPUTE_MON_GAME_WINDOW`: This is the window of time to report on games. It should leave a buffer beyond the max game duration for bond claiming. If Fault Proof game parameters are not changes (e.g. MAX_CLOCK_DURATION), it is recommended to leave this as the default. +- `OP_DISPUTE_MON_MONITOR_INTERVAL`: The interval at which to check for new games. Defaults to 30 seconds currently. +- `OP_DISPUTE_MON_MAX_CONCURRENCY`: The max thread count. Defaults to 5 currently. + +You can find more info on `op-dispute-mon` on [the repo](https://github.com/ethereum-optimism/optimism/tree/develop/op-dispute-mon). + Chain operators can easily create their grafana dashboard for Dispute Monitor using the following json file: [Download the Dispute Monitor JSON](/grafana/dispute-monitor-1718214549035.json). ## Offchain Component Monitoring @@ -31,9 +71,9 @@ The general steps for enabling offchain monitoring is pretty consistent for all 1. Expose the monitoring port by enabling the `-—metrics.enabled` flag 2. Customize the metrics port and address via the `--metrics.port` and `--metrics.addr` flags, respectively -3. Use Prometheus to scrape data from the metrics port +3. Use [Prometheus](https://prometheus.io/) to scrape data from the metrics port 4. Save the data in `influxdb` -5. Share the data with grafana to build your custom dashboard +5. Share the data with [Grafana](https://grafana.com/) to build your custom dashboard ### `op-node` @@ -42,15 +82,19 @@ See [this curated list](/builders/node-operators/management/metrics#important-me ### `op-geth` -description of component + how to enable metrics +To enable metrics, pass the `--metrics.enabled` flag to the op-geth. You can customize the metrics port and address via the `--metrics.port` and `--metrics.addr` flags, respectively. ### `op-proposer` -description of component + how to enable metrics +To enable metrics, pass the `--metrics.enabled` flag to the op-proposer. You can customize the metrics port and address via the `--metrics.port` and `--metrics.addr` flags, respectively. + +You can find more information about these flags in our [Proposer configuration doc](https://docs.optimism.io/builders/chain-operators/configuration/proposer#metricsenabled). ### `op-batcher` -description of component + how to enable metrics +To enable metrics, pass the `--metrics.enabled` flag to the op-batcher. You can customize the metrics port and address via the `--metrics.port` and `--metrics.addr` flags, respectively. + +You can find more information about these flags in our [Batcher configuration doc](https://docs.optimism.io/builders/chain-operators/configuration/batcher#metricsenabled). ### `op-challenger` From 846ef7ed9b53c38941131717c4c0447313abe233 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Wed, 2 Oct 2024 15:19:20 +0100 Subject: [PATCH 083/565] updated codebase --- .../app-developers/tutorials/cross-dom-bridge-eth.mdx | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx b/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx index 4deb9fce1..711487357 100644 --- a/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx +++ b/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx @@ -163,10 +163,9 @@ Now that you have some ETH on L1 you can deposit that ETH into the `L1StandardBr ```js const args = await publicClientL2.buildDepositTransaction({ - mint: parseEther('0.00010'), // Specify the amount of ETH to deposit. - to: account.address, // Sets the recipient address on L2 (same as the sender in this case). + mint: parseEther('0.00010'), + to: "0x00000000000000000000000000", }); - console.log(`Deposit transaction args ${args}`); ``` {

Send the deposit transaction

} From 92314e9651b7a08640f10db7fec7a9f8c6936524 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Wed, 2 Oct 2024 15:42:43 +0100 Subject: [PATCH 084/565] updated address --- .../builders/app-developers/tutorials/cross-dom-bridge-eth.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx b/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx index 711487357..a92380028 100644 --- a/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx +++ b/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx @@ -164,7 +164,7 @@ Now that you have some ETH on L1 you can deposit that ETH into the `L1StandardBr ```js const args = await publicClientL2.buildDepositTransaction({ mint: parseEther('0.00010'), - to: "0x00000000000000000000000000", + to: "0x1000000000000000000000000000000000000000", }); ``` From 2dc0caaf1649f18db376e586e4b540eb36ca0366 Mon Sep 17 00:00:00 2001 From: Bradley Camacho <42678939+bradleycamacho@users.noreply.github.com> Date: Wed, 2 Oct 2024 07:47:14 -0700 Subject: [PATCH 085/565] Sentence casing first batch --- .../app-developers/bridging/basics.mdx | 8 ++++---- .../app-developers/bridging/custom-bridge.mdx | 4 ++-- .../app-developers/bridging/messaging.mdx | 20 +++++++++---------- .../bridging/standard-bridge.mdx | 8 ++++---- 4 files changed, 20 insertions(+), 20 deletions(-) diff --git a/pages/builders/app-developers/bridging/basics.mdx b/pages/builders/app-developers/bridging/basics.mdx index 5b8edaba1..283b8ba99 100644 --- a/pages/builders/app-developers/bridging/basics.mdx +++ b/pages/builders/app-developers/bridging/basics.mdx @@ -4,26 +4,26 @@ lang: en-US description: Learn about the fundamentals of sending data and tokens between Ethereum and OP Mainnet. --- -# Bridging Basics +# Bridging basics OP Mainnet is a "Layer 2" system and is fundamentally connected to Ethereum. However, OP Mainnet is also a distinct blockchain with its own blocks and transactions. App developers commonly need to move data and tokens between OP Mainnet and Ethereum. This process of moving data and tokens between the two networks is called "bridging". -## Sending Tokens +## Sending tokens One of the most common use cases for bridging is the need to send ETH or ERC-20 tokens between OP Mainnet and Ethereum. OP Mainnet has a system called the [Standard Bridge](./standard-bridge) that makes it easy to move tokens in both directions. If you mostly need to bridge tokens, make sure to check out the [Standard Bridge](./standard-bridge) guide. -## Sending Data +## Sending ata Under the hood, the Standard Bridge is just an application that uses the OP Mainnet [message passing system to send arbitrary data between Ethereum and OP Mainnet](./messaging). Applications can use this system to have a contract on Ethereum interact with a contract on OP Mainnet, and vice versa. All of this is easily accessible with a simple, clean API. -## Next Steps +## Next steps Ready to start bridging? Check out these tutorials to get up to speed fast. diff --git a/pages/builders/app-developers/bridging/custom-bridge.mdx b/pages/builders/app-developers/bridging/custom-bridge.mdx index 23ea17319..9df9557d1 100644 --- a/pages/builders/app-developers/bridging/custom-bridge.mdx +++ b/pages/builders/app-developers/bridging/custom-bridge.mdx @@ -6,7 +6,7 @@ description: Important considerations when building custom bridges for OP Mainne import { Callout } from 'nextra/components' -# Custom Bridges +# Custom bridges Custom token bridges are any bridges other than the [Standard Bridge](./standard-bridge). You may find yourself in a position where you need to build a custom token bridge because the Standard Bridge doesn't completely support your use case. @@ -35,7 +35,7 @@ The [Superchain Token List](/chain/tokenlist) exists to help users and developer Once you've built and tested your custom bridge, make sure to register any tokens meant to flow through this bridge by [making a pull request against the Superchain Token List repository](https://github.com/ethereum-optimism/ethereum-optimism.github.io#adding-a-token-to-the-list). You **must** deploy your bridge to OP Sepolia before it can be added to the Superchain Token List. -## Next Steps +## Next steps You can explore several examples of custom bridges for OP Mainnet: diff --git a/pages/builders/app-developers/bridging/messaging.mdx b/pages/builders/app-developers/bridging/messaging.mdx index 0d8cd9e6a..c8f29405b 100644 --- a/pages/builders/app-developers/bridging/messaging.mdx +++ b/pages/builders/app-developers/bridging/messaging.mdx @@ -6,7 +6,7 @@ description: Learn how bridging works between L1 and L2, how to use it, and what import { Callout } from 'nextra/components' -# Sending Data Between L1 and L2 +# Sending data between L1 and L2 Smart contracts on L1 (Ethereum) can interact with smart contracts on L2 (OP Mainnet) through a process called "bridging". This page explains how bridging works, how to use it, and what to watch out for. @@ -16,7 +16,7 @@ This page explains how bridging works, how to use it, and what to watch out for. For a step-by-step tutorial on how to send data between L1 and L2, check out the [Solidity tutorial](/builders/app-developers/tutorials/cross-dom-solidity).
-## Understanding Contract Calls +## Understanding contract calls It can be easier to understand bridging if you first have a basic understanding of how contracts on EVM-based blockchains like OP Mainnet and Ethereum communicate within the *same* network. The interface for sending messages *between* Ethereum and OP Mainnet is designed to mimic the standard contract communication interface as much as possible. @@ -57,7 +57,7 @@ Here you're using the [low-level "call" function](https://docs.soliditylang.org/ Although these two code snippets look a bit different, they're doing the exact same thing. Because of limitations of Solidity, **the OP Stack's bridging interface is designed to look like the second code snippet**. -## Basics of Communication Between Layers +## Basics of communication between layers At a high level, the process for sending data between L1 and L2 is pretty similar to the process for sending data between two contracts on Ethereum (with a few caveats). Communication between L1 and L2 is made possible by a pair of special smart contracts called the "messenger" contracts. @@ -121,17 +121,17 @@ contract MyContract { You can find the addresses of the `L1CrossDomainMessenger` and the `L2CrossDomainMessenger` contracts on OP Mainnet and OP Sepolia on the [Contract Addresses](/chain/addresses) page.
-## Communication Speed +## Communication speed Unlike calls between contracts on the same blockchain, calls between Ethereum and OP Mainnet are *not* instantaneous. The speed of a cross-chain transaction depends on the direction in which the transaction is sent. -### For L1 to L2 Transactions +### For L1 to L2 transactions Transactions sent from L1 to L2 take **approximately 1-3 minutes** to get from Ethereum to OP Mainnet, or from Sepolia to OP Sepolia. This is because the Sequencer waits for a certain number of L1 blocks to be created before including L1 to L2 transactions to avoid potentially annoying [reorgs](https://www.alchemy.com/overviews/what-is-a-reorg). -### For L2 to L1 Transactions +### For L2 to L1 transactions Transactions sent from L2 to L1 take **approximately 7 days** to get from OP Mainnet to Ethereum, or from OP Sepolia to Sepolia. This is because the bridge contract on L1 must wait for the L2 state to be *proven* to the L1 chain before it can relay the message. @@ -177,9 +177,9 @@ modifier onlyOwner() { } ``` -## Fees For Sending Data Between L1 and L2 +## Fees for sending data between L1 and L2 -### For L1 to L2 Transactions +### For L1 to L2 transactions The majority of the cost of an L1 to L2 transaction comes from the smart contract execution on L1. When sending an L1 to L2 transaction, you send to the [`L1CrossDomainMessenger`](https://github.com/ethereum-optimism/optimism/blob/111f3f3a3a2881899662e53e0f1b2f845b188a38/packages/contracts-bedrock/src/L1/L1CrossDomainMessenger.sol) contract, which then sends a call to the [`OptimismPortal`](https://github.com/ethereum-optimism/optimism/blob/111f3f3a3a2881899662e53e0f1b2f845b188a38/packages/contracts-bedrock/src/L1/OptimismPortal.sol) contract. @@ -195,7 +195,7 @@ The amount of L1 gas charged increases when more people are sending L1 to L2 tra You should always add a buffer of at least 20% to the gas limit for your L1 to L2 transaction to avoid running out of gas. -### For L2 to L1 Transactions +### For L2 to L1 transactions Each message from L2 to L1 requires three transactions: @@ -211,7 +211,7 @@ Each message from L2 to L1 requires three transactions: The total cost of an L2 to L1 transaction is therefore the combined cost of the L2 initialization transaction and the two L1 transactions. The L1 proof and finalization transactions are typically significantly more expensive than the L2 initialization transaction. -## Understanding the Challenge Period +## Understanding the challenge period One of the most important things to understand about L1 ⇔ L2 interaction is that **mainnet messages sent from Layer 2 to Layer 1 cannot be relayed for at least 7 days**. This means that any messages you send from Layer 2 will only be received on Layer 1 after this one week period has elapsed. diff --git a/pages/builders/app-developers/bridging/standard-bridge.mdx b/pages/builders/app-developers/bridging/standard-bridge.mdx index da23a5059..2d137d6ad 100644 --- a/pages/builders/app-developers/bridging/standard-bridge.mdx +++ b/pages/builders/app-developers/bridging/standard-bridge.mdx @@ -36,7 +36,7 @@ The Standard Bridge is composed of two contracts, the [`L1StandardBridge`](https These two contracts interact with one another via the `CrossDomainMessenger` system for sending messages between Ethereum and OP Mainnet. You can read more about the `CrossDomainMessenger` in the guide on [Sending Data Between L1 and L2](./messaging). -### Bridged Tokens +### Bridged tokens The Standard Bridge utilizes bridged representations of tokens that are native to another blockchain. Before a token native to one chain can be bridged to the other chain, a bridged representation of that token must be created on the receiving side. @@ -50,7 +50,7 @@ A native token may have more than one bridged representation at the same time. Users must always specify which bridged token they wish to use when using the bridge. Different bridged representations of the same native token are considered entirely independent tokens. -### Bridging Native Tokens +### Bridging native tokens The Standard Bridge uses a "lock-and-mint" mechanism to convert native tokens into their bridged representations. This means that **native tokens are locked** into the Standard Bridge on one side, after which **bridged tokens are minted** on the other side. @@ -129,7 +129,7 @@ The process for bridging a native token involves a few steps. This process is identical in both the Ethereum to OP Mainnet and OP Mainnet to Ethereum directions. -### Bridging Non-Native Tokens +### Bridging non-native tokens The Standard Bridge uses a "burn-and-unlock" mechanism to convert bridged representations of tokens back into their native tokens. This means that **bridged tokens are burned** on the Standard Bridge on one side, after which **native tokens are unlocked** on the other side. @@ -237,7 +237,7 @@ The address of this entry is the address of the bridged representation of the to -## Special Considerations +## Special considerations ### USDC From c02ab8fbc32c12a97459f9e910f941d11c6a5bdd Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Wed, 2 Oct 2024 18:42:52 +0100 Subject: [PATCH 086/565] updated the codebase --- .../app-developers/tutorials/cross-dom-bridge-eth.mdx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx b/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx index a92380028..30fc20c8a 100644 --- a/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx +++ b/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx @@ -114,7 +114,7 @@ const publicClientL1 = createPublicClient({ const walletClientL1 = createWalletClient({ account, chain: sepolia, - transport: http("https://sepolia.optimism.io"), + transport: http("https://rpc.ankr.com/eth_sepolia"), }).extend(walletActionsL1()); // Create L2 public client for interacting with OP Sepolia @@ -164,7 +164,7 @@ Now that you have some ETH on L1 you can deposit that ETH into the `L1StandardBr ```js const args = await publicClientL2.buildDepositTransaction({ mint: parseEther('0.00010'), - to: "0x1000000000000000000000000000000000000000", + to: account.address, }); ``` @@ -303,8 +303,8 @@ Now you're going to repeat the process in reverse to bridge some ETH from L2 to Converts the withdrawal amount to `wei` and specifies the recipient on L1. ```js - const args = await publicClientL2.buildWithdrawalTransaction({ - withdrawalAmount: parseEther(amount), + const withdrawArgs = await publicClientL1.buildInitiateWithdrawal({ + withdrawalAmount: parseEther('0.0001'), to: account.address, }); ``` From 7c27591dbd1b8e585dc9f16aeb658251176869b4 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Wed, 2 Oct 2024 22:16:37 +0100 Subject: [PATCH 087/565] fix liniting issues --- .../tutorials/cross-dom-bridge-eth.mdx | 198 +++++++++--------- words.txt | 1 + 2 files changed, 100 insertions(+), 99 deletions(-) diff --git a/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx b/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx index 30fc20c8a..c833053c0 100644 --- a/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx +++ b/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx @@ -6,7 +6,6 @@ description: Learn how to use Viem to transfer ETH between Layer 1 (Ethereum or import { Callout, Steps, Tabs } from 'nextra/components' - # Bridging ETH to OP Mainnet With Viem This tutorial explains how you can use [Viem](https://viem.sh) to bridge ETH from L1 (Ethereum or Sepolia) to L2 (OP Mainnet or OP Sepolia). @@ -24,8 +23,8 @@ If you want to use a network that isn't included by default, you can add it to V ## Dependencies -* [node](https://nodejs.org/en/) -* [pnpm](https://pnpm.io/installation) +* [node](https://nodejs.org/en/) +* [pnpm](https://pnpm.io/installation) ## Create a Demo Project @@ -33,33 +32,31 @@ You're going to use Viem for this tutorial. Since Viem is a [Node.js](https://nodejs.org/en/) library, you'll need to create a Node.js project to use it. -{

Make a Project Folder

} + {

Make a Project Folder

} -```bash -mkdir op-sample-project -cd op-sample-project -``` + ```bash + mkdir op-sample-project + cd op-sample-project + ``` -{

Initialize the Project

} - -```bash -pnpm init -``` + {

Initialize the Project

} -{

Install the Optimism SDK

} + ```bash + pnpm init + ``` -Install `viem`, and `dotenv` for managing environment variables. + {

Install the Optimism SDK

} -```bash -pnpm add viem dotenv -``` + Install `viem`, and `dotenv` for managing environment variables. + ```bash + pnpm add viem dotenv + ```
-Want to create a new wallet for this tutorial? -If you have [`cast`](https://book.getfoundry.sh/getting-started/installation) installed you can run `cast wallet new` in your terminal to create a new wallet and get the private key. - + Want to create a new wallet for this tutorial? + If you have [`cast`](https://book.getfoundry.sh/getting-started/installation) installed you can run `cast wallet new` in your terminal to create a new wallet and get the private key. ## Get ETH on Sepolia @@ -68,7 +65,7 @@ This tutorial explains how to bridge ETH from Sepolia to OP Sepolia. You will need to get some ETH on Sepolia to follow along. -You can use [this faucet](https://sepoliafaucet.com) to get ETH on Sepolia. + You can use [this faucet](https://sepoliafaucet.com) to get ETH on Sepolia. ## Add a Private Key to Your Environment @@ -80,6 +77,7 @@ Make sure this private key corresponds to an address that has ETH on Sepolia. ```bash export TUTORIAL_PRIVATE_KEY=0x... ``` + ## Start the Node REPL You're going to use the Node REPL to interact with Viem. @@ -88,6 +86,7 @@ To start the Node REPL run the following command in your terminal: ```bash node ``` + This will bring up a Node REPL prompt that allows you to run JavaScript code. ## Import Dependencies @@ -98,7 +97,7 @@ You need to import some dependencies into your Node REPL session. const { createPublicClient, http, createWalletClient, parseEther, formatEther } = require('viem'); const { sepolia, optimismSepolia } = require('viem/chains'); const { privateKeyToAccount } = require('viem/accounts'); -const { getL2TransactionHashes, publicActionsL2, walletActionsL1, walletActionsL2 } = require('viem/op-stack'); +const { getL2TransactionHashes, publicActionsL1, publicActionsL2, walletActionsL1, walletActionsL2 } = require('viem/op-stack'); // Load private key from environment variable const PRIVATE_KEY = process.env.TUTORIAL_PRIVATE_KEY; @@ -108,7 +107,7 @@ const account = privateKeyToAccount(PRIVATE_KEY); const publicClientL1 = createPublicClient({ chain: sepolia, transport: http("https://rpc.ankr.com/eth_sepolia"), -}); +}).extend(publicActionsL1()) // Create L1 wallet client for sending transactions on Sepolia const walletClientL1 = createWalletClient({ @@ -131,7 +130,6 @@ const walletClientL2 = createWalletClient({ }).extend(walletActionsL2()); ``` - ## Get ETH on Sepolia You're going to need some ETH on L1 that you can bridge to L2. @@ -213,39 +211,39 @@ Now that you have some ETH on L1 you can deposit that ETH into the `L1StandardBr ```js const { createPublicClient, http, createWalletClient, parseEther } = require('viem'); -const { sepolia, optimismSepolia } = require('viem/chains'); -const { privateKeyToAccount } = require('viem/accounts'); -const { getL2TransactionHashes, publicActionsL2, walletActionsL1, walletActionsL2 } = require('viem/op-stack'); + const { sepolia, optimismSepolia } = require('viem/chains'); + const { privateKeyToAccount } = require('viem/accounts'); + const { getL2TransactionHashes, publicActionsL2, walletActionsL1, walletActionsL2 } = require('viem/op-stack'); -// Load private key from environment variable -const PRIVATE_KEY = process.env.PRIVATE_KEY; -const account = privateKeyToAccount(PRIVATE_KEY); + // Load private key from environment variable + const PRIVATE_KEY = process.env.PRIVATE_KEY; + const account = privateKeyToAccount(PRIVATE_KEY); -// Create L1 public client for reading from the Sepolia network -const publicClientL1 = createPublicClient({ + // Create L1 public client for reading from the Sepolia network + const publicClientL1 = createPublicClient({ chain: sepolia, transport: http("https://rpc.ankr.com/eth_sepolia"), -}); + }).extend(publicActionsL1()) -// Create L1 wallet client for sending transactions on Sepolia -const walletClientL1 = createWalletClient({ + // Create L1 wallet client for sending transactions on Sepolia + const walletClientL1 = createWalletClient({ account, chain: sepolia, transport: http("https://sepolia.optimism.io"), -}).extend(walletActionsL1()); + }).extend(walletActionsL1()); -// Create L2 public client for interacting with OP Sepolia -const publicClientL2 = createPublicClient({ + // Create L2 public client for interacting with OP Sepolia + const publicClientL2 = createPublicClient({ chain: optimismSepolia, transport: http("https://sepolia.optimism.io"), -}).extend(publicActionsL2()); + }).extend(publicActionsL2()); -// Create L2 wallet client for sending transactions on OP Sepolia -const walletClientL2 = createWalletClient({ + // Create L2 wallet client for sending transactions on OP Sepolia + const walletClientL2 = createWalletClient({ account, chain: optimismSepolia, transport: http("https://sepolia.optimism.io"), -}).extend(walletActionsL2()); + }).extend(walletActionsL2()); async function depositETH(amount) { try { @@ -314,7 +312,7 @@ Now you're going to repeat the process in reverse to bridge some ETH from L2 to This sends the withdrawal transaction on L2, which initiates the withdrawal process on L2 and logs a transaction hash for tracking the withdrawal. ```js - const hash = await walletClientL2.initiateWithdrawal(args); + const hash = await walletClientL2.initiateWithdrawal(withdrawArgs); console.log(`Withdrawal transaction hash on L2: ${hash}`); ``` @@ -407,91 +405,93 @@ Now you're going to repeat the process in reverse to bridge some ETH from L2 to ```js - const { createPublicClient, http, createWalletClient, parseEther } = require('viem'); - const { sepolia, optimismSepolia } = require('viem/chains'); - const { privateKeyToAccount } = require('viem/accounts'); - const { getL2TransactionHashes, publicActionsL2, walletActionsL1, walletActionsL2 } = require('viem/op-stack'); + const { createPublicClient, http, createWalletClient, parseEther } = require('viem'); + const { sepolia, optimismSepolia } = require('viem/chains'); + const { privateKeyToAccount } = require('viem/accounts'); + const { getL2TransactionHashes, publicActionsL2, walletActionsL1, walletActionsL2 } = require('viem/op-stack'); - // Replace with your actual private key (Keep this secure!) - const PRIVATE_KEY = '0x....' + + // Load private key from environment variable + const PRIVATE_KEY = process.env.PRIVATE_KEY; const account = privateKeyToAccount(PRIVATE_KEY); // Create L1 public client for reading from the Sepolia network const publicClientL1 = createPublicClient({ - chain: sepolia, - transport: http(process.env.L1_RPC_URL), - }); + chain: sepolia, + transport: http("https://rpc.ankr.com/eth_sepolia"), + }).extend(publicActionsL1()) // Create L1 wallet client for sending transactions on Sepolia const walletClientL1 = createWalletClient({ - account, - chain: sepolia, - transport: http(process.env.L1_RPC_URL), + account, + chain: sepolia, + transport: http("https://sepolia.optimism.io"), }).extend(walletActionsL1()); // Create L2 public client for interacting with OP Sepolia const publicClientL2 = createPublicClient({ - chain: optimismSepolia, - transport: http(process.env.L2_RPC_URL), + chain: optimismSepolia, + transport: http("https://sepolia.optimism.io"), }).extend(publicActionsL2()); // Create L2 wallet client for sending transactions on OP Sepolia const walletClientL2 = createWalletClient({ - account, - chain: optimismSepolia, - transport: http(process.env.L2_RPC_URL), + account, + chain: optimismSepolia, + transport: http("https://sepolia.optimism.io"), }).extend(walletActionsL2()); + async function withdrawETH(amount) { - try { - const args = await publicClientL2.buildWithdrawalTransaction({ - withdrawalAmount: parseEther(amount), - to: account.address, - }); + try { + const args = await publicClientL2.buildWithdrawalTransaction({ + withdrawalAmount: parseEther(amount), + to: account.address, + }); - const hash = await walletClientL2.initiateWithdrawal(args); - console.log(`Withdrawal transaction hash on L2: ${hash}`); + const hash = await walletClientL2.initiateWithdrawal(args); + console.log(`Withdrawal transaction hash on L2: ${hash}`); - const receipt = await publicClientL2.waitForTransactionReceipt({ hash }); - console.log('L2 transaction confirmed:', receipt); + const receipt = await publicClientL2.waitForTransactionReceipt({ hash }); + console.log('L2 transaction confirmed:', receipt); - const { output, withdrawal } = await publicClientL1.waitToProve({ - receipt, - targetChain: walletClientL2.chain - }); + const { output, withdrawal } = await publicClientL1.waitToProve({ + receipt, + targetChain: walletClientL2.chain + }); - const proveArgs = await publicClientL2.buildProveWithdrawal({ - output, - withdrawal, - }); + const proveArgs = await publicClientL2.buildProveWithdrawal({ + output, + withdrawal, + }); - const proveHash = await walletClientL1.proveWithdrawal(proveArgs); + const proveHash = await walletClientL1.proveWithdrawal(proveArgs); - const proveReceipt = await publicClientL1.waitForTransactionReceipt({ hash: proveHash }); + const proveReceipt = await publicClientL1.waitForTransactionReceipt({ hash: proveHash }); - const awaitWithdrawal = await publicClientL1.waitToFinalize({ - targetChain: walletClientL2.chain, - withdrawalHash: withdrawal.withdrawalHash, - }); + const awaitWithdrawal = await publicClientL1.waitToFinalize({ + targetChain: walletClientL2.chain, + withdrawalHash: withdrawal.withdrawalHash, + }); - const finalizeHash = await walletClientL1.finalizeWithdrawal({ - targetChain: walletClientL2.chain, - withdrawal, - }); + const finalizeHash = await walletClientL1.finalizeWithdrawal({ + targetChain: walletClientL2.chain, + withdrawal, + }); - const finalizeReceipt = await publicClientL1.waitForTransactionReceipt({ - hash: finalizeHash - }); + const finalizeReceipt = await publicClientL1.waitForTransactionReceipt({ + hash: finalizeHash + }); - const status = await publicClientL1.getWithdrawalStatus({ - receipt, - targetChain: walletClientL2.chain - }) + const status = await publicClientL1.getWithdrawalStatus({ + receipt, + targetChain: walletClientL2.chain + }) - console.log('Withdrawal completed successfully!'); - } catch (error) { - console.error('Error during withdrawal:', error); - } + console.log('Withdrawal completed successfully!'); + } catch (error) { + console.error('Error during withdrawal:', error); + } } ``` diff --git a/words.txt b/words.txt index e94c0784a..a8222571e 100644 --- a/words.txt +++ b/words.txt @@ -362,6 +362,7 @@ VHOSTS vhosts Viem viem +Viem's VMDEBUG vmdebug VMODULE From 87741c394d90fbd6cd220a0b478bdb8363f50818 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Wed, 2 Oct 2024 22:21:09 +0100 Subject: [PATCH 088/565] adjusted codebase --- .../tutorials/cross-dom-bridge-eth.mdx | 99 +++++++++---------- 1 file changed, 49 insertions(+), 50 deletions(-) diff --git a/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx b/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx index c833053c0..78619d79e 100644 --- a/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx +++ b/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx @@ -210,71 +210,71 @@ Now that you have some ETH on L1 you can deposit that ETH into the `L1StandardBr ```js - const { createPublicClient, http, createWalletClient, parseEther } = require('viem'); + const { createPublicClient, http, createWalletClient, parseEther, formatEther } = require('viem'); const { sepolia, optimismSepolia } = require('viem/chains'); const { privateKeyToAccount } = require('viem/accounts'); - const { getL2TransactionHashes, publicActionsL2, walletActionsL1, walletActionsL2 } = require('viem/op-stack'); + const { getL2TransactionHashes, publicActionsL1, publicActionsL2, walletActionsL1, walletActionsL2 } = require('viem/op-stack'); // Load private key from environment variable - const PRIVATE_KEY = process.env.PRIVATE_KEY; + const PRIVATE_KEY = process.env.TUTORIAL_PRIVATE_KEY; const account = privateKeyToAccount(PRIVATE_KEY); // Create L1 public client for reading from the Sepolia network const publicClientL1 = createPublicClient({ - chain: sepolia, - transport: http("https://rpc.ankr.com/eth_sepolia"), + chain: sepolia, + transport: http("https://rpc.ankr.com/eth_sepolia"), }).extend(publicActionsL1()) // Create L1 wallet client for sending transactions on Sepolia const walletClientL1 = createWalletClient({ - account, - chain: sepolia, - transport: http("https://sepolia.optimism.io"), + account, + chain: sepolia, + transport: http("https://rpc.ankr.com/eth_sepolia"), }).extend(walletActionsL1()); // Create L2 public client for interacting with OP Sepolia const publicClientL2 = createPublicClient({ - chain: optimismSepolia, - transport: http("https://sepolia.optimism.io"), + chain: optimismSepolia, + transport: http("https://sepolia.optimism.io"), }).extend(publicActionsL2()); // Create L2 wallet client for sending transactions on OP Sepolia const walletClientL2 = createWalletClient({ - account, - chain: optimismSepolia, - transport: http("https://sepolia.optimism.io"), + account, + chain: optimismSepolia, + transport: http("https://sepolia.optimism.io"), }).extend(walletActionsL2()); async function depositETH(amount) { try { - // Build the deposit transaction parameters - const args = await publicClientL2.buildDepositTransaction({ - mint: parseEther(amount), // Convert amount to wei - to: account.address, // Recipient on L2 (same as sender in this case) - }); + // Build the deposit transaction parameters + const args = await publicClientL2.buildDepositTransaction({ + mint: parseEther(amount), // Convert amount to wei + to: account.address, // Recipient on L2 (same as sender in this case) + }); - // Execute the deposit transaction on L1 - const hash = await walletClientL1.depositTransaction(args); - console.log(`Deposit transaction hash on L1: ${hash}`); + // Execute the deposit transaction on L1 + const hash = await walletClientL1.depositTransaction(args); + console.log(`Deposit transaction hash on L1: ${hash}`); - // Wait for the L1 transaction to be confirmed - const receipt = await publicClientL1.waitForTransactionReceipt({ hash }); - console.log('L1 transaction confirmed:', receipt); + // Wait for the L1 transaction to be confirmed + const receipt = await publicClientL1.waitForTransactionReceipt({ hash }); + console.log('L1 transaction confirmed:', receipt); - // Extract the corresponding L2 transaction hash - const l2Hashes = getL2TransactionHashes(receipt); - console.log(`Corresponding L2 transaction hash: ${l2Hashes}`); + // Extract the corresponding L2 transaction hash + const l2Hashes = getL2TransactionHashes(receipt); + console.log(`Corresponding L2 transaction hash: ${l2Hashes}`); - // Wait for the L2 transaction to be confirmed - const l2Receipt = await publicClientL2.waitForTransactionReceipt({ - hash: l2Hashes, - }); - console.log('L2 transaction confirmed:', l2Receipt); + // Wait for the L2 transaction to be confirmed + const l2Receipt = await publicClientL2.waitForTransactionReceipt({ + hash: l2Hashes, + }); + console.log('L2 transaction confirmed:', l2Receipt); - console.log('Deposit completed successfully!'); - } catch (error) { - console.error('Error during deposit:', error); - } + console.log('Deposit completed successfully!'); + } catch (error) { + console.error('Error during deposit:', error); + } } ``` @@ -405,40 +405,39 @@ Now you're going to repeat the process in reverse to bridge some ETH from L2 to ```js - const { createPublicClient, http, createWalletClient, parseEther } = require('viem'); + const { createPublicClient, http, createWalletClient, parseEther, formatEther } = require('viem'); const { sepolia, optimismSepolia } = require('viem/chains'); const { privateKeyToAccount } = require('viem/accounts'); - const { getL2TransactionHashes, publicActionsL2, walletActionsL1, walletActionsL2 } = require('viem/op-stack'); - + const { getL2TransactionHashes, publicActionsL1, publicActionsL2, walletActionsL1, walletActionsL2 } = require('viem/op-stack'); // Load private key from environment variable - const PRIVATE_KEY = process.env.PRIVATE_KEY; + const PRIVATE_KEY = process.env.TUTORIAL_PRIVATE_KEY; const account = privateKeyToAccount(PRIVATE_KEY); // Create L1 public client for reading from the Sepolia network const publicClientL1 = createPublicClient({ - chain: sepolia, - transport: http("https://rpc.ankr.com/eth_sepolia"), + chain: sepolia, + transport: http("https://rpc.ankr.com/eth_sepolia"), }).extend(publicActionsL1()) // Create L1 wallet client for sending transactions on Sepolia const walletClientL1 = createWalletClient({ - account, - chain: sepolia, - transport: http("https://sepolia.optimism.io"), + account, + chain: sepolia, + transport: http("https://rpc.ankr.com/eth_sepolia"), }).extend(walletActionsL1()); // Create L2 public client for interacting with OP Sepolia const publicClientL2 = createPublicClient({ - chain: optimismSepolia, - transport: http("https://sepolia.optimism.io"), + chain: optimismSepolia, + transport: http("https://sepolia.optimism.io"), }).extend(publicActionsL2()); // Create L2 wallet client for sending transactions on OP Sepolia const walletClientL2 = createWalletClient({ - account, - chain: optimismSepolia, - transport: http("https://sepolia.optimism.io"), + account, + chain: optimismSepolia, + transport: http("https://sepolia.optimism.io"), }).extend(walletActionsL2()); From 1b8716a0f8e43c028dcf02a3bd916dfb12cbde15 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Wed, 2 Oct 2024 22:51:00 +0100 Subject: [PATCH 089/565] updated the codebase --- .../app-developers/tutorials/cross-dom-bridge-eth.mdx | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx b/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx index 78619d79e..956aaa6f5 100644 --- a/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx +++ b/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx @@ -45,12 +45,10 @@ Since Viem is a [Node.js](https://nodejs.org/en/) library, you'll need to create pnpm init ``` - {

Install the Optimism SDK

} - - Install `viem`, and `dotenv` for managing environment variables. + {

Install the viem library

} ```bash - pnpm add viem dotenv + pnpm add viem ``` From 8427f6221c0815ee7093d98c6674f329e5b9d962 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Wed, 2 Oct 2024 23:49:28 +0100 Subject: [PATCH 090/565] Updated codebase --- .../tutorials/sdk-estimate-costs.mdx | 204 +++++++----------- public/tutorials/sdk-estimate-costs.js | 36 ++-- words.txt | 1 + 3 files changed, 98 insertions(+), 143 deletions(-) diff --git a/pages/builders/app-developers/tutorials/sdk-estimate-costs.mdx b/pages/builders/app-developers/tutorials/sdk-estimate-costs.mdx index 54118b7b3..83b7593c5 100644 --- a/pages/builders/app-developers/tutorials/sdk-estimate-costs.mdx +++ b/pages/builders/app-developers/tutorials/sdk-estimate-costs.mdx @@ -16,176 +16,137 @@ You'll also learn how to estimate the total cost of the transaction all at once. Check out the full explainer on [OP Stack transaction fees](/builders/app-developers/transactions/fees) for more information on how OP Mainnet charges fees under the hood. -## Prerequisites +## Supported Networks -Before you begin, ensure you have the following: +Viem supports any of the [Superchain networks](/chain/networks). +The OP Stack networks are included in Viem by default. +If you want to use a network that isn't included by default, you can add it to Viem's chain configurations. -* Node.js (version 14 or later) -* An understanding of the [viem library](https://viem.sh/op-stack/) -* `pnpm` installed for managing packages. - -## Required Dependencies +## Dependencies * [node](https://nodejs.org/en/) * [pnpm](https://pnpm.io/installation) -* [viem](https://viem.sh/op-stack/) - -Install `pnpm` if you haven't already: - -```bash -npm install -g pnpm - -``` ## Create a Demo Project - - {

Project Setup

} - - Let's create a new project and install the necessary dependencies. - - - {

Create a folder and new file

} - - ```bash - mkdir op-sample-project - cd op-sample-project - touch estimate-costs.js - ``` - - {

Initialize the project

} - - ```bash - pnpm init - ``` - - {

Install dependencies

} - - Install `viem`, and `dotenv` for managing environment variables. +You're going to use Viem for this tutorial. +Since Viem is a [Node.js](https://nodejs.org/en/) library, you'll need to create a Node.js project to use it. - ```bash - pnpm add viem dotenv - ``` -
+ + {

Make a Project Folder

} - {

Configure Environment Variables

} + ```bash + mkdir op-sample-project + cd op-sample-project + ``` - You need a private key in order to sign transactions. - Create a `.env` file to securely store your environment variables - Set your private key as an environment variable with the `export` command. - Make sure this private key corresponds to an address that has ETH on Sepolia. + {

Initialize the Project

} ```bash - touch .env + pnpm init ``` - Add your wallet private key in the `.env` file. - You need a private key in order to sign transactions. - Make sure this private key corresponds to an address that has ETH on OP Sepolia. + {

Install the viem library

} ```bash - RPC_URL=https://optimism-mainnet.infura.io/v3/YOUR_INFURA_PROJECT_ID - TUTORIAL_PRIVATE_KEY=0x... + pnpm add viem ```
- - Never share your private key and avoid committing this file to version control. + + Want to create a new wallet for this tutorial? + If you have [`cast`](https://book.getfoundry.sh/getting-started/installation) installed you can run `cast wallet new` in your terminal to create a new wallet and get the private key. -## Get ETH on OP Sepolia +## Get ETH on Sepolia -This tutorial explains how estimate transaction costs on OP Sepolia. -You will need to get some ETH on OP Sepolia in order to run the code in this tutorial. +This tutorial explains how to bridge ETH from Sepolia to OP Sepolia. +You will need to get some ETH on Sepolia to follow along. - You can use the [Superchain Faucet](https://console.optimism.io/faucet?utm_source=docs) to get ETH on OP Sepolia. + You can use [this faucet](https://sepoliafaucet.com) to get ETH on Sepolia. +## Add a Private Key to Your Environment + +You need a private key in order to sign transactions. +Set your private key as an environment variable with the export command. +Make sure this private key corresponds to an address that has ETH on Sepolia. + +```bash +export TUTORIAL_PRIVATE_KEY=0x... +``` + ## Start the Node REPL -You're going to use the Node REPL to interact with the Viem library. +You're going to use the Node REPL to interact with Viem. To start the Node REPL run the following command in your terminal: ```bash node ``` -This will bring up a Node REPL prompt that allows you to run javascript code. - -## Import Dependencies +This will bring up a Node REPL prompt that allows you to run JavaScript code. -You need to import some dependencies into your Node REPL session. - - {

Import the necessary packages

} +## Get ETH on OP Sepolia - In your project directory and add the following code in `estimate-costs.js`: +This tutorial explains how estimate transaction costs on OP Sepolia. +You will need to get some ETH on OP Sepolia in order to run the code in this tutorial. - ```js + + You can use the [Superchain Faucet](https://console.optimism.io/faucet?utm_source=docs) to get ETH on OP Sepolia. + - // Import required modules - import { createPublicClient, createWalletClient, http, parseEther, parseGwei, formatEther } from 'viem' - import { privateKeyToAccount } from 'viem/accounts' - import { optimismSepolia } from 'viem/chains' - import { publicActionsL2, walletActionsL2 } from 'viem/op-stack' - import * as dotenv from 'dotenv'; - // Load environment variables - dotenv.config(); - ``` -
+This will bring up a Node REPL prompt that allows you to run javascript code. ## Set Session Variables You'll need a few variables throughout this tutorial. Let's set those up now. - - - To create the wallet instance, load your private key, using `privateKeyToAccount`. [`privateKeyToAccount`](https://viem.sh/docs/accounts/local/privateKeyToAccount#privatekeytoaccount) is a viem method used to sign transactions by passing a private key. + - ```js - if (!process.env.PRIVATE_KEY) { - throw new Error('Error: PRIVATE_KEY is not defined in the environment variables.') - } - const account = privateKeyToAccount(process.env.PRIVATE_KEY); - ``` - +{

Import Viem and other necessary modules

} - - To ensure that `process.env.PRIVATE_KEY` is defined before using it. If they are undefined, we add a check to provide a error messages when the environment variable is missing. - +```js +const { createPublicClient, createWalletClient, http, parseEther, parseGwei, formatEther } = require('viem'); +const { privateKeyToAccount } = require('viem/accounts'); +const { optimismSepolia } = require('viem/chains'); +const { publicActionsL2, walletActionsL2 } = require('viem/op-stack'); +``` - - Set up our Wallet Clients for L2(optimismSepolia) +{

Set up the account

} - ```js - const walletClient = createWalletClient({ - chain: optimismSepolia, - transport: http(process.env.L2_RPC_URL), - }).extend(walletActionsL2()) - ``` -
+```js +const account = privateKeyToAccount(process.env.TUTORIAL_PRIVATE_KEY); +``` +{

Create the public client

} - - Set up our Viem Clients for the L1(Sepolia) and L2(optimismSepolia) +```js +const publicClientL2 = createPublicClient({ + chain: optimismSepolia, + transport: http("https://sepolia.optimism.io"), +}).extend(publicActionsL2()); +``` - ```js - const publicClient = createPublicClient({ - chain: optimismSepolia, - transport: http(process.env.L2_RPC_URL), - }).extend(publicActionsL2()); - ``` - -
+{

Create the wallet client

} + +```js +const walletClientL2 = createWalletClient({ + chain: optimismSepolia, + transport: http("https://sepolia.optimism.io"), +}).extend(walletActionsL2()); +``` +
## Estimate Transaction Costs You're now going to estimate the cost of a transaction on OP Mainnet. - {

Creating a Transaction in Viem

} + {

Define the transaction

} Viem makes it easy to prepare a transactions so you can estimate the cost of a transaction before you sign it. Here you'll define an object with the required transaction fields and send a small amount of ETH from your address to the address `0x1000000000000000000000000000000000000000`. @@ -198,13 +159,14 @@ You're now going to estimate the cost of a transaction on OP Mainnet. gasPrice: parseGwei('20') }; ``` + This transaction will send `0.005` ETH to the specified address with a gas price of 20 Gwei. {

Estimate the execution gas fee

} - Now that you have prepared a transaction that sends a small amount of ETH, we can estimate the gas for that transaction by using the `estimateGas` method from viem. + Now, let's estimate the gas limit for our transaction. ```js - const gasLimit = await publicClient.estimateGas(transaction); + const gasLimit = await publicClientL2.estimateGas(transaction); console.log(`Estimated Gas Limit: ${gasLimit}`); ``` @@ -214,7 +176,7 @@ You're now going to estimate the cost of a transaction on OP Mainnet. Retrieve the current gas price (effective gas price), Alternatively, given that you already set the gas price manually, you can use the `getGasPrice` method from viem. ```js - const effectiveGasPrice = await publicClient.getGasPrice(); + const effectiveGasPrice = await publicClientL2.getGasPrice(); console.log(`effective Gas Price, ${effectiveGasPrice}`); ``` @@ -235,7 +197,7 @@ You're now going to estimate the cost of a transaction on OP Mainnet. This function returns the current cost estimate in wei. ```js - const l1CostEstimate = await publicClient.estimateL1Fee(transaction) + const l1CostEstimate = await publicClientL2.estimateL1Fee(transaction) console.log(`Estimated L1 data Fee: ${formatEther(l1CostEstimate)}`); ``` @@ -244,8 +206,8 @@ You're now going to estimate the cost of a transaction on OP Mainnet. Once you've individually estimated the execution gas fee and the L1 data fee, you can sum these two values together to get the total cost of the transaction. ```js - const totalSum = l2CostEstimate + l1CostEstimate; - console.log(`Estimated Total Cost: ${formatEther(totalSum)} `); + const totalEstimate = l2CostEstimate + l1CostEstimate; + console.log(`Estimated Total Cost: ${formatEther(totalEstimate)} `); ``` {

Send the transaction

} @@ -254,8 +216,8 @@ You're now going to estimate the cost of a transaction on OP Mainnet. This will make it possible to see the actual cost of the transaction to compare to your estimate. ```js - const txHash = await walletClient.sendTransaction(transaction) - console.log(`Transaction Hash: ${tx}`); + const txHash = await walletClientL2.sendTransaction(transaction) + console.log(`Transaction Hash: ${txHash}`); ``` {

Check the actual execution gas fee

} @@ -265,7 +227,7 @@ You're now going to estimate the cost of a transaction on OP Mainnet. You can then multiply these values to get the actual L2 cost of the transaction ```js - const receipt = await publicClient.getTransactionReceipt({ hash: txHash }); + const receipt = await publicClientL2.getTransactionReceipt({ hash: txHash }); console.log('Transaction receipt:', receipt); const l2CostActual = receipt.gasUsed * receipt.effectiveGasPrice; @@ -277,7 +239,7 @@ You're now going to estimate the cost of a transaction on OP Mainnet. You can also check the actual L1 data fee. ```js - const l1CostActual = await publicClient.estimateL1Fee(txHash) + const l1CostActual = await publicClientL2.estimateL1Fee(txHash) console.log(`l1CostActual gas fee: ${formatEther(l1CostActual)}`); ``` diff --git a/public/tutorials/sdk-estimate-costs.js b/public/tutorials/sdk-estimate-costs.js index 0f0fbce23..95ab5e553 100644 --- a/public/tutorials/sdk-estimate-costs.js +++ b/public/tutorials/sdk-estimate-costs.js @@ -1,34 +1,26 @@ -import { createPublicClient, createWalletClient, http, parseEther, parseGwei, formatEther } from 'viem' -import { privateKeyToAccount } from 'viem/accounts' -import { optimismSepolia } from 'viem/chains' -import { publicActionsL2, walletActionsL2 } from 'viem/op-stack' -import * as dotenv from 'dotenv' - -// Load environment variables -dotenv.config() - -// Set up the account -if (!process.env.PRIVATE_KEY) { - throw new Error('Error: PRIVATE_KEY is not defined in the environment variables.') - } - if (!process.env.L2_RPC_URL) { - throw new Error('Error: L2_RPC_URL is not defined in the environment variables.') - } -const account = privateKeyToAccount(process.env.PRIVATE_KEY) +(async () => { + +const { createPublicClient, createWalletClient, http, parseEther, parseGwei, formatEther } = require('viem'); +const { privateKeyToAccount } = require('viem/accounts'); +const { optimismSepolia } = require('viem/chains'); +const { publicActionsL2, walletActionsL2 } = require('viem/op-stack'); + +const privateKey = process.env.TUTORIAL_PRIVATE_KEY + +const account = privateKeyToAccount(privateKey) // Set up the public client const publicClient = createPublicClient({ chain: optimismSepolia, - transport: http(process.env.L2_RPC_URL), + transport: http("https://sepolia.optimism.io"), }).extend(publicActionsL2()) // Set up the wallet client const walletClient = createWalletClient({ chain: optimismSepolia, - transport: http(process.env.L2_RPC_URL), + transport: http("https://sepolia.optimism.io"), }).extend(walletActionsL2()) -async function estimateTransactionCosts() { try { // Prepare the transaction const transaction = { @@ -82,6 +74,6 @@ async function estimateTransactionCosts() { } catch (error) { console.error('Error:', error) } -} -estimateTransactionCosts() \ No newline at end of file + +})() \ No newline at end of file diff --git a/words.txt b/words.txt index 90467007b..111fbfd7d 100644 --- a/words.txt +++ b/words.txt @@ -362,6 +362,7 @@ VHOSTS vhosts Viem viem +Viem's VMDEBUG vmdebug VMODULE From b165bc97b7a6044cc163b96b14ab17f7216740ed Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Wed, 2 Oct 2024 23:58:17 +0100 Subject: [PATCH 091/565] updated fullcode base --- .../tutorials/cross-dom-bridge-eth.mdx | 10 +-- public/tutorials/cross-dom-bridge-eth.js | 86 ++++++++++++++++--- 2 files changed, 78 insertions(+), 18 deletions(-) diff --git a/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx b/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx index 956aaa6f5..f4a6a414e 100644 --- a/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx +++ b/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx @@ -105,7 +105,7 @@ const account = privateKeyToAccount(PRIVATE_KEY); const publicClientL1 = createPublicClient({ chain: sepolia, transport: http("https://rpc.ankr.com/eth_sepolia"), -}).extend(publicActionsL1()) +}).extend(publicActionsL1()) // Create L1 wallet client for sending transactions on Sepolia const walletClientL1 = createWalletClient({ @@ -243,11 +243,11 @@ Now that you have some ETH on L1 you can deposit that ETH into the `L1StandardBr transport: http("https://sepolia.optimism.io"), }).extend(walletActionsL2()); - async function depositETH(amount) { + async function depositETH() { try { // Build the deposit transaction parameters const args = await publicClientL2.buildDepositTransaction({ - mint: parseEther(amount), // Convert amount to wei + mint: parseEther("0.0001"), // Convert amount to wei to: account.address, // Recipient on L2 (same as sender in this case) }); @@ -439,10 +439,10 @@ Now you're going to repeat the process in reverse to bridge some ETH from L2 to }).extend(walletActionsL2()); - async function withdrawETH(amount) { + async function withdrawETH() { try { const args = await publicClientL2.buildWithdrawalTransaction({ - withdrawalAmount: parseEther(amount), + withdrawalAmount: parseEther("0.0001"), to: account.address, }); diff --git a/public/tutorials/cross-dom-bridge-eth.js b/public/tutorials/cross-dom-bridge-eth.js index 6735e017c..3fd5fb419 100644 --- a/public/tutorials/cross-dom-bridge-eth.js +++ b/public/tutorials/cross-dom-bridge-eth.js @@ -1,43 +1,45 @@ -import { createPublicClient, http, createWalletClient, parseEther } from 'viem'; -import { sepolia, optimismSepolia } from "viem/chains"; -import { privateKeyToAccount } from 'viem/accounts'; -import { getL2TransactionHashes, publicActionsL2, walletActionsL1, walletActionsL2 } from 'viem/op-stack'; +(async () => { + +const { createPublicClient, http, createWalletClient, parseEther, formatEther } = require('viem'); +const { sepolia, optimismSepolia } = require('viem/chains'); +const { privateKeyToAccount } = require('viem/accounts'); +const { getL2TransactionHashes, publicActionsL1, publicActionsL2, walletActionsL1, walletActionsL2 } = require('viem/op-stack'); // Load private key from environment variable -const PRIVATE_KEY = process.env.PRIVATE_KEY; +const PRIVATE_KEY = process.env.TUTORIAL_PRIVATE_KEY; const account = privateKeyToAccount(PRIVATE_KEY); // Create L1 public client for reading from the Sepolia network const publicClientL1 = createPublicClient({ chain: sepolia, - transport: http(), -}); + transport: http("https://rpc.ankr.com/eth_sepolia"), +}).extend(publicActionsL1()) // Create L1 wallet client for sending transactions on Sepolia const walletClientL1 = createWalletClient({ account, chain: sepolia, - transport: http(), + transport: http("https://rpc.ankr.com/eth_sepolia"), }).extend(walletActionsL1()); // Create L2 public client for interacting with OP Sepolia const publicClientL2 = createPublicClient({ chain: optimismSepolia, - transport: http(process.env.L2_RPC_URL), + transport: http("https://sepolia.optimism.io"), }).extend(publicActionsL2()); // Create L2 wallet client for sending transactions on OP Sepolia const walletClientL2 = createWalletClient({ account, chain: optimismSepolia, - transport: http(process.env.L2_RPC_URL), + transport: http("https://sepolia.optimism.io"), }).extend(walletActionsL2()); -async function depositETH(amount) { +async function depositETH() { try { // Build the deposit transaction parameters const args = await publicClientL2.buildDepositTransaction({ - mint: parseEther(amount), // Convert amount to wei + mint: parseEther("0.0001"), // Convert amount to wei to: account.address, // Recipient on L2 (same as sender in this case) }); @@ -63,4 +65,62 @@ try { } catch (error) { console.error('Error during deposit:', error); } -} \ No newline at end of file +} + +depositETH() + +async function withdrawETH() { + try { + const args = await publicClientL2.buildWithdrawalTransaction({ + withdrawalAmount: parseEther("0.0001"), + to: account.address, + }); + + const hash = await walletClientL2.initiateWithdrawal(args); + console.log(`Withdrawal transaction hash on L2: ${hash}`); + + const receipt = await publicClientL2.waitForTransactionReceipt({ hash }); + console.log('L2 transaction confirmed:', receipt); + + const { output, withdrawal } = await publicClientL1.waitToProve({ + receipt, + targetChain: walletClientL2.chain + }); + + const proveArgs = await publicClientL2.buildProveWithdrawal({ + output, + withdrawal, + }); + + const proveHash = await walletClientL1.proveWithdrawal(proveArgs); + + const proveReceipt = await publicClientL1.waitForTransactionReceipt({ hash: proveHash }); + + const awaitWithdrawal = await publicClientL1.waitToFinalize({ + targetChain: walletClientL2.chain, + withdrawalHash: withdrawal.withdrawalHash, + }); + + const finalizeHash = await walletClientL1.finalizeWithdrawal({ + targetChain: walletClientL2.chain, + withdrawal, + }); + + const finalizeReceipt = await publicClientL1.waitForTransactionReceipt({ + hash: finalizeHash + }); + + const status = await publicClientL1.getWithdrawalStatus({ + receipt, + targetChain: walletClientL2.chain + }) + + console.log('Withdrawal completed successfully!'); + } catch (error) { + console.error('Error during withdrawal:', error); + } + } + + withdrawETH() + +})() \ No newline at end of file From 6a41011b5b41bd79b01c1043d0035286b5b3d79e Mon Sep 17 00:00:00 2001 From: soyboy <85043086+sbvegan@users.noreply.github.com> Date: Wed, 2 Oct 2024 22:45:44 -0700 Subject: [PATCH 092/565] Apply suggestions from code review Co-authored-by: Bradley Camacho <42678939+bradleycamacho@users.noreply.github.com> --- .../chain-operators/tools/op-deployer.mdx | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/pages/builders/chain-operators/tools/op-deployer.mdx b/pages/builders/chain-operators/tools/op-deployer.mdx index 70cef0e42..4d8edb21b 100644 --- a/pages/builders/chain-operators/tools/op-deployer.mdx +++ b/pages/builders/chain-operators/tools/op-deployer.mdx @@ -50,9 +50,7 @@ toolchain installed, you can install `op-deployer` by following these steps: ### Configuring your Chain -The first step to using `op-deployer` is to create an intent file. The intent file describes how you want your chain -to look when it is done being deployed. `op-deployer` has a utility for this. Run the following command to generate -an example intent file for a development chain: +To get started with `op-deployer`, you need to create an intent file that outlines your desired chain configuration. You can use the built-in `op-deployer` utility to generate this file. Just run the following command to create an example intent file for a development chain: ``` op-deployer init --l1-chain-id 11155111 --l2-chain-ids 12345 --workdir .deployer @@ -85,23 +83,22 @@ proposer = "0x86dfafe0689e20685f7872e0cb264868454627bc" challenger = "0xf1658da627dd0738c555f9572f658617511c49d5" ``` -See the comments for what each field does. By default, `op-deployer` will fill in all other configuration variables +See the code comments above for explanations of each field. By default, `op-deployer` will fill in all other configuration variables with those that match our standard config. You can override these defaults by adding them to your intent file, but that won't be covered here. ### Applying your Intent -Now that you've created your intent file, you can apply it to your chain. Run the following command to do so: +Now that you've created your intent file, you can apply it to your chain: ``` op-deployer apply --workdir .deployer --l1-rpc-url --private-key ``` -Using a hardware wallet is currently not supported, but this deployer key has no privileges so an ephemeral hot wallet -can be used. +Hardware wallets are not supported, but you can use ephemeral hot wallets since this deployer key has no privileges. This command will deploy the OP Stack to L1. It will deploy all L2s specified in the intent file. Superchain -configuration will be set to the Superchain-wide defaults - i.e., your chain will be opted into the Superchain pause +configuration will be set to the Superchain-wide defaults - i.e., your chain will be opted into the [Superchain pause](https://specs.optimism.io/protocol/superchain-configuration.html#pausability) and will use the same [protocol versions](https://github.com/ethereum-optimism/specs/blob/main/specs/protocol/superchain-upgrades.md) address as other chains on the Superchain. @@ -113,8 +110,8 @@ With the contracts deployed, you can generate a genesis file for any of your L2s ./bin/op-deployer inspect genesis --outfile genesis.json ``` -This will write the genesis file to genesis.json. You can change the `--outfile` parameter to write it somewhere -else. You can run another member of the `inspect` family, `rollup`, to get the rollup.json file: +This will write the genesis file to `genesis.json`. You can change the `--outfile` parameter to write it somewhere +else. You can run another member of the `inspect` family, `rollup`, to get the `rollup.json` file: ``` ./bin/op-deployer inspect rollup --outfile rollup.json From 99c70b7c1292db0732b6885fd2798e5f72786c2a Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Thu, 3 Oct 2024 16:05:19 +0100 Subject: [PATCH 093/565] Used file imports for the code snippets --- .../tutorials/cross-dom-bridge-eth.mdx | 325 ++++-------------- public/tutorials/cross-dom-bridge-eth.js | 165 +++++---- 2 files changed, 138 insertions(+), 352 deletions(-) diff --git a/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx b/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx index f4a6a414e..4ffdd27c0 100644 --- a/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx +++ b/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx @@ -91,43 +91,42 @@ This will bring up a Node REPL prompt that allows you to run JavaScript code. You need to import some dependencies into your Node REPL session. -```js -const { createPublicClient, http, createWalletClient, parseEther, formatEther } = require('viem'); -const { sepolia, optimismSepolia } = require('viem/chains'); -const { privateKeyToAccount } = require('viem/accounts'); -const { getL2TransactionHashes, publicActionsL1, publicActionsL2, walletActionsL1, walletActionsL2 } = require('viem/op-stack'); - -// Load private key from environment variable -const PRIVATE_KEY = process.env.TUTORIAL_PRIVATE_KEY; -const account = privateKeyToAccount(PRIVATE_KEY); - -// Create L1 public client for reading from the Sepolia network -const publicClientL1 = createPublicClient({ - chain: sepolia, - transport: http("https://rpc.ankr.com/eth_sepolia"), -}).extend(publicActionsL1()) - -// Create L1 wallet client for sending transactions on Sepolia -const walletClientL1 = createWalletClient({ - account, - chain: sepolia, - transport: http("https://rpc.ankr.com/eth_sepolia"), -}).extend(walletActionsL1()); - -// Create L2 public client for interacting with OP Sepolia -const publicClientL2 = createPublicClient({ - chain: optimismSepolia, - transport: http("https://sepolia.optimism.io"), -}).extend(publicActionsL2()); - -// Create L2 wallet client for sending transactions on OP Sepolia -const walletClientL2 = createWalletClient({ - account, - chain: optimismSepolia, - transport: http("https://sepolia.optimism.io"), -}).extend(walletActionsL2()); + +{

Import viem and other packages

} + +```js file=/public/tutorials/cross-dom-bridge-eth.js#L3-L6 hash=88319dda3322e76accb9e50222d30abc +``` + +{

Load private key and set account

} + +```js file=/public/tutorials/cross-dom-bridge-eth.js#L9-L10 hash=251ec91fdff9dbc613b459ca3b9fb8bd +``` + +{

Create L1 public client for reading from the Sepolia network

} + +```js file=/public/tutorials/cross-dom-bridge-eth.js#L13-L16 hash=6f2335d67920c219b5fd3590f8450cac ``` + +{

Create L1 wallet client for sending transactions on Sepolia

} + +```js file=/public/tutorials/cross-dom-bridge-eth.js#L19-L23 hash=a9b217aef7c065eaf3f2a7222494a3e1 +``` + + +{

Create L2 public client for interacting with OP Sepolia

} + +```js file=/public/tutorials/cross-dom-bridge-eth.js#L26-L29 hash=dd7868fc9ab8f8a34768c8a83232409b +``` + +{

Create L2 wallet client on OP Sepolia

} + +```js file=/public/tutorials/cross-dom-bridge-eth.js#L32-L36 hash=6f91578c5b155d7abfeecf2297ee9f70 +``` + +
+ + ## Get ETH on Sepolia You're going to need some ETH on L1 that you can bridge to L2. @@ -144,9 +143,7 @@ Now that you have some ETH on L1 you can deposit that ETH into the `L1StandardBr See how much ETH you have on L1 so you can confirm that the deposit worked later on. - ```js - const l1Balance = await publicClientL1.getBalance({ address: account.address }); - console.log(`L1 Balance: ${formatEther(l1Balance)} ETH`); + ```js file=/public/tutorials/cross-dom-bridge-eth.js#L38-L39 hash=a77304eb0a056ba30aaa21eee60bcafa ``` @@ -157,29 +154,21 @@ Now that you have some ETH on L1 you can deposit that ETH into the `L1StandardBr Use `buildDepositTransaction` to build the deposit transaction parameters on the L2. - ```js - const args = await publicClientL2.buildDepositTransaction({ - mint: parseEther('0.00010'), - to: account.address, - }); + ```js file=/public/tutorials/cross-dom-bridge-eth.js#L44-L47 hash=3fa048a4ceb376c9f1c03a70f91fb757 ``` {

Send the deposit transaction

} Send the deposit transaction on L1 and log the L1 transaction hash. - ```js - const hash = await walletClientL1.depositTransaction(args); - console.log(`Deposit transaction hash on L1: ${hash}`); + ```js file=/public/tutorials/cross-dom-bridge-eth.js#L49-L50 hash=ffdd76699c90b7902f2ed32e9f1745c5 ``` {

Wait for L1 transaction

} Wait for the L1 transaction to be processed and log the receipt. - ```js - const receipt = await publicClientL1.waitForTransactionReceipt({ hash }); - console.log('L1 transaction confirmed:', receipt); + ```js file=/public/tutorials/cross-dom-bridge-eth.js#L52-L53 hash=8b97cc531e04896161a062c23f9de9dc ``` {

Extract the L2 transaction hash

} @@ -187,94 +176,21 @@ Now that you have some ETH on L1 you can deposit that ETH into the `L1StandardBr Extracts the corresponding L2 transaction hash from the L1 receipt, and logs it. This hash represents the deposit transaction on L2. - ```js - const l2Hashes = getL2TransactionHashes(receipt); - console.log(`Corresponding L2 transaction hash: ${l2Hashes}`); + ```js file=/public/tutorials/cross-dom-bridge-eth.js#L55-L56 hash=8e5c52e47b13dd35f7c810f336abde0f ``` {

Wait for the L2 transaction to be processed

} Wait for the L2 transaction to be processed and confirmed and logs the L2 receipt to verify completion. - ```js - const l2Receipt = await publicClientL2.waitForTransactionReceipt({ - hash: l2Hashes, - }); - console.log('L2 transaction confirmed:', l2Receipt); - console.log('Deposit completed successfully!'); + ```js file=/public/tutorials/cross-dom-bridge-eth.js#L58-L66 hash=5e9457200ff987128995c5358ce8d9d6 ```
- ```js - const { createPublicClient, http, createWalletClient, parseEther, formatEther } = require('viem'); - const { sepolia, optimismSepolia } = require('viem/chains'); - const { privateKeyToAccount } = require('viem/accounts'); - const { getL2TransactionHashes, publicActionsL1, publicActionsL2, walletActionsL1, walletActionsL2 } = require('viem/op-stack'); - - // Load private key from environment variable - const PRIVATE_KEY = process.env.TUTORIAL_PRIVATE_KEY; - const account = privateKeyToAccount(PRIVATE_KEY); - - // Create L1 public client for reading from the Sepolia network - const publicClientL1 = createPublicClient({ - chain: sepolia, - transport: http("https://rpc.ankr.com/eth_sepolia"), - }).extend(publicActionsL1()) - - // Create L1 wallet client for sending transactions on Sepolia - const walletClientL1 = createWalletClient({ - account, - chain: sepolia, - transport: http("https://rpc.ankr.com/eth_sepolia"), - }).extend(walletActionsL1()); - - // Create L2 public client for interacting with OP Sepolia - const publicClientL2 = createPublicClient({ - chain: optimismSepolia, - transport: http("https://sepolia.optimism.io"), - }).extend(publicActionsL2()); - - // Create L2 wallet client for sending transactions on OP Sepolia - const walletClientL2 = createWalletClient({ - account, - chain: optimismSepolia, - transport: http("https://sepolia.optimism.io"), - }).extend(walletActionsL2()); - - async function depositETH() { - try { - // Build the deposit transaction parameters - const args = await publicClientL2.buildDepositTransaction({ - mint: parseEther("0.0001"), // Convert amount to wei - to: account.address, // Recipient on L2 (same as sender in this case) - }); - - // Execute the deposit transaction on L1 - const hash = await walletClientL1.depositTransaction(args); - console.log(`Deposit transaction hash on L1: ${hash}`); - - // Wait for the L1 transaction to be confirmed - const receipt = await publicClientL1.waitForTransactionReceipt({ hash }); - console.log('L1 transaction confirmed:', receipt); - - // Extract the corresponding L2 transaction hash - const l2Hashes = getL2TransactionHashes(receipt); - console.log(`Corresponding L2 transaction hash: ${l2Hashes}`); - - // Wait for the L2 transaction to be confirmed - const l2Receipt = await publicClientL2.waitForTransactionReceipt({ - hash: l2Hashes, - }); - console.log('L2 transaction confirmed:', l2Receipt); - - console.log('Deposit completed successfully!'); - } catch (error) { - console.error('Error during deposit:', error); - } - } - ``` + ```js file=/public/tutorials/cross-dom-bridge-eth.js#L3-L63 hash=232cf05ee060649e00c59adc42273793 + ``` @@ -298,61 +214,43 @@ Now you're going to repeat the process in reverse to bridge some ETH from L2 to Uses `buildWithdrawalTransaction` to create the withdrawal parameters. Converts the withdrawal amount to `wei` and specifies the recipient on L1. - ```js - const withdrawArgs = await publicClientL1.buildInitiateWithdrawal({ - withdrawalAmount: parseEther('0.0001'), - to: account.address, - }); + ```js file=/public/tutorials/cross-dom-bridge-eth.js#L67-L70 hash=0d53d4be7febd211bc3778182bd0f2d2 ``` {

Executing the Withdrawal

} This sends the withdrawal transaction on L2, which initiates the withdrawal process on L2 and logs a transaction hash for tracking the withdrawal. - ```js - const hash = await walletClientL2.initiateWithdrawal(withdrawArgs); - console.log(`Withdrawal transaction hash on L2: ${hash}`); + ```js file=/public/tutorials/cross-dom-bridge-eth.js#L72-L73 hash=8ba1ce9c8aa350ec210ca9ab5b05d023 ``` - {

Confirming L2 Transaction

} + {

Confirming L2 transaction

} Wait one hour (max) for the L2 Output containing the transaction to be proposed, and log the receipt, which contains important details like the block number etc. - ```js - const receipt = await publicClientL2.waitForTransactionReceipt({ hash }); - console.log('L2 transaction confirmed:', receipt); + ```js file=/public/tutorials/cross-dom-bridge-eth.js#L75-L76 hash=e035bd7ff449bc93fcdb4b71560ebd46 ``` - {

Wait for Withdrawal prove

} + {

Wait for withdrawal prove

} Next, is to prove to the bridge on L1 that the withdrawal happened on L2. To achieve that, you first need to wait until the withdrawal is ready to prove. - ```js - const { output, withdrawal } = await publicClientL1.waitToProve({ - receipt, - targetChain: walletClientL2.chain - }) + ```js file=/public/tutorials/cross-dom-bridge-eth.js#L78-L81 hash=abd2b8183255a07f99f18f6dfde074f9 ``` Build parameters to prove the withdrawal on the L2. - ```js - const proveArgs = await publicClientL2.buildProveWithdrawal({ - output, - withdrawal, - }) + ```js file=/public/tutorials/cross-dom-bridge-eth.js#L83-L86 hash=6c2543f751540d03890ff2dda28d484d ``` {

Prove the withdrawal on the L1

} Once the withdrawal is ready to be proven, you'll send an L1 transaction to prove that the withdrawal happened on L2. - ```js - const proveHash = await walletClientL1.proveWithdrawal(proveArgs) + ```js file=/public/tutorials/cross-dom-bridge-eth.js#L88 hash=c0c97e22db5055def551d1cef15fb251 ``` - ```js - const proveReceipt = await publicClientL1.waitForTransactionReceipt({hash: proveHash}) + ```js file=/public/tutorials/cross-dom-bridge-eth.js#L90 hash=f2fc2ceee54d971a65a4b51fb6a56932 ``` {

Wait for withdrawal finalization

} @@ -360,12 +258,7 @@ Now you're going to repeat the process in reverse to bridge some ETH from L2 to Before a withdrawal transaction can be finalized, you will need to wait for the finalization period. This can only happen after the fault proof period has elapsed. On OP Mainnet, this takes 7 days. - ```js - const awaitWithdrawal = await publicClientL1.waitToFinalize({ - targetChain: walletClientL2.chain, - withdrawalHash: withdrawal.withdrawalHash, - }) - + ```js file=/public/tutorials/cross-dom-bridge-eth.js#L92-L95 hash=5e45bc4dd71f532072ccd18f169522f0 ``` @@ -375,132 +268,36 @@ Now you're going to repeat the process in reverse to bridge some ETH from L2 to {

Finalize the withdrawal

} - ```js - const finalizeHash = await walletClientL1.finalizeWithdrawal({ - targetChain: walletClientL2.chain, - withdrawal, - }) + ```js file=/public/tutorials/cross-dom-bridge-eth.js#L97-L100 hash=2834727afb41676e03a681a4275cecc8 ``` {

Wait until the withdrawal is finalized

} - ```js - const finalizeReceipt = await publicClientL1.waitForTransactionReceipt({ - hash: finalizeHash - }) + ```js file=/public/tutorials/cross-dom-bridge-eth.js#L102-L104 hash=a5c3e1901b5d2ce6079c606bece7da47 ``` {

Check the withdrawal status

} - ```js - const status = await publicClientL1.getWithdrawalStatus({ - receipt, - targetChain: walletClientL2.chain - }) + ```js file=/public/tutorials/cross-dom-bridge-eth.js#L106-L111 hash=0d98521df3b676e1e99b5f20d2d3b5bd ```
- ```js - const { createPublicClient, http, createWalletClient, parseEther, formatEther } = require('viem'); - const { sepolia, optimismSepolia } = require('viem/chains'); - const { privateKeyToAccount } = require('viem/accounts'); - const { getL2TransactionHashes, publicActionsL1, publicActionsL2, walletActionsL1, walletActionsL2 } = require('viem/op-stack'); - - // Load private key from environment variable - const PRIVATE_KEY = process.env.TUTORIAL_PRIVATE_KEY; - const account = privateKeyToAccount(PRIVATE_KEY); - - // Create L1 public client for reading from the Sepolia network - const publicClientL1 = createPublicClient({ - chain: sepolia, - transport: http("https://rpc.ankr.com/eth_sepolia"), - }).extend(publicActionsL1()) - - // Create L1 wallet client for sending transactions on Sepolia - const walletClientL1 = createWalletClient({ - account, - chain: sepolia, - transport: http("https://rpc.ankr.com/eth_sepolia"), - }).extend(walletActionsL1()); - - // Create L2 public client for interacting with OP Sepolia - const publicClientL2 = createPublicClient({ - chain: optimismSepolia, - transport: http("https://sepolia.optimism.io"), - }).extend(publicActionsL2()); - - // Create L2 wallet client for sending transactions on OP Sepolia - const walletClientL2 = createWalletClient({ - account, - chain: optimismSepolia, - transport: http("https://sepolia.optimism.io"), - }).extend(walletActionsL2()); - - - async function withdrawETH() { - try { - const args = await publicClientL2.buildWithdrawalTransaction({ - withdrawalAmount: parseEther("0.0001"), - to: account.address, - }); - - const hash = await walletClientL2.initiateWithdrawal(args); - console.log(`Withdrawal transaction hash on L2: ${hash}`); - - const receipt = await publicClientL2.waitForTransactionReceipt({ hash }); - console.log('L2 transaction confirmed:', receipt); - - const { output, withdrawal } = await publicClientL1.waitToProve({ - receipt, - targetChain: walletClientL2.chain - }); - - const proveArgs = await publicClientL2.buildProveWithdrawal({ - output, - withdrawal, - }); - - const proveHash = await walletClientL1.proveWithdrawal(proveArgs); - - const proveReceipt = await publicClientL1.waitForTransactionReceipt({ hash: proveHash }); - - const awaitWithdrawal = await publicClientL1.waitToFinalize({ - targetChain: walletClientL2.chain, - withdrawalHash: withdrawal.withdrawalHash, - }); - - const finalizeHash = await walletClientL1.finalizeWithdrawal({ - targetChain: walletClientL2.chain, - withdrawal, - }); - - const finalizeReceipt = await publicClientL1.waitForTransactionReceipt({ - hash: finalizeHash - }); - - const status = await publicClientL1.getWithdrawalStatus({ - receipt, - targetChain: walletClientL2.chain - }) - - console.log('Withdrawal completed successfully!'); - } catch (error) { - console.error('Error during withdrawal:', error); - } - } - ``` + + ```js file=/public/tutorials/cross-dom-bridge-eth.js#L68-L111 hash=af4ef67a58e86cb4a9d284560944951a + ``` + ## Important Considerations - * **Challenge Period**: The 7-day waiting period is crucial for security. + * **Challenge Period**: The 7-day withdrawal challenge Period is crucial for security. * **Gas Costs**: Withdrawals involve transactions on both L2 and L1, each incurring gas fees. * **Private Key Handling**: Use secure key management practices in real applications. - * **RPC Endpoint Security**: Keep your Alchemy API key (or any RPC endpoint) secure. + * **RPC Endpoint Security**: Keep your API key (or any RPC endpoint) secure. ## Next Steps diff --git a/public/tutorials/cross-dom-bridge-eth.js b/public/tutorials/cross-dom-bridge-eth.js index 3fd5fb419..13e046def 100644 --- a/public/tutorials/cross-dom-bridge-eth.js +++ b/public/tutorials/cross-dom-bridge-eth.js @@ -5,122 +5,111 @@ const { sepolia, optimismSepolia } = require('viem/chains'); const { privateKeyToAccount } = require('viem/accounts'); const { getL2TransactionHashes, publicActionsL1, publicActionsL2, walletActionsL1, walletActionsL2 } = require('viem/op-stack'); -// Load private key from environment variable + const PRIVATE_KEY = process.env.TUTORIAL_PRIVATE_KEY; const account = privateKeyToAccount(PRIVATE_KEY); -// Create L1 public client for reading from the Sepolia network + const publicClientL1 = createPublicClient({ chain: sepolia, transport: http("https://rpc.ankr.com/eth_sepolia"), }).extend(publicActionsL1()) -// Create L1 wallet client for sending transactions on Sepolia + const walletClientL1 = createWalletClient({ account, chain: sepolia, transport: http("https://rpc.ankr.com/eth_sepolia"), }).extend(walletActionsL1()); -// Create L2 public client for interacting with OP Sepolia + const publicClientL2 = createPublicClient({ chain: optimismSepolia, transport: http("https://sepolia.optimism.io"), }).extend(publicActionsL2()); -// Create L2 wallet client for sending transactions on OP Sepolia + const walletClientL2 = createWalletClient({ account, chain: optimismSepolia, transport: http("https://sepolia.optimism.io"), }).extend(walletActionsL2()); +const l1Balance = await publicClientL1.getBalance({ address: account.address }); +console.log(`L1 Balance: ${formatEther(l1Balance)} ETH`); + async function depositETH() { -try { - // Build the deposit transaction parameters - const args = await publicClientL2.buildDepositTransaction({ - mint: parseEther("0.0001"), // Convert amount to wei - to: account.address, // Recipient on L2 (same as sender in this case) - }); - - // Execute the deposit transaction on L1 - const hash = await walletClientL1.depositTransaction(args); - console.log(`Deposit transaction hash on L1: ${hash}`); - - // Wait for the L1 transaction to be confirmed - const receipt = await publicClientL1.waitForTransactionReceipt({ hash }); - console.log('L1 transaction confirmed:', receipt); - - // Extract the corresponding L2 transaction hash - const l2Hashes = getL2TransactionHashes(receipt); - console.log(`Corresponding L2 transaction hash: ${l2Hashes}`); - - // Wait for the L2 transaction to be confirmed - const l2Receipt = await publicClientL2.waitForTransactionReceipt({ - hash: l2Hashes, - }); - console.log('L2 transaction confirmed:', l2Receipt); - - console.log('Deposit completed successfully!'); - } catch (error) { - console.error('Error during deposit:', error); - } -} -depositETH() + +const args = await publicClientL2.buildDepositTransaction({ + mint: parseEther("0.0001"), + to: account.address, +}); + +const hash = await walletClientL1.depositTransaction(args); +console.log(`Deposit transaction hash on L1: ${hash}`); + +const receipt = await publicClientL1.waitForTransactionReceipt({ hash }); +console.log('L1 transaction confirmed:', receipt); + +const l2Hashes = getL2TransactionHashes(receipt); +console.log(`Corresponding L2 transaction hash: ${l2Hashes}`); + +const l2Receipt = await publicClientL2.waitForTransactionReceipt({ + hash: l2Hashes, +}); +console.log('L2 transaction confirmed:', l2Receipt); +console.log('Deposit completed successfully!'); +} + async function withdrawETH() { - try { - const args = await publicClientL2.buildWithdrawalTransaction({ - withdrawalAmount: parseEther("0.0001"), - to: account.address, - }); - - const hash = await walletClientL2.initiateWithdrawal(args); - console.log(`Withdrawal transaction hash on L2: ${hash}`); - - const receipt = await publicClientL2.waitForTransactionReceipt({ hash }); - console.log('L2 transaction confirmed:', receipt); - - const { output, withdrawal } = await publicClientL1.waitToProve({ - receipt, - targetChain: walletClientL2.chain - }); - - const proveArgs = await publicClientL2.buildProveWithdrawal({ - output, - withdrawal, - }); - - const proveHash = await walletClientL1.proveWithdrawal(proveArgs); - - const proveReceipt = await publicClientL1.waitForTransactionReceipt({ hash: proveHash }); - - const awaitWithdrawal = await publicClientL1.waitToFinalize({ - targetChain: walletClientL2.chain, - withdrawalHash: withdrawal.withdrawalHash, - }); - - const finalizeHash = await walletClientL1.finalizeWithdrawal({ - targetChain: walletClientL2.chain, - withdrawal, - }); - - const finalizeReceipt = await publicClientL1.waitForTransactionReceipt({ - hash: finalizeHash - }); - - const status = await publicClientL1.getWithdrawalStatus({ - receipt, - targetChain: walletClientL2.chain - }) - - console.log('Withdrawal completed successfully!'); - } catch (error) { - console.error('Error during withdrawal:', error); - } - } - - withdrawETH() + +//Add the same imports used in DepositETH function +const args = await publicClientL2.buildWithdrawalTransaction({ +withdrawalAmount: parseEther("0.0001"), +to: account.address, +}); + +const hash = await walletClientL2.initiateWithdrawal(args); +console.log(`Withdrawal transaction hash on L2: ${hash}`); + +const receipt = await publicClientL2.waitForTransactionReceipt({ hash }); +console.log('L2 transaction confirmed:', receipt); + +const { output, withdrawal } = await publicClientL1.waitToProve({ +receipt, +targetChain: walletClientL2.chain +}); + +const proveArgs = await publicClientL2.buildProveWithdrawal({ +output, +withdrawal, +}); + +const proveHash = await walletClientL1.proveWithdrawal(proveArgs); + +const proveReceipt = await publicClientL1.waitForTransactionReceipt({ hash: proveHash }); + +const awaitWithdrawal = await publicClientL1.waitToFinalize({ +targetChain: walletClientL2.chain, +withdrawalHash: withdrawal.withdrawalHash, +}); + +const finalizeHash = await walletClientL1.finalizeWithdrawal({ +targetChain: walletClientL2.chain, +withdrawal, +}); + +const finalizeReceipt = await publicClientL1.waitForTransactionReceipt({ +hash: finalizeHash +}); + +const status = await publicClientL1.getWithdrawalStatus({ +receipt, +targetChain: walletClientL2.chain +}) +console.log('Withdrawal completed successfully!'); +} })() \ No newline at end of file From cc1c27218e48c4657a25ef05d995c5cf6cb00ee0 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Thu, 3 Oct 2024 16:51:23 +0100 Subject: [PATCH 094/565] remove emphasis --- .../app-developers/tutorials/cross-dom-bridge-eth.mdx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx b/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx index 4ffdd27c0..1bc426144 100644 --- a/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx +++ b/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx @@ -294,10 +294,10 @@ Now you're going to repeat the process in reverse to bridge some ETH from L2 to ## Important Considerations - * **Challenge Period**: The 7-day withdrawal challenge Period is crucial for security. - * **Gas Costs**: Withdrawals involve transactions on both L2 and L1, each incurring gas fees. - * **Private Key Handling**: Use secure key management practices in real applications. - * **RPC Endpoint Security**: Keep your API key (or any RPC endpoint) secure. + * Challenge Period: The 7-day withdrawal challenge Period is crucial for security. + * Gas Costs: Withdrawals involve transactions on both L2 and L1, each incurring gas fees. + * Private Key Handling: Use secure key management practices in real applications. + * RPC Endpoint Security: Keep your API key (or any RPC endpoint) secure. ## Next Steps From d88c7fbd47eb73b554e91a99646d04da891add78 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Thu, 3 Oct 2024 18:18:06 +0100 Subject: [PATCH 095/565] use file format system --- .../tutorials/sdk-estimate-costs.mdx | 97 ++++++------------- public/tutorials/sdk-estimate-costs.js | 75 ++++++-------- 2 files changed, 55 insertions(+), 117 deletions(-) diff --git a/pages/builders/app-developers/tutorials/sdk-estimate-costs.mdx b/pages/builders/app-developers/tutorials/sdk-estimate-costs.mdx index 83b7593c5..125205d4d 100644 --- a/pages/builders/app-developers/tutorials/sdk-estimate-costs.mdx +++ b/pages/builders/app-developers/tutorials/sdk-estimate-costs.mdx @@ -109,35 +109,22 @@ Let's set those up now. {

Import Viem and other necessary modules

} -```js - -const { createPublicClient, createWalletClient, http, parseEther, parseGwei, formatEther } = require('viem'); -const { privateKeyToAccount } = require('viem/accounts'); -const { optimismSepolia } = require('viem/chains'); -const { publicActionsL2, walletActionsL2 } = require('viem/op-stack'); +```js file=/public/tutorials/sdk-estimate-costs.js#L3-L6 hash=32ecaac58846bfe7e785e2cc35562120 ``` {

Set up the account

} -```js -const account = privateKeyToAccount(process.env.TUTORIAL_PRIVATE_KEY); +```js file=/public/tutorials/sdk-estimate-costs.js#L8-L9 hash=165490e75b825c786a937fba7b8e159d ``` + {

Create the public client

} -```js -const publicClientL2 = createPublicClient({ - chain: optimismSepolia, - transport: http("https://sepolia.optimism.io"), -}).extend(publicActionsL2()); +```js file=/public/tutorials/sdk-estimate-costs.js#L11-L14 hash=42293ff382c932f806beb7252803a848 ``` {

Create the wallet client

} -```js -const walletClientL2 = createWalletClient({ - chain: optimismSepolia, - transport: http("https://sepolia.optimism.io"), -}).extend(walletActionsL2()); +```js file=/public/tutorials/sdk-estimate-costs.js#L16-L19 hash=e7b6423850765242512e71589382791b ``` @@ -151,43 +138,31 @@ You're now going to estimate the cost of a transaction on OP Mainnet. Viem makes it easy to prepare a transactions so you can estimate the cost of a transaction before you sign it. Here you'll define an object with the required transaction fields and send a small amount of ETH from your address to the address `0x1000000000000000000000000000000000000000`. - ```js - const transaction = { - account, - to: '0x1000000000000000000000000000000000000000', - value: parseEther('0.005'), - gasPrice: parseGwei('20') - }; - ``` +```js file=/public/tutorials/sdk-estimate-costs.js#L21-L26 hash=583ee48142f33686188a7bf1cc312a1c +``` This transaction will send `0.005` ETH to the specified address with a gas price of 20 Gwei. {

Estimate the execution gas fee

} Now, let's estimate the gas limit for our transaction. - ```js - const gasLimit = await publicClientL2.estimateGas(transaction); - console.log(`Estimated Gas Limit: ${gasLimit}`); - ``` +```js file=/public/tutorials/sdk-estimate-costs.js#L28-L29 hash=014939607bf2444d5f2e5a7babb02a46 +``` {

Retrieve the current gas price

} Retrieve the current gas price (effective gas price), Alternatively, given that you already set the gas price manually, you can use the `getGasPrice` method from viem. - ```js - const effectiveGasPrice = await publicClientL2.getGasPrice(); - console.log(`effective Gas Price, ${effectiveGasPrice}`); - ``` +```js file=/public/tutorials/sdk-estimate-costs.js#L31-L32 hash=b43ae2cb1a7471de55858fbc7f7fe5a6 +``` {

Calculate the execution gas fee

} To calculate the execution gas fee simply multiply the gas limit by the effective gas price. - ```js - const l2CostEstimate = gasLimit * effectiveGasPrice; - console.log(`Estimated Execution Gas Fee: ${formatEther(l2CostEstimate)}`); - ``` +```js file=/public/tutorials/sdk-estimate-costs.js#L34-L35 hash=3e536e97b83458d3d3c7545b2c74ffd6 +```
{

Estimate the L1 data fee

} @@ -196,29 +171,23 @@ You're now going to estimate the cost of a transaction on OP Mainnet. Under the hood, this function is estimating the amount of Ethereum gas required to publish this transaction on Ethereum and multiplying it by the current Ethereum gas price (as tracked by the L2). This function returns the current cost estimate in wei. - ```js - const l1CostEstimate = await publicClientL2.estimateL1Fee(transaction) - console.log(`Estimated L1 data Fee: ${formatEther(l1CostEstimate)}`); - ``` +```js file=/public/tutorials/sdk-estimate-costs.js#L37-L38 hash=b1ef73988e0876529a72b61d5822cbe1 +``` {

Estimate the total cost

} Once you've individually estimated the execution gas fee and the L1 data fee, you can sum these two values together to get the total cost of the transaction. - ```js - const totalEstimate = l2CostEstimate + l1CostEstimate; - console.log(`Estimated Total Cost: ${formatEther(totalEstimate)} `); - ``` +```js file=/public/tutorials/sdk-estimate-costs.js#L40-L41 hash=8685f586913b87a5881cc6f917d0de50 +``` {

Send the transaction

} Now that you've estimated the total cost of the transaction, go ahead and send it to the network. This will make it possible to see the actual cost of the transaction to compare to your estimate. - ```js - const txHash = await walletClientL2.sendTransaction(transaction) - console.log(`Transaction Hash: ${txHash}`); - ``` +```js file=/public/tutorials/sdk-estimate-costs.js#L43-L44 hash=a0a19fa7fc17165d934cc9f7af075464 +``` {

Check the actual execution gas fee

} @@ -226,32 +195,22 @@ You're now going to estimate the cost of a transaction on OP Mainnet. You can do so by accessing the `gasUsed` and `effectiveGasPrice` from the transaction receipt. You can then multiply these values to get the actual L2 cost of the transaction - ```js - const receipt = await publicClientL2.getTransactionReceipt({ hash: txHash }); - console.log('Transaction receipt:', receipt); - - const l2CostActual = receipt.gasUsed * receipt.effectiveGasPrice; - console.log(`L2 Actual Cost: ${formatEther(l2CostActual)}`); - ``` +```js file=/public/tutorials/sdk-estimate-costs.js#L46-L49 hash=e128f21d2c994f42bdc7f5fb51eb127d +``` {

Check the actual L1 data fee

} You can also check the actual L1 data fee. - ```js - const l1CostActual = await publicClientL2.estimateL1Fee(txHash) - console.log(`l1CostActual gas fee: ${formatEther(l1CostActual)}`); - - ``` +```js file=/public/tutorials/sdk-estimate-costs.js#L51-L52 hash=ea1801a7618fa2a21f02a97717380f42 +``` {

Check the actual total cost

} Sum these two together to get the actual total cost of the transaction. - ```js - const totalActual = l2CostActual + l1CostActual; - console.log(`Total Actual Cost: ${formatEther(totalActual)}`); - ``` +```js file=/public/tutorials/sdk-estimate-costs.js#L54-L56 hash=6f7943da9d70654dc040b5561b3b360d +``` {

Check the difference

} @@ -259,10 +218,8 @@ You're now going to estimate the cost of a transaction on OP Mainnet. This will give you a sense of how accurate your estimate was. Estimates will never be entirely accurate, but they should be close! - ```js - const difference = totalEstimate >= totalActual ? totalEstimate - totalActual : totalActual - totalEstimate - console.log(`Estimation Difference: ${formatEther(difference)} ETH`) - ``` +```js file=/public/tutorials/sdk-estimate-costs.js#L57-L58 hash=20c8c60af1cc39e842b207cfd2dfa2cb +``` diff --git a/public/tutorials/sdk-estimate-costs.js b/public/tutorials/sdk-estimate-costs.js index 95ab5e553..15e2a7505 100644 --- a/public/tutorials/sdk-estimate-costs.js +++ b/public/tutorials/sdk-estimate-costs.js @@ -6,74 +6,55 @@ const { optimismSepolia } = require('viem/chains'); const { publicActionsL2, walletActionsL2 } = require('viem/op-stack'); const privateKey = process.env.TUTORIAL_PRIVATE_KEY - const account = privateKeyToAccount(privateKey) -// Set up the public client const publicClient = createPublicClient({ chain: optimismSepolia, transport: http("https://sepolia.optimism.io"), }).extend(publicActionsL2()) -// Set up the wallet client -const walletClient = createWalletClient({ +const walletClientL2 = createWalletClient({ chain: optimismSepolia, transport: http("https://sepolia.optimism.io"), }).extend(walletActionsL2()) - try { - // Prepare the transaction - const transaction = { - account, - to: '0x1000000000000000000000000000000000000000', - value: parseEther('0.005'), - gasPrice: parseGwei('20') - } - - // Estimate gas limit - const gasLimit = await publicClient.estimateGas(transaction) - console.log(`Estimated Gas Limit: ${gasLimit}`) - - // Get current gas price - const effectiveGasPrice = await publicClient.getGasPrice() - console.log(`Effective Gas Price: ${formatEther(effectiveGasPrice)} ETH`) + const transaction = { + account, + to: '0x1000000000000000000000000000000000000000', + value: parseEther('0.005'), + gasPrice: parseGwei('20') + } - // Calculate execution gas fee - const l2CostEstimate = gasLimit * effectiveGasPrice - console.log(`Estimated Execution Gas Fee: ${formatEther(l2CostEstimate)} ETH`) + const gasLimit = await publicClient.estimateGas(transaction) + console.log(`Estimated Gas Limit: ${gasLimit}`) - // Estimate L1 data fee - const l1CostEstimate = await publicClient.estimateL1Fee(transaction) - console.log(`Estimated L1 Data Fee: ${formatEther(l1CostEstimate)} ETH`) + const effectiveGasPrice = await publicClient.getGasPrice() + console.log(`Effective Gas Price: ${formatEther(effectiveGasPrice)} ETH`) - // Calculate total estimated cost - const totalEstimate = l2CostEstimate + l1CostEstimate - console.log(`Estimated Total Cost: ${formatEther(totalEstimate)} ETH`) + const l2CostEstimate = gasLimit * effectiveGasPrice + console.log(`Estimated Execution Gas Fee: ${formatEther(l2CostEstimate)} ETH`) - // Send the transaction - const txHash = await walletClient.sendTransaction(transaction) - console.log(`Transaction Hash: ${txHash}`) + const l1CostEstimate = await publicClient.estimateL1Fee(transaction) + console.log(`Estimated L1 Data Fee: ${formatEther(l1CostEstimate)} ETH`) - // Wait for the transaction to be mined - const receipt = await publicClient.waitForTransactionReceipt({ hash: txHash }) + const totalEstimate = l2CostEstimate + l1CostEstimate + console.log(`Estimated Total Cost: ${formatEther(totalEstimate)} ETH`) - // Calculate actual costs - const l2CostActual = receipt.gasUsed * receipt.effectiveGasPrice - console.log(`Actual Execution Gas Fee: ${formatEther(l2CostActual)} ETH`) + const txHash = await walletClientL2.sendTransaction(transaction) + console.log(`Transaction Hash: ${txHash}`) - const l1CostActual = await publicClient.estimateL1Fee({ hash: txHash }) - console.log(`Actual L1 Data Fee: ${formatEther(l1CostActual)} ETH`) + const receipt = await publicClient.waitForTransactionReceipt({ hash: txHash }) - const totalActual = l2CostActual + l1CostActual - console.log(`Actual Total Cost: ${formatEther(totalActual)} ETH`) + const l2CostActual = receipt.gasUsed * receipt.effectiveGasPrice + console.log(`Actual Execution Gas Fee: ${formatEther(l2CostActual)} ETH`) - // Compare estimated vs actual costs - const difference = totalEstimate >= totalActual ? totalEstimate - totalActual : totalActual - totalEstimate - console.log(`Estimation Difference: ${formatEther(difference)} ETH`) + const l1CostActual = await publicClient.estimateL1Fee({ hash: txHash }) + console.log(`Actual L1 Data Fee: ${formatEther(l1CostActual)} ETH`) - } catch (error) { - console.error('Error:', error) - } + const totalActual = l2CostActual + l1CostActual + console.log(`Actual Total Cost: ${formatEther(totalActual)} ETH`) + const difference = totalEstimate >= totalActual ? totalEstimate - totalActual : totalActual - totalEstimate + console.log(`Estimation Difference: ${formatEther(difference)} ETH`) })() \ No newline at end of file From e0d44cdb3afaf285e4c15dd89fcb9cd99e1d543f Mon Sep 17 00:00:00 2001 From: Silja Petasch <78182344+siljapetasch@users.noreply.github.com> Date: Fri, 4 Oct 2024 11:32:17 +0200 Subject: [PATCH 096/565] Update consensus-config.mdx: add override.granite --- .../node-operators/configuration/consensus-config.mdx | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/pages/builders/node-operators/configuration/consensus-config.mdx b/pages/builders/node-operators/configuration/consensus-config.mdx index 38e720412..3ba7fd674 100644 --- a/pages/builders/node-operators/configuration/consensus-config.mdx +++ b/pages/builders/node-operators/configuration/consensus-config.mdx @@ -360,6 +360,16 @@ Manually specify the fjord fork timestamp, overriding the bundled setting. The d `OP_NODE_OVERRIDE_FJORD=0` +### override.granite + +Manually specify the granite fork timestamp, overriding the bundled setting. The default value is `0`. + + + `--override.granite=` + `--override.granite=0` + `OP_NODE_OVERRIDE_GRANITE=0` + + ### p2p.advertise.ip The IP address to advertise in Discv5, put into the ENR of the node. This may also be a hostname/domain name to resolve to an IP. From 67196445c97daec024a885cc7ac80252b523f63a Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Fri, 4 Oct 2024 15:01:00 +0100 Subject: [PATCH 097/565] updated workflow --- .github/workflows/tutorials.yml | 38 --------------------------------- 1 file changed, 38 deletions(-) diff --git a/.github/workflows/tutorials.yml b/.github/workflows/tutorials.yml index 74e8870c7..9e5336541 100644 --- a/.github/workflows/tutorials.yml +++ b/.github/workflows/tutorials.yml @@ -10,45 +10,7 @@ concurrency: cancel-in-progress: false jobs: - cross-dom-bridge-erc20: - runs-on: ubuntu-latest - - steps: - - name: Check out code - uses: actions/checkout@v2 - - - name: Set up Node.js - uses: actions/setup-node@v2 - with: - node-version: '20.x' - - - name: Install pnpm - run: npm install -g pnpm - - - name: Install dependencies - run: pnpm install - - - name: Run tutorial - env: - TUTORIAL_PRIVATE_KEY: ${{ secrets.TUTORIAL_PRIVATE_KEY }} - run: - node ./public/tutorials/cross-dom-bridge-erc20.js - - - name: Notify Slack on failure - uses: ravsamhq/notify-slack-action@v2 - if: always() - with: - status: ${{ job.status }} - notify_when: "failure" - notification_title: "{workflow} has {status_message} (<{run_url}|view errors>)" - message_format: "{emoji} *{workflow}* {status_message} in <{repo_url}|{repo}>" - footer: "<{run_url}|View Run>" - mention_users_when: "failure,warnings" - env: - SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }} - cross-dom-bridge-eth: - needs: cross-dom-bridge-erc20 runs-on: ubuntu-latest steps: From d07ebfef83ed14dcbf5357c5a4811db30d75bd7e Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Fri, 4 Oct 2024 15:06:03 +0100 Subject: [PATCH 098/565] added viem --- package.json | 3 +- pnpm-lock.yaml | 103 ++++++++++++++++++++++++++++--------------------- 2 files changed, 62 insertions(+), 44 deletions(-) diff --git a/package.json b/package.json index 7ea954ca7..30c68aa85 100644 --- a/package.json +++ b/package.json @@ -28,7 +28,8 @@ "nextra-theme-docs": "2.13.2", "react": "^18.2.0", "react-dom": "^18.2.0", - "search-insights": "^2.15.0" + "search-insights": "^2.15.0", + "viem": "^2.21.18" }, "devDependencies": { "@double-great/remark-lint-alt-text": "^1.0.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 03596b6ff..f587f0804 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -61,6 +61,9 @@ importers: search-insights: specifier: ^2.15.0 version: 2.15.0 + viem: + specifier: ^2.21.18 + version: 2.21.18(typescript@5.4.5)(zod@3.23.8) devDependencies: '@double-great/remark-lint-alt-text': specifier: ^1.0.0 @@ -763,15 +766,11 @@ packages: cpu: [x64] os: [win32] - '@noble/curves@1.2.0': - resolution: {integrity: sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==} - '@noble/curves@1.3.0': resolution: {integrity: sha512-t01iSXPuN+Eqzb4eBX0S5oubSqXbK/xXa1Ne18Hj8f9pStxztHCE2gfboSp/dZRLSqfuLpRK2nDXDK+W9puocA==} - '@noble/hashes@1.3.2': - resolution: {integrity: sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==} - engines: {node: '>= 16'} + '@noble/curves@1.4.0': + resolution: {integrity: sha512-p+4cb332SFCrReJkCYe8Xzm0OWi4Jji5jVdIZRL/PmacmDkFNw6MrrV+gGpiPxLHbV+zKFRywUWbaseT+tZRXg==} '@noble/hashes@1.3.3': resolution: {integrity: sha512-V7/fPHgl+jsVPXqqeOzT8egNj2iBIVt+ECeMMG8TdcnTikP3oaBtUVqpT/gYCR68aEBJSF+XbYUxStjbFMqIIA==} @@ -781,6 +780,10 @@ packages: resolution: {integrity: sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==} engines: {node: '>= 16'} + '@noble/hashes@1.5.0': + resolution: {integrity: sha512-1j6kQFb7QRru7eKN3ZDvRcP13rugwdxZqCjbiAVZfIJwgj2A65UmT4TgARXGlXgnRkORLTDTrO19ZErt7+QXgA==} + engines: {node: ^14.21.3 || >=16} + '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -850,18 +853,21 @@ packages: '@scure/base@1.1.6': resolution: {integrity: sha512-ok9AWwhcgYuGG3Zfhyqg+zwl+Wn5uE+dwC0NV/2qQkx4dABbb/bx96vWu8NSj+BNjjSjno+JRYRjle1jV08k3g==} - '@scure/bip32@1.3.2': - resolution: {integrity: sha512-N1ZhksgwD3OBlwTv3R6KFEcPojl/W4ElJOeCZdi+vuI5QmTFwLq3OFf2zd2ROpKvxFdgZ6hUpb0dx9bVNEwYCA==} + '@scure/base@1.1.9': + resolution: {integrity: sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg==} '@scure/bip32@1.3.3': resolution: {integrity: sha512-LJaN3HwRbfQK0X1xFSi0Q9amqOgzQnnDngIt+ZlsBC3Bm7/nE7K0kwshZHyaru79yIVRv/e1mQAjZyuZG6jOFQ==} - '@scure/bip39@1.2.1': - resolution: {integrity: sha512-Z3/Fsz1yr904dduJD0NpiyRHhRYHdcnyh73FZWiV+/qhWi83wNJ3NWolYqCEN+ZWsUz2TWwajJggcRE9r1zUYg==} + '@scure/bip32@1.4.0': + resolution: {integrity: sha512-sVUpc0Vq3tXCkDGYVWGIZTRfnvu8LoTDaev7vbwh0omSvVORONr960MQWdKqJDCReIEmTj3PAr73O3aoxz7OPg==} '@scure/bip39@1.2.2': resolution: {integrity: sha512-HYf9TUXG80beW+hGAt3TRM8wU6pQoYur9iNypTROm42dorCGmLnFe3eWjz3gOq6G62H2WRh0FCzAR1PI+29zIA==} + '@scure/bip39@1.4.0': + resolution: {integrity: sha512-BEEm6p8IueV/ZTfQLp/0vhw4NPnT9oWf5+28nvmeUICjP99f4vr2d+qc7AVGDDtwRep6ifR43Yed9ERVmiITzw==} + '@swc/helpers@0.5.2': resolution: {integrity: sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==} @@ -988,8 +994,8 @@ packages: resolution: {integrity: sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - abitype@1.0.0: - resolution: {integrity: sha512-NMeMah//6bJ56H5XRj8QCV4AwuW6hB6zqz2LnhhLdcWVQOsXki6/Pn3APeqxCma62nXIcmZWdu1DlHWS74umVQ==} + abitype@1.0.5: + resolution: {integrity: sha512-YzDhti7cjlfaBhHutMaboYB21Ha3rXR9QTkNJFzYC4kC8YclaiwPBBBJY8ejFdu2wnJeZCVZSMlQJ7fi8S6hsw==} peerDependencies: typescript: '>=5.0.4' zod: ^3 >=3.22.0 @@ -2178,8 +2184,8 @@ packages: isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - isows@1.0.3: - resolution: {integrity: sha512-2cKei4vlmg2cxEjm3wVSqn8pcoRF/LX/wpifuuNquFO4SQmPwarClT+SUCA2lt+l581tTeZIPIZuIDo2jWN1fg==} + isows@1.0.4: + resolution: {integrity: sha512-hEzjY+x9u9hPmBom9IIAqdJCwNLax+xrPb51vEPpERoFlIxgmZcHzsT5jKG06nvInKOBGvReAVz80Umed5CczQ==} peerDependencies: ws: '*' @@ -3524,8 +3530,8 @@ packages: vfile@6.0.1: resolution: {integrity: sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw==} - viem@2.9.28: - resolution: {integrity: sha512-/1iTg8yQlCNJ+7wSmdsBNB/vhjWqFJtTH6XZXHjGXrZnlBxAtHR5ZAr5TvTJc/2nhVIVE4BkCe5JCrIiSuZodg==} + viem@2.21.18: + resolution: {integrity: sha512-CuZpymwBsuK2/YNDJE06EXxpfYs71X4v5ZwiGV5RczLKOwfHa/XuM3+GKbAoKCVeQ/tFt5n8XeHsMnbvEAauTg==} peerDependencies: typescript: '>=5.0.4' peerDependenciesMeta: @@ -3561,6 +3567,9 @@ packages: resolution: {integrity: sha512-tsu8FiKJLk2PzhDl9fXbGUWTkkVXYhtTA+SmEFkKft+9BgwLxfCRpU96sWv7ICC8zixBNd3JURVoiR3dUXgP8A==} engines: {node: '>=8.0.0'} + webauthn-p256@0.0.5: + resolution: {integrity: sha512-drMGNWKdaixZNobeORVIqq7k5DsRC9FnG201K2QjeOoQLmtSDaSsVZdkg6n5jUALJKcAG++zBPJXmv6hy0nWFg==} + webidl-conversions@3.0.1: resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} @@ -3617,8 +3626,8 @@ packages: utf-8-validate: optional: true - ws@8.13.0: - resolution: {integrity: sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==} + ws@8.17.1: + resolution: {integrity: sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==} engines: {node: '>=10.0.0'} peerDependencies: bufferutil: ^4.0.1 @@ -3999,7 +4008,7 @@ snapshots: change-case: 4.1.2 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - viem: 2.9.28(typescript@5.4.5)(zod@3.23.8) + viem: 2.21.18(typescript@5.4.5)(zod@3.23.8) transitivePeerDependencies: - bufferutil - typescript @@ -4516,20 +4525,20 @@ snapshots: '@next/swc-win32-x64-msvc@13.5.1': optional: true - '@noble/curves@1.2.0': - dependencies: - '@noble/hashes': 1.3.2 - '@noble/curves@1.3.0': dependencies: '@noble/hashes': 1.3.3 - '@noble/hashes@1.3.2': {} + '@noble/curves@1.4.0': + dependencies: + '@noble/hashes': 1.4.0 '@noble/hashes@1.3.3': {} '@noble/hashes@1.4.0': {} + '@noble/hashes@1.5.0': {} + '@nodelib/fs.scandir@2.1.5': dependencies: '@nodelib/fs.stat': 2.0.5 @@ -4611,11 +4620,7 @@ snapshots: '@scure/base@1.1.6': {} - '@scure/bip32@1.3.2': - dependencies: - '@noble/curves': 1.2.0 - '@noble/hashes': 1.3.2 - '@scure/base': 1.1.6 + '@scure/base@1.1.9': {} '@scure/bip32@1.3.3': dependencies: @@ -4623,9 +4628,10 @@ snapshots: '@noble/hashes': 1.3.3 '@scure/base': 1.1.6 - '@scure/bip39@1.2.1': + '@scure/bip32@1.4.0': dependencies: - '@noble/hashes': 1.3.2 + '@noble/curves': 1.4.0 + '@noble/hashes': 1.4.0 '@scure/base': 1.1.6 '@scure/bip39@1.2.2': @@ -4633,6 +4639,11 @@ snapshots: '@noble/hashes': 1.3.3 '@scure/base': 1.1.6 + '@scure/bip39@1.4.0': + dependencies: + '@noble/hashes': 1.5.0 + '@scure/base': 1.1.9 + '@swc/helpers@0.5.2': dependencies: tslib: 2.6.2 @@ -4766,7 +4777,7 @@ snapshots: abbrev@2.0.0: {} - abitype@1.0.0(typescript@5.4.5)(zod@3.23.8): + abitype@1.0.5(typescript@5.4.5)(zod@3.23.8): optionalDependencies: typescript: 5.4.5 zod: 3.23.8 @@ -6192,9 +6203,9 @@ snapshots: isexe@2.0.0: {} - isows@1.0.3(ws@8.13.0): + isows@1.0.4(ws@8.17.1): dependencies: - ws: 8.13.0 + ws: 8.17.1 jackspeak@2.3.6: dependencies: @@ -8352,16 +8363,17 @@ snapshots: unist-util-stringify-position: 4.0.0 vfile-message: 4.0.2 - viem@2.9.28(typescript@5.4.5)(zod@3.23.8): + viem@2.21.18(typescript@5.4.5)(zod@3.23.8): dependencies: '@adraffy/ens-normalize': 1.10.0 - '@noble/curves': 1.2.0 - '@noble/hashes': 1.3.2 - '@scure/bip32': 1.3.2 - '@scure/bip39': 1.2.1 - abitype: 1.0.0(typescript@5.4.5)(zod@3.23.8) - isows: 1.0.3(ws@8.13.0) - ws: 8.13.0 + '@noble/curves': 1.4.0 + '@noble/hashes': 1.4.0 + '@scure/bip32': 1.4.0 + '@scure/bip39': 1.4.0 + abitype: 1.0.5(typescript@5.4.5)(zod@3.23.8) + isows: 1.0.4(ws@8.17.1) + webauthn-p256: 0.0.5 + ws: 8.17.1 optionalDependencies: typescript: 5.4.5 transitivePeerDependencies: @@ -8399,6 +8411,11 @@ snapshots: randombytes: 2.1.0 utf8: 3.0.0 + webauthn-p256@0.0.5: + dependencies: + '@noble/curves': 1.4.0 + '@noble/hashes': 1.4.0 + webidl-conversions@3.0.1: {} whatwg-url@5.0.0: @@ -8462,7 +8479,7 @@ snapshots: ws@7.4.6: {} - ws@8.13.0: {} + ws@8.17.1: {} xdg-basedir@5.1.0: {} From 59c12d856d198f83079846934271fa5fd9fb5710 Mon Sep 17 00:00:00 2001 From: krofax Date: Fri, 4 Oct 2024 16:31:47 +0100 Subject: [PATCH 099/565] updated content --- pages/builders/notices/sdk-deprecation.mdx | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/pages/builders/notices/sdk-deprecation.mdx b/pages/builders/notices/sdk-deprecation.mdx index 459addbbf..4d7f4e938 100644 --- a/pages/builders/notices/sdk-deprecation.mdx +++ b/pages/builders/notices/sdk-deprecation.mdx @@ -5,7 +5,7 @@ description: This page outlines the details of the Optimism SDK deprecation and ## Preparing for Optimism SDK deprecation -The Optimism SDK will officially be deprecated on **\[insert deprecation date]**. We are shifting to the `viem/opstack` library for a more modern, efficient, and flexible development experience. This change affects all tutorials and resources that previously relied on the Optimism SDK, and we have updated relevant documentation accordingly. +The Optimism SDK will officially be deprecated in Q1 2025. We are shifting to the `viem/opstack` library for a more modern, efficient, and flexible development experience. This change affects all tutorials and resources that previously relied on the Optimism SDK, and we have updated relevant documentation accordingly. ### Breaking Changes to Expect @@ -20,7 +20,9 @@ We strongly encourage developers and users to transition to `viem/opstack` befor ### Updated Tutorials -We've updated our tutorials and documentation to use `viem/opstack` library. Below, you'll find links to the updated versions of popular tutorials: +We are updated our tutorials and documentation to use `viem/opstack` library. + + {/* Below, you'll find links to the updated versions of popular tutorials: * [Estimating Transaction Costs on OP Mainnet](../tutorials/transaction-cost-estimation)\ Estimation of transaction costs now uses the `viem` gas estimation utilities. @@ -47,7 +49,7 @@ We've updated our tutorials and documentation to use `viem/opstack` library. Bel **Deprecated** – please use [Estimating Transaction Costs on OP Mainnet](../tutorials/transaction-cost-estimation). * [Communicating Between OP Mainnet and Ethereum in Solidity](../tutorials/cross-chain-solidity)\ - Cross-chain communication now leverages `opstack` for all messaging. + Cross-chain communication now leverages `opstack` for all messaging. */} ### For App Developers @@ -60,7 +62,7 @@ Install new dependencies: Replace the Optimism SDK with `viem/opstack` in your p ```bash pnpm remove @eth-optimism/sdk - npm install viem + pnpm add viem ``` * Update imports: Replace Optimism SDK imports with `viem/opstack` imports. @@ -91,10 +93,8 @@ Node operators should take the following steps: ### Need Help? -For further assistance or questions about this migration, feel free to reach out via the +For further assistance or questions about this migration, feel free to reach throught the following channels. -* [Community forum](https://community.optimism.io/) or -* [Join our developer Slack](#). -* Join our [Discord](#) for community support -* Open an [issue on our GitHub repository](#) -* Check our [FAQ](#) for common questions and answers +* Join our [community forum](https://community.optimism.io/) +* Join our [discord](https://discord.gg/optimism) for community support +* Open an [issue on our GitHub repository](https://github.com/ethereum-optimism/docs/issues) From f67bb4fe4c68da80d90d283bc19e1c7e83af5553 Mon Sep 17 00:00:00 2001 From: krofax Date: Fri, 4 Oct 2024 16:47:24 +0100 Subject: [PATCH 100/565] updated docs --- pages/builders/notices/sdk-deprecation.mdx | 44 +++++++++++----------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/pages/builders/notices/sdk-deprecation.mdx b/pages/builders/notices/sdk-deprecation.mdx index 4d7f4e938..db9ced19d 100644 --- a/pages/builders/notices/sdk-deprecation.mdx +++ b/pages/builders/notices/sdk-deprecation.mdx @@ -1,26 +1,26 @@ --- title: Deprecation of the Optimism SDK -description: This page outlines the details of the Optimism SDK deprecation and guides developers to migrate to using `viem/opstack` library. +description: This page outlines the details of the Optimism SDK deprecation and guides developers to migrate to using `viem` library. --- ## Preparing for Optimism SDK deprecation -The Optimism SDK will officially be deprecated in Q1 2025. We are shifting to the `viem/opstack` library for a more modern, efficient, and flexible development experience. This change affects all tutorials and resources that previously relied on the Optimism SDK, and we have updated relevant documentation accordingly. +The Optimism SDK will officially be deprecated in Q1 2025. The project is shifting to the `viem` library for a more modern, efficient, and flexible development experience. This change affects all tutorials and resources that previously relied on the Optimism SDK, and relevant documentation has been updated accordingly. ### Breaking Changes to Expect -The migration from the Optimism SDK to `viem/opstack` library brings several breaking changes: +The migration from the Optimism SDK to `viem` library brings several breaking changes: * **Transaction estimation**: Methods for estimating gas fees will now leverage `viem` APIs. -* **Bridging**: All token bridging actions must be updated to use the `viem/opstack` library bridging methods. -* **Cross-chain communication**: `viem/opstack` library simplifies the cross-domain messaging functionality. -* **SDK method removal**: All deprecated SDK methods will be unavailable after \[insert deprecation date]. +* **Bridging**: All token bridging actions must be updated to use the `viem` library bridging methods. +* **Cross-chain communication**: `viem` library simplifies the cross-domain messaging functionality. +* **SDK method removal**: All deprecated SDK methods will be unavailable after Q1 2025. -We strongly encourage developers and users to transition to `viem/opstack` before the deprecation date to avoid disruptions. +Developers and users are strongly encouraged to transition to `viem` before the deprecation date to avoid disruptions. ### Updated Tutorials -We are updated our tutorials and documentation to use `viem/opstack` library. +We are updating our tutorials to use the `viem` library. {/* Below, you'll find links to the updated versions of popular tutorials: @@ -53,48 +53,48 @@ We are updated our tutorials and documentation to use `viem/opstack` library. ### For App Developers -If your application currently depends on the Optimism SDK, you will need to migrate to using the `viem/opstack` library. -Our tutorials have been updated to reflect these changes, and it is critical to update your applications before the deprecation date to maintain compatibility. +If your application currently depends on the Optimism SDK, you will need to migrate to using the `viem` library. +The tutorials have been updated to reflect these changes, and it is critical to update your applications before the deprecation date to maintain compatibility. Here are some key points to consider: -Install new dependencies: Replace the Optimism SDK with `viem/opstack` in your project. +Install new dependencies: Replace the Optimism SDK with `viem` in your project. ```bash pnpm remove @eth-optimism/sdk pnpm add viem ``` -* Update imports: Replace Optimism SDK imports with `viem/opstack` imports. -* Migrate SDK methods: Refactor your code to use equivalent `viem/opstack` methods. Refer to the viem documentation and opstack documentation for guidance. +* Update imports: Replace Optimism SDK imports with `viem` imports. +* Migrate SDK methods: Refactor your code to use equivalent `viem` methods. Refer to the viem documentation and opstack documentation for guidance. * Test thoroughly: After migration, extensively test your application to ensure all functionality works as expected. ### For Chain Operators -Chain operators utilizing the SDK for cross-chain operations, bridging, or other functions should switch to the `viem/opstack`. -The `viem/opstack` library offer more efficient methods to handle these operations. +Chain operators utilizing the SDK for cross-chain operations, bridging, or other functions should switch to the `viem` library. +The `viem` library offers more efficient methods to handle these operations. Chain operators should be aware of the following: * SDK removal: Remove any dependencies on the Optimism SDK in your infrastructure. -* Update tooling: Ensure all tools and scripts are updated to use `viem/opstack`. +* Update tooling: Ensure all tools and scripts are updated to use `viem`. * Monitor performance: After migration, closely monitor your chain's performance to ensure smooth operation. ### For Node Operators -Node operators will need to ensure that any scripts or services relying on the Optimism SDK are updated to use `viem/opstack` library. +Node operators will need to ensure that any scripts or services relying on the Optimism SDK are updated to use `viem` library. These updates will help align with future improvements and scalability efforts across the OP Stack. Node operators should take the following steps: -* Update node software: Ensure your node software is compatible with the latest `viem/opstack` libraries. +* Update node software: Ensure your node software is compatible with the latest `viem` libraries. * Review configuration: Check and update any configuration files that may reference the Optimism SDK. * Test thoroughly: Perform comprehensive testing in a staging environment before updating production nodes. ### Need Help? -For further assistance or questions about this migration, feel free to reach throught the following channels. +For further assistance or questions about this migration, feel free to reach through the following channels: -* Join our [community forum](https://community.optimism.io/) -* Join our [discord](https://discord.gg/optimism) for community support -* Open an [issue on our GitHub repository](https://github.com/ethereum-optimism/docs/issues) +* Join our [community forum](https://community.optimism.io/) for discussions and support +* Connect with us on [Discord](https://discord.gg/optimism) for community support +* Open an [issue on our GitHub repository](https://github.com/ethereum-optimism/docs/issues) for documentation-related concerns From cdeb33271b77dc53de3304e6fcd27b7a95e97d18 Mon Sep 17 00:00:00 2001 From: krofax Date: Fri, 4 Oct 2024 16:48:31 +0100 Subject: [PATCH 101/565] Added a lang attribute --- pages/builders/notices/sdk-deprecation.mdx | 1 + 1 file changed, 1 insertion(+) diff --git a/pages/builders/notices/sdk-deprecation.mdx b/pages/builders/notices/sdk-deprecation.mdx index db9ced19d..7d8b9b8a2 100644 --- a/pages/builders/notices/sdk-deprecation.mdx +++ b/pages/builders/notices/sdk-deprecation.mdx @@ -1,5 +1,6 @@ --- title: Deprecation of the Optimism SDK +lang: en-US description: This page outlines the details of the Optimism SDK deprecation and guides developers to migrate to using `viem` library. --- From 7847749fc0f290969481e52e6b6fbff948694d56 Mon Sep 17 00:00:00 2001 From: Bradley Camacho <42678939+bradleycamacho@users.noreply.github.com> Date: Fri, 4 Oct 2024 09:16:05 -0700 Subject: [PATCH 102/565] Add feedback --- .../tools/chain-monitoring.mdx | 23 +++++++++++-------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/pages/builders/chain-operators/tools/chain-monitoring.mdx b/pages/builders/chain-operators/tools/chain-monitoring.mdx index f1c6eff5c..964b06873 100644 --- a/pages/builders/chain-operators/tools/chain-monitoring.mdx +++ b/pages/builders/chain-operators/tools/chain-monitoring.mdx @@ -21,15 +21,20 @@ Monitorism is a tooling suite that supports monitoring and active remediation ac Currently. the list of monitors includes: -- Global Events Monitor: made for to taking YAML rules as configuration and monitoring the events that are emitted on the chain. -- Liveness Expiration Monitor: monitors the liveness expiration on Safes. -- Withdrawals Monitor: checks for new withdrawals that have been proven to the OptimismPortal contract. Each withdrawal is checked against the `L2ToL1MessagePasser` contract. -- Balances Monitor: emits a metric reporting the balances for the configured accounts. -- Fault Monitor: checks for changes in output roots posted to the `L2OutputOracle` contract. On change, reconstructing the output root from a trusted L2 source and looking for a match. -- Multisig Monitor: The multisig monitor reports the paused status of the OptimismPortal contract. If set, the latest nonce of the configued Safe address. And also if set, the latest presigned nonce stored in One Password. The latest presigned nonce is identifyed by looking for items in the configued vault that follow a `ready-.json` name. The highest nonce of this item name format is reported. -- Drippie Monitor: tracks the execution and executability of drips within a Drippie contract. -- Secrets Monitor: takes a Drippie contract as a parameter and monitors for any drips within that contract that use the `CheckSecrets` dripcheck contract. `CheckSecrets` is a dripcheck that allows a drip to begin once a specific secret has been revealed (after a delay period) and cancels the drip if a second secret is revealed. It's important to monitor for these secrets being revealed as this could be a sign that the secret storage platform has been compromised and someone is attempting to exflitrate the ETH controlled by that drip. -- Faultproof Withdrawal: The Faultproof Withdrawal component monitors `ProvenWithdrawals` events on the `OptimismPortal` contract and performs checks to detect any violations of invariant conditions on the chain. If a violation is detected, it logs the issue and sets a Prometheus metric for the event. This component is designed to work exclusively with chains that are already utilizing the Fault Proofs system. This is a new version of the deprecated chain-mon faultproof-wd-mon. For detailed information on how the component works and the algorithms used, please refer to the component README. +Security integrity monitors: These are monitors necessary for making sure Bridges between L2 and L1 are safe and work as expected. These monitors are divided in two subgroups: + - Pre-Faultproof Chain Monitors: + - Fault Monitor: checks for changes in output roots posted to the `L2OutputOracle` contract. On change, reconstructing the output root from a trusted L2 source and looking for a match. + - Withdrawals Monitor: checks for new withdrawals that have been proven to the OptimismPortal contract. Each withdrawal is checked against the `L2ToL1MessagePasser` contract. + - Faultproof chain monitors: + - Faultproof Withdrawal: The Faultproof Withdrawal component monitors `ProvenWithdrawals` events on the `OptimismPortal` contract and performs checks to detect any violations of invariant conditions on the chain. If a violation is detected, it logs the issue and sets a Prometheus metric for the event. This component is designed to work exclusively with chains that are already utilizing the Fault Proofs system. This is a new version of the deprecated chain-mon faultproof-wd-mon. For detailed information on how the component works and the algorithms used, please refer to the component README. + +Security monitors: Those tools monitor other aspects of several contracts used in optimism: + - Global Events Monitor: made for to taking YAML rules as configuration and monitoring the events that are emitted on the chain. + - Liveness Expiration Monitor: monitors the liveness expiration on Safes. + - Balances Monitor: emits a metric reporting the balances for the configured accounts. + - Multisig Monitor: The multisig monitor reports the paused status of the OptimismPortal contract. If set, the latest nonce of the configued Safe address. And also if set, the latest presigned nonce stored in One Password. The latest presigned nonce is identifyed by looking for items in the configued vault that follow a `ready-.json` name. The highest nonce of this item name format is reported. + - Drippie Monitor: tracks the execution and executability of drips within a Drippie contract. + - Secrets Monitor: takes a Drippie contract as a parameter and monitors for any drips within that contract that use the `CheckSecrets` dripcheck contract. `CheckSecrets` is a dripcheck that allows a drip to begin once a specific secret has been revealed (after a delay period) and cancels the drip if a second secret is revealed. It's important to monitor for these secrets being revealed as this could be a sign that the secret storage platform has been compromised and someone is attempting to exflitrate the ETH controlled by that drip. For more information on these monitors and how to use them, [check out the repo](https://github.com/ethereum-optimism/monitorism?tab=readme-ov-file#monitorism). From 70cc71d2d7571fc6d76ccdd3bfcdfd320c4a48db Mon Sep 17 00:00:00 2001 From: Bradley Camacho <42678939+bradleycamacho@users.noreply.github.com> Date: Fri, 4 Oct 2024 09:32:04 -0700 Subject: [PATCH 103/565] Fix linting --- .../tools/chain-monitoring.mdx | 32 +++++++++++-------- words.txt | 7 ++++ 2 files changed, 25 insertions(+), 14 deletions(-) diff --git a/pages/builders/chain-operators/tools/chain-monitoring.mdx b/pages/builders/chain-operators/tools/chain-monitoring.mdx index 964b06873..5bb033098 100644 --- a/pages/builders/chain-operators/tools/chain-monitoring.mdx +++ b/pages/builders/chain-operators/tools/chain-monitoring.mdx @@ -22,19 +22,21 @@ Monitorism is a tooling suite that supports monitoring and active remediation ac Currently. the list of monitors includes: Security integrity monitors: These are monitors necessary for making sure Bridges between L2 and L1 are safe and work as expected. These monitors are divided in two subgroups: - - Pre-Faultproof Chain Monitors: - - Fault Monitor: checks for changes in output roots posted to the `L2OutputOracle` contract. On change, reconstructing the output root from a trusted L2 source and looking for a match. - - Withdrawals Monitor: checks for new withdrawals that have been proven to the OptimismPortal contract. Each withdrawal is checked against the `L2ToL1MessagePasser` contract. - - Faultproof chain monitors: - - Faultproof Withdrawal: The Faultproof Withdrawal component monitors `ProvenWithdrawals` events on the `OptimismPortal` contract and performs checks to detect any violations of invariant conditions on the chain. If a violation is detected, it logs the issue and sets a Prometheus metric for the event. This component is designed to work exclusively with chains that are already utilizing the Fault Proofs system. This is a new version of the deprecated chain-mon faultproof-wd-mon. For detailed information on how the component works and the algorithms used, please refer to the component README. + +* Pre-Faultproof Chain Monitors: + * Fault Monitor: checks for changes in output roots posted to the `L2OutputOracle` contract. On change, reconstructing the output root from a trusted L2 source and looking for a match. + * Withdrawals Monitor: checks for new withdrawals that have been proven to the OptimismPortal contract. Each withdrawal is checked against the `L2ToL1MessagePasser` contract. +* Faultproof chain monitors: + * Faultproof Withdrawal: The Faultproof Withdrawal component monitors `ProvenWithdrawals` events on the `OptimismPortal` contract and performs checks to detect any violations of invariant conditions on the chain. If a violation is detected, it logs the issue and sets a Prometheus metric for the event. This component is designed to work exclusively with chains that are already utilizing the Fault Proofs system. This is a new version of the deprecated chain-mon faultproof-wd-mon. For detailed information on how the component works and the algorithms used, please refer to the component README. Security monitors: Those tools monitor other aspects of several contracts used in optimism: - - Global Events Monitor: made for to taking YAML rules as configuration and monitoring the events that are emitted on the chain. - - Liveness Expiration Monitor: monitors the liveness expiration on Safes. - - Balances Monitor: emits a metric reporting the balances for the configured accounts. - - Multisig Monitor: The multisig monitor reports the paused status of the OptimismPortal contract. If set, the latest nonce of the configued Safe address. And also if set, the latest presigned nonce stored in One Password. The latest presigned nonce is identifyed by looking for items in the configued vault that follow a `ready-.json` name. The highest nonce of this item name format is reported. - - Drippie Monitor: tracks the execution and executability of drips within a Drippie contract. - - Secrets Monitor: takes a Drippie contract as a parameter and monitors for any drips within that contract that use the `CheckSecrets` dripcheck contract. `CheckSecrets` is a dripcheck that allows a drip to begin once a specific secret has been revealed (after a delay period) and cancels the drip if a second secret is revealed. It's important to monitor for these secrets being revealed as this could be a sign that the secret storage platform has been compromised and someone is attempting to exflitrate the ETH controlled by that drip. + +* Global Events Monitor: made for to taking YAML rules as configuration and monitoring the events that are emitted on the chain. +* Liveness Expiration Monitor: monitors the liveness expiration on Safes. +* Balances Monitor: emits a metric reporting the balances for the configured accounts. +* Multisig Monitor: The multisig monitor reports the paused status of the OptimismPortal contract. If set, the latest nonce of the configured Safe address. And also if set, the latest presigned nonce stored in One Password. The latest presigned nonce is identified by looking for items in the configured vault that follow a `ready-.json` name. The highest nonce of this item name format is reported. +* Drippie Monitor: tracks the execution and executability of drips within a Drippie contract. +* Secrets Monitor: takes a Drippie contract as a parameter and monitors for any drips within that contract that use the `CheckSecrets` dripcheck contract. `CheckSecrets` is a dripcheck that allows a drip to begin once a specific secret has been revealed (after a delay period) and cancels the drip if a second secret is revealed. It's important to monitor for these secrets being revealed as this could be a sign that the secret storage platform has been compromised and someone is attempting to exfiltrate the ETH controlled by that drip. For more information on these monitors and how to use them, [check out the repo](https://github.com/ethereum-optimism/monitorism?tab=readme-ov-file#monitorism). @@ -58,12 +60,14 @@ OP_DISPUTE_MON_GAME_FACTORY_ADDRESS=.. OP_DISPUTE_MON_HONEST_ACTORS=.. ``` + `OP_DISPUTE_MON_HONEST_ACTORS` is a CSV (no spacing) list of addresses that are used for the honest op-challenger instance(s). Additional flags: -- `OP_DISPUTE_MON_GAME_WINDOW`: This is the window of time to report on games. It should leave a buffer beyond the max game duration for bond claiming. If Fault Proof game parameters are not changes (e.g. MAX_CLOCK_DURATION), it is recommended to leave this as the default. -- `OP_DISPUTE_MON_MONITOR_INTERVAL`: The interval at which to check for new games. Defaults to 30 seconds currently. -- `OP_DISPUTE_MON_MAX_CONCURRENCY`: The max thread count. Defaults to 5 currently. + +* `OP_DISPUTE_MON_GAME_WINDOW`: This is the window of time to report on games. It should leave a buffer beyond the max game duration for bond claiming. If Fault Proof game parameters are not changes (e.g. MAX\_CLOCK\_DURATION), it is recommended to leave this as the default. +* `OP_DISPUTE_MON_MONITOR_INTERVAL`: The interval at which to check for new games. Defaults to 30 seconds currently. +* `OP_DISPUTE_MON_MAX_CONCURRENCY`: The max thread count. Defaults to 5 currently. You can find more info on `op-dispute-mon` on [the repo](https://github.com/ethereum-optimism/optimism/tree/develop/op-dispute-mon). diff --git a/words.txt b/words.txt index 9afd48b9f..64e6c8a22 100644 --- a/words.txt +++ b/words.txt @@ -76,6 +76,8 @@ disabletxpoolgossip Discv discv DIVU +dripcheck +Drippie Eigen ENABLEDEPRECATEDPERSONAL enabledeprecatedpersonal @@ -88,6 +90,8 @@ ETHSTATS ethstats EVMTIMEOUT evmtimeout +executability +exfiltrate EXITWHENSYNCED exitwhensynced EXTRADATA @@ -95,6 +99,8 @@ extradata Farcaster farcaster Fastnode +Faultproof +faultproof FDLIMIT fdlimit featureset @@ -177,6 +183,7 @@ minsuggestedpriorityfee Mintable Mintplex MIPSEVM +Monitorism Moralis Mordor MOVN From 4d3f3f3d0c97cdba33cb97c804f96ccf61b1b644 Mon Sep 17 00:00:00 2001 From: Bradley Camacho <42678939+bradleycamacho@users.noreply.github.com> Date: Fri, 4 Oct 2024 09:35:59 -0700 Subject: [PATCH 104/565] Add missing words to words.txt --- words.txt | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/words.txt b/words.txt index 53e4d2a99..b1caf7a2d 100644 --- a/words.txt +++ b/words.txt @@ -82,6 +82,8 @@ Discv discv DIVU Drand +dripcheck +Drippie Eigen ENABLEDEPRECATEDPERSONAL enabledeprecatedpersonal @@ -95,12 +97,16 @@ ETHSTATS ethstats EVMTIMEOUT evmtimeout +executability +exfiltrate EXITWHENSYNCED exitwhensynced EXTRADATA extradata Farcaster farcaster +Faultproof +faultproof FDLIMIT fdlimit featureset @@ -187,6 +193,7 @@ minsuggestedpriorityfee Mintable Mintplex MIPSEVM +Monitorism Moralis Mordor mountpoint @@ -342,7 +349,6 @@ syncmode SYNCTARGET synctarget syscalls -Terraform therealbytes Thirdweb threadcreate From 924eceb0221c2c34a581f65e646520cf1bb73b18 Mon Sep 17 00:00:00 2001 From: krofax Date: Fri, 4 Oct 2024 17:58:03 +0100 Subject: [PATCH 105/565] Used sentence case for headers --- pages/builders/notices/sdk-deprecation.mdx | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/pages/builders/notices/sdk-deprecation.mdx b/pages/builders/notices/sdk-deprecation.mdx index 7d8b9b8a2..302f4afba 100644 --- a/pages/builders/notices/sdk-deprecation.mdx +++ b/pages/builders/notices/sdk-deprecation.mdx @@ -8,7 +8,7 @@ description: This page outlines the details of the Optimism SDK deprecation and The Optimism SDK will officially be deprecated in Q1 2025. The project is shifting to the `viem` library for a more modern, efficient, and flexible development experience. This change affects all tutorials and resources that previously relied on the Optimism SDK, and relevant documentation has been updated accordingly. -### Breaking Changes to Expect +### Breaking changes to expect The migration from the Optimism SDK to `viem` library brings several breaking changes: @@ -19,7 +19,7 @@ The migration from the Optimism SDK to `viem` library brings several breaking ch Developers and users are strongly encouraged to transition to `viem` before the deprecation date to avoid disruptions. -### Updated Tutorials +### Updated tutorials We are updating our tutorials to use the `viem` library. @@ -52,7 +52,7 @@ We are updating our tutorials to use the `viem` library. * [Communicating Between OP Mainnet and Ethereum in Solidity](../tutorials/cross-chain-solidity)\ Cross-chain communication now leverages `opstack` for all messaging. */} -### For App Developers +### For app developers If your application currently depends on the Optimism SDK, you will need to migrate to using the `viem` library. The tutorials have been updated to reflect these changes, and it is critical to update your applications before the deprecation date to maintain compatibility. @@ -70,7 +70,7 @@ Install new dependencies: Replace the Optimism SDK with `viem` in your project. * Migrate SDK methods: Refactor your code to use equivalent `viem` methods. Refer to the viem documentation and opstack documentation for guidance. * Test thoroughly: After migration, extensively test your application to ensure all functionality works as expected. -### For Chain Operators +### For chain operators Chain operators utilizing the SDK for cross-chain operations, bridging, or other functions should switch to the `viem` library. The `viem` library offers more efficient methods to handle these operations. @@ -81,7 +81,7 @@ Chain operators should be aware of the following: * Update tooling: Ensure all tools and scripts are updated to use `viem`. * Monitor performance: After migration, closely monitor your chain's performance to ensure smooth operation. -### For Node Operators +### For node operators Node operators will need to ensure that any scripts or services relying on the Optimism SDK are updated to use `viem` library. These updates will help align with future improvements and scalability efforts across the OP Stack. From 76120e09228ee22159d470785d2d5f86690d7090 Mon Sep 17 00:00:00 2001 From: Hamdi Allam Date: Fri, 4 Oct 2024 20:35:25 -0400 Subject: [PATCH 106/565] SendRawTransactionConditional protocol features page --- pages/stack/protocol/features/_meta.json | 5 +- .../send-raw-transaction-conditional.mdx | 60 +++++++++++++++++++ 2 files changed, 63 insertions(+), 2 deletions(-) create mode 100644 pages/stack/protocol/features/send-raw-transaction-conditional.mdx diff --git a/pages/stack/protocol/features/_meta.json b/pages/stack/protocol/features/_meta.json index bcc657416..b9221d748 100644 --- a/pages/stack/protocol/features/_meta.json +++ b/pages/stack/protocol/features/_meta.json @@ -1,4 +1,5 @@ { "custom-gas-token": "Custom Gas Token", - "alt-da-mode": "Alt-DA Mode" -} \ No newline at end of file + "alt-da-mode": "Alt-DA Mode", + "send-raw-transaction-conditional": "SendRawTransactionConditional" +} diff --git a/pages/stack/protocol/features/send-raw-transaction-conditional.mdx b/pages/stack/protocol/features/send-raw-transaction-conditional.mdx new file mode 100644 index 000000000..6ca2374d2 --- /dev/null +++ b/pages/stack/protocol/features/send-raw-transaction-conditional.mdx @@ -0,0 +1,60 @@ +--- +title: SendRawTransactionConditional Explainer +lang: en-US +description: Learn the basic process, benefits, and considerations for running a custom gas token chain. +--- + +# SendRawTransactionConditional Explainer + +import { Callout } from 'nextra/components' + +A sequencer rpc, `eth_sendRawTransactionConditional`, allowing callers to conditionally include a transaction based on a set of provided options. + +This feature is meant to unblock use cases that require atomic inclusion, otherwise possible on Ethereum through specialized block builders like Flashbots. Some examples: + +* 4337 Bundlers utilizing a shared mempool of UserOperations. Reverted transactions due to conflicting UserOperations would make it too costly for bundlers to operate on L2, forcing the use of private mempools. + +## Specification + +This endpoint is an extension of `eth_sendRawTransaction`, with an extra parameter of "options" with the following structure: +``` +{ + "knownAccounts": [optional] A map of accounts with expected storage. The key is account address + If the value is hex string, it is the known storage root hash of that account. + If the value is an object, then each member is in the format of "slot": "value", which are explicit slot values within that account storage. + "blockNumberMin": [optional] minimal block number for inclusion + "blockNumberMax": [optional] maximum block number for inclusion + "timestampMin": [optional] minimum block timestamp for inclusion + "timestampMax": [optional] maximum block timestamp for inclusion +} +``` +The "cost" of a given conditional is _approximately_ determined by the number of storage lookups that would be incurred by validating this conditional. There's a predefined max of `1000` that is allowed to prevent DoS. + + + Since the sequencer is not compensated for the additional state checks, otherwise through the GAS of the transaction, a configured rate limit is applied to this cost. + + To also disincentive the use of this endpoint for MEV in comparison to `eth_sendRawTransaction`, the conditional is checked against the parent of the latest block. + + +This conditional is checked once at the RPC layer prior to mempool submission. If rejected against chain state, the RPC will return an error with the following spec +* error code `-32003` (transaction rejected) with a reason string as to the specific failed check +* error code `-32005` (conditional cost) with a reason string if the conditional cost exceeded the maximum OR the cost was rate limited due to network conditions. + +Successful submission does **NOT** guarantee inclusion! The caller must observe the chain for a receipt with some timeout to determine non-inclusion. The conditional is also re-checked in the block building phase to handle intra-block conflicts. + + + Conditional transactions are tied to the block builder they are submitted to. This means that these transactions **are not gossiped between configured peers!!!** + + If you are running an active/passive setup with replicas that gossip txs to an active sequencer, this endpoint should be fronted by a proxy that can broadcast the request to all replicas. + + +## How To Enable + +This feature can be enabled with the addition of a flag to op-geth. + +* `--rollup.sequencertxconditionalenabled` (default: false) a boolean flag which enables the rpc. +* `--rollup.sequencertxconditionalcostratelimit` (default: 5000) an integer flag that sets the rate limit for cost observable per second. + + + It is not advised to publicly expose this sequencer endpoint due to DoS concerns. This supplemental proxy [INSERT DOCS LINK] should be used to apply additional constraints on this endpoint prior to passing through to the sequencer. + From 689a0af9e81d70cf99966329837e8405c6f47549 Mon Sep 17 00:00:00 2001 From: Hamdi Allam Date: Fri, 4 Oct 2024 21:47:28 -0400 Subject: [PATCH 107/565] operator txproxy documentation --- pages/stack/operators/features/_meta.json | 5 +- pages/stack/operators/features/op-txproxy.mdx | 96 +++++++++++++++++++ .../send-raw-transaction-conditional.mdx | 6 +- 3 files changed, 102 insertions(+), 5 deletions(-) create mode 100644 pages/stack/operators/features/op-txproxy.mdx diff --git a/pages/stack/operators/features/_meta.json b/pages/stack/operators/features/_meta.json index 91f5e9e5c..754729f73 100644 --- a/pages/stack/operators/features/_meta.json +++ b/pages/stack/operators/features/_meta.json @@ -1,3 +1,4 @@ { - "proxyd": "proxyd" -} \ No newline at end of file + "proxyd": "proxyd", + "op-txproxy": "op-txproxy" +} diff --git a/pages/stack/operators/features/op-txproxy.mdx b/pages/stack/operators/features/op-txproxy.mdx new file mode 100644 index 000000000..e288d3746 --- /dev/null +++ b/pages/stack/operators/features/op-txproxy.mdx @@ -0,0 +1,96 @@ +--- +title: op-txproxy +lang: en-US +description: A passthrough proxy service that can apply additional constraints on transactions prior to reaching the sequencer. +--- + +import { Callout, Steps } from 'nextra/components' + +# op-txproxy + +A [passthrough proxy](https://github.com/ethereum-optimism/infra/tree/main/op-txproxy) for the execution engine endpoint. This proxy does not forward all rpc traffic and only exposes a specific set of methods. Operationally, the ingress router should only re-route request for these methods. + + + [proxyd](./proxyd) as an ingress router supports the mapping of specific methods to unique backends. + + +## Methods + +### eth_sendRawTransactionConditional + +To safely expose this endpoint publicly, additional stateless constraints are applied to horizontally scale validation rules and preemptively reject conditional transactions prior to reaching the sequencer. + +A variety of metrics are emitted for to inform adjustments to be made. + +#### Authentication + +The caller authenticates themselves with any valid ECDSA-secp256k1 key, like an Ethereum key. The computed signature is over the [EIP-191](https://eips.ethereum.org/EIPS/eip-191) hash of the request body. This calling address does **not need to hold an ethereum balance**. It simply is used for identification. + +With the signature and signing address, the request is authenticated under the `X-Optimism-Signature` header with the value `: `. + +* Requests with missing a missing authentication header fail with the `-32003` (transaction rejected) json rpc error code. +* Requests with a mismatch in recovered signer and supplied public key will have the http request failed with status code `400 - Bad Request`. + +As of today, no authorization policies are implemented on this endpoint. This has preemptively in place allow for new policies (allowlist, localized rate limits, etc) + +#### Runtime Shutoff + +This service can be rolled with a flag/env switch to reject conditional transaction without needing to interrupt the execution engine. Useful in diagnosing issues. + + `--sendRawTxConditional.enabled (default: true) ($OP_TXPROXY_SENDRAWTXCONDITIONAL_ENABLED)` + +When disabled, requests will fail with the `-32003` (transaction rejected) json rpc error code with a message stating that the method is disabled. + +#### Rate Limits + +Even though the op-geth implementation of this endpoint includes rate limits, it is instead applied here to terminate these requests early. + + `--sendRawTxConditional.ratelimit (default: 5000) ($OP_TXPROXY_SENDRAWTXCONDITIONAL_RATELIMIT)` + +#### Stateless Validation +* Conditional cost is below the max +* Conditional values are valid (i.e min < max) +* Transaction target are only 4337 Entrypoint contracts + + + The motivating factor for this endpoint is to enable permissionless 4337 mempools, hence the restricted usage of this methods to just [Entrypoint](https://github.com/eth-infinitism/account-abstraction/blob/develop/contracts/core/EntryPoint.sol) transactions. + + Please open up an issue if you'd like this restriction to be optional via configuration to broaden usage of this endpoint. + + +When the request passes validation, it is passed through to the configured backend URL + + `--sendRawTxConditional.backend ($OP_TXPROXY_SENDRAWTXCONDITIONAL_BACKENDS)` + + + Per the [specification](/stack/protocol/features/send-raw-transaction-conditional), conditional transactions are not gossip'd between peers. Thus if you use replicas in an active/passive sequencer setup, this request must be broadcasted to all replicas. + + [proxyd](./proxyd) as an egress router for this method supports this broadcasting functionality. + + +## How it works + +To start using `op-txproxy`, follow these steps: + + + ### Build the Binary or Pull the Image + 1. Run the following command to build the binary + ```bash + make build + ``` + 2. This will build and output the binary under `/bin/op-txproxy`. + + The image for this binary is also available as a docker artifact (DOCS ON THE THE LINK FOR THIS). + + ### Configure + The binary accepts configuration through cli flags which also settable via ENV variables. Either set the flags explicitly when starting the binary or set the environment variables of the host starting the proxy + + See [methods](#methods) on the configuration options available for each method. + + ### Start + start the service with the following command + ```bash + op-txproxy // ... with flags if env variables are not set + ``` + + diff --git a/pages/stack/protocol/features/send-raw-transaction-conditional.mdx b/pages/stack/protocol/features/send-raw-transaction-conditional.mdx index 6ca2374d2..f454980f8 100644 --- a/pages/stack/protocol/features/send-raw-transaction-conditional.mdx +++ b/pages/stack/protocol/features/send-raw-transaction-conditional.mdx @@ -4,10 +4,10 @@ lang: en-US description: Learn the basic process, benefits, and considerations for running a custom gas token chain. --- -# SendRawTransactionConditional Explainer - import { Callout } from 'nextra/components' +# SendRawTransactionConditional Explainer + A sequencer rpc, `eth_sendRawTransactionConditional`, allowing callers to conditionally include a transaction based on a set of provided options. This feature is meant to unblock use cases that require atomic inclusion, otherwise possible on Ethereum through specialized block builders like Flashbots. Some examples: @@ -56,5 +56,5 @@ This feature can be enabled with the addition of a flag to op-geth. * `--rollup.sequencertxconditionalcostratelimit` (default: 5000) an integer flag that sets the rate limit for cost observable per second. - It is not advised to publicly expose this sequencer endpoint due to DoS concerns. This supplemental proxy [INSERT DOCS LINK] should be used to apply additional constraints on this endpoint prior to passing through to the sequencer. + It is not advised to publicly expose this sequencer endpoint due to DoS concerns. This supplemental proxy, [op-txproxy](/stack/operators/features/op-txproxy), should be used to apply additional constraints on this endpoint prior to passing through to the sequencer. From 3d4a0dbdb77909196850af31d75bca5b7d285e0d Mon Sep 17 00:00:00 2001 From: Hamdi Allam Date: Fri, 4 Oct 2024 21:54:57 -0400 Subject: [PATCH 108/565] section for bundlers in account abstraction --- pages/builders/tools/build/account-abstraction.mdx | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/pages/builders/tools/build/account-abstraction.mdx b/pages/builders/tools/build/account-abstraction.mdx index 8d9bf410c..a7a3b730d 100644 --- a/pages/builders/tools/build/account-abstraction.mdx +++ b/pages/builders/tools/build/account-abstraction.mdx @@ -19,6 +19,12 @@ import { Callout } from 'nextra/components' * Sponsor the gas fees for transactions * Enable users to pay gas in the token(s) of their choice +## Bundlers + +The OP Stack includes support for the `eth_sendRawTransactionConditional` RPC method to assist bundlers on shared 4337 mempools. See the [specification](/stack/protocol/features/send-raw-transaction-conditional) for how this method is implemented in op-geth. + +If enabled by the chain operator, also see the supplemental [op-txproxy](/stack/operators/features/op-txproxy) service, if applied, as this enforces request authentication for this method. + ## Superchain Paymaster The Superchain paymaster is an ERC-4337 verifying paymaster that sponsors transactions for smart accounts on the Superchain. Use the Superchain Paymaster to get your transactions sponsored to remove friction from your app experience. [View the implementation guide and tutorials here.](https://github.com/ethereum-optimism/ecosystem/tree/main/docs/superchain-paymaster) From 38d49bf7b8bc2d1f3f6a2b00be9862430ded0912 Mon Sep 17 00:00:00 2001 From: hash1go Date: Sun, 6 Oct 2024 15:15:50 +0900 Subject: [PATCH 109/565] Update SSD requirements and add config links --- pages/builders/node-operators/tutorials/mainnet.mdx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pages/builders/node-operators/tutorials/mainnet.mdx b/pages/builders/node-operators/tutorials/mainnet.mdx index 4a2bf206c..de2adee3b 100644 --- a/pages/builders/node-operators/tutorials/mainnet.mdx +++ b/pages/builders/node-operators/tutorials/mainnet.mdx @@ -28,15 +28,15 @@ Below are suggested minimum hardware requirements for each type of node. ### SSD Capacity Requirements Given the growing size of the blockchain state, choosing the right SSD size is important. -Below are the storage needs as of April 2024: +Below are the storage needs as of October 2024: -* **Full Node:** The snapshot size for a full node is approximately 1.6TB, with the data directory's capacity increasing by about 1TB every six months. -* **Archive Node:** The snapshot size for an archive node is approximately 5TB, with the data directory's capacity increasing by about 3TB every six months. +* **Full Node:** The current size for a full node is approximately 420GB, with the data directory's capacity increasing by about 80GB every six months. Note that these figures are based on using the [Pebble database engine](../configuration/execution-config#dbengine) and the [path state scheme](../configuration/execution-config#statescheme). +* **Archive Node:** The current size for an archive node is approximately 7TB, with the data directory's capacity increasing by about 3TB every six months. Based on these trends, node operators should plan for future storage needs and choose SSDs that can handle these increasing requirements. - Geth supports a "freezer" feature to store older chain data on HDDs, saving SSD space. Configure this for OP Mainnet using the `--datadir.ancient` flag. See [Geth docs](https://geth.ethereum.org/docs/fundamentals/databases) and [OP docs](https://docs.optimism.io/builders/node-operators/configuration/execution-config#datadirancient) for details. + Geth supports a "freezer" feature to store older chain data on HDDs, saving SSD space. Configure this for OP Mainnet using the `--datadir.ancient` flag. See [Geth docs](https://geth.ethereum.org/docs/fundamentals/databases) and [OP docs](../configuration/execution-config#datadirancient) for details. ## Full Nodes From 8de00f40b4632d79ef54b69905413ef5797b3def Mon Sep 17 00:00:00 2001 From: hash1go Date: Sun, 6 Oct 2024 15:50:26 +0900 Subject: [PATCH 110/565] update history.transactions description for OP Stack --- .../builders/node-operators/configuration/execution-config.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/builders/node-operators/configuration/execution-config.mdx b/pages/builders/node-operators/configuration/execution-config.mdx index c4da902d9..59efab1db 100644 --- a/pages/builders/node-operators/configuration/execution-config.mdx +++ b/pages/builders/node-operators/configuration/execution-config.mdx @@ -1603,7 +1603,7 @@ blocks, with `0` representing the entire chain. #### history.transactions Number of recent blocks to maintain transactions index for. -The default is about one year (`2350000` blocks), with `0` representing the entire chain. +The default is about two months (`2350000` blocks), with `0` representing the entire chain. `--history.transactions=` From a149e8be14b0f5d7e17acc33fc2c056cfcf4329d Mon Sep 17 00:00:00 2001 From: hash1go Date: Mon, 7 Oct 2024 18:54:08 +0900 Subject: [PATCH 111/565] Revert SSD requirements --- pages/builders/node-operators/tutorials/mainnet.mdx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pages/builders/node-operators/tutorials/mainnet.mdx b/pages/builders/node-operators/tutorials/mainnet.mdx index de2adee3b..079171dab 100644 --- a/pages/builders/node-operators/tutorials/mainnet.mdx +++ b/pages/builders/node-operators/tutorials/mainnet.mdx @@ -28,10 +28,10 @@ Below are suggested minimum hardware requirements for each type of node. ### SSD Capacity Requirements Given the growing size of the blockchain state, choosing the right SSD size is important. -Below are the storage needs as of October 2024: +Below are the storage needs as of April 2024: -* **Full Node:** The current size for a full node is approximately 420GB, with the data directory's capacity increasing by about 80GB every six months. Note that these figures are based on using the [Pebble database engine](../configuration/execution-config#dbengine) and the [path state scheme](../configuration/execution-config#statescheme). -* **Archive Node:** The current size for an archive node is approximately 7TB, with the data directory's capacity increasing by about 3TB every six months. +* **Full Node:** The snapshot size for a full node is approximately 1.6TB, with the data directory's capacity increasing by about 1TB every six months. +* **Archive Node:** The snapshot size for an archive node is approximately 5TB, with the data directory's capacity increasing by about 3TB every six months. Based on these trends, node operators should plan for future storage needs and choose SSDs that can handle these increasing requirements. From ab9a144ec30ea3e652a869efc5bb09e5f309b09c Mon Sep 17 00:00:00 2001 From: Paul Dowman Date: Mon, 7 Oct 2024 08:17:33 -0600 Subject: [PATCH 112/565] fix: Add missing safedb.path op-node config option --- .../node-operators/configuration/consensus-config.mdx | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/pages/builders/node-operators/configuration/consensus-config.mdx b/pages/builders/node-operators/configuration/consensus-config.mdx index 38e720412..79a2cd79c 100644 --- a/pages/builders/node-operators/configuration/consensus-config.mdx +++ b/pages/builders/node-operators/configuration/consensus-config.mdx @@ -723,6 +723,16 @@ RPC listening port. Default is `9545`. `OP_NODE_RPC_PORT=9545` +### safedb.path + +File path used to persist safe head update data. Disabled if not set. + + + `--safedb.path=` + `--safedb.path=/db` + `SAFEDB_PATH=/db` + + ### sequencer.enabled Enable sequencing of new L2 blocks. A separate batch submitter has to be deployed to publish the data for verifiers. Default is `false`. From b815eaa207cb78eda038cb1047cb0f597778cbab Mon Sep 17 00:00:00 2001 From: krofax Date: Mon, 7 Oct 2024 16:26:24 +0100 Subject: [PATCH 113/565] added word --- words.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/words.txt b/words.txt index ea31b13c4..48ad2c54e 100644 --- a/words.txt +++ b/words.txt @@ -304,6 +304,7 @@ RPGF Rpgf rpgf RWAs +safedb Schnorr secp SELFDESTRUCT @@ -343,7 +344,6 @@ syncmode SYNCTARGET synctarget syscalls -Terraform therealbytes Thirdweb threadcreate From 3980c774c6a61820d4f174581dfb210307dada2c Mon Sep 17 00:00:00 2001 From: krofax Date: Mon, 7 Oct 2024 17:01:33 +0100 Subject: [PATCH 114/565] updated codebase --- utils/calculator-helpers.ts | 43 ++++++++++++++++++++++++++++--------- 1 file changed, 33 insertions(+), 10 deletions(-) diff --git a/utils/calculator-helpers.ts b/utils/calculator-helpers.ts index be683809b..da86e6702 100644 --- a/utils/calculator-helpers.ts +++ b/utils/calculator-helpers.ts @@ -103,9 +103,21 @@ export function convertToMillionUnits(value: number): number { } export async function getEthToUsdRate(): Promise { - const response = await fetch(ethToUsdRate); - const rate = await response.text(); - return parseFloat(rate); + try { + const response = await fetch(ethToUsdRate); + if (!response.ok) { + throw new Error(`Network response was not ok: ${response.status} ${response.statusText}`); + } + const rateText = await response.text(); + const rate = parseFloat(rateText); + if (isNaN(rate)) { + throw new Error(`Failed to parse ETH to USD rate: ${rateText}`); + } + return rate; + } catch (error) { + console.error('Error fetching ETH to USD rate:', error); + throw error; + } } export const determineDAInUse = (dataAvailabilityType: string): string => { @@ -508,13 +520,24 @@ const _calculateL1BlobBaseFeeScalar = ( }; async function getL1GasBaseFee(): Promise { - const response = await fetch(L1GasBaseFee); - const baseFee = await response.text(); - console.log("L1GasBaseFee_response::",baseFee); - const output = parseFloat(baseFee); - console.log("e76:::", output); - return output; -} // e76 done + try { + const response = await fetch(L1GasBaseFee); + if (!response.ok) { + throw new Error(`Network response was not ok: ${response.status} ${response.statusText}`); + } + const baseFeeText = await response.text(); + console.log("L1GasBaseFee_response::", baseFeeText); + const output = parseFloat(baseFeeText); + if (isNaN(output)) { + throw new Error(`Failed to parse L1 Gas Base Fee: ${baseFeeText}`); + } + console.log("e76:::", output); + return output; + } catch (error) { + console.error('Error fetching L1 Gas Base Fee:', error); + throw error; + } +} const getBlobBaseFee = async (): Promise => { const response = await fetch(blobBaseFee); From a5e801f53f4cc1fa75ecf407dcd52fff3aa66276 Mon Sep 17 00:00:00 2001 From: Bradley Camacho <42678939+bradleycamacho@users.noreply.github.com> Date: Mon, 7 Oct 2024 09:08:00 -0700 Subject: [PATCH 115/565] Update pages/builders/chain-operators/tools/chain-monitoring.mdx Co-authored-by: Blessing Krofegha --- pages/builders/chain-operators/tools/chain-monitoring.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/builders/chain-operators/tools/chain-monitoring.mdx b/pages/builders/chain-operators/tools/chain-monitoring.mdx index 5bb033098..c1b1fbbfc 100644 --- a/pages/builders/chain-operators/tools/chain-monitoring.mdx +++ b/pages/builders/chain-operators/tools/chain-monitoring.mdx @@ -125,4 +125,4 @@ To enable metrics, pass the `--metrics.enabled` flag to `op-challenger` and foll ## Next Steps -* If you experience difficulty at any stage of this process, please reach out to [developer support](https://github.com/ethereum-optimism/developers/discussions). +* If you encounter difficulties at any stage of this process, please reach out to [developer support](https://github.com/ethereum-optimism/developers/discussions). From 56292eef2c7d4affa31ea1f7db1a694e241cff03 Mon Sep 17 00:00:00 2001 From: Bradley Camacho <42678939+bradleycamacho@users.noreply.github.com> Date: Mon, 7 Oct 2024 09:08:14 -0700 Subject: [PATCH 116/565] Update pages/builders/chain-operators/tools/chain-monitoring.mdx Co-authored-by: Blessing Krofegha --- pages/builders/chain-operators/tools/chain-monitoring.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/builders/chain-operators/tools/chain-monitoring.mdx b/pages/builders/chain-operators/tools/chain-monitoring.mdx index c1b1fbbfc..293bacd29 100644 --- a/pages/builders/chain-operators/tools/chain-monitoring.mdx +++ b/pages/builders/chain-operators/tools/chain-monitoring.mdx @@ -61,7 +61,7 @@ OP_DISPUTE_MON_GAME_FACTORY_ADDRESS=.. OP_DISPUTE_MON_HONEST_ACTORS=.. ``` -`OP_DISPUTE_MON_HONEST_ACTORS` is a CSV (no spacing) list of addresses that are used for the honest op-challenger instance(s). +`OP_DISPUTE_MON_HONEST_ACTORS` is a CSV (no spaces) list of addresses that are used for the honest `op-challenger` instances. Additional flags: From b4ca9c26a155848c2a332349479504925faea911 Mon Sep 17 00:00:00 2001 From: Bradley Camacho <42678939+bradleycamacho@users.noreply.github.com> Date: Mon, 7 Oct 2024 09:08:28 -0700 Subject: [PATCH 117/565] Update pages/builders/chain-operators/tools/chain-monitoring.mdx Co-authored-by: Blessing Krofegha --- pages/builders/chain-operators/tools/chain-monitoring.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/builders/chain-operators/tools/chain-monitoring.mdx b/pages/builders/chain-operators/tools/chain-monitoring.mdx index 293bacd29..ffef9c53c 100644 --- a/pages/builders/chain-operators/tools/chain-monitoring.mdx +++ b/pages/builders/chain-operators/tools/chain-monitoring.mdx @@ -1,7 +1,7 @@ --- title: Chain Monitoring Options lang: en-US -description: Learn the basics of onchain and offchain monitoring options for your OP Stack chain. +description: Learn about onchain and offchain monitoring options for your OP Stack chain. --- import { Callout } from 'nextra/components' From 6285e5a78c1bda18fbe4b5c554517a26b61034ef Mon Sep 17 00:00:00 2001 From: Bradley Camacho <42678939+bradleycamacho@users.noreply.github.com> Date: Mon, 7 Oct 2024 09:08:39 -0700 Subject: [PATCH 118/565] Update pages/builders/chain-operators/tools/chain-monitoring.mdx Co-authored-by: Blessing Krofegha --- pages/builders/chain-operators/tools/chain-monitoring.mdx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pages/builders/chain-operators/tools/chain-monitoring.mdx b/pages/builders/chain-operators/tools/chain-monitoring.mdx index ffef9c53c..cede998aa 100644 --- a/pages/builders/chain-operators/tools/chain-monitoring.mdx +++ b/pages/builders/chain-operators/tools/chain-monitoring.mdx @@ -8,8 +8,8 @@ import { Callout } from 'nextra/components' # Chain Monitoring Options -This explainer covers the basics of **onchain** and **offchain** monitoring options for your OP Stack chain. Onchain monitoring services allow chain operators to monitor the overall system and onchain events. -Offchain monitoring allows chain operators to monitor the operation and behavior of nodes and other offchain components. +This explainer covers the basics of onchain and offchain monitoring options for your OP Stack chain. Onchain monitoring services allow chain operators to monitor the overall system and onchain events. +Offchain monitoring lets chain operators to monitor the operation and behavior of nodes and other offchain components. ## Onchain Monitoring Services From ccc7da9e65d20d0ce6b4cb5d9a57c221456a668a Mon Sep 17 00:00:00 2001 From: Bradley Camacho <42678939+bradleycamacho@users.noreply.github.com> Date: Mon, 7 Oct 2024 09:10:20 -0700 Subject: [PATCH 119/565] Update pages/builders/chain-operators/tools/chain-monitoring.mdx Co-authored-by: Blessing Krofegha --- pages/builders/chain-operators/tools/chain-monitoring.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/builders/chain-operators/tools/chain-monitoring.mdx b/pages/builders/chain-operators/tools/chain-monitoring.mdx index cede998aa..263a59fb0 100644 --- a/pages/builders/chain-operators/tools/chain-monitoring.mdx +++ b/pages/builders/chain-operators/tools/chain-monitoring.mdx @@ -27,7 +27,7 @@ Security integrity monitors: These are monitors necessary for making sure Bridge * Fault Monitor: checks for changes in output roots posted to the `L2OutputOracle` contract. On change, reconstructing the output root from a trusted L2 source and looking for a match. * Withdrawals Monitor: checks for new withdrawals that have been proven to the OptimismPortal contract. Each withdrawal is checked against the `L2ToL1MessagePasser` contract. * Faultproof chain monitors: - * Faultproof Withdrawal: The Faultproof Withdrawal component monitors `ProvenWithdrawals` events on the `OptimismPortal` contract and performs checks to detect any violations of invariant conditions on the chain. If a violation is detected, it logs the issue and sets a Prometheus metric for the event. This component is designed to work exclusively with chains that are already utilizing the Fault Proofs system. This is a new version of the deprecated chain-mon faultproof-wd-mon. For detailed information on how the component works and the algorithms used, please refer to the component README. + * Faultproof Withdrawal: The Faultproof Withdrawal component monitors `ProvenWithdrawals` events on the `OptimismPortal` contract and performs checks to detect any violations of invariant conditions on the chain. If a violation is detected, the issue is logged, and a Prometheus metric is set for the event. This component is designed to work exclusively with chains that are already utilizing the Fault Proofs system. This is a new version of the deprecated `chain-mon`, `faultproof-wd-mon`. For detailed information on how the component works and the algorithms used, please refer to the component README. Security monitors: Those tools monitor other aspects of several contracts used in optimism: From b65d1b8e55ee1eded8ffad084b073546581397ff Mon Sep 17 00:00:00 2001 From: Bradley Camacho <42678939+bradleycamacho@users.noreply.github.com> Date: Mon, 7 Oct 2024 09:10:30 -0700 Subject: [PATCH 120/565] Update pages/builders/chain-operators/tools/chain-monitoring.mdx Co-authored-by: Blessing Krofegha --- pages/builders/chain-operators/tools/chain-monitoring.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/builders/chain-operators/tools/chain-monitoring.mdx b/pages/builders/chain-operators/tools/chain-monitoring.mdx index 263a59fb0..2161adcb5 100644 --- a/pages/builders/chain-operators/tools/chain-monitoring.mdx +++ b/pages/builders/chain-operators/tools/chain-monitoring.mdx @@ -36,7 +36,7 @@ Security monitors: Those tools monitor other aspects of several contracts used i * Balances Monitor: emits a metric reporting the balances for the configured accounts. * Multisig Monitor: The multisig monitor reports the paused status of the OptimismPortal contract. If set, the latest nonce of the configured Safe address. And also if set, the latest presigned nonce stored in One Password. The latest presigned nonce is identified by looking for items in the configured vault that follow a `ready-.json` name. The highest nonce of this item name format is reported. * Drippie Monitor: tracks the execution and executability of drips within a Drippie contract. -* Secrets Monitor: takes a Drippie contract as a parameter and monitors for any drips within that contract that use the `CheckSecrets` dripcheck contract. `CheckSecrets` is a dripcheck that allows a drip to begin once a specific secret has been revealed (after a delay period) and cancels the drip if a second secret is revealed. It's important to monitor for these secrets being revealed as this could be a sign that the secret storage platform has been compromised and someone is attempting to exfiltrate the ETH controlled by that drip. +* Secrets Monitor: takes a Drippie contract as a parameter and monitors for any drips within that contract that use the `CheckSecrets` dripcheck contract. `CheckSecrets` is a dripcheck that allows a drip to begin once a specific secret has been revealed (after a delay period) and cancels the drip if a second secret is revealed. Monitoring these secrets is important, as their revelation may indicate that the secret storage platform has been compromised and someone is attempting to exfiltrate the ETH controlled by the drip. For more information on these monitors and how to use them, [check out the repo](https://github.com/ethereum-optimism/monitorism?tab=readme-ov-file#monitorism). From d8871d7cb16ae6ccd8e2ac23074adf63f691b5be Mon Sep 17 00:00:00 2001 From: Bradley Camacho <42678939+bradleycamacho@users.noreply.github.com> Date: Mon, 7 Oct 2024 09:12:16 -0700 Subject: [PATCH 121/565] Update pages/builders/chain-operators/tools/chain-monitoring.mdx Co-authored-by: Blessing Krofegha --- pages/builders/chain-operators/tools/chain-monitoring.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/builders/chain-operators/tools/chain-monitoring.mdx b/pages/builders/chain-operators/tools/chain-monitoring.mdx index 2161adcb5..ef910dc0c 100644 --- a/pages/builders/chain-operators/tools/chain-monitoring.mdx +++ b/pages/builders/chain-operators/tools/chain-monitoring.mdx @@ -42,7 +42,7 @@ For more information on these monitors and how to use them, [check out the repo] ### `dispute-mon` -Chain operators should consider running `op-dispute-mon`. It's an incredibly useful securities monitoring service to keep an eye on games, basically giving visibility into all the status of the games for the last 28 days. +Chain operators should consider running `op-dispute-mon`. It’s an essential security monitoring service that tracks game statuses, providing visibility over the last 28 days. `dispute-mon` is set up and built the same way as `op-challenger`. This means that you can run it the same way (run `make op-dispute-mon` in the directory). From fbcedfd19efae747abecbd16f1b2c6e777474da5 Mon Sep 17 00:00:00 2001 From: Bradley Camacho <42678939+bradleycamacho@users.noreply.github.com> Date: Mon, 7 Oct 2024 09:12:32 -0700 Subject: [PATCH 122/565] Apply review suggestions --- pages/builders/chain-operators/tools/chain-monitoring.mdx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pages/builders/chain-operators/tools/chain-monitoring.mdx b/pages/builders/chain-operators/tools/chain-monitoring.mdx index cede998aa..820044e7a 100644 --- a/pages/builders/chain-operators/tools/chain-monitoring.mdx +++ b/pages/builders/chain-operators/tools/chain-monitoring.mdx @@ -13,7 +13,7 @@ Offchain monitoring lets chain operators to monitor the operation and behavior o ## Onchain Monitoring Services -Onchain monitoring services provide insights into the overall system and helps chain operators track and monitor onchain events. Some examples of onchain monitoring services include `monitorism` and `dispute-mon`. +Onchain monitoring services provide insights into the overall system, helping chain operators track and monitor on-chain events. Some examples of onchain monitoring services include `monitorism` and `dispute-mon`. ### `monitorism` @@ -24,17 +24,17 @@ Currently. the list of monitors includes: Security integrity monitors: These are monitors necessary for making sure Bridges between L2 and L1 are safe and work as expected. These monitors are divided in two subgroups: * Pre-Faultproof Chain Monitors: - * Fault Monitor: checks for changes in output roots posted to the `L2OutputOracle` contract. On change, reconstructing the output root from a trusted L2 source and looking for a match. + * Fault Monitor: checks for changes in output roots posted to the L2OutputOracle contract. When a change is detected, it reconstructs the output root from a trusted L2 source and looks for a match.. * Withdrawals Monitor: checks for new withdrawals that have been proven to the OptimismPortal contract. Each withdrawal is checked against the `L2ToL1MessagePasser` contract. * Faultproof chain monitors: * Faultproof Withdrawal: The Faultproof Withdrawal component monitors `ProvenWithdrawals` events on the `OptimismPortal` contract and performs checks to detect any violations of invariant conditions on the chain. If a violation is detected, it logs the issue and sets a Prometheus metric for the event. This component is designed to work exclusively with chains that are already utilizing the Fault Proofs system. This is a new version of the deprecated chain-mon faultproof-wd-mon. For detailed information on how the component works and the algorithms used, please refer to the component README. Security monitors: Those tools monitor other aspects of several contracts used in optimism: -* Global Events Monitor: made for to taking YAML rules as configuration and monitoring the events that are emitted on the chain. +* Global Events Monitor: made for taking YAML rules as configuration and monitoring the events that are emitted on the chain. * Liveness Expiration Monitor: monitors the liveness expiration on Safes. * Balances Monitor: emits a metric reporting the balances for the configured accounts. -* Multisig Monitor: The multisig monitor reports the paused status of the OptimismPortal contract. If set, the latest nonce of the configured Safe address. And also if set, the latest presigned nonce stored in One Password. The latest presigned nonce is identified by looking for items in the configured vault that follow a `ready-.json` name. The highest nonce of this item name format is reported. +* Multisig Monitor: The multisig monitor reports the paused status of the OptimismPortal contract. "If set, reports the latest nonce of the configured Safe address and the latest presigned nonce stored in One Password.. The latest presigned nonce is identified by looking for items in the configured vault that follow a `ready-.json` name. The highest nonce of this item name format is reported. * Drippie Monitor: tracks the execution and executability of drips within a Drippie contract. * Secrets Monitor: takes a Drippie contract as a parameter and monitors for any drips within that contract that use the `CheckSecrets` dripcheck contract. `CheckSecrets` is a dripcheck that allows a drip to begin once a specific secret has been revealed (after a delay period) and cancels the drip if a second secret is revealed. It's important to monitor for these secrets being revealed as this could be a sign that the secret storage platform has been compromised and someone is attempting to exfiltrate the ETH controlled by that drip. From 0099edda38be1a7544904417fe8ea860623910c3 Mon Sep 17 00:00:00 2001 From: Bradley Camacho <42678939+bradleycamacho@users.noreply.github.com> Date: Mon, 7 Oct 2024 09:14:07 -0700 Subject: [PATCH 123/565] Apply linting --- pages/builders/chain-operators/tools/chain-monitoring.mdx | 2 +- words.txt | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/pages/builders/chain-operators/tools/chain-monitoring.mdx b/pages/builders/chain-operators/tools/chain-monitoring.mdx index 85e1480c8..c97183443 100644 --- a/pages/builders/chain-operators/tools/chain-monitoring.mdx +++ b/pages/builders/chain-operators/tools/chain-monitoring.mdx @@ -42,7 +42,7 @@ For more information on these monitors and how to use them, [check out the repo] ### `dispute-mon` -Chain operators should consider running `op-dispute-mon`. It’s an essential security monitoring service that tracks game statuses, providing visibility over the last 28 days. +Chain operators should consider running `op-dispute-mon`. It's an essential security monitoring service that tracks game statuses, providing visibility over the last 28 days. `dispute-mon` is set up and built the same way as `op-challenger`. This means that you can run it the same way (run `make op-dispute-mon` in the directory). diff --git a/words.txt b/words.txt index b1caf7a2d..025833397 100644 --- a/words.txt +++ b/words.txt @@ -106,7 +106,6 @@ extradata Farcaster farcaster Faultproof -faultproof FDLIMIT fdlimit featureset From 1de7b51b9dd324308d989d979d078cf8ad86c6b0 Mon Sep 17 00:00:00 2001 From: krofax Date: Mon, 7 Oct 2024 17:22:14 +0100 Subject: [PATCH 124/565] update calculator codebase --- pages/builders/tools/fee-calculator.mdx | 14 +++++++- utils/calculator-helpers.ts | 44 ++++++++++++++++--------- 2 files changed, 42 insertions(+), 16 deletions(-) diff --git a/pages/builders/tools/fee-calculator.mdx b/pages/builders/tools/fee-calculator.mdx index f297e1117..5534d82f2 100644 --- a/pages/builders/tools/fee-calculator.mdx +++ b/pages/builders/tools/fee-calculator.mdx @@ -1,11 +1,23 @@ --- title: Fjord Fee Parameter Calculator lang: en-US +description: Use the Fjord Fee Parameter Calculator to estimate and calculate fees for transactions on the Fjord network. --- import { ChainParametersForm } from '@/components/calculator/ChainParametersForm' - # Fjord Fee Parameter Calculator +The Fjord Fee Parameter Calculator helps you estimate transaction fees on the Fjord network. Use this tool to: + +Calculate potential fees for different transaction types +Understand how network parameters affect fee calculations +Plan your transactions more effectively + +## How to use the calculator + +1. Input the relevant parameters in the form below. +2. The calculator will automatically update the fee estimates based on your inputs. +3. Adjust the parameters as needed to see how they affect the fee calculations. + diff --git a/utils/calculator-helpers.ts b/utils/calculator-helpers.ts index da86e6702..c6920a9c3 100644 --- a/utils/calculator-helpers.ts +++ b/utils/calculator-helpers.ts @@ -130,6 +130,9 @@ export const determineDAInUse = (dataAvailabilityType: string): string => { // =INDEX($A$20:$G$32,MATCH('Chain Estimator'!$E$15,$A$20:$A$32,0),MATCH($B8,$A$20:$G$20,0)) const getAvgEstimatedSizePerTx = (comparableTxnType: string) => { + if (!transactionTypes[comparableTxnType]) { + throw new Error(`Invalid transaction type: ${comparableTxnType}`); + } const output = transactionTypes[comparableTxnType].AvgEstimatedSizePerTx; console.log("c8::", output); return output; @@ -540,13 +543,24 @@ async function getL1GasBaseFee(): Promise { } const getBlobBaseFee = async (): Promise => { - const response = await fetch(blobBaseFee); - const fee = await response.text(); - console.log("BlobBaseFee_response::", fee); - const output = parseFloat(fee); - console.log("e78:::", output); - return output; -}; // e78 done + try { + const response = await fetch(blobBaseFee); + if (!response.ok) { + throw new Error(`Network response was not ok: ${response.status} ${response.statusText}`); + } + const feeText = await response.text(); + console.log("BlobBaseFee_response::", feeText); + const output = parseFloat(feeText); + if (isNaN(output)) { + throw new Error(`Failed to parse Blob Base Fee: ${feeText}`); + } + console.log("e78:::", output); + return output; + } catch (error) { + console.error('Error fetching Blob Base Fee:', error); + throw error; + } +}; // =ROUND((('Advanced Inputs'!C10/'Advanced Inputs'!N25/(1-E18))*1000000),0) const calculateL1BlobBaseFeeScalarUsingBlob = ( @@ -998,19 +1012,19 @@ export const calculateOverallL1DataAndStateCostsMargin = async ( // =(E14*'Advanced Inputs'!C8*(16*G38*E76/1000000000+G37*E78/1000000000)) export const calculateModeledDAPlusStateRevenueOnL2 = async ( - e14: number, - e15: string, - e37: number, - e38: number + transactionsPerDay: number, + comparableTxnType: string, + displayL1BlobBaseFeeScalar: number, + displayL1BaseFeeScalar: number ) => { - const c8 = getAvgEstimatedSizePerTx(e15); - const g38 = convertToMillionUnits(e38); - const g37 = convertToMillionUnits(e37) + const c8 = getAvgEstimatedSizePerTx(comparableTxnType); + const g38 = convertToMillionUnits(displayL1BaseFeeScalar); + const g37 = convertToMillionUnits(displayL1BlobBaseFeeScalar); const e76 = await getL1GasBaseFee(); const e78 = await getBlobBaseFee(); const part1 = (16 * g38 * e76) / 1000000000; const part2 = (g37 * e78) / 1000000000; - const output = e14 * c8 * (part1 + part2); + const output = transactionsPerDay * c8 * (part1 + part2); console.log("e118::", output) return output } // e118 From 72f3b4e0916bfd6e1c9519cc1b0bf8fe6ecdc43b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 7 Oct 2024 16:35:27 +0000 Subject: [PATCH 125/565] Bump micromatch from 4.0.5 to 4.0.8 Bumps [micromatch](https://github.com/micromatch/micromatch) from 4.0.5 to 4.0.8. - [Release notes](https://github.com/micromatch/micromatch/releases) - [Changelog](https://github.com/micromatch/micromatch/blob/master/CHANGELOG.md) - [Commits](https://github.com/micromatch/micromatch/compare/4.0.5...4.0.8) --- updated-dependencies: - dependency-name: micromatch dependency-type: indirect ... Signed-off-by: dependabot[bot] --- pnpm-lock.yaml | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 432ebb0c7..f8da366ac 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1648,6 +1648,7 @@ packages: eslint@8.57.0: resolution: {integrity: sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. hasBin: true espree@9.6.1: @@ -2600,8 +2601,8 @@ packages: micromark@4.0.0: resolution: {integrity: sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==} - micromatch@4.0.5: - resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} min-indent@1.0.1: @@ -5125,7 +5126,7 @@ snapshots: cspell-glob@8.7.0: dependencies: - micromatch: 4.0.5 + micromatch: 4.0.8 cspell-grammar@8.7.0: dependencies: @@ -5720,7 +5721,7 @@ snapshots: '@nodelib/fs.walk': 1.2.8 glob-parent: 5.1.2 merge2: 1.4.1 - micromatch: 4.0.5 + micromatch: 4.0.8 fast-json-stable-stringify@2.1.0: {} @@ -7027,7 +7028,7 @@ snapshots: transitivePeerDependencies: - supports-color - micromatch@4.0.5: + micromatch@4.0.8: dependencies: braces: 3.0.3 picomatch: 2.3.1 From 225d3689d77eb0e59b57d2f5f19ed4a50f4f3aa4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 7 Oct 2024 16:35:28 +0000 Subject: [PATCH 126/565] Bump dompurify from 3.1.1 to 3.1.7 Bumps [dompurify](https://github.com/cure53/DOMPurify) from 3.1.1 to 3.1.7. - [Release notes](https://github.com/cure53/DOMPurify/releases) - [Commits](https://github.com/cure53/DOMPurify/compare/3.1.1...3.1.7) --- updated-dependencies: - dependency-name: dompurify dependency-type: indirect ... Signed-off-by: dependabot[bot] --- pnpm-lock.yaml | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 432ebb0c7..4b2092e50 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1561,8 +1561,8 @@ packages: dom-accessibility-api@0.5.16: resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==} - dompurify@3.1.1: - resolution: {integrity: sha512-tVP8C/GJwnABOn/7cx/ymx/hXpmBfWIPihC1aOEvS8GbMqy3pgeYtJk1HXN3CO7tu+8bpY18f6isjR5Cymj0TQ==} + dompurify@3.1.7: + resolution: {integrity: sha512-VaTstWtsneJY8xzy7DekmYWEOZcmzIe3Qb3zPd4STve1OBTa+e+WmS1ITQec1fZYXI3HCsOZZiSMpG6oxoWMWQ==} dot-case@3.0.4: resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} @@ -1648,6 +1648,7 @@ packages: eslint@8.57.0: resolution: {integrity: sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. hasBin: true espree@9.6.1: @@ -5439,7 +5440,7 @@ snapshots: dom-accessibility-api@0.5.16: {} - dompurify@3.1.1: {} + dompurify@3.1.7: {} dot-case@3.0.4: dependencies: @@ -6590,7 +6591,7 @@ snapshots: d3-sankey: 0.12.3 dagre-d3-es: 7.0.10 dayjs: 1.11.11 - dompurify: 3.1.1 + dompurify: 3.1.7 elkjs: 0.9.3 katex: 0.16.10 khroma: 2.1.0 From e51107fb81b31e976153e9b2c9e866512e9317a6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 7 Oct 2024 16:35:30 +0000 Subject: [PATCH 127/565] Bump next from 13.5.1 to 14.2.10 Bumps [next](https://github.com/vercel/next.js) from 13.5.1 to 14.2.10. - [Release notes](https://github.com/vercel/next.js/releases) - [Changelog](https://github.com/vercel/next.js/blob/canary/release.js) - [Commits](https://github.com/vercel/next.js/compare/v13.5.1...v14.2.10) --- updated-dependencies: - dependency-name: next dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- package.json | 2 +- pnpm-lock.yaml | 177 ++++++++++++++++++++++++------------------------- 2 files changed, 88 insertions(+), 91 deletions(-) diff --git a/package.json b/package.json index a81de2a22..7d4036e50 100644 --- a/package.json +++ b/package.json @@ -22,7 +22,7 @@ "algoliasearch": "^4.23.3", "clsx": "^2.1.1", "escape-string-regexp": "^5.0.0", - "next": "13.5.1", + "next": "14.2.10", "next-sitemap": "^4.2.3", "nextra": "2.13.2", "nextra-theme-docs": "2.13.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 432ebb0c7..d73a10756 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -41,17 +41,17 @@ importers: specifier: ^5.0.0 version: 5.0.0 next: - specifier: 13.5.1 - version: 13.5.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: 14.2.10 + version: 14.2.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1) next-sitemap: specifier: ^4.2.3 - version: 4.2.3(next@13.5.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + version: 4.2.3(next@14.2.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) nextra: specifier: 2.13.2 - version: 2.13.2(patch_hash=a4rp2hgojklggjmthmkiyqaek4)(next@13.5.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 2.13.2(patch_hash=a4rp2hgojklggjmthmkiyqaek4)(next@14.2.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) nextra-theme-docs: specifier: 2.13.2 - version: 2.13.2(next@13.5.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(nextra@2.13.2(patch_hash=a4rp2hgojklggjmthmkiyqaek4)(next@13.5.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 2.13.2(next@14.2.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(nextra@2.13.2(patch_hash=a4rp2hgojklggjmthmkiyqaek4)(next@14.2.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: specifier: ^18.2.0 version: 18.3.1 @@ -703,62 +703,62 @@ packages: resolution: {integrity: sha512-C5wRPw9waqL2jk3jEDeJv+f7ScuO3N0a39HVdyFLkwKxHH4Sya4ZbzZsu2JLi6eEqe7RuHipHL6mC7B2OfYZZw==} engines: {node: '>= 10'} - '@next/env@13.5.1': - resolution: {integrity: sha512-CIMWiOTyflFn/GFx33iYXkgLSQsMQZV4jB91qaj/TfxGaGOXxn8C1j72TaUSPIyN7ziS/AYG46kGmnvuk1oOpg==} - '@next/env@13.5.6': resolution: {integrity: sha512-Yac/bV5sBGkkEXmAX5FWPS9Mmo2rthrOPRQQNfycJPkjUAUclomCPH7QFVCDQ4Mp2k2K1SSM6m0zrxYrOwtFQw==} - '@next/swc-darwin-arm64@13.5.1': - resolution: {integrity: sha512-Bcd0VFrLHZnMmJy6LqV1CydZ7lYaBao8YBEdQUVzV8Ypn/l5s//j5ffjfvMzpEQ4mzlAj3fIY+Bmd9NxpWhACw==} + '@next/env@14.2.10': + resolution: {integrity: sha512-dZIu93Bf5LUtluBXIv4woQw2cZVZ2DJTjax5/5DOs3lzEOeKLy7GxRSr4caK9/SCPdaW6bCgpye6+n4Dh9oJPw==} + + '@next/swc-darwin-arm64@14.2.10': + resolution: {integrity: sha512-V3z10NV+cvMAfxQUMhKgfQnPbjw+Ew3cnr64b0lr8MDiBJs3eLnM6RpGC46nhfMZsiXgQngCJKWGTC/yDcgrDQ==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] - '@next/swc-darwin-x64@13.5.1': - resolution: {integrity: sha512-uvTZrZa4D0bdWa1jJ7X1tBGIxzpqSnw/ATxWvoRO9CVBvXSx87JyuISY+BWsfLFF59IRodESdeZwkWM2l6+Kjg==} + '@next/swc-darwin-x64@14.2.10': + resolution: {integrity: sha512-Y0TC+FXbFUQ2MQgimJ/7Ina2mXIKhE7F+GUe1SgnzRmwFY3hX2z8nyVCxE82I2RicspdkZnSWMn4oTjIKz4uzA==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] - '@next/swc-linux-arm64-gnu@13.5.1': - resolution: {integrity: sha512-/52ThlqdORPQt3+AlMoO+omicdYyUEDeRDGPAj86ULpV4dg+/GCFCKAmFWT0Q4zChFwsAoZUECLcKbRdcc0SNg==} + '@next/swc-linux-arm64-gnu@14.2.10': + resolution: {integrity: sha512-ZfQ7yOy5zyskSj9rFpa0Yd7gkrBnJTkYVSya95hX3zeBG9E55Z6OTNPn1j2BTFWvOVVj65C3T+qsjOyVI9DQpA==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-arm64-musl@13.5.1': - resolution: {integrity: sha512-L4qNXSOHeu1hEAeeNsBgIYVnvm0gg9fj2O2Yx/qawgQEGuFBfcKqlmIE/Vp8z6gwlppxz5d7v6pmHs1NB6R37w==} + '@next/swc-linux-arm64-musl@14.2.10': + resolution: {integrity: sha512-n2i5o3y2jpBfXFRxDREr342BGIQCJbdAUi/K4q6Env3aSx8erM9VuKXHw5KNROK9ejFSPf0LhoSkU/ZiNdacpQ==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-x64-gnu@13.5.1': - resolution: {integrity: sha512-QVvMrlrFFYvLtABk092kcZ5Mzlmsk2+SV3xYuAu8sbTuIoh0U2+HGNhVklmuYCuM3DAAxdiMQTNlRQmNH11udw==} + '@next/swc-linux-x64-gnu@14.2.10': + resolution: {integrity: sha512-GXvajAWh2woTT0GKEDlkVhFNxhJS/XdDmrVHrPOA83pLzlGPQnixqxD8u3bBB9oATBKB//5e4vpACnx5Vaxdqg==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-linux-x64-musl@13.5.1': - resolution: {integrity: sha512-bBnr+XuWc28r9e8gQ35XBtyi5KLHLhTbEvrSgcWna8atI48sNggjIK8IyiEBO3KIrcUVXYkldAzGXPEYMnKt1g==} + '@next/swc-linux-x64-musl@14.2.10': + resolution: {integrity: sha512-opFFN5B0SnO+HTz4Wq4HaylXGFV+iHrVxd3YvREUX9K+xfc4ePbRrxqOuPOFjtSuiVouwe6uLeDtabjEIbkmDA==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-win32-arm64-msvc@13.5.1': - resolution: {integrity: sha512-EQGeE4S5c9v06jje9gr4UlxqUEA+zrsgPi6kg9VwR+dQHirzbnVJISF69UfKVkmLntknZJJI9XpWPB6q0Z7mTg==} + '@next/swc-win32-arm64-msvc@14.2.10': + resolution: {integrity: sha512-9NUzZuR8WiXTvv+EiU/MXdcQ1XUvFixbLIMNQiVHuzs7ZIFrJDLJDaOF1KaqttoTujpcxljM/RNAOmw1GhPPQQ==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] - '@next/swc-win32-ia32-msvc@13.5.1': - resolution: {integrity: sha512-1y31Q6awzofVjmbTLtRl92OX3s+W0ZfO8AP8fTnITcIo9a6ATDc/eqa08fd6tSpFu6IFpxOBbdevOjwYTGx/AQ==} + '@next/swc-win32-ia32-msvc@14.2.10': + resolution: {integrity: sha512-fr3aEbSd1GeW3YUMBkWAu4hcdjZ6g4NBl1uku4gAn661tcxd1bHs1THWYzdsbTRLcCKLjrDZlNp6j2HTfrw+Bg==} engines: {node: '>= 10'} cpu: [ia32] os: [win32] - '@next/swc-win32-x64-msvc@13.5.1': - resolution: {integrity: sha512-+9XBQizy7X/GuwNegq+5QkkxAPV7SBsIwapVRQd9WSvvU20YO23B3bZUpevdabi4fsd25y9RJDDncljy/V54ww==} + '@next/swc-win32-x64-msvc@14.2.10': + resolution: {integrity: sha512-UjeVoRGKNL2zfbcQ6fscmgjBAS/inHBh63mjIlfPg/NG8Yn2ztqylXt5qilYb6hoHIwaU2ogHknHWWmahJjgZQ==} engines: {node: '>= 10'} cpu: [x64] os: [win32] @@ -862,9 +862,15 @@ packages: '@scure/bip39@1.2.2': resolution: {integrity: sha512-HYf9TUXG80beW+hGAt3TRM8wU6pQoYur9iNypTROm42dorCGmLnFe3eWjz3gOq6G62H2WRh0FCzAR1PI+29zIA==} + '@swc/counter@0.1.3': + resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} + '@swc/helpers@0.5.2': resolution: {integrity: sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==} + '@swc/helpers@0.5.5': + resolution: {integrity: sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A==} + '@tanstack/react-virtual@3.10.8': resolution: {integrity: sha512-VbzbVGSsZlQktyLrP5nxE+vE1ZR+U0NFAWPbJLoG2+DKPwd2D7dVICTVIIaYlJqX1ZCEnYDbaOpmMwbsyhBoIA==} peerDependencies: @@ -1648,6 +1654,7 @@ packages: eslint@8.57.0: resolution: {integrity: sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. hasBin: true espree@9.6.1: @@ -1845,9 +1852,6 @@ packages: resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} engines: {node: '>=10.13.0'} - glob-to-regexp@0.4.1: - resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} - glob@10.3.12: resolution: {integrity: sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg==} engines: {node: '>=16 || 14 >=14.17'} @@ -2679,18 +2683,21 @@ packages: react: '*' react-dom: '*' - next@13.5.1: - resolution: {integrity: sha512-GIudNR7ggGUZoIL79mSZcxbXK9f5pwAIPZxEM8+j2yLqv5RODg4TkmUlaKSYVqE1bPQueamXSqdC3j7axiTSEg==} - engines: {node: '>=16.14.0'} + next@14.2.10: + resolution: {integrity: sha512-sDDExXnh33cY3RkS9JuFEKaS4HmlWmDKP1VJioucCG6z5KuA008DPsDZOzi8UfqEk3Ii+2NCQSJrfbEWtZZfww==} + engines: {node: '>=18.17.0'} hasBin: true peerDependencies: '@opentelemetry/api': ^1.1.0 + '@playwright/test': ^1.41.2 react: ^18.2.0 react-dom: ^18.2.0 sass: ^1.3.0 peerDependenciesMeta: '@opentelemetry/api': optional: true + '@playwright/test': + optional: true sass: optional: true @@ -2876,8 +2883,8 @@ packages: resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} engines: {node: '>= 0.4'} - postcss@8.4.14: - resolution: {integrity: sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==} + postcss@8.4.31: + resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} engines: {node: ^10 || ^12 || >=14} prelude-ls@1.2.1: @@ -3556,10 +3563,6 @@ packages: walk-up-path@3.0.1: resolution: {integrity: sha512-9YlCL/ynK3CTlrSRrDxZvUauLzAswPCrsaCgilqFevUYpeEW0/3ScEjaa3kbW/T0ghhkEr7mv+fpjqn1Y1YuTA==} - watchpack@2.4.0: - resolution: {integrity: sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==} - engines: {node: '>=10.13.0'} - web-namespaces@2.0.1: resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} @@ -3665,9 +3668,6 @@ packages: resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} engines: {node: '>=12.20'} - zod@3.21.4: - resolution: {integrity: sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw==} - zod@3.23.8: resolution: {integrity: sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==} @@ -4494,35 +4494,35 @@ snapshots: '@napi-rs/simple-git-win32-arm64-msvc': 0.1.16 '@napi-rs/simple-git-win32-x64-msvc': 0.1.16 - '@next/env@13.5.1': {} - '@next/env@13.5.6': {} - '@next/swc-darwin-arm64@13.5.1': + '@next/env@14.2.10': {} + + '@next/swc-darwin-arm64@14.2.10': optional: true - '@next/swc-darwin-x64@13.5.1': + '@next/swc-darwin-x64@14.2.10': optional: true - '@next/swc-linux-arm64-gnu@13.5.1': + '@next/swc-linux-arm64-gnu@14.2.10': optional: true - '@next/swc-linux-arm64-musl@13.5.1': + '@next/swc-linux-arm64-musl@14.2.10': optional: true - '@next/swc-linux-x64-gnu@13.5.1': + '@next/swc-linux-x64-gnu@14.2.10': optional: true - '@next/swc-linux-x64-musl@13.5.1': + '@next/swc-linux-x64-musl@14.2.10': optional: true - '@next/swc-win32-arm64-msvc@13.5.1': + '@next/swc-win32-arm64-msvc@14.2.10': optional: true - '@next/swc-win32-ia32-msvc@13.5.1': + '@next/swc-win32-ia32-msvc@14.2.10': optional: true - '@next/swc-win32-x64-msvc@13.5.1': + '@next/swc-win32-x64-msvc@14.2.10': optional: true '@noble/curves@1.2.0': @@ -4642,10 +4642,17 @@ snapshots: '@noble/hashes': 1.3.3 '@scure/base': 1.1.6 + '@swc/counter@0.1.3': {} + '@swc/helpers@0.5.2': dependencies: tslib: 2.6.2 + '@swc/helpers@0.5.5': + dependencies: + '@swc/counter': 0.1.3 + tslib: 2.6.2 + '@tanstack/react-virtual@3.10.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@tanstack/virtual-core': 3.10.8 @@ -5829,8 +5836,6 @@ snapshots: dependencies: is-glob: 4.0.3 - glob-to-regexp@0.4.1: {} - glob@10.3.12: dependencies: foreground-child: 3.1.1 @@ -7077,53 +7082,52 @@ snapshots: transitivePeerDependencies: - supports-color - next-seo@6.5.0(next@13.5.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + next-seo@6.5.0(next@14.2.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - next: 13.5.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + next: 14.2.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - next-sitemap@4.2.3(next@13.5.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)): + next-sitemap@4.2.3(next@14.2.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1)): dependencies: '@corex/deepmerge': 4.0.43 '@next/env': 13.5.6 fast-glob: 3.3.2 minimist: 1.2.8 - next: 13.5.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + next: 14.2.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - next-themes@0.2.1(next@13.5.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + next-themes@0.2.1(next@14.2.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - next: 13.5.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + next: 14.2.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - next@13.5.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + next@14.2.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - '@next/env': 13.5.1 - '@swc/helpers': 0.5.2 + '@next/env': 14.2.10 + '@swc/helpers': 0.5.5 busboy: 1.6.0 caniuse-lite: 1.0.30001614 - postcss: 8.4.14 + graceful-fs: 4.2.11 + postcss: 8.4.31 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) styled-jsx: 5.1.1(react@18.3.1) - watchpack: 2.4.0 - zod: 3.21.4 optionalDependencies: - '@next/swc-darwin-arm64': 13.5.1 - '@next/swc-darwin-x64': 13.5.1 - '@next/swc-linux-arm64-gnu': 13.5.1 - '@next/swc-linux-arm64-musl': 13.5.1 - '@next/swc-linux-x64-gnu': 13.5.1 - '@next/swc-linux-x64-musl': 13.5.1 - '@next/swc-win32-arm64-msvc': 13.5.1 - '@next/swc-win32-ia32-msvc': 13.5.1 - '@next/swc-win32-x64-msvc': 13.5.1 + '@next/swc-darwin-arm64': 14.2.10 + '@next/swc-darwin-x64': 14.2.10 + '@next/swc-linux-arm64-gnu': 14.2.10 + '@next/swc-linux-arm64-musl': 14.2.10 + '@next/swc-linux-x64-gnu': 14.2.10 + '@next/swc-linux-x64-musl': 14.2.10 + '@next/swc-win32-arm64-msvc': 14.2.10 + '@next/swc-win32-ia32-msvc': 14.2.10 + '@next/swc-win32-x64-msvc': 14.2.10 transitivePeerDependencies: - '@babel/core' - babel-plugin-macros - nextra-theme-docs@2.13.2(next@13.5.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(nextra@2.13.2(patch_hash=a4rp2hgojklggjmthmkiyqaek4)(next@13.5.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + nextra-theme-docs@2.13.2(next@14.2.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(nextra@2.13.2(patch_hash=a4rp2hgojklggjmthmkiyqaek4)(next@14.2.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@headlessui/react': 1.7.19(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@popperjs/core': 2.11.8 @@ -7134,16 +7138,16 @@ snapshots: git-url-parse: 13.1.1 intersection-observer: 0.12.2 match-sorter: 6.3.4 - next: 13.5.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - next-seo: 6.5.0(next@13.5.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - next-themes: 0.2.1(next@13.5.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - nextra: 2.13.2(patch_hash=a4rp2hgojklggjmthmkiyqaek4)(next@13.5.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + next: 14.2.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + next-seo: 6.5.0(next@14.2.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + next-themes: 0.2.1(next@14.2.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + nextra: 2.13.2(patch_hash=a4rp2hgojklggjmthmkiyqaek4)(next@14.2.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) scroll-into-view-if-needed: 3.1.0 zod: 3.23.8 - nextra@2.13.2(patch_hash=a4rp2hgojklggjmthmkiyqaek4)(next@13.5.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + nextra@2.13.2(patch_hash=a4rp2hgojklggjmthmkiyqaek4)(next@14.2.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@headlessui/react': 1.7.19(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@mdx-js/mdx': 2.3.0 @@ -7157,7 +7161,7 @@ snapshots: gray-matter: 4.0.3 katex: 0.16.10 lodash.get: 4.4.2 - next: 13.5.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + next: 14.2.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1) next-mdx-remote: 4.4.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) p-limit: 3.1.0 react: 18.3.1 @@ -7349,7 +7353,7 @@ snapshots: possible-typed-array-names@1.0.0: {} - postcss@8.4.14: + postcss@8.4.31: dependencies: nanoid: 3.3.7 picocolors: 1.0.0 @@ -8396,11 +8400,6 @@ snapshots: walk-up-path@3.0.1: {} - watchpack@2.4.0: - dependencies: - glob-to-regexp: 0.4.1 - graceful-fs: 4.2.11 - web-namespaces@2.0.1: {} web-worker@1.3.0: {} @@ -8495,8 +8494,6 @@ snapshots: yocto-queue@1.0.0: {} - zod@3.21.4: {} - zod@3.23.8: {} zwitch@2.0.4: {} From 4ed6e923701350daafeef7b3d43a075a09bba8ef Mon Sep 17 00:00:00 2001 From: krofax Date: Mon, 7 Oct 2024 18:05:21 +0100 Subject: [PATCH 128/565] make tinty updates --- .../chain-operators/tools/op-deployer 2.mdx | 127 ++++++++++++++++++ pages/builders/notices/sdk-deprecation 2.mdx | 101 ++++++++++++++ pages/builders/tools/fee-calculator.mdx | 9 +- pages/stack/opcm 2.mdx | 29 ++++ 4 files changed, 261 insertions(+), 5 deletions(-) create mode 100644 pages/builders/chain-operators/tools/op-deployer 2.mdx create mode 100644 pages/builders/notices/sdk-deprecation 2.mdx create mode 100644 pages/stack/opcm 2.mdx diff --git a/pages/builders/chain-operators/tools/op-deployer 2.mdx b/pages/builders/chain-operators/tools/op-deployer 2.mdx new file mode 100644 index 000000000..4d8edb21b --- /dev/null +++ b/pages/builders/chain-operators/tools/op-deployer 2.mdx @@ -0,0 +1,127 @@ +--- +title: Deployer +lang: en-US +tags: ["op-deployer","eng-platforms"] +description: Learn how op-deployer can simplify deployment of the OP Stack. +--- + +import {Callout, Steps} from 'nextra/components' + +# Deployer + +`op-deployer` simplifies the process of deploying the OP Stack. It works similarly to [Terraform](https://www.terraform.io). Like Terraform, you define a declarative config file called an "intent," then run a +command to apply the intent to your chain. `op-deployer` will compare the state of your chain against the intent, +and make whatever changes are necessary for them to match. + +## Installation + +`op-deployer` is currently under active development, and must be compiled from source. Assuming you have the Go +toolchain installed, you can install `op-deployer` by following these steps: + + + ### **Clone the Monorepo**: + + Run the following command to clone the monorepo: + + ```bash + git clone https://github.com/ethereum-optimism/optimism.git + ``` + + ### **Build the Binary**: + + Run the following commands to build the binary: + + ```bash + cd op-chain-ops + make op-deployer + ``` + + ### (Optional) Move `op-deployer` Into `$PATH` + + Run the following command to move the `op-deployer` binary into your `$PATH`. Note that the path for your system + may be different: + + ```bash + sudo mv ./bin/op-deployer /usr/local/bin/op-deployer + ``` + + +## Usage + +### Configuring your Chain + +To get started with `op-deployer`, you need to create an intent file that outlines your desired chain configuration. You can use the built-in `op-deployer` utility to generate this file. Just run the following command to create an example intent file for a development chain: + +``` +op-deployer init --l1-chain-id 11155111 --l2-chain-ids 12345 --workdir .deployer +``` + +This command will create a directory called `.deployer` in your current working directory containing the intent file +and an empty `state.json` file. `state.json` is populated with the results of your deployment, and never needs to +be edited directly. + +Your intent file will look something like this: + +```toml +l1ChainID = 11155111 # The chain ID of the L1 chain you'll be deploying to +fundDevAccounts = true # Whether or not to fund dev accounts using the test... junk mnemonic on L2. +contractsRelease = "op-contracts/v1.6.0" # The version of the smart contracts to deploy. + +# List of L2s to deploy. op-deployer can deploy multiple L2s at once +[[chains]] +# Your chain's ID, encoded as a 32-byte hex string +id = "0x0000000000000000000000000000000000000000000000000000000000003039" +# Various ownership roles for your chain. When you use op-deployer init, these roles are generated using the +# test... junk mnemonic. You should replace these with your own addresses for production chains. +[chains.roles] +proxyAdminOwner = "0x7759a8a43aa6a7ee9434ddb597beed64180c40fd" +systemConfigOwner = "0x8e35d9523a0c4c9ac537d254079c2398c6f3b35f" +governanceTokenOwner = "0x7759a8a43aa6a7ee9434ddb597beed64180c40fd" +unsafeBlockSigner = "0xbb19dce4ce51f353a98dbab31b5fa3bc80dc7769" +batcher = "0x0e9c62712ab826e06b16b2236ce542f711eaffaf" +proposer = "0x86dfafe0689e20685f7872e0cb264868454627bc" +challenger = "0xf1658da627dd0738c555f9572f658617511c49d5" +``` + +See the code comments above for explanations of each field. By default, `op-deployer` will fill in all other configuration variables +with those that match our standard config. You can override these defaults by adding them to your intent file, but +that won't be covered here. + +### Applying your Intent + +Now that you've created your intent file, you can apply it to your chain: + +``` +op-deployer apply --workdir .deployer --l1-rpc-url --private-key +``` + +Hardware wallets are not supported, but you can use ephemeral hot wallets since this deployer key has no privileges. + +This command will deploy the OP Stack to L1. It will deploy all L2s specified in the intent file. Superchain +configuration will be set to the Superchain-wide defaults - i.e., your chain will be opted into the [Superchain pause](https://specs.optimism.io/protocol/superchain-configuration.html#pausability) +and will use the same [protocol versions](https://github.com/ethereum-optimism/specs/blob/main/specs/protocol/superchain-upgrades.md) +address as other chains on the Superchain. + +### Generating Genesis Files + +With the contracts deployed, you can generate a genesis file for any of your L2s. Run the following command to do so: + +``` +./bin/op-deployer inspect genesis --outfile genesis.json +``` + +This will write the genesis file to `genesis.json`. You can change the `--outfile` parameter to write it somewhere +else. You can run another member of the `inspect` family, `rollup`, to get the `rollup.json` file: + +``` +./bin/op-deployer inspect rollup --outfile rollup.json +``` + +## More Information + +`op-deployer` uses the OP Contracts Manager (OPCM) under the hood to deploy contracts. + +## Next Steps + +* For more details, check out the tool and documentation in the [op-deployer repository](https://github.com/ethereum-optimism/optimism/tree/develop/op-chain-ops/cmd/op-deployer). +* For more information on OP Contracts Manager, refer to the [OPCM documentation](/stack/opcm). diff --git a/pages/builders/notices/sdk-deprecation 2.mdx b/pages/builders/notices/sdk-deprecation 2.mdx new file mode 100644 index 000000000..302f4afba --- /dev/null +++ b/pages/builders/notices/sdk-deprecation 2.mdx @@ -0,0 +1,101 @@ +--- +title: Deprecation of the Optimism SDK +lang: en-US +description: This page outlines the details of the Optimism SDK deprecation and guides developers to migrate to using `viem` library. +--- + +## Preparing for Optimism SDK deprecation + +The Optimism SDK will officially be deprecated in Q1 2025. The project is shifting to the `viem` library for a more modern, efficient, and flexible development experience. This change affects all tutorials and resources that previously relied on the Optimism SDK, and relevant documentation has been updated accordingly. + +### Breaking changes to expect + +The migration from the Optimism SDK to `viem` library brings several breaking changes: + +* **Transaction estimation**: Methods for estimating gas fees will now leverage `viem` APIs. +* **Bridging**: All token bridging actions must be updated to use the `viem` library bridging methods. +* **Cross-chain communication**: `viem` library simplifies the cross-domain messaging functionality. +* **SDK method removal**: All deprecated SDK methods will be unavailable after Q1 2025. + +Developers and users are strongly encouraged to transition to `viem` before the deprecation date to avoid disruptions. + +### Updated tutorials + +We are updating our tutorials to use the `viem` library. + + {/* Below, you'll find links to the updated versions of popular tutorials: + +* [Estimating Transaction Costs on OP Mainnet](../tutorials/transaction-cost-estimation)\ + Estimation of transaction costs now uses the `viem` gas estimation utilities. + +* [Triggering OP Mainnet Transactions from Ethereum](../tutorials/trigger-op-transactions)\ + Learn how to trigger transactions using `viem` to interact with the OP Mainnet. + +* [Tracing Deposits and Withdrawals](../tutorials/tracing-deposits-withdrawals)\ + The tracing functionalities have been adapted to use `opstack` for efficient results. + +* [Viewing Deposits and Withdrawals by Address](../tutorials/view-deposits-withdrawals)\ + This tutorial outlines updated methods in `viem` for querying deposits and withdrawals by address. + +* [Bridging Your Standard ERC-20 Token Using the Standard Bridge](../tutorials/bridge-standard-erc20)\ + The standard bridge tutorial now uses `opstack` for token transfers between Ethereum and OP Mainnet. + +* [Bridging Your Custom ERC-20 Token Using the Standard Bridge](../tutorials/bridge-custom-erc20)\ + Custom ERC-20 tokens can now be bridged via `opstack`, making the process more streamlined. + +* [Bridging ERC-20 Tokens to OP Mainnet With the Optimism SDK](../tutorials/bridge-sdk-erc20)\ + **Deprecated** – please use [Bridging Your Custom ERC-20 Token Using the Standard Bridge](../tutorials/bridge-custom-erc20). + +* [Bridging ETH to OP Mainnet With the Optimism SDK](../tutorials/bridge-sdk-eth)\ + **Deprecated** – please use [Estimating Transaction Costs on OP Mainnet](../tutorials/transaction-cost-estimation). + +* [Communicating Between OP Mainnet and Ethereum in Solidity](../tutorials/cross-chain-solidity)\ + Cross-chain communication now leverages `opstack` for all messaging. */} + +### For app developers + +If your application currently depends on the Optimism SDK, you will need to migrate to using the `viem` library. +The tutorials have been updated to reflect these changes, and it is critical to update your applications before the deprecation date to maintain compatibility. + +Here are some key points to consider: + +Install new dependencies: Replace the Optimism SDK with `viem` in your project. + +```bash + pnpm remove @eth-optimism/sdk + pnpm add viem +``` + +* Update imports: Replace Optimism SDK imports with `viem` imports. +* Migrate SDK methods: Refactor your code to use equivalent `viem` methods. Refer to the viem documentation and opstack documentation for guidance. +* Test thoroughly: After migration, extensively test your application to ensure all functionality works as expected. + +### For chain operators + +Chain operators utilizing the SDK for cross-chain operations, bridging, or other functions should switch to the `viem` library. +The `viem` library offers more efficient methods to handle these operations. + +Chain operators should be aware of the following: + +* SDK removal: Remove any dependencies on the Optimism SDK in your infrastructure. +* Update tooling: Ensure all tools and scripts are updated to use `viem`. +* Monitor performance: After migration, closely monitor your chain's performance to ensure smooth operation. + +### For node operators + +Node operators will need to ensure that any scripts or services relying on the Optimism SDK are updated to use `viem` library. +These updates will help align with future improvements and scalability efforts across the OP Stack. + +Node operators should take the following steps: + +* Update node software: Ensure your node software is compatible with the latest `viem` libraries. +* Review configuration: Check and update any configuration files that may reference the Optimism SDK. +* Test thoroughly: Perform comprehensive testing in a staging environment before updating production nodes. + +### Need Help? + +For further assistance or questions about this migration, feel free to reach through the following channels: + +* Join our [community forum](https://community.optimism.io/) for discussions and support +* Connect with us on [Discord](https://discord.gg/optimism) for community support +* Open an [issue on our GitHub repository](https://github.com/ethereum-optimism/docs/issues) for documentation-related concerns diff --git a/pages/builders/tools/fee-calculator.mdx b/pages/builders/tools/fee-calculator.mdx index 5534d82f2..543b71598 100644 --- a/pages/builders/tools/fee-calculator.mdx +++ b/pages/builders/tools/fee-calculator.mdx @@ -1,18 +1,17 @@ --- title: Fjord Fee Parameter Calculator lang: en-US -description: Use the Fjord Fee Parameter Calculator to estimate and calculate fees for transactions on the Fjord network. +description: Use the Fjord Fee Parameter Calculator to estimate and calculate fees for transactions. --- import { ChainParametersForm } from '@/components/calculator/ChainParametersForm' # Fjord Fee Parameter Calculator -The Fjord Fee Parameter Calculator helps you estimate transaction fees on the Fjord network. Use this tool to: +The Fjord Fee Parameter Calculator helps you estimate transaction fees. Use this tool to: -Calculate potential fees for different transaction types -Understand how network parameters affect fee calculations -Plan your transactions more effectively +* Calculate potential fees for different transaction types. +* Understand how network parameters affect fee calculations. ## How to use the calculator diff --git a/pages/stack/opcm 2.mdx b/pages/stack/opcm 2.mdx new file mode 100644 index 000000000..49687acfb --- /dev/null +++ b/pages/stack/opcm 2.mdx @@ -0,0 +1,29 @@ +--- +title: OP Contracts Manager +lang: en-US +tags: ["opcm","eng-security"] +description: Learn how OP Contracts Manager deploys of the OP Stack with one transaction. +--- + +import { Callout, Tabs, Steps } from 'nextra/components' + +# OP Contracts Manager + +The OP Contracts Manager is a contract that deploys the L1 contracts for an OP Stack chain in a single transaction. It provides a minimal set of user-configurable parameters to ensure that the resulting chain meets the standard configuration requirements. + +The version deployed is always a governance-approved contract release. The set of governance approved contract releases can be found on the Optimism Monorepo releases page, and is the set of releases named `op-contracts/vX.Y.Z`. + +## Purpose + +OPCM simplifies the L1 contract deployments for new OP Stack chains. It addresses three aspects of deploying the OP Stack's L1 contracts: + +1. **Deploy Superchain Contracts.** Superchain contracts are shared between many OP chains, so this occurs only occasionally in production. +2. **Deploy Shared Implementation Contracts.** This occurs once per contracts release in production. +3. **Deploy OP Chain Contracts.** This occurs for every OP chain deployment in production. + +In a future iteration, it also is meant to handle upgrading the smart contracts. + +## Learn more + +* Checkout the [OPCM specs](https://specs.optimism.io/experimental/op-contracts-manager.html) +* Checkout the [OPCM design document](https://github.com/ethereum-optimism/design-docs/blob/main/protocol/op-contracts-manager-arch.md) From 9f99f1d7936a4ffbdd5f6fe1ab7bc2c81e6b7287 Mon Sep 17 00:00:00 2001 From: Hamdi Allam Date: Mon, 7 Oct 2024 13:14:15 -0400 Subject: [PATCH 129/565] fixes --- .../tools/build/account-abstraction.mdx | 4 ++ pages/stack/operators/features/op-txproxy.mdx | 65 ++++++++++--------- .../send-raw-transaction-conditional.mdx | 25 +++---- words.txt | 3 +- 4 files changed, 55 insertions(+), 42 deletions(-) diff --git a/pages/builders/tools/build/account-abstraction.mdx b/pages/builders/tools/build/account-abstraction.mdx index a7a3b730d..7cebf8eb5 100644 --- a/pages/builders/tools/build/account-abstraction.mdx +++ b/pages/builders/tools/build/account-abstraction.mdx @@ -25,6 +25,10 @@ The OP Stack includes support for the `eth_sendRawTransactionConditional` RPC me If enabled by the chain operator, also see the supplemental [op-txproxy](/stack/operators/features/op-txproxy) service, if applied, as this enforces request authentication for this method. + + As of today, this endpoint is not enabled by default in the stack. The operator must explicitly configure this. + + ## Superchain Paymaster The Superchain paymaster is an ERC-4337 verifying paymaster that sponsors transactions for smart accounts on the Superchain. Use the Superchain Paymaster to get your transactions sponsored to remove friction from your app experience. [View the implementation guide and tutorials here.](https://github.com/ethereum-optimism/ecosystem/tree/main/docs/superchain-paymaster) diff --git a/pages/stack/operators/features/op-txproxy.mdx b/pages/stack/operators/features/op-txproxy.mdx index e288d3746..cfb60e9ab 100644 --- a/pages/stack/operators/features/op-txproxy.mdx +++ b/pages/stack/operators/features/op-txproxy.mdx @@ -11,12 +11,12 @@ import { Callout, Steps } from 'nextra/components' A [passthrough proxy](https://github.com/ethereum-optimism/infra/tree/main/op-txproxy) for the execution engine endpoint. This proxy does not forward all rpc traffic and only exposes a specific set of methods. Operationally, the ingress router should only re-route request for these methods. - [proxyd](./proxyd) as an ingress router supports the mapping of specific methods to unique backends. + [proxyd](./proxyd) as an ingress router supports the mapping of specific methods to unique backends. ## Methods -### eth_sendRawTransactionConditional +### **eth_sendRawTransactionConditional** To safely expose this endpoint publicly, additional stateless constraints are applied to horizontally scale validation rules and preemptively reject conditional transactions prior to reaching the sequencer. @@ -28,8 +28,8 @@ The caller authenticates themselves with any valid ECDSA-secp256k1 key, like an With the signature and signing address, the request is authenticated under the `X-Optimism-Signature` header with the value `: `. -* Requests with missing a missing authentication header fail with the `-32003` (transaction rejected) json rpc error code. -* Requests with a mismatch in recovered signer and supplied public key will have the http request failed with status code `400 - Bad Request`. +* Requests with missing a missing authentication header fail with the `-32003` (transaction rejected) json rpc error code. +* Requests with a mismatch in recovered signer and supplied public key will have the http request failed with status code `400 - Bad Request`. As of today, no authorization policies are implemented on this endpoint. This has preemptively in place allow for new policies (allowlist, localized rate limits, etc) @@ -37,7 +37,7 @@ As of today, no authorization policies are implemented on this endpoint. This ha This service can be rolled with a flag/env switch to reject conditional transaction without needing to interrupt the execution engine. Useful in diagnosing issues. - `--sendRawTxConditional.enabled (default: true) ($OP_TXPROXY_SENDRAWTXCONDITIONAL_ENABLED)` +`--sendRawTxConditional.enabled (default: true) ($OP_TXPROXY_SENDRAWTXCONDITIONAL_ENABLED)` When disabled, requests will fail with the `-32003` (transaction rejected) json rpc error code with a message stating that the method is disabled. @@ -45,27 +45,29 @@ When disabled, requests will fail with the `-32003` (transaction rejected) json Even though the op-geth implementation of this endpoint includes rate limits, it is instead applied here to terminate these requests early. - `--sendRawTxConditional.ratelimit (default: 5000) ($OP_TXPROXY_SENDRAWTXCONDITIONAL_RATELIMIT)` +`--sendRawTxConditional.ratelimit (default: 5000) ($OP_TXPROXY_SENDRAWTXCONDITIONAL_RATELIMIT)` #### Stateless Validation -* Conditional cost is below the max -* Conditional values are valid (i.e min < max) -* Transaction target are only 4337 Entrypoint contracts + +* Conditional cost is below the max +* Conditional values are valid (i.e min \< max) +* Transaction target are only 4337 Entrypoint contracts - The motivating factor for this endpoint is to enable permissionless 4337 mempools, hence the restricted usage of this methods to just [Entrypoint](https://github.com/eth-infinitism/account-abstraction/blob/develop/contracts/core/EntryPoint.sol) transactions. + The motivating factor for this endpoint is to enable permissionless 4337 mempools, hence the restricted usage of this methods to just [Entrypoint](https://github.com/eth-infinitism/account-abstraction/blob/develop/contracts/core/EntryPoint.sol) transactions. - Please open up an issue if you'd like this restriction to be optional via configuration to broaden usage of this endpoint. + Please open up an issue if you'd like this restriction to be optional via configuration to broaden usage of this endpoint. When the request passes validation, it is passed through to the configured backend URL - `--sendRawTxConditional.backend ($OP_TXPROXY_SENDRAWTXCONDITIONAL_BACKENDS)` +`--sendRawTxConditional.backend ($OP_TXPROXY_SENDRAWTXCONDITIONAL_BACKENDS)` + - Per the [specification](/stack/protocol/features/send-raw-transaction-conditional), conditional transactions are not gossip'd between peers. Thus if you use replicas in an active/passive sequencer setup, this request must be broadcasted to all replicas. + Per the [specification](/stack/protocol/features/send-raw-transaction-conditional), conditional transactions are not gossip'd between peers. Thus if you use replicas in an active/passive sequencer setup, this request must be broadcasted to all replicas. - [proxyd](./proxyd) as an egress router for this method supports this broadcasting functionality. + [proxyd](./proxyd) as an egress router for this method supports this broadcasting functionality. ## How it works @@ -73,24 +75,27 @@ When the request passes validation, it is passed through to the configured backe To start using `op-txproxy`, follow these steps: - ### Build the Binary or Pull the Image - 1. Run the following command to build the binary - ```bash - make build - ``` - 2. This will build and output the binary under `/bin/op-txproxy`. + ### Build the Binary or Pull the Docker Image - The image for this binary is also available as a docker artifact (DOCS ON THE THE LINK FOR THIS). + 1. Run the following command to build the binary + ```bash + make build + ``` + 2. This will build and output the binary under `/bin/op-txproxy`. - ### Configure - The binary accepts configuration through cli flags which also settable via ENV variables. Either set the flags explicitly when starting the binary or set the environment variables of the host starting the proxy + The image for this binary is also available as a [docker artifact](https://us-docker.pkg.dev/oplabs-tools-artifacts/images/op-txproxy). - See [methods](#methods) on the configuration options available for each method. + ### Configure - ### Start - start the service with the following command - ```bash - op-txproxy // ... with flags if env variables are not set - ``` - + The binary accepts configuration through cli flags which also settable via ENV variables. Either set the flags explicitly when starting the binary or set the environment variables of the host starting the proxy + + See [methods](#methods) on the configuration options available for each method. + ### Start + + start the service with the following command + + ```bash + op-txproxy // ... with flags if env variables are not set + ``` + diff --git a/pages/stack/protocol/features/send-raw-transaction-conditional.mdx b/pages/stack/protocol/features/send-raw-transaction-conditional.mdx index f454980f8..ec1ae14d1 100644 --- a/pages/stack/protocol/features/send-raw-transaction-conditional.mdx +++ b/pages/stack/protocol/features/send-raw-transaction-conditional.mdx @@ -12,11 +12,12 @@ A sequencer rpc, `eth_sendRawTransactionConditional`, allowing callers to condit This feature is meant to unblock use cases that require atomic inclusion, otherwise possible on Ethereum through specialized block builders like Flashbots. Some examples: -* 4337 Bundlers utilizing a shared mempool of UserOperations. Reverted transactions due to conflicting UserOperations would make it too costly for bundlers to operate on L2, forcing the use of private mempools. +* 4337 Bundlers utilizing a shared mempool of UserOperations. Reverted transactions due to conflicting UserOperations would make it too costly for bundlers to operate on L2, forcing the use of private mempools. ## Specification This endpoint is an extension of `eth_sendRawTransaction`, with an extra parameter of "options" with the following structure: + ``` { "knownAccounts": [optional] A map of accounts with expected storage. The key is account address @@ -28,33 +29,35 @@ This endpoint is an extension of `eth_sendRawTransaction`, with an extra paramet "timestampMax": [optional] maximum block timestamp for inclusion } ``` -The "cost" of a given conditional is _approximately_ determined by the number of storage lookups that would be incurred by validating this conditional. There's a predefined max of `1000` that is allowed to prevent DoS. + +The "cost" of a given conditional is *approximately* determined by the number of storage lookups that would be incurred by validating this conditional. There's a predefined max of `1000` that is allowed to prevent DoS. - Since the sequencer is not compensated for the additional state checks, otherwise through the GAS of the transaction, a configured rate limit is applied to this cost. + Since the sequencer is not compensated for the additional state checks, otherwise through the GAS of the transaction, a configured rate limit is applied to this cost. - To also disincentive the use of this endpoint for MEV in comparison to `eth_sendRawTransaction`, the conditional is checked against the parent of the latest block. + To also disincentive the use of this endpoint for MEV in comparison to `eth_sendRawTransaction`, the conditional is checked against the parent of the latest block. This conditional is checked once at the RPC layer prior to mempool submission. If rejected against chain state, the RPC will return an error with the following spec -* error code `-32003` (transaction rejected) with a reason string as to the specific failed check -* error code `-32005` (conditional cost) with a reason string if the conditional cost exceeded the maximum OR the cost was rate limited due to network conditions. + +* error code `-32003` (transaction rejected) with a reason string as to the specific failed check +* error code `-32005` (conditional cost) with a reason string if the conditional cost exceeded the maximum OR the cost was rate limited due to network conditions. Successful submission does **NOT** guarantee inclusion! The caller must observe the chain for a receipt with some timeout to determine non-inclusion. The conditional is also re-checked in the block building phase to handle intra-block conflicts. - Conditional transactions are tied to the block builder they are submitted to. This means that these transactions **are not gossiped between configured peers!!!** + Conditional transactions are tied to the block builder they are submitted to. This means that these transactions **are not gossiped between configured peers!!!** - If you are running an active/passive setup with replicas that gossip txs to an active sequencer, this endpoint should be fronted by a proxy that can broadcast the request to all replicas. + If you are running an active/passive setup with replicas that gossip txs to an active sequencer, this endpoint should be fronted by a proxy that can broadcast the request to all replicas. ## How To Enable This feature can be enabled with the addition of a flag to op-geth. -* `--rollup.sequencertxconditionalenabled` (default: false) a boolean flag which enables the rpc. -* `--rollup.sequencertxconditionalcostratelimit` (default: 5000) an integer flag that sets the rate limit for cost observable per second. +* `--rollup.sequencertxconditionalenabled` (default: false) a boolean flag which enables the rpc. +* `--rollup.sequencertxconditionalcostratelimit` (default: 5000) an integer flag that sets the rate limit for cost observable per second. - It is not advised to publicly expose this sequencer endpoint due to DoS concerns. This supplemental proxy, [op-txproxy](/stack/operators/features/op-txproxy), should be used to apply additional constraints on this endpoint prior to passing through to the sequencer. + It is not advised to publicly expose this sequencer endpoint due to DoS concerns. This supplemental proxy, [op-txproxy](/stack/operators/features/op-txproxy), should be used to apply additional constraints on this endpoint prior to passing through to the sequencer. diff --git a/words.txt b/words.txt index 53e4d2a99..38f10aee6 100644 --- a/words.txt +++ b/words.txt @@ -104,6 +104,7 @@ farcaster FDLIMIT fdlimit featureset +Flashbots forkable forkchoice FPVM @@ -342,7 +343,6 @@ syncmode SYNCTARGET synctarget syscalls -Terraform therealbytes Thirdweb threadcreate @@ -355,6 +355,7 @@ txfeecap txmgr TXPOOL txpool +txproxy uncountered Unprotect unsubmitted From 490990a56bc748ddc5d77e86d803a0a2f1fc8159 Mon Sep 17 00:00:00 2001 From: krofax Date: Tue, 8 Oct 2024 13:01:21 +0100 Subject: [PATCH 130/565] updated codebase --- .../tutorials/cross-dom-bridge-eth.mdx | 35 +++++++++---------- public/tutorials/cross-dom-bridge-eth.js | 14 ++++---- 2 files changed, 23 insertions(+), 26 deletions(-) diff --git a/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx b/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx index 1bc426144..0bb01d1fe 100644 --- a/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx +++ b/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx @@ -154,14 +154,14 @@ Now that you have some ETH on L1 you can deposit that ETH into the `L1StandardBr Use `buildDepositTransaction` to build the deposit transaction parameters on the L2. - ```js file=/public/tutorials/cross-dom-bridge-eth.js#L44-L47 hash=3fa048a4ceb376c9f1c03a70f91fb757 + ```js file=/public/tutorials/cross-dom-bridge-eth.js#L44-L47 hash=01a8dadb00216636f18b72758236d4b0 ``` {

Send the deposit transaction

} Send the deposit transaction on L1 and log the L1 transaction hash. - ```js file=/public/tutorials/cross-dom-bridge-eth.js#L49-L50 hash=ffdd76699c90b7902f2ed32e9f1745c5 + ```js file=/public/tutorials/cross-dom-bridge-eth.js#L49-L50 hash=8f0963264c4ee8bf3a62a949557e99ec ``` {

Wait for L1 transaction

} @@ -176,20 +176,20 @@ Now that you have some ETH on L1 you can deposit that ETH into the `L1StandardBr Extracts the corresponding L2 transaction hash from the L1 receipt, and logs it. This hash represents the deposit transaction on L2. - ```js file=/public/tutorials/cross-dom-bridge-eth.js#L55-L56 hash=8e5c52e47b13dd35f7c810f336abde0f + ```js file=/public/tutorials/cross-dom-bridge-eth.js#L55-L56 hash=9754765e1f4963e14e35a6a0a11996c4 ``` {

Wait for the L2 transaction to be processed

} Wait for the L2 transaction to be processed and confirmed and logs the L2 receipt to verify completion. - ```js file=/public/tutorials/cross-dom-bridge-eth.js#L58-L66 hash=5e9457200ff987128995c5358ce8d9d6 + ```js file=/public/tutorials/cross-dom-bridge-eth.js#L58-L63 hash=357eede3fe4b79bbd160892cfee5d8ec ``` - ```js file=/public/tutorials/cross-dom-bridge-eth.js#L3-L63 hash=232cf05ee060649e00c59adc42273793 + ```js file=/public/tutorials/cross-dom-bridge-eth.js#L3-L63 hash=0001d0f9b4b9eec0f454b5f93872af83 ``` @@ -214,43 +214,40 @@ Now you're going to repeat the process in reverse to bridge some ETH from L2 to Uses `buildWithdrawalTransaction` to create the withdrawal parameters. Converts the withdrawal amount to `wei` and specifies the recipient on L1. - ```js file=/public/tutorials/cross-dom-bridge-eth.js#L67-L70 hash=0d53d4be7febd211bc3778182bd0f2d2 + ```js file=/public/tutorials/cross-dom-bridge-eth.js#L68-L72 hash=02315a1703631987498c2ac2684d6968 ``` {

Executing the Withdrawal

} This sends the withdrawal transaction on L2, which initiates the withdrawal process on L2 and logs a transaction hash for tracking the withdrawal. - ```js file=/public/tutorials/cross-dom-bridge-eth.js#L72-L73 hash=8ba1ce9c8aa350ec210ca9ab5b05d023 + ```js file=/public/tutorials/cross-dom-bridge-eth.js#L74-L75 hash=73cb8503308e5d3e0108546e9ceb2759 ``` {

Confirming L2 transaction

} Wait one hour (max) for the L2 Output containing the transaction to be proposed, and log the receipt, which contains important details like the block number etc. - ```js file=/public/tutorials/cross-dom-bridge-eth.js#L75-L76 hash=e035bd7ff449bc93fcdb4b71560ebd46 + ```js file=/public/tutorials/cross-dom-bridge-eth.js#L77-L78 hash=cdb89093825228f55bf9e02d61abca18 ``` {

Wait for withdrawal prove

} Next, is to prove to the bridge on L1 that the withdrawal happened on L2. To achieve that, you first need to wait until the withdrawal is ready to prove. - ```js file=/public/tutorials/cross-dom-bridge-eth.js#L78-L81 hash=abd2b8183255a07f99f18f6dfde074f9 + ```js file=/public/tutorials/cross-dom-bridge-eth.js#L80-L83 hash=615f93c3b9320b703b1c2bd5c5706830 ``` Build parameters to prove the withdrawal on the L2. - ```js file=/public/tutorials/cross-dom-bridge-eth.js#L83-L86 hash=6c2543f751540d03890ff2dda28d484d + ```js file=/public/tutorials/cross-dom-bridge-eth.js#L85-L88 hash=2bc88cda19bd39bfa89451906e4e1ae7 ``` {

Prove the withdrawal on the L1

} Once the withdrawal is ready to be proven, you'll send an L1 transaction to prove that the withdrawal happened on L2. - ```js file=/public/tutorials/cross-dom-bridge-eth.js#L88 hash=c0c97e22db5055def551d1cef15fb251 - ``` - - ```js file=/public/tutorials/cross-dom-bridge-eth.js#L90 hash=f2fc2ceee54d971a65a4b51fb6a56932 + ```js file=/public/tutorials/cross-dom-bridge-eth.js#L90-L92 hash=312b1d49267d75ec0475bc507ae9a742 ``` {

Wait for withdrawal finalization

} @@ -258,7 +255,7 @@ Now you're going to repeat the process in reverse to bridge some ETH from L2 to Before a withdrawal transaction can be finalized, you will need to wait for the finalization period. This can only happen after the fault proof period has elapsed. On OP Mainnet, this takes 7 days. - ```js file=/public/tutorials/cross-dom-bridge-eth.js#L92-L95 hash=5e45bc4dd71f532072ccd18f169522f0 + ```js file=/public/tutorials/cross-dom-bridge-eth.js#L94-L97 hash=15e6f754d2e9f11a03f400813efef383 ``` @@ -268,24 +265,24 @@ Now you're going to repeat the process in reverse to bridge some ETH from L2 to {

Finalize the withdrawal

} - ```js file=/public/tutorials/cross-dom-bridge-eth.js#L97-L100 hash=2834727afb41676e03a681a4275cecc8 + ```js file=/public/tutorials/cross-dom-bridge-eth.js#L99-L102 hash=02f0f111055d889d627785754e6935ae ``` {

Wait until the withdrawal is finalized

} - ```js file=/public/tutorials/cross-dom-bridge-eth.js#L102-L104 hash=a5c3e1901b5d2ce6079c606bece7da47 + ```js file=/public/tutorials/cross-dom-bridge-eth.js#L104-L106 hash=b3e63b66595ba34594c366e69a451abe ``` {

Check the withdrawal status

} - ```js file=/public/tutorials/cross-dom-bridge-eth.js#L106-L111 hash=0d98521df3b676e1e99b5f20d2d3b5bd + ```js file=/public/tutorials/cross-dom-bridge-eth.js#L108-L113 hash=d23afa6efca5573a71a1fe8e1205f997 ``` - ```js file=/public/tutorials/cross-dom-bridge-eth.js#L68-L111 hash=af4ef67a58e86cb4a9d284560944951a + ```js file=/public/tutorials/cross-dom-bridge-eth.js#L68-L111 hash=ef1391bdb1e52a1009df1ea86b617e17 ``` diff --git a/public/tutorials/cross-dom-bridge-eth.js b/public/tutorials/cross-dom-bridge-eth.js index 13e046def..4890742b2 100644 --- a/public/tutorials/cross-dom-bridge-eth.js +++ b/public/tutorials/cross-dom-bridge-eth.js @@ -41,22 +41,22 @@ console.log(`L1 Balance: ${formatEther(l1Balance)} ETH`); async function depositETH() { -const args = await publicClientL2.buildDepositTransaction({ +const depositArgs = await publicClientL2.buildDepositTransaction({ mint: parseEther("0.0001"), to: account.address, }); -const hash = await walletClientL1.depositTransaction(args); +const hash = await walletClientL1.depositTransaction(depositArgs); console.log(`Deposit transaction hash on L1: ${hash}`); const receipt = await publicClientL1.waitForTransactionReceipt({ hash }); console.log('L1 transaction confirmed:', receipt); -const l2Hashes = getL2TransactionHashes(receipt); -console.log(`Corresponding L2 transaction hash: ${l2Hashes}`); +const [l2Hash] = getL2TransactionHashes(receipt); +console.log(`Corresponding L2 transaction hash: ${l2Hash}`); const l2Receipt = await publicClientL2.waitForTransactionReceipt({ - hash: l2Hashes, + hash: l2Hash, }); console.log('L2 transaction confirmed:', l2Receipt); console.log('Deposit completed successfully!'); @@ -66,12 +66,12 @@ console.log('Deposit completed successfully!'); async function withdrawETH() { //Add the same imports used in DepositETH function -const args = await publicClientL2.buildWithdrawalTransaction({ +const withdrawalArgs = await publicClientL2.buildWithdrawalTransaction({ withdrawalAmount: parseEther("0.0001"), to: account.address, }); -const hash = await walletClientL2.initiateWithdrawal(args); +const hash = await walletClientL2.initiateWithdrawal(withdrawalArgs); console.log(`Withdrawal transaction hash on L2: ${hash}`); const receipt = await publicClientL2.waitForTransactionReceipt({ hash }); From 8c13e6e4a227913f03a7de024397ee1ace091d15 Mon Sep 17 00:00:00 2001 From: krofax Date: Tue, 8 Oct 2024 15:56:30 +0100 Subject: [PATCH 131/565] Update coderabbit instructions --- .coderabbit.yaml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.coderabbit.yaml b/.coderabbit.yaml index 7c55f0ea1..1d846c659 100644 --- a/.coderabbit.yaml +++ b/.coderabbit.yaml @@ -11,11 +11,13 @@ reviews: "ALWAYS review Markdown content THOROUGHLY with the following criteria: - Use proper nouns in place of personal pronouns like 'We' and 'Our' to maintain consistency in communal documentation. - Avoid gender-specific language and use the imperative form. - - Monitor capitalization for emphasis. Use **bold** for prominence instead of all caps or italics. + - Monitor capitalization for emphasis. Avoid using all caps, italics, or bold for emphasis. - Ensure proper nouns are capitalized in sentences. - Apply the Oxford comma. - Use proper title case for headers, buttons, tab names, page names, and links. Sentence case should be used for body content and short phrases, even in links. - Use correct spelling and grammar at all times (IMPORTANT). + - Use sentence case for H1, H2, and H3 headers, capitalizing only the first word and any proper nouns. + - For all headers (H1, H2, H3), do not change the capitalization of proper nouns; keep them as they are. " auto_review: enabled: true From ab85d31c08bad18292d2fa3aef00fb07bcaf0d97 Mon Sep 17 00:00:00 2001 From: Wazabie <48911235+Wazabie@users.noreply.github.com> Date: Tue, 8 Oct 2024 17:14:05 +0200 Subject: [PATCH 132/565] Update regenesis-history.mdx --- pages/builders/tools/monitor/regenesis-history.mdx | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) diff --git a/pages/builders/tools/monitor/regenesis-history.mdx b/pages/builders/tools/monitor/regenesis-history.mdx index c3e08c990..73a469f34 100644 --- a/pages/builders/tools/monitor/regenesis-history.mdx +++ b/pages/builders/tools/monitor/regenesis-history.mdx @@ -8,22 +8,12 @@ import { Callout, Steps } from 'nextra/components' # Accessing Pre-Regenesis History -This tutorial explains how to access transaction history between 23 June 2021 and the final regenesis using the Etherscan CSV exporting tool. +This tutorial explains how to access transaction history between 23 June 2021 and the final regenesis. Because of our final regenesis on 11 November 2021, older transactions are not part of the current blockchain and do not appear on [Etherscan](https://explorer.optimism.io/). -## Etherscan access - - - ### Browse to the [Optimism Explorer](https://explorer.optimism.io/exportDataMain). - - ### Select your address and the type of report you want. - - ![Etherscan data export page.](/img/op-mainnet/tools/export.png) - - ## Dune access -If none of the Etherscan CSV files contains the information you need, you can use a query on [Dune Analytics](https://dune.com), similar to [this query](https://dune.com/queries/354886?addr=%5Cx25E1c58040f27ECF20BBd4ca83a09290326896B3). +You can use a query on [Dune Analytics](https://dune.com), similar to [this query](https://dune.com/queries/354886?addr=%5Cx25E1c58040f27ECF20BBd4ca83a09290326896B3). You have to log on with a Dune account, but their free tier is sufficient. From 00eb114dbb40fff6dce16c6c0e139b46bd03ef8e Mon Sep 17 00:00:00 2001 From: soyboy Date: Tue, 8 Oct 2024 09:58:19 -0600 Subject: [PATCH 133/565] removing duplicate files --- .../chain-operators/tools/op-deployer 2.mdx | 127 ------------------ pages/stack/opcm 2.mdx | 29 ---- 2 files changed, 156 deletions(-) delete mode 100644 pages/builders/chain-operators/tools/op-deployer 2.mdx delete mode 100644 pages/stack/opcm 2.mdx diff --git a/pages/builders/chain-operators/tools/op-deployer 2.mdx b/pages/builders/chain-operators/tools/op-deployer 2.mdx deleted file mode 100644 index 4d8edb21b..000000000 --- a/pages/builders/chain-operators/tools/op-deployer 2.mdx +++ /dev/null @@ -1,127 +0,0 @@ ---- -title: Deployer -lang: en-US -tags: ["op-deployer","eng-platforms"] -description: Learn how op-deployer can simplify deployment of the OP Stack. ---- - -import {Callout, Steps} from 'nextra/components' - -# Deployer - -`op-deployer` simplifies the process of deploying the OP Stack. It works similarly to [Terraform](https://www.terraform.io). Like Terraform, you define a declarative config file called an "intent," then run a -command to apply the intent to your chain. `op-deployer` will compare the state of your chain against the intent, -and make whatever changes are necessary for them to match. - -## Installation - -`op-deployer` is currently under active development, and must be compiled from source. Assuming you have the Go -toolchain installed, you can install `op-deployer` by following these steps: - - - ### **Clone the Monorepo**: - - Run the following command to clone the monorepo: - - ```bash - git clone https://github.com/ethereum-optimism/optimism.git - ``` - - ### **Build the Binary**: - - Run the following commands to build the binary: - - ```bash - cd op-chain-ops - make op-deployer - ``` - - ### (Optional) Move `op-deployer` Into `$PATH` - - Run the following command to move the `op-deployer` binary into your `$PATH`. Note that the path for your system - may be different: - - ```bash - sudo mv ./bin/op-deployer /usr/local/bin/op-deployer - ``` - - -## Usage - -### Configuring your Chain - -To get started with `op-deployer`, you need to create an intent file that outlines your desired chain configuration. You can use the built-in `op-deployer` utility to generate this file. Just run the following command to create an example intent file for a development chain: - -``` -op-deployer init --l1-chain-id 11155111 --l2-chain-ids 12345 --workdir .deployer -``` - -This command will create a directory called `.deployer` in your current working directory containing the intent file -and an empty `state.json` file. `state.json` is populated with the results of your deployment, and never needs to -be edited directly. - -Your intent file will look something like this: - -```toml -l1ChainID = 11155111 # The chain ID of the L1 chain you'll be deploying to -fundDevAccounts = true # Whether or not to fund dev accounts using the test... junk mnemonic on L2. -contractsRelease = "op-contracts/v1.6.0" # The version of the smart contracts to deploy. - -# List of L2s to deploy. op-deployer can deploy multiple L2s at once -[[chains]] -# Your chain's ID, encoded as a 32-byte hex string -id = "0x0000000000000000000000000000000000000000000000000000000000003039" -# Various ownership roles for your chain. When you use op-deployer init, these roles are generated using the -# test... junk mnemonic. You should replace these with your own addresses for production chains. -[chains.roles] -proxyAdminOwner = "0x7759a8a43aa6a7ee9434ddb597beed64180c40fd" -systemConfigOwner = "0x8e35d9523a0c4c9ac537d254079c2398c6f3b35f" -governanceTokenOwner = "0x7759a8a43aa6a7ee9434ddb597beed64180c40fd" -unsafeBlockSigner = "0xbb19dce4ce51f353a98dbab31b5fa3bc80dc7769" -batcher = "0x0e9c62712ab826e06b16b2236ce542f711eaffaf" -proposer = "0x86dfafe0689e20685f7872e0cb264868454627bc" -challenger = "0xf1658da627dd0738c555f9572f658617511c49d5" -``` - -See the code comments above for explanations of each field. By default, `op-deployer` will fill in all other configuration variables -with those that match our standard config. You can override these defaults by adding them to your intent file, but -that won't be covered here. - -### Applying your Intent - -Now that you've created your intent file, you can apply it to your chain: - -``` -op-deployer apply --workdir .deployer --l1-rpc-url --private-key -``` - -Hardware wallets are not supported, but you can use ephemeral hot wallets since this deployer key has no privileges. - -This command will deploy the OP Stack to L1. It will deploy all L2s specified in the intent file. Superchain -configuration will be set to the Superchain-wide defaults - i.e., your chain will be opted into the [Superchain pause](https://specs.optimism.io/protocol/superchain-configuration.html#pausability) -and will use the same [protocol versions](https://github.com/ethereum-optimism/specs/blob/main/specs/protocol/superchain-upgrades.md) -address as other chains on the Superchain. - -### Generating Genesis Files - -With the contracts deployed, you can generate a genesis file for any of your L2s. Run the following command to do so: - -``` -./bin/op-deployer inspect genesis --outfile genesis.json -``` - -This will write the genesis file to `genesis.json`. You can change the `--outfile` parameter to write it somewhere -else. You can run another member of the `inspect` family, `rollup`, to get the `rollup.json` file: - -``` -./bin/op-deployer inspect rollup --outfile rollup.json -``` - -## More Information - -`op-deployer` uses the OP Contracts Manager (OPCM) under the hood to deploy contracts. - -## Next Steps - -* For more details, check out the tool and documentation in the [op-deployer repository](https://github.com/ethereum-optimism/optimism/tree/develop/op-chain-ops/cmd/op-deployer). -* For more information on OP Contracts Manager, refer to the [OPCM documentation](/stack/opcm). diff --git a/pages/stack/opcm 2.mdx b/pages/stack/opcm 2.mdx deleted file mode 100644 index 49687acfb..000000000 --- a/pages/stack/opcm 2.mdx +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: OP Contracts Manager -lang: en-US -tags: ["opcm","eng-security"] -description: Learn how OP Contracts Manager deploys of the OP Stack with one transaction. ---- - -import { Callout, Tabs, Steps } from 'nextra/components' - -# OP Contracts Manager - -The OP Contracts Manager is a contract that deploys the L1 contracts for an OP Stack chain in a single transaction. It provides a minimal set of user-configurable parameters to ensure that the resulting chain meets the standard configuration requirements. - -The version deployed is always a governance-approved contract release. The set of governance approved contract releases can be found on the Optimism Monorepo releases page, and is the set of releases named `op-contracts/vX.Y.Z`. - -## Purpose - -OPCM simplifies the L1 contract deployments for new OP Stack chains. It addresses three aspects of deploying the OP Stack's L1 contracts: - -1. **Deploy Superchain Contracts.** Superchain contracts are shared between many OP chains, so this occurs only occasionally in production. -2. **Deploy Shared Implementation Contracts.** This occurs once per contracts release in production. -3. **Deploy OP Chain Contracts.** This occurs for every OP chain deployment in production. - -In a future iteration, it also is meant to handle upgrading the smart contracts. - -## Learn more - -* Checkout the [OPCM specs](https://specs.optimism.io/experimental/op-contracts-manager.html) -* Checkout the [OPCM design document](https://github.com/ethereum-optimism/design-docs/blob/main/protocol/op-contracts-manager-arch.md) From c0466208127e0d203fe6dffcf66706405fa30c07 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A1n=20Jakub=20Nani=C5=A1ta?= Date: Tue, 8 Oct 2024 15:59:40 -0700 Subject: [PATCH 134/565] Update overview.mdx --- pages/builders/chain-operators/deploy/overview.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/builders/chain-operators/deploy/overview.mdx b/pages/builders/chain-operators/deploy/overview.mdx index d5f3f004c..d6ce3695d 100644 --- a/pages/builders/chain-operators/deploy/overview.mdx +++ b/pages/builders/chain-operators/deploy/overview.mdx @@ -56,7 +56,7 @@ client exist, including `op-geth` (maintained by Optimism Foundation), The Batcher is a service that publishes transactions from the Rollup to the L1 blockchain. The Batcher runs continuously alongside the Sequencer and publishes -The Batcher continuously publishes transactions alongside the Sequencer in regular batches. +transactions in regular batches. ## Proposer From f8b9ca6684118dd8c9fd8897a0057c6a1ee62ea8 Mon Sep 17 00:00:00 2001 From: Bradley Camacho <42678939+bradleycamacho@users.noreply.github.com> Date: Tue, 8 Oct 2024 17:09:37 -0700 Subject: [PATCH 135/565] Edit SuperchainERC20 consistency --- pages/stack/protocol/interop/explainer.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/stack/protocol/interop/explainer.mdx b/pages/stack/protocol/interop/explainer.mdx index 34300c465..284420bb0 100644 --- a/pages/stack/protocol/interop/explainer.mdx +++ b/pages/stack/protocol/interop/explainer.mdx @@ -25,7 +25,7 @@ Native OP Stack interoperability provides the ability to read messages and trans Superchain interop includes both the protocol layer message passing and the Superchain ERC20 token specification. * **Message passing protocol:** the initial + finalizing/executing [message](https://specs.optimism.io/interop/messaging.html) that fire events to be consumed by the chains in the [dependency set](https://specs.optimism.io/interop/dependency-set.html) -* **SupERC20 token specification**: the [SuperchainERC20](https://specs.optimism.io/interop/token-bridging.html) turns message passing into asset transfer between chains in the interop set +* **SuperchainERC20 token specification**: the [SuperchainERC20](https://specs.optimism.io/interop/token-bridging.html) turns message passing into asset transfer between chains in the interop set This means ETH and ERC-20s can seamlessly and securely move across L2s, and intent-based protocols (i.e., bridges) can build better experiences on top of the message passing protocol. From 6db90ced552eae3a93bdb44d83e30891ca4bf6e6 Mon Sep 17 00:00:00 2001 From: DannyThomx Date: Wed, 9 Oct 2024 10:47:56 +0200 Subject: [PATCH 136/565] scoped fjordd calculator table css styles --- styles/calculator.css | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/styles/calculator.css b/styles/calculator.css index eee6440db..bb5af961b 100644 --- a/styles/calculator.css +++ b/styles/calculator.css @@ -101,31 +101,31 @@ select.calculator-select :focus { color: var(--op-neutral-700) } -table { +.calculator-results-wrap table { width: 100%; border-collapse: collapse; margin-bottom: 40px; } -th, -td { +.calculator-results-wrap th, +.calculator-results-wrap td { border: 1px solid var(--op-red-200); padding: 8px; text-align: left; } -thead .sub-header { +.calculator-results-wrap thead .sub-header { background-color: var(--op-red-600) !important; color: var(--op-neutral-0); } -tbody tr td, -thead tr:nth-of-type(2) th { +.calculator-results-wrap tbody tr td, +.calculator-results-wrap thead tr:nth-of-type(2) th { text-align: center; } -tbody tr td:first-of-type, -thead tr:nth-of-type(2) th:first-of-type { +.calculator-results-wrap tbody tr td:first-of-type, +.calculator-results-wrap thead tr:nth-of-type(2) th:first-of-type { text-align: right; } @@ -135,7 +135,7 @@ div.calculator-results-wrap .results-container .results-table-wrap tbody { font-weight: 700; } -thead th[colspan="2"] { +.calculator-results-wrap thead th[colspan="2"] { text-align: right; } From 08ebdd50cc928db70190b6ac3af7692c7cb7978c Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Wed, 9 Oct 2024 12:42:12 +0100 Subject: [PATCH 137/565] update file imports --- .../tutorials/cross-dom-bridge-eth.mdx | 18 +++++++++--------- public/tutorials/cross-dom-bridge-eth.js | 18 +++++++++--------- 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx b/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx index 0bb01d1fe..5345d9b5b 100644 --- a/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx +++ b/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx @@ -161,14 +161,14 @@ Now that you have some ETH on L1 you can deposit that ETH into the `L1StandardBr Send the deposit transaction on L1 and log the L1 transaction hash. - ```js file=/public/tutorials/cross-dom-bridge-eth.js#L49-L50 hash=8f0963264c4ee8bf3a62a949557e99ec + ```js file=/public/tutorials/cross-dom-bridge-eth.js#L49-L50 hash=b244b4b898056b84811822273a5fc7cb ``` {

Wait for L1 transaction

} Wait for the L1 transaction to be processed and log the receipt. - ```js file=/public/tutorials/cross-dom-bridge-eth.js#L52-L53 hash=8b97cc531e04896161a062c23f9de9dc + ```js file=/public/tutorials/cross-dom-bridge-eth.js#L52-L53 hash=d2a616afac321edbb2ec4b7592464ea4 ``` {

Extract the L2 transaction hash

} @@ -183,13 +183,13 @@ Now that you have some ETH on L1 you can deposit that ETH into the `L1StandardBr Wait for the L2 transaction to be processed and confirmed and logs the L2 receipt to verify completion. - ```js file=/public/tutorials/cross-dom-bridge-eth.js#L58-L63 hash=357eede3fe4b79bbd160892cfee5d8ec + ```js file=/public/tutorials/cross-dom-bridge-eth.js#L58-L62 hash=4ab7fdff1700699951ced567db6d4710 ```
- ```js file=/public/tutorials/cross-dom-bridge-eth.js#L3-L63 hash=0001d0f9b4b9eec0f454b5f93872af83 + ```js file=/public/tutorials/cross-dom-bridge-eth.js#L3-L63 hash=f83a4b9d811a275e3c182524e88a733b ``` @@ -221,21 +221,21 @@ Now you're going to repeat the process in reverse to bridge some ETH from L2 to This sends the withdrawal transaction on L2, which initiates the withdrawal process on L2 and logs a transaction hash for tracking the withdrawal. - ```js file=/public/tutorials/cross-dom-bridge-eth.js#L74-L75 hash=73cb8503308e5d3e0108546e9ceb2759 + ```js file=/public/tutorials/cross-dom-bridge-eth.js#L74-L75 hash=e5f3d46ba9f417fddfa4b861f3f6f208 ``` {

Confirming L2 transaction

} Wait one hour (max) for the L2 Output containing the transaction to be proposed, and log the receipt, which contains important details like the block number etc. - ```js file=/public/tutorials/cross-dom-bridge-eth.js#L77-L78 hash=cdb89093825228f55bf9e02d61abca18 + ```js file=/public/tutorials/cross-dom-bridge-eth.js#L77-L78 hash=3851af1dc0c3dba9d9de818fb02364e3 ``` {

Wait for withdrawal prove

} Next, is to prove to the bridge on L1 that the withdrawal happened on L2. To achieve that, you first need to wait until the withdrawal is ready to prove. - ```js file=/public/tutorials/cross-dom-bridge-eth.js#L80-L83 hash=615f93c3b9320b703b1c2bd5c5706830 + ```js file=/public/tutorials/cross-dom-bridge-eth.js#L80-L83 hash=c1c63ecb4c7f47bc2779fedabb5f70ab ``` Build parameters to prove the withdrawal on the L2. @@ -275,14 +275,14 @@ Now you're going to repeat the process in reverse to bridge some ETH from L2 to {

Check the withdrawal status

} - ```js file=/public/tutorials/cross-dom-bridge-eth.js#L108-L113 hash=d23afa6efca5573a71a1fe8e1205f997 + ```js file=/public/tutorials/cross-dom-bridge-eth.js#L108-L112 hash=3bd3e14a6c32270cc75d6b691e7b0c91 ``` - ```js file=/public/tutorials/cross-dom-bridge-eth.js#L68-L111 hash=ef1391bdb1e52a1009df1ea86b617e17 + ```js file=/public/tutorials/cross-dom-bridge-eth.js#L68-L111 hash=cd8d5c4858141d43b519cd7267cd89a9 ``` diff --git a/public/tutorials/cross-dom-bridge-eth.js b/public/tutorials/cross-dom-bridge-eth.js index 4890742b2..5172152d5 100644 --- a/public/tutorials/cross-dom-bridge-eth.js +++ b/public/tutorials/cross-dom-bridge-eth.js @@ -46,10 +46,10 @@ const depositArgs = await publicClientL2.buildDepositTransaction({ to: account.address, }); -const hash = await walletClientL1.depositTransaction(depositArgs); -console.log(`Deposit transaction hash on L1: ${hash}`); +const Deposithash = await walletClientL1.depositTransaction(depositArgs); +console.log(`Deposit transaction hash on L1: ${Deposithash}`); -const receipt = await publicClientL1.waitForTransactionReceipt({ hash }); +const receipt = await publicClientL1.waitForTransactionReceipt({ Deposithash }); console.log('L1 transaction confirmed:', receipt); const [l2Hash] = getL2TransactionHashes(receipt); @@ -57,7 +57,7 @@ console.log(`Corresponding L2 transaction hash: ${l2Hash}`); const l2Receipt = await publicClientL2.waitForTransactionReceipt({ hash: l2Hash, -}); +}); console.log('L2 transaction confirmed:', l2Receipt); console.log('Deposit completed successfully!'); } @@ -71,14 +71,14 @@ withdrawalAmount: parseEther("0.0001"), to: account.address, }); -const hash = await walletClientL2.initiateWithdrawal(withdrawalArgs); -console.log(`Withdrawal transaction hash on L2: ${hash}`); +const withdrawalHash = await walletClientL2.initiateWithdrawal(withdrawalArgs); +console.log(`Withdrawal transaction hash on L2: ${withdrawalHash}`); -const receipt = await publicClientL2.waitForTransactionReceipt({ hash }); -console.log('L2 transaction confirmed:', receipt); +const withdrawalReceipt = await publicClientL2.waitForTransactionReceipt({ withdrawalHash }); +console.log('L2 transaction confirmed:', withdrawalReceipt); const { output, withdrawal } = await publicClientL1.waitToProve({ -receipt, +withdrawalReceipt, targetChain: walletClientL2.chain }); From 0a9f6bb0c89da62b0b478b3a86033bcf3048bbb6 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Wed, 9 Oct 2024 13:07:27 +0100 Subject: [PATCH 138/565] update variable name --- public/tutorials/cross-dom-bridge-eth.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/public/tutorials/cross-dom-bridge-eth.js b/public/tutorials/cross-dom-bridge-eth.js index 5172152d5..cdde1697b 100644 --- a/public/tutorials/cross-dom-bridge-eth.js +++ b/public/tutorials/cross-dom-bridge-eth.js @@ -46,13 +46,13 @@ const depositArgs = await publicClientL2.buildDepositTransaction({ to: account.address, }); -const Deposithash = await walletClientL1.depositTransaction(depositArgs); -console.log(`Deposit transaction hash on L1: ${Deposithash}`); +const depositHash = await walletClientL1.depositTransaction(depositArgs); +console.log(`Deposit transaction hash on L1: ${depositHash}`); -const receipt = await publicClientL1.waitForTransactionReceipt({ Deposithash }); -console.log('L1 transaction confirmed:', receipt); +const depositReceipt = await publicClientL1.waitForTransactionReceipt({ depositHash }); +console.log('L1 transaction confirmed:', depositReceipt); -const [l2Hash] = getL2TransactionHashes(receipt); +const [l2Hash] = getL2TransactionHashes(depositReceipt); console.log(`Corresponding L2 transaction hash: ${l2Hash}`); const l2Receipt = await publicClientL2.waitForTransactionReceipt({ From 311993b83a715809a427d9ed40214aa531d08f5c Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Wed, 9 Oct 2024 13:17:19 +0100 Subject: [PATCH 139/565] updated file import --- .../app-developers/tutorials/cross-dom-bridge-eth.mdx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx b/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx index 5345d9b5b..40f13af05 100644 --- a/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx +++ b/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx @@ -161,14 +161,14 @@ Now that you have some ETH on L1 you can deposit that ETH into the `L1StandardBr Send the deposit transaction on L1 and log the L1 transaction hash. - ```js file=/public/tutorials/cross-dom-bridge-eth.js#L49-L50 hash=b244b4b898056b84811822273a5fc7cb + ```js file=/public/tutorials/cross-dom-bridge-eth.js#L49-L50 hash=6c47f29f428cc4c7f6d4ad322e4feaec ``` {

Wait for L1 transaction

} Wait for the L1 transaction to be processed and log the receipt. - ```js file=/public/tutorials/cross-dom-bridge-eth.js#L52-L53 hash=d2a616afac321edbb2ec4b7592464ea4 + ```js file=/public/tutorials/cross-dom-bridge-eth.js#L52-L53 hash=0de1fe6dd17f753ab80d356b38d9ca41 ``` {

Extract the L2 transaction hash

} @@ -176,7 +176,7 @@ Now that you have some ETH on L1 you can deposit that ETH into the `L1StandardBr Extracts the corresponding L2 transaction hash from the L1 receipt, and logs it. This hash represents the deposit transaction on L2. - ```js file=/public/tutorials/cross-dom-bridge-eth.js#L55-L56 hash=9754765e1f4963e14e35a6a0a11996c4 + ```js file=/public/tutorials/cross-dom-bridge-eth.js#L55-L56 hash=07a053f25193bcfcb9dae397091d755a ``` {

Wait for the L2 transaction to be processed

} @@ -189,7 +189,7 @@ Now that you have some ETH on L1 you can deposit that ETH into the `L1StandardBr - ```js file=/public/tutorials/cross-dom-bridge-eth.js#L3-L63 hash=f83a4b9d811a275e3c182524e88a733b + ```js file=/public/tutorials/cross-dom-bridge-eth.js#L3-L63 hash=b7d72a54dcdbb9b89c6874e2862fde00 ``` From b2e43685869f3792f5ba8f614af8897a19394336 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Wed, 9 Oct 2024 13:24:08 +0100 Subject: [PATCH 140/565] stage changes --- pnpm-lock.yaml | 7 ------- 1 file changed, 7 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 14e02a2a8..36f7e7a0f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -4650,14 +4650,7 @@ snapshots: '@noble/hashes': 1.3.3 '@scure/base': 1.1.6 -<<<<<<< HEAD - '@scure/bip39@1.4.0': - dependencies: - '@noble/hashes': 1.5.0 - '@scure/base': 1.1.9 -======= '@swc/counter@0.1.3': {} ->>>>>>> d2d71fb149f31b6932fc6f35c25759a5fbe6e5d0 '@swc/helpers@0.5.2': dependencies: From c522cb4aff6238005b065dcf451ca63845630c7a Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Wed, 9 Oct 2024 14:41:46 +0100 Subject: [PATCH 141/565] Updated coderabbit rules --- .coderabbit.yaml | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/.coderabbit.yaml b/.coderabbit.yaml index 1d846c659..f5659debb 100644 --- a/.coderabbit.yaml +++ b/.coderabbit.yaml @@ -14,10 +14,14 @@ reviews: - Monitor capitalization for emphasis. Avoid using all caps, italics, or bold for emphasis. - Ensure proper nouns are capitalized in sentences. - Apply the Oxford comma. - - Use proper title case for headers, buttons, tab names, page names, and links. Sentence case should be used for body content and short phrases, even in links. + - Use proper title case for buttons, tab names, page names, and links. Sentence case should be used for body content and short phrases, even in links. - Use correct spelling and grammar at all times (IMPORTANT). - - Use sentence case for H1, H2, and H3 headers, capitalizing only the first word and any proper nouns. - - For all headers (H1, H2, H3), do not change the capitalization of proper nouns; keep them as they are. + - For H1, H2, and H3 headers: + 1. Use sentence case, capitalizing only the first word. + 2. Preserve the capitalization of proper nouns, technical terms, and acronyms. Examples include 'Optimism', 'OP Mainnet', 'Ethereum', 'JavaScript', 'NFT', etc. + 3. Do not automatically lowercase words that might be proper nouns or technical terms. + - Flag any headers that seem to inconsistently apply these rules for manual review. + - Refer to a predefined list of proper nouns and technical terms specific to the project, which should be kept capitalized regardless of their position in the header. " auto_review: enabled: true From f68d1bd6012a5205999247c2f013bd27b2c81c12 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Wed, 9 Oct 2024 14:54:42 +0100 Subject: [PATCH 142/565] update the rules and added a list --- .coderabbit.yaml | 6 +++--- nouns.txt | 20 ++++++++++++++++++++ 2 files changed, 23 insertions(+), 3 deletions(-) create mode 100644 nouns.txt diff --git a/.coderabbit.yaml b/.coderabbit.yaml index f5659debb..4bb0d0a94 100644 --- a/.coderabbit.yaml +++ b/.coderabbit.yaml @@ -18,10 +18,10 @@ reviews: - Use correct spelling and grammar at all times (IMPORTANT). - For H1, H2, and H3 headers: 1. Use sentence case, capitalizing only the first word. - 2. Preserve the capitalization of proper nouns, technical terms, and acronyms. Examples include 'Optimism', 'OP Mainnet', 'Ethereum', 'JavaScript', 'NFT', etc. - 3. Do not automatically lowercase words that might be proper nouns or technical terms. + 2. Preserve the capitalization of proper nouns, technical terms, and acronyms as defined in the 'nouns.txt' file located in the root directory of the project. + 3. Do not automatically lowercase words that appear in the 'nouns.txt' file, regardless of their position in the header. - Flag any headers that seem to inconsistently apply these rules for manual review. - - Refer to a predefined list of proper nouns and technical terms specific to the project, which should be kept capitalized regardless of their position in the header. + - When reviewing capitalization, always refer to the 'nouns.txt' file for the correct capitalization of proper nouns and technical terms specific to the project. " auto_review: enabled: true diff --git a/nouns.txt b/nouns.txt new file mode 100644 index 000000000..17280947d --- /dev/null +++ b/nouns.txt @@ -0,0 +1,20 @@ +Optimism +OP Mainnet +Ethereum +JavaScript +NFT +Web3 +DeFi +DAO +EVM +Layer 2 +L2 +Rollup +Smart Contract +Blockchain +Cryptocurrency +Token +Wallet +dApp +Gas Fee +MetaMask \ No newline at end of file From 4328376b8b65cc8143d6a24f798b35b0e4a0e055 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Wed, 9 Oct 2024 21:38:31 +0100 Subject: [PATCH 143/565] updated codebase --- .../tutorials/send-tx-from-eth.mdx | 75 ++--------- public/tutorials/send-tx-from-eth.js | 120 ++++++++++-------- 2 files changed, 75 insertions(+), 120 deletions(-) diff --git a/pages/builders/app-developers/tutorials/send-tx-from-eth.mdx b/pages/builders/app-developers/tutorials/send-tx-from-eth.mdx index 492712ea2..022ebd92d 100644 --- a/pages/builders/app-developers/tutorials/send-tx-from-eth.mdx +++ b/pages/builders/app-developers/tutorials/send-tx-from-eth.mdx @@ -89,9 +89,7 @@ You need to import some dependencies into your Node REPL session. {

Import Viem

} -```js -const { createPublicClient, createWalletClient, http, parseEther, formatEther } = require('viem'); -const { optimismSepolia, sepolia } = require('viem/chains'); +```js file=/public/tutorials/send-tx-from-eth.js#L3-L5 hash=7a906fc04fa87f91fc33049240e8e0f8 ``` @@ -104,17 +102,12 @@ You'll need a few variables throughout this tutorial. Let's set those up now. {

Load your private key

} -```js -const privateKey = process.env.TUTORIAL_PRIVATE_KEY; +```js file=/public/tutorials/send-tx-from-eth.js#L7-L8 hash=46ba01375a5d8844b2315f0e579dfac3 ``` {

Create the RPC providers and wallets

} -```js -const l1PublicClient = createPublicClient({ chain: sepolia, transport: http("https://rpc.ankr.com/eth_sepolia") }); -const l2PublicClient = createPublicClient({ chain: optimismSepolia, transport: http("https://sepolia.optimism.io") }); -const l1WalletClient = createWalletClient({ chain: sepolia, transport: http("https://rpc.ankr.com/eth_sepolia") }); -const l2WalletClient = createWalletClient({ chain: optimismSepolia, transport: http("https://sepolia.optimism.io") }); +```js file=/public/tutorials/send-tx-from-eth.js#L10-L13 hash=a364c906d788d0614588c8db059cfcca ``` @@ -123,10 +116,7 @@ const l2WalletClient = createWalletClient({ chain: optimismSepolia, transport: h You'll be sending a small amount of ETH as part of this tutorial. Quickly check your balance on OP Sepolia so that you know how much you had at the start of the tutorial. -```js -const address = await l2WalletClient.account.address; -const initialBalance = await l2PublicClient.getBalance({ address }); -console.log(`Initial balance: ${formatEther(initialBalance)} ETH`); +```js file=/public/tutorials/send-tx-from-eth.js#L15-L17 hash=5b95f18440ad72b6200ed7b5df00ca8f ``` ## Trigger the Transaction @@ -137,74 +127,35 @@ Now you'll use the `OptimismPortal` contract to trigger a transaction on OP Sepo {

Create the OptimismPortal object

} -```js -const optimismPortalAbi = [ - { - inputs: [ - { internalType: 'uint256', name: '_gasLimit', type: 'uint256' }, - { internalType: 'bytes', name: '_data', type: 'bytes' }, - ], - name: 'depositTransaction', - outputs: [], - stateMutability: 'payable', - type: 'function', - }, -]; - -const optimismPortalAddress = '0x16fc5058f25648194471939df75cf27a2fdc48bc'; +```js file=/public/tutorials/send-tx-from-eth.js#L19-L30 hash=bb10ed96a0eed859d491afc1929001ce ``` {

Estimate the required gas

} When sending transactions via the `OptimismPortal` contract it's important to always include a gas buffer. This is because the `OptimismPortal` charges a variable amount of gas depending on the current demand for L2 transactions triggered via L1. If you do not include a gas buffer, your transactions may fail. -```js -const gasLimit = 100000n; -const data = '0x'; -const value = parseEther('0.000001'); - -const gasEstimate = await l1PublicClient.estimateContractGas({ - address: optimismPortalAddress, - abi: optimismPortalAbi, - functionName: 'depositTransaction', - args: [gasLimit, data], - value, -}); +```js file=/public/tutorials/send-tx-from-eth.js#L32-L43 hash=ae495cba1a72841059a32edaf20f854d ``` {

Send the transaction

} Now you'll send the transaction. Note that you are including a buffer of 20% on top of the gas estimate. -```js -const { hash: l1TxHash } = await l1WalletClient.writeContract({ - address: optimismPortalAddress, - abi: optimismPortalAbi, - functionName: 'depositTransaction', - args: [gasLimit, data], - value, - gas: gasEstimate * 120n / 100n, // 20% buffer -}); - -console.log(`L1 transaction hash: ${l1TxHash}`); +```js file=/public/tutorials/send-tx-from-eth.js#L45-L54 hash=6fb0ba06fb29be7ee2c945fca75a50f4 ``` {

Wait for the L1 transaction

} First you'll need to wait for the L1 transaction to be mined. -```js -const l1Receipt = await l1PublicClient.waitForTransactionReceipt({ hash: l1TxHash }); +```js file=/public/tutorials/send-tx-from-eth.js#L56 hash=3c0301f8a9ca78bd8bfbff6aef807c77 ``` {

Wait for the L2 transaction

} Now you'll need to wait for the corresponding L2 transaction to be included in a block. This transaction is automatically created as a result of your L1 transaction. Here you'll determine the hash of the L2 transaction and then wait for that transaction to be included in the L2 blockchain. -```js -const l2TxHash = l1Receipt.logs[0].topics[1]; -const l2Receipt = await l2PublicClient.waitForTransactionReceipt({ hash: l2TxHash }); -console.log(`L2 transaction hash: ${l2TxHash}`); +```js file=/public/tutorials/send-tx-from-eth.js#L58-L60 hash=cdd456e54b0f8507f96365dae05b8856 ``` @@ -213,16 +164,12 @@ console.log(`L2 transaction hash: ${l2TxHash}`); You should have a little less ETH on OP Sepolia now. Check your balance to confirm. -```js -const finalBalance = await l2PublicClient.getBalance({ address }); -console.log(`Final balance: ${formatEther(finalBalance)} ETH`); +```js file=/public/tutorials/send-tx-from-eth.js#L62-L63 hash=7cac2670afeb0fcc88346bc59b90466c ``` Make sure that the difference is equal to the amount you were expecting to send. -```js -const difference = initialBalance - finalBalance; -console.log(`Difference: ${formatEther(difference)} ETH`); +```js file=/public/tutorials/send-tx-from-eth.js#L65-L66 hash=e2ef73867c6d755ca89b9d3381522208 ``` ## Next Steps diff --git a/public/tutorials/send-tx-from-eth.js b/public/tutorials/send-tx-from-eth.js index 9666aeb07..c2921b837 100644 --- a/public/tutorials/send-tx-from-eth.js +++ b/public/tutorials/send-tx-from-eth.js @@ -1,60 +1,68 @@ (async () => { -const contracts = require("@eth-optimism/contracts-ts") -const utils = require("@eth-optimism/core-utils") -const ethers = require("ethers") - -const privateKey = process.env.TUTORIAL_PRIVATE_KEY - -const l1Provider = new ethers.providers.StaticJsonRpcProvider("https://rpc.ankr.com/eth_sepolia") -const l2Provider = new ethers.providers.StaticJsonRpcProvider("https://sepolia.optimism.io") -const l1Wallet = new ethers.Wallet(privateKey, l1Provider) -const l2Wallet = new ethers.Wallet(privateKey, l2Provider) - -console.log('Initial balance:') -const initialBalance = await l2Wallet.getBalance() -console.log(ethers.utils.formatEther(initialBalance)) - -const OptimismPortal = new ethers.Contract( - '0x16Fc5058F25648194471939df75CF27A2fdC48BC', - contracts.optimismPortalABI, - l1Wallet, -) - -console.log('Estimating L1 transaction gas...') -const gas = await OptimismPortal.estimateGas.depositTransaction( - '0x1000000000000000000000000000000000000000', // _to - ethers.utils.parseEther('0.000069420'), // _value - 1e6, // _gasLimit - false, // _isCreation - '0x', // _data -) - -console.log('Sending L1 transaction...') -const tx = await OptimismPortal.depositTransaction( - '0x1000000000000000000000000000000000000000', // _to - ethers.utils.parseEther('0.000069420'), // _value - 1e6, // _gasLimit - false, // _isCreation - '0x', // _data - { - gasLimit: gas.mul(120).div(100) // Add 20% buffer - } -) - -console.log('Waiting for L1 transaction...') -const receipt = await tx.wait() - -console.log('Waiting for L2 transaction to be relayed...') -const deposit = utils.DepositTx.fromL1Receipt(receipt, 0) -await l2Provider.waitForTransaction(deposit.hash()) - -console.log('Final balance:') -const finalBalance = await l2Wallet.getBalance() -console.log(ethers.utils.formatEther(finalBalance)) - -console.log('Difference:') -const difference = initialBalance.sub(finalBalance) -console.log(ethers.utils.formatEther(difference)) + const { createPublicClient, createWalletClient, http, parseEther, formatEther } = require('viem'); + const { optimismSepolia, sepolia } = require('viem/chains'); + const { privateKeyToAccount } = require('viem/accounts'); + + const privateKey = process.env.TUTORIAL_PRIVATE_KEY; + const account = privateKeyToAccount(privateKey); + + const l1PublicClient = createPublicClient({ chain: sepolia, transport: http("https://rpc.ankr.com/eth_sepolia") }).extend(publicActionsL1()) + const l2PublicClient = createPublicClient({ chain: optimismSepolia, transport: http("https://sepolia.optimism.io") }).extend(publicActionsL2()); + const l1WalletClient = createWalletClient({ chain: sepolia, transport: http("https://rpc.ankr.com/eth_sepolia") }).extend(walletActionsL1()); + const l2WalletClient = createWalletClient({ chain: optimismSepolia, transport: http("https://sepolia.optimism.io") }).extend(walletActionsL2()) + + const address = account.address; + const initialBalance = await l2PublicClient.getBalance({ address }); + console.log(`Initial balance: ${formatEther(initialBalance)} ETH`); + + const optimismPortalAbi = [ + { + inputs: [ + { internalType: 'uint256', name: '_gasLimit', type: 'uint256' }, + { internalType: 'bytes', name: '_data', type: 'bytes' }, + ], + name: 'depositTransaction', + outputs: [], + stateMutability: 'payable', + type: 'function', + }, + ]; + + const optimismPortalAddress = '0x1000000000000000000000000000000000000000'; + const gasLimit = 100000n; + const data = '0x'; + const value = parseEther('0.000001'); + + const gasEstimate = await l1PublicClient.estimateContractGas({ + address: optimismPortalAddress, + abi: optimismPortalAbi, + functionName: 'depositTransaction', + args: [gasLimit, data], + value, + }); + + const { hash: l1TxHash } = await l1WalletClient.writeContract({ + address: optimismPortalAddress, + abi: optimismPortalAbi, + functionName: 'depositTransaction', + args: [gasLimit, data], + value, + gas: gasEstimate * 120n / 100n, // 20% buffer + }); + + console.log(`L1 transaction hash: ${l1TxHash}`); + + const l1Receipt = await l1PublicClient.waitForTransactionReceipt({ hash: l1TxHash }); + + const l2TxHash = l1Receipt.logs[0].topics[1]; + const l2Receipt = await l2PublicClient.waitForTransactionReceipt({ hash: l2TxHash }); + console.log(`L2 transaction hash: ${l2TxHash}`); + + const finalBalance = await l2PublicClient.getBalance({ address }); + console.log(`Final balance: ${formatEther(finalBalance)} ETH`); + + const difference = initialBalance - finalBalance; + console.log(`Difference: ${formatEther(difference)} ETH`); })() From 62564df7019ff19300af31bc0a81fbd468f6932e Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Wed, 9 Oct 2024 21:40:59 +0100 Subject: [PATCH 144/565] Update pages/builders/app-developers/tutorials/sdk-estimate-costs.mdx Co-authored-by: smartcontracts --- pages/builders/app-developers/tutorials/sdk-estimate-costs.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/builders/app-developers/tutorials/sdk-estimate-costs.mdx b/pages/builders/app-developers/tutorials/sdk-estimate-costs.mdx index 125205d4d..74e3af0bc 100644 --- a/pages/builders/app-developers/tutorials/sdk-estimate-costs.mdx +++ b/pages/builders/app-developers/tutorials/sdk-estimate-costs.mdx @@ -46,7 +46,7 @@ Since Viem is a [Node.js](https://nodejs.org/en/) library, you'll need to create pnpm init ``` - {

Install the viem library

} + {

Install Viem

} ```bash pnpm add viem From 3861865d19a9b7589c2b68a0fd71a5a6e4329f5d Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Wed, 9 Oct 2024 21:41:09 +0100 Subject: [PATCH 145/565] Update pages/builders/app-developers/tutorials/sdk-estimate-costs.mdx Co-authored-by: smartcontracts --- pages/builders/app-developers/tutorials/sdk-estimate-costs.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/builders/app-developers/tutorials/sdk-estimate-costs.mdx b/pages/builders/app-developers/tutorials/sdk-estimate-costs.mdx index 74e3af0bc..33a02c63d 100644 --- a/pages/builders/app-developers/tutorials/sdk-estimate-costs.mdx +++ b/pages/builders/app-developers/tutorials/sdk-estimate-costs.mdx @@ -8,7 +8,7 @@ import { Callout, Steps, Tabs } from 'nextra/components' # Estimating Transaction Costs on OP Stack -In this tutorial, you'll learn how to use the [Viem](https://viem.sh/op-stack/) to estimate the cost of a transaction on OP Mainnet. +In this tutorial, you'll learn how to use [Viem](https://viem.sh/op-stack/) to estimate the cost of a transaction on OP Mainnet. You'll learn how to estimate the [execution gas fee](/builders/app-developers/transactions/fees#execution-gas-fee) and the [L1 data fee](/builders/app-developers/transactions/fees#l1-data-fee) independently. You'll also learn how to estimate the total cost of the transaction all at once. From 1eac1a96c7d35d51f4bc1565a3be6044c06452fb Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Wed, 9 Oct 2024 21:41:16 +0100 Subject: [PATCH 146/565] Update pages/builders/app-developers/tutorials/sdk-estimate-costs.mdx Co-authored-by: smartcontracts --- pages/builders/app-developers/tutorials/sdk-estimate-costs.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/builders/app-developers/tutorials/sdk-estimate-costs.mdx b/pages/builders/app-developers/tutorials/sdk-estimate-costs.mdx index 33a02c63d..42fb7e3f4 100644 --- a/pages/builders/app-developers/tutorials/sdk-estimate-costs.mdx +++ b/pages/builders/app-developers/tutorials/sdk-estimate-costs.mdx @@ -70,7 +70,7 @@ You will need to get some ETH on Sepolia to follow along. ## Add a Private Key to Your Environment You need a private key in order to sign transactions. -Set your private key as an environment variable with the export command. +Set your private key as an environment variable with the `export` command. Make sure this private key corresponds to an address that has ETH on Sepolia. ```bash From 6d12f4147666da91f105d496d8a77819a5768fd2 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Wed, 9 Oct 2024 21:41:41 +0100 Subject: [PATCH 147/565] Update pages/builders/app-developers/tutorials/sdk-estimate-costs.mdx Co-authored-by: smartcontracts --- pages/builders/app-developers/tutorials/sdk-estimate-costs.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/builders/app-developers/tutorials/sdk-estimate-costs.mdx b/pages/builders/app-developers/tutorials/sdk-estimate-costs.mdx index 42fb7e3f4..2c7cb5d56 100644 --- a/pages/builders/app-developers/tutorials/sdk-estimate-costs.mdx +++ b/pages/builders/app-developers/tutorials/sdk-estimate-costs.mdx @@ -1,7 +1,7 @@ --- title: Estimating Transaction Costs on OP Stack lang: en-US -description: Learn how to use the Viem/op-stack to estimate the cost of a transaction on OP Mainnet. +description: Learn how to use Viem to estimate the cost of a transaction on OP Mainnet. --- import { Callout, Steps, Tabs } from 'nextra/components' From 6d9f8be16518bd439c110d58a862070d9b5c5d23 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Wed, 9 Oct 2024 21:55:15 +0100 Subject: [PATCH 148/565] updated the codebase --- public/tutorials/sdk-estimate-costs.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/tutorials/sdk-estimate-costs.js b/public/tutorials/sdk-estimate-costs.js index 15e2a7505..4c7947d5f 100644 --- a/public/tutorials/sdk-estimate-costs.js +++ b/public/tutorials/sdk-estimate-costs.js @@ -34,7 +34,7 @@ const walletClientL2 = createWalletClient({ const l2CostEstimate = gasLimit * effectiveGasPrice console.log(`Estimated Execution Gas Fee: ${formatEther(l2CostEstimate)} ETH`) - const l1CostEstimate = await publicClient.estimateL1Fee(transaction) + const l1CostEstimate = await publicClient.estimateL1Gas(transaction) console.log(`Estimated L1 Data Fee: ${formatEther(l1CostEstimate)} ETH`) const totalEstimate = l2CostEstimate + l1CostEstimate From ba9ec298ff043b544772fdd0b8897eabfea6e449 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Wed, 9 Oct 2024 22:02:57 +0100 Subject: [PATCH 149/565] updated codebase --- .../tutorials/sdk-estimate-costs.mdx | 25 ++++++++----------- public/tutorials/sdk-estimate-costs.js | 8 +++--- 2 files changed, 15 insertions(+), 18 deletions(-) diff --git a/pages/builders/app-developers/tutorials/sdk-estimate-costs.mdx b/pages/builders/app-developers/tutorials/sdk-estimate-costs.mdx index 2c7cb5d56..3412fa209 100644 --- a/pages/builders/app-developers/tutorials/sdk-estimate-costs.mdx +++ b/pages/builders/app-developers/tutorials/sdk-estimate-costs.mdx @@ -67,6 +67,15 @@ You will need to get some ETH on Sepolia to follow along. You can use [this faucet](https://sepoliafaucet.com) to get ETH on Sepolia.
+## Get ETH on OP Sepolia + +This tutorial explains how estimate transaction costs on OP Sepolia. +You will need to get some ETH on OP Sepolia in order to run the code in this tutorial. + + + You can use the [Superchain Faucet](https://console.optimism.io/faucet?utm_source=docs) to get ETH on OP Sepolia. + + ## Add a Private Key to Your Environment You need a private key in order to sign transactions. @@ -88,18 +97,6 @@ node This will bring up a Node REPL prompt that allows you to run JavaScript code. - -## Get ETH on OP Sepolia - -This tutorial explains how estimate transaction costs on OP Sepolia. -You will need to get some ETH on OP Sepolia in order to run the code in this tutorial. - - - You can use the [Superchain Faucet](https://console.optimism.io/faucet?utm_source=docs) to get ETH on OP Sepolia. - - -This will bring up a Node REPL prompt that allows you to run javascript code. - ## Set Session Variables You'll need a few variables throughout this tutorial. @@ -138,7 +135,7 @@ You're now going to estimate the cost of a transaction on OP Mainnet. Viem makes it easy to prepare a transactions so you can estimate the cost of a transaction before you sign it. Here you'll define an object with the required transaction fields and send a small amount of ETH from your address to the address `0x1000000000000000000000000000000000000000`. -```js file=/public/tutorials/sdk-estimate-costs.js#L21-L26 hash=583ee48142f33686188a7bf1cc312a1c +```js file=/public/tutorials/sdk-estimate-costs.js#L21-L26 hash=96e2f9bcece6c455f64c82e44bce1105 ``` This transaction will send `0.005` ETH to the specified address with a gas price of 20 Gwei. @@ -171,7 +168,7 @@ You're now going to estimate the cost of a transaction on OP Mainnet. Under the hood, this function is estimating the amount of Ethereum gas required to publish this transaction on Ethereum and multiplying it by the current Ethereum gas price (as tracked by the L2). This function returns the current cost estimate in wei. -```js file=/public/tutorials/sdk-estimate-costs.js#L37-L38 hash=b1ef73988e0876529a72b61d5822cbe1 +```js file=/public/tutorials/sdk-estimate-costs.js#L37-L38 hash=afbf520615c15f71a84eec2566c393aa ``` {

Estimate the total cost

} diff --git a/public/tutorials/sdk-estimate-costs.js b/public/tutorials/sdk-estimate-costs.js index 4c7947d5f..fc3f7383b 100644 --- a/public/tutorials/sdk-estimate-costs.js +++ b/public/tutorials/sdk-estimate-costs.js @@ -19,10 +19,10 @@ const walletClientL2 = createWalletClient({ }).extend(walletActionsL2()) const transaction = { - account, - to: '0x1000000000000000000000000000000000000000', - value: parseEther('0.005'), - gasPrice: parseGwei('20') + account, + to: '0x1000000000000000000000000000000000000000', + value: parseEther('0.005'), + gasPrice: parseGwei('20') } const gasLimit = await publicClient.estimateGas(transaction) From a09bb47e4dad2c5d79acbd9965e1b20520276551 Mon Sep 17 00:00:00 2001 From: soyboy Date: Thu, 10 Oct 2024 08:30:22 -0600 Subject: [PATCH 150/565] removing duplicate page --- pages/builders/notices/sdk-deprecation 2.mdx | 101 ------------------- 1 file changed, 101 deletions(-) delete mode 100644 pages/builders/notices/sdk-deprecation 2.mdx diff --git a/pages/builders/notices/sdk-deprecation 2.mdx b/pages/builders/notices/sdk-deprecation 2.mdx deleted file mode 100644 index 302f4afba..000000000 --- a/pages/builders/notices/sdk-deprecation 2.mdx +++ /dev/null @@ -1,101 +0,0 @@ ---- -title: Deprecation of the Optimism SDK -lang: en-US -description: This page outlines the details of the Optimism SDK deprecation and guides developers to migrate to using `viem` library. ---- - -## Preparing for Optimism SDK deprecation - -The Optimism SDK will officially be deprecated in Q1 2025. The project is shifting to the `viem` library for a more modern, efficient, and flexible development experience. This change affects all tutorials and resources that previously relied on the Optimism SDK, and relevant documentation has been updated accordingly. - -### Breaking changes to expect - -The migration from the Optimism SDK to `viem` library brings several breaking changes: - -* **Transaction estimation**: Methods for estimating gas fees will now leverage `viem` APIs. -* **Bridging**: All token bridging actions must be updated to use the `viem` library bridging methods. -* **Cross-chain communication**: `viem` library simplifies the cross-domain messaging functionality. -* **SDK method removal**: All deprecated SDK methods will be unavailable after Q1 2025. - -Developers and users are strongly encouraged to transition to `viem` before the deprecation date to avoid disruptions. - -### Updated tutorials - -We are updating our tutorials to use the `viem` library. - - {/* Below, you'll find links to the updated versions of popular tutorials: - -* [Estimating Transaction Costs on OP Mainnet](../tutorials/transaction-cost-estimation)\ - Estimation of transaction costs now uses the `viem` gas estimation utilities. - -* [Triggering OP Mainnet Transactions from Ethereum](../tutorials/trigger-op-transactions)\ - Learn how to trigger transactions using `viem` to interact with the OP Mainnet. - -* [Tracing Deposits and Withdrawals](../tutorials/tracing-deposits-withdrawals)\ - The tracing functionalities have been adapted to use `opstack` for efficient results. - -* [Viewing Deposits and Withdrawals by Address](../tutorials/view-deposits-withdrawals)\ - This tutorial outlines updated methods in `viem` for querying deposits and withdrawals by address. - -* [Bridging Your Standard ERC-20 Token Using the Standard Bridge](../tutorials/bridge-standard-erc20)\ - The standard bridge tutorial now uses `opstack` for token transfers between Ethereum and OP Mainnet. - -* [Bridging Your Custom ERC-20 Token Using the Standard Bridge](../tutorials/bridge-custom-erc20)\ - Custom ERC-20 tokens can now be bridged via `opstack`, making the process more streamlined. - -* [Bridging ERC-20 Tokens to OP Mainnet With the Optimism SDK](../tutorials/bridge-sdk-erc20)\ - **Deprecated** – please use [Bridging Your Custom ERC-20 Token Using the Standard Bridge](../tutorials/bridge-custom-erc20). - -* [Bridging ETH to OP Mainnet With the Optimism SDK](../tutorials/bridge-sdk-eth)\ - **Deprecated** – please use [Estimating Transaction Costs on OP Mainnet](../tutorials/transaction-cost-estimation). - -* [Communicating Between OP Mainnet and Ethereum in Solidity](../tutorials/cross-chain-solidity)\ - Cross-chain communication now leverages `opstack` for all messaging. */} - -### For app developers - -If your application currently depends on the Optimism SDK, you will need to migrate to using the `viem` library. -The tutorials have been updated to reflect these changes, and it is critical to update your applications before the deprecation date to maintain compatibility. - -Here are some key points to consider: - -Install new dependencies: Replace the Optimism SDK with `viem` in your project. - -```bash - pnpm remove @eth-optimism/sdk - pnpm add viem -``` - -* Update imports: Replace Optimism SDK imports with `viem` imports. -* Migrate SDK methods: Refactor your code to use equivalent `viem` methods. Refer to the viem documentation and opstack documentation for guidance. -* Test thoroughly: After migration, extensively test your application to ensure all functionality works as expected. - -### For chain operators - -Chain operators utilizing the SDK for cross-chain operations, bridging, or other functions should switch to the `viem` library. -The `viem` library offers more efficient methods to handle these operations. - -Chain operators should be aware of the following: - -* SDK removal: Remove any dependencies on the Optimism SDK in your infrastructure. -* Update tooling: Ensure all tools and scripts are updated to use `viem`. -* Monitor performance: After migration, closely monitor your chain's performance to ensure smooth operation. - -### For node operators - -Node operators will need to ensure that any scripts or services relying on the Optimism SDK are updated to use `viem` library. -These updates will help align with future improvements and scalability efforts across the OP Stack. - -Node operators should take the following steps: - -* Update node software: Ensure your node software is compatible with the latest `viem` libraries. -* Review configuration: Check and update any configuration files that may reference the Optimism SDK. -* Test thoroughly: Perform comprehensive testing in a staging environment before updating production nodes. - -### Need Help? - -For further assistance or questions about this migration, feel free to reach through the following channels: - -* Join our [community forum](https://community.optimism.io/) for discussions and support -* Connect with us on [Discord](https://discord.gg/optimism) for community support -* Open an [issue on our GitHub repository](https://github.com/ethereum-optimism/docs/issues) for documentation-related concerns From dc9f7024a04fccfcb6ffec58f9194871eddee09d Mon Sep 17 00:00:00 2001 From: soyboy <85043086+sbvegan@users.noreply.github.com> Date: Thu, 10 Oct 2024 15:43:16 -0600 Subject: [PATCH 151/565] Apply suggestions from code review Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> --- pages/stack/operators/features/op-txproxy.mdx | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/pages/stack/operators/features/op-txproxy.mdx b/pages/stack/operators/features/op-txproxy.mdx index cfb60e9ab..1b36d9d60 100644 --- a/pages/stack/operators/features/op-txproxy.mdx +++ b/pages/stack/operators/features/op-txproxy.mdx @@ -8,39 +8,35 @@ import { Callout, Steps } from 'nextra/components' # op-txproxy -A [passthrough proxy](https://github.com/ethereum-optimism/infra/tree/main/op-txproxy) for the execution engine endpoint. This proxy does not forward all rpc traffic and only exposes a specific set of methods. Operationally, the ingress router should only re-route request for these methods. +A [passthrough proxy](https://github.com/ethereum-optimism/infra/tree/main/op-txproxy) for the execution engine endpoint. This proxy does not forward all rpc traffic and only exposes a specific set of methods. Operationally, the ingress router should only re-route requests for these methods. [proxyd](./proxyd) as an ingress router supports the mapping of specific methods to unique backends. - ## Methods ### **eth_sendRawTransactionConditional** To safely expose this endpoint publicly, additional stateless constraints are applied to horizontally scale validation rules and preemptively reject conditional transactions prior to reaching the sequencer. -A variety of metrics are emitted for to inform adjustments to be made. - +A variety of metrics are emitted to inform necessary adjustments. #### Authentication The caller authenticates themselves with any valid ECDSA-secp256k1 key, like an Ethereum key. The computed signature is over the [EIP-191](https://eips.ethereum.org/EIPS/eip-191) hash of the request body. This calling address does **not need to hold an ethereum balance**. It simply is used for identification. With the signature and signing address, the request is authenticated under the `X-Optimism-Signature` header with the value `: `. -* Requests with missing a missing authentication header fail with the `-32003` (transaction rejected) json rpc error code. +* Requests with a missing authentication header fail with the `-32003` (transaction rejected) json rpc error code. * Requests with a mismatch in recovered signer and supplied public key will have the http request failed with status code `400 - Bad Request`. -As of today, no authorization policies are implemented on this endpoint. This has preemptively in place allow for new policies (allowlist, localized rate limits, etc) - +As of today, no authorization policies are implemented on this endpoint. However, the authentication mechanism is in place to allow for future implementation of policies such as allowlists, localized rate limits, etc. #### Runtime Shutoff -This service can be rolled with a flag/env switch to reject conditional transaction without needing to interrupt the execution engine. Useful in diagnosing issues. +This service can be configured with a flag or environment variable to reject conditional transactions without needing to interrupt the execution engine. This feature is useful for diagnosing issues. `--sendRawTxConditional.enabled (default: true) ($OP_TXPROXY_SENDRAWTXCONDITIONAL_ENABLED)` When disabled, requests will fail with the `-32003` (transaction rejected) json rpc error code with a message stating that the method is disabled. - #### Rate Limits Even though the op-geth implementation of this endpoint includes rate limits, it is instead applied here to terminate these requests early. From 59f494cb982b6aa143b2b40f853c4b7ee8d529f1 Mon Sep 17 00:00:00 2001 From: soyboy Date: Thu, 10 Oct 2024 15:49:36 -0600 Subject: [PATCH 152/565] adding code rabbit suggestions --- pages/stack/operators/features/op-txproxy.mdx | 4 ++-- .../protocol/features/send-raw-transaction-conditional.mdx | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pages/stack/operators/features/op-txproxy.mdx b/pages/stack/operators/features/op-txproxy.mdx index 1b36d9d60..5ac28e07e 100644 --- a/pages/stack/operators/features/op-txproxy.mdx +++ b/pages/stack/operators/features/op-txproxy.mdx @@ -61,7 +61,7 @@ When the request passes validation, it is passed through to the configured backe - Per the [specification](/stack/protocol/features/send-raw-transaction-conditional), conditional transactions are not gossip'd between peers. Thus if you use replicas in an active/passive sequencer setup, this request must be broadcasted to all replicas. + Per the [specification](/stack/protocol/features/send-raw-transaction-conditional), conditional transactions are not gossiped between peers. Thus, if you use replicas in an active/passive sequencer setup, this request must be broadcasted to all replicas. [proxyd](./proxyd) as an egress router for this method supports this broadcasting functionality. @@ -83,7 +83,7 @@ To start using `op-txproxy`, follow these steps: ### Configure - The binary accepts configuration through cli flags which also settable via ENV variables. Either set the flags explicitly when starting the binary or set the environment variables of the host starting the proxy + The binary accepts configuration through CLI flags, which also settable via environment variables. Either set the flags explicitly when starting the binary or set the environment variables of the host starting the proxy. See [methods](#methods) on the configuration options available for each method. diff --git a/pages/stack/protocol/features/send-raw-transaction-conditional.mdx b/pages/stack/protocol/features/send-raw-transaction-conditional.mdx index ec1ae14d1..ae8b14175 100644 --- a/pages/stack/protocol/features/send-raw-transaction-conditional.mdx +++ b/pages/stack/protocol/features/send-raw-transaction-conditional.mdx @@ -1,7 +1,7 @@ --- title: SendRawTransactionConditional Explainer lang: en-US -description: Learn the basic process, benefits, and considerations for running a custom gas token chain. +description: Learn about the eth_sendRawTransactionConditional RPC method for conditional transaction inclusion on the OP Stack. --- import { Callout } from 'nextra/components' From 4fa6ec600b18dd41327912a9fd751dddf1dd2ef7 Mon Sep 17 00:00:00 2001 From: soyboy <85043086+sbvegan@users.noreply.github.com> Date: Thu, 10 Oct 2024 16:01:53 -0600 Subject: [PATCH 153/565] Apply suggestions from code review Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> --- pages/stack/operators/features/op-txproxy.mdx | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/pages/stack/operators/features/op-txproxy.mdx b/pages/stack/operators/features/op-txproxy.mdx index 5ac28e07e..525519dbe 100644 --- a/pages/stack/operators/features/op-txproxy.mdx +++ b/pages/stack/operators/features/op-txproxy.mdx @@ -8,7 +8,7 @@ import { Callout, Steps } from 'nextra/components' # op-txproxy -A [passthrough proxy](https://github.com/ethereum-optimism/infra/tree/main/op-txproxy) for the execution engine endpoint. This proxy does not forward all rpc traffic and only exposes a specific set of methods. Operationally, the ingress router should only re-route requests for these methods. +A [passthrough proxy](https://github.com/ethereum-optimism/infra/tree/main/op-txproxy) for the execution engine endpoint. This proxy does not forward all RPC traffic and only exposes a specific set of methods. Operationally, the ingress router should only re-route requests for these specific methods. [proxyd](./proxyd) as an ingress router supports the mapping of specific methods to unique backends. @@ -17,19 +17,19 @@ A [passthrough proxy](https://github.com/ethereum-optimism/infra/tree/main/op-tx ### **eth_sendRawTransactionConditional** -To safely expose this endpoint publicly, additional stateless constraints are applied to horizontally scale validation rules and preemptively reject conditional transactions prior to reaching the sequencer. +To safely expose this endpoint publicly, additional stateless constraints are applied. These constraints help scale validation rules horizontally and preemptively reject conditional transactions before they reach the sequencer. -A variety of metrics are emitted to inform necessary adjustments. +Various metrics are emitted to guide necessary adjustments. #### Authentication -The caller authenticates themselves with any valid ECDSA-secp256k1 key, like an Ethereum key. The computed signature is over the [EIP-191](https://eips.ethereum.org/EIPS/eip-191) hash of the request body. This calling address does **not need to hold an ethereum balance**. It simply is used for identification. +The caller authenticates using any valid ECDSA-secp256k1 key, such as an Ethereum key. The signature is computed over the [EIP-191](https://eips.ethereum.org/EIPS/eip-191) hash of the request body. The calling address does **not need to hold an Ethereum balance**; it is simply used for identification. With the signature and signing address, the request is authenticated under the `X-Optimism-Signature` header with the value `: `. * Requests with a missing authentication header fail with the `-32003` (transaction rejected) json rpc error code. * Requests with a mismatch in recovered signer and supplied public key will have the http request failed with status code `400 - Bad Request`. -As of today, no authorization policies are implemented on this endpoint. However, the authentication mechanism is in place to allow for future implementation of policies such as allowlists, localized rate limits, etc. +Currently, no authorization policies are implemented on this endpoint. However, the authentication mechanism is in place to allow for future implementation of policies such as allowlists, localized rate limits, and other potential restrictions. #### Runtime Shutoff This service can be configured with a flag or environment variable to reject conditional transactions without needing to interrupt the execution engine. This feature is useful for diagnosing issues. From 5699d6f59b07e87fd432b36263ed804407ae65f7 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Fri, 11 Oct 2024 12:37:53 +0100 Subject: [PATCH 154/565] Update nouns.txt Co-authored-by: Bradley Camacho <42678939+bradleycamacho@users.noreply.github.com> --- nouns.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/nouns.txt b/nouns.txt index 17280947d..8352a8271 100644 --- a/nouns.txt +++ b/nouns.txt @@ -7,7 +7,6 @@ Web3 DeFi DAO EVM -Layer 2 L2 Rollup Smart Contract From 15c6cd3c36a32524dae6fa8dfa1b9d4dd3662845 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Fri, 11 Oct 2024 12:45:07 +0100 Subject: [PATCH 155/565] Update nouns.txt Co-authored-by: Bradley Camacho <42678939+bradleycamacho@users.noreply.github.com> --- nouns.txt | 7 ------- 1 file changed, 7 deletions(-) diff --git a/nouns.txt b/nouns.txt index 8352a8271..22467f4ab 100644 --- a/nouns.txt +++ b/nouns.txt @@ -8,12 +8,5 @@ DeFi DAO EVM L2 -Rollup -Smart Contract -Blockchain -Cryptocurrency -Token -Wallet dApp -Gas Fee MetaMask \ No newline at end of file From 97de8b3d2f1a0ef327f13cfda9a83435609ac477 Mon Sep 17 00:00:00 2001 From: cpengilly <29023967+cpengilly@users.noreply.github.com> Date: Fri, 11 Oct 2024 12:32:15 -0700 Subject: [PATCH 156/565] supersim explainer - page is under interop - symbolic link added under app devs > tools - meta.json files updated in both directories --- next-env.d.ts | 2 +- .../builders/app-developers/tools/_meta.json | 1 + .../app-developers/tools/supersim.mdx | 6 + pages/stack/protocol/interop/_meta.json | 3 +- pages/stack/protocol/interop/supersim.mdx | 63 + pnpm-lock.yaml | 8220 +++++++---------- words.txt | 1 + 7 files changed, 3610 insertions(+), 4686 deletions(-) create mode 100644 pages/builders/app-developers/tools/supersim.mdx create mode 100644 pages/stack/protocol/interop/supersim.mdx diff --git a/next-env.d.ts b/next-env.d.ts index 4f11a03dc..a4a7b3f5c 100644 --- a/next-env.d.ts +++ b/next-env.d.ts @@ -2,4 +2,4 @@ /// // NOTE: This file should not be edited -// see https://nextjs.org/docs/basic-features/typescript for more information. +// see https://nextjs.org/docs/pages/building-your-application/configuring/typescript for more information. diff --git a/pages/builders/app-developers/tools/_meta.json b/pages/builders/app-developers/tools/_meta.json index 9f3f9aa63..37ebfbd01 100644 --- a/pages/builders/app-developers/tools/_meta.json +++ b/pages/builders/app-developers/tools/_meta.json @@ -1,5 +1,6 @@ { "ecosystem-overview": "Open Source Code Repo", + "supersim": "SuperSim IDE", "console": { "title": "Superchain Dev Console", "href": "https://console.optimism.io/?utm_source=docs", diff --git a/pages/builders/app-developers/tools/supersim.mdx b/pages/builders/app-developers/tools/supersim.mdx new file mode 100644 index 000000000..8d02a19ec --- /dev/null +++ b/pages/builders/app-developers/tools/supersim.mdx @@ -0,0 +1,6 @@ +--- +--- + +import SuperSim from '@/pages/stack/protocol/interop/supersim.mdx' + + diff --git a/pages/stack/protocol/interop/_meta.json b/pages/stack/protocol/interop/_meta.json index 5c76b2a4a..b45d6ad40 100644 --- a/pages/stack/protocol/interop/_meta.json +++ b/pages/stack/protocol/interop/_meta.json @@ -1,4 +1,5 @@ { "explainer": "Interop Explainer", - "cross-chain-message": "Anatomy of Cross-Chain Message" + "cross-chain-message": "Anatomy of Cross-Chain Message", + "supersim": "SuperSim Explainer" } \ No newline at end of file diff --git a/pages/stack/protocol/interop/supersim.mdx b/pages/stack/protocol/interop/supersim.mdx new file mode 100644 index 000000000..154af5e4a --- /dev/null +++ b/pages/stack/protocol/interop/supersim.mdx @@ -0,0 +1,63 @@ +--- +title: SuperSim Explainer +lang: en-US +description: Learn how to use the SuperSim local dev environment tool designed to simulate the Optimism Superchain. +--- + +import { Callout } from 'nextra/components' + +# SuperSim Explainer + + + Interop is currently in active development and not yet ready for production use. The information provided here may change, so we recommend checking back regularly for the most up-to-date information. + + +[SuperSim](https://github.com/ethereum-optimism/supersim) is a local development environment tool designed to simulate the Optimism Superchain for developers building multi-chain applications. It provides a simplified way to test and develop applications that interact with multiple chains within the Superchain ecosystem. + +## SuperSim Workflow + +```mermaid +graph LR + A[Write Smart Contracts] --> B[Deploy on SuperSim] + B --> C[Test Cross-Chain Interactions] + C --> D[Debug and Refine] + D --> B + C --> E[Ready for Production] +``` + +This diagram illustrates the typical workflow for developers using SuperSim, from writing smart contracts to testing and refining cross-chain interactions. + +## Features and Benefits + +* Simulates multiple OP Stack chains locally (e.g., chain 901, 902) +* Supports testing of cross-chain messaging and interactions +* Includes pre-deployed interoperability contracts +* Offers a CLI interface for starting and managing SuperSim instances +* Provides JSON-RPC endpoints for each simulated chain +* Allows for custom configuration of chain parameters +* Facilitates testing of Superchain-specific features like SupERC20 tokens +* Integration with common Ethereum development tools (e.g., Hardhat, Foundry) + +## SuperSim CLI Interaction + +```mermaid +graph TD + A[Developer] --> B[SuperSim CLI] + B --> C[Chain 901] + B --> D[Chain 902] + B --> E[...] + C --> F[JSON-RPC Endpoint] + D --> G[JSON-RPC Endpoint] + E --> H[JSON-RPC Endpoint] + I[Pre-deployed Interoperability Contracts] --> C + I --> D + I --> E +``` + +This diagram illustrates how developers interact with SuperSim through the CLI, which then manages multiple simulated chains, each with its own JSON-RPC endpoint and pre-deployed interoperability contracts. + +## Next Steps + +* Check out the dedicated [SuperSim docs](https://supersim.pages.dev/) for tutorials and specific use cases. +* Questions about Interop? Check out the FAQ section in the [Superchain Interop Explainer](/stack/protocol/interop/explainer#faqs) or check out this [Superchain interop design video walk-thru](https://www.youtube.com/watch?v=FKc5RgjtGes). +* For more info about how Superchain interoperability works under the hood, [check out the specs](https://specs.optimism.io/interop/overview.html). diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1fbf39bdc..4a5f3c76a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,4 +1,4 @@ -lockfileVersion: '9.0' +lockfileVersion: '6.0' settings: autoInstallPeers: true @@ -15,3716 +15,204 @@ patchedDependencies: hash: jaxvkozlhcbn7zjsiti5ocoubi path: patches/remark-lint-frontmatter-schema@3.15.4.patch -importers: - - .: - dependencies: - '@eth-optimism/contracts-ts': - specifier: ^0.17.0 - version: 0.17.2(typescript@5.4.5)(zod@3.23.8) - '@eth-optimism/tokenlist': - specifier: ^9.0.9 - version: 9.0.51 - '@feelback/react': - specifier: ^0.3.4 - version: 0.3.4(react@18.3.1) - '@headlessui/react': - specifier: ^2.1.8 - version: 2.1.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - algoliasearch: - specifier: ^4.23.3 - version: 4.23.3 - clsx: - specifier: ^2.1.1 - version: 2.1.1 - escape-string-regexp: - specifier: ^5.0.0 - version: 5.0.0 - next: - specifier: 14.2.10 - version: 14.2.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - next-sitemap: - specifier: ^4.2.3 - version: 4.2.3(next@14.2.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) - nextra: - specifier: 2.13.2 - version: 2.13.2(patch_hash=a4rp2hgojklggjmthmkiyqaek4)(next@14.2.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - nextra-theme-docs: - specifier: 2.13.2 - version: 2.13.2(next@14.2.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(nextra@2.13.2(patch_hash=a4rp2hgojklggjmthmkiyqaek4)(next@14.2.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: - specifier: ^18.2.0 - version: 18.3.1 - react-dom: - specifier: ^18.2.0 - version: 18.3.1(react@18.3.1) - search-insights: - specifier: ^2.15.0 - version: 2.15.0 - devDependencies: - '@double-great/remark-lint-alt-text': - specifier: ^1.0.0 - version: 1.0.0 - '@eth-optimism/core-utils': - specifier: ^0.13.1 - version: 0.13.2 - '@eth-optimism/sdk': - specifier: ^3.1.6 - version: 3.3.0(ethers@5.7.2) - '@types/node': - specifier: 18.11.10 - version: 18.11.10 - cspell: - specifier: ^8.1.3 - version: 8.7.0 - eslint: - specifier: ^8.53.0 - version: 8.57.0 - eslint-plugin-mdx: - specifier: ^2.2.0 - version: 2.3.4(eslint@8.57.0) - ethers: - specifier: ^5 - version: 5.7.2 - globby: - specifier: ^11.0.4 - version: 11.1.0 - gray-matter: - specifier: ^4.0.3 - version: 4.0.3 - remark: - specifier: ^15.0.1 - version: 15.0.1 - remark-code-import: - specifier: ^1.2.0 - version: 1.2.0(patch_hash=heylvfasxh3ubj2edns2svea2m) - remark-frontmatter: - specifier: ^5.0.0 - version: 5.0.0 - remark-gfm: - specifier: ^3.0.1 - version: 3.0.1 - remark-lint-frontmatter-schema: - specifier: ^3.15.4 - version: 3.15.4(patch_hash=jaxvkozlhcbn7zjsiti5ocoubi) - remark-lint-heading-style: - specifier: ^3.1.2 - version: 3.1.2 - remark-lint-list-item-indent: - specifier: ^3.1.2 - version: 3.1.2 - remark-lint-table-cell-padding: - specifier: ^4.1.3 - version: 4.1.3 - remark-lint-table-pipe-alignment: - specifier: ^3.1.3 - version: 3.1.3 - remark-lint-table-pipes: - specifier: ^4.1.2 - version: 4.1.2 - remark-lint-unordered-list-marker-style: - specifier: ^3.1.2 - version: 3.1.2 - remark-preset-lint-consistent: - specifier: ^5.1.2 - version: 5.1.2 - remark-preset-lint-recommended: - specifier: ^6.1.3 - version: 6.1.3 - typescript: - specifier: ^5.2.2 - version: 5.4.5 - unified-lint-rule: - specifier: ^2.1.2 - version: 2.1.2 - unist-util-visit: - specifier: ^5.0.0 - version: 5.0.0 - -packages: - - '@adraffy/ens-normalize@1.10.0': - resolution: {integrity: sha512-nA9XHtlAkYfJxY7bce8DcN7eKxWWCWkU+1GR9d+U6MbNpfwQp8TI7vqOsBsMcHoT4mBu2kypKoSKnghEzOOq5Q==} - - '@algolia/cache-browser-local-storage@4.23.3': - resolution: {integrity: sha512-vRHXYCpPlTDE7i6UOy2xE03zHF2C8MEFjPN2v7fRbqVpcOvAUQK81x3Kc21xyb5aSIpYCjWCZbYZuz8Glyzyyg==} - - '@algolia/cache-common@4.23.3': - resolution: {integrity: sha512-h9XcNI6lxYStaw32pHpB1TMm0RuxphF+Ik4o7tcQiodEdpKK+wKufY6QXtba7t3k8eseirEMVB83uFFF3Nu54A==} - - '@algolia/cache-in-memory@4.23.3': - resolution: {integrity: sha512-yvpbuUXg/+0rbcagxNT7un0eo3czx2Uf0y4eiR4z4SD7SiptwYTpbuS0IHxcLHG3lq22ukx1T6Kjtk/rT+mqNg==} - - '@algolia/client-account@4.23.3': - resolution: {integrity: sha512-hpa6S5d7iQmretHHF40QGq6hz0anWEHGlULcTIT9tbUssWUriN9AUXIFQ8Ei4w9azD0hc1rUok9/DeQQobhQMA==} - - '@algolia/client-analytics@4.23.3': - resolution: {integrity: sha512-LBsEARGS9cj8VkTAVEZphjxTjMVCci+zIIiRhpFun9jGDUlS1XmhCW7CTrnaWeIuCQS/2iPyRqSy1nXPjcBLRA==} - - '@algolia/client-common@4.23.3': - resolution: {integrity: sha512-l6EiPxdAlg8CYhroqS5ybfIczsGUIAC47slLPOMDeKSVXYG1n0qGiz4RjAHLw2aD0xzh2EXZ7aRguPfz7UKDKw==} - - '@algolia/client-personalization@4.23.3': - resolution: {integrity: sha512-3E3yF3Ocr1tB/xOZiuC3doHQBQ2zu2MPTYZ0d4lpfWads2WTKG7ZzmGnsHmm63RflvDeLK/UVx7j2b3QuwKQ2g==} - - '@algolia/client-search@4.23.3': - resolution: {integrity: sha512-P4VAKFHqU0wx9O+q29Q8YVuaowaZ5EM77rxfmGnkHUJggh28useXQdopokgwMeYw2XUht49WX5RcTQ40rZIabw==} - - '@algolia/logger-common@4.23.3': - resolution: {integrity: sha512-y9kBtmJwiZ9ZZ+1Ek66P0M68mHQzKRxkW5kAAXYN/rdzgDN0d2COsViEFufxJ0pb45K4FRcfC7+33YB4BLrZ+g==} - - '@algolia/logger-console@4.23.3': - resolution: {integrity: sha512-8xoiseoWDKuCVnWP8jHthgaeobDLolh00KJAdMe9XPrWPuf1by732jSpgy2BlsLTaT9m32pHI8CRfrOqQzHv3A==} - - '@algolia/recommend@4.23.3': - resolution: {integrity: sha512-9fK4nXZF0bFkdcLBRDexsnGzVmu4TSYZqxdpgBW2tEyfuSSY54D4qSRkLmNkrrz4YFvdh2GM1gA8vSsnZPR73w==} - - '@algolia/requester-browser-xhr@4.23.3': - resolution: {integrity: sha512-jDWGIQ96BhXbmONAQsasIpTYWslyjkiGu0Quydjlowe+ciqySpiDUrJHERIRfELE5+wFc7hc1Q5hqjGoV7yghw==} - - '@algolia/requester-common@4.23.3': - resolution: {integrity: sha512-xloIdr/bedtYEGcXCiF2muajyvRhwop4cMZo+K2qzNht0CMzlRkm8YsDdj5IaBhshqfgmBb3rTg4sL4/PpvLYw==} - - '@algolia/requester-node-http@4.23.3': - resolution: {integrity: sha512-zgu++8Uj03IWDEJM3fuNl34s746JnZOWn1Uz5taV1dFyJhVM/kTNw9Ik7YJWiUNHJQXcaD8IXD1eCb0nq/aByA==} - - '@algolia/transporter@4.23.3': - resolution: {integrity: sha512-Wjl5gttqnf/gQKJA+dafnD0Y6Yw97yvfY8R9h0dQltX1GXTgNs1zWgvtWW0tHl1EgMdhAyw189uWiZMnL3QebQ==} - - '@apidevtools/json-schema-ref-parser@11.1.0': - resolution: {integrity: sha512-g/VW9ZQEFJAOwAyUb8JFf7MLiLy2uEB4rU270rGzDwICxnxMlPy0O11KVePSgS36K1NI29gSlK84n5INGhd4Ag==} - engines: {node: '>= 16'} - - '@babel/code-frame@7.24.2': - resolution: {integrity: sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==} - engines: {node: '>=6.9.0'} - - '@babel/helper-validator-identifier@7.22.20': - resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} - engines: {node: '>=6.9.0'} - - '@babel/highlight@7.24.2': - resolution: {integrity: sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==} - engines: {node: '>=6.9.0'} - - '@babel/runtime@7.24.4': - resolution: {integrity: sha512-dkxf7+hn8mFBwKjs9bvBlArzLVxVbS8usaPUDd5p2a9JCL9tB8OaOVN1isD4+Xyk4ns89/xeOmbQvgdK7IIVdA==} - engines: {node: '>=6.9.0'} - - '@braintree/sanitize-url@6.0.4': - resolution: {integrity: sha512-s3jaWicZd0pkP0jf5ysyHUI/RE7MHos6qlToFcGWXVp+ykHOy77OUMrfbgJ9it2C5bow7OIQwYYaHjk9XlBQ2A==} - - '@corex/deepmerge@4.0.43': - resolution: {integrity: sha512-N8uEMrMPL0cu/bdboEWpQYb/0i2K5Qn8eCsxzOmxSggJbbQte7ljMRoXm917AbntqTGOzdTu+vP3KOOzoC70HQ==} - - '@cspell/cspell-bundled-dicts@8.7.0': - resolution: {integrity: sha512-B5YQI7Dd9m0JHTmHgs7PiyP4BWXzl8ixpK+HGOwhxzh7GyfFt1Eo/gxMxBDX/9SaewEzeb2OjRpRKEFtEsto3A==} - engines: {node: '>=18'} - - '@cspell/cspell-json-reporter@8.7.0': - resolution: {integrity: sha512-LTQPEvXvCqnc+ok9WXpSISZyt4/nGse9fVEM430g0BpGzKpt3RMx49B8uasvvnanzCuikaW9+wFLmwgvraERhA==} - engines: {node: '>=18'} - - '@cspell/cspell-pipe@8.7.0': - resolution: {integrity: sha512-ePqddIQ4arqPQgOkC146SkZxvZb9/jL7xIM5Igy2n3tiWTC5ijrX/mbHpPZ1VGcFck+1M0cJUuyhuJk+vMj3rg==} - engines: {node: '>=18'} - - '@cspell/cspell-resolver@8.7.0': - resolution: {integrity: sha512-grZwDFYqcBYQDaz4AkUtdyqc4UUH2J3/7yWVkBbYDPE+FQHa9ofFXzXxyjs56GJlPfi9ULpe5/Wz6uVLg8rQkQ==} - engines: {node: '>=18'} - - '@cspell/cspell-service-bus@8.7.0': - resolution: {integrity: sha512-KW48iu0nTDzbedixc7iB7K7mlAZQ7QeMLuM/akxigOlvtOdVJrRa9Pfn44lwejts1ANb/IXil3GH8YylkVi76Q==} - engines: {node: '>=18'} - - '@cspell/cspell-types@8.7.0': - resolution: {integrity: sha512-Rb+LCE5I9JEb/LE8nSViVSF8z1CWv/z4mPBIG37VMa7aUx2gAQa6gJekNfpY9YZiMzx4Tv3gDujN80ytks4pGA==} - engines: {node: '>=18'} - - '@cspell/dict-ada@4.0.2': - resolution: {integrity: sha512-0kENOWQeHjUlfyId/aCM/mKXtkEgV0Zu2RhUXCBr4hHo9F9vph+Uu8Ww2b0i5a4ZixoIkudGA+eJvyxrG1jUpA==} - - '@cspell/dict-aws@4.0.1': - resolution: {integrity: sha512-NXO+kTPQGqaaJKa4kO92NAXoqS+i99dQzf3/L1BxxWVSBS3/k1f3uhmqIh7Crb/n22W793lOm0D9x952BFga3Q==} - - '@cspell/dict-bash@4.1.3': - resolution: {integrity: sha512-tOdI3QVJDbQSwPjUkOiQFhYcu2eedmX/PtEpVWg0aFps/r6AyjUQINtTgpqMYnYuq8O1QUIQqnpx21aovcgZCw==} - - '@cspell/dict-companies@3.0.31': - resolution: {integrity: sha512-hKVpV/lcGKP4/DpEPS8P4osPvFH/YVLJaDn9cBIOH6/HSmL5LbFgJNKpMGaYRbhm2FEX56MKE3yn/MNeNYuesQ==} - - '@cspell/dict-cpp@5.1.3': - resolution: {integrity: sha512-sqnriXRAInZH9W75C+APBh6dtben9filPqVbIsiRMUXGg+s02ekz0z6LbS7kXeJ5mD2qXoMLBrv13qH2eIwutQ==} - - '@cspell/dict-cryptocurrencies@5.0.0': - resolution: {integrity: sha512-Z4ARIw5+bvmShL+4ZrhDzGhnc9znaAGHOEMaB/GURdS/jdoreEDY34wdN0NtdLHDO5KO7GduZnZyqGdRoiSmYA==} - - '@cspell/dict-csharp@4.0.2': - resolution: {integrity: sha512-1JMofhLK+4p4KairF75D3A924m5ERMgd1GvzhwK2geuYgd2ZKuGW72gvXpIV7aGf52E3Uu1kDXxxGAiZ5uVG7g==} - - '@cspell/dict-css@4.0.12': - resolution: {integrity: sha512-vGBgPM92MkHQF5/2jsWcnaahOZ+C6OE/fPvd5ScBP72oFY9tn5GLuomcyO0z8vWCr2e0nUSX1OGimPtcQAlvSw==} - - '@cspell/dict-dart@2.0.3': - resolution: {integrity: sha512-cLkwo1KT5CJY5N5RJVHks2genFkNCl/WLfj+0fFjqNR+tk3tBI1LY7ldr9piCtSFSm4x9pO1x6IV3kRUY1lLiw==} - - '@cspell/dict-data-science@1.0.11': - resolution: {integrity: sha512-TaHAZRVe0Zlcc3C23StZqqbzC0NrodRwoSAc8dis+5qLeLLnOCtagYQeROQvDlcDg3X/VVEO9Whh4W/z4PAmYQ==} - - '@cspell/dict-django@4.1.0': - resolution: {integrity: sha512-bKJ4gPyrf+1c78Z0Oc4trEB9MuhcB+Yg+uTTWsvhY6O2ncFYbB/LbEZfqhfmmuK/XJJixXfI1laF2zicyf+l0w==} - - '@cspell/dict-docker@1.1.7': - resolution: {integrity: sha512-XlXHAr822euV36GGsl2J1CkBIVg3fZ6879ZOg5dxTIssuhUOCiV2BuzKZmt6aIFmcdPmR14+9i9Xq+3zuxeX0A==} - - '@cspell/dict-dotnet@5.0.0': - resolution: {integrity: sha512-EOwGd533v47aP5QYV8GlSSKkmM9Eq8P3G/eBzSpH3Nl2+IneDOYOBLEUraHuiCtnOkNsz0xtZHArYhAB2bHWAw==} - - '@cspell/dict-elixir@4.0.3': - resolution: {integrity: sha512-g+uKLWvOp9IEZvrIvBPTr/oaO6619uH/wyqypqvwpmnmpjcfi8+/hqZH8YNKt15oviK8k4CkINIqNhyndG9d9Q==} - - '@cspell/dict-en-common-misspellings@2.0.0': - resolution: {integrity: sha512-NOg8dlv37/YqLkCfBs5OXeJm/Wcfb/CzeOmOZJ2ZXRuxwsNuolb4TREUce0yAXRqMhawahY5TSDRJJBgKjBOdw==} - - '@cspell/dict-en-gb@1.1.33': - resolution: {integrity: sha512-tKSSUf9BJEV+GJQAYGw5e+ouhEe2ZXE620S7BLKe3ZmpnjlNG9JqlnaBhkIMxKnNFkLY2BP/EARzw31AZnOv4g==} - - '@cspell/dict-en_us@4.3.19': - resolution: {integrity: sha512-tHcXdkmm0t9LlRct1vgu3+h0KW/wlXCInkTiR4D/rl730q1zu2qVEgiy1saMiTUSNmdu7Hiy+Mhb+1braVqnZQ==} - - '@cspell/dict-filetypes@3.0.3': - resolution: {integrity: sha512-J9UP+qwwBLfOQ8Qg9tAsKtSY/WWmjj21uj6zXTI9hRLD1eG1uUOLcfVovAmtmVqUWziPSKMr87F6SXI3xmJXgw==} - - '@cspell/dict-fonts@4.0.0': - resolution: {integrity: sha512-t9V4GeN/m517UZn63kZPUYP3OQg5f0OBLSd3Md5CU3eH1IFogSvTzHHnz4Wqqbv8NNRiBZ3HfdY/pqREZ6br3Q==} - - '@cspell/dict-fsharp@1.0.1': - resolution: {integrity: sha512-23xyPcD+j+NnqOjRHgW3IU7Li912SX9wmeefcY0QxukbAxJ/vAN4rBpjSwwYZeQPAn3fxdfdNZs03fg+UM+4yQ==} - - '@cspell/dict-fullstack@3.1.5': - resolution: {integrity: sha512-6ppvo1dkXUZ3fbYn/wwzERxCa76RtDDl5Afzv2lijLoijGGUw5yYdLBKJnx8PJBGNLh829X352ftE7BElG4leA==} - - '@cspell/dict-gaming-terms@1.0.5': - resolution: {integrity: sha512-C3riccZDD3d9caJQQs1+MPfrUrQ+0KHdlj9iUR1QD92FgTOF6UxoBpvHUUZ9YSezslcmpFQK4xQQ5FUGS7uWfw==} - - '@cspell/dict-git@3.0.0': - resolution: {integrity: sha512-simGS/lIiXbEaqJu9E2VPoYW1OTC2xrwPPXNXFMa2uo/50av56qOuaxDrZ5eH1LidFXwoc8HROCHYeKoNrDLSw==} - - '@cspell/dict-golang@6.0.5': - resolution: {integrity: sha512-w4mEqGz4/wV+BBljLxduFNkMrd3rstBNDXmoX5kD4UTzIb4Sy0QybWCtg2iVT+R0KWiRRA56QKOvBsgXiddksA==} - - '@cspell/dict-haskell@4.0.1': - resolution: {integrity: sha512-uRrl65mGrOmwT7NxspB4xKXFUenNC7IikmpRZW8Uzqbqcu7ZRCUfstuVH7T1rmjRgRkjcIjE4PC11luDou4wEQ==} - - '@cspell/dict-html-symbol-entities@4.0.0': - resolution: {integrity: sha512-HGRu+48ErJjoweR5IbcixxETRewrBb0uxQBd6xFGcxbEYCX8CnQFTAmKI5xNaIt2PKaZiJH3ijodGSqbKdsxhw==} - - '@cspell/dict-html@4.0.5': - resolution: {integrity: sha512-p0brEnRybzSSWi8sGbuVEf7jSTDmXPx7XhQUb5bgG6b54uj+Z0Qf0V2n8b/LWwIPJNd1GygaO9l8k3HTCy1h4w==} - - '@cspell/dict-java@5.0.6': - resolution: {integrity: sha512-kdE4AHHHrixyZ5p6zyms1SLoYpaJarPxrz8Tveo6gddszBVVwIUZ+JkQE1bWNLK740GWzIXdkznpUfw1hP9nXw==} - - '@cspell/dict-julia@1.0.1': - resolution: {integrity: sha512-4JsCLCRhhLMLiaHpmR7zHFjj1qOauzDI5ZzCNQS31TUMfsOo26jAKDfo0jljFAKgw5M2fEG7sKr8IlPpQAYrmQ==} - - '@cspell/dict-k8s@1.0.2': - resolution: {integrity: sha512-tLT7gZpNPnGa+IIFvK9SP1LrSpPpJ94a/DulzAPOb1Q2UBFwdpFd82UWhio0RNShduvKG/WiMZf/wGl98pn+VQ==} - - '@cspell/dict-latex@4.0.0': - resolution: {integrity: sha512-LPY4y6D5oI7D3d+5JMJHK/wxYTQa2lJMSNxps2JtuF8hbAnBQb3igoWEjEbIbRRH1XBM0X8dQqemnjQNCiAtxQ==} - - '@cspell/dict-lorem-ipsum@4.0.0': - resolution: {integrity: sha512-1l3yjfNvMzZPibW8A7mQU4kTozwVZVw0AvFEdy+NcqtbxH+TvbSkNMqROOFWrkD2PjnKG0+Ea0tHI2Pi6Gchnw==} - - '@cspell/dict-lua@4.0.3': - resolution: {integrity: sha512-lDHKjsrrbqPaea13+G9s0rtXjMO06gPXPYRjRYawbNmo4E/e3XFfVzeci3OQDQNDmf2cPOwt9Ef5lu2lDmwfJg==} - - '@cspell/dict-makefile@1.0.0': - resolution: {integrity: sha512-3W9tHPcSbJa6s0bcqWo6VisEDTSN5zOtDbnPabF7rbyjRpNo0uHXHRJQF8gAbFzoTzBBhgkTmrfSiuyQm7vBUQ==} - - '@cspell/dict-monkeyc@1.0.6': - resolution: {integrity: sha512-oO8ZDu/FtZ55aq9Mb67HtaCnsLn59xvhO/t2mLLTHAp667hJFxpp7bCtr2zOrR1NELzFXmKln/2lw/PvxMSvrA==} - - '@cspell/dict-node@4.0.3': - resolution: {integrity: sha512-sFlUNI5kOogy49KtPg8SMQYirDGIAoKBO3+cDLIwD4MLdsWy1q0upc7pzGht3mrjuyMiPRUV14Bb0rkVLrxOhg==} - - '@cspell/dict-npm@5.0.15': - resolution: {integrity: sha512-sX0X5YWNW54F4baW7b5JJB6705OCBIZtUqjOghlJNORS5No7QY1IX1zc5FxNNu4gsaCZITAmfMi4ityXEsEThA==} - - '@cspell/dict-php@4.0.6': - resolution: {integrity: sha512-ySAXisf7twoVFZqBV2o/DKiCLIDTHNqfnj0EfH9OoOUR7HL3rb6zJkm0viLUFDO2G/8SyIi6YrN/6KX+Scjjjg==} - - '@cspell/dict-powershell@5.0.3': - resolution: {integrity: sha512-lEdzrcyau6mgzu1ie98GjOEegwVHvoaWtzQnm1ie4DyZgMr+N6D0Iyj1lzvtmt0snvsDFa5F2bsYzf3IMKcpcA==} - - '@cspell/dict-public-licenses@2.0.6': - resolution: {integrity: sha512-bHqpSpJvLCUcWxj1ov/Ki8WjmESpYwRpQlqfdchekOTc93Huhvjm/RXVN1R4fVf4Hspyem1QVkCGqAmjJMj6sw==} - - '@cspell/dict-python@4.1.11': - resolution: {integrity: sha512-XG+v3PumfzUW38huSbfT15Vqt3ihNb462ulfXifpQllPok5OWynhszCLCRQjQReV+dgz784ST4ggRxW452/kVg==} - - '@cspell/dict-r@2.0.1': - resolution: {integrity: sha512-KCmKaeYMLm2Ip79mlYPc8p+B2uzwBp4KMkzeLd5E6jUlCL93Y5Nvq68wV5fRLDRTf7N1LvofkVFWfDcednFOgA==} - - '@cspell/dict-ruby@5.0.2': - resolution: {integrity: sha512-cIh8KTjpldzFzKGgrqUX4bFyav5lC52hXDKo4LbRuMVncs3zg4hcSf4HtURY+f2AfEZzN6ZKzXafQpThq3dl2g==} - - '@cspell/dict-rust@4.0.2': - resolution: {integrity: sha512-RhziKDrklzOntxAbY3AvNR58wnFGIo3YS8+dNeLY36GFuWOvXDHFStYw5Pod4f/VXbO/+1tXtywCC4zWfB2p1w==} - - '@cspell/dict-scala@5.0.0': - resolution: {integrity: sha512-ph0twaRoV+ylui022clEO1dZ35QbeEQaKTaV2sPOsdwIokABPIiK09oWwGK9qg7jRGQwVaRPEq0Vp+IG1GpqSQ==} - - '@cspell/dict-software-terms@3.3.20': - resolution: {integrity: sha512-KmPwCxYWEu7SGyT/0m/n6i6R4ZgxbmN3XcerzA6Z629Wm5iZTVfJaMWqDK2RKAyBawS7OMfxGz0W/wYU4FhJlA==} - - '@cspell/dict-sql@2.1.3': - resolution: {integrity: sha512-SEyTNKJrjqD6PAzZ9WpdSu6P7wgdNtGV2RV8Kpuw1x6bV+YsSptuClYG+JSdRExBTE6LwIe1bTklejUp3ZP8TQ==} - - '@cspell/dict-svelte@1.0.2': - resolution: {integrity: sha512-rPJmnn/GsDs0btNvrRBciOhngKV98yZ9SHmg8qI6HLS8hZKvcXc0LMsf9LLuMK1TmS2+WQFAan6qeqg6bBxL2Q==} - - '@cspell/dict-swift@2.0.1': - resolution: {integrity: sha512-gxrCMUOndOk7xZFmXNtkCEeroZRnS2VbeaIPiymGRHj5H+qfTAzAKxtv7jJbVA3YYvEzWcVE2oKDP4wcbhIERw==} - - '@cspell/dict-terraform@1.0.0': - resolution: {integrity: sha512-Ak+vy4HP/bOgzf06BAMC30+ZvL9mzv21xLM2XtfnBLTDJGdxlk/nK0U6QT8VfFLqJ0ZZSpyOxGsUebWDCTr/zQ==} - - '@cspell/dict-typescript@3.1.4': - resolution: {integrity: sha512-jUcPa0rsPca5ur1+G56DXnSc5hbbJkzvPHHvyQtkbPXBQd3CXPMNfrTVCgzex/7cY/7FONcpFCUwgwfni9Jqbw==} - - '@cspell/dict-vue@3.0.0': - resolution: {integrity: sha512-niiEMPWPV9IeRBRzZ0TBZmNnkK3olkOPYxC1Ny2AX4TGlYRajcW0WUtoSHmvvjZNfWLSg2L6ruiBeuPSbjnG6A==} - - '@cspell/dynamic-import@8.7.0': - resolution: {integrity: sha512-xlEPdiHVDu+4xYkvwjL9MgklxOi9XB+Pr1H9s3Ww9WEq+q6BA3xOHxLIU/k8mhqFTMZGFZRCsdy/EwMu6SyRhQ==} - engines: {node: '>=18.0'} - - '@cspell/strong-weak-map@8.7.0': - resolution: {integrity: sha512-0bo0WwDr2lzGoCP7vbpWbDpPyuOrHKK+218txnUpx6Pn1EDBLfcDQsiZED5B6zlpwgbGi6y3vc0rWtJbjKvwzg==} - engines: {node: '>=18'} - - '@double-great/alt-text@3.1.0': - resolution: {integrity: sha512-5gSW9AI0KUO2GQe9K+KjyiCisxl4xL0kesQCxUsko4T9s8zler/stW0qcH5XryUgtKebb293qX9sz1nCmQpdTw==} - - '@double-great/remark-lint-alt-text@1.0.0': - resolution: {integrity: sha512-2FFjSX2VhT/USmsOEkcw40SiCHXXio2sWs4S7docKNFh+W7/z+bHYau+UHfrP4yDRVzfUVSV1MKnsxmigkhixg==} - - '@eslint-community/eslint-utils@4.4.0': - resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - - '@eslint-community/regexpp@4.10.0': - resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} - engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - - '@eslint/eslintrc@2.1.4': - resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - '@eslint/js@8.57.0': - resolution: {integrity: sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - '@eth-optimism/contracts-bedrock@0.17.2': - resolution: {integrity: sha512-YVwPHpBZgFwFX9qY8+iToVAAH7mSnVIVmih+YfHhqjAhlLvLZfYjvj+hRNgcB9eRyl1SOOB0jevp4JOOV1v2BA==} - - '@eth-optimism/contracts-ts@0.17.2': - resolution: {integrity: sha512-5aM+pn1uK8Hx9r9+PHCF6NQTYKVHmrm7Gc7LQ6sO9MQItVP1WdIWNcQYT7TQhkxGKHYG2arF06rbHGeGNqzBeg==} - peerDependencies: - '@wagmi/core': ^2.6.3 - wagmi: ^2.5.5 - peerDependenciesMeta: - '@wagmi/core': - optional: true - wagmi: - optional: true - - '@eth-optimism/contracts@0.6.0': - resolution: {integrity: sha512-vQ04wfG9kMf1Fwy3FEMqH2QZbgS0gldKhcBeBUPfO8zu68L61VI97UDXmsMQXzTsEAxK8HnokW3/gosl4/NW3w==} - peerDependencies: - ethers: ^5 - - '@eth-optimism/core-utils@0.12.0': - resolution: {integrity: sha512-qW+7LZYCz7i8dRa7SRlUKIo1VBU8lvN0HeXCxJR+z+xtMzMQpPds20XJNCMclszxYQHkXY00fOT6GvFw9ZL6nw==} - - '@eth-optimism/core-utils@0.13.2': - resolution: {integrity: sha512-u7TOKm1RxH1V5zw7dHmfy91bOuEAZU68LT/9vJPkuWEjaTl+BgvPDRDTurjzclHzN0GbWdcpOqPZg4ftjkJGaw==} - - '@eth-optimism/sdk@3.3.0': - resolution: {integrity: sha512-0Wt9roWe3itdzp08caCQLoFqhmT47ssquKAzBe7yXI6saVL+f2vWl6VgEaq0aYe2FsWvD9L0tSAJHLx1FiquNw==} - peerDependencies: - ethers: ^5 - - '@eth-optimism/tokenlist@9.0.51': - resolution: {integrity: sha512-GfKk4euEfNLniyRisP7sB/N9Kp96M+2t529mkvwC6nXITouzH4faDP8JdtwU6AOcgC4UlrFjXJ9w8ecnWWNQbw==} - - '@ethereumjs/rlp@4.0.1': - resolution: {integrity: sha512-tqsQiBQDQdmPWE1xkkBq4rlSW5QZpLOUJ5RJh2/9fug+q9tnUhuZoVLk7s0scUIKTOzEtR72DFBXI4WiZcMpvw==} - engines: {node: '>=14'} - hasBin: true - - '@ethereumjs/util@8.1.0': - resolution: {integrity: sha512-zQ0IqbdX8FZ9aw11vP+dZkKDkS+kgIvQPHnSAXzP9pLu+Rfu3D3XEeLbicvoXJTYnhZiPmsZUxgdzXwNKxRPbA==} - engines: {node: '>=14'} - - '@ethersproject/abi@5.7.0': - resolution: {integrity: sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA==} - - '@ethersproject/abstract-provider@5.7.0': - resolution: {integrity: sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw==} - - '@ethersproject/abstract-signer@5.7.0': - resolution: {integrity: sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ==} - - '@ethersproject/address@5.7.0': - resolution: {integrity: sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==} - - '@ethersproject/base64@5.7.0': - resolution: {integrity: sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ==} - - '@ethersproject/basex@5.7.0': - resolution: {integrity: sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw==} - - '@ethersproject/bignumber@5.7.0': - resolution: {integrity: sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw==} - - '@ethersproject/bytes@5.7.0': - resolution: {integrity: sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A==} - - '@ethersproject/constants@5.7.0': - resolution: {integrity: sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA==} - - '@ethersproject/contracts@5.7.0': - resolution: {integrity: sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg==} - - '@ethersproject/hash@5.7.0': - resolution: {integrity: sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g==} - - '@ethersproject/hdnode@5.7.0': - resolution: {integrity: sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg==} - - '@ethersproject/json-wallets@5.7.0': - resolution: {integrity: sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g==} - - '@ethersproject/keccak256@5.7.0': - resolution: {integrity: sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg==} - - '@ethersproject/logger@5.7.0': - resolution: {integrity: sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig==} - - '@ethersproject/networks@5.7.1': - resolution: {integrity: sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ==} - - '@ethersproject/pbkdf2@5.7.0': - resolution: {integrity: sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw==} - - '@ethersproject/properties@5.7.0': - resolution: {integrity: sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw==} - - '@ethersproject/providers@5.7.2': - resolution: {integrity: sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg==} - - '@ethersproject/random@5.7.0': - resolution: {integrity: sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ==} - - '@ethersproject/rlp@5.7.0': - resolution: {integrity: sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w==} - - '@ethersproject/sha2@5.7.0': - resolution: {integrity: sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw==} - - '@ethersproject/signing-key@5.7.0': - resolution: {integrity: sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q==} - - '@ethersproject/solidity@5.7.0': - resolution: {integrity: sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA==} - - '@ethersproject/strings@5.7.0': - resolution: {integrity: sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg==} - - '@ethersproject/transactions@5.7.0': - resolution: {integrity: sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ==} - - '@ethersproject/units@5.7.0': - resolution: {integrity: sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg==} - - '@ethersproject/wallet@5.7.0': - resolution: {integrity: sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA==} - - '@ethersproject/web@5.7.1': - resolution: {integrity: sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w==} - - '@ethersproject/wordlists@5.7.0': - resolution: {integrity: sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA==} - - '@feelback/js@0.3.4': - resolution: {integrity: sha512-xr7gTqSJcVUYQlELs1TntYovCBjMcYUr/hGKTnDoF64/lig5CbX4bOmqLoF50IImCy5q3oIwg9w+TSFvtBwsIA==} - - '@feelback/react@0.3.4': - resolution: {integrity: sha512-ZWzUQAmPwl4nYR2olzBKddHzoLtGW/2pb8TiesiJCirxhaDW2E/XBx2ZaB4fL5TGXtjBt4eYq/qZxJZ0fIE0kg==} - engines: {node: '>=14'} - peerDependencies: - react: '>=17' - - '@floating-ui/core@1.6.8': - resolution: {integrity: sha512-7XJ9cPU+yI2QeLS+FCSlqNFZJq8arvswefkZrYI1yQBbftw6FyrZOxYSh+9S7z7TpeWlRt9zJ5IhM1WIL334jA==} - - '@floating-ui/dom@1.6.11': - resolution: {integrity: sha512-qkMCxSR24v2vGkhYDo/UzxfJN3D4syqSjyuTFz6C7XcpU1pASPRieNI0Kj5VP3/503mOfYiGY891ugBX1GlABQ==} - - '@floating-ui/react-dom@2.1.2': - resolution: {integrity: sha512-06okr5cgPzMNBy+Ycse2A6udMi4bqwW/zgBF/rwjcNqWkyr82Mcg8b0vjX8OJpZFy/FKjJmw6wV7t44kK6kW7A==} - peerDependencies: - react: '>=16.8.0' - react-dom: '>=16.8.0' - - '@floating-ui/react@0.26.24': - resolution: {integrity: sha512-2ly0pCkZIGEQUq5H8bBK0XJmc1xIK/RM3tvVzY3GBER7IOD1UgmC2Y2tjj4AuS+TC+vTE1KJv2053290jua0Sw==} - peerDependencies: - react: '>=16.8.0' - react-dom: '>=16.8.0' - - '@floating-ui/utils@0.2.8': - resolution: {integrity: sha512-kym7SodPp8/wloecOpcmSnWJsK7M0E5Wg8UcFA+uO4B9s5d0ywXOEro/8HM9x0rW+TljRzul/14UYz3TleT3ig==} - - '@headlessui/react@1.7.19': - resolution: {integrity: sha512-Ll+8q3OlMJfJbAKM/+/Y2q6PPYbryqNTXDbryx7SXLIDamkF6iQFbriYHga0dY44PvDhvvBWCx1Xj4U5+G4hOw==} - engines: {node: '>=10'} - peerDependencies: - react: ^16 || ^17 || ^18 - react-dom: ^16 || ^17 || ^18 - - '@headlessui/react@2.1.8': - resolution: {integrity: sha512-uajqVkAcVG/wHwG9Fh5PFMcFpf2VxM4vNRNKxRjuK009kePVur8LkuuygHfIE+2uZ7z7GnlTtYsyUe6glPpTLg==} - engines: {node: '>=10'} - peerDependencies: - react: ^18 - react-dom: ^18 - - '@humanwhocodes/config-array@0.11.14': - resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} - engines: {node: '>=10.10.0'} - deprecated: Use @eslint/config-array instead - - '@humanwhocodes/module-importer@1.0.1': - resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} - engines: {node: '>=12.22'} - - '@humanwhocodes/object-schema@2.0.3': - resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} - deprecated: Use @eslint/object-schema instead - - '@isaacs/cliui@8.0.2': - resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} - engines: {node: '>=12'} - - '@jsdevtools/ono@7.1.3': - resolution: {integrity: sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==} - - '@mdx-js/mdx@2.3.0': - resolution: {integrity: sha512-jLuwRlz8DQfQNiUCJR50Y09CGPq3fLtmtUQfVrj79E0JWu3dvsVcxVIcfhR5h0iXu+/z++zDrYeiJqifRynJkA==} - - '@mdx-js/react@2.3.0': - resolution: {integrity: sha512-zQH//gdOmuu7nt2oJR29vFhDv88oGPmVw6BggmrHeMI+xgEkp1B2dX9/bMBSYtK0dyLX/aOmesKS09g222K1/g==} - peerDependencies: - react: '>=16' - - '@napi-rs/simple-git-android-arm-eabi@0.1.16': - resolution: {integrity: sha512-dbrCL0Pl5KZG7x7tXdtVsA5CO6At5ohDX3myf5xIYn9kN4jDFxsocl8bNt6Vb/hZQoJd8fI+k5VlJt+rFhbdVw==} - engines: {node: '>= 10'} - cpu: [arm] - os: [android] - - '@napi-rs/simple-git-android-arm64@0.1.16': - resolution: {integrity: sha512-xYz+TW5J09iK8SuTAKK2D5MMIsBUXVSs8nYp7HcMi8q6FCRO7yJj96YfP9PvKsc/k64hOyqGmL5DhCzY9Cu1FQ==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [android] - - '@napi-rs/simple-git-darwin-arm64@0.1.16': - resolution: {integrity: sha512-XfgsYqxhUE022MJobeiX563TJqyQyX4FmYCnqrtJwAfivESVeAJiH6bQIum8dDEYMHXCsG7nL8Ok0Dp8k2m42g==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [darwin] - - '@napi-rs/simple-git-darwin-x64@0.1.16': - resolution: {integrity: sha512-tkEVBhD6vgRCbeWsaAQqM3bTfpIVGeitamPPRVSbsq8qgzJ5Dx6ZedH27R7KSsA/uao7mZ3dsrNLXbu1Wy5MzA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [darwin] - - '@napi-rs/simple-git-linux-arm-gnueabihf@0.1.16': - resolution: {integrity: sha512-R6VAyNnp/yRaT7DV1Ao3r67SqTWDa+fNq2LrNy0Z8gXk2wB9ZKlrxFtLPE1WSpWknWtyRDLpRlsorh7Evk7+7w==} - engines: {node: '>= 10'} - cpu: [arm] - os: [linux] - - '@napi-rs/simple-git-linux-arm64-gnu@0.1.16': - resolution: {integrity: sha512-LAGI0opFKw/HBMCV2qIBK3uWSEW9h4xd2ireZKLJy8DBPymX6NrWIamuxYNyCuACnFdPRxR4LaRFy4J5ZwuMdw==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - - '@napi-rs/simple-git-linux-arm64-musl@0.1.16': - resolution: {integrity: sha512-I57Ph0F0Yn2KW93ep+V1EzKhACqX0x49vvSiapqIsdDA2PifdEWLc1LJarBolmK7NKoPqKmf6lAKKO9lhiZzkg==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - - '@napi-rs/simple-git-linux-x64-gnu@0.1.16': - resolution: {integrity: sha512-AZYYFY2V7hlcQASPEOWyOa3e1skzTct9QPzz0LiDM3f/hCFY/wBaU2M6NC5iG3d2Kr38heuyFS/+JqxLm5WaKA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - - '@napi-rs/simple-git-linux-x64-musl@0.1.16': - resolution: {integrity: sha512-9TyMcYSBJwjT8jwjY9m24BZbu7ozyWTjsmYBYNtK3B0Um1Ov6jthSNneLVvouQ6x+k3Ow+00TiFh6bvmT00r8g==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - - '@napi-rs/simple-git-win32-arm64-msvc@0.1.16': - resolution: {integrity: sha512-uslJ1WuAHCYJWui6xjsyT47SjX6KOHDtClmNO8hqKz1pmDSNY7AjyUY8HxvD1lK9bDnWwc4JYhikS9cxCqHybw==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [win32] - - '@napi-rs/simple-git-win32-x64-msvc@0.1.16': - resolution: {integrity: sha512-SoEaVeCZCDF1MP+M9bMSXsZWgEjk4On9GWADO5JOulvzR1bKjk0s9PMHwe/YztR9F0sJzrCxwtvBZowhSJsQPg==} - engines: {node: '>= 10'} - cpu: [x64] - os: [win32] - - '@napi-rs/simple-git@0.1.16': - resolution: {integrity: sha512-C5wRPw9waqL2jk3jEDeJv+f7ScuO3N0a39HVdyFLkwKxHH4Sya4ZbzZsu2JLi6eEqe7RuHipHL6mC7B2OfYZZw==} - engines: {node: '>= 10'} - - '@next/env@13.5.6': - resolution: {integrity: sha512-Yac/bV5sBGkkEXmAX5FWPS9Mmo2rthrOPRQQNfycJPkjUAUclomCPH7QFVCDQ4Mp2k2K1SSM6m0zrxYrOwtFQw==} - - '@next/env@14.2.10': - resolution: {integrity: sha512-dZIu93Bf5LUtluBXIv4woQw2cZVZ2DJTjax5/5DOs3lzEOeKLy7GxRSr4caK9/SCPdaW6bCgpye6+n4Dh9oJPw==} - - '@next/swc-darwin-arm64@14.2.10': - resolution: {integrity: sha512-V3z10NV+cvMAfxQUMhKgfQnPbjw+Ew3cnr64b0lr8MDiBJs3eLnM6RpGC46nhfMZsiXgQngCJKWGTC/yDcgrDQ==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [darwin] - - '@next/swc-darwin-x64@14.2.10': - resolution: {integrity: sha512-Y0TC+FXbFUQ2MQgimJ/7Ina2mXIKhE7F+GUe1SgnzRmwFY3hX2z8nyVCxE82I2RicspdkZnSWMn4oTjIKz4uzA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [darwin] - - '@next/swc-linux-arm64-gnu@14.2.10': - resolution: {integrity: sha512-ZfQ7yOy5zyskSj9rFpa0Yd7gkrBnJTkYVSya95hX3zeBG9E55Z6OTNPn1j2BTFWvOVVj65C3T+qsjOyVI9DQpA==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - - '@next/swc-linux-arm64-musl@14.2.10': - resolution: {integrity: sha512-n2i5o3y2jpBfXFRxDREr342BGIQCJbdAUi/K4q6Env3aSx8erM9VuKXHw5KNROK9ejFSPf0LhoSkU/ZiNdacpQ==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - - '@next/swc-linux-x64-gnu@14.2.10': - resolution: {integrity: sha512-GXvajAWh2woTT0GKEDlkVhFNxhJS/XdDmrVHrPOA83pLzlGPQnixqxD8u3bBB9oATBKB//5e4vpACnx5Vaxdqg==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - - '@next/swc-linux-x64-musl@14.2.10': - resolution: {integrity: sha512-opFFN5B0SnO+HTz4Wq4HaylXGFV+iHrVxd3YvREUX9K+xfc4ePbRrxqOuPOFjtSuiVouwe6uLeDtabjEIbkmDA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - - '@next/swc-win32-arm64-msvc@14.2.10': - resolution: {integrity: sha512-9NUzZuR8WiXTvv+EiU/MXdcQ1XUvFixbLIMNQiVHuzs7ZIFrJDLJDaOF1KaqttoTujpcxljM/RNAOmw1GhPPQQ==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [win32] - - '@next/swc-win32-ia32-msvc@14.2.10': - resolution: {integrity: sha512-fr3aEbSd1GeW3YUMBkWAu4hcdjZ6g4NBl1uku4gAn661tcxd1bHs1THWYzdsbTRLcCKLjrDZlNp6j2HTfrw+Bg==} - engines: {node: '>= 10'} - cpu: [ia32] - os: [win32] - - '@next/swc-win32-x64-msvc@14.2.10': - resolution: {integrity: sha512-UjeVoRGKNL2zfbcQ6fscmgjBAS/inHBh63mjIlfPg/NG8Yn2ztqylXt5qilYb6hoHIwaU2ogHknHWWmahJjgZQ==} - engines: {node: '>= 10'} - cpu: [x64] - os: [win32] - - '@noble/curves@1.2.0': - resolution: {integrity: sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==} - - '@noble/curves@1.3.0': - resolution: {integrity: sha512-t01iSXPuN+Eqzb4eBX0S5oubSqXbK/xXa1Ne18Hj8f9pStxztHCE2gfboSp/dZRLSqfuLpRK2nDXDK+W9puocA==} - - '@noble/hashes@1.3.2': - resolution: {integrity: sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==} - engines: {node: '>= 16'} - - '@noble/hashes@1.3.3': - resolution: {integrity: sha512-V7/fPHgl+jsVPXqqeOzT8egNj2iBIVt+ECeMMG8TdcnTikP3oaBtUVqpT/gYCR68aEBJSF+XbYUxStjbFMqIIA==} - engines: {node: '>= 16'} - - '@noble/hashes@1.4.0': - resolution: {integrity: sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==} - engines: {node: '>= 16'} - - '@nodelib/fs.scandir@2.1.5': - resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} - engines: {node: '>= 8'} - - '@nodelib/fs.stat@2.0.5': - resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} - engines: {node: '>= 8'} - - '@nodelib/fs.walk@1.2.8': - resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} - engines: {node: '>= 8'} - - '@npmcli/config@6.4.1': - resolution: {integrity: sha512-uSz+elSGzjCMANWa5IlbGczLYPkNI/LeR+cHrgaTqTrTSh9RHhOFA4daD2eRUz6lMtOW+Fnsb+qv7V2Zz8ML0g==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - - '@npmcli/map-workspaces@3.0.6': - resolution: {integrity: sha512-tkYs0OYnzQm6iIRdfy+LcLBjcKuQCeE5YLb8KnrIlutJfheNaPvPpgoFEyEFgbjzl5PLZ3IA/BWAwRU0eHuQDA==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - - '@npmcli/name-from-folder@2.0.0': - resolution: {integrity: sha512-pwK+BfEBZJbKdNYpHHRTNBwBoqrN/iIMO0AiGvYsp3Hoaq0WbgGSWQR6SCldZovoDpY3yje5lkFUe6gsDgJ2vg==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - - '@pkgjs/parseargs@0.11.0': - resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} - engines: {node: '>=14'} - - '@pkgr/core@0.1.1': - resolution: {integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==} - engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} - - '@popperjs/core@2.11.8': - resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==} - - '@react-aria/focus@3.18.2': - resolution: {integrity: sha512-Jc/IY+StjA3uqN73o6txKQ527RFU7gnG5crEl5Xy3V+gbYp2O5L3ezAo/E0Ipi2cyMbG6T5Iit1IDs7hcGu8aw==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - - '@react-aria/interactions@3.22.2': - resolution: {integrity: sha512-xE/77fRVSlqHp2sfkrMeNLrqf2amF/RyuAS6T5oDJemRSgYM3UoxTbWjucPhfnoW7r32pFPHHgz4lbdX8xqD/g==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - - '@react-aria/ssr@3.9.5': - resolution: {integrity: sha512-xEwGKoysu+oXulibNUSkXf8itW0npHHTa6c4AyYeZIJyRoegeteYuFpZUBPtIDE8RfHdNsSmE1ssOkxRnwbkuQ==} - engines: {node: '>= 12'} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - - '@react-aria/utils@3.25.2': - resolution: {integrity: sha512-GdIvG8GBJJZygB4L2QJP1Gabyn2mjFsha73I2wSe+o4DYeGWoJiMZRM06PyTIxLH4S7Sn7eVDtsSBfkc2VY/NA==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - - '@react-stately/utils@3.10.3': - resolution: {integrity: sha512-moClv7MlVSHpbYtQIkm0Cx+on8Pgt1XqtPx6fy9rQFb2DNc9u1G3AUVnqA17buOkH1vLxAtX4MedlxMWyRCYYA==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - - '@react-types/shared@3.24.1': - resolution: {integrity: sha512-AUQeGYEm/zDTN6zLzdXolDxz3Jk5dDL7f506F07U8tBwxNNI3WRdhU84G0/AaFikOZzDXhOZDr3MhQMzyE7Ydw==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - - '@scure/base@1.1.6': - resolution: {integrity: sha512-ok9AWwhcgYuGG3Zfhyqg+zwl+Wn5uE+dwC0NV/2qQkx4dABbb/bx96vWu8NSj+BNjjSjno+JRYRjle1jV08k3g==} - - '@scure/bip32@1.3.2': - resolution: {integrity: sha512-N1ZhksgwD3OBlwTv3R6KFEcPojl/W4ElJOeCZdi+vuI5QmTFwLq3OFf2zd2ROpKvxFdgZ6hUpb0dx9bVNEwYCA==} - - '@scure/bip32@1.3.3': - resolution: {integrity: sha512-LJaN3HwRbfQK0X1xFSi0Q9amqOgzQnnDngIt+ZlsBC3Bm7/nE7K0kwshZHyaru79yIVRv/e1mQAjZyuZG6jOFQ==} - - '@scure/bip39@1.2.1': - resolution: {integrity: sha512-Z3/Fsz1yr904dduJD0NpiyRHhRYHdcnyh73FZWiV+/qhWi83wNJ3NWolYqCEN+ZWsUz2TWwajJggcRE9r1zUYg==} - - '@scure/bip39@1.2.2': - resolution: {integrity: sha512-HYf9TUXG80beW+hGAt3TRM8wU6pQoYur9iNypTROm42dorCGmLnFe3eWjz3gOq6G62H2WRh0FCzAR1PI+29zIA==} - - '@swc/counter@0.1.3': - resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} - - '@swc/helpers@0.5.2': - resolution: {integrity: sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==} - - '@swc/helpers@0.5.5': - resolution: {integrity: sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A==} - - '@tanstack/react-virtual@3.10.8': - resolution: {integrity: sha512-VbzbVGSsZlQktyLrP5nxE+vE1ZR+U0NFAWPbJLoG2+DKPwd2D7dVICTVIIaYlJqX1ZCEnYDbaOpmMwbsyhBoIA==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - - '@tanstack/react-virtual@3.5.0': - resolution: {integrity: sha512-rtvo7KwuIvqK9zb0VZ5IL7fiJAEnG+0EiFZz8FUOs+2mhGqdGmjKIaT1XU7Zq0eFqL0jonLlhbayJI/J2SA/Bw==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - - '@tanstack/virtual-core@3.10.8': - resolution: {integrity: sha512-PBu00mtt95jbKFi6Llk9aik8bnR3tR/oQP1o3TSi+iG//+Q2RTIzCEgKkHG8BB86kxMNW6O8wku+Lmi+QFR6jA==} - - '@tanstack/virtual-core@3.5.0': - resolution: {integrity: sha512-KnPRCkQTyqhanNC0K63GBG3wA8I+D1fQuVnAvcBF8f13akOKeQp1gSbu6f77zCxhEk727iV5oQnbHLYzHrECLg==} - - '@testing-library/dom@9.3.4': - resolution: {integrity: sha512-FlS4ZWlp97iiNWig0Muq8p+3rVDjRiYE+YKGbAqXOu9nwJFFOdL00kFpz42M+4huzYi86vAK1sOOfyOG45muIQ==} - engines: {node: '>=14'} - - '@testing-library/react@14.3.1': - resolution: {integrity: sha512-H99XjUhWQw0lTgyMN05W3xQG1Nh4lq574D8keFf1dDoNTJgp66VbJozRaczoF+wsiaPJNt/TcnfpLGufGxSrZQ==} - engines: {node: '>=14'} - peerDependencies: - react: ^18.0.0 - react-dom: ^18.0.0 - - '@theguild/remark-mermaid@0.0.5': - resolution: {integrity: sha512-e+ZIyJkEv9jabI4m7q29wZtZv+2iwPGsXJ2d46Zi7e+QcFudiyuqhLhHG/3gX3ZEB+hxTch+fpItyMS8jwbIcw==} - peerDependencies: - react: ^18.2.0 - - '@theguild/remark-npm2yarn@0.2.1': - resolution: {integrity: sha512-jUTFWwDxtLEFtGZh/TW/w30ySaDJ8atKWH8dq2/IiQF61dPrGfETpl0WxD0VdBfuLOeU14/kop466oBSRO/5CA==} - - '@types/acorn@4.0.6': - resolution: {integrity: sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ==} - - '@types/aria-query@5.0.4': - resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==} - - '@types/change-case@2.3.1': - resolution: {integrity: sha512-HYiGjhmGInNzJjtt6ciXEfl2s8ZQGUQpPiwgWSth1fycE69hXbV/RgWH7MvSq2QPhMBzi4SGhu1vE+cMx1xB8g==} - deprecated: This is a stub types definition for change-case (https://github.com/blakeembrey/change-case). change-case provides its own type definitions, so you don't need @types/change-case installed! - - '@types/concat-stream@2.0.3': - resolution: {integrity: sha512-3qe4oQAPNwVNwK4C9c8u+VJqv9kez+2MR4qJpoPFfXtgxxif1QbFusvXzK0/Wra2VX07smostI2VMmJNSpZjuQ==} - - '@types/d3-scale-chromatic@3.0.3': - resolution: {integrity: sha512-laXM4+1o5ImZv3RpFAsTRn3TEkzqkytiOY0Dz0sq5cnd1dtNlk6sHLon4OvqaiJb28T0S/TdsBI3Sjsy+keJrw==} - - '@types/d3-scale@4.0.8': - resolution: {integrity: sha512-gkK1VVTr5iNiYJ7vWDI+yUFFlszhNMtVeneJ6lUTKPjprsvLLI9/tgEGiXJOnlINJA8FyA88gfnQsHbybVZrYQ==} - - '@types/d3-time@3.0.3': - resolution: {integrity: sha512-2p6olUZ4w3s+07q3Tm2dbiMZy5pCDfYwtLXXHUnVzXgQlZ/OyPtUz6OL382BkOuGlLXqfT+wqv8Fw2v8/0geBw==} - - '@types/debug@4.1.12': - resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} - - '@types/estree-jsx@1.0.5': - resolution: {integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==} - - '@types/estree@1.0.5': - resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} - - '@types/hast@2.3.10': - resolution: {integrity: sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw==} - - '@types/hast@3.0.4': - resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} - - '@types/is-empty@1.2.3': - resolution: {integrity: sha512-4J1l5d79hoIvsrKh5VUKVRA1aIdsOb10Hu5j3J2VfP/msDnfTdGPmNp2E1Wg+vs97Bktzo+MZePFFXSGoykYJw==} - - '@types/js-yaml@4.0.9': - resolution: {integrity: sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==} - - '@types/json-schema@7.0.15': - resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - - '@types/katex@0.16.7': - resolution: {integrity: sha512-HMwFiRujE5PjrgwHQ25+bsLJgowjGjm5Z8FVSf0N6PwgJrwxH0QxzHYDcKsTfV3wva0vzrpqMTJS2jXPr5BMEQ==} - - '@types/lodash.clonedeep@4.5.9': - resolution: {integrity: sha512-19429mWC+FyaAhOLzsS8kZUsI+/GmBAQ0HFiCPsKGU+7pBXOQWhyrY6xNNDwUSX8SMZMJvuFVMF9O5dQOlQK9Q==} - - '@types/lodash@4.17.0': - resolution: {integrity: sha512-t7dhREVv6dbNj0q17X12j7yDG4bD/DHYX7o5/DbDxobP0HnGPgpRz2Ej77aL7TZT3DSw13fqUTj8J4mMnqa7WA==} - - '@types/mdast@3.0.15': - resolution: {integrity: sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==} - - '@types/mdast@4.0.3': - resolution: {integrity: sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg==} - - '@types/mdx@2.0.13': - resolution: {integrity: sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==} - - '@types/ms@0.7.34': - resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==} - - '@types/node@18.11.10': - resolution: {integrity: sha512-juG3RWMBOqcOuXC643OAdSA525V44cVgGV6dUDuiFtss+8Fk5x1hI93Rsld43VeJVIeqlP9I7Fn9/qaVqoEAuQ==} - - '@types/prop-types@15.7.12': - resolution: {integrity: sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==} - - '@types/react-dom@18.3.0': - resolution: {integrity: sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==} - - '@types/react@18.3.1': - resolution: {integrity: sha512-V0kuGBX3+prX+DQ/7r2qsv1NsdfnCLnTgnRJ1pYnxykBhGMz+qj+box5lq7XsO5mtZsBqpjwwTu/7wszPfMBcw==} - - '@types/supports-color@8.1.3': - resolution: {integrity: sha512-Hy6UMpxhE3j1tLpl27exp1XqHD7n8chAiNPzWfz16LPZoMMoSc4dzLl6w9qijkEb/r5O1ozdu1CWGA2L83ZeZg==} - - '@types/unist@2.0.10': - resolution: {integrity: sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==} - - '@types/unist@3.0.2': - resolution: {integrity: sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==} - - '@ungap/structured-clone@1.2.0': - resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} - - abbrev@2.0.0: - resolution: {integrity: sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - - abitype@1.0.0: - resolution: {integrity: sha512-NMeMah//6bJ56H5XRj8QCV4AwuW6hB6zqz2LnhhLdcWVQOsXki6/Pn3APeqxCma62nXIcmZWdu1DlHWS74umVQ==} - peerDependencies: - typescript: '>=5.0.4' - zod: ^3 >=3.22.0 - peerDependenciesMeta: - typescript: - optional: true - zod: - optional: true - - acorn-jsx@5.3.2: - resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} - peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - - acorn@8.11.3: - resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} - engines: {node: '>=0.4.0'} - hasBin: true - - aes-js@3.0.0: - resolution: {integrity: sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==} - - ajv-formats@2.1.1: - resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} - peerDependencies: - ajv: ^8.0.0 - peerDependenciesMeta: - ajv: - optional: true - - ajv@6.12.6: - resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} - - ajv@8.12.0: - resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} - - algoliasearch@4.23.3: - resolution: {integrity: sha512-Le/3YgNvjW9zxIQMRhUHuhiUjAlKY/zsdZpfq4dlLqg6mEm0nL6yk+7f2hDOtLpxsgE4jSzDmvHL7nXdBp5feg==} - - ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} - - ansi-regex@6.0.1: - resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} - engines: {node: '>=12'} - - ansi-sequence-parser@1.1.1: - resolution: {integrity: sha512-vJXt3yiaUL4UU546s3rPXlsry/RnM730G1+HkpKE012AN0sx1eOrxSu95oKDIonskeLTijMgqWZ3uDEe3NFvyg==} - - ansi-styles@3.2.1: - resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} - engines: {node: '>=4'} - - ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} - - ansi-styles@5.2.0: - resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} - engines: {node: '>=10'} - - ansi-styles@6.2.1: - resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} - engines: {node: '>=12'} - - arch@2.2.0: - resolution: {integrity: sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==} - - arg@1.0.0: - resolution: {integrity: sha512-Wk7TEzl1KqvTGs/uyhmHO/3XLd3t1UeU4IstvPXVzGPM522cTjqjNZ99esCkcL52sjqjo8e8CTBcWhkxvGzoAw==} - - argparse@1.0.10: - resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} - - argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - - aria-query@5.1.3: - resolution: {integrity: sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==} - - array-buffer-byte-length@1.0.1: - resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} - engines: {node: '>= 0.4'} - - array-timsort@1.0.3: - resolution: {integrity: sha512-/+3GRL7dDAGEfM6TseQk/U+mi18TU2Ms9I3UlLdUMhz2hbvGNTKdj9xniwXfUqgYhHxRx0+8UnKkvlNwVU+cWQ==} - - array-union@2.1.0: - resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} - engines: {node: '>=8'} - - assertion-error@1.1.0: - resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} - - astring@1.8.6: - resolution: {integrity: sha512-ISvCdHdlTDlH5IpxQJIex7BWBywFWgjJSVdwst+/iQCoEYnyOaQ95+X1JGshuBjGp6nxKUy1jMgE3zPqN7fQdg==} - hasBin: true - - available-typed-arrays@1.0.7: - resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} - engines: {node: '>= 0.4'} - - bail@2.0.2: - resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} - - balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - - bech32@1.1.4: - resolution: {integrity: sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==} - - bignumber.js@9.1.2: - resolution: {integrity: sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==} - - bn.js@4.11.6: - resolution: {integrity: sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA==} - - bn.js@4.12.0: - resolution: {integrity: sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==} - - bn.js@5.2.1: - resolution: {integrity: sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==} - - brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} - - brace-expansion@2.0.1: - resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} - - braces@3.0.3: - resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} - engines: {node: '>=8'} - - brorand@1.1.0: - resolution: {integrity: sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==} - - buffer-from@1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - - buffer-reverse@1.0.1: - resolution: {integrity: sha512-M87YIUBsZ6N924W57vDwT/aOu8hw7ZgdByz6ijksLjmHJELBASmYTTlNHRgjE+pTsT9oJXGaDSgqqwfdHotDUg==} - - bufio@1.2.1: - resolution: {integrity: sha512-9oR3zNdupcg/Ge2sSHQF3GX+kmvL/fTPvD0nd5AGLq8SjUYnTz+SlFjK/GXidndbZtIj+pVKXiWeR9w6e9wKCA==} - engines: {node: '>=14.0.0'} - - busboy@1.6.0: - resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} - engines: {node: '>=10.16.0'} - - call-bind@1.0.7: - resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} - engines: {node: '>= 0.4'} - - callsites@3.1.0: - resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} - engines: {node: '>=6'} - - camel-case@4.1.2: - resolution: {integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==} - - caniuse-lite@1.0.30001614: - resolution: {integrity: sha512-jmZQ1VpmlRwHgdP1/uiKzgiAuGOfLEJsYFP4+GBou/QQ4U6IOJCB4NP1c+1p9RGLpwObcT94jA5/uO+F1vBbog==} - - capital-case@1.0.4: - resolution: {integrity: sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==} - - ccount@2.0.1: - resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} - - chai@4.4.1: - resolution: {integrity: sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==} - engines: {node: '>=4'} - - chalk-template@1.1.0: - resolution: {integrity: sha512-T2VJbcDuZQ0Tb2EWwSotMPJjgpy1/tGee1BTpUNsGZ/qgNjV2t7Mvu+d4600U564nbLesN1x2dPL+xii174Ekg==} - engines: {node: '>=14.16'} - - chalk@2.3.0: - resolution: {integrity: sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==} - engines: {node: '>=4'} - - chalk@2.4.2: - resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} - engines: {node: '>=4'} - - chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} - - chalk@5.3.0: - resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - - change-case@4.1.2: - resolution: {integrity: sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A==} - - character-entities-html4@2.1.0: - resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} - - character-entities-legacy@1.1.4: - resolution: {integrity: sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==} - - character-entities-legacy@3.0.0: - resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} - - character-entities@1.2.4: - resolution: {integrity: sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==} - - character-entities@2.0.2: - resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} - - character-reference-invalid@1.1.4: - resolution: {integrity: sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==} - - character-reference-invalid@2.0.1: - resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} - - check-error@1.0.3: - resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} - - ci-info@4.0.0: - resolution: {integrity: sha512-TdHqgGf9odd8SXNuxtUBVx8Nv+qZOejE6qyqiy5NtbYYQOeFa6zmHkxlPzmaLxWWHsU6nJmB7AETdVPi+2NBUg==} - engines: {node: '>=8'} - - clear-module@4.1.2: - resolution: {integrity: sha512-LWAxzHqdHsAZlPlEyJ2Poz6AIs384mPeqLVCru2p0BrP9G/kVGuhNyZYClLO6cXlnuJjzC8xtsJIuMjKqLXoAw==} - engines: {node: '>=8'} - - client-only@0.0.1: - resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} - - clipboardy@1.2.2: - resolution: {integrity: sha512-16KrBOV7bHmHdxcQiCvfUFYVFyEah4FI8vYT1Fr7CGSA4G+xBWMEfUEQJS1hxeHGtI9ju1Bzs9uXSbj5HZKArw==} - engines: {node: '>=4'} - - clsx@2.1.1: - resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} - engines: {node: '>=6'} - - color-convert@1.9.3: - resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} - - color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} - - color-name@1.1.3: - resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} - - color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - - comma-separated-tokens@2.0.3: - resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} - - commander@12.0.0: - resolution: {integrity: sha512-MwVNWlYjDTtOjX5PiD7o5pK0UrFU/OYgcJfjjK4RaHZETNtjJqrZa9Y9ds88+A+f+d5lv+561eZ+yCKoS3gbAA==} - engines: {node: '>=18'} - - commander@7.2.0: - resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} - engines: {node: '>= 10'} - - commander@8.3.0: - resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} - engines: {node: '>= 12'} - - comment-json@4.2.3: - resolution: {integrity: sha512-SsxdiOf064DWoZLH799Ata6u7iV658A11PlWtZATDlXPpKGJnbJZ5Z24ybixAi+LUUqJ/GKowAejtC5GFUG7Tw==} - engines: {node: '>= 6'} - - compute-scroll-into-view@3.1.0: - resolution: {integrity: sha512-rj8l8pD4bJ1nx+dAkMhV1xB5RuZEyVysfxJqB1pRchh1KVvwOv9b7CGB8ZfjTImVv2oF+sYMUkMZq6Na5Ftmbg==} - - concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - - concat-stream@2.0.0: - resolution: {integrity: sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==} - engines: {'0': node >= 6.0} - - configstore@6.0.0: - resolution: {integrity: sha512-cD31W1v3GqUlQvbBCGcXmd2Nj9SvLDOP1oQ0YFuLETufzSPaKp11rYBsSOm7rCsW3OnIRAFM3OxRhceaXNYHkA==} - engines: {node: '>=12'} - - constant-case@3.0.4: - resolution: {integrity: sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ==} - - core-util-is@1.0.3: - resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} - - cose-base@1.0.3: - resolution: {integrity: sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg==} - - cross-spawn@5.1.0: - resolution: {integrity: sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==} - - cross-spawn@7.0.3: - resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} - engines: {node: '>= 8'} - - crypto-js@4.2.0: - resolution: {integrity: sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==} - - crypto-random-string@4.0.0: - resolution: {integrity: sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==} - engines: {node: '>=12'} - - cspell-config-lib@8.7.0: - resolution: {integrity: sha512-depsd01GbLBo71/tfRrL5iECWQLS4CjCxA9C01dVkFAJqVB0s+K9KLKjTlq5aHOhcvo9Z3dHV+bGQCf5/Q7bfw==} - engines: {node: '>=18'} - - cspell-dictionary@8.7.0: - resolution: {integrity: sha512-S6IpZSzIMxlOO/33NgCOuP0TPH2mZbw8d5CP44z5jajflloq8l74MeJLkeDzYfCRcm0Rtk0A5drBeMg+Ai34OA==} - engines: {node: '>=18'} - - cspell-gitignore@8.7.0: - resolution: {integrity: sha512-yvUZ86qyopUpDgn+YXP1qTpUe/lp65ZFvpMtw21lWHTFlg1OWKntr349EQU/5ben/K6koxk1FiElCBV7Lr4uFg==} - engines: {node: '>=18'} - hasBin: true - - cspell-glob@8.7.0: - resolution: {integrity: sha512-AMdfx0gvROA/aIL8t8b5Y5NtMgscGZELFj6WhCSZiQSuWRxXUKiLGGLUFjx2y0hgXN9LUYOo6aBjvhnxI/v71g==} - engines: {node: '>=18'} - - cspell-grammar@8.7.0: - resolution: {integrity: sha512-SGcXc7322wU2WNRi7vtpToWDXTqZHhxqvR+aIXHT2kkxlMSWp3Rvfpshd0ckgY54nZtgw7R/JtKND2jeACRpwQ==} - engines: {node: '>=18'} - hasBin: true - - cspell-io@8.7.0: - resolution: {integrity: sha512-o7OltyyvVkRG1gQrIqGpN5pUkHNnv6rvihb7Qu6cJ8jITinLGuWJuEQpgt0eF5yIr624jDbFwSzAxsFox8riQg==} - engines: {node: '>=18'} - - cspell-lib@8.7.0: - resolution: {integrity: sha512-qDSHZGekwiDmouYRECTQokE+hgAuPqREm+Hb+G3DoIo3ZK5H47TtEUo8fNCw22XsKefcF8X28LiyoZwiYHVpSg==} - engines: {node: '>=18'} - - cspell-trie-lib@8.7.0: - resolution: {integrity: sha512-W3Nh2cO7gMV91r+hLqyTMgKlvRl4W5diKs5YiyOxjZumRkMBy42IzcNYtgIIacOxghklv96F5Bd1Vx/zY6ylGA==} - engines: {node: '>=18'} - - cspell@8.7.0: - resolution: {integrity: sha512-77nRPgLl240C6FK8RKVKo34lP15Lzp/6bk+SKYJFwUKKXlcgWXDis+Lw4JolA741/JgHtuxmhW1C8P7dCKjJ3w==} - engines: {node: '>=18'} - hasBin: true - - csstype@3.1.3: - resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} - - cytoscape-cose-bilkent@4.1.0: - resolution: {integrity: sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ==} - peerDependencies: - cytoscape: ^3.2.0 - - cytoscape@3.29.2: - resolution: {integrity: sha512-2G1ycU28Nh7OHT9rkXRLpCDP30MKH1dXJORZuBhtEhEW7pKwgPi77ImqlCWinouyE1PNepIOGZBOrE84DG7LyQ==} - engines: {node: '>=0.10'} - - d3-array@2.12.1: - resolution: {integrity: sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==} - - d3-array@3.2.4: - resolution: {integrity: sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==} - engines: {node: '>=12'} - - d3-axis@3.0.0: - resolution: {integrity: sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==} - engines: {node: '>=12'} - - d3-brush@3.0.0: - resolution: {integrity: sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==} - engines: {node: '>=12'} - - d3-chord@3.0.1: - resolution: {integrity: sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==} - engines: {node: '>=12'} - - d3-color@3.1.0: - resolution: {integrity: sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==} - engines: {node: '>=12'} - - d3-contour@4.0.2: - resolution: {integrity: sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==} - engines: {node: '>=12'} - - d3-delaunay@6.0.4: - resolution: {integrity: sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==} - engines: {node: '>=12'} - - d3-dispatch@3.0.1: - resolution: {integrity: sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==} - engines: {node: '>=12'} - - d3-drag@3.0.0: - resolution: {integrity: sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==} - engines: {node: '>=12'} - - d3-dsv@3.0.1: - resolution: {integrity: sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==} - engines: {node: '>=12'} - hasBin: true - - d3-ease@3.0.1: - resolution: {integrity: sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==} - engines: {node: '>=12'} - - d3-fetch@3.0.1: - resolution: {integrity: sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==} - engines: {node: '>=12'} - - d3-force@3.0.0: - resolution: {integrity: sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==} - engines: {node: '>=12'} - - d3-format@3.1.0: - resolution: {integrity: sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==} - engines: {node: '>=12'} - - d3-geo@3.1.1: - resolution: {integrity: sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==} - engines: {node: '>=12'} - - d3-hierarchy@3.1.2: - resolution: {integrity: sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==} - engines: {node: '>=12'} - - d3-interpolate@3.0.1: - resolution: {integrity: sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==} - engines: {node: '>=12'} - - d3-path@1.0.9: - resolution: {integrity: sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==} - - d3-path@3.1.0: - resolution: {integrity: sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==} - engines: {node: '>=12'} - - d3-polygon@3.0.1: - resolution: {integrity: sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==} - engines: {node: '>=12'} - - d3-quadtree@3.0.1: - resolution: {integrity: sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==} - engines: {node: '>=12'} - - d3-random@3.0.1: - resolution: {integrity: sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==} - engines: {node: '>=12'} - - d3-sankey@0.12.3: - resolution: {integrity: sha512-nQhsBRmM19Ax5xEIPLMY9ZmJ/cDvd1BG3UVvt5h3WRxKg5zGRbvnteTyWAbzeSvlh3tW7ZEmq4VwR5mB3tutmQ==} - - d3-scale-chromatic@3.1.0: - resolution: {integrity: sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==} - engines: {node: '>=12'} - - d3-scale@4.0.2: - resolution: {integrity: sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==} - engines: {node: '>=12'} - - d3-selection@3.0.0: - resolution: {integrity: sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==} - engines: {node: '>=12'} - - d3-shape@1.3.7: - resolution: {integrity: sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==} - - d3-shape@3.2.0: - resolution: {integrity: sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==} - engines: {node: '>=12'} - - d3-time-format@4.1.0: - resolution: {integrity: sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==} - engines: {node: '>=12'} - - d3-time@3.1.0: - resolution: {integrity: sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==} - engines: {node: '>=12'} - - d3-timer@3.0.1: - resolution: {integrity: sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==} - engines: {node: '>=12'} - - d3-transition@3.0.1: - resolution: {integrity: sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==} - engines: {node: '>=12'} - peerDependencies: - d3-selection: 2 - 3 - - d3-zoom@3.0.0: - resolution: {integrity: sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==} - engines: {node: '>=12'} - - d3@7.9.0: - resolution: {integrity: sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==} - engines: {node: '>=12'} - - dagre-d3-es@7.0.10: - resolution: {integrity: sha512-qTCQmEhcynucuaZgY5/+ti3X/rnszKZhEQH/ZdWdtP1tA/y3VoHJzcVrO9pjjJCNpigfscAtoUB5ONcd2wNn0A==} - - dayjs@1.11.11: - resolution: {integrity: sha512-okzr3f11N6WuqYtZSvm+F776mB41wRZMhKP+hc34YdW+KmtYYK9iqvHSwo2k9FEH3fhGXvOPV6yz2IcSrfRUDg==} - - debug@4.3.4: - resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - - decode-named-character-reference@1.0.2: - resolution: {integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==} - - deep-eql@4.1.3: - resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} - engines: {node: '>=6'} - - deep-equal@2.2.3: - resolution: {integrity: sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==} - engines: {node: '>= 0.4'} - - deep-is@0.1.4: - resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} - - define-data-property@1.1.4: - resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} - engines: {node: '>= 0.4'} - - define-properties@1.2.1: - resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} - engines: {node: '>= 0.4'} - - delaunator@5.0.1: - resolution: {integrity: sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw==} - - dequal@2.0.3: - resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} - engines: {node: '>=6'} - - devlop@1.1.0: - resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} - - diff@5.2.0: - resolution: {integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==} - engines: {node: '>=0.3.1'} - - dir-glob@3.0.1: - resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} - engines: {node: '>=8'} - - doctrine@3.0.0: - resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} - engines: {node: '>=6.0.0'} - - dom-accessibility-api@0.5.16: - resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==} - - dompurify@3.1.7: - resolution: {integrity: sha512-VaTstWtsneJY8xzy7DekmYWEOZcmzIe3Qb3zPd4STve1OBTa+e+WmS1ITQec1fZYXI3HCsOZZiSMpG6oxoWMWQ==} - - dot-case@3.0.4: - resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} - - dot-prop@6.0.1: - resolution: {integrity: sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==} - engines: {node: '>=10'} - - eastasianwidth@0.2.0: - resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - - elkjs@0.9.3: - resolution: {integrity: sha512-f/ZeWvW/BCXbhGEf1Ujp29EASo/lk1FDnETgNKwJrsVvGZhUWCZyg3xLJjAsxfOmt8KjswHmI5EwCQcPMpOYhQ==} - - elliptic@6.5.4: - resolution: {integrity: sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==} - - emoji-regex@10.3.0: - resolution: {integrity: sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==} - - emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - - emoji-regex@9.2.2: - resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} - - entities@4.5.0: - resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} - engines: {node: '>=0.12'} - - error-ex@1.3.2: - resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} - - es-define-property@1.0.0: - resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} - engines: {node: '>= 0.4'} - - es-errors@1.3.0: - resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} - engines: {node: '>= 0.4'} - - es-get-iterator@1.1.3: - resolution: {integrity: sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==} - - escape-string-regexp@1.0.5: - resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} - engines: {node: '>=0.8.0'} - - escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} - - escape-string-regexp@5.0.0: - resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} - engines: {node: '>=12'} - - eslint-mdx@2.3.4: - resolution: {integrity: sha512-u4NszEUyoGtR7Q0A4qs0OymsEQdCO6yqWlTzDa9vGWsK7aMotdnW0hqifHTkf6lEtA2vHk2xlkWHTCrhYLyRbw==} - engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} - peerDependencies: - eslint: '>=8.0.0' - - eslint-plugin-markdown@3.0.1: - resolution: {integrity: sha512-8rqoc148DWdGdmYF6WSQFT3uQ6PO7zXYgeBpHAOAakX/zpq+NvFYbDA/H7PYzHajwtmaOzAwfxyl++x0g1/N9A==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - - eslint-plugin-mdx@2.3.4: - resolution: {integrity: sha512-kr6tgaifKL+AVGYMtdYc2VCsIjfYQXuUCKz4rK58d2DpnPFHrmgXIOC7NcMvaEld+VOEpxBSCCnjnsf4IVCQGg==} - engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} - peerDependencies: - eslint: '>=8.0.0' - - eslint-scope@7.2.2: - resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - eslint-visitor-keys@3.4.3: - resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - eslint@8.57.0: - resolution: {integrity: sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. - hasBin: true - - espree@9.6.1: - resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - esprima@4.0.1: - resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} - engines: {node: '>=4'} - hasBin: true - - esquery@1.5.0: - resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} - engines: {node: '>=0.10'} - - esrecurse@4.3.0: - resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} - engines: {node: '>=4.0'} - - estraverse@5.3.0: - resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} - engines: {node: '>=4.0'} - - estree-util-attach-comments@2.1.1: - resolution: {integrity: sha512-+5Ba/xGGS6mnwFbXIuQiDPTbuTxuMCooq3arVv7gPZtYpjp+VXH/NkHAP35OOefPhNG/UGqU3vt/LTABwcHX0w==} - - estree-util-build-jsx@2.2.2: - resolution: {integrity: sha512-m56vOXcOBuaF+Igpb9OPAy7f9w9OIkb5yhjsZuaPm7HoGi4oTOQi0h2+yZ+AtKklYFZ+rPC4n0wYCJCEU1ONqg==} - - estree-util-is-identifier-name@2.1.0: - resolution: {integrity: sha512-bEN9VHRyXAUOjkKVQVvArFym08BTWB0aJPppZZr0UNyAqWsLaVfAqP7hbaTJjzHifmB5ebnR8Wm7r7yGN/HonQ==} - - estree-util-to-js@1.2.0: - resolution: {integrity: sha512-IzU74r1PK5IMMGZXUVZbmiu4A1uhiPgW5hm1GjcOfr4ZzHaMPpLNJjR7HjXiIOzi25nZDrgFTobHTkV5Q6ITjA==} - - estree-util-value-to-estree@1.3.0: - resolution: {integrity: sha512-Y+ughcF9jSUJvncXwqRageavjrNPAI+1M/L3BI3PyLp1nmgYTGUXU6t5z1Y7OWuThoDdhPME07bQU+d5LxdJqw==} - engines: {node: '>=12.0.0'} - - estree-util-visit@1.2.1: - resolution: {integrity: sha512-xbgqcrkIVbIG+lI/gzbvd9SGTJL4zqJKBFttUl5pP27KhAjtMKbX/mQXJ7qgyXpMgVy/zvpm0xoQQaGL8OloOw==} - - estree-walker@3.0.3: - resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} - - esutils@2.0.3: - resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} - engines: {node: '>=0.10.0'} - - ethereum-bloom-filters@1.1.0: - resolution: {integrity: sha512-J1gDRkLpuGNvWYzWslBQR9cDV4nd4kfvVTE/Wy4Kkm4yb3EYRSlyi0eB/inTsSTTVyA0+HyzHgbr95Fn/Z1fSw==} - deprecated: do not use this package use package versions above as this can miss some topics - - ethereum-cryptography@2.1.3: - resolution: {integrity: sha512-BlwbIL7/P45W8FGW2r7LGuvoEZ+7PWsniMvQ4p5s2xCyw9tmaDlpfsN9HjAucbF+t/qpVHwZUisgfK24TCW8aA==} - - ethers@5.7.2: - resolution: {integrity: sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==} - - ethjs-unit@0.1.6: - resolution: {integrity: sha512-/Sn9Y0oKl0uqQuvgFk/zQgR7aw1g36qX/jzSQ5lSwlO0GigPymk4eGQfeNTD03w1dPOqfz8V77Cy43jH56pagw==} - engines: {node: '>=6.5.0', npm: '>=3'} - - execa@0.8.0: - resolution: {integrity: sha512-zDWS+Rb1E8BlqqhALSt9kUhss8Qq4nN3iof3gsOdyINksElaPyNBtKUMTR62qhvgVWR0CqCX7sdnKe4MnUbFEA==} - engines: {node: '>=4'} - - extend-shallow@2.0.1: - resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} - engines: {node: '>=0.10.0'} - - extend@3.0.2: - resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} - - fast-deep-equal@3.1.3: - resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - - fast-equals@5.0.1: - resolution: {integrity: sha512-WF1Wi8PwwSY7/6Kx0vKXtw8RwuSGoM1bvDaJbu7MxDlR1vovZjIAKrnzyrThgAjm6JDTu0fVgWXDlMGspodfoQ==} - engines: {node: '>=6.0.0'} - - fast-glob@3.3.2: - resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} - engines: {node: '>=8.6.0'} - - fast-json-stable-stringify@2.1.0: - resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} - - fast-levenshtein@2.0.6: - resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - - fastq@1.17.1: - resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} - - fault@2.0.1: - resolution: {integrity: sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ==} - - file-entry-cache@6.0.1: - resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} - engines: {node: ^10.12.0 || >=12.0.0} - - file-entry-cache@8.0.0: - resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} - engines: {node: '>=16.0.0'} - - fill-range@7.1.1: - resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} - engines: {node: '>=8'} - - find-up-simple@1.0.0: - resolution: {integrity: sha512-q7Us7kcjj2VMePAa02hDAF6d+MzsdsAWEwYyOpwUtlerRBkOEPBCRZrAV4XfcSN8fHAgaD0hP7miwoay6DCprw==} - engines: {node: '>=18'} - - find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} - - find-up@6.3.0: - resolution: {integrity: sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - - flat-cache@3.2.0: - resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} - engines: {node: ^10.12.0 || >=12.0.0} - - flat-cache@4.0.1: - resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} - engines: {node: '>=16'} - - flatted@3.3.1: - resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} - - flexsearch@0.7.43: - resolution: {integrity: sha512-c5o/+Um8aqCSOXGcZoqZOm+NqtVwNsvVpWv6lfmSclU954O3wvQKxxK8zj74fPaSJbXpSLTs4PRhh+wnoCXnKg==} - - focus-visible@5.2.0: - resolution: {integrity: sha512-Rwix9pBtC1Nuy5wysTmKy+UjbDJpIfg8eHjw0rjZ1mX4GNLz1Bmd16uDpI3Gk1i70Fgcs8Csg2lPm8HULFg9DQ==} - - for-each@0.3.3: - resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} - - foreground-child@3.1.1: - resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} - engines: {node: '>=14'} - - format@0.2.2: - resolution: {integrity: sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==} - engines: {node: '>=0.4.x'} - - fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - - function-bind@1.1.2: - resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - - functions-have-names@1.2.3: - resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} - - gensequence@7.0.0: - resolution: {integrity: sha512-47Frx13aZh01afHJTB3zTtKIlFI6vWY+MYCN9Qpew6i52rfKjnhCF/l1YlC8UmEMvvntZZ6z4PiCcmyuedR2aQ==} - engines: {node: '>=18'} - - get-func-name@2.0.2: - resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} - - get-intrinsic@1.2.4: - resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} - engines: {node: '>= 0.4'} - - get-stdin@9.0.0: - resolution: {integrity: sha512-dVKBjfWisLAicarI2Sf+JuBE/DghV4UzNAVe9yhEJuzeREd3JhOTE9cUaJTeSa77fsbQUK3pcOpJfM59+VKZaA==} - engines: {node: '>=12'} - - get-stream@3.0.0: - resolution: {integrity: sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==} - engines: {node: '>=4'} - - git-up@7.0.0: - resolution: {integrity: sha512-ONdIrbBCFusq1Oy0sC71F5azx8bVkvtZtMJAsv+a6lz5YAmbNnLD6HAB4gptHZVLPR8S2/kVN6Gab7lryq5+lQ==} - - git-url-parse@13.1.1: - resolution: {integrity: sha512-PCFJyeSSdtnbfhSNRw9Wk96dDCNx+sogTe4YNXeXSJxt7xz5hvXekuRn9JX7m+Mf4OscCu8h+mtAl3+h5Fo8lQ==} - - github-slugger@1.5.0: - resolution: {integrity: sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw==} - - github-slugger@2.0.0: - resolution: {integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==} - - glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} - - glob-parent@6.0.2: - resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} - engines: {node: '>=10.13.0'} - - glob@10.3.12: - resolution: {integrity: sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg==} - engines: {node: '>=16 || 14 >=14.17'} - hasBin: true - - glob@7.2.3: - resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} - deprecated: Glob versions prior to v9 are no longer supported - - glob@8.1.0: - resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} - engines: {node: '>=12'} - deprecated: Glob versions prior to v9 are no longer supported - - global-directory@4.0.1: - resolution: {integrity: sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==} - engines: {node: '>=18'} - - globals@13.24.0: - resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} - engines: {node: '>=8'} - - globby@11.1.0: - resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} - engines: {node: '>=10'} - - gopd@1.0.1: - resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} - - graceful-fs@4.2.11: - resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - - graphemer@1.4.0: - resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} - - gray-matter@4.0.3: - resolution: {integrity: sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==} - engines: {node: '>=6.0'} - - has-bigints@1.0.2: - resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} - - has-flag@2.0.0: - resolution: {integrity: sha512-P+1n3MnwjR/Epg9BBo1KT8qbye2g2Ou4sFumihwt6I4tsUX7jnLcX4BTOSKg/B1ZrIYMN9FcEnG4x5a7NB8Eng==} - engines: {node: '>=0.10.0'} - - has-flag@3.0.0: - resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} - engines: {node: '>=4'} - - has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} - - has-own-prop@2.0.0: - resolution: {integrity: sha512-Pq0h+hvsVm6dDEa8x82GnLSYHOzNDt7f0ddFa3FqcQlgzEiptPqL+XrOJNavjOzSYiYWIrgeVYYgGlLmnxwilQ==} - engines: {node: '>=8'} - - has-property-descriptors@1.0.2: - resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} - - has-proto@1.0.3: - resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} - engines: {node: '>= 0.4'} - - has-symbols@1.0.3: - resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} - engines: {node: '>= 0.4'} - - has-tostringtag@1.0.2: - resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} - engines: {node: '>= 0.4'} - - hash-obj@4.0.0: - resolution: {integrity: sha512-FwO1BUVWkyHasWDW4S8o0ssQXjvyghLV2rfVhnN36b2bbcj45eGiuzdn9XOvOpjV3TKQD7Gm2BWNXdE9V4KKYg==} - engines: {node: '>=12'} - - hash.js@1.1.7: - resolution: {integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==} - - hasown@2.0.2: - resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} - engines: {node: '>= 0.4'} - - hast-util-from-dom@5.0.0: - resolution: {integrity: sha512-d6235voAp/XR3Hh5uy7aGLbM3S4KamdW0WEgOaU1YoewnuYw4HXb5eRtv9g65m/RFGEfUY1Mw4UqCc5Y8L4Stg==} - - hast-util-from-html-isomorphic@2.0.0: - resolution: {integrity: sha512-zJfpXq44yff2hmE0XmwEOzdWin5xwH+QIhMLOScpX91e/NSGPsAzNCvLQDIEPyO2TXi+lBmU6hjLIhV8MwP2kw==} - - hast-util-from-html@2.0.1: - resolution: {integrity: sha512-RXQBLMl9kjKVNkJTIO6bZyb2n+cUH8LFaSSzo82jiLT6Tfc+Pt7VQCS+/h3YwG4jaNE2TA2sdJisGWR+aJrp0g==} - - hast-util-from-parse5@8.0.1: - resolution: {integrity: sha512-Er/Iixbc7IEa7r/XLtuG52zoqn/b3Xng/w6aZQ0xGVxzhw5xUFxcRqdPzP6yFi/4HBYRaifaI5fQ1RH8n0ZeOQ==} - - hast-util-is-element@3.0.0: - resolution: {integrity: sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==} - - hast-util-parse-selector@4.0.0: - resolution: {integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==} - - hast-util-raw@9.0.2: - resolution: {integrity: sha512-PldBy71wO9Uq1kyaMch9AHIghtQvIwxBUkv823pKmkTM3oV1JxtsTNYdevMxvUHqcnOAuO65JKU2+0NOxc2ksA==} - - hast-util-to-estree@2.3.3: - resolution: {integrity: sha512-ihhPIUPxN0v0w6M5+IiAZZrn0LH2uZomeWwhn7uP7avZC6TE7lIiEh2yBMPr5+zi1aUCXq6VoYRgs2Bw9xmycQ==} - - hast-util-to-parse5@8.0.0: - resolution: {integrity: sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==} - - hast-util-to-text@4.0.2: - resolution: {integrity: sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A==} - - hast-util-whitespace@2.0.1: - resolution: {integrity: sha512-nAxA0v8+vXSBDt3AnRUNjyRIQ0rD+ntpbAp4LnPkumc5M9yUbSMa4XDU9Q6etY4f1Wp4bNgvc1yjiZtsTTrSng==} - - hastscript@8.0.0: - resolution: {integrity: sha512-dMOtzCEd3ABUeSIISmrETiKuyydk1w0pa+gE/uormcTpSYuaNJPbX1NU3JLyscSLjwAQM8bWMhhIlnCqnRvDTw==} - - header-case@2.0.4: - resolution: {integrity: sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q==} - - hmac-drbg@1.0.1: - resolution: {integrity: sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==} - - html-void-elements@3.0.0: - resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} - - iconv-lite@0.6.3: - resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} - engines: {node: '>=0.10.0'} - - ignore@5.3.1: - resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} - engines: {node: '>= 4'} - - import-fresh@3.3.0: - resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} - engines: {node: '>=6'} - - import-meta-resolve@2.2.2: - resolution: {integrity: sha512-f8KcQ1D80V7RnqVm+/lirO9zkOxjGxhaTC1IPrBGd3MEfNgmNG67tSUO9gTi2F3Blr2Az6g1vocaxzkVnWl9MA==} - - import-meta-resolve@4.1.0: - resolution: {integrity: sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==} - - imurmurhash@0.1.4: - resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} - engines: {node: '>=0.8.19'} - - inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. - - inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - - ini@4.1.1: - resolution: {integrity: sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - - ini@4.1.2: - resolution: {integrity: sha512-AMB1mvwR1pyBFY/nSevUX6y8nJWS63/SzUKD3JyQn97s4xgIdgQPT75IRouIiBAN4yLQBUShNYVW0+UG25daCw==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - - inline-style-parser@0.1.1: - resolution: {integrity: sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==} - - internal-slot@1.0.7: - resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==} - engines: {node: '>= 0.4'} - - internmap@1.0.1: - resolution: {integrity: sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==} - - internmap@2.0.3: - resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==} - engines: {node: '>=12'} - - intersection-observer@0.12.2: - resolution: {integrity: sha512-7m1vEcPCxXYI8HqnL8CKI6siDyD+eIWSwgB3DZA+ZTogxk9I4CDnj4wilt9x/+/QbHI4YG5YZNmC6458/e9Ktg==} - - is-alphabetical@1.0.4: - resolution: {integrity: sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==} - - is-alphabetical@2.0.1: - resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==} - - is-alphanumerical@1.0.4: - resolution: {integrity: sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==} - - is-alphanumerical@2.0.1: - resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==} - - is-arguments@1.1.1: - resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} - engines: {node: '>= 0.4'} - - is-array-buffer@3.0.4: - resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==} - engines: {node: '>= 0.4'} - - is-arrayish@0.2.1: - resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} - - is-bigint@1.0.4: - resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} - - is-boolean-object@1.1.2: - resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} - engines: {node: '>= 0.4'} - - is-buffer@2.0.5: - resolution: {integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==} - engines: {node: '>=4'} - - is-callable@1.2.7: - resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} - engines: {node: '>= 0.4'} - - is-date-object@1.0.5: - resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} - engines: {node: '>= 0.4'} - - is-decimal@1.0.4: - resolution: {integrity: sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==} - - is-decimal@2.0.1: - resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} - - is-empty@1.2.0: - resolution: {integrity: sha512-F2FnH/otLNJv0J6wc73A5Xo7oHLNnqplYqZhUu01tD54DIPvxIRSTSLkrUB/M0nHO4vo1O9PDfN4KoTxCzLh/w==} - - is-extendable@0.1.1: - resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} - engines: {node: '>=0.10.0'} - - is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} - - is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} - - is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} - - is-hex-prefixed@1.0.0: - resolution: {integrity: sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA==} - engines: {node: '>=6.5.0', npm: '>=3'} - - is-hexadecimal@1.0.4: - resolution: {integrity: sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==} - - is-hexadecimal@2.0.1: - resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} - - is-map@2.0.3: - resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} - engines: {node: '>= 0.4'} - - is-number-object@1.0.7: - resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} - engines: {node: '>= 0.4'} - - is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - - is-obj@2.0.0: - resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} - engines: {node: '>=8'} - - is-obj@3.0.0: - resolution: {integrity: sha512-IlsXEHOjtKhpN8r/tRFj2nDyTmHvcfNeu/nrRIcXE17ROeatXchkojffa1SpdqW4cr/Fj6QkEf/Gn4zf6KKvEQ==} - engines: {node: '>=12'} - - is-path-inside@3.0.3: - resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} - engines: {node: '>=8'} - - is-plain-obj@3.0.0: - resolution: {integrity: sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==} - engines: {node: '>=10'} - - is-plain-obj@4.1.0: - resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} - engines: {node: '>=12'} - - is-reference@3.0.2: - resolution: {integrity: sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==} - - is-regex@1.1.4: - resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} - engines: {node: '>= 0.4'} - - is-set@2.0.3: - resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} - engines: {node: '>= 0.4'} - - is-shared-array-buffer@1.0.3: - resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==} - engines: {node: '>= 0.4'} - - is-ssh@1.4.0: - resolution: {integrity: sha512-x7+VxdxOdlV3CYpjvRLBv5Lo9OJerlYanjwFrPR9fuGPjCiNiCzFgAWpiLAohSbsnH4ZAys3SBh+hq5rJosxUQ==} - - is-stream@1.1.0: - resolution: {integrity: sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==} - engines: {node: '>=0.10.0'} - - is-string@1.0.7: - resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} - engines: {node: '>= 0.4'} - - is-symbol@1.0.4: - resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} - engines: {node: '>= 0.4'} - - is-typedarray@1.0.0: - resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} - - is-weakmap@2.0.2: - resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} - engines: {node: '>= 0.4'} - - is-weakset@2.0.3: - resolution: {integrity: sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==} - engines: {node: '>= 0.4'} - - isarray@2.0.5: - resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} - - isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - - isows@1.0.3: - resolution: {integrity: sha512-2cKei4vlmg2cxEjm3wVSqn8pcoRF/LX/wpifuuNquFO4SQmPwarClT+SUCA2lt+l581tTeZIPIZuIDo2jWN1fg==} - peerDependencies: - ws: '*' - - jackspeak@2.3.6: - resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} - engines: {node: '>=14'} - - js-sha3@0.8.0: - resolution: {integrity: sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==} - - js-tokens@4.0.0: - resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - - js-yaml@3.14.1: - resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} - hasBin: true - - js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} - hasBin: true - - json-buffer@3.0.1: - resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} - - json-parse-even-better-errors@2.3.1: - resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} - - json-parse-even-better-errors@3.0.1: - resolution: {integrity: sha512-aatBvbL26wVUCLmbWdCpeu9iF5wOyWpagiKkInA+kfws3sWdBrTnsvN2CKcyCYyUrc7rebNBlK6+kteg7ksecg==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - - json-schema-traverse@0.4.1: - resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} - - json-schema-traverse@1.0.0: - resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} - - json-stable-stringify-without-jsonify@1.0.1: - resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} - - jsonc-parser@3.2.1: - resolution: {integrity: sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==} - - katex@0.16.10: - resolution: {integrity: sha512-ZiqaC04tp2O5utMsl2TEZTXxa6WSC4yo0fv5ML++D3QZv/vx2Mct0mTlRx3O+uUkjfuAgOkzsCmq5MiUEsDDdA==} - hasBin: true - - keyv@4.5.4: - resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} - - khroma@2.1.0: - resolution: {integrity: sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw==} - - kind-of@6.0.3: - resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} - engines: {node: '>=0.10.0'} - - kleur@4.1.5: - resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} - engines: {node: '>=6'} - - layout-base@1.0.2: - resolution: {integrity: sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==} - - levn@0.4.1: - resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} - engines: {node: '>= 0.8.0'} - - lines-and-columns@2.0.4: - resolution: {integrity: sha512-wM1+Z03eypVAVUCE7QdSqpVIvelbOakn1M0bPDoA4SGWPx3sNDVUiMo3L6To6WWGClB7VyXnhQ4Sn7gxiJbE6A==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - - load-plugin@5.1.0: - resolution: {integrity: sha512-Lg1CZa1CFj2CbNaxijTL6PCbzd4qGTlZov+iH2p5Xwy/ApcZJh+i6jMN2cYePouTfjJfrNu3nXFdEw8LvbjPFQ==} - - locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} - - locate-path@7.2.0: - resolution: {integrity: sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - - lodash-es@4.17.21: - resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} - - lodash.clonedeep@4.5.0: - resolution: {integrity: sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==} - - lodash.get@4.4.2: - resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} - - lodash.merge@4.6.2: - resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} - - lodash@4.17.21: - resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - - longest-streak@3.1.0: - resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} - - loose-envify@1.4.0: - resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} - hasBin: true - - loupe@2.3.7: - resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} - - lower-case@2.0.2: - resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} - - lru-cache@10.2.2: - resolution: {integrity: sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==} - engines: {node: 14 || >=16.14} - - lru-cache@4.1.5: - resolution: {integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==} - - lru-cache@6.0.0: - resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} - engines: {node: '>=10'} - - lz-string@1.5.0: - resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} - hasBin: true - - markdown-extensions@1.1.1: - resolution: {integrity: sha512-WWC0ZuMzCyDHYCasEGs4IPvLyTGftYwh6wIEOULOF0HXcqZlhwRzrK0w2VUlxWA98xnvb/jszw4ZSkJ6ADpM6Q==} - engines: {node: '>=0.10.0'} - - markdown-table@3.0.3: - resolution: {integrity: sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==} - - match-sorter@6.3.4: - resolution: {integrity: sha512-jfZW7cWS5y/1xswZo8VBOdudUiSd9nifYRWphc9M5D/ee4w4AoXLgBEdRbgVaxbMuagBPeUC5y2Hi8DO6o9aDg==} - - mdast-comment-marker@2.1.2: - resolution: {integrity: sha512-HED3ezseRVkBzZ0uK4q6RJMdufr/2p3VfVZstE3H1N9K8bwtspztWo6Xd7rEatuGNoCXaBna8oEqMwUn0Ve1bw==} - - mdast-util-definitions@5.1.2: - resolution: {integrity: sha512-8SVPMuHqlPME/z3gqVwWY4zVXn8lqKv/pAhC57FuJ40ImXyBpmO5ukh98zB2v7Blql2FiHjHv9LVztSIqjY+MA==} - - mdast-util-find-and-replace@2.2.2: - resolution: {integrity: sha512-MTtdFRz/eMDHXzeK6W3dO7mXUlF82Gom4y0oOgvHhh/HXZAGvIQDUvQ0SuUx+j2tv44b8xTHOm8K/9OoRFnXKw==} - - mdast-util-from-markdown@0.8.5: - resolution: {integrity: sha512-2hkTXtYYnr+NubD/g6KGBS/0mFmBcifAsI0yIWRiRo0PjVs6SSOSOdtzbp6kSGnShDN6G5aWZpKQ2lWRy27mWQ==} - - mdast-util-from-markdown@1.3.1: - resolution: {integrity: sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww==} - - mdast-util-from-markdown@2.0.0: - resolution: {integrity: sha512-n7MTOr/z+8NAX/wmhhDji8O3bRvPTV/U0oTCaZJkjhPSKTPhS3xufVhKGF8s1pJ7Ox4QgoIU7KHseh09S+9rTA==} - - mdast-util-frontmatter@2.0.1: - resolution: {integrity: sha512-LRqI9+wdgC25P0URIJY9vwocIzCcksduHQ9OF2joxQoyTNVduwLAFUzjoopuRJbJAReaKrNQKAZKL3uCMugWJA==} - - mdast-util-gfm-autolink-literal@1.0.3: - resolution: {integrity: sha512-My8KJ57FYEy2W2LyNom4n3E7hKTuQk/0SES0u16tjA9Z3oFkF4RrC/hPAPgjlSpezsOvI8ObcXcElo92wn5IGA==} - - mdast-util-gfm-footnote@1.0.2: - resolution: {integrity: sha512-56D19KOGbE00uKVj3sgIykpwKL179QsVFwx/DCW0u/0+URsryacI4MAdNJl0dh+u2PSsD9FtxPFbHCzJ78qJFQ==} - - mdast-util-gfm-strikethrough@1.0.3: - resolution: {integrity: sha512-DAPhYzTYrRcXdMjUtUjKvW9z/FNAMTdU0ORyMcbmkwYNbKocDpdk+PX1L1dQgOID/+vVs1uBQ7ElrBQfZ0cuiQ==} - - mdast-util-gfm-table@1.0.7: - resolution: {integrity: sha512-jjcpmNnQvrmN5Vx7y7lEc2iIOEytYv7rTvu+MeyAsSHTASGCCRA79Igg2uKssgOs1i1po8s3plW0sTu1wkkLGg==} - - mdast-util-gfm-task-list-item@1.0.2: - resolution: {integrity: sha512-PFTA1gzfp1B1UaiJVyhJZA1rm0+Tzn690frc/L8vNX1Jop4STZgOE6bxUhnzdVSB+vm2GU1tIsuQcA9bxTQpMQ==} - - mdast-util-gfm@2.0.2: - resolution: {integrity: sha512-qvZ608nBppZ4icQlhQQIAdc6S3Ffj9RGmzwUKUWuEICFnd1LVkN3EktF7ZHAgfcEdvZB5owU9tQgt99e2TlLjg==} - - mdast-util-heading-style@2.0.1: - resolution: {integrity: sha512-0L5rthU4xKDVbw+UQ7D8Y8xOEsX4JXZvemWoEAsL+WAaeSH+TvVVwFnTb3G/OrjyP4VYQULoNWU+PdZfkmNu4A==} - - mdast-util-math@2.0.2: - resolution: {integrity: sha512-8gmkKVp9v6+Tgjtq6SYx9kGPpTf6FVYRa53/DLh479aldR9AyP48qeVOgNZ5X7QUK7nOy4yw7vg6mbiGcs9jWQ==} - - mdast-util-mdx-expression@1.3.2: - resolution: {integrity: sha512-xIPmR5ReJDu/DHH1OoIT1HkuybIfRGYRywC+gJtI7qHjCJp/M9jrmBEJW22O8lskDWm562BX2W8TiAwRTb0rKA==} - - mdast-util-mdx-jsx@2.1.4: - resolution: {integrity: sha512-DtMn9CmVhVzZx3f+optVDF8yFgQVt7FghCRNdlIaS3X5Bnym3hZwPbg/XW86vdpKjlc1PVj26SpnLGeJBXD3JA==} - - mdast-util-mdx@2.0.1: - resolution: {integrity: sha512-38w5y+r8nyKlGvNjSEqWrhG0w5PmnRA+wnBvm+ulYCct7nsGYhFVb0lljS9bQav4psDAS1eGkP2LMVcZBi/aqw==} - - mdast-util-mdxjs-esm@1.3.1: - resolution: {integrity: sha512-SXqglS0HrEvSdUEfoXFtcg7DRl7S2cwOXc7jkuusG472Mmjag34DUDeOJUZtl+BVnyeO1frIgVpHlNRWc2gk/w==} - - mdast-util-phrasing@3.0.1: - resolution: {integrity: sha512-WmI1gTXUBJo4/ZmSk79Wcb2HcjPJBzM1nlI/OUWA8yk2X9ik3ffNbBGsU+09BFmXaL1IBb9fiuvq6/KMiNycSg==} - - mdast-util-phrasing@4.1.0: - resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==} - - mdast-util-to-hast@12.3.0: - resolution: {integrity: sha512-pits93r8PhnIoU4Vy9bjW39M2jJ6/tdHyja9rrot9uujkN7UTU9SDnE6WNJz/IGyQk3XHX6yNNtrBH6cQzm8Hw==} - - mdast-util-to-hast@13.1.0: - resolution: {integrity: sha512-/e2l/6+OdGp/FB+ctrJ9Avz71AN/GRH3oi/3KAx/kMnoUsD6q0woXlDT8lLEeViVKE7oZxE7RXzvO3T8kF2/sA==} - - mdast-util-to-markdown@1.5.0: - resolution: {integrity: sha512-bbv7TPv/WC49thZPg3jXuqzuvI45IL2EVAr/KxF0BSdHsU0ceFHOmwQn6evxAh1GaoK/6GQ1wp4R4oW2+LFL/A==} - - mdast-util-to-markdown@2.1.0: - resolution: {integrity: sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ==} - - mdast-util-to-string@2.0.0: - resolution: {integrity: sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==} - - mdast-util-to-string@3.2.0: - resolution: {integrity: sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg==} - - mdast-util-to-string@4.0.0: - resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} - - merge2@1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} - engines: {node: '>= 8'} - - merkletreejs@0.3.11: - resolution: {integrity: sha512-LJKTl4iVNTndhL+3Uz/tfkjD0klIWsHlUzgtuNnNrsf7bAlXR30m+xYB7lHr5Z/l6e/yAIsr26Dabx6Buo4VGQ==} - engines: {node: '>= 7.6.0'} - - mermaid@10.9.0: - resolution: {integrity: sha512-swZju0hFox/B/qoLKK0rOxxgh8Cf7rJSfAUc1u8fezVihYMvrJAS45GzAxTVf4Q+xn9uMgitBcmWk7nWGXOs/g==} - - micro-ftch@0.3.1: - resolution: {integrity: sha512-/0LLxhzP0tfiR5hcQebtudP56gUurs2CLkGarnCiB/OqEyUFQ6U3paQi/tgLv0hBJYt2rnr9MNpxz4fiiugstg==} - - micromark-core-commonmark@1.1.0: - resolution: {integrity: sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw==} - - micromark-core-commonmark@2.0.1: - resolution: {integrity: sha512-CUQyKr1e///ZODyD1U3xit6zXwy1a8q2a1S1HKtIlmgvurrEpaw/Y9y6KSIbF8P59cn/NjzHyO+Q2fAyYLQrAA==} - - micromark-extension-frontmatter@2.0.0: - resolution: {integrity: sha512-C4AkuM3dA58cgZha7zVnuVxBhDsbttIMiytjgsM2XbHAB2faRVaHRle40558FBN+DJcrLNCoqG5mlrpdU4cRtg==} - - micromark-extension-gfm-autolink-literal@1.0.5: - resolution: {integrity: sha512-z3wJSLrDf8kRDOh2qBtoTRD53vJ+CWIyo7uyZuxf/JAbNJjiHsOpG1y5wxk8drtv3ETAHutCu6N3thkOOgueWg==} - - micromark-extension-gfm-footnote@1.1.2: - resolution: {integrity: sha512-Yxn7z7SxgyGWRNa4wzf8AhYYWNrwl5q1Z8ii+CSTTIqVkmGZF1CElX2JI8g5yGoM3GAman9/PVCUFUSJ0kB/8Q==} - - micromark-extension-gfm-strikethrough@1.0.7: - resolution: {integrity: sha512-sX0FawVE1o3abGk3vRjOH50L5TTLr3b5XMqnP9YDRb34M0v5OoZhG+OHFz1OffZ9dlwgpTBKaT4XW/AsUVnSDw==} - - micromark-extension-gfm-table@1.0.7: - resolution: {integrity: sha512-3ZORTHtcSnMQEKtAOsBQ9/oHp9096pI/UvdPtN7ehKvrmZZ2+bbWhi0ln+I9drmwXMt5boocn6OlwQzNXeVeqw==} - - micromark-extension-gfm-tagfilter@1.0.2: - resolution: {integrity: sha512-5XWB9GbAUSHTn8VPU8/1DBXMuKYT5uOgEjJb8gN3mW0PNW5OPHpSdojoqf+iq1xo7vWzw/P8bAHY0n6ijpXF7g==} - - micromark-extension-gfm-task-list-item@1.0.5: - resolution: {integrity: sha512-RMFXl2uQ0pNQy6Lun2YBYT9g9INXtWJULgbt01D/x8/6yJ2qpKyzdZD3pi6UIkzF++Da49xAelVKUeUMqd5eIQ==} - - micromark-extension-gfm@2.0.3: - resolution: {integrity: sha512-vb9OoHqrhCmbRidQv/2+Bc6pkP0FrtlhurxZofvOEy5o8RtuuvTq+RQ1Vw5ZDNrVraQZu3HixESqbG+0iKk/MQ==} - - micromark-extension-math@2.1.2: - resolution: {integrity: sha512-es0CcOV89VNS9wFmyn+wyFTKweXGW4CEvdaAca6SWRWPyYCbBisnjaHLjWO4Nszuiud84jCpkHsqAJoa768Pvg==} - - micromark-extension-mdx-expression@1.0.8: - resolution: {integrity: sha512-zZpeQtc5wfWKdzDsHRBY003H2Smg+PUi2REhqgIhdzAa5xonhP03FcXxqFSerFiNUr5AWmHpaNPQTBVOS4lrXw==} - - micromark-extension-mdx-jsx@1.0.5: - resolution: {integrity: sha512-gPH+9ZdmDflbu19Xkb8+gheqEDqkSpdCEubQyxuz/Hn8DOXiXvrXeikOoBA71+e8Pfi0/UYmU3wW3H58kr7akA==} - - micromark-extension-mdx-md@1.0.1: - resolution: {integrity: sha512-7MSuj2S7xjOQXAjjkbjBsHkMtb+mDGVW6uI2dBL9snOBCbZmoNgDAeZ0nSn9j3T42UE/g2xVNMn18PJxZvkBEA==} - - micromark-extension-mdxjs-esm@1.0.5: - resolution: {integrity: sha512-xNRBw4aoURcyz/S69B19WnZAkWJMxHMT5hE36GtDAyhoyn/8TuAeqjFJQlwk+MKQsUD7b3l7kFX+vlfVWgcX1w==} - - micromark-extension-mdxjs@1.0.1: - resolution: {integrity: sha512-7YA7hF6i5eKOfFUzZ+0z6avRG52GpWR8DL+kN47y3f2KhxbBZMhmxe7auOeaTBrW2DenbbZTf1ea9tA2hDpC2Q==} - - micromark-factory-destination@1.1.0: - resolution: {integrity: sha512-XaNDROBgx9SgSChd69pjiGKbV+nfHGDPVYFs5dOoDd7ZnMAE+Cuu91BCpsY8RT2NP9vo/B8pds2VQNCLiu0zhg==} - - micromark-factory-destination@2.0.0: - resolution: {integrity: sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==} - - micromark-factory-label@1.1.0: - resolution: {integrity: sha512-OLtyez4vZo/1NjxGhcpDSbHQ+m0IIGnT8BoPamh+7jVlzLJBH98zzuCoUeMxvM6WsNeh8wx8cKvqLiPHEACn0w==} - - micromark-factory-label@2.0.0: - resolution: {integrity: sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==} - - micromark-factory-mdx-expression@1.0.9: - resolution: {integrity: sha512-jGIWzSmNfdnkJq05c7b0+Wv0Kfz3NJ3N4cBjnbO4zjXIlxJr+f8lk+5ZmwFvqdAbUy2q6B5rCY//g0QAAaXDWA==} - - micromark-factory-space@1.1.0: - resolution: {integrity: sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==} - - micromark-factory-space@2.0.0: - resolution: {integrity: sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==} - - micromark-factory-title@1.1.0: - resolution: {integrity: sha512-J7n9R3vMmgjDOCY8NPw55jiyaQnH5kBdV2/UXCtZIpnHH3P6nHUKaH7XXEYuWwx/xUJcawa8plLBEjMPU24HzQ==} - - micromark-factory-title@2.0.0: - resolution: {integrity: sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A==} - - micromark-factory-whitespace@1.1.0: - resolution: {integrity: sha512-v2WlmiymVSp5oMg+1Q0N1Lxmt6pMhIHD457whWM7/GUlEks1hI9xj5w3zbc4uuMKXGisksZk8DzP2UyGbGqNsQ==} - - micromark-factory-whitespace@2.0.0: - resolution: {integrity: sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==} - - micromark-util-character@1.2.0: - resolution: {integrity: sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==} - - micromark-util-character@2.1.0: - resolution: {integrity: sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==} - - micromark-util-chunked@1.1.0: - resolution: {integrity: sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ==} - - micromark-util-chunked@2.0.0: - resolution: {integrity: sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==} - - micromark-util-classify-character@1.1.0: - resolution: {integrity: sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw==} - - micromark-util-classify-character@2.0.0: - resolution: {integrity: sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==} - - micromark-util-combine-extensions@1.1.0: - resolution: {integrity: sha512-Q20sp4mfNf9yEqDL50WwuWZHUrCO4fEyeDCnMGmG5Pr0Cz15Uo7KBs6jq+dq0EgX4DPwwrh9m0X+zPV1ypFvUA==} - - micromark-util-combine-extensions@2.0.0: - resolution: {integrity: sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ==} - - micromark-util-decode-numeric-character-reference@1.1.0: - resolution: {integrity: sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw==} - - micromark-util-decode-numeric-character-reference@2.0.1: - resolution: {integrity: sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ==} - - micromark-util-decode-string@1.1.0: - resolution: {integrity: sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ==} - - micromark-util-decode-string@2.0.0: - resolution: {integrity: sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA==} - - micromark-util-encode@1.1.0: - resolution: {integrity: sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw==} - - micromark-util-encode@2.0.0: - resolution: {integrity: sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==} - - micromark-util-events-to-acorn@1.2.3: - resolution: {integrity: sha512-ij4X7Wuc4fED6UoLWkmo0xJQhsktfNh1J0m8g4PbIMPlx+ek/4YdW5mvbye8z/aZvAPUoxgXHrwVlXAPKMRp1w==} - - micromark-util-html-tag-name@1.2.0: - resolution: {integrity: sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q==} - - micromark-util-html-tag-name@2.0.0: - resolution: {integrity: sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==} - - micromark-util-normalize-identifier@1.1.0: - resolution: {integrity: sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q==} - - micromark-util-normalize-identifier@2.0.0: - resolution: {integrity: sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==} - - micromark-util-resolve-all@1.1.0: - resolution: {integrity: sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA==} - - micromark-util-resolve-all@2.0.0: - resolution: {integrity: sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==} - - micromark-util-sanitize-uri@1.2.0: - resolution: {integrity: sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A==} - - micromark-util-sanitize-uri@2.0.0: - resolution: {integrity: sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==} - - micromark-util-subtokenize@1.1.0: - resolution: {integrity: sha512-kUQHyzRoxvZO2PuLzMt2P/dwVsTiivCK8icYTeR+3WgbuPqfHgPPy7nFKbeqRivBvn/3N3GBiNC+JRTMSxEC7A==} - - micromark-util-subtokenize@2.0.1: - resolution: {integrity: sha512-jZNtiFl/1aY73yS3UGQkutD0UbhTt68qnRpw2Pifmz5wV9h8gOVsN70v+Lq/f1rKaU/W8pxRe8y8Q9FX1AOe1Q==} - - micromark-util-symbol@1.1.0: - resolution: {integrity: sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==} - - micromark-util-symbol@2.0.0: - resolution: {integrity: sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==} - - micromark-util-types@1.1.0: - resolution: {integrity: sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==} - - micromark-util-types@2.0.0: - resolution: {integrity: sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==} - - micromark@2.11.4: - resolution: {integrity: sha512-+WoovN/ppKolQOFIAajxi7Lu9kInbPxFuTBVEavFcL8eAfVstoc5MocPmqBeAdBOJV00uaVjegzH4+MA0DN/uA==} - - micromark@3.2.0: - resolution: {integrity: sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA==} - - micromark@4.0.0: - resolution: {integrity: sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==} - - micromatch@4.0.8: - resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} - engines: {node: '>=8.6'} - - min-indent@1.0.1: - resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} - engines: {node: '>=4'} - - minimalistic-assert@1.0.1: - resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} - - minimalistic-crypto-utils@1.0.1: - resolution: {integrity: sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==} - - minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - - minimatch@5.1.6: - resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} - engines: {node: '>=10'} - - minimatch@9.0.3: - resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} - engines: {node: '>=16 || 14 >=14.17'} - - minimatch@9.0.4: - resolution: {integrity: sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==} - engines: {node: '>=16 || 14 >=14.17'} - - minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - - minipass@7.0.4: - resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==} - engines: {node: '>=16 || 14 >=14.17'} - - mri@1.2.0: - resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} - engines: {node: '>=4'} - - ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - - nanoid@3.3.7: - resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - - natural-compare@1.4.0: - resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - - next-mdx-remote@4.4.1: - resolution: {integrity: sha512-1BvyXaIou6xy3XoNF4yaMZUCb6vD2GTAa5ciOa6WoO+gAUTYsb1K4rI/HSC2ogAWLrb/7VSV52skz07vOzmqIQ==} - engines: {node: '>=14', npm: '>=7'} - peerDependencies: - react: '>=16.x <=18.x' - react-dom: '>=16.x <=18.x' - - next-seo@6.5.0: - resolution: {integrity: sha512-MfzUeWTN/x/rsKp/1n0213eojO97lIl0unxqbeCY+6pAucViHDA8GSLRRcXpgjsSmBxfCFdfpu7LXbt4ANQoNQ==} - peerDependencies: - next: ^8.1.1-canary.54 || >=9.0.0 - react: '>=16.0.0' - react-dom: '>=16.0.0' - - next-sitemap@4.2.3: - resolution: {integrity: sha512-vjdCxeDuWDzldhCnyFCQipw5bfpl4HmZA7uoo3GAaYGjGgfL4Cxb1CiztPuWGmS+auYs7/8OekRS8C2cjdAsjQ==} - engines: {node: '>=14.18'} - hasBin: true - peerDependencies: - next: '*' - - next-themes@0.2.1: - resolution: {integrity: sha512-B+AKNfYNIzh0vqQQKqQItTS8evEouKD7H5Hj3kmuPERwddR2TxvDSFZuTj6T7Jfn1oyeUyJMydPl1Bkxkh0W7A==} - peerDependencies: - next: '*' - react: '*' - react-dom: '*' - - next@14.2.10: - resolution: {integrity: sha512-sDDExXnh33cY3RkS9JuFEKaS4HmlWmDKP1VJioucCG6z5KuA008DPsDZOzi8UfqEk3Ii+2NCQSJrfbEWtZZfww==} - engines: {node: '>=18.17.0'} - hasBin: true - peerDependencies: - '@opentelemetry/api': ^1.1.0 - '@playwright/test': ^1.41.2 - react: ^18.2.0 - react-dom: ^18.2.0 - sass: ^1.3.0 - peerDependenciesMeta: - '@opentelemetry/api': - optional: true - '@playwright/test': - optional: true - sass: - optional: true - - nextra-theme-docs@2.13.2: - resolution: {integrity: sha512-yE4umXaImp1/kf/sFciPj2+EFrNSwd9Db26hi98sIIiujzGf3+9eUgAz45vF9CwBw50FSXxm1QGRcY+slQ4xQQ==} - peerDependencies: - next: '>=9.5.3' - nextra: 2.13.2 - react: '>=16.13.1' - react-dom: '>=16.13.1' - - nextra@2.13.2: - resolution: {integrity: sha512-pIgOSXNUqTz1laxV4ChFZOU7lzJAoDHHaBPj8L09PuxrLKqU1BU/iZtXAG6bQeKCx8EPdBsoXxEuENnL9QGnGA==} - engines: {node: '>=16'} - peerDependencies: - next: '>=9.5.3' - react: '>=16.13.1' - react-dom: '>=16.13.1' - - no-case@3.0.4: - resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} - - node-fetch@2.7.0: - resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} - engines: {node: 4.x || >=6.0.0} - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true - - non-layered-tidy-tree-layout@2.0.2: - resolution: {integrity: sha512-gkXMxRzUH+PB0ax9dUN0yYF0S25BqeAYqhgMaLUFmpXLEk7Fcu8f4emJuOAY0V8kjDICxROIKsTAKsV/v355xw==} - - nopt@7.2.0: - resolution: {integrity: sha512-CVDtwCdhYIvnAzFoJ6NJ6dX3oga9/HyciQDnG1vQDjSLMeKLJ4A93ZqYKDrgYSr1FBY5/hMYC+2VCi24pgpkGA==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - hasBin: true - - npm-normalize-package-bin@3.0.1: - resolution: {integrity: sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - - npm-run-path@2.0.2: - resolution: {integrity: sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==} - engines: {node: '>=4'} - - npm-to-yarn@2.2.1: - resolution: {integrity: sha512-O/j/ROyX0KGLG7O6Ieut/seQ0oiTpHF2tXAcFbpdTLQFiaNtkyTXXocM1fwpaa60dg1qpWj0nHlbNhx6qwuENQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - number-to-bn@1.7.0: - resolution: {integrity: sha512-wsJ9gfSz1/s4ZsJN01lyonwuxA1tml6X1yBDnfpMglypcBRFZZkus26EdPSlqS5GJfYddVZa22p3VNb3z5m5Ig==} - engines: {node: '>=6.5.0', npm: '>=3'} - - object-inspect@1.13.1: - resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} - - object-is@1.1.6: - resolution: {integrity: sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==} - engines: {node: '>= 0.4'} - - object-keys@1.1.1: - resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} - engines: {node: '>= 0.4'} - - object.assign@4.1.5: - resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} - engines: {node: '>= 0.4'} - - once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - - optionator@0.9.4: - resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} - engines: {node: '>= 0.8.0'} - - p-finally@1.0.0: - resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==} - engines: {node: '>=4'} - - p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} - - p-limit@4.0.0: - resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - - p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} - - p-locate@6.0.0: - resolution: {integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - - param-case@3.0.4: - resolution: {integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==} - - parent-module@1.0.1: - resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} - engines: {node: '>=6'} - - parent-module@2.0.0: - resolution: {integrity: sha512-uo0Z9JJeWzv8BG+tRcapBKNJ0dro9cLyczGzulS6EfeyAdeC9sbojtW6XwvYxJkEne9En+J2XEl4zyglVeIwFg==} - engines: {node: '>=8'} - - parse-entities@2.0.0: - resolution: {integrity: sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==} - - parse-entities@4.0.1: - resolution: {integrity: sha512-SWzvYcSJh4d/SGLIOQfZ/CoNv6BTlI6YEQ7Nj82oDVnRpwe/Z/F1EMx42x3JAOwGBlCjeCH0BRJQbQ/opHL17w==} - - parse-json@6.0.2: - resolution: {integrity: sha512-SA5aMiaIjXkAiBrW/yPgLgQAQg42f7K3ACO+2l/zOvtQBwX58DMUsFJXelW2fx3yMBmWOVkR6j1MGsdSbCA4UA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - - parse-numeric-range@1.3.0: - resolution: {integrity: sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ==} - - parse-path@7.0.0: - resolution: {integrity: sha512-Euf9GG8WT9CdqwuWJGdf3RkUcTBArppHABkO7Lm8IzRQp0e2r/kkFnmhu4TSK30Wcu5rVAZLmfPKSBBi9tWFog==} - - parse-url@8.1.0: - resolution: {integrity: sha512-xDvOoLU5XRrcOZvnI6b8zA6n9O9ejNk/GExuz1yBuWUGn9KA97GI6HTs6u02wKara1CeVmZhH+0TZFdWScR89w==} - - parse5@7.1.2: - resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} - - pascal-case@3.1.2: - resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==} - - path-case@3.0.4: - resolution: {integrity: sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg==} - - path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} - - path-exists@5.0.0: - resolution: {integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - - path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} - - path-key@2.0.1: - resolution: {integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==} - engines: {node: '>=4'} - - path-key@3.1.1: - resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} - engines: {node: '>=8'} - - path-scurry@1.10.2: - resolution: {integrity: sha512-7xTavNy5RQXnsjANvVvMkEjvloOinkAjv/Z6Ildz9v2RinZ4SBKTWFOVRbaF8p0vpHnyjV/UwNDdKuUv6M5qcA==} - engines: {node: '>=16 || 14 >=14.17'} - - path-type@4.0.0: - resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} - engines: {node: '>=8'} - - pathval@1.1.1: - resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} - - periscopic@3.1.0: - resolution: {integrity: sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==} - - picocolors@1.0.0: - resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} - - picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} - - pluralize@8.0.0: - resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} - engines: {node: '>=4'} - - possible-typed-array-names@1.0.0: - resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} - engines: {node: '>= 0.4'} - - postcss@8.4.31: - resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} - engines: {node: ^10 || ^12 || >=14} - - prelude-ls@1.2.1: - resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} - engines: {node: '>= 0.8.0'} - - pretty-format@27.5.1: - resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - - proc-log@3.0.0: - resolution: {integrity: sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - - property-information@6.5.0: - resolution: {integrity: sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==} - - protocols@2.0.1: - resolution: {integrity: sha512-/XJ368cyBJ7fzLMwLKv1e4vLxOju2MNAIokcr7meSaNcVbWz/CPcW22cP04mwxOErdA5mwjA8Q6w/cdAQxVn7Q==} - - pseudomap@1.0.2: - resolution: {integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==} - - punycode@2.3.1: - resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} - engines: {node: '>=6'} - - queue-microtask@1.2.3: - resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - - randombytes@2.1.0: - resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} - - react-dom@18.3.1: - resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==} - peerDependencies: - react: ^18.3.1 - - react-is@17.0.2: - resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} - - react@18.3.1: - resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} - engines: {node: '>=0.10.0'} - - read-package-json-fast@3.0.2: - resolution: {integrity: sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - - readable-stream@3.6.2: - resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} - engines: {node: '>= 6'} - - reading-time@1.5.0: - resolution: {integrity: sha512-onYyVhBNr4CmAxFsKS7bz+uTLRakypIe4R+5A824vBSkQy/hB3fZepoVEf8OVAxzLvK+H/jm9TzpI3ETSm64Kg==} - - regenerator-runtime@0.14.1: - resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} - - regexp.prototype.flags@1.5.2: - resolution: {integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==} - engines: {node: '>= 0.4'} - - rehype-katex@7.0.0: - resolution: {integrity: sha512-h8FPkGE00r2XKU+/acgqwWUlyzve1IiOKwsEkg4pDL3k48PiE0Pt+/uLtVHDVkN1yA4iurZN6UES8ivHVEQV6Q==} - - rehype-pretty-code@0.9.11: - resolution: {integrity: sha512-Eq90eCYXQJISktfRZ8PPtwc5SUyH6fJcxS8XOMnHPUQZBtC6RYo67gGlley9X2nR8vlniPj0/7oCDEYHKQa/oA==} - engines: {node: '>=16'} - peerDependencies: - shiki: '*' - - rehype-raw@7.0.0: - resolution: {integrity: sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==} - - remark-code-import@1.2.0: - resolution: {integrity: sha512-fgwLruqlZbVOIhCJFjY+JDwPZhA4/eK3InJzN8Ox8UDdtudpG212JwtRj6la+lAzJU7JmSEyewZSukVZdknt3Q==} - engines: {node: '>= 12'} - - remark-frontmatter@5.0.0: - resolution: {integrity: sha512-XTFYvNASMe5iPN0719nPrdItC9aU0ssC4v14mH1BCi1u0n1gAocqcujWUrByftZTbLhRtiKRyjYTSIOcr69UVQ==} - - remark-gfm@3.0.1: - resolution: {integrity: sha512-lEFDoi2PICJyNrACFOfDD3JlLkuSbOa5Wd8EPt06HUdptv8Gn0bxYTdbU/XXQ3swAPkEaGxxPN9cbnMHvVu1Ig==} - - remark-lint-blockquote-indentation@3.1.2: - resolution: {integrity: sha512-5DOrFsZd5dXqA4p/VZvWSrqIWNFbBXjX7IV/FkVkxlNhNF/0FMf/4v8x1I2W3mzaZ7yDsWS/egpZnmligq1ckQ==} - - remark-lint-checkbox-character-style@4.1.2: - resolution: {integrity: sha512-5ITz+1cCuJ3Jv/Q7rKgDEucCOnIgjWDnSHPJA1tb4TI/D316h+ALbDhZIpP8gyfAm6sBAh3Pwz9XZJN2uJB5UQ==} - - remark-lint-code-block-style@3.1.2: - resolution: {integrity: sha512-3wsWmzzdyEsB9sOzBOf46TSkwwVKXN2JpTEQb6feN0Tl6Vg75F7T9MHqMz7aqk/56bOXSxUzdpXDscGBhziLRA==} - - remark-lint-emphasis-marker@3.1.2: - resolution: {integrity: sha512-hPZ8vxZrIfxmLA5B66bA8y3PdHjcCQuaLsySIqi5PM2DkpN6a7zAP3v1znyRSaYJ1ANVWcu00/0bNzuUjflGCA==} - - remark-lint-fenced-code-marker@3.1.2: - resolution: {integrity: sha512-6XNqjOuhT+0c7Q/22aCsMz61ne9g8HRpYF79EXQPdbzYa+PcfPXMiQKStONY3PfC8OE2/3WXI2zcs8w9x+8+VQ==} - - remark-lint-final-newline@2.1.2: - resolution: {integrity: sha512-K0FdPGPyEB94PwNgopwVJFE8oRWi7IhY2ycXFVAMReI51el7EHB8F1gX14tB6p6zyGy6mUh69bCVU9mMTNeOUg==} - - remark-lint-frontmatter-schema@3.15.4: - resolution: {integrity: sha512-egChkbtCCG4hw1F2qoipzSxp6Ea9z4pxaVkWYa36DnCZ9fn3GhCNyOUjbFSIvdhVcWN+AqvHdqPbXC9Pp81Hmg==} - - remark-lint-hard-break-spaces@3.1.2: - resolution: {integrity: sha512-HaW0xsl3TI7VFAqGWWcZtPqyz0NWu19KKjSO7OGFTUJU4S9YiRnhIxmSFM0ZLSsVAynE+dhzVKa8U7dOpWDcOg==} - - remark-lint-heading-style@3.1.2: - resolution: {integrity: sha512-0RkcRPV/H2bPFgeInzBkK1cWUwtFTm83I+Db/Z5tDY02GzKOosHLvxtJyj/1391/opAH1LYbHtHWffir99IUgw==} - - remark-lint-link-title-style@3.1.2: - resolution: {integrity: sha512-if4MahYJVvQUWlrXDF8GSv4b9VtLSgMSDHeikQp1/hGYlihLl9uGw3nlL5Lf9DqTN0qaT6RPbXOjuuzHlk38sg==} - - remark-lint-list-item-bullet-indent@4.1.2: - resolution: {integrity: sha512-WgU5nooqIEm6f35opcbHKBzWrdFJA3XcyTfB3nv/v0KX43/h6qFGmmMJ5kEiaFExuQp3dZSdatWuY0YZ9YRbUg==} - - remark-lint-list-item-content-indent@3.1.2: - resolution: {integrity: sha512-TB0pmrWiRaQW80Y/PILFQTnHDghRxXNzMwyawlP+DBF9gNom3pEBmb4ZlGQlN0aa3r8VWeIKdv1ylHrfXE0vqA==} - - remark-lint-list-item-indent@3.1.2: - resolution: {integrity: sha512-tkrra1pxZVE4OVJGfN435u/v0ljruXU+dHzWiKDYeifquD4aWhJxvSApu7+FbE098D/4usVXgMxwFkNhrpZcSQ==} - - remark-lint-no-blockquote-without-marker@5.1.2: - resolution: {integrity: sha512-QPbqsrt7EfpSWqTkZJ9tepabPIhBDlNqZkuxxMQYD0OQ2N+tHDUq3zE1JxI5ts1V9o/mWApgySocqGd3jlcKmQ==} - - remark-lint-no-duplicate-definitions@3.1.2: - resolution: {integrity: sha512-vi0nXA7p+pjQOorZOkr9E+QDhG74JAdbzqglWPrWWNI3z2rUYWYHTNSyWJbwEXaIIcev1ZAw8SCAOis5MNm+pA==} - - remark-lint-no-heading-content-indent@4.1.2: - resolution: {integrity: sha512-TTxFsm1f4ZHFxZQCuz7j0QK4RvP6oArTiwazKLr16yaZe1608ypogMek4A30j2xX8WuO9+2uBzLXCY5OBo5x5Q==} - - remark-lint-no-inline-padding@4.1.2: - resolution: {integrity: sha512-dGyhWsiqCZS3Slob0EVBUfsFBbdpMIBCvb56LlCgaHbnLsnNYx8PpF/wA5CgsN8BXIbXfRpyPB5cIJwIq5taYg==} - - remark-lint-no-literal-urls@3.1.2: - resolution: {integrity: sha512-4tV9JGLKxAMFSuWDMOqLozkFJ3HyRvhzgrPrxASoziaml23m7UXAozk5dkIrFny1cN2oG988Z8tORxX2FL1Ilw==} - - remark-lint-no-shortcut-reference-image@3.1.2: - resolution: {integrity: sha512-NX4XJFPyDeJJ77pmETxRj4oM/zayf7Lmn/O87HgExBkQIPz2NYbDeKD8QEyliLaV/oKA2rQufpzuFw55xa1Tww==} - - remark-lint-no-shortcut-reference-link@3.1.2: - resolution: {integrity: sha512-/9iPN7FLKaaIzw4tLWKu7Rx0wAP7E2EuzIeentQlkY0rO/mMHipmT3IlgiebsAInKagzTY6TNFoG1rq2VnaCcA==} - - remark-lint-no-undefined-references@4.2.1: - resolution: {integrity: sha512-HdNg5b2KiuNplcuVvRtsrUiROw557kAG1CiZYB7jQrrVWFgd86lKTa3bDiywe+87dGrGmHd3qQ28eZYTuHz2Nw==} - - remark-lint-no-unused-definitions@3.1.2: - resolution: {integrity: sha512-bOcaJAnjKxT3kASFquUA3fO9xem9wZhVqt8TbqjA84+G4n40qjaLXDs/4vq73aMsSde73K0f3j1u0pMe7et8yQ==} - - remark-lint-ordered-list-marker-style@3.1.2: - resolution: {integrity: sha512-62iVE/YQsA0Azaqt8yAJWPplWLS47kDLjXeC2PlRIAzCqbNt9qH3HId8vZ15QTSrp8rHmJwrCMdcqV6AZUi7gQ==} - - remark-lint-rule-style@3.1.2: - resolution: {integrity: sha512-0CsX2XcX9pIhAP5N7Y8mhYXp3/Ld+NvxXY1p0LHAq0NZu17UsZLuegvx/s25uFbQs08DcmSqyKnepU9qGGqmTQ==} - - remark-lint-strong-marker@3.1.2: - resolution: {integrity: sha512-U/g4wngmiI0Q6WBRQG6pZxnDS33Wt/0QYA3+KNFBDykoi1vXsDEorIqy3dEag9z6XHwcMvFDsff6VRUhaOJWQg==} - - remark-lint-table-cell-padding@4.1.3: - resolution: {integrity: sha512-N9xtnS6MG/H3srAMjqqaF26A7socr87pIgt64dr5rxoSbDRWRPChGQ8y7wKyV8VeyRNF37e3E5KB3bQVqjSYaQ==} - - remark-lint-table-pipe-alignment@3.1.3: - resolution: {integrity: sha512-bnE8WrB4kSrN+Yr+xN2GHWVgGukeSFU43qPMrpCzTyOSbzep366wORlFKqZmyFPEkIZ/uAUFS0Qm9DND66Yz/A==} - - remark-lint-table-pipes@4.1.2: - resolution: {integrity: sha512-Ex2cJDXA0hdD9CC5Nu0p3K5LP+AhzPvk4sIOSbevCTSRyCS/SkNk4CQ6pwWBxuPVuHQUkqXkT8lgu8wwr/9A3A==} - - remark-lint-unordered-list-marker-style@3.1.2: - resolution: {integrity: sha512-JFiyB4ZprJGGndCaFB8FssXd48m4Kh+CUqzNgu3lBLEiW8dEAGRlD9M2AzyyA+Q29WJP/FntDCbP22DeON91UA==} - - remark-lint@9.1.2: - resolution: {integrity: sha512-m9e/aPlh7tsvfJfj8tPxrQzD6oEdb9Foko+Ya/6OwUP9EoGMfehv1Qtv26W1DoH58Wn8rT8CD+KuprTWscMmIA==} - - remark-math@5.1.1: - resolution: {integrity: sha512-cE5T2R/xLVtfFI4cCePtiRn+e6jKMtFDR3P8V3qpv8wpKjwvHoBA4eJzvX+nVrnlNy0911bdGmuspCSwetfYHw==} - - remark-mdx@2.3.0: - resolution: {integrity: sha512-g53hMkpM0I98MU266IzDFMrTD980gNF3BJnkyFcmN+dD873mQeD5rdMO3Y2X+x8umQfbSE0PcoEDl7ledSA+2g==} - - remark-message-control@7.1.1: - resolution: {integrity: sha512-xKRWl1NTBOKed0oEtCd8BUfH5m4s8WXxFFSoo7uUwx6GW/qdCy4zov5LfPyw7emantDmhfWn5PdIZgcbVcWMDQ==} - - remark-parse@10.0.2: - resolution: {integrity: sha512-3ydxgHa/ZQzG8LvC7jTXccARYDcRld3VfcgIIFs7bI6vbRSxJJmzgLEIIoYKyrfhaY+ujuWaf/PJiMZXoiCXgw==} - - remark-parse@11.0.0: - resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==} - - remark-preset-lint-consistent@5.1.2: - resolution: {integrity: sha512-RQrWBFmyIkKfXtp9P1Fui7UbGSfXth9nuvRJUVnO0vfevBJe02iyMZWPokXSwkDOI/cM539wj0i3vrQupz+v5A==} - - remark-preset-lint-recommended@6.1.3: - resolution: {integrity: sha512-DGjbeP2TsFmQeJflUiIvJWAOs1PxJt7SG3WQyMxOppkRr/up+mxWVkuv+6AUuaR0EsuaaFGz7WmZM5TrSSFWJw==} - - remark-reading-time@2.0.1: - resolution: {integrity: sha512-fy4BKy9SRhtYbEHvp6AItbRTnrhiDGbqLQTSYVbQPGuRCncU1ubSsh9p/W5QZSxtYcUXv8KGL0xBgPLyNJA1xw==} - - remark-rehype@10.1.0: - resolution: {integrity: sha512-EFmR5zppdBp0WQeDVZ/b66CWJipB2q2VLNFMabzDSGR66Z2fQii83G5gTBbgGEnEEA0QRussvrFHxk1HWGJskw==} - - remark-stringify@10.0.3: - resolution: {integrity: sha512-koyOzCMYoUHudypbj4XpnAKFbkddRMYZHwghnxd7ue5210WzGw6kOBwauJTRUMq16jsovXx8dYNvSSWP89kZ3A==} - - remark-stringify@11.0.0: - resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==} - - remark@15.0.1: - resolution: {integrity: sha512-Eht5w30ruCXgFmxVUSlNWQ9iiimq07URKeFS3hNc8cUWy1llX4KDWfyEDZRycMc+znsN9Ux5/tJ/BFdgdOwA3A==} - - remove-accents@0.5.0: - resolution: {integrity: sha512-8g3/Otx1eJaVD12e31UbJj1YzdtVvzH85HV7t+9MJYk/u3XmkOUJ5Ys9wQrf9PCPK8+xn4ymzqYCiZl6QWKn+A==} - - repeat-string@1.6.1: - resolution: {integrity: sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==} - engines: {node: '>=0.10'} - - require-from-string@2.0.2: - resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} - engines: {node: '>=0.10.0'} - - resolve-from@4.0.0: - resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} - engines: {node: '>=4'} - - resolve-from@5.0.0: - resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} - engines: {node: '>=8'} - - reusify@1.0.4: - resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} - engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - - rimraf@3.0.2: - resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} - deprecated: Rimraf versions prior to v4 are no longer supported - hasBin: true - - rlp@2.2.7: - resolution: {integrity: sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ==} - hasBin: true - - robust-predicates@3.0.2: - resolution: {integrity: sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==} - - run-parallel@1.2.0: - resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} - - rw@1.3.3: - resolution: {integrity: sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==} - - sade@1.8.1: - resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} - engines: {node: '>=6'} - - safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - - safer-buffer@2.1.2: - resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - - scheduler@0.23.2: - resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} - - scroll-into-view-if-needed@3.1.0: - resolution: {integrity: sha512-49oNpRjWRvnU8NyGVmUaYG4jtTkNonFZI86MmGRDqBphEK2EXT9gdEUoQPZhuBM8yWHxCWbobltqYO5M4XrUvQ==} - - scrypt-js@3.0.1: - resolution: {integrity: sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==} - - search-insights@2.15.0: - resolution: {integrity: sha512-ch2sPCUDD4sbPQdknVl9ALSi9H7VyoeVbsxznYz6QV55jJ8CI3EtwpO1i84keN4+hF5IeHWIeGvc08530JkVXQ==} - - section-matter@1.0.0: - resolution: {integrity: sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==} - engines: {node: '>=4'} - - semver@7.6.0: - resolution: {integrity: sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==} - engines: {node: '>=10'} - hasBin: true - - sentence-case@3.0.4: - resolution: {integrity: sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg==} - - set-function-length@1.2.2: - resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} - engines: {node: '>= 0.4'} - - set-function-name@2.0.2: - resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} - engines: {node: '>= 0.4'} - - shebang-command@1.2.0: - resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} - engines: {node: '>=0.10.0'} - - shebang-command@2.0.0: - resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} - engines: {node: '>=8'} - - shebang-regex@1.0.0: - resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==} - engines: {node: '>=0.10.0'} - - shebang-regex@3.0.0: - resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} - engines: {node: '>=8'} - - shiki@0.14.7: - resolution: {integrity: sha512-dNPAPrxSc87ua2sKJ3H5dQ/6ZaY8RNnaAqK+t0eG7p0Soi2ydiqbGOTaZCqaYvA/uZYfS1LJnemt3Q+mSfcPCg==} - - side-channel@1.0.6: - resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} - engines: {node: '>= 0.4'} - - signal-exit@3.0.7: - resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} - - signal-exit@4.1.0: - resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} - engines: {node: '>=14'} - - slash@3.0.0: - resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} - engines: {node: '>=8'} - - snake-case@3.0.4: - resolution: {integrity: sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==} - - sort-keys@5.0.0: - resolution: {integrity: sha512-Pdz01AvCAottHTPQGzndktFNdbRA75BgOfeT1hH+AMnJFv8lynkPi42rfeEhpx1saTEI3YNMWxfqu0sFD1G8pw==} - engines: {node: '>=12'} - - source-map-js@1.2.0: - resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} - engines: {node: '>=0.10.0'} - - source-map@0.7.4: - resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} - engines: {node: '>= 8'} - - space-separated-tokens@2.0.2: - resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} - - sprintf-js@1.0.3: - resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} - - stop-iteration-iterator@1.0.0: - resolution: {integrity: sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==} - engines: {node: '>= 0.4'} - - streamsearch@1.1.0: - resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} - engines: {node: '>=10.0.0'} - - string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} - - string-width@5.1.2: - resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} - engines: {node: '>=12'} - - string_decoder@1.3.0: - resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} - - stringify-entities@4.0.4: - resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} - - strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} - - strip-ansi@7.1.0: - resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} - engines: {node: '>=12'} - - strip-bom-string@1.0.0: - resolution: {integrity: sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==} - engines: {node: '>=0.10.0'} - - strip-eof@1.0.0: - resolution: {integrity: sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==} - engines: {node: '>=0.10.0'} - - strip-hex-prefix@1.0.0: - resolution: {integrity: sha512-q8d4ue7JGEiVcypji1bALTos+0pWtyGlivAWyPuTkHzuTCJqrK9sWxYQZUq6Nq3cuyv3bm734IhHvHtGGURU6A==} - engines: {node: '>=6.5.0', npm: '>=3'} - - strip-indent@4.0.0: - resolution: {integrity: sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA==} - engines: {node: '>=12'} - - strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} - - style-to-object@0.4.4: - resolution: {integrity: sha512-HYNoHZa2GorYNyqiCaBgsxvcJIn7OHq6inEga+E6Ke3m5JkoqpQbnFssk4jwe+K7AhGa2fcha4wSOf1Kn01dMg==} - - styled-jsx@5.1.1: - resolution: {integrity: sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==} - engines: {node: '>= 12.0.0'} - peerDependencies: - '@babel/core': '*' - babel-plugin-macros: '*' - react: '>= 16.8.0 || 17.x.x || ^18.0.0-0' - peerDependenciesMeta: - '@babel/core': - optional: true - babel-plugin-macros: - optional: true - - stylis@4.3.2: - resolution: {integrity: sha512-bhtUjWd/z6ltJiQwg0dUfxEJ+W+jdqQd8TbWLWyeIJHlnsqmGLRFFd8e5mA0AZi/zx90smXRlN66YMTcaSFifg==} - - supports-color@4.5.0: - resolution: {integrity: sha512-ycQR/UbvI9xIlEdQT1TQqwoXtEldExbCEAJgRo5YXlmSKjv6ThHnP9/vwGa1gr19Gfw+LkFd7KqYMhzrRC5JYw==} - engines: {node: '>=4'} - - supports-color@5.5.0: - resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} - engines: {node: '>=4'} - - supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} - - supports-color@9.4.0: - resolution: {integrity: sha512-VL+lNrEoIXww1coLPOmiEmK/0sGigko5COxI09KzHc2VJXJsQ37UaQ+8quuxjDeA7+KnLGTWRyOXSLLR2Wb4jw==} - engines: {node: '>=12'} - - synckit@0.9.0: - resolution: {integrity: sha512-7RnqIMq572L8PeEzKeBINYEJDDxpcH8JEgLwUqBd3TkofhFRbkq4QLR0u+36avGAhCRbk2nnmjcW9SE531hPDg==} - engines: {node: ^14.18.0 || >=16.0.0} - - tabbable@6.2.0: - resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==} - - text-table@0.2.0: - resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} - - tinyurl@1.1.7: - resolution: {integrity: sha512-NCnyDkBTByS/pLH/Vrx/DPL8EciAUDoAvruaM/WnQLfX6Uame3D1nuWNy2Z9CXw7rcsok0tjuonRLolhmyz5rg==} - deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. - - title@3.5.3: - resolution: {integrity: sha512-20JyowYglSEeCvZv3EZ0nZ046vLarO37prvV0mbtQV7C8DJPGgN967r8SJkqd3XK3K3lD3/Iyfp3avjfil8Q2Q==} - hasBin: true - - titleize@1.0.0: - resolution: {integrity: sha512-TARUb7z1pGvlLxgPk++7wJ6aycXF3GJ0sNSBTAsTuJrQG5QuZlkUQP+zl+nbjAh4gMX9yDw9ZYklMd7vAfJKEw==} - engines: {node: '>=0.10.0'} - - to-gatsby-remark-plugin@0.1.0: - resolution: {integrity: sha512-blmhJ/gIrytWnWLgPSRCkhCPeki6UBK2daa3k9mGahN7GjwHu8KrS7F70MvwlsG7IE794JLgwAdCbi4hU4faFQ==} +dependencies: + '@eth-optimism/contracts-ts': + specifier: ^0.17.0 + version: 0.17.2(typescript@5.4.5) + '@eth-optimism/tokenlist': + specifier: ^9.0.9 + version: 9.0.51 + '@feelback/react': + specifier: ^0.3.4 + version: 0.3.4(react@18.3.1) + '@headlessui/react': + specifier: ^2.1.8 + version: 2.1.10(react-dom@18.3.1)(react@18.3.1) + algoliasearch: + specifier: ^4.23.3 + version: 4.23.3 + clsx: + specifier: ^2.1.1 + version: 2.1.1 + escape-string-regexp: + specifier: ^5.0.0 + version: 5.0.0 + next: + specifier: 14.2.10 + version: 14.2.10(react-dom@18.3.1)(react@18.3.1) + next-sitemap: + specifier: ^4.2.3 + version: 4.2.3(next@14.2.10) + nextra: + specifier: 2.13.2 + version: 2.13.2(patch_hash=a4rp2hgojklggjmthmkiyqaek4)(next@14.2.10)(react-dom@18.3.1)(react@18.3.1) + nextra-theme-docs: + specifier: 2.13.2 + version: 2.13.2(next@14.2.10)(nextra@2.13.2)(react-dom@18.3.1)(react@18.3.1) + react: + specifier: ^18.2.0 + version: 18.3.1 + react-dom: + specifier: ^18.2.0 + version: 18.3.1(react@18.3.1) + search-insights: + specifier: ^2.15.0 + version: 2.17.2 + +devDependencies: + '@double-great/remark-lint-alt-text': + specifier: ^1.0.0 + version: 1.0.0 + '@eth-optimism/core-utils': + specifier: ^0.13.1 + version: 0.13.2 + '@eth-optimism/sdk': + specifier: ^3.1.6 + version: 3.3.0(ethers@5.7.2) + '@types/node': + specifier: 18.11.10 + version: 18.11.10 + cspell: + specifier: ^8.1.3 + version: 8.7.0 + eslint: + specifier: ^8.53.0 + version: 8.57.0 + eslint-plugin-mdx: + specifier: ^2.2.0 + version: 2.3.4(eslint@8.57.0) + ethers: + specifier: ^5 + version: 5.7.2 + globby: + specifier: ^11.0.4 + version: 11.1.0 + gray-matter: + specifier: ^4.0.3 + version: 4.0.3 + remark: + specifier: ^15.0.1 + version: 15.0.1 + remark-code-import: + specifier: ^1.2.0 + version: 1.2.0(patch_hash=heylvfasxh3ubj2edns2svea2m) + remark-frontmatter: + specifier: ^5.0.0 + version: 5.0.0 + remark-gfm: + specifier: ^3.0.1 + version: 3.0.1 + remark-lint-frontmatter-schema: + specifier: ^3.15.4 + version: 3.15.4(patch_hash=jaxvkozlhcbn7zjsiti5ocoubi) + remark-lint-heading-style: + specifier: ^3.1.2 + version: 3.1.2 + remark-lint-list-item-indent: + specifier: ^3.1.2 + version: 3.1.2 + remark-lint-table-cell-padding: + specifier: ^4.1.3 + version: 4.1.3 + remark-lint-table-pipe-alignment: + specifier: ^3.1.3 + version: 3.1.3 + remark-lint-table-pipes: + specifier: ^4.1.2 + version: 4.1.2 + remark-lint-unordered-list-marker-style: + specifier: ^3.1.2 + version: 3.1.2 + remark-preset-lint-consistent: + specifier: ^5.1.2 + version: 5.1.2 + remark-preset-lint-recommended: + specifier: ^6.1.3 + version: 6.1.3 + typescript: + specifier: ^5.2.2 + version: 5.4.5 + unified-lint-rule: + specifier: ^2.1.2 + version: 2.1.2 + unist-util-visit: + specifier: ^5.0.0 + version: 5.0.0 - to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} - - to-vfile@6.1.0: - resolution: {integrity: sha512-BxX8EkCxOAZe+D/ToHdDsJcVI4HqQfmw0tCkp31zf3dNP/XWIAjU4CmeuSwsSoOzOTqHPOL0KUzyZqJplkD0Qw==} - - to-vfile@7.2.4: - resolution: {integrity: sha512-2eQ+rJ2qGbyw3senPI0qjuM7aut8IYXK6AEoOWb+fJx/mQYzviTckm1wDjq91QYHAPBTYzmdJXxMFA6Mk14mdw==} - - tr46@0.0.3: - resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - - treeify@1.1.0: - resolution: {integrity: sha512-1m4RA7xVAJrSGrrXGs0L3YTwyvBs2S8PbRHaLZAkFw7JR8oIFwYtysxlBZhYIa7xSyiYJKZ3iGrrk55cGA3i9A==} - engines: {node: '>=0.6'} - - trim-lines@3.0.1: - resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} - - trough@2.2.0: - resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} - - ts-dedent@2.2.0: - resolution: {integrity: sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==} - engines: {node: '>=6.10'} - - tslib@2.6.2: - resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} - - type-check@0.4.0: - resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} - engines: {node: '>= 0.8.0'} - - type-detect@4.0.8: - resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} - engines: {node: '>=4'} - - type-fest@0.20.2: - resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} - engines: {node: '>=10'} - - type-fest@1.4.0: - resolution: {integrity: sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==} - engines: {node: '>=10'} - - typedarray-to-buffer@3.1.5: - resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} - - typedarray@0.0.6: - resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} - - typescript@5.4.5: - resolution: {integrity: sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==} - engines: {node: '>=14.17'} - hasBin: true - - unified-engine@10.1.0: - resolution: {integrity: sha512-5+JDIs4hqKfHnJcVCxTid1yBoI/++FfF/1PFdSMpaftZZZY+qg2JFruRbf7PaIwa9KgLotXQV3gSjtY0IdcFGQ==} - - unified-lint-rule@2.1.2: - resolution: {integrity: sha512-JWudPtRN7TLFHVLEVZ+Rm8FUb6kCAtHxEXFgBGDxRSdNMnGyTU5zyYvduHSF/liExlFB3vdFvsAHnNVE/UjAwA==} - - unified-message-control@4.0.0: - resolution: {integrity: sha512-1b92N+VkPHftOsvXNOtkJm4wHlr+UDmTBF2dUzepn40oy9NxanJ9xS1RwUBTjXJwqr2K0kMbEyv1Krdsho7+Iw==} - - unified@10.1.2: - resolution: {integrity: sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==} - - unified@11.0.4: - resolution: {integrity: sha512-apMPnyLjAX+ty4OrNap7yumyVAMlKx5IWU2wlzzUdYJO9A8f1p9m/gywF/GM2ZDFcjQPrx59Mc90KwmxsoklxQ==} - - unique-string@3.0.0: - resolution: {integrity: sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==} - engines: {node: '>=12'} - - unist-util-find-after@5.0.0: - resolution: {integrity: sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==} - - unist-util-generated@2.0.1: - resolution: {integrity: sha512-qF72kLmPxAw0oN2fwpWIqbXAVyEqUzDHMsbtPvOudIlUzXYFIeQIuxXQCRCFh22B7cixvU0MG7m3MW8FTq/S+A==} - - unist-util-inspect@7.0.2: - resolution: {integrity: sha512-Op0XnmHUl6C2zo/yJCwhXQSm/SmW22eDZdWP2qdf4WpGrgO1ZxFodq+5zFyeRGasFjJotAnLgfuD1jkcKqiH1Q==} - - unist-util-is@5.2.1: - resolution: {integrity: sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==} - - unist-util-is@6.0.0: - resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} - - unist-util-position-from-estree@1.1.2: - resolution: {integrity: sha512-poZa0eXpS+/XpoQwGwl79UUdea4ol2ZuCYguVaJS4qzIOMDzbqz8a3erUCOmubSZkaOuGamb3tX790iwOIROww==} - - unist-util-position@4.0.4: - resolution: {integrity: sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg==} - - unist-util-position@5.0.0: - resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} - - unist-util-remove-position@4.0.2: - resolution: {integrity: sha512-TkBb0HABNmxzAcfLf4qsIbFbaPDvMO6wa3b3j4VcEzFVaw1LBKwnW4/sRJ/atSLSzoIg41JWEdnE7N6DIhGDGQ==} - - unist-util-remove-position@5.0.0: - resolution: {integrity: sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==} - - unist-util-remove@4.0.0: - resolution: {integrity: sha512-b4gokeGId57UVRX/eVKej5gXqGlc9+trkORhFJpu9raqZkZhU0zm8Doi05+HaiBsMEIJowL+2WtQ5ItjsngPXg==} - - unist-util-stringify-position@2.0.3: - resolution: {integrity: sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==} - - unist-util-stringify-position@3.0.3: - resolution: {integrity: sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==} - - unist-util-stringify-position@4.0.0: - resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} - - unist-util-visit-parents@4.1.1: - resolution: {integrity: sha512-1xAFJXAKpnnJl8G7K5KgU7FY55y3GcLIXqkzUj5QF/QVP7biUm0K0O2oqVkYsdjzJKifYeWn9+o6piAK2hGSHw==} - - unist-util-visit-parents@5.1.3: - resolution: {integrity: sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==} - - unist-util-visit-parents@6.0.1: - resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==} - - unist-util-visit@3.1.0: - resolution: {integrity: sha512-Szoh+R/Ll68QWAyQyZZpQzZQm2UPbxibDvaY8Xc9SUtYgPsDzx5AWSk++UUt2hJuow8mvwR+rG+LQLw+KsuAKA==} - - unist-util-visit@4.1.2: - resolution: {integrity: sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==} - - unist-util-visit@5.0.0: - resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} - - upper-case-first@2.0.2: - resolution: {integrity: sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==} - - upper-case@2.0.2: - resolution: {integrity: sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg==} - - uri-js@4.4.1: - resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} - - utf8@3.0.0: - resolution: {integrity: sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ==} - - util-deprecate@1.0.2: - resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - - uuid@9.0.1: - resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} - hasBin: true - - uvu@0.5.6: - resolution: {integrity: sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA==} - engines: {node: '>=8'} - hasBin: true - - vfile-location@4.1.0: - resolution: {integrity: sha512-YF23YMyASIIJXpktBa4vIGLJ5Gs88UB/XePgqPmTa7cDA+JeO3yclbpheQYCHjVHBn/yePzrXuygIL+xbvRYHw==} - - vfile-location@5.0.2: - resolution: {integrity: sha512-NXPYyxyBSH7zB5U6+3uDdd6Nybz6o6/od9rk8bp9H8GR3L+cm/fC0uUTbqBmUTnMCUDslAGBOIKNfvvb+gGlDg==} - - vfile-matter@3.0.1: - resolution: {integrity: sha512-CAAIDwnh6ZdtrqAuxdElUqQRQDQgbbIrYtDYI8gCjXS1qQ+1XdLoK8FIZWxJwn0/I+BkSSZpar3SOgjemQz4fg==} - - vfile-message@2.0.4: - resolution: {integrity: sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==} - - vfile-message@3.1.4: - resolution: {integrity: sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==} - - vfile-message@4.0.2: - resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==} - - vfile-reporter@7.0.5: - resolution: {integrity: sha512-NdWWXkv6gcd7AZMvDomlQbK3MqFWL1RlGzMn++/O2TI+68+nqxCPTvLugdOtfSzXmjh+xUyhp07HhlrbJjT+mw==} - - vfile-sort@3.0.1: - resolution: {integrity: sha512-1os1733XY6y0D5x0ugqSeaVJm9lYgj0j5qdcZQFyxlZOSy1jYarL77lLyb5gK4Wqr1d5OxmuyflSO3zKyFnTFw==} - - vfile-statistics@2.0.1: - resolution: {integrity: sha512-W6dkECZmP32EG/l+dp2jCLdYzmnDBIw6jwiLZSER81oR5AHRcVqL+k3Z+pfH1R73le6ayDkJRMk0sutj1bMVeg==} - - vfile@4.2.1: - resolution: {integrity: sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==} - - vfile@5.3.7: - resolution: {integrity: sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==} - - vfile@6.0.1: - resolution: {integrity: sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw==} - - viem@2.9.28: - resolution: {integrity: sha512-/1iTg8yQlCNJ+7wSmdsBNB/vhjWqFJtTH6XZXHjGXrZnlBxAtHR5ZAr5TvTJc/2nhVIVE4BkCe5JCrIiSuZodg==} - peerDependencies: - typescript: '>=5.0.4' - peerDependenciesMeta: - typescript: - optional: true - - vscode-languageserver-textdocument@1.0.11: - resolution: {integrity: sha512-X+8T3GoiwTVlJbicx/sIAF+yuJAqz8VvwJyoMVhwEMoEKE/fkDmrqUgDMyBECcM2A2frVZIUj5HI/ErRXCfOeA==} - - vscode-oniguruma@1.7.0: - resolution: {integrity: sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==} - - vscode-textmate@8.0.0: - resolution: {integrity: sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg==} - - vscode-uri@3.0.8: - resolution: {integrity: sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==} - - walk-up-path@3.0.1: - resolution: {integrity: sha512-9YlCL/ynK3CTlrSRrDxZvUauLzAswPCrsaCgilqFevUYpeEW0/3ScEjaa3kbW/T0ghhkEr7mv+fpjqn1Y1YuTA==} - - web-namespaces@2.0.1: - resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} - - web-worker@1.3.0: - resolution: {integrity: sha512-BSR9wyRsy/KOValMgd5kMyr3JzpdeoR9KVId8u5GVlTTAtNChlsE4yTxeY7zMdNSyOmoKBv8NH2qeRY9Tg+IaA==} - - web3-utils@1.10.4: - resolution: {integrity: sha512-tsu8FiKJLk2PzhDl9fXbGUWTkkVXYhtTA+SmEFkKft+9BgwLxfCRpU96sWv7ICC8zixBNd3JURVoiR3dUXgP8A==} - engines: {node: '>=8.0.0'} - - webidl-conversions@3.0.1: - resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} - - whatwg-url@5.0.0: - resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} - - which-boxed-primitive@1.0.2: - resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} - - which-collection@1.0.2: - resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} - engines: {node: '>= 0.4'} - - which-typed-array@1.1.15: - resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==} - engines: {node: '>= 0.4'} - - which@1.3.1: - resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} - hasBin: true - - which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true - - word-wrap@1.2.5: - resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} - engines: {node: '>=0.10.0'} - - wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} - - wrap-ansi@8.1.0: - resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} - engines: {node: '>=12'} - - wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - - write-file-atomic@3.0.3: - resolution: {integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==} - - ws@7.4.6: - resolution: {integrity: sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==} - engines: {node: '>=8.3.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - ws@8.13.0: - resolution: {integrity: sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - xdg-basedir@5.1.0: - resolution: {integrity: sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ==} - engines: {node: '>=12'} - - yallist@2.1.2: - resolution: {integrity: sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==} - - yallist@4.0.0: - resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - - yaml@2.3.3: - resolution: {integrity: sha512-zw0VAJxgeZ6+++/su5AFoqBbZbrEakwu+X0M5HmcwUiBL7AzcuPKjj5we4xfQLp78LkEMpD0cOnUhmgOVy3KdQ==} - engines: {node: '>= 14'} - - yaml@2.4.2: - resolution: {integrity: sha512-B3VqDZ+JAg1nZpaEmWtTXUlBneoGx6CPM9b0TENK6aoSu5t73dItudwdgmi6tHlIZZId4dZ9skcAQ2UbcyAeVA==} - engines: {node: '>= 14'} - hasBin: true - - yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} - - yocto-queue@1.0.0: - resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} - engines: {node: '>=12.20'} - - zod@3.23.8: - resolution: {integrity: sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==} - - zwitch@2.0.4: - resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} - -snapshots: +packages: - '@adraffy/ens-normalize@1.10.0': {} + /@adraffy/ens-normalize@1.10.0: + resolution: {integrity: sha512-nA9XHtlAkYfJxY7bce8DcN7eKxWWCWkU+1GR9d+U6MbNpfwQp8TI7vqOsBsMcHoT4mBu2kypKoSKnghEzOOq5Q==} + dev: false - '@algolia/cache-browser-local-storage@4.23.3': + /@algolia/cache-browser-local-storage@4.23.3: + resolution: {integrity: sha512-vRHXYCpPlTDE7i6UOy2xE03zHF2C8MEFjPN2v7fRbqVpcOvAUQK81x3Kc21xyb5aSIpYCjWCZbYZuz8Glyzyyg==} dependencies: '@algolia/cache-common': 4.23.3 + dev: false - '@algolia/cache-common@4.23.3': {} + /@algolia/cache-common@4.23.3: + resolution: {integrity: sha512-h9XcNI6lxYStaw32pHpB1TMm0RuxphF+Ik4o7tcQiodEdpKK+wKufY6QXtba7t3k8eseirEMVB83uFFF3Nu54A==} + dev: false - '@algolia/cache-in-memory@4.23.3': + /@algolia/cache-in-memory@4.23.3: + resolution: {integrity: sha512-yvpbuUXg/+0rbcagxNT7un0eo3czx2Uf0y4eiR4z4SD7SiptwYTpbuS0IHxcLHG3lq22ukx1T6Kjtk/rT+mqNg==} dependencies: '@algolia/cache-common': 4.23.3 + dev: false - '@algolia/client-account@4.23.3': + /@algolia/client-account@4.23.3: + resolution: {integrity: sha512-hpa6S5d7iQmretHHF40QGq6hz0anWEHGlULcTIT9tbUssWUriN9AUXIFQ8Ei4w9azD0hc1rUok9/DeQQobhQMA==} dependencies: '@algolia/client-common': 4.23.3 '@algolia/client-search': 4.23.3 '@algolia/transporter': 4.23.3 + dev: false - '@algolia/client-analytics@4.23.3': + /@algolia/client-analytics@4.23.3: + resolution: {integrity: sha512-LBsEARGS9cj8VkTAVEZphjxTjMVCci+zIIiRhpFun9jGDUlS1XmhCW7CTrnaWeIuCQS/2iPyRqSy1nXPjcBLRA==} dependencies: '@algolia/client-common': 4.23.3 '@algolia/client-search': 4.23.3 '@algolia/requester-common': 4.23.3 '@algolia/transporter': 4.23.3 + dev: false - '@algolia/client-common@4.23.3': + /@algolia/client-common@4.23.3: + resolution: {integrity: sha512-l6EiPxdAlg8CYhroqS5ybfIczsGUIAC47slLPOMDeKSVXYG1n0qGiz4RjAHLw2aD0xzh2EXZ7aRguPfz7UKDKw==} dependencies: '@algolia/requester-common': 4.23.3 '@algolia/transporter': 4.23.3 + dev: false - '@algolia/client-personalization@4.23.3': + /@algolia/client-personalization@4.23.3: + resolution: {integrity: sha512-3E3yF3Ocr1tB/xOZiuC3doHQBQ2zu2MPTYZ0d4lpfWads2WTKG7ZzmGnsHmm63RflvDeLK/UVx7j2b3QuwKQ2g==} dependencies: '@algolia/client-common': 4.23.3 '@algolia/requester-common': 4.23.3 '@algolia/transporter': 4.23.3 + dev: false - '@algolia/client-search@4.23.3': + /@algolia/client-search@4.23.3: + resolution: {integrity: sha512-P4VAKFHqU0wx9O+q29Q8YVuaowaZ5EM77rxfmGnkHUJggh28useXQdopokgwMeYw2XUht49WX5RcTQ40rZIabw==} dependencies: '@algolia/client-common': 4.23.3 '@algolia/requester-common': 4.23.3 '@algolia/transporter': 4.23.3 + dev: false - '@algolia/logger-common@4.23.3': {} + /@algolia/logger-common@4.23.3: + resolution: {integrity: sha512-y9kBtmJwiZ9ZZ+1Ek66P0M68mHQzKRxkW5kAAXYN/rdzgDN0d2COsViEFufxJ0pb45K4FRcfC7+33YB4BLrZ+g==} + dev: false - '@algolia/logger-console@4.23.3': + /@algolia/logger-console@4.23.3: + resolution: {integrity: sha512-8xoiseoWDKuCVnWP8jHthgaeobDLolh00KJAdMe9XPrWPuf1by732jSpgy2BlsLTaT9m32pHI8CRfrOqQzHv3A==} dependencies: '@algolia/logger-common': 4.23.3 + dev: false - '@algolia/recommend@4.23.3': + /@algolia/recommend@4.23.3: + resolution: {integrity: sha512-9fK4nXZF0bFkdcLBRDexsnGzVmu4TSYZqxdpgBW2tEyfuSSY54D4qSRkLmNkrrz4YFvdh2GM1gA8vSsnZPR73w==} dependencies: '@algolia/cache-browser-local-storage': 4.23.3 '@algolia/cache-common': 4.23.3 @@ -3737,54 +225,81 @@ snapshots: '@algolia/requester-common': 4.23.3 '@algolia/requester-node-http': 4.23.3 '@algolia/transporter': 4.23.3 + dev: false - '@algolia/requester-browser-xhr@4.23.3': + /@algolia/requester-browser-xhr@4.23.3: + resolution: {integrity: sha512-jDWGIQ96BhXbmONAQsasIpTYWslyjkiGu0Quydjlowe+ciqySpiDUrJHERIRfELE5+wFc7hc1Q5hqjGoV7yghw==} dependencies: '@algolia/requester-common': 4.23.3 + dev: false - '@algolia/requester-common@4.23.3': {} + /@algolia/requester-common@4.23.3: + resolution: {integrity: sha512-xloIdr/bedtYEGcXCiF2muajyvRhwop4cMZo+K2qzNht0CMzlRkm8YsDdj5IaBhshqfgmBb3rTg4sL4/PpvLYw==} + dev: false - '@algolia/requester-node-http@4.23.3': + /@algolia/requester-node-http@4.23.3: + resolution: {integrity: sha512-zgu++8Uj03IWDEJM3fuNl34s746JnZOWn1Uz5taV1dFyJhVM/kTNw9Ik7YJWiUNHJQXcaD8IXD1eCb0nq/aByA==} dependencies: '@algolia/requester-common': 4.23.3 + dev: false - '@algolia/transporter@4.23.3': + /@algolia/transporter@4.23.3: + resolution: {integrity: sha512-Wjl5gttqnf/gQKJA+dafnD0Y6Yw97yvfY8R9h0dQltX1GXTgNs1zWgvtWW0tHl1EgMdhAyw189uWiZMnL3QebQ==} dependencies: '@algolia/cache-common': 4.23.3 '@algolia/logger-common': 4.23.3 '@algolia/requester-common': 4.23.3 + dev: false - '@apidevtools/json-schema-ref-parser@11.1.0': + /@apidevtools/json-schema-ref-parser@11.1.0: + resolution: {integrity: sha512-g/VW9ZQEFJAOwAyUb8JFf7MLiLy2uEB4rU270rGzDwICxnxMlPy0O11KVePSgS36K1NI29gSlK84n5INGhd4Ag==} + engines: {node: '>= 16'} dependencies: '@jsdevtools/ono': 7.1.3 '@types/json-schema': 7.0.15 '@types/lodash.clonedeep': 4.5.9 js-yaml: 4.1.0 lodash.clonedeep: 4.5.0 + dev: true - '@babel/code-frame@7.24.2': + /@babel/code-frame@7.24.2: + resolution: {integrity: sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==} + engines: {node: '>=6.9.0'} dependencies: '@babel/highlight': 7.24.2 picocolors: 1.0.0 - '@babel/helper-validator-identifier@7.22.20': {} + /@babel/helper-validator-identifier@7.22.20: + resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} + engines: {node: '>=6.9.0'} - '@babel/highlight@7.24.2': + /@babel/highlight@7.24.2: + resolution: {integrity: sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==} + engines: {node: '>=6.9.0'} dependencies: '@babel/helper-validator-identifier': 7.22.20 chalk: 2.4.2 js-tokens: 4.0.0 picocolors: 1.0.0 - '@babel/runtime@7.24.4': + /@babel/runtime@7.24.4: + resolution: {integrity: sha512-dkxf7+hn8mFBwKjs9bvBlArzLVxVbS8usaPUDd5p2a9JCL9tB8OaOVN1isD4+Xyk4ns89/xeOmbQvgdK7IIVdA==} + engines: {node: '>=6.9.0'} dependencies: regenerator-runtime: 0.14.1 + dev: false - '@braintree/sanitize-url@6.0.4': {} + /@braintree/sanitize-url@6.0.4: + resolution: {integrity: sha512-s3jaWicZd0pkP0jf5ysyHUI/RE7MHos6qlToFcGWXVp+ykHOy77OUMrfbgJ9it2C5bow7OIQwYYaHjk9XlBQ2A==} + dev: false - '@corex/deepmerge@4.0.43': {} + /@corex/deepmerge@4.0.43: + resolution: {integrity: sha512-N8uEMrMPL0cu/bdboEWpQYb/0i2K5Qn8eCsxzOmxSggJbbQte7ljMRoXm917AbntqTGOzdTu+vP3KOOzoC70HQ==} + dev: false - '@cspell/cspell-bundled-dicts@8.7.0': + /@cspell/cspell-bundled-dicts@8.7.0: + resolution: {integrity: sha512-B5YQI7Dd9m0JHTmHgs7PiyP4BWXzl8ixpK+HGOwhxzh7GyfFt1Eo/gxMxBDX/9SaewEzeb2OjRpRKEFtEsto3A==} + engines: {node: '>=18'} dependencies: '@cspell/dict-ada': 4.0.2 '@cspell/dict-aws': 4.0.1 @@ -3837,153 +352,293 @@ snapshots: '@cspell/dict-terraform': 1.0.0 '@cspell/dict-typescript': 3.1.4 '@cspell/dict-vue': 3.0.0 + dev: true - '@cspell/cspell-json-reporter@8.7.0': + /@cspell/cspell-json-reporter@8.7.0: + resolution: {integrity: sha512-LTQPEvXvCqnc+ok9WXpSISZyt4/nGse9fVEM430g0BpGzKpt3RMx49B8uasvvnanzCuikaW9+wFLmwgvraERhA==} + engines: {node: '>=18'} dependencies: '@cspell/cspell-types': 8.7.0 + dev: true - '@cspell/cspell-pipe@8.7.0': {} + /@cspell/cspell-pipe@8.7.0: + resolution: {integrity: sha512-ePqddIQ4arqPQgOkC146SkZxvZb9/jL7xIM5Igy2n3tiWTC5ijrX/mbHpPZ1VGcFck+1M0cJUuyhuJk+vMj3rg==} + engines: {node: '>=18'} + dev: true - '@cspell/cspell-resolver@8.7.0': + /@cspell/cspell-resolver@8.7.0: + resolution: {integrity: sha512-grZwDFYqcBYQDaz4AkUtdyqc4UUH2J3/7yWVkBbYDPE+FQHa9ofFXzXxyjs56GJlPfi9ULpe5/Wz6uVLg8rQkQ==} + engines: {node: '>=18'} dependencies: global-directory: 4.0.1 + dev: true - '@cspell/cspell-service-bus@8.7.0': {} + /@cspell/cspell-service-bus@8.7.0: + resolution: {integrity: sha512-KW48iu0nTDzbedixc7iB7K7mlAZQ7QeMLuM/akxigOlvtOdVJrRa9Pfn44lwejts1ANb/IXil3GH8YylkVi76Q==} + engines: {node: '>=18'} + dev: true - '@cspell/cspell-types@8.7.0': {} + /@cspell/cspell-types@8.7.0: + resolution: {integrity: sha512-Rb+LCE5I9JEb/LE8nSViVSF8z1CWv/z4mPBIG37VMa7aUx2gAQa6gJekNfpY9YZiMzx4Tv3gDujN80ytks4pGA==} + engines: {node: '>=18'} + dev: true - '@cspell/dict-ada@4.0.2': {} + /@cspell/dict-ada@4.0.2: + resolution: {integrity: sha512-0kENOWQeHjUlfyId/aCM/mKXtkEgV0Zu2RhUXCBr4hHo9F9vph+Uu8Ww2b0i5a4ZixoIkudGA+eJvyxrG1jUpA==} + dev: true - '@cspell/dict-aws@4.0.1': {} + /@cspell/dict-aws@4.0.1: + resolution: {integrity: sha512-NXO+kTPQGqaaJKa4kO92NAXoqS+i99dQzf3/L1BxxWVSBS3/k1f3uhmqIh7Crb/n22W793lOm0D9x952BFga3Q==} + dev: true - '@cspell/dict-bash@4.1.3': {} + /@cspell/dict-bash@4.1.3: + resolution: {integrity: sha512-tOdI3QVJDbQSwPjUkOiQFhYcu2eedmX/PtEpVWg0aFps/r6AyjUQINtTgpqMYnYuq8O1QUIQqnpx21aovcgZCw==} + dev: true - '@cspell/dict-companies@3.0.31': {} + /@cspell/dict-companies@3.0.31: + resolution: {integrity: sha512-hKVpV/lcGKP4/DpEPS8P4osPvFH/YVLJaDn9cBIOH6/HSmL5LbFgJNKpMGaYRbhm2FEX56MKE3yn/MNeNYuesQ==} + dev: true - '@cspell/dict-cpp@5.1.3': {} + /@cspell/dict-cpp@5.1.3: + resolution: {integrity: sha512-sqnriXRAInZH9W75C+APBh6dtben9filPqVbIsiRMUXGg+s02ekz0z6LbS7kXeJ5mD2qXoMLBrv13qH2eIwutQ==} + dev: true - '@cspell/dict-cryptocurrencies@5.0.0': {} + /@cspell/dict-cryptocurrencies@5.0.0: + resolution: {integrity: sha512-Z4ARIw5+bvmShL+4ZrhDzGhnc9znaAGHOEMaB/GURdS/jdoreEDY34wdN0NtdLHDO5KO7GduZnZyqGdRoiSmYA==} + dev: true - '@cspell/dict-csharp@4.0.2': {} + /@cspell/dict-csharp@4.0.2: + resolution: {integrity: sha512-1JMofhLK+4p4KairF75D3A924m5ERMgd1GvzhwK2geuYgd2ZKuGW72gvXpIV7aGf52E3Uu1kDXxxGAiZ5uVG7g==} + dev: true - '@cspell/dict-css@4.0.12': {} + /@cspell/dict-css@4.0.12: + resolution: {integrity: sha512-vGBgPM92MkHQF5/2jsWcnaahOZ+C6OE/fPvd5ScBP72oFY9tn5GLuomcyO0z8vWCr2e0nUSX1OGimPtcQAlvSw==} + dev: true - '@cspell/dict-dart@2.0.3': {} + /@cspell/dict-dart@2.0.3: + resolution: {integrity: sha512-cLkwo1KT5CJY5N5RJVHks2genFkNCl/WLfj+0fFjqNR+tk3tBI1LY7ldr9piCtSFSm4x9pO1x6IV3kRUY1lLiw==} + dev: true - '@cspell/dict-data-science@1.0.11': {} + /@cspell/dict-data-science@1.0.11: + resolution: {integrity: sha512-TaHAZRVe0Zlcc3C23StZqqbzC0NrodRwoSAc8dis+5qLeLLnOCtagYQeROQvDlcDg3X/VVEO9Whh4W/z4PAmYQ==} + dev: true - '@cspell/dict-django@4.1.0': {} + /@cspell/dict-django@4.1.0: + resolution: {integrity: sha512-bKJ4gPyrf+1c78Z0Oc4trEB9MuhcB+Yg+uTTWsvhY6O2ncFYbB/LbEZfqhfmmuK/XJJixXfI1laF2zicyf+l0w==} + dev: true - '@cspell/dict-docker@1.1.7': {} + /@cspell/dict-docker@1.1.7: + resolution: {integrity: sha512-XlXHAr822euV36GGsl2J1CkBIVg3fZ6879ZOg5dxTIssuhUOCiV2BuzKZmt6aIFmcdPmR14+9i9Xq+3zuxeX0A==} + dev: true - '@cspell/dict-dotnet@5.0.0': {} + /@cspell/dict-dotnet@5.0.0: + resolution: {integrity: sha512-EOwGd533v47aP5QYV8GlSSKkmM9Eq8P3G/eBzSpH3Nl2+IneDOYOBLEUraHuiCtnOkNsz0xtZHArYhAB2bHWAw==} + dev: true - '@cspell/dict-elixir@4.0.3': {} + /@cspell/dict-elixir@4.0.3: + resolution: {integrity: sha512-g+uKLWvOp9IEZvrIvBPTr/oaO6619uH/wyqypqvwpmnmpjcfi8+/hqZH8YNKt15oviK8k4CkINIqNhyndG9d9Q==} + dev: true - '@cspell/dict-en-common-misspellings@2.0.0': {} + /@cspell/dict-en-common-misspellings@2.0.0: + resolution: {integrity: sha512-NOg8dlv37/YqLkCfBs5OXeJm/Wcfb/CzeOmOZJ2ZXRuxwsNuolb4TREUce0yAXRqMhawahY5TSDRJJBgKjBOdw==} + dev: true - '@cspell/dict-en-gb@1.1.33': {} + /@cspell/dict-en-gb@1.1.33: + resolution: {integrity: sha512-tKSSUf9BJEV+GJQAYGw5e+ouhEe2ZXE620S7BLKe3ZmpnjlNG9JqlnaBhkIMxKnNFkLY2BP/EARzw31AZnOv4g==} + dev: true - '@cspell/dict-en_us@4.3.19': {} + /@cspell/dict-en_us@4.3.19: + resolution: {integrity: sha512-tHcXdkmm0t9LlRct1vgu3+h0KW/wlXCInkTiR4D/rl730q1zu2qVEgiy1saMiTUSNmdu7Hiy+Mhb+1braVqnZQ==} + dev: true - '@cspell/dict-filetypes@3.0.3': {} + /@cspell/dict-filetypes@3.0.3: + resolution: {integrity: sha512-J9UP+qwwBLfOQ8Qg9tAsKtSY/WWmjj21uj6zXTI9hRLD1eG1uUOLcfVovAmtmVqUWziPSKMr87F6SXI3xmJXgw==} + dev: true - '@cspell/dict-fonts@4.0.0': {} + /@cspell/dict-fonts@4.0.0: + resolution: {integrity: sha512-t9V4GeN/m517UZn63kZPUYP3OQg5f0OBLSd3Md5CU3eH1IFogSvTzHHnz4Wqqbv8NNRiBZ3HfdY/pqREZ6br3Q==} + dev: true - '@cspell/dict-fsharp@1.0.1': {} + /@cspell/dict-fsharp@1.0.1: + resolution: {integrity: sha512-23xyPcD+j+NnqOjRHgW3IU7Li912SX9wmeefcY0QxukbAxJ/vAN4rBpjSwwYZeQPAn3fxdfdNZs03fg+UM+4yQ==} + dev: true - '@cspell/dict-fullstack@3.1.5': {} + /@cspell/dict-fullstack@3.1.5: + resolution: {integrity: sha512-6ppvo1dkXUZ3fbYn/wwzERxCa76RtDDl5Afzv2lijLoijGGUw5yYdLBKJnx8PJBGNLh829X352ftE7BElG4leA==} + dev: true - '@cspell/dict-gaming-terms@1.0.5': {} + /@cspell/dict-gaming-terms@1.0.5: + resolution: {integrity: sha512-C3riccZDD3d9caJQQs1+MPfrUrQ+0KHdlj9iUR1QD92FgTOF6UxoBpvHUUZ9YSezslcmpFQK4xQQ5FUGS7uWfw==} + dev: true - '@cspell/dict-git@3.0.0': {} + /@cspell/dict-git@3.0.0: + resolution: {integrity: sha512-simGS/lIiXbEaqJu9E2VPoYW1OTC2xrwPPXNXFMa2uo/50av56qOuaxDrZ5eH1LidFXwoc8HROCHYeKoNrDLSw==} + dev: true - '@cspell/dict-golang@6.0.5': {} + /@cspell/dict-golang@6.0.5: + resolution: {integrity: sha512-w4mEqGz4/wV+BBljLxduFNkMrd3rstBNDXmoX5kD4UTzIb4Sy0QybWCtg2iVT+R0KWiRRA56QKOvBsgXiddksA==} + dev: true - '@cspell/dict-haskell@4.0.1': {} + /@cspell/dict-haskell@4.0.1: + resolution: {integrity: sha512-uRrl65mGrOmwT7NxspB4xKXFUenNC7IikmpRZW8Uzqbqcu7ZRCUfstuVH7T1rmjRgRkjcIjE4PC11luDou4wEQ==} + dev: true - '@cspell/dict-html-symbol-entities@4.0.0': {} + /@cspell/dict-html-symbol-entities@4.0.0: + resolution: {integrity: sha512-HGRu+48ErJjoweR5IbcixxETRewrBb0uxQBd6xFGcxbEYCX8CnQFTAmKI5xNaIt2PKaZiJH3ijodGSqbKdsxhw==} + dev: true - '@cspell/dict-html@4.0.5': {} + /@cspell/dict-html@4.0.5: + resolution: {integrity: sha512-p0brEnRybzSSWi8sGbuVEf7jSTDmXPx7XhQUb5bgG6b54uj+Z0Qf0V2n8b/LWwIPJNd1GygaO9l8k3HTCy1h4w==} + dev: true - '@cspell/dict-java@5.0.6': {} + /@cspell/dict-java@5.0.6: + resolution: {integrity: sha512-kdE4AHHHrixyZ5p6zyms1SLoYpaJarPxrz8Tveo6gddszBVVwIUZ+JkQE1bWNLK740GWzIXdkznpUfw1hP9nXw==} + dev: true - '@cspell/dict-julia@1.0.1': {} + /@cspell/dict-julia@1.0.1: + resolution: {integrity: sha512-4JsCLCRhhLMLiaHpmR7zHFjj1qOauzDI5ZzCNQS31TUMfsOo26jAKDfo0jljFAKgw5M2fEG7sKr8IlPpQAYrmQ==} + dev: true - '@cspell/dict-k8s@1.0.2': {} + /@cspell/dict-k8s@1.0.2: + resolution: {integrity: sha512-tLT7gZpNPnGa+IIFvK9SP1LrSpPpJ94a/DulzAPOb1Q2UBFwdpFd82UWhio0RNShduvKG/WiMZf/wGl98pn+VQ==} + dev: true - '@cspell/dict-latex@4.0.0': {} + /@cspell/dict-latex@4.0.0: + resolution: {integrity: sha512-LPY4y6D5oI7D3d+5JMJHK/wxYTQa2lJMSNxps2JtuF8hbAnBQb3igoWEjEbIbRRH1XBM0X8dQqemnjQNCiAtxQ==} + dev: true - '@cspell/dict-lorem-ipsum@4.0.0': {} + /@cspell/dict-lorem-ipsum@4.0.0: + resolution: {integrity: sha512-1l3yjfNvMzZPibW8A7mQU4kTozwVZVw0AvFEdy+NcqtbxH+TvbSkNMqROOFWrkD2PjnKG0+Ea0tHI2Pi6Gchnw==} + dev: true - '@cspell/dict-lua@4.0.3': {} + /@cspell/dict-lua@4.0.3: + resolution: {integrity: sha512-lDHKjsrrbqPaea13+G9s0rtXjMO06gPXPYRjRYawbNmo4E/e3XFfVzeci3OQDQNDmf2cPOwt9Ef5lu2lDmwfJg==} + dev: true - '@cspell/dict-makefile@1.0.0': {} + /@cspell/dict-makefile@1.0.0: + resolution: {integrity: sha512-3W9tHPcSbJa6s0bcqWo6VisEDTSN5zOtDbnPabF7rbyjRpNo0uHXHRJQF8gAbFzoTzBBhgkTmrfSiuyQm7vBUQ==} + dev: true - '@cspell/dict-monkeyc@1.0.6': {} + /@cspell/dict-monkeyc@1.0.6: + resolution: {integrity: sha512-oO8ZDu/FtZ55aq9Mb67HtaCnsLn59xvhO/t2mLLTHAp667hJFxpp7bCtr2zOrR1NELzFXmKln/2lw/PvxMSvrA==} + dev: true - '@cspell/dict-node@4.0.3': {} + /@cspell/dict-node@4.0.3: + resolution: {integrity: sha512-sFlUNI5kOogy49KtPg8SMQYirDGIAoKBO3+cDLIwD4MLdsWy1q0upc7pzGht3mrjuyMiPRUV14Bb0rkVLrxOhg==} + dev: true - '@cspell/dict-npm@5.0.15': {} + /@cspell/dict-npm@5.0.15: + resolution: {integrity: sha512-sX0X5YWNW54F4baW7b5JJB6705OCBIZtUqjOghlJNORS5No7QY1IX1zc5FxNNu4gsaCZITAmfMi4ityXEsEThA==} + dev: true - '@cspell/dict-php@4.0.6': {} + /@cspell/dict-php@4.0.6: + resolution: {integrity: sha512-ySAXisf7twoVFZqBV2o/DKiCLIDTHNqfnj0EfH9OoOUR7HL3rb6zJkm0viLUFDO2G/8SyIi6YrN/6KX+Scjjjg==} + dev: true - '@cspell/dict-powershell@5.0.3': {} + /@cspell/dict-powershell@5.0.3: + resolution: {integrity: sha512-lEdzrcyau6mgzu1ie98GjOEegwVHvoaWtzQnm1ie4DyZgMr+N6D0Iyj1lzvtmt0snvsDFa5F2bsYzf3IMKcpcA==} + dev: true - '@cspell/dict-public-licenses@2.0.6': {} + /@cspell/dict-public-licenses@2.0.6: + resolution: {integrity: sha512-bHqpSpJvLCUcWxj1ov/Ki8WjmESpYwRpQlqfdchekOTc93Huhvjm/RXVN1R4fVf4Hspyem1QVkCGqAmjJMj6sw==} + dev: true - '@cspell/dict-python@4.1.11': + /@cspell/dict-python@4.1.11: + resolution: {integrity: sha512-XG+v3PumfzUW38huSbfT15Vqt3ihNb462ulfXifpQllPok5OWynhszCLCRQjQReV+dgz784ST4ggRxW452/kVg==} dependencies: '@cspell/dict-data-science': 1.0.11 + dev: true - '@cspell/dict-r@2.0.1': {} + /@cspell/dict-r@2.0.1: + resolution: {integrity: sha512-KCmKaeYMLm2Ip79mlYPc8p+B2uzwBp4KMkzeLd5E6jUlCL93Y5Nvq68wV5fRLDRTf7N1LvofkVFWfDcednFOgA==} + dev: true - '@cspell/dict-ruby@5.0.2': {} + /@cspell/dict-ruby@5.0.2: + resolution: {integrity: sha512-cIh8KTjpldzFzKGgrqUX4bFyav5lC52hXDKo4LbRuMVncs3zg4hcSf4HtURY+f2AfEZzN6ZKzXafQpThq3dl2g==} + dev: true - '@cspell/dict-rust@4.0.2': {} + /@cspell/dict-rust@4.0.2: + resolution: {integrity: sha512-RhziKDrklzOntxAbY3AvNR58wnFGIo3YS8+dNeLY36GFuWOvXDHFStYw5Pod4f/VXbO/+1tXtywCC4zWfB2p1w==} + dev: true - '@cspell/dict-scala@5.0.0': {} + /@cspell/dict-scala@5.0.0: + resolution: {integrity: sha512-ph0twaRoV+ylui022clEO1dZ35QbeEQaKTaV2sPOsdwIokABPIiK09oWwGK9qg7jRGQwVaRPEq0Vp+IG1GpqSQ==} + dev: true - '@cspell/dict-software-terms@3.3.20': {} + /@cspell/dict-software-terms@3.3.20: + resolution: {integrity: sha512-KmPwCxYWEu7SGyT/0m/n6i6R4ZgxbmN3XcerzA6Z629Wm5iZTVfJaMWqDK2RKAyBawS7OMfxGz0W/wYU4FhJlA==} + dev: true - '@cspell/dict-sql@2.1.3': {} + /@cspell/dict-sql@2.1.3: + resolution: {integrity: sha512-SEyTNKJrjqD6PAzZ9WpdSu6P7wgdNtGV2RV8Kpuw1x6bV+YsSptuClYG+JSdRExBTE6LwIe1bTklejUp3ZP8TQ==} + dev: true - '@cspell/dict-svelte@1.0.2': {} + /@cspell/dict-svelte@1.0.2: + resolution: {integrity: sha512-rPJmnn/GsDs0btNvrRBciOhngKV98yZ9SHmg8qI6HLS8hZKvcXc0LMsf9LLuMK1TmS2+WQFAan6qeqg6bBxL2Q==} + dev: true - '@cspell/dict-swift@2.0.1': {} + /@cspell/dict-swift@2.0.1: + resolution: {integrity: sha512-gxrCMUOndOk7xZFmXNtkCEeroZRnS2VbeaIPiymGRHj5H+qfTAzAKxtv7jJbVA3YYvEzWcVE2oKDP4wcbhIERw==} + dev: true - '@cspell/dict-terraform@1.0.0': {} + /@cspell/dict-terraform@1.0.0: + resolution: {integrity: sha512-Ak+vy4HP/bOgzf06BAMC30+ZvL9mzv21xLM2XtfnBLTDJGdxlk/nK0U6QT8VfFLqJ0ZZSpyOxGsUebWDCTr/zQ==} + dev: true - '@cspell/dict-typescript@3.1.4': {} + /@cspell/dict-typescript@3.1.4: + resolution: {integrity: sha512-jUcPa0rsPca5ur1+G56DXnSc5hbbJkzvPHHvyQtkbPXBQd3CXPMNfrTVCgzex/7cY/7FONcpFCUwgwfni9Jqbw==} + dev: true - '@cspell/dict-vue@3.0.0': {} + /@cspell/dict-vue@3.0.0: + resolution: {integrity: sha512-niiEMPWPV9IeRBRzZ0TBZmNnkK3olkOPYxC1Ny2AX4TGlYRajcW0WUtoSHmvvjZNfWLSg2L6ruiBeuPSbjnG6A==} + dev: true - '@cspell/dynamic-import@8.7.0': + /@cspell/dynamic-import@8.7.0: + resolution: {integrity: sha512-xlEPdiHVDu+4xYkvwjL9MgklxOi9XB+Pr1H9s3Ww9WEq+q6BA3xOHxLIU/k8mhqFTMZGFZRCsdy/EwMu6SyRhQ==} + engines: {node: '>=18.0'} dependencies: import-meta-resolve: 4.1.0 + dev: true - '@cspell/strong-weak-map@8.7.0': {} + /@cspell/strong-weak-map@8.7.0: + resolution: {integrity: sha512-0bo0WwDr2lzGoCP7vbpWbDpPyuOrHKK+218txnUpx6Pn1EDBLfcDQsiZED5B6zlpwgbGi6y3vc0rWtJbjKvwzg==} + engines: {node: '>=18'} + dev: true - '@double-great/alt-text@3.1.0': + /@double-great/alt-text@3.1.0: + resolution: {integrity: sha512-5gSW9AI0KUO2GQe9K+KjyiCisxl4xL0kesQCxUsko4T9s8zler/stW0qcH5XryUgtKebb293qX9sz1nCmQpdTw==} dependencies: emoji-regex: 10.3.0 github-slugger: 1.5.0 tinyurl: 1.1.7 + dev: true - '@double-great/remark-lint-alt-text@1.0.0': + /@double-great/remark-lint-alt-text@1.0.0: + resolution: {integrity: sha512-2FFjSX2VhT/USmsOEkcw40SiCHXXio2sWs4S7docKNFh+W7/z+bHYau+UHfrP4yDRVzfUVSV1MKnsxmigkhixg==} dependencies: '@double-great/alt-text': 3.1.0 unified-lint-rule: 2.1.2 unist-util-visit-parents: 5.1.3 + dev: true - '@eslint-community/eslint-utils@4.4.0(eslint@8.57.0)': + /@eslint-community/eslint-utils@4.4.0(eslint@8.57.0): + resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 dependencies: eslint: 8.57.0 eslint-visitor-keys: 3.4.3 + dev: true - '@eslint-community/regexpp@4.10.0': {} + /@eslint-community/regexpp@4.10.0: + resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + dev: true - '@eslint/eslintrc@2.1.4': + /@eslint/eslintrc@2.1.4: + resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: ajv: 6.12.6 debug: 4.3.4 @@ -3996,26 +651,45 @@ snapshots: strip-json-comments: 3.1.1 transitivePeerDependencies: - supports-color + dev: true - '@eslint/js@8.57.0': {} + /@eslint/js@8.57.0: + resolution: {integrity: sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true - '@eth-optimism/contracts-bedrock@0.17.2': {} + /@eth-optimism/contracts-bedrock@0.17.2: + resolution: {integrity: sha512-YVwPHpBZgFwFX9qY8+iToVAAH7mSnVIVmih+YfHhqjAhlLvLZfYjvj+hRNgcB9eRyl1SOOB0jevp4JOOV1v2BA==} + dev: true - '@eth-optimism/contracts-ts@0.17.2(typescript@5.4.5)(zod@3.23.8)': + /@eth-optimism/contracts-ts@0.17.2(typescript@5.4.5): + resolution: {integrity: sha512-5aM+pn1uK8Hx9r9+PHCF6NQTYKVHmrm7Gc7LQ6sO9MQItVP1WdIWNcQYT7TQhkxGKHYG2arF06rbHGeGNqzBeg==} + peerDependencies: + '@wagmi/core': ^2.6.3 + wagmi: ^2.5.5 + peerDependenciesMeta: + '@wagmi/core': + optional: true + wagmi: + optional: true dependencies: - '@testing-library/react': 14.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@testing-library/react': 14.3.1(react-dom@18.3.1)(react@18.3.1) '@types/change-case': 2.3.1 change-case: 4.1.2 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - viem: 2.9.28(typescript@5.4.5)(zod@3.23.8) + viem: 2.9.28(typescript@5.4.5) transitivePeerDependencies: - bufferutil - typescript - utf-8-validate - zod + dev: false - '@eth-optimism/contracts@0.6.0(ethers@5.7.2)': + /@eth-optimism/contracts@0.6.0(ethers@5.7.2): + resolution: {integrity: sha512-vQ04wfG9kMf1Fwy3FEMqH2QZbgS0gldKhcBeBUPfO8zu68L61VI97UDXmsMQXzTsEAxK8HnokW3/gosl4/NW3w==} + peerDependencies: + ethers: ^5 dependencies: '@eth-optimism/core-utils': 0.12.0 '@ethersproject/abstract-provider': 5.7.0 @@ -4024,8 +698,10 @@ snapshots: transitivePeerDependencies: - bufferutil - utf-8-validate + dev: true - '@eth-optimism/core-utils@0.12.0': + /@eth-optimism/core-utils@0.12.0: + resolution: {integrity: sha512-qW+7LZYCz7i8dRa7SRlUKIo1VBU8lvN0HeXCxJR+z+xtMzMQpPds20XJNCMclszxYQHkXY00fOT6GvFw9ZL6nw==} dependencies: '@ethersproject/abi': 5.7.0 '@ethersproject/abstract-provider': 5.7.0 @@ -4046,8 +722,10 @@ snapshots: transitivePeerDependencies: - bufferutil - utf-8-validate + dev: true - '@eth-optimism/core-utils@0.13.2': + /@eth-optimism/core-utils@0.13.2: + resolution: {integrity: sha512-u7TOKm1RxH1V5zw7dHmfy91bOuEAZU68LT/9vJPkuWEjaTl+BgvPDRDTurjzclHzN0GbWdcpOqPZg4ftjkJGaw==} dependencies: '@ethersproject/abi': 5.7.0 '@ethersproject/abstract-provider': 5.7.0 @@ -4067,8 +745,12 @@ snapshots: - bufferutil - encoding - utf-8-validate + dev: true - '@eth-optimism/sdk@3.3.0(ethers@5.7.2)': + /@eth-optimism/sdk@3.3.0(ethers@5.7.2): + resolution: {integrity: sha512-0Wt9roWe3itdzp08caCQLoFqhmT47ssquKAzBe7yXI6saVL+f2vWl6VgEaq0aYe2FsWvD9L0tSAJHLx1FiquNw==} + peerDependencies: + ethers: ^5 dependencies: '@eth-optimism/contracts': 0.6.0(ethers@5.7.2) '@eth-optimism/contracts-bedrock': 0.17.2 @@ -4082,18 +764,29 @@ snapshots: - bufferutil - encoding - utf-8-validate + dev: true - '@eth-optimism/tokenlist@9.0.51': {} + /@eth-optimism/tokenlist@9.0.51: + resolution: {integrity: sha512-GfKk4euEfNLniyRisP7sB/N9Kp96M+2t529mkvwC6nXITouzH4faDP8JdtwU6AOcgC4UlrFjXJ9w8ecnWWNQbw==} + dev: false - '@ethereumjs/rlp@4.0.1': {} + /@ethereumjs/rlp@4.0.1: + resolution: {integrity: sha512-tqsQiBQDQdmPWE1xkkBq4rlSW5QZpLOUJ5RJh2/9fug+q9tnUhuZoVLk7s0scUIKTOzEtR72DFBXI4WiZcMpvw==} + engines: {node: '>=14'} + hasBin: true + dev: true - '@ethereumjs/util@8.1.0': + /@ethereumjs/util@8.1.0: + resolution: {integrity: sha512-zQ0IqbdX8FZ9aw11vP+dZkKDkS+kgIvQPHnSAXzP9pLu+Rfu3D3XEeLbicvoXJTYnhZiPmsZUxgdzXwNKxRPbA==} + engines: {node: '>=14'} dependencies: '@ethereumjs/rlp': 4.0.1 ethereum-cryptography: 2.1.3 micro-ftch: 0.3.1 + dev: true - '@ethersproject/abi@5.7.0': + /@ethersproject/abi@5.7.0: + resolution: {integrity: sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA==} dependencies: '@ethersproject/address': 5.7.0 '@ethersproject/bignumber': 5.7.0 @@ -4104,8 +797,10 @@ snapshots: '@ethersproject/logger': 5.7.0 '@ethersproject/properties': 5.7.0 '@ethersproject/strings': 5.7.0 + dev: true - '@ethersproject/abstract-provider@5.7.0': + /@ethersproject/abstract-provider@5.7.0: + resolution: {integrity: sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw==} dependencies: '@ethersproject/bignumber': 5.7.0 '@ethersproject/bytes': 5.7.0 @@ -4114,47 +809,63 @@ snapshots: '@ethersproject/properties': 5.7.0 '@ethersproject/transactions': 5.7.0 '@ethersproject/web': 5.7.1 + dev: true - '@ethersproject/abstract-signer@5.7.0': + /@ethersproject/abstract-signer@5.7.0: + resolution: {integrity: sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ==} dependencies: '@ethersproject/abstract-provider': 5.7.0 '@ethersproject/bignumber': 5.7.0 '@ethersproject/bytes': 5.7.0 '@ethersproject/logger': 5.7.0 '@ethersproject/properties': 5.7.0 + dev: true - '@ethersproject/address@5.7.0': + /@ethersproject/address@5.7.0: + resolution: {integrity: sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==} dependencies: '@ethersproject/bignumber': 5.7.0 '@ethersproject/bytes': 5.7.0 '@ethersproject/keccak256': 5.7.0 '@ethersproject/logger': 5.7.0 '@ethersproject/rlp': 5.7.0 + dev: true - '@ethersproject/base64@5.7.0': + /@ethersproject/base64@5.7.0: + resolution: {integrity: sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ==} dependencies: '@ethersproject/bytes': 5.7.0 + dev: true - '@ethersproject/basex@5.7.0': + /@ethersproject/basex@5.7.0: + resolution: {integrity: sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw==} dependencies: '@ethersproject/bytes': 5.7.0 '@ethersproject/properties': 5.7.0 + dev: true - '@ethersproject/bignumber@5.7.0': + /@ethersproject/bignumber@5.7.0: + resolution: {integrity: sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw==} dependencies: '@ethersproject/bytes': 5.7.0 '@ethersproject/logger': 5.7.0 bn.js: 5.2.1 + dev: true - '@ethersproject/bytes@5.7.0': + /@ethersproject/bytes@5.7.0: + resolution: {integrity: sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A==} dependencies: '@ethersproject/logger': 5.7.0 + dev: true - '@ethersproject/constants@5.7.0': + /@ethersproject/constants@5.7.0: + resolution: {integrity: sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA==} dependencies: '@ethersproject/bignumber': 5.7.0 + dev: true - '@ethersproject/contracts@5.7.0': + /@ethersproject/contracts@5.7.0: + resolution: {integrity: sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg==} dependencies: '@ethersproject/abi': 5.7.0 '@ethersproject/abstract-provider': 5.7.0 @@ -4166,8 +877,10 @@ snapshots: '@ethersproject/logger': 5.7.0 '@ethersproject/properties': 5.7.0 '@ethersproject/transactions': 5.7.0 + dev: true - '@ethersproject/hash@5.7.0': + /@ethersproject/hash@5.7.0: + resolution: {integrity: sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g==} dependencies: '@ethersproject/abstract-signer': 5.7.0 '@ethersproject/address': 5.7.0 @@ -4178,8 +891,10 @@ snapshots: '@ethersproject/logger': 5.7.0 '@ethersproject/properties': 5.7.0 '@ethersproject/strings': 5.7.0 + dev: true - '@ethersproject/hdnode@5.7.0': + /@ethersproject/hdnode@5.7.0: + resolution: {integrity: sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg==} dependencies: '@ethersproject/abstract-signer': 5.7.0 '@ethersproject/basex': 5.7.0 @@ -4193,8 +908,10 @@ snapshots: '@ethersproject/strings': 5.7.0 '@ethersproject/transactions': 5.7.0 '@ethersproject/wordlists': 5.7.0 + dev: true - '@ethersproject/json-wallets@5.7.0': + /@ethersproject/json-wallets@5.7.0: + resolution: {integrity: sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g==} dependencies: '@ethersproject/abstract-signer': 5.7.0 '@ethersproject/address': 5.7.0 @@ -4209,28 +926,40 @@ snapshots: '@ethersproject/transactions': 5.7.0 aes-js: 3.0.0 scrypt-js: 3.0.1 + dev: true - '@ethersproject/keccak256@5.7.0': + /@ethersproject/keccak256@5.7.0: + resolution: {integrity: sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg==} dependencies: '@ethersproject/bytes': 5.7.0 js-sha3: 0.8.0 + dev: true - '@ethersproject/logger@5.7.0': {} + /@ethersproject/logger@5.7.0: + resolution: {integrity: sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig==} + dev: true - '@ethersproject/networks@5.7.1': + /@ethersproject/networks@5.7.1: + resolution: {integrity: sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ==} dependencies: '@ethersproject/logger': 5.7.0 + dev: true - '@ethersproject/pbkdf2@5.7.0': + /@ethersproject/pbkdf2@5.7.0: + resolution: {integrity: sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw==} dependencies: '@ethersproject/bytes': 5.7.0 '@ethersproject/sha2': 5.7.0 + dev: true - '@ethersproject/properties@5.7.0': + /@ethersproject/properties@5.7.0: + resolution: {integrity: sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw==} dependencies: '@ethersproject/logger': 5.7.0 + dev: true - '@ethersproject/providers@5.7.2': + /@ethersproject/providers@5.7.2: + resolution: {integrity: sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg==} dependencies: '@ethersproject/abstract-provider': 5.7.0 '@ethersproject/abstract-signer': 5.7.0 @@ -4255,24 +984,32 @@ snapshots: transitivePeerDependencies: - bufferutil - utf-8-validate + dev: true - '@ethersproject/random@5.7.0': + /@ethersproject/random@5.7.0: + resolution: {integrity: sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ==} dependencies: '@ethersproject/bytes': 5.7.0 '@ethersproject/logger': 5.7.0 + dev: true - '@ethersproject/rlp@5.7.0': + /@ethersproject/rlp@5.7.0: + resolution: {integrity: sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w==} dependencies: '@ethersproject/bytes': 5.7.0 '@ethersproject/logger': 5.7.0 + dev: true - '@ethersproject/sha2@5.7.0': + /@ethersproject/sha2@5.7.0: + resolution: {integrity: sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw==} dependencies: '@ethersproject/bytes': 5.7.0 '@ethersproject/logger': 5.7.0 hash.js: 1.1.7 + dev: true - '@ethersproject/signing-key@5.7.0': + /@ethersproject/signing-key@5.7.0: + resolution: {integrity: sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q==} dependencies: '@ethersproject/bytes': 5.7.0 '@ethersproject/logger': 5.7.0 @@ -4280,8 +1017,10 @@ snapshots: bn.js: 5.2.1 elliptic: 6.5.4 hash.js: 1.1.7 + dev: true - '@ethersproject/solidity@5.7.0': + /@ethersproject/solidity@5.7.0: + resolution: {integrity: sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA==} dependencies: '@ethersproject/bignumber': 5.7.0 '@ethersproject/bytes': 5.7.0 @@ -4289,14 +1028,18 @@ snapshots: '@ethersproject/logger': 5.7.0 '@ethersproject/sha2': 5.7.0 '@ethersproject/strings': 5.7.0 + dev: true - '@ethersproject/strings@5.7.0': + /@ethersproject/strings@5.7.0: + resolution: {integrity: sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg==} dependencies: '@ethersproject/bytes': 5.7.0 '@ethersproject/constants': 5.7.0 '@ethersproject/logger': 5.7.0 + dev: true - '@ethersproject/transactions@5.7.0': + /@ethersproject/transactions@5.7.0: + resolution: {integrity: sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ==} dependencies: '@ethersproject/address': 5.7.0 '@ethersproject/bignumber': 5.7.0 @@ -4307,14 +1050,18 @@ snapshots: '@ethersproject/properties': 5.7.0 '@ethersproject/rlp': 5.7.0 '@ethersproject/signing-key': 5.7.0 + dev: true - '@ethersproject/units@5.7.0': + /@ethersproject/units@5.7.0: + resolution: {integrity: sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg==} dependencies: '@ethersproject/bignumber': 5.7.0 '@ethersproject/constants': 5.7.0 '@ethersproject/logger': 5.7.0 + dev: true - '@ethersproject/wallet@5.7.0': + /@ethersproject/wallet@5.7.0: + resolution: {integrity: sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA==} dependencies: '@ethersproject/abstract-provider': 5.7.0 '@ethersproject/abstract-signer': 5.7.0 @@ -4331,95 +1078,149 @@ snapshots: '@ethersproject/signing-key': 5.7.0 '@ethersproject/transactions': 5.7.0 '@ethersproject/wordlists': 5.7.0 + dev: true - '@ethersproject/web@5.7.1': + /@ethersproject/web@5.7.1: + resolution: {integrity: sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w==} dependencies: '@ethersproject/base64': 5.7.0 '@ethersproject/bytes': 5.7.0 '@ethersproject/logger': 5.7.0 '@ethersproject/properties': 5.7.0 '@ethersproject/strings': 5.7.0 + dev: true - '@ethersproject/wordlists@5.7.0': + /@ethersproject/wordlists@5.7.0: + resolution: {integrity: sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA==} dependencies: '@ethersproject/bytes': 5.7.0 '@ethersproject/hash': 5.7.0 '@ethersproject/logger': 5.7.0 '@ethersproject/properties': 5.7.0 '@ethersproject/strings': 5.7.0 + dev: true - '@feelback/js@0.3.4': {} + /@feelback/js@0.3.4: + resolution: {integrity: sha512-xr7gTqSJcVUYQlELs1TntYovCBjMcYUr/hGKTnDoF64/lig5CbX4bOmqLoF50IImCy5q3oIwg9w+TSFvtBwsIA==} + dev: false - '@feelback/react@0.3.4(react@18.3.1)': + /@feelback/react@0.3.4(react@18.3.1): + resolution: {integrity: sha512-ZWzUQAmPwl4nYR2olzBKddHzoLtGW/2pb8TiesiJCirxhaDW2E/XBx2ZaB4fL5TGXtjBt4eYq/qZxJZ0fIE0kg==} + engines: {node: '>=14'} + peerDependencies: + react: '>=17' dependencies: '@feelback/js': 0.3.4 react: 18.3.1 + dev: false - '@floating-ui/core@1.6.8': + /@floating-ui/core@1.6.2: + resolution: {integrity: sha512-+2XpQV9LLZeanU4ZevzRnGFg2neDeKHgFLjP6YLW+tly0IvrhqT4u8enLGjLH3qeh85g19xY5rsAusfwTdn5lg==} dependencies: - '@floating-ui/utils': 0.2.8 + '@floating-ui/utils': 0.2.2 + dev: false - '@floating-ui/dom@1.6.11': + /@floating-ui/dom@1.6.5: + resolution: {integrity: sha512-Nsdud2X65Dz+1RHjAIP0t8z5e2ff/IRbei6BqFrl1urT8sDVzM1HMQ+R0XcU5ceRfyO3I6ayeqIfh+6Wb8LGTw==} dependencies: - '@floating-ui/core': 1.6.8 - '@floating-ui/utils': 0.2.8 + '@floating-ui/core': 1.6.2 + '@floating-ui/utils': 0.2.2 + dev: false - '@floating-ui/react-dom@2.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + /@floating-ui/react-dom@2.1.0(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-lNzj5EQmEKn5FFKc04+zasr09h/uX8RtJRNj5gUXsSQIXHVWTVh+hVAg1vOMCexkX8EgvemMvIFpQfkosnVNyA==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' dependencies: - '@floating-ui/dom': 1.6.11 + '@floating-ui/dom': 1.6.5 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) + dev: false - '@floating-ui/react@0.26.24(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + /@floating-ui/react@0.26.17(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-ESD+jYWwqwVzaIgIhExrArdsCL1rOAzryG/Sjlu8yaD3Mtqi3uVyhbE2V7jD58Mo52qbzKz2eUY/Xgh5I86FCQ==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' dependencies: - '@floating-ui/react-dom': 2.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@floating-ui/utils': 0.2.8 + '@floating-ui/react-dom': 2.1.0(react-dom@18.3.1)(react@18.3.1) + '@floating-ui/utils': 0.2.2 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) tabbable: 6.2.0 + dev: false - '@floating-ui/utils@0.2.8': {} + /@floating-ui/utils@0.2.2: + resolution: {integrity: sha512-J4yDIIthosAsRZ5CPYP/jQvUAQtlZTTD/4suA08/FEnlxqW3sKS9iAhgsa9VYLZ6vDHn/ixJgIqRQPotoBjxIw==} + dev: false - '@headlessui/react@1.7.19(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + /@headlessui/react@1.7.19(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-Ll+8q3OlMJfJbAKM/+/Y2q6PPYbryqNTXDbryx7SXLIDamkF6iQFbriYHga0dY44PvDhvvBWCx1Xj4U5+G4hOw==} + engines: {node: '>=10'} + peerDependencies: + react: ^16 || ^17 || ^18 + react-dom: ^16 || ^17 || ^18 dependencies: - '@tanstack/react-virtual': 3.5.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@tanstack/react-virtual': 3.5.0(react-dom@18.3.1)(react@18.3.1) client-only: 0.0.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) + dev: false - '@headlessui/react@2.1.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + /@headlessui/react@2.1.10(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-6mLa2fjMDAFQi+/R10B+zU3edsUk/MDtENB2zHho0lqKU1uzhAfJLUduWds4nCo8wbl3vULtC5rJfZAQ1yqIng==} + engines: {node: '>=10'} + peerDependencies: + react: ^18 + react-dom: ^18 dependencies: - '@floating-ui/react': 0.26.24(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@react-aria/focus': 3.18.2(react@18.3.1) - '@react-aria/interactions': 3.22.2(react@18.3.1) - '@tanstack/react-virtual': 3.10.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@floating-ui/react': 0.26.17(react-dom@18.3.1)(react@18.3.1) + '@react-aria/focus': 3.17.1(react@18.3.1) + '@react-aria/interactions': 3.21.3(react@18.3.1) + '@tanstack/react-virtual': 3.10.8(react-dom@18.3.1)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) + dev: false - '@humanwhocodes/config-array@0.11.14': + /@humanwhocodes/config-array@0.11.14: + resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} + engines: {node: '>=10.10.0'} dependencies: '@humanwhocodes/object-schema': 2.0.3 debug: 4.3.4 minimatch: 3.1.2 transitivePeerDependencies: - supports-color + dev: true - '@humanwhocodes/module-importer@1.0.1': {} + /@humanwhocodes/module-importer@1.0.1: + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + dev: true - '@humanwhocodes/object-schema@2.0.3': {} + /@humanwhocodes/object-schema@2.0.3: + resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} + dev: true - '@isaacs/cliui@8.0.2': + /@isaacs/cliui@8.0.2: + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} dependencies: string-width: 5.1.2 - string-width-cjs: string-width@4.2.3 + string-width-cjs: /string-width@4.2.3 strip-ansi: 7.1.0 - strip-ansi-cjs: strip-ansi@6.0.1 + strip-ansi-cjs: /strip-ansi@6.0.1 wrap-ansi: 8.1.0 - wrap-ansi-cjs: wrap-ansi@7.0.0 + wrap-ansi-cjs: /wrap-ansi@7.0.0 + dev: true - '@jsdevtools/ono@7.1.3': {} + /@jsdevtools/ono@7.1.3: + resolution: {integrity: sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==} + dev: true - '@mdx-js/mdx@2.3.0': + /@mdx-js/mdx@2.3.0: + resolution: {integrity: sha512-jLuwRlz8DQfQNiUCJR50Y09CGPq3fLtmtUQfVrj79E0JWu3dvsVcxVIcfhR5h0iXu+/z++zDrYeiJqifRynJkA==} dependencies: '@types/estree-jsx': 1.0.5 '@types/mdx': 2.0.13 @@ -4440,47 +1241,120 @@ snapshots: vfile: 5.3.7 transitivePeerDependencies: - supports-color + dev: false - '@mdx-js/react@2.3.0(react@18.3.1)': + /@mdx-js/react@2.3.0(react@18.3.1): + resolution: {integrity: sha512-zQH//gdOmuu7nt2oJR29vFhDv88oGPmVw6BggmrHeMI+xgEkp1B2dX9/bMBSYtK0dyLX/aOmesKS09g222K1/g==} + peerDependencies: + react: '>=16' dependencies: '@types/mdx': 2.0.13 '@types/react': 18.3.1 react: 18.3.1 + dev: false - '@napi-rs/simple-git-android-arm-eabi@0.1.16': + /@napi-rs/simple-git-android-arm-eabi@0.1.16: + resolution: {integrity: sha512-dbrCL0Pl5KZG7x7tXdtVsA5CO6At5ohDX3myf5xIYn9kN4jDFxsocl8bNt6Vb/hZQoJd8fI+k5VlJt+rFhbdVw==} + engines: {node: '>= 10'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: false optional: true - '@napi-rs/simple-git-android-arm64@0.1.16': + /@napi-rs/simple-git-android-arm64@0.1.16: + resolution: {integrity: sha512-xYz+TW5J09iK8SuTAKK2D5MMIsBUXVSs8nYp7HcMi8q6FCRO7yJj96YfP9PvKsc/k64hOyqGmL5DhCzY9Cu1FQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: false optional: true - '@napi-rs/simple-git-darwin-arm64@0.1.16': + /@napi-rs/simple-git-darwin-arm64@0.1.16: + resolution: {integrity: sha512-XfgsYqxhUE022MJobeiX563TJqyQyX4FmYCnqrtJwAfivESVeAJiH6bQIum8dDEYMHXCsG7nL8Ok0Dp8k2m42g==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false optional: true - '@napi-rs/simple-git-darwin-x64@0.1.16': + /@napi-rs/simple-git-darwin-x64@0.1.16: + resolution: {integrity: sha512-tkEVBhD6vgRCbeWsaAQqM3bTfpIVGeitamPPRVSbsq8qgzJ5Dx6ZedH27R7KSsA/uao7mZ3dsrNLXbu1Wy5MzA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false optional: true - '@napi-rs/simple-git-linux-arm-gnueabihf@0.1.16': + /@napi-rs/simple-git-linux-arm-gnueabihf@0.1.16: + resolution: {integrity: sha512-R6VAyNnp/yRaT7DV1Ao3r67SqTWDa+fNq2LrNy0Z8gXk2wB9ZKlrxFtLPE1WSpWknWtyRDLpRlsorh7Evk7+7w==} + engines: {node: '>= 10'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: false optional: true - '@napi-rs/simple-git-linux-arm64-gnu@0.1.16': + /@napi-rs/simple-git-linux-arm64-gnu@0.1.16: + resolution: {integrity: sha512-LAGI0opFKw/HBMCV2qIBK3uWSEW9h4xd2ireZKLJy8DBPymX6NrWIamuxYNyCuACnFdPRxR4LaRFy4J5ZwuMdw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false optional: true - '@napi-rs/simple-git-linux-arm64-musl@0.1.16': + /@napi-rs/simple-git-linux-arm64-musl@0.1.16: + resolution: {integrity: sha512-I57Ph0F0Yn2KW93ep+V1EzKhACqX0x49vvSiapqIsdDA2PifdEWLc1LJarBolmK7NKoPqKmf6lAKKO9lhiZzkg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false optional: true - '@napi-rs/simple-git-linux-x64-gnu@0.1.16': + /@napi-rs/simple-git-linux-x64-gnu@0.1.16: + resolution: {integrity: sha512-AZYYFY2V7hlcQASPEOWyOa3e1skzTct9QPzz0LiDM3f/hCFY/wBaU2M6NC5iG3d2Kr38heuyFS/+JqxLm5WaKA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false optional: true - '@napi-rs/simple-git-linux-x64-musl@0.1.16': + /@napi-rs/simple-git-linux-x64-musl@0.1.16: + resolution: {integrity: sha512-9TyMcYSBJwjT8jwjY9m24BZbu7ozyWTjsmYBYNtK3B0Um1Ov6jthSNneLVvouQ6x+k3Ow+00TiFh6bvmT00r8g==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false optional: true - '@napi-rs/simple-git-win32-arm64-msvc@0.1.16': + /@napi-rs/simple-git-win32-arm64-msvc@0.1.16: + resolution: {integrity: sha512-uslJ1WuAHCYJWui6xjsyT47SjX6KOHDtClmNO8hqKz1pmDSNY7AjyUY8HxvD1lK9bDnWwc4JYhikS9cxCqHybw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: false optional: true - '@napi-rs/simple-git-win32-x64-msvc@0.1.16': + /@napi-rs/simple-git-win32-x64-msvc@0.1.16: + resolution: {integrity: sha512-SoEaVeCZCDF1MP+M9bMSXsZWgEjk4On9GWADO5JOulvzR1bKjk0s9PMHwe/YztR9F0sJzrCxwtvBZowhSJsQPg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false optional: true - '@napi-rs/simple-git@0.1.16': + /@napi-rs/simple-git@0.1.16: + resolution: {integrity: sha512-C5wRPw9waqL2jk3jEDeJv+f7ScuO3N0a39HVdyFLkwKxHH4Sya4ZbzZsu2JLi6eEqe7RuHipHL6mC7B2OfYZZw==} + engines: {node: '>= 10'} optionalDependencies: '@napi-rs/simple-git-android-arm-eabi': 0.1.16 '@napi-rs/simple-git-android-arm64': 0.1.16 @@ -4493,65 +1367,145 @@ snapshots: '@napi-rs/simple-git-linux-x64-musl': 0.1.16 '@napi-rs/simple-git-win32-arm64-msvc': 0.1.16 '@napi-rs/simple-git-win32-x64-msvc': 0.1.16 + dev: false - '@next/env@13.5.6': {} + /@next/env@13.5.6: + resolution: {integrity: sha512-Yac/bV5sBGkkEXmAX5FWPS9Mmo2rthrOPRQQNfycJPkjUAUclomCPH7QFVCDQ4Mp2k2K1SSM6m0zrxYrOwtFQw==} + dev: false - '@next/env@14.2.10': {} + /@next/env@14.2.10: + resolution: {integrity: sha512-dZIu93Bf5LUtluBXIv4woQw2cZVZ2DJTjax5/5DOs3lzEOeKLy7GxRSr4caK9/SCPdaW6bCgpye6+n4Dh9oJPw==} + dev: false - '@next/swc-darwin-arm64@14.2.10': + /@next/swc-darwin-arm64@14.2.10: + resolution: {integrity: sha512-V3z10NV+cvMAfxQUMhKgfQnPbjw+Ew3cnr64b0lr8MDiBJs3eLnM6RpGC46nhfMZsiXgQngCJKWGTC/yDcgrDQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false optional: true - '@next/swc-darwin-x64@14.2.10': + /@next/swc-darwin-x64@14.2.10: + resolution: {integrity: sha512-Y0TC+FXbFUQ2MQgimJ/7Ina2mXIKhE7F+GUe1SgnzRmwFY3hX2z8nyVCxE82I2RicspdkZnSWMn4oTjIKz4uzA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false optional: true - '@next/swc-linux-arm64-gnu@14.2.10': + /@next/swc-linux-arm64-gnu@14.2.10: + resolution: {integrity: sha512-ZfQ7yOy5zyskSj9rFpa0Yd7gkrBnJTkYVSya95hX3zeBG9E55Z6OTNPn1j2BTFWvOVVj65C3T+qsjOyVI9DQpA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false optional: true - '@next/swc-linux-arm64-musl@14.2.10': + /@next/swc-linux-arm64-musl@14.2.10: + resolution: {integrity: sha512-n2i5o3y2jpBfXFRxDREr342BGIQCJbdAUi/K4q6Env3aSx8erM9VuKXHw5KNROK9ejFSPf0LhoSkU/ZiNdacpQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false optional: true - '@next/swc-linux-x64-gnu@14.2.10': + /@next/swc-linux-x64-gnu@14.2.10: + resolution: {integrity: sha512-GXvajAWh2woTT0GKEDlkVhFNxhJS/XdDmrVHrPOA83pLzlGPQnixqxD8u3bBB9oATBKB//5e4vpACnx5Vaxdqg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false optional: true - '@next/swc-linux-x64-musl@14.2.10': + /@next/swc-linux-x64-musl@14.2.10: + resolution: {integrity: sha512-opFFN5B0SnO+HTz4Wq4HaylXGFV+iHrVxd3YvREUX9K+xfc4ePbRrxqOuPOFjtSuiVouwe6uLeDtabjEIbkmDA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false optional: true - '@next/swc-win32-arm64-msvc@14.2.10': + /@next/swc-win32-arm64-msvc@14.2.10: + resolution: {integrity: sha512-9NUzZuR8WiXTvv+EiU/MXdcQ1XUvFixbLIMNQiVHuzs7ZIFrJDLJDaOF1KaqttoTujpcxljM/RNAOmw1GhPPQQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: false optional: true - '@next/swc-win32-ia32-msvc@14.2.10': + /@next/swc-win32-ia32-msvc@14.2.10: + resolution: {integrity: sha512-fr3aEbSd1GeW3YUMBkWAu4hcdjZ6g4NBl1uku4gAn661tcxd1bHs1THWYzdsbTRLcCKLjrDZlNp6j2HTfrw+Bg==} + engines: {node: '>= 10'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: false optional: true - '@next/swc-win32-x64-msvc@14.2.10': + /@next/swc-win32-x64-msvc@14.2.10: + resolution: {integrity: sha512-UjeVoRGKNL2zfbcQ6fscmgjBAS/inHBh63mjIlfPg/NG8Yn2ztqylXt5qilYb6hoHIwaU2ogHknHWWmahJjgZQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false optional: true - '@noble/curves@1.2.0': + /@noble/curves@1.2.0: + resolution: {integrity: sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==} dependencies: '@noble/hashes': 1.3.2 + dev: false - '@noble/curves@1.3.0': + /@noble/curves@1.3.0: + resolution: {integrity: sha512-t01iSXPuN+Eqzb4eBX0S5oubSqXbK/xXa1Ne18Hj8f9pStxztHCE2gfboSp/dZRLSqfuLpRK2nDXDK+W9puocA==} dependencies: '@noble/hashes': 1.3.3 + dev: true - '@noble/hashes@1.3.2': {} + /@noble/hashes@1.3.2: + resolution: {integrity: sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==} + engines: {node: '>= 16'} + dev: false - '@noble/hashes@1.3.3': {} + /@noble/hashes@1.3.3: + resolution: {integrity: sha512-V7/fPHgl+jsVPXqqeOzT8egNj2iBIVt+ECeMMG8TdcnTikP3oaBtUVqpT/gYCR68aEBJSF+XbYUxStjbFMqIIA==} + engines: {node: '>= 16'} + dev: true - '@noble/hashes@1.4.0': {} + /@noble/hashes@1.4.0: + resolution: {integrity: sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==} + engines: {node: '>= 16'} + dev: true - '@nodelib/fs.scandir@2.1.5': + /@nodelib/fs.scandir@2.1.5: + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} dependencies: '@nodelib/fs.stat': 2.0.5 run-parallel: 1.2.0 - '@nodelib/fs.stat@2.0.5': {} + /@nodelib/fs.stat@2.0.5: + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} - '@nodelib/fs.walk@1.2.8': + /@nodelib/fs.walk@1.2.8: + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} dependencies: '@nodelib/fs.scandir': 2.1.5 fastq: 1.17.1 - '@npmcli/config@6.4.1': + /@npmcli/config@6.4.1: + resolution: {integrity: sha512-uSz+elSGzjCMANWa5IlbGczLYPkNI/LeR+cHrgaTqTrTSh9RHhOFA4daD2eRUz6lMtOW+Fnsb+qv7V2Zz8ML0g==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} dependencies: '@npmcli/map-workspaces': 3.0.6 ci-info: 4.0.0 @@ -4561,115 +1515,187 @@ snapshots: read-package-json-fast: 3.0.2 semver: 7.6.0 walk-up-path: 3.0.1 + dev: true - '@npmcli/map-workspaces@3.0.6': + /@npmcli/map-workspaces@3.0.6: + resolution: {integrity: sha512-tkYs0OYnzQm6iIRdfy+LcLBjcKuQCeE5YLb8KnrIlutJfheNaPvPpgoFEyEFgbjzl5PLZ3IA/BWAwRU0eHuQDA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} dependencies: '@npmcli/name-from-folder': 2.0.0 glob: 10.3.12 minimatch: 9.0.4 read-package-json-fast: 3.0.2 + dev: true - '@npmcli/name-from-folder@2.0.0': {} + /@npmcli/name-from-folder@2.0.0: + resolution: {integrity: sha512-pwK+BfEBZJbKdNYpHHRTNBwBoqrN/iIMO0AiGvYsp3Hoaq0WbgGSWQR6SCldZovoDpY3yje5lkFUe6gsDgJ2vg==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dev: true - '@pkgjs/parseargs@0.11.0': + /@pkgjs/parseargs@0.11.0: + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + requiresBuild: true + dev: true optional: true - '@pkgr/core@0.1.1': {} + /@pkgr/core@0.1.1: + resolution: {integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + dev: true - '@popperjs/core@2.11.8': {} + /@popperjs/core@2.11.8: + resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==} + dev: false - '@react-aria/focus@3.18.2(react@18.3.1)': + /@react-aria/focus@3.17.1(react@18.3.1): + resolution: {integrity: sha512-FLTySoSNqX++u0nWZJPPN5etXY0WBxaIe/YuL/GTEeuqUIuC/2bJSaw5hlsM6T2yjy6Y/VAxBcKSdAFUlU6njQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 dependencies: - '@react-aria/interactions': 3.22.2(react@18.3.1) - '@react-aria/utils': 3.25.2(react@18.3.1) - '@react-types/shared': 3.24.1(react@18.3.1) + '@react-aria/interactions': 3.21.3(react@18.3.1) + '@react-aria/utils': 3.24.1(react@18.3.1) + '@react-types/shared': 3.23.1(react@18.3.1) '@swc/helpers': 0.5.2 clsx: 2.1.1 react: 18.3.1 + dev: false - '@react-aria/interactions@3.22.2(react@18.3.1)': + /@react-aria/interactions@3.21.3(react@18.3.1): + resolution: {integrity: sha512-BWIuf4qCs5FreDJ9AguawLVS0lV9UU+sK4CCnbCNNmYqOWY+1+gRXCsnOM32K+oMESBxilAjdHW5n1hsMqYMpA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 dependencies: - '@react-aria/ssr': 3.9.5(react@18.3.1) - '@react-aria/utils': 3.25.2(react@18.3.1) - '@react-types/shared': 3.24.1(react@18.3.1) + '@react-aria/ssr': 3.9.4(react@18.3.1) + '@react-aria/utils': 3.24.1(react@18.3.1) + '@react-types/shared': 3.23.1(react@18.3.1) '@swc/helpers': 0.5.2 react: 18.3.1 + dev: false - '@react-aria/ssr@3.9.5(react@18.3.1)': + /@react-aria/ssr@3.9.4(react@18.3.1): + resolution: {integrity: sha512-4jmAigVq409qcJvQyuorsmBR4+9r3+JEC60wC+Y0MZV0HCtTmm8D9guYXlJMdx0SSkgj0hHAyFm/HvPNFofCoQ==} + engines: {node: '>= 12'} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 dependencies: '@swc/helpers': 0.5.2 react: 18.3.1 + dev: false - '@react-aria/utils@3.25.2(react@18.3.1)': + /@react-aria/utils@3.24.1(react@18.3.1): + resolution: {integrity: sha512-O3s9qhPMd6n42x9sKeJ3lhu5V1Tlnzhu6Yk8QOvDuXf7UGuUjXf9mzfHJt1dYzID4l9Fwm8toczBzPM9t0jc8Q==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 dependencies: - '@react-aria/ssr': 3.9.5(react@18.3.1) - '@react-stately/utils': 3.10.3(react@18.3.1) - '@react-types/shared': 3.24.1(react@18.3.1) + '@react-aria/ssr': 3.9.4(react@18.3.1) + '@react-stately/utils': 3.10.1(react@18.3.1) + '@react-types/shared': 3.23.1(react@18.3.1) '@swc/helpers': 0.5.2 clsx: 2.1.1 react: 18.3.1 + dev: false - '@react-stately/utils@3.10.3(react@18.3.1)': + /@react-stately/utils@3.10.1(react@18.3.1): + resolution: {integrity: sha512-VS/EHRyicef25zDZcM/ClpzYMC5i2YGN6uegOeQawmgfGjb02yaCX0F0zR69Pod9m2Hr3wunTbtpgVXvYbZItg==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 dependencies: '@swc/helpers': 0.5.2 react: 18.3.1 + dev: false - '@react-types/shared@3.24.1(react@18.3.1)': + /@react-types/shared@3.23.1(react@18.3.1): + resolution: {integrity: sha512-5d+3HbFDxGZjhbMBeFHRQhexMFt4pUce3okyRtUVKbbedQFUrtXSBg9VszgF2RTeQDKDkMCIQDtz5ccP/Lk1gw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 dependencies: react: 18.3.1 + dev: false - '@scure/base@1.1.6': {} + /@scure/base@1.1.6: + resolution: {integrity: sha512-ok9AWwhcgYuGG3Zfhyqg+zwl+Wn5uE+dwC0NV/2qQkx4dABbb/bx96vWu8NSj+BNjjSjno+JRYRjle1jV08k3g==} - '@scure/bip32@1.3.2': + /@scure/bip32@1.3.2: + resolution: {integrity: sha512-N1ZhksgwD3OBlwTv3R6KFEcPojl/W4ElJOeCZdi+vuI5QmTFwLq3OFf2zd2ROpKvxFdgZ6hUpb0dx9bVNEwYCA==} dependencies: '@noble/curves': 1.2.0 '@noble/hashes': 1.3.2 '@scure/base': 1.1.6 + dev: false - '@scure/bip32@1.3.3': + /@scure/bip32@1.3.3: + resolution: {integrity: sha512-LJaN3HwRbfQK0X1xFSi0Q9amqOgzQnnDngIt+ZlsBC3Bm7/nE7K0kwshZHyaru79yIVRv/e1mQAjZyuZG6jOFQ==} dependencies: '@noble/curves': 1.3.0 '@noble/hashes': 1.3.3 '@scure/base': 1.1.6 + dev: true - '@scure/bip39@1.2.1': + /@scure/bip39@1.2.1: + resolution: {integrity: sha512-Z3/Fsz1yr904dduJD0NpiyRHhRYHdcnyh73FZWiV+/qhWi83wNJ3NWolYqCEN+ZWsUz2TWwajJggcRE9r1zUYg==} dependencies: '@noble/hashes': 1.3.2 '@scure/base': 1.1.6 + dev: false - '@scure/bip39@1.2.2': + /@scure/bip39@1.2.2: + resolution: {integrity: sha512-HYf9TUXG80beW+hGAt3TRM8wU6pQoYur9iNypTROm42dorCGmLnFe3eWjz3gOq6G62H2WRh0FCzAR1PI+29zIA==} dependencies: '@noble/hashes': 1.3.3 '@scure/base': 1.1.6 + dev: true - '@swc/counter@0.1.3': {} + /@swc/counter@0.1.3: + resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} + dev: false - '@swc/helpers@0.5.2': + /@swc/helpers@0.5.2: + resolution: {integrity: sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==} dependencies: tslib: 2.6.2 + dev: false - '@swc/helpers@0.5.5': + /@swc/helpers@0.5.5: + resolution: {integrity: sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A==} dependencies: '@swc/counter': 0.1.3 tslib: 2.6.2 + dev: false - '@tanstack/react-virtual@3.10.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + /@tanstack/react-virtual@3.10.8(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-VbzbVGSsZlQktyLrP5nxE+vE1ZR+U0NFAWPbJLoG2+DKPwd2D7dVICTVIIaYlJqX1ZCEnYDbaOpmMwbsyhBoIA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 dependencies: '@tanstack/virtual-core': 3.10.8 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) + dev: false - '@tanstack/react-virtual@3.5.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + /@tanstack/react-virtual@3.5.0(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-rtvo7KwuIvqK9zb0VZ5IL7fiJAEnG+0EiFZz8FUOs+2mhGqdGmjKIaT1XU7Zq0eFqL0jonLlhbayJI/J2SA/Bw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 dependencies: '@tanstack/virtual-core': 3.5.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) + dev: false - '@tanstack/virtual-core@3.10.8': {} + /@tanstack/virtual-core@3.10.8: + resolution: {integrity: sha512-PBu00mtt95jbKFi6Llk9aik8bnR3tR/oQP1o3TSi+iG//+Q2RTIzCEgKkHG8BB86kxMNW6O8wku+Lmi+QFR6jA==} + dev: false - '@tanstack/virtual-core@3.5.0': {} + /@tanstack/virtual-core@3.5.0: + resolution: {integrity: sha512-KnPRCkQTyqhanNC0K63GBG3wA8I+D1fQuVnAvcBF8f13akOKeQp1gSbu6f77zCxhEk727iV5oQnbHLYzHrECLg==} + dev: false - '@testing-library/dom@9.3.4': + /@testing-library/dom@9.3.4: + resolution: {integrity: sha512-FlS4ZWlp97iiNWig0Muq8p+3rVDjRiYE+YKGbAqXOu9nwJFFOdL00kFpz42M+4huzYi86vAK1sOOfyOG45muIQ==} + engines: {node: '>=14'} dependencies: '@babel/code-frame': 7.24.2 '@babel/runtime': 7.24.4 @@ -4679,149 +1705,244 @@ snapshots: dom-accessibility-api: 0.5.16 lz-string: 1.5.0 pretty-format: 27.5.1 + dev: false - '@testing-library/react@14.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + /@testing-library/react@14.3.1(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-H99XjUhWQw0lTgyMN05W3xQG1Nh4lq574D8keFf1dDoNTJgp66VbJozRaczoF+wsiaPJNt/TcnfpLGufGxSrZQ==} + engines: {node: '>=14'} + peerDependencies: + react: ^18.0.0 + react-dom: ^18.0.0 dependencies: '@babel/runtime': 7.24.4 '@testing-library/dom': 9.3.4 '@types/react-dom': 18.3.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) + dev: false - '@theguild/remark-mermaid@0.0.5(react@18.3.1)': + /@theguild/remark-mermaid@0.0.5(react@18.3.1): + resolution: {integrity: sha512-e+ZIyJkEv9jabI4m7q29wZtZv+2iwPGsXJ2d46Zi7e+QcFudiyuqhLhHG/3gX3ZEB+hxTch+fpItyMS8jwbIcw==} + peerDependencies: + react: ^18.2.0 dependencies: mermaid: 10.9.0 react: 18.3.1 unist-util-visit: 5.0.0 transitivePeerDependencies: - supports-color + dev: false - '@theguild/remark-npm2yarn@0.2.1': + /@theguild/remark-npm2yarn@0.2.1: + resolution: {integrity: sha512-jUTFWwDxtLEFtGZh/TW/w30ySaDJ8atKWH8dq2/IiQF61dPrGfETpl0WxD0VdBfuLOeU14/kop466oBSRO/5CA==} dependencies: npm-to-yarn: 2.2.1 unist-util-visit: 5.0.0 + dev: false - '@types/acorn@4.0.6': + /@types/acorn@4.0.6: + resolution: {integrity: sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ==} dependencies: '@types/estree': 1.0.5 - '@types/aria-query@5.0.4': {} + /@types/aria-query@5.0.4: + resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==} + dev: false - '@types/change-case@2.3.1': + /@types/change-case@2.3.1: + resolution: {integrity: sha512-HYiGjhmGInNzJjtt6ciXEfl2s8ZQGUQpPiwgWSth1fycE69hXbV/RgWH7MvSq2QPhMBzi4SGhu1vE+cMx1xB8g==} + deprecated: This is a stub types definition for change-case (https://github.com/blakeembrey/change-case). change-case provides its own type definitions, so you don't need @types/change-case installed! dependencies: change-case: 4.1.2 + dev: false - '@types/concat-stream@2.0.3': + /@types/concat-stream@2.0.3: + resolution: {integrity: sha512-3qe4oQAPNwVNwK4C9c8u+VJqv9kez+2MR4qJpoPFfXtgxxif1QbFusvXzK0/Wra2VX07smostI2VMmJNSpZjuQ==} dependencies: '@types/node': 18.11.10 + dev: true - '@types/d3-scale-chromatic@3.0.3': {} + /@types/d3-scale-chromatic@3.0.3: + resolution: {integrity: sha512-laXM4+1o5ImZv3RpFAsTRn3TEkzqkytiOY0Dz0sq5cnd1dtNlk6sHLon4OvqaiJb28T0S/TdsBI3Sjsy+keJrw==} + dev: false - '@types/d3-scale@4.0.8': + /@types/d3-scale@4.0.8: + resolution: {integrity: sha512-gkK1VVTr5iNiYJ7vWDI+yUFFlszhNMtVeneJ6lUTKPjprsvLLI9/tgEGiXJOnlINJA8FyA88gfnQsHbybVZrYQ==} dependencies: '@types/d3-time': 3.0.3 + dev: false - '@types/d3-time@3.0.3': {} + /@types/d3-time@3.0.3: + resolution: {integrity: sha512-2p6olUZ4w3s+07q3Tm2dbiMZy5pCDfYwtLXXHUnVzXgQlZ/OyPtUz6OL382BkOuGlLXqfT+wqv8Fw2v8/0geBw==} + dev: false - '@types/debug@4.1.12': + /@types/debug@4.1.12: + resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} dependencies: '@types/ms': 0.7.34 - '@types/estree-jsx@1.0.5': + /@types/estree-jsx@1.0.5: + resolution: {integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==} dependencies: '@types/estree': 1.0.5 - '@types/estree@1.0.5': {} + /@types/estree@1.0.5: + resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} - '@types/hast@2.3.10': + /@types/hast@2.3.10: + resolution: {integrity: sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw==} dependencies: '@types/unist': 2.0.10 - '@types/hast@3.0.4': + /@types/hast@3.0.4: + resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} dependencies: '@types/unist': 3.0.2 + dev: false - '@types/is-empty@1.2.3': {} + /@types/is-empty@1.2.3: + resolution: {integrity: sha512-4J1l5d79hoIvsrKh5VUKVRA1aIdsOb10Hu5j3J2VfP/msDnfTdGPmNp2E1Wg+vs97Bktzo+MZePFFXSGoykYJw==} + dev: true - '@types/js-yaml@4.0.9': {} + /@types/js-yaml@4.0.9: + resolution: {integrity: sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==} + dev: false - '@types/json-schema@7.0.15': {} + /@types/json-schema@7.0.15: + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + dev: true - '@types/katex@0.16.7': {} + /@types/katex@0.16.7: + resolution: {integrity: sha512-HMwFiRujE5PjrgwHQ25+bsLJgowjGjm5Z8FVSf0N6PwgJrwxH0QxzHYDcKsTfV3wva0vzrpqMTJS2jXPr5BMEQ==} + dev: false - '@types/lodash.clonedeep@4.5.9': + /@types/lodash.clonedeep@4.5.9: + resolution: {integrity: sha512-19429mWC+FyaAhOLzsS8kZUsI+/GmBAQ0HFiCPsKGU+7pBXOQWhyrY6xNNDwUSX8SMZMJvuFVMF9O5dQOlQK9Q==} dependencies: '@types/lodash': 4.17.0 + dev: true - '@types/lodash@4.17.0': {} + /@types/lodash@4.17.0: + resolution: {integrity: sha512-t7dhREVv6dbNj0q17X12j7yDG4bD/DHYX7o5/DbDxobP0HnGPgpRz2Ej77aL7TZT3DSw13fqUTj8J4mMnqa7WA==} + dev: true - '@types/mdast@3.0.15': + /@types/mdast@3.0.15: + resolution: {integrity: sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==} dependencies: '@types/unist': 2.0.10 - '@types/mdast@4.0.3': + /@types/mdast@4.0.3: + resolution: {integrity: sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg==} dependencies: '@types/unist': 3.0.2 - '@types/mdx@2.0.13': {} + /@types/mdx@2.0.13: + resolution: {integrity: sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==} + dev: false - '@types/ms@0.7.34': {} + /@types/ms@0.7.34: + resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==} - '@types/node@18.11.10': {} + /@types/node@18.11.10: + resolution: {integrity: sha512-juG3RWMBOqcOuXC643OAdSA525V44cVgGV6dUDuiFtss+8Fk5x1hI93Rsld43VeJVIeqlP9I7Fn9/qaVqoEAuQ==} + dev: true - '@types/prop-types@15.7.12': {} + /@types/prop-types@15.7.12: + resolution: {integrity: sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==} + dev: false - '@types/react-dom@18.3.0': + /@types/react-dom@18.3.0: + resolution: {integrity: sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==} dependencies: '@types/react': 18.3.1 + dev: false - '@types/react@18.3.1': + /@types/react@18.3.1: + resolution: {integrity: sha512-V0kuGBX3+prX+DQ/7r2qsv1NsdfnCLnTgnRJ1pYnxykBhGMz+qj+box5lq7XsO5mtZsBqpjwwTu/7wszPfMBcw==} dependencies: '@types/prop-types': 15.7.12 csstype: 3.1.3 + dev: false - '@types/supports-color@8.1.3': {} + /@types/supports-color@8.1.3: + resolution: {integrity: sha512-Hy6UMpxhE3j1tLpl27exp1XqHD7n8chAiNPzWfz16LPZoMMoSc4dzLl6w9qijkEb/r5O1ozdu1CWGA2L83ZeZg==} + dev: true - '@types/unist@2.0.10': {} + /@types/unist@2.0.10: + resolution: {integrity: sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==} - '@types/unist@3.0.2': {} + /@types/unist@3.0.2: + resolution: {integrity: sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==} - '@ungap/structured-clone@1.2.0': {} + /@ungap/structured-clone@1.2.0: + resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} - abbrev@2.0.0: {} + /abbrev@2.0.0: + resolution: {integrity: sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dev: true - abitype@1.0.0(typescript@5.4.5)(zod@3.23.8): - optionalDependencies: + /abitype@1.0.0(typescript@5.4.5): + resolution: {integrity: sha512-NMeMah//6bJ56H5XRj8QCV4AwuW6hB6zqz2LnhhLdcWVQOsXki6/Pn3APeqxCma62nXIcmZWdu1DlHWS74umVQ==} + peerDependencies: + typescript: '>=5.0.4' + zod: ^3 >=3.22.0 + peerDependenciesMeta: + typescript: + optional: true + zod: + optional: true + dependencies: typescript: 5.4.5 - zod: 3.23.8 + dev: false - acorn-jsx@5.3.2(acorn@8.11.3): + /acorn-jsx@5.3.2(acorn@8.11.3): + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: acorn: 8.11.3 - acorn@8.11.3: {} + /acorn@8.11.3: + resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} + engines: {node: '>=0.4.0'} + hasBin: true - aes-js@3.0.0: {} + /aes-js@3.0.0: + resolution: {integrity: sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==} + dev: true - ajv-formats@2.1.1(ajv@8.12.0): - optionalDependencies: + /ajv-formats@2.1.1(ajv@8.12.0): + resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + dependencies: ajv: 8.12.0 + dev: true - ajv@6.12.6: + /ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} dependencies: fast-deep-equal: 3.1.3 fast-json-stable-stringify: 2.1.0 json-schema-traverse: 0.4.1 uri-js: 4.4.1 + dev: true - ajv@8.12.0: + /ajv@8.12.0: + resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} dependencies: fast-deep-equal: 3.1.3 json-schema-traverse: 1.0.0 require-from-string: 2.0.2 uri-js: 4.4.1 + dev: true - algoliasearch@4.23.3: + /algoliasearch@4.23.3: + resolution: {integrity: sha512-Le/3YgNvjW9zxIQMRhUHuhiUjAlKY/zsdZpfq4dlLqg6mEm0nL6yk+7f2hDOtLpxsgE4jSzDmvHL7nXdBp5feg==} dependencies: '@algolia/cache-browser-local-storage': 4.23.3 '@algolia/cache-common': 4.23.3 @@ -4838,121 +1959,209 @@ snapshots: '@algolia/requester-common': 4.23.3 '@algolia/requester-node-http': 4.23.3 '@algolia/transporter': 4.23.3 + dev: false - ansi-regex@5.0.1: {} + /ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} - ansi-regex@6.0.1: {} + /ansi-regex@6.0.1: + resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} + engines: {node: '>=12'} + dev: true - ansi-sequence-parser@1.1.1: {} + /ansi-sequence-parser@1.1.1: + resolution: {integrity: sha512-vJXt3yiaUL4UU546s3rPXlsry/RnM730G1+HkpKE012AN0sx1eOrxSu95oKDIonskeLTijMgqWZ3uDEe3NFvyg==} + dev: false - ansi-styles@3.2.1: + /ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} dependencies: color-convert: 1.9.3 - ansi-styles@4.3.0: + /ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} dependencies: color-convert: 2.0.1 - ansi-styles@5.2.0: {} + /ansi-styles@5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + dev: false - ansi-styles@6.2.1: {} + /ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + dev: true - arch@2.2.0: {} + /arch@2.2.0: + resolution: {integrity: sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==} + dev: false - arg@1.0.0: {} + /arg@1.0.0: + resolution: {integrity: sha512-Wk7TEzl1KqvTGs/uyhmHO/3XLd3t1UeU4IstvPXVzGPM522cTjqjNZ99esCkcL52sjqjo8e8CTBcWhkxvGzoAw==} + dev: false - argparse@1.0.10: + /argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} dependencies: sprintf-js: 1.0.3 - argparse@2.0.1: {} + /argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - aria-query@5.1.3: + /aria-query@5.1.3: + resolution: {integrity: sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==} dependencies: deep-equal: 2.2.3 + dev: false - array-buffer-byte-length@1.0.1: + /array-buffer-byte-length@1.0.1: + resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} + engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 is-array-buffer: 3.0.4 + dev: false - array-timsort@1.0.3: {} + /array-timsort@1.0.3: + resolution: {integrity: sha512-/+3GRL7dDAGEfM6TseQk/U+mi18TU2Ms9I3UlLdUMhz2hbvGNTKdj9xniwXfUqgYhHxRx0+8UnKkvlNwVU+cWQ==} + dev: true - array-union@2.1.0: {} + /array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + dev: true - assertion-error@1.1.0: {} + /assertion-error@1.1.0: + resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} + dev: true - astring@1.8.6: {} + /astring@1.8.6: + resolution: {integrity: sha512-ISvCdHdlTDlH5IpxQJIex7BWBywFWgjJSVdwst+/iQCoEYnyOaQ95+X1JGshuBjGp6nxKUy1jMgE3zPqN7fQdg==} + hasBin: true + dev: false - available-typed-arrays@1.0.7: + /available-typed-arrays@1.0.7: + resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} + engines: {node: '>= 0.4'} dependencies: possible-typed-array-names: 1.0.0 + dev: false - bail@2.0.2: {} + /bail@2.0.2: + resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} - balanced-match@1.0.2: {} + /balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + dev: true - bech32@1.1.4: {} + /bech32@1.1.4: + resolution: {integrity: sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==} + dev: true - bignumber.js@9.1.2: {} + /bignumber.js@9.1.2: + resolution: {integrity: sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==} + dev: true - bn.js@4.11.6: {} + /bn.js@4.11.6: + resolution: {integrity: sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA==} + dev: true - bn.js@4.12.0: {} + /bn.js@4.12.0: + resolution: {integrity: sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==} + dev: true - bn.js@5.2.1: {} + /bn.js@5.2.1: + resolution: {integrity: sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==} + dev: true - brace-expansion@1.1.11: + /brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} dependencies: balanced-match: 1.0.2 concat-map: 0.0.1 + dev: true - brace-expansion@2.0.1: + /brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} dependencies: balanced-match: 1.0.2 + dev: true - braces@3.0.3: + /braces@3.0.2: + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + engines: {node: '>=8'} dependencies: - fill-range: 7.1.1 + fill-range: 7.0.1 - brorand@1.1.0: {} + /brorand@1.1.0: + resolution: {integrity: sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==} + dev: true - buffer-from@1.1.2: {} + /buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + dev: true - buffer-reverse@1.0.1: {} + /buffer-reverse@1.0.1: + resolution: {integrity: sha512-M87YIUBsZ6N924W57vDwT/aOu8hw7ZgdByz6ijksLjmHJELBASmYTTlNHRgjE+pTsT9oJXGaDSgqqwfdHotDUg==} + dev: true - bufio@1.2.1: {} + /bufio@1.2.1: + resolution: {integrity: sha512-9oR3zNdupcg/Ge2sSHQF3GX+kmvL/fTPvD0nd5AGLq8SjUYnTz+SlFjK/GXidndbZtIj+pVKXiWeR9w6e9wKCA==} + engines: {node: '>=14.0.0'} + dev: true - busboy@1.6.0: + /busboy@1.6.0: + resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} + engines: {node: '>=10.16.0'} dependencies: streamsearch: 1.1.0 + dev: false - call-bind@1.0.7: + /call-bind@1.0.7: + resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} + engines: {node: '>= 0.4'} dependencies: es-define-property: 1.0.0 es-errors: 1.3.0 function-bind: 1.1.2 get-intrinsic: 1.2.4 set-function-length: 1.2.2 + dev: false - callsites@3.1.0: {} + /callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + dev: true - camel-case@4.1.2: + /camel-case@4.1.2: + resolution: {integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==} dependencies: pascal-case: 3.1.2 tslib: 2.6.2 + dev: false - caniuse-lite@1.0.30001614: {} + /caniuse-lite@1.0.30001614: + resolution: {integrity: sha512-jmZQ1VpmlRwHgdP1/uiKzgiAuGOfLEJsYFP4+GBou/QQ4U6IOJCB4NP1c+1p9RGLpwObcT94jA5/uO+F1vBbog==} + dev: false - capital-case@1.0.4: + /capital-case@1.0.4: + resolution: {integrity: sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==} dependencies: no-case: 3.0.4 tslib: 2.6.2 upper-case-first: 2.0.2 + dev: false - ccount@2.0.1: {} + /ccount@2.0.1: + resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} - chai@4.4.1: + /chai@4.4.1: + resolution: {integrity: sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==} + engines: {node: '>=4'} dependencies: assertion-error: 1.1.0 check-error: 1.0.3 @@ -4961,31 +2170,46 @@ snapshots: loupe: 2.3.7 pathval: 1.1.1 type-detect: 4.0.8 + dev: true - chalk-template@1.1.0: + /chalk-template@1.1.0: + resolution: {integrity: sha512-T2VJbcDuZQ0Tb2EWwSotMPJjgpy1/tGee1BTpUNsGZ/qgNjV2t7Mvu+d4600U564nbLesN1x2dPL+xii174Ekg==} + engines: {node: '>=14.16'} dependencies: chalk: 5.3.0 + dev: true - chalk@2.3.0: + /chalk@2.3.0: + resolution: {integrity: sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==} + engines: {node: '>=4'} dependencies: ansi-styles: 3.2.1 escape-string-regexp: 1.0.5 supports-color: 4.5.0 + dev: false - chalk@2.4.2: + /chalk@2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} dependencies: ansi-styles: 3.2.1 escape-string-regexp: 1.0.5 supports-color: 5.5.0 - chalk@4.1.2: + /chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} dependencies: ansi-styles: 4.3.0 supports-color: 7.2.0 - chalk@5.3.0: {} + /chalk@5.3.0: + resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + dev: true - change-case@4.1.2: + /change-case@4.1.2: + resolution: {integrity: sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A==} dependencies: camel-case: 4.1.2 capital-case: 1.0.4 @@ -4999,151 +2223,245 @@ snapshots: sentence-case: 3.0.4 snake-case: 3.0.4 tslib: 2.6.2 + dev: false - character-entities-html4@2.1.0: {} + /character-entities-html4@2.1.0: + resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} - character-entities-legacy@1.1.4: {} + /character-entities-legacy@1.1.4: + resolution: {integrity: sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==} + dev: true - character-entities-legacy@3.0.0: {} + /character-entities-legacy@3.0.0: + resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} - character-entities@1.2.4: {} + /character-entities@1.2.4: + resolution: {integrity: sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==} + dev: true - character-entities@2.0.2: {} + /character-entities@2.0.2: + resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} - character-reference-invalid@1.1.4: {} + /character-reference-invalid@1.1.4: + resolution: {integrity: sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==} + dev: true - character-reference-invalid@2.0.1: {} + /character-reference-invalid@2.0.1: + resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} - check-error@1.0.3: + /check-error@1.0.3: + resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} dependencies: get-func-name: 2.0.2 + dev: true - ci-info@4.0.0: {} + /ci-info@4.0.0: + resolution: {integrity: sha512-TdHqgGf9odd8SXNuxtUBVx8Nv+qZOejE6qyqiy5NtbYYQOeFa6zmHkxlPzmaLxWWHsU6nJmB7AETdVPi+2NBUg==} + engines: {node: '>=8'} + dev: true - clear-module@4.1.2: + /clear-module@4.1.2: + resolution: {integrity: sha512-LWAxzHqdHsAZlPlEyJ2Poz6AIs384mPeqLVCru2p0BrP9G/kVGuhNyZYClLO6cXlnuJjzC8xtsJIuMjKqLXoAw==} + engines: {node: '>=8'} dependencies: parent-module: 2.0.0 resolve-from: 5.0.0 + dev: true - client-only@0.0.1: {} + /client-only@0.0.1: + resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} + dev: false - clipboardy@1.2.2: + /clipboardy@1.2.2: + resolution: {integrity: sha512-16KrBOV7bHmHdxcQiCvfUFYVFyEah4FI8vYT1Fr7CGSA4G+xBWMEfUEQJS1hxeHGtI9ju1Bzs9uXSbj5HZKArw==} + engines: {node: '>=4'} dependencies: arch: 2.2.0 execa: 0.8.0 + dev: false - clsx@2.1.1: {} + /clsx@2.1.1: + resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} + engines: {node: '>=6'} + dev: false - color-convert@1.9.3: + /color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} dependencies: color-name: 1.1.3 - color-convert@2.0.1: + /color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} dependencies: color-name: 1.1.4 - color-name@1.1.3: {} + /color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} - color-name@1.1.4: {} + /color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - comma-separated-tokens@2.0.3: {} + /comma-separated-tokens@2.0.3: + resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} + dev: false - commander@12.0.0: {} + /commander@12.0.0: + resolution: {integrity: sha512-MwVNWlYjDTtOjX5PiD7o5pK0UrFU/OYgcJfjjK4RaHZETNtjJqrZa9Y9ds88+A+f+d5lv+561eZ+yCKoS3gbAA==} + engines: {node: '>=18'} + dev: true - commander@7.2.0: {} + /commander@7.2.0: + resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} + engines: {node: '>= 10'} + dev: false - commander@8.3.0: {} + /commander@8.3.0: + resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} + engines: {node: '>= 12'} + dev: false - comment-json@4.2.3: + /comment-json@4.2.3: + resolution: {integrity: sha512-SsxdiOf064DWoZLH799Ata6u7iV658A11PlWtZATDlXPpKGJnbJZ5Z24ybixAi+LUUqJ/GKowAejtC5GFUG7Tw==} + engines: {node: '>= 6'} dependencies: array-timsort: 1.0.3 core-util-is: 1.0.3 esprima: 4.0.1 has-own-prop: 2.0.0 repeat-string: 1.6.1 + dev: true - compute-scroll-into-view@3.1.0: {} + /compute-scroll-into-view@3.1.0: + resolution: {integrity: sha512-rj8l8pD4bJ1nx+dAkMhV1xB5RuZEyVysfxJqB1pRchh1KVvwOv9b7CGB8ZfjTImVv2oF+sYMUkMZq6Na5Ftmbg==} + dev: false - concat-map@0.0.1: {} + /concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + dev: true - concat-stream@2.0.0: + /concat-stream@2.0.0: + resolution: {integrity: sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==} + engines: {'0': node >= 6.0} dependencies: buffer-from: 1.1.2 inherits: 2.0.4 readable-stream: 3.6.2 typedarray: 0.0.6 + dev: true - configstore@6.0.0: + /configstore@6.0.0: + resolution: {integrity: sha512-cD31W1v3GqUlQvbBCGcXmd2Nj9SvLDOP1oQ0YFuLETufzSPaKp11rYBsSOm7rCsW3OnIRAFM3OxRhceaXNYHkA==} + engines: {node: '>=12'} dependencies: dot-prop: 6.0.1 graceful-fs: 4.2.11 unique-string: 3.0.0 write-file-atomic: 3.0.3 xdg-basedir: 5.1.0 + dev: true - constant-case@3.0.4: + /constant-case@3.0.4: + resolution: {integrity: sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ==} dependencies: no-case: 3.0.4 tslib: 2.6.2 upper-case: 2.0.2 + dev: false - core-util-is@1.0.3: {} + /core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + dev: true - cose-base@1.0.3: + /cose-base@1.0.3: + resolution: {integrity: sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg==} dependencies: layout-base: 1.0.2 + dev: false - cross-spawn@5.1.0: + /cross-spawn@5.1.0: + resolution: {integrity: sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==} dependencies: lru-cache: 4.1.5 shebang-command: 1.2.0 which: 1.3.1 + dev: false - cross-spawn@7.0.3: + /cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} dependencies: path-key: 3.1.1 shebang-command: 2.0.0 which: 2.0.2 + dev: true - crypto-js@4.2.0: {} + /crypto-js@4.2.0: + resolution: {integrity: sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==} + dev: true - crypto-random-string@4.0.0: + /crypto-random-string@4.0.0: + resolution: {integrity: sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==} + engines: {node: '>=12'} dependencies: type-fest: 1.4.0 + dev: true - cspell-config-lib@8.7.0: + /cspell-config-lib@8.7.0: + resolution: {integrity: sha512-depsd01GbLBo71/tfRrL5iECWQLS4CjCxA9C01dVkFAJqVB0s+K9KLKjTlq5aHOhcvo9Z3dHV+bGQCf5/Q7bfw==} + engines: {node: '>=18'} dependencies: '@cspell/cspell-types': 8.7.0 comment-json: 4.2.3 yaml: 2.4.2 + dev: true - cspell-dictionary@8.7.0: + /cspell-dictionary@8.7.0: + resolution: {integrity: sha512-S6IpZSzIMxlOO/33NgCOuP0TPH2mZbw8d5CP44z5jajflloq8l74MeJLkeDzYfCRcm0Rtk0A5drBeMg+Ai34OA==} + engines: {node: '>=18'} dependencies: '@cspell/cspell-pipe': 8.7.0 '@cspell/cspell-types': 8.7.0 cspell-trie-lib: 8.7.0 fast-equals: 5.0.1 gensequence: 7.0.0 + dev: true - cspell-gitignore@8.7.0: + /cspell-gitignore@8.7.0: + resolution: {integrity: sha512-yvUZ86qyopUpDgn+YXP1qTpUe/lp65ZFvpMtw21lWHTFlg1OWKntr349EQU/5ben/K6koxk1FiElCBV7Lr4uFg==} + engines: {node: '>=18'} + hasBin: true dependencies: cspell-glob: 8.7.0 find-up-simple: 1.0.0 + dev: true - cspell-glob@8.7.0: + /cspell-glob@8.7.0: + resolution: {integrity: sha512-AMdfx0gvROA/aIL8t8b5Y5NtMgscGZELFj6WhCSZiQSuWRxXUKiLGGLUFjx2y0hgXN9LUYOo6aBjvhnxI/v71g==} + engines: {node: '>=18'} dependencies: - micromatch: 4.0.8 + micromatch: 4.0.5 + dev: true - cspell-grammar@8.7.0: + /cspell-grammar@8.7.0: + resolution: {integrity: sha512-SGcXc7322wU2WNRi7vtpToWDXTqZHhxqvR+aIXHT2kkxlMSWp3Rvfpshd0ckgY54nZtgw7R/JtKND2jeACRpwQ==} + engines: {node: '>=18'} + hasBin: true dependencies: '@cspell/cspell-pipe': 8.7.0 '@cspell/cspell-types': 8.7.0 + dev: true - cspell-io@8.7.0: + /cspell-io@8.7.0: + resolution: {integrity: sha512-o7OltyyvVkRG1gQrIqGpN5pUkHNnv6rvihb7Qu6cJ8jITinLGuWJuEQpgt0eF5yIr624jDbFwSzAxsFox8riQg==} + engines: {node: '>=18'} dependencies: '@cspell/cspell-service-bus': 8.7.0 + dev: true - cspell-lib@8.7.0: + /cspell-lib@8.7.0: + resolution: {integrity: sha512-qDSHZGekwiDmouYRECTQokE+hgAuPqREm+Hb+G3DoIo3ZK5H47TtEUo8fNCw22XsKefcF8X28LiyoZwiYHVpSg==} + engines: {node: '>=18'} dependencies: '@cspell/cspell-bundled-dicts': 8.7.0 '@cspell/cspell-pipe': 8.7.0 @@ -5166,14 +2484,21 @@ snapshots: resolve-from: 5.0.0 vscode-languageserver-textdocument: 1.0.11 vscode-uri: 3.0.8 + dev: true - cspell-trie-lib@8.7.0: + /cspell-trie-lib@8.7.0: + resolution: {integrity: sha512-W3Nh2cO7gMV91r+hLqyTMgKlvRl4W5diKs5YiyOxjZumRkMBy42IzcNYtgIIacOxghklv96F5Bd1Vx/zY6ylGA==} + engines: {node: '>=18'} dependencies: '@cspell/cspell-pipe': 8.7.0 '@cspell/cspell-types': 8.7.0 gensequence: 7.0.0 + dev: true - cspell@8.7.0: + /cspell@8.7.0: + resolution: {integrity: sha512-77nRPgLl240C6FK8RKVKo34lP15Lzp/6bk+SKYJFwUKKXlcgWXDis+Lw4JolA741/JgHtuxmhW1C8P7dCKjJ3w==} + engines: {node: '>=18'} + hasBin: true dependencies: '@cspell/cspell-json-reporter': 8.7.0 '@cspell/cspell-pipe': 8.7.0 @@ -5193,134 +2518,241 @@ snapshots: semver: 7.6.0 strip-ansi: 7.1.0 vscode-uri: 3.0.8 + dev: true - csstype@3.1.3: {} + /csstype@3.1.3: + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + dev: false - cytoscape-cose-bilkent@4.1.0(cytoscape@3.29.2): + /cytoscape-cose-bilkent@4.1.0(cytoscape@3.29.2): + resolution: {integrity: sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ==} + peerDependencies: + cytoscape: ^3.2.0 dependencies: cose-base: 1.0.3 cytoscape: 3.29.2 + dev: false - cytoscape@3.29.2: {} + /cytoscape@3.29.2: + resolution: {integrity: sha512-2G1ycU28Nh7OHT9rkXRLpCDP30MKH1dXJORZuBhtEhEW7pKwgPi77ImqlCWinouyE1PNepIOGZBOrE84DG7LyQ==} + engines: {node: '>=0.10'} + dev: false - d3-array@2.12.1: + /d3-array@2.12.1: + resolution: {integrity: sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==} dependencies: internmap: 1.0.1 + dev: false - d3-array@3.2.4: + /d3-array@3.2.4: + resolution: {integrity: sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==} + engines: {node: '>=12'} dependencies: internmap: 2.0.3 + dev: false - d3-axis@3.0.0: {} + /d3-axis@3.0.0: + resolution: {integrity: sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==} + engines: {node: '>=12'} + dev: false - d3-brush@3.0.0: + /d3-brush@3.0.0: + resolution: {integrity: sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==} + engines: {node: '>=12'} dependencies: d3-dispatch: 3.0.1 d3-drag: 3.0.0 d3-interpolate: 3.0.1 d3-selection: 3.0.0 d3-transition: 3.0.1(d3-selection@3.0.0) + dev: false - d3-chord@3.0.1: + /d3-chord@3.0.1: + resolution: {integrity: sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==} + engines: {node: '>=12'} dependencies: d3-path: 3.1.0 + dev: false - d3-color@3.1.0: {} + /d3-color@3.1.0: + resolution: {integrity: sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==} + engines: {node: '>=12'} + dev: false - d3-contour@4.0.2: + /d3-contour@4.0.2: + resolution: {integrity: sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==} + engines: {node: '>=12'} dependencies: d3-array: 3.2.4 + dev: false - d3-delaunay@6.0.4: + /d3-delaunay@6.0.4: + resolution: {integrity: sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==} + engines: {node: '>=12'} dependencies: delaunator: 5.0.1 + dev: false - d3-dispatch@3.0.1: {} + /d3-dispatch@3.0.1: + resolution: {integrity: sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==} + engines: {node: '>=12'} + dev: false - d3-drag@3.0.0: + /d3-drag@3.0.0: + resolution: {integrity: sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==} + engines: {node: '>=12'} dependencies: d3-dispatch: 3.0.1 d3-selection: 3.0.0 + dev: false - d3-dsv@3.0.1: + /d3-dsv@3.0.1: + resolution: {integrity: sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==} + engines: {node: '>=12'} + hasBin: true dependencies: commander: 7.2.0 iconv-lite: 0.6.3 rw: 1.3.3 + dev: false - d3-ease@3.0.1: {} + /d3-ease@3.0.1: + resolution: {integrity: sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==} + engines: {node: '>=12'} + dev: false - d3-fetch@3.0.1: + /d3-fetch@3.0.1: + resolution: {integrity: sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==} + engines: {node: '>=12'} dependencies: d3-dsv: 3.0.1 + dev: false - d3-force@3.0.0: + /d3-force@3.0.0: + resolution: {integrity: sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==} + engines: {node: '>=12'} dependencies: d3-dispatch: 3.0.1 d3-quadtree: 3.0.1 d3-timer: 3.0.1 + dev: false - d3-format@3.1.0: {} + /d3-format@3.1.0: + resolution: {integrity: sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==} + engines: {node: '>=12'} + dev: false - d3-geo@3.1.1: + /d3-geo@3.1.1: + resolution: {integrity: sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==} + engines: {node: '>=12'} dependencies: d3-array: 3.2.4 + dev: false - d3-hierarchy@3.1.2: {} + /d3-hierarchy@3.1.2: + resolution: {integrity: sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==} + engines: {node: '>=12'} + dev: false - d3-interpolate@3.0.1: + /d3-interpolate@3.0.1: + resolution: {integrity: sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==} + engines: {node: '>=12'} dependencies: d3-color: 3.1.0 + dev: false - d3-path@1.0.9: {} + /d3-path@1.0.9: + resolution: {integrity: sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==} + dev: false - d3-path@3.1.0: {} + /d3-path@3.1.0: + resolution: {integrity: sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==} + engines: {node: '>=12'} + dev: false - d3-polygon@3.0.1: {} + /d3-polygon@3.0.1: + resolution: {integrity: sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==} + engines: {node: '>=12'} + dev: false - d3-quadtree@3.0.1: {} + /d3-quadtree@3.0.1: + resolution: {integrity: sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==} + engines: {node: '>=12'} + dev: false - d3-random@3.0.1: {} + /d3-random@3.0.1: + resolution: {integrity: sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==} + engines: {node: '>=12'} + dev: false - d3-sankey@0.12.3: + /d3-sankey@0.12.3: + resolution: {integrity: sha512-nQhsBRmM19Ax5xEIPLMY9ZmJ/cDvd1BG3UVvt5h3WRxKg5zGRbvnteTyWAbzeSvlh3tW7ZEmq4VwR5mB3tutmQ==} dependencies: d3-array: 2.12.1 d3-shape: 1.3.7 + dev: false - d3-scale-chromatic@3.1.0: + /d3-scale-chromatic@3.1.0: + resolution: {integrity: sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==} + engines: {node: '>=12'} dependencies: d3-color: 3.1.0 d3-interpolate: 3.0.1 + dev: false - d3-scale@4.0.2: + /d3-scale@4.0.2: + resolution: {integrity: sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==} + engines: {node: '>=12'} dependencies: d3-array: 3.2.4 d3-format: 3.1.0 d3-interpolate: 3.0.1 d3-time: 3.1.0 d3-time-format: 4.1.0 + dev: false - d3-selection@3.0.0: {} + /d3-selection@3.0.0: + resolution: {integrity: sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==} + engines: {node: '>=12'} + dev: false - d3-shape@1.3.7: + /d3-shape@1.3.7: + resolution: {integrity: sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==} dependencies: d3-path: 1.0.9 + dev: false - d3-shape@3.2.0: + /d3-shape@3.2.0: + resolution: {integrity: sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==} + engines: {node: '>=12'} dependencies: d3-path: 3.1.0 + dev: false - d3-time-format@4.1.0: + /d3-time-format@4.1.0: + resolution: {integrity: sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==} + engines: {node: '>=12'} dependencies: d3-time: 3.1.0 + dev: false - d3-time@3.1.0: + /d3-time@3.1.0: + resolution: {integrity: sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==} + engines: {node: '>=12'} dependencies: d3-array: 3.2.4 + dev: false - d3-timer@3.0.1: {} + /d3-timer@3.0.1: + resolution: {integrity: sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==} + engines: {node: '>=12'} + dev: false - d3-transition@3.0.1(d3-selection@3.0.0): + /d3-transition@3.0.1(d3-selection@3.0.0): + resolution: {integrity: sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==} + engines: {node: '>=12'} + peerDependencies: + d3-selection: 2 - 3 dependencies: d3-color: 3.1.0 d3-dispatch: 3.0.1 @@ -5328,16 +2760,22 @@ snapshots: d3-interpolate: 3.0.1 d3-selection: 3.0.0 d3-timer: 3.0.1 + dev: false - d3-zoom@3.0.0: + /d3-zoom@3.0.0: + resolution: {integrity: sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==} + engines: {node: '>=12'} dependencies: d3-dispatch: 3.0.1 d3-drag: 3.0.0 d3-interpolate: 3.0.1 d3-selection: 3.0.0 d3-transition: 3.0.1(d3-selection@3.0.0) + dev: false - d3@7.9.0: + /d3@7.9.0: + resolution: {integrity: sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==} + engines: {node: '>=12'} dependencies: d3-array: 3.2.4 d3-axis: 3.0.0 @@ -5369,27 +2807,45 @@ snapshots: d3-timer: 3.0.1 d3-transition: 3.0.1(d3-selection@3.0.0) d3-zoom: 3.0.0 + dev: false - dagre-d3-es@7.0.10: + /dagre-d3-es@7.0.10: + resolution: {integrity: sha512-qTCQmEhcynucuaZgY5/+ti3X/rnszKZhEQH/ZdWdtP1tA/y3VoHJzcVrO9pjjJCNpigfscAtoUB5ONcd2wNn0A==} dependencies: d3: 7.9.0 lodash-es: 4.17.21 + dev: false - dayjs@1.11.11: {} + /dayjs@1.11.11: + resolution: {integrity: sha512-okzr3f11N6WuqYtZSvm+F776mB41wRZMhKP+hc34YdW+KmtYYK9iqvHSwo2k9FEH3fhGXvOPV6yz2IcSrfRUDg==} + dev: false - debug@4.3.4: + /debug@4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true dependencies: ms: 2.1.2 - decode-named-character-reference@1.0.2: + /decode-named-character-reference@1.0.2: + resolution: {integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==} dependencies: character-entities: 2.0.2 - deep-eql@4.1.3: + /deep-eql@4.1.3: + resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} + engines: {node: '>=6'} dependencies: type-detect: 4.0.8 + dev: true - deep-equal@2.2.3: + /deep-equal@2.2.3: + resolution: {integrity: sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==} + engines: {node: '>= 0.4'} dependencies: array-buffer-byte-length: 1.0.1 call-bind: 1.0.7 @@ -5409,59 +2865,95 @@ snapshots: which-boxed-primitive: 1.0.2 which-collection: 1.0.2 which-typed-array: 1.1.15 + dev: false - deep-is@0.1.4: {} + /deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + dev: true - define-data-property@1.1.4: + /define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} dependencies: es-define-property: 1.0.0 es-errors: 1.3.0 gopd: 1.0.1 + dev: false - define-properties@1.2.1: + /define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} dependencies: define-data-property: 1.1.4 has-property-descriptors: 1.0.2 object-keys: 1.1.1 + dev: false - delaunator@5.0.1: + /delaunator@5.0.1: + resolution: {integrity: sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw==} dependencies: robust-predicates: 3.0.2 + dev: false - dequal@2.0.3: {} + /dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} - devlop@1.1.0: + /devlop@1.1.0: + resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} dependencies: dequal: 2.0.3 - diff@5.2.0: {} + /diff@5.2.0: + resolution: {integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==} + engines: {node: '>=0.3.1'} - dir-glob@3.0.1: + /dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} dependencies: path-type: 4.0.0 + dev: true - doctrine@3.0.0: + /doctrine@3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} dependencies: esutils: 2.0.3 + dev: true - dom-accessibility-api@0.5.16: {} + /dom-accessibility-api@0.5.16: + resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==} + dev: false - dompurify@3.1.7: {} + /dompurify@3.1.1: + resolution: {integrity: sha512-tVP8C/GJwnABOn/7cx/ymx/hXpmBfWIPihC1aOEvS8GbMqy3pgeYtJk1HXN3CO7tu+8bpY18f6isjR5Cymj0TQ==} + dev: false - dot-case@3.0.4: + /dot-case@3.0.4: + resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} dependencies: no-case: 3.0.4 tslib: 2.6.2 + dev: false - dot-prop@6.0.1: + /dot-prop@6.0.1: + resolution: {integrity: sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==} + engines: {node: '>=10'} dependencies: is-obj: 2.0.0 + dev: true - eastasianwidth@0.2.0: {} + /eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + dev: true - elkjs@0.9.3: {} + /elkjs@0.9.3: + resolution: {integrity: sha512-f/ZeWvW/BCXbhGEf1Ujp29EASo/lk1FDnETgNKwJrsVvGZhUWCZyg3xLJjAsxfOmt8KjswHmI5EwCQcPMpOYhQ==} + dev: false - elliptic@6.5.4: + /elliptic@6.5.4: + resolution: {integrity: sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==} dependencies: bn.js: 4.12.0 brorand: 1.1.0 @@ -5470,26 +2962,45 @@ snapshots: inherits: 2.0.4 minimalistic-assert: 1.0.1 minimalistic-crypto-utils: 1.0.1 + dev: true - emoji-regex@10.3.0: {} + /emoji-regex@10.3.0: + resolution: {integrity: sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==} + dev: true - emoji-regex@8.0.0: {} + /emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + dev: true - emoji-regex@9.2.2: {} + /emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + dev: true - entities@4.5.0: {} + /entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + dev: false - error-ex@1.3.2: + /error-ex@1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} dependencies: is-arrayish: 0.2.1 + dev: true - es-define-property@1.0.0: + /es-define-property@1.0.0: + resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} + engines: {node: '>= 0.4'} dependencies: get-intrinsic: 1.2.4 + dev: false - es-errors@1.3.0: {} + /es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + dev: false - es-get-iterator@1.1.3: + /es-get-iterator@1.1.3: + resolution: {integrity: sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==} dependencies: call-bind: 1.0.7 get-intrinsic: 1.2.4 @@ -5500,14 +3011,26 @@ snapshots: is-string: 1.0.7 isarray: 2.0.5 stop-iteration-iterator: 1.0.0 + dev: false - escape-string-regexp@1.0.5: {} + /escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} - escape-string-regexp@4.0.0: {} + /escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + dev: true - escape-string-regexp@5.0.0: {} + /escape-string-regexp@5.0.0: + resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} + engines: {node: '>=12'} - eslint-mdx@2.3.4(eslint@8.57.0): + /eslint-mdx@2.3.4(eslint@8.57.0): + resolution: {integrity: sha512-u4NszEUyoGtR7Q0A4qs0OymsEQdCO6yqWlTzDa9vGWsK7aMotdnW0hqifHTkf6lEtA2vHk2xlkWHTCrhYLyRbw==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + peerDependencies: + eslint: '>=8.0.0' dependencies: acorn: 8.11.3 acorn-jsx: 5.3.2(acorn@8.11.3) @@ -5526,15 +3049,25 @@ snapshots: vfile: 5.3.7 transitivePeerDependencies: - supports-color + dev: true - eslint-plugin-markdown@3.0.1(eslint@8.57.0): + /eslint-plugin-markdown@3.0.1(eslint@8.57.0): + resolution: {integrity: sha512-8rqoc148DWdGdmYF6WSQFT3uQ6PO7zXYgeBpHAOAakX/zpq+NvFYbDA/H7PYzHajwtmaOzAwfxyl++x0g1/N9A==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: eslint: 8.57.0 mdast-util-from-markdown: 0.8.5 transitivePeerDependencies: - supports-color + dev: true - eslint-plugin-mdx@2.3.4(eslint@8.57.0): + /eslint-plugin-mdx@2.3.4(eslint@8.57.0): + resolution: {integrity: sha512-kr6tgaifKL+AVGYMtdYc2VCsIjfYQXuUCKz4rK58d2DpnPFHrmgXIOC7NcMvaEld+VOEpxBSCCnjnsf4IVCQGg==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + peerDependencies: + eslint: '>=8.0.0' dependencies: eslint: 8.57.0 eslint-mdx: 2.3.4(eslint@8.57.0) @@ -5547,15 +3080,25 @@ snapshots: vfile: 5.3.7 transitivePeerDependencies: - supports-color + dev: true - eslint-scope@7.2.2: + /eslint-scope@7.2.2: + resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: esrecurse: 4.3.0 estraverse: 5.3.0 + dev: true - eslint-visitor-keys@3.4.3: {} + /eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true - eslint@8.57.0: + /eslint@8.57.0: + resolution: {integrity: sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + hasBin: true dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) '@eslint-community/regexpp': 4.10.0 @@ -5597,70 +3140,107 @@ snapshots: text-table: 0.2.0 transitivePeerDependencies: - supports-color + dev: true - espree@9.6.1: + /espree@9.6.1: + resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: acorn: 8.11.3 acorn-jsx: 5.3.2(acorn@8.11.3) eslint-visitor-keys: 3.4.3 + dev: true - esprima@4.0.1: {} + /esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true - esquery@1.5.0: + /esquery@1.5.0: + resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} + engines: {node: '>=0.10'} dependencies: estraverse: 5.3.0 + dev: true - esrecurse@4.3.0: + /esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} dependencies: estraverse: 5.3.0 + dev: true - estraverse@5.3.0: {} + /estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + dev: true - estree-util-attach-comments@2.1.1: + /estree-util-attach-comments@2.1.1: + resolution: {integrity: sha512-+5Ba/xGGS6mnwFbXIuQiDPTbuTxuMCooq3arVv7gPZtYpjp+VXH/NkHAP35OOefPhNG/UGqU3vt/LTABwcHX0w==} dependencies: '@types/estree': 1.0.5 + dev: false - estree-util-build-jsx@2.2.2: + /estree-util-build-jsx@2.2.2: + resolution: {integrity: sha512-m56vOXcOBuaF+Igpb9OPAy7f9w9OIkb5yhjsZuaPm7HoGi4oTOQi0h2+yZ+AtKklYFZ+rPC4n0wYCJCEU1ONqg==} dependencies: '@types/estree-jsx': 1.0.5 estree-util-is-identifier-name: 2.1.0 estree-walker: 3.0.3 + dev: false - estree-util-is-identifier-name@2.1.0: {} + /estree-util-is-identifier-name@2.1.0: + resolution: {integrity: sha512-bEN9VHRyXAUOjkKVQVvArFym08BTWB0aJPppZZr0UNyAqWsLaVfAqP7hbaTJjzHifmB5ebnR8Wm7r7yGN/HonQ==} - estree-util-to-js@1.2.0: + /estree-util-to-js@1.2.0: + resolution: {integrity: sha512-IzU74r1PK5IMMGZXUVZbmiu4A1uhiPgW5hm1GjcOfr4ZzHaMPpLNJjR7HjXiIOzi25nZDrgFTobHTkV5Q6ITjA==} dependencies: '@types/estree-jsx': 1.0.5 astring: 1.8.6 source-map: 0.7.4 + dev: false - estree-util-value-to-estree@1.3.0: + /estree-util-value-to-estree@1.3.0: + resolution: {integrity: sha512-Y+ughcF9jSUJvncXwqRageavjrNPAI+1M/L3BI3PyLp1nmgYTGUXU6t5z1Y7OWuThoDdhPME07bQU+d5LxdJqw==} + engines: {node: '>=12.0.0'} dependencies: is-plain-obj: 3.0.0 + dev: false - estree-util-visit@1.2.1: + /estree-util-visit@1.2.1: + resolution: {integrity: sha512-xbgqcrkIVbIG+lI/gzbvd9SGTJL4zqJKBFttUl5pP27KhAjtMKbX/mQXJ7qgyXpMgVy/zvpm0xoQQaGL8OloOw==} dependencies: '@types/estree-jsx': 1.0.5 '@types/unist': 2.0.10 - estree-walker@3.0.3: + /estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} dependencies: '@types/estree': 1.0.5 + dev: false - esutils@2.0.3: {} + /esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + dev: true - ethereum-bloom-filters@1.1.0: + /ethereum-bloom-filters@1.1.0: + resolution: {integrity: sha512-J1gDRkLpuGNvWYzWslBQR9cDV4nd4kfvVTE/Wy4Kkm4yb3EYRSlyi0eB/inTsSTTVyA0+HyzHgbr95Fn/Z1fSw==} dependencies: '@noble/hashes': 1.4.0 + dev: true - ethereum-cryptography@2.1.3: + /ethereum-cryptography@2.1.3: + resolution: {integrity: sha512-BlwbIL7/P45W8FGW2r7LGuvoEZ+7PWsniMvQ4p5s2xCyw9tmaDlpfsN9HjAucbF+t/qpVHwZUisgfK24TCW8aA==} dependencies: '@noble/curves': 1.3.0 '@noble/hashes': 1.3.3 '@scure/bip32': 1.3.3 '@scure/bip39': 1.2.2 + dev: true - ethers@5.7.2: + /ethers@5.7.2: + resolution: {integrity: sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==} dependencies: '@ethersproject/abi': 5.7.0 '@ethersproject/abstract-provider': 5.7.0 @@ -5695,13 +3275,19 @@ snapshots: transitivePeerDependencies: - bufferutil - utf-8-validate + dev: true - ethjs-unit@0.1.6: + /ethjs-unit@0.1.6: + resolution: {integrity: sha512-/Sn9Y0oKl0uqQuvgFk/zQgR7aw1g36qX/jzSQ5lSwlO0GigPymk4eGQfeNTD03w1dPOqfz8V77Cy43jH56pagw==} + engines: {node: '>=6.5.0', npm: '>=3'} dependencies: bn.js: 4.11.6 number-to-bn: 1.7.0 + dev: true - execa@0.8.0: + /execa@0.8.0: + resolution: {integrity: sha512-zDWS+Rb1E8BlqqhALSt9kUhss8Qq4nN3iof3gsOdyINksElaPyNBtKUMTR62qhvgVWR0CqCX7sdnKe4MnUbFEA==} + engines: {node: '>=4'} dependencies: cross-spawn: 5.1.0 get-stream: 3.0.0 @@ -5710,141 +3296,234 @@ snapshots: p-finally: 1.0.0 signal-exit: 3.0.7 strip-eof: 1.0.0 + dev: false - extend-shallow@2.0.1: + /extend-shallow@2.0.1: + resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} + engines: {node: '>=0.10.0'} dependencies: is-extendable: 0.1.1 - extend@3.0.2: {} + /extend@3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} - fast-deep-equal@3.1.3: {} + /fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + dev: true - fast-equals@5.0.1: {} + /fast-equals@5.0.1: + resolution: {integrity: sha512-WF1Wi8PwwSY7/6Kx0vKXtw8RwuSGoM1bvDaJbu7MxDlR1vovZjIAKrnzyrThgAjm6JDTu0fVgWXDlMGspodfoQ==} + engines: {node: '>=6.0.0'} + dev: true - fast-glob@3.3.2: + /fast-glob@3.3.2: + resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + engines: {node: '>=8.6.0'} dependencies: '@nodelib/fs.stat': 2.0.5 '@nodelib/fs.walk': 1.2.8 glob-parent: 5.1.2 merge2: 1.4.1 - micromatch: 4.0.8 + micromatch: 4.0.5 - fast-json-stable-stringify@2.1.0: {} + /fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + dev: true - fast-levenshtein@2.0.6: {} + /fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + dev: true - fastq@1.17.1: + /fastq@1.17.1: + resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} dependencies: reusify: 1.0.4 - fault@2.0.1: + /fault@2.0.1: + resolution: {integrity: sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ==} dependencies: format: 0.2.2 + dev: true - file-entry-cache@6.0.1: + /file-entry-cache@6.0.1: + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} + engines: {node: ^10.12.0 || >=12.0.0} dependencies: flat-cache: 3.2.0 + dev: true - file-entry-cache@8.0.0: + /file-entry-cache@8.0.0: + resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} + engines: {node: '>=16.0.0'} dependencies: flat-cache: 4.0.1 + dev: true - fill-range@7.1.1: + /fill-range@7.0.1: + resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + engines: {node: '>=8'} dependencies: to-regex-range: 5.0.1 - find-up-simple@1.0.0: {} + /find-up-simple@1.0.0: + resolution: {integrity: sha512-q7Us7kcjj2VMePAa02hDAF6d+MzsdsAWEwYyOpwUtlerRBkOEPBCRZrAV4XfcSN8fHAgaD0hP7miwoay6DCprw==} + engines: {node: '>=18'} + dev: true - find-up@5.0.0: + /find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} dependencies: locate-path: 6.0.0 path-exists: 4.0.0 + dev: true - find-up@6.3.0: + /find-up@6.3.0: + resolution: {integrity: sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dependencies: locate-path: 7.2.0 path-exists: 5.0.0 + dev: true - flat-cache@3.2.0: + /flat-cache@3.2.0: + resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} + engines: {node: ^10.12.0 || >=12.0.0} dependencies: flatted: 3.3.1 keyv: 4.5.4 rimraf: 3.0.2 + dev: true - flat-cache@4.0.1: + /flat-cache@4.0.1: + resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} + engines: {node: '>=16'} dependencies: flatted: 3.3.1 keyv: 4.5.4 + dev: true - flatted@3.3.1: {} + /flatted@3.3.1: + resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} + dev: true - flexsearch@0.7.43: {} + /flexsearch@0.7.43: + resolution: {integrity: sha512-c5o/+Um8aqCSOXGcZoqZOm+NqtVwNsvVpWv6lfmSclU954O3wvQKxxK8zj74fPaSJbXpSLTs4PRhh+wnoCXnKg==} + dev: false - focus-visible@5.2.0: {} + /focus-visible@5.2.0: + resolution: {integrity: sha512-Rwix9pBtC1Nuy5wysTmKy+UjbDJpIfg8eHjw0rjZ1mX4GNLz1Bmd16uDpI3Gk1i70Fgcs8Csg2lPm8HULFg9DQ==} + dev: false - for-each@0.3.3: + /for-each@0.3.3: + resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} dependencies: is-callable: 1.2.7 + dev: false - foreground-child@3.1.1: + /foreground-child@3.1.1: + resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} + engines: {node: '>=14'} dependencies: cross-spawn: 7.0.3 signal-exit: 4.1.0 + dev: true - format@0.2.2: {} + /format@0.2.2: + resolution: {integrity: sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==} + engines: {node: '>=0.4.x'} + dev: true - fs.realpath@1.0.0: {} + /fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + dev: true - function-bind@1.1.2: {} + /function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + dev: false - functions-have-names@1.2.3: {} + /functions-have-names@1.2.3: + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + dev: false - gensequence@7.0.0: {} + /gensequence@7.0.0: + resolution: {integrity: sha512-47Frx13aZh01afHJTB3zTtKIlFI6vWY+MYCN9Qpew6i52rfKjnhCF/l1YlC8UmEMvvntZZ6z4PiCcmyuedR2aQ==} + engines: {node: '>=18'} + dev: true - get-func-name@2.0.2: {} + /get-func-name@2.0.2: + resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} + dev: true - get-intrinsic@1.2.4: + /get-intrinsic@1.2.4: + resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} + engines: {node: '>= 0.4'} dependencies: es-errors: 1.3.0 function-bind: 1.1.2 has-proto: 1.0.3 has-symbols: 1.0.3 hasown: 2.0.2 + dev: false - get-stdin@9.0.0: {} + /get-stdin@9.0.0: + resolution: {integrity: sha512-dVKBjfWisLAicarI2Sf+JuBE/DghV4UzNAVe9yhEJuzeREd3JhOTE9cUaJTeSa77fsbQUK3pcOpJfM59+VKZaA==} + engines: {node: '>=12'} + dev: true - get-stream@3.0.0: {} + /get-stream@3.0.0: + resolution: {integrity: sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==} + engines: {node: '>=4'} + dev: false - git-up@7.0.0: + /git-up@7.0.0: + resolution: {integrity: sha512-ONdIrbBCFusq1Oy0sC71F5azx8bVkvtZtMJAsv+a6lz5YAmbNnLD6HAB4gptHZVLPR8S2/kVN6Gab7lryq5+lQ==} dependencies: is-ssh: 1.4.0 parse-url: 8.1.0 + dev: false - git-url-parse@13.1.1: + /git-url-parse@13.1.1: + resolution: {integrity: sha512-PCFJyeSSdtnbfhSNRw9Wk96dDCNx+sogTe4YNXeXSJxt7xz5hvXekuRn9JX7m+Mf4OscCu8h+mtAl3+h5Fo8lQ==} dependencies: git-up: 7.0.0 + dev: false - github-slugger@1.5.0: {} + /github-slugger@1.5.0: + resolution: {integrity: sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw==} + dev: true - github-slugger@2.0.0: {} + /github-slugger@2.0.0: + resolution: {integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==} + dev: false - glob-parent@5.1.2: + /glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} dependencies: is-glob: 4.0.3 - glob-parent@6.0.2: + /glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} dependencies: is-glob: 4.0.3 + dev: true - glob@10.3.12: + /glob@10.3.12: + resolution: {integrity: sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true dependencies: foreground-child: 3.1.1 jackspeak: 2.3.6 minimatch: 9.0.4 minipass: 7.0.4 path-scurry: 1.10.2 + dev: true - glob@7.2.3: + /glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} dependencies: fs.realpath: 1.0.0 inflight: 1.0.6 @@ -5852,24 +3531,36 @@ snapshots: minimatch: 3.1.2 once: 1.4.0 path-is-absolute: 1.0.1 + dev: true - glob@8.1.0: + /glob@8.1.0: + resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} + engines: {node: '>=12'} dependencies: fs.realpath: 1.0.0 inflight: 1.0.6 inherits: 2.0.4 minimatch: 5.1.6 once: 1.4.0 + dev: true - global-directory@4.0.1: + /global-directory@4.0.1: + resolution: {integrity: sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==} + engines: {node: '>=18'} dependencies: ini: 4.1.1 + dev: true - globals@13.24.0: + /globals@13.24.0: + resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} + engines: {node: '>=8'} dependencies: type-fest: 0.20.2 + dev: true - globby@11.1.0: + /globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} dependencies: array-union: 2.1.0 dir-glob: 3.0.1 @@ -5877,73 +3568,117 @@ snapshots: ignore: 5.3.1 merge2: 1.4.1 slash: 3.0.0 + dev: true - gopd@1.0.1: + /gopd@1.0.1: + resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} dependencies: get-intrinsic: 1.2.4 + dev: false - graceful-fs@4.2.11: {} + /graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - graphemer@1.4.0: {} + /graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + dev: true - gray-matter@4.0.3: + /gray-matter@4.0.3: + resolution: {integrity: sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==} + engines: {node: '>=6.0'} dependencies: js-yaml: 3.14.1 kind-of: 6.0.3 section-matter: 1.0.0 strip-bom-string: 1.0.0 - has-bigints@1.0.2: {} + /has-bigints@1.0.2: + resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} + dev: false - has-flag@2.0.0: {} + /has-flag@2.0.0: + resolution: {integrity: sha512-P+1n3MnwjR/Epg9BBo1KT8qbye2g2Ou4sFumihwt6I4tsUX7jnLcX4BTOSKg/B1ZrIYMN9FcEnG4x5a7NB8Eng==} + engines: {node: '>=0.10.0'} + dev: false - has-flag@3.0.0: {} + /has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} - has-flag@4.0.0: {} + /has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} - has-own-prop@2.0.0: {} + /has-own-prop@2.0.0: + resolution: {integrity: sha512-Pq0h+hvsVm6dDEa8x82GnLSYHOzNDt7f0ddFa3FqcQlgzEiptPqL+XrOJNavjOzSYiYWIrgeVYYgGlLmnxwilQ==} + engines: {node: '>=8'} + dev: true - has-property-descriptors@1.0.2: + /has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} dependencies: es-define-property: 1.0.0 + dev: false - has-proto@1.0.3: {} + /has-proto@1.0.3: + resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} + engines: {node: '>= 0.4'} + dev: false - has-symbols@1.0.3: {} + /has-symbols@1.0.3: + resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + engines: {node: '>= 0.4'} + dev: false - has-tostringtag@1.0.2: + /has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} dependencies: has-symbols: 1.0.3 + dev: false - hash-obj@4.0.0: + /hash-obj@4.0.0: + resolution: {integrity: sha512-FwO1BUVWkyHasWDW4S8o0ssQXjvyghLV2rfVhnN36b2bbcj45eGiuzdn9XOvOpjV3TKQD7Gm2BWNXdE9V4KKYg==} + engines: {node: '>=12'} dependencies: is-obj: 3.0.0 sort-keys: 5.0.0 type-fest: 1.4.0 + dev: false - hash.js@1.1.7: + /hash.js@1.1.7: + resolution: {integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==} dependencies: inherits: 2.0.4 minimalistic-assert: 1.0.1 + dev: true - hasown@2.0.2: + /hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} dependencies: function-bind: 1.1.2 + dev: false - hast-util-from-dom@5.0.0: + /hast-util-from-dom@5.0.0: + resolution: {integrity: sha512-d6235voAp/XR3Hh5uy7aGLbM3S4KamdW0WEgOaU1YoewnuYw4HXb5eRtv9g65m/RFGEfUY1Mw4UqCc5Y8L4Stg==} dependencies: '@types/hast': 3.0.4 hastscript: 8.0.0 web-namespaces: 2.0.1 + dev: false - hast-util-from-html-isomorphic@2.0.0: + /hast-util-from-html-isomorphic@2.0.0: + resolution: {integrity: sha512-zJfpXq44yff2hmE0XmwEOzdWin5xwH+QIhMLOScpX91e/NSGPsAzNCvLQDIEPyO2TXi+lBmU6hjLIhV8MwP2kw==} dependencies: '@types/hast': 3.0.4 hast-util-from-dom: 5.0.0 hast-util-from-html: 2.0.1 unist-util-remove-position: 5.0.0 + dev: false - hast-util-from-html@2.0.1: + /hast-util-from-html@2.0.1: + resolution: {integrity: sha512-RXQBLMl9kjKVNkJTIO6bZyb2n+cUH8LFaSSzo82jiLT6Tfc+Pt7VQCS+/h3YwG4jaNE2TA2sdJisGWR+aJrp0g==} dependencies: '@types/hast': 3.0.4 devlop: 1.1.0 @@ -5951,8 +3686,10 @@ snapshots: parse5: 7.1.2 vfile: 6.0.1 vfile-message: 4.0.2 + dev: false - hast-util-from-parse5@8.0.1: + /hast-util-from-parse5@8.0.1: + resolution: {integrity: sha512-Er/Iixbc7IEa7r/XLtuG52zoqn/b3Xng/w6aZQ0xGVxzhw5xUFxcRqdPzP6yFi/4HBYRaifaI5fQ1RH8n0ZeOQ==} dependencies: '@types/hast': 3.0.4 '@types/unist': 3.0.2 @@ -5962,16 +3699,22 @@ snapshots: vfile: 6.0.1 vfile-location: 5.0.2 web-namespaces: 2.0.1 + dev: false - hast-util-is-element@3.0.0: + /hast-util-is-element@3.0.0: + resolution: {integrity: sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==} dependencies: '@types/hast': 3.0.4 + dev: false - hast-util-parse-selector@4.0.0: + /hast-util-parse-selector@4.0.0: + resolution: {integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==} dependencies: '@types/hast': 3.0.4 + dev: false - hast-util-raw@9.0.2: + /hast-util-raw@9.0.2: + resolution: {integrity: sha512-PldBy71wO9Uq1kyaMch9AHIghtQvIwxBUkv823pKmkTM3oV1JxtsTNYdevMxvUHqcnOAuO65JKU2+0NOxc2ksA==} dependencies: '@types/hast': 3.0.4 '@types/unist': 3.0.2 @@ -5986,8 +3729,10 @@ snapshots: vfile: 6.0.1 web-namespaces: 2.0.1 zwitch: 2.0.4 + dev: false - hast-util-to-estree@2.3.3: + /hast-util-to-estree@2.3.3: + resolution: {integrity: sha512-ihhPIUPxN0v0w6M5+IiAZZrn0LH2uZomeWwhn7uP7avZC6TE7lIiEh2yBMPr5+zi1aUCXq6VoYRgs2Bw9xmycQ==} dependencies: '@types/estree': 1.0.5 '@types/estree-jsx': 1.0.5 @@ -6006,8 +3751,10 @@ snapshots: zwitch: 2.0.4 transitivePeerDependencies: - supports-color + dev: false - hast-util-to-parse5@8.0.0: + /hast-util-to-parse5@8.0.0: + resolution: {integrity: sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==} dependencies: '@types/hast': 3.0.4 comma-separated-tokens: 2.0.3 @@ -6016,344 +3763,594 @@ snapshots: space-separated-tokens: 2.0.2 web-namespaces: 2.0.1 zwitch: 2.0.4 + dev: false - hast-util-to-text@4.0.2: + /hast-util-to-text@4.0.2: + resolution: {integrity: sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A==} dependencies: '@types/hast': 3.0.4 '@types/unist': 3.0.2 hast-util-is-element: 3.0.0 unist-util-find-after: 5.0.0 + dev: false - hast-util-whitespace@2.0.1: {} + /hast-util-whitespace@2.0.1: + resolution: {integrity: sha512-nAxA0v8+vXSBDt3AnRUNjyRIQ0rD+ntpbAp4LnPkumc5M9yUbSMa4XDU9Q6etY4f1Wp4bNgvc1yjiZtsTTrSng==} + dev: false - hastscript@8.0.0: + /hastscript@8.0.0: + resolution: {integrity: sha512-dMOtzCEd3ABUeSIISmrETiKuyydk1w0pa+gE/uormcTpSYuaNJPbX1NU3JLyscSLjwAQM8bWMhhIlnCqnRvDTw==} dependencies: '@types/hast': 3.0.4 comma-separated-tokens: 2.0.3 hast-util-parse-selector: 4.0.0 property-information: 6.5.0 space-separated-tokens: 2.0.2 + dev: false - header-case@2.0.4: + /header-case@2.0.4: + resolution: {integrity: sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q==} dependencies: capital-case: 1.0.4 tslib: 2.6.2 + dev: false - hmac-drbg@1.0.1: + /hmac-drbg@1.0.1: + resolution: {integrity: sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==} dependencies: hash.js: 1.1.7 minimalistic-assert: 1.0.1 minimalistic-crypto-utils: 1.0.1 + dev: true - html-void-elements@3.0.0: {} + /html-void-elements@3.0.0: + resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} + dev: false - iconv-lite@0.6.3: + /iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} dependencies: safer-buffer: 2.1.2 + dev: false - ignore@5.3.1: {} + /ignore@5.3.1: + resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} + engines: {node: '>= 4'} + dev: true - import-fresh@3.3.0: + /import-fresh@3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} dependencies: parent-module: 1.0.1 resolve-from: 4.0.0 + dev: true - import-meta-resolve@2.2.2: {} + /import-meta-resolve@2.2.2: + resolution: {integrity: sha512-f8KcQ1D80V7RnqVm+/lirO9zkOxjGxhaTC1IPrBGd3MEfNgmNG67tSUO9gTi2F3Blr2Az6g1vocaxzkVnWl9MA==} + dev: true - import-meta-resolve@4.1.0: {} + /import-meta-resolve@4.1.0: + resolution: {integrity: sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==} + dev: true - imurmurhash@0.1.4: {} + /imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + dev: true - inflight@1.0.6: + /inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} dependencies: once: 1.4.0 wrappy: 1.0.2 + dev: true - inherits@2.0.4: {} + /inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + dev: true - ini@4.1.1: {} + /ini@4.1.1: + resolution: {integrity: sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dev: true - ini@4.1.2: {} + /ini@4.1.2: + resolution: {integrity: sha512-AMB1mvwR1pyBFY/nSevUX6y8nJWS63/SzUKD3JyQn97s4xgIdgQPT75IRouIiBAN4yLQBUShNYVW0+UG25daCw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dev: true - inline-style-parser@0.1.1: {} + /inline-style-parser@0.1.1: + resolution: {integrity: sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==} + dev: false - internal-slot@1.0.7: + /internal-slot@1.0.7: + resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==} + engines: {node: '>= 0.4'} dependencies: es-errors: 1.3.0 hasown: 2.0.2 side-channel: 1.0.6 + dev: false - internmap@1.0.1: {} + /internmap@1.0.1: + resolution: {integrity: sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==} + dev: false - internmap@2.0.3: {} + /internmap@2.0.3: + resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==} + engines: {node: '>=12'} + dev: false - intersection-observer@0.12.2: {} + /intersection-observer@0.12.2: + resolution: {integrity: sha512-7m1vEcPCxXYI8HqnL8CKI6siDyD+eIWSwgB3DZA+ZTogxk9I4CDnj4wilt9x/+/QbHI4YG5YZNmC6458/e9Ktg==} + dev: false - is-alphabetical@1.0.4: {} + /is-alphabetical@1.0.4: + resolution: {integrity: sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==} + dev: true - is-alphabetical@2.0.1: {} + /is-alphabetical@2.0.1: + resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==} - is-alphanumerical@1.0.4: + /is-alphanumerical@1.0.4: + resolution: {integrity: sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==} dependencies: is-alphabetical: 1.0.4 is-decimal: 1.0.4 + dev: true - is-alphanumerical@2.0.1: + /is-alphanumerical@2.0.1: + resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==} dependencies: is-alphabetical: 2.0.1 is-decimal: 2.0.1 - is-arguments@1.1.1: + /is-arguments@1.1.1: + resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} + engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 has-tostringtag: 1.0.2 + dev: false - is-array-buffer@3.0.4: + /is-array-buffer@3.0.4: + resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==} + engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 get-intrinsic: 1.2.4 + dev: false - is-arrayish@0.2.1: {} + /is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + dev: true - is-bigint@1.0.4: + /is-bigint@1.0.4: + resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} dependencies: has-bigints: 1.0.2 + dev: false - is-boolean-object@1.1.2: + /is-boolean-object@1.1.2: + resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} + engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 has-tostringtag: 1.0.2 + dev: false - is-buffer@2.0.5: {} + /is-buffer@2.0.5: + resolution: {integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==} + engines: {node: '>=4'} - is-callable@1.2.7: {} + /is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + dev: false - is-date-object@1.0.5: + /is-date-object@1.0.5: + resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} + engines: {node: '>= 0.4'} dependencies: has-tostringtag: 1.0.2 + dev: false - is-decimal@1.0.4: {} + /is-decimal@1.0.4: + resolution: {integrity: sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==} + dev: true - is-decimal@2.0.1: {} + /is-decimal@2.0.1: + resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} - is-empty@1.2.0: {} + /is-empty@1.2.0: + resolution: {integrity: sha512-F2FnH/otLNJv0J6wc73A5Xo7oHLNnqplYqZhUu01tD54DIPvxIRSTSLkrUB/M0nHO4vo1O9PDfN4KoTxCzLh/w==} + dev: true - is-extendable@0.1.1: {} + /is-extendable@0.1.1: + resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} + engines: {node: '>=0.10.0'} - is-extglob@2.1.1: {} + /is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} - is-fullwidth-code-point@3.0.0: {} + /is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + dev: true - is-glob@4.0.3: + /is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} dependencies: is-extglob: 2.1.1 - is-hex-prefixed@1.0.0: {} + /is-hex-prefixed@1.0.0: + resolution: {integrity: sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA==} + engines: {node: '>=6.5.0', npm: '>=3'} + dev: true - is-hexadecimal@1.0.4: {} + /is-hexadecimal@1.0.4: + resolution: {integrity: sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==} + dev: true - is-hexadecimal@2.0.1: {} + /is-hexadecimal@2.0.1: + resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} - is-map@2.0.3: {} + /is-map@2.0.3: + resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} + engines: {node: '>= 0.4'} + dev: false - is-number-object@1.0.7: + /is-number-object@1.0.7: + resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} + engines: {node: '>= 0.4'} dependencies: has-tostringtag: 1.0.2 + dev: false - is-number@7.0.0: {} + /is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} - is-obj@2.0.0: {} + /is-obj@2.0.0: + resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} + engines: {node: '>=8'} + dev: true - is-obj@3.0.0: {} + /is-obj@3.0.0: + resolution: {integrity: sha512-IlsXEHOjtKhpN8r/tRFj2nDyTmHvcfNeu/nrRIcXE17ROeatXchkojffa1SpdqW4cr/Fj6QkEf/Gn4zf6KKvEQ==} + engines: {node: '>=12'} + dev: false - is-path-inside@3.0.3: {} + /is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + dev: true - is-plain-obj@3.0.0: {} + /is-plain-obj@3.0.0: + resolution: {integrity: sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==} + engines: {node: '>=10'} + dev: false - is-plain-obj@4.1.0: {} + /is-plain-obj@4.1.0: + resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} + engines: {node: '>=12'} - is-reference@3.0.2: + /is-reference@3.0.2: + resolution: {integrity: sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==} dependencies: '@types/estree': 1.0.5 + dev: false - is-regex@1.1.4: + /is-regex@1.1.4: + resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} + engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 has-tostringtag: 1.0.2 + dev: false - is-set@2.0.3: {} + /is-set@2.0.3: + resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} + engines: {node: '>= 0.4'} + dev: false - is-shared-array-buffer@1.0.3: + /is-shared-array-buffer@1.0.3: + resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==} + engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 + dev: false - is-ssh@1.4.0: + /is-ssh@1.4.0: + resolution: {integrity: sha512-x7+VxdxOdlV3CYpjvRLBv5Lo9OJerlYanjwFrPR9fuGPjCiNiCzFgAWpiLAohSbsnH4ZAys3SBh+hq5rJosxUQ==} dependencies: protocols: 2.0.1 + dev: false - is-stream@1.1.0: {} + /is-stream@1.1.0: + resolution: {integrity: sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==} + engines: {node: '>=0.10.0'} + dev: false - is-string@1.0.7: + /is-string@1.0.7: + resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} + engines: {node: '>= 0.4'} dependencies: has-tostringtag: 1.0.2 + dev: false - is-symbol@1.0.4: + /is-symbol@1.0.4: + resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} + engines: {node: '>= 0.4'} dependencies: has-symbols: 1.0.3 + dev: false - is-typedarray@1.0.0: {} + /is-typedarray@1.0.0: + resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} + dev: true - is-weakmap@2.0.2: {} + /is-weakmap@2.0.2: + resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} + engines: {node: '>= 0.4'} + dev: false - is-weakset@2.0.3: + /is-weakset@2.0.3: + resolution: {integrity: sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==} + engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 get-intrinsic: 1.2.4 + dev: false - isarray@2.0.5: {} + /isarray@2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + dev: false - isexe@2.0.0: {} + /isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - isows@1.0.3(ws@8.13.0): + /isows@1.0.3(ws@8.13.0): + resolution: {integrity: sha512-2cKei4vlmg2cxEjm3wVSqn8pcoRF/LX/wpifuuNquFO4SQmPwarClT+SUCA2lt+l581tTeZIPIZuIDo2jWN1fg==} + peerDependencies: + ws: '*' dependencies: ws: 8.13.0 + dev: false - jackspeak@2.3.6: + /jackspeak@2.3.6: + resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} + engines: {node: '>=14'} dependencies: '@isaacs/cliui': 8.0.2 optionalDependencies: '@pkgjs/parseargs': 0.11.0 + dev: true - js-sha3@0.8.0: {} + /js-sha3@0.8.0: + resolution: {integrity: sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==} + dev: true - js-tokens@4.0.0: {} + /js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - js-yaml@3.14.1: + /js-yaml@3.14.1: + resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} + hasBin: true dependencies: argparse: 1.0.10 esprima: 4.0.1 - js-yaml@4.1.0: + /js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true dependencies: argparse: 2.0.1 - json-buffer@3.0.1: {} + /json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + dev: true - json-parse-even-better-errors@2.3.1: {} + /json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + dev: true - json-parse-even-better-errors@3.0.1: {} + /json-parse-even-better-errors@3.0.1: + resolution: {integrity: sha512-aatBvbL26wVUCLmbWdCpeu9iF5wOyWpagiKkInA+kfws3sWdBrTnsvN2CKcyCYyUrc7rebNBlK6+kteg7ksecg==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dev: true - json-schema-traverse@0.4.1: {} + /json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + dev: true - json-schema-traverse@1.0.0: {} + /json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + dev: true - json-stable-stringify-without-jsonify@1.0.1: {} + /json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + dev: true - jsonc-parser@3.2.1: {} + /jsonc-parser@3.2.1: + resolution: {integrity: sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==} + dev: false - katex@0.16.10: + /katex@0.16.10: + resolution: {integrity: sha512-ZiqaC04tp2O5utMsl2TEZTXxa6WSC4yo0fv5ML++D3QZv/vx2Mct0mTlRx3O+uUkjfuAgOkzsCmq5MiUEsDDdA==} + hasBin: true dependencies: commander: 8.3.0 + dev: false - keyv@4.5.4: + /keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} dependencies: json-buffer: 3.0.1 + dev: true - khroma@2.1.0: {} + /khroma@2.1.0: + resolution: {integrity: sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw==} + dev: false - kind-of@6.0.3: {} + /kind-of@6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} - kleur@4.1.5: {} + /kleur@4.1.5: + resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} + engines: {node: '>=6'} - layout-base@1.0.2: {} + /layout-base@1.0.2: + resolution: {integrity: sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==} + dev: false - levn@0.4.1: + /levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} dependencies: prelude-ls: 1.2.1 type-check: 0.4.0 + dev: true - lines-and-columns@2.0.4: {} + /lines-and-columns@2.0.4: + resolution: {integrity: sha512-wM1+Z03eypVAVUCE7QdSqpVIvelbOakn1M0bPDoA4SGWPx3sNDVUiMo3L6To6WWGClB7VyXnhQ4Sn7gxiJbE6A==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: true - load-plugin@5.1.0: + /load-plugin@5.1.0: + resolution: {integrity: sha512-Lg1CZa1CFj2CbNaxijTL6PCbzd4qGTlZov+iH2p5Xwy/ApcZJh+i6jMN2cYePouTfjJfrNu3nXFdEw8LvbjPFQ==} dependencies: '@npmcli/config': 6.4.1 import-meta-resolve: 2.2.2 + dev: true - locate-path@6.0.0: + /locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} dependencies: p-locate: 5.0.0 + dev: true - locate-path@7.2.0: + /locate-path@7.2.0: + resolution: {integrity: sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dependencies: p-locate: 6.0.0 + dev: true - lodash-es@4.17.21: {} + /lodash-es@4.17.21: + resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} + dev: false - lodash.clonedeep@4.5.0: {} + /lodash.clonedeep@4.5.0: + resolution: {integrity: sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==} + dev: true - lodash.get@4.4.2: {} + /lodash.get@4.4.2: + resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} + dev: false - lodash.merge@4.6.2: {} + /lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + dev: true - lodash@4.17.21: {} + /lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + dev: true - longest-streak@3.1.0: {} + /longest-streak@3.1.0: + resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} - loose-envify@1.4.0: + /loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true dependencies: js-tokens: 4.0.0 + dev: false - loupe@2.3.7: + /loupe@2.3.7: + resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} dependencies: get-func-name: 2.0.2 + dev: true - lower-case@2.0.2: + /lower-case@2.0.2: + resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} dependencies: tslib: 2.6.2 + dev: false - lru-cache@10.2.2: {} + /lru-cache@10.2.2: + resolution: {integrity: sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==} + engines: {node: 14 || >=16.14} + dev: true - lru-cache@4.1.5: + /lru-cache@4.1.5: + resolution: {integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==} dependencies: pseudomap: 1.0.2 yallist: 2.1.2 + dev: false - lru-cache@6.0.0: + /lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} dependencies: yallist: 4.0.0 + dev: true - lz-string@1.5.0: {} + /lz-string@1.5.0: + resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} + hasBin: true + dev: false - markdown-extensions@1.1.1: {} + /markdown-extensions@1.1.1: + resolution: {integrity: sha512-WWC0ZuMzCyDHYCasEGs4IPvLyTGftYwh6wIEOULOF0HXcqZlhwRzrK0w2VUlxWA98xnvb/jszw4ZSkJ6ADpM6Q==} + engines: {node: '>=0.10.0'} + dev: false - markdown-table@3.0.3: {} + /markdown-table@3.0.3: + resolution: {integrity: sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==} - match-sorter@6.3.4: + /match-sorter@6.3.4: + resolution: {integrity: sha512-jfZW7cWS5y/1xswZo8VBOdudUiSd9nifYRWphc9M5D/ee4w4AoXLgBEdRbgVaxbMuagBPeUC5y2Hi8DO6o9aDg==} dependencies: '@babel/runtime': 7.24.4 remove-accents: 0.5.0 + dev: false - mdast-comment-marker@2.1.2: + /mdast-comment-marker@2.1.2: + resolution: {integrity: sha512-HED3ezseRVkBzZ0uK4q6RJMdufr/2p3VfVZstE3H1N9K8bwtspztWo6Xd7rEatuGNoCXaBna8oEqMwUn0Ve1bw==} dependencies: '@types/mdast': 3.0.15 mdast-util-mdx-expression: 1.3.2 transitivePeerDependencies: - supports-color + dev: true - mdast-util-definitions@5.1.2: + /mdast-util-definitions@5.1.2: + resolution: {integrity: sha512-8SVPMuHqlPME/z3gqVwWY4zVXn8lqKv/pAhC57FuJ40ImXyBpmO5ukh98zB2v7Blql2FiHjHv9LVztSIqjY+MA==} dependencies: '@types/mdast': 3.0.15 '@types/unist': 2.0.10 unist-util-visit: 4.1.2 + dev: false - mdast-util-find-and-replace@2.2.2: + /mdast-util-find-and-replace@2.2.2: + resolution: {integrity: sha512-MTtdFRz/eMDHXzeK6W3dO7mXUlF82Gom4y0oOgvHhh/HXZAGvIQDUvQ0SuUx+j2tv44b8xTHOm8K/9OoRFnXKw==} dependencies: '@types/mdast': 3.0.15 escape-string-regexp: 5.0.0 unist-util-is: 5.2.1 unist-util-visit-parents: 5.1.3 - mdast-util-from-markdown@0.8.5: + /mdast-util-from-markdown@0.8.5: + resolution: {integrity: sha512-2hkTXtYYnr+NubD/g6KGBS/0mFmBcifAsI0yIWRiRo0PjVs6SSOSOdtzbp6kSGnShDN6G5aWZpKQ2lWRy27mWQ==} dependencies: '@types/mdast': 3.0.15 mdast-util-to-string: 2.0.0 @@ -6362,8 +4359,10 @@ snapshots: unist-util-stringify-position: 2.0.3 transitivePeerDependencies: - supports-color + dev: true - mdast-util-from-markdown@1.3.1: + /mdast-util-from-markdown@1.3.1: + resolution: {integrity: sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww==} dependencies: '@types/mdast': 3.0.15 '@types/unist': 2.0.10 @@ -6380,7 +4379,8 @@ snapshots: transitivePeerDependencies: - supports-color - mdast-util-from-markdown@2.0.0: + /mdast-util-from-markdown@2.0.0: + resolution: {integrity: sha512-n7MTOr/z+8NAX/wmhhDji8O3bRvPTV/U0oTCaZJkjhPSKTPhS3xufVhKGF8s1pJ7Ox4QgoIU7KHseh09S+9rTA==} dependencies: '@types/mdast': 4.0.3 '@types/unist': 3.0.2 @@ -6396,8 +4396,10 @@ snapshots: unist-util-stringify-position: 4.0.0 transitivePeerDependencies: - supports-color + dev: true - mdast-util-frontmatter@2.0.1: + /mdast-util-frontmatter@2.0.1: + resolution: {integrity: sha512-LRqI9+wdgC25P0URIJY9vwocIzCcksduHQ9OF2joxQoyTNVduwLAFUzjoopuRJbJAReaKrNQKAZKL3uCMugWJA==} dependencies: '@types/mdast': 4.0.3 devlop: 1.1.0 @@ -6407,26 +4409,31 @@ snapshots: micromark-extension-frontmatter: 2.0.0 transitivePeerDependencies: - supports-color + dev: true - mdast-util-gfm-autolink-literal@1.0.3: + /mdast-util-gfm-autolink-literal@1.0.3: + resolution: {integrity: sha512-My8KJ57FYEy2W2LyNom4n3E7hKTuQk/0SES0u16tjA9Z3oFkF4RrC/hPAPgjlSpezsOvI8ObcXcElo92wn5IGA==} dependencies: '@types/mdast': 3.0.15 ccount: 2.0.1 mdast-util-find-and-replace: 2.2.2 micromark-util-character: 1.2.0 - mdast-util-gfm-footnote@1.0.2: + /mdast-util-gfm-footnote@1.0.2: + resolution: {integrity: sha512-56D19KOGbE00uKVj3sgIykpwKL179QsVFwx/DCW0u/0+URsryacI4MAdNJl0dh+u2PSsD9FtxPFbHCzJ78qJFQ==} dependencies: '@types/mdast': 3.0.15 mdast-util-to-markdown: 1.5.0 micromark-util-normalize-identifier: 1.1.0 - mdast-util-gfm-strikethrough@1.0.3: + /mdast-util-gfm-strikethrough@1.0.3: + resolution: {integrity: sha512-DAPhYzTYrRcXdMjUtUjKvW9z/FNAMTdU0ORyMcbmkwYNbKocDpdk+PX1L1dQgOID/+vVs1uBQ7ElrBQfZ0cuiQ==} dependencies: '@types/mdast': 3.0.15 mdast-util-to-markdown: 1.5.0 - mdast-util-gfm-table@1.0.7: + /mdast-util-gfm-table@1.0.7: + resolution: {integrity: sha512-jjcpmNnQvrmN5Vx7y7lEc2iIOEytYv7rTvu+MeyAsSHTASGCCRA79Igg2uKssgOs1i1po8s3plW0sTu1wkkLGg==} dependencies: '@types/mdast': 3.0.15 markdown-table: 3.0.3 @@ -6435,12 +4442,14 @@ snapshots: transitivePeerDependencies: - supports-color - mdast-util-gfm-task-list-item@1.0.2: + /mdast-util-gfm-task-list-item@1.0.2: + resolution: {integrity: sha512-PFTA1gzfp1B1UaiJVyhJZA1rm0+Tzn690frc/L8vNX1Jop4STZgOE6bxUhnzdVSB+vm2GU1tIsuQcA9bxTQpMQ==} dependencies: '@types/mdast': 3.0.15 mdast-util-to-markdown: 1.5.0 - mdast-util-gfm@2.0.2: + /mdast-util-gfm@2.0.2: + resolution: {integrity: sha512-qvZ608nBppZ4icQlhQQIAdc6S3Ffj9RGmzwUKUWuEICFnd1LVkN3EktF7ZHAgfcEdvZB5owU9tQgt99e2TlLjg==} dependencies: mdast-util-from-markdown: 1.3.1 mdast-util-gfm-autolink-literal: 1.0.3 @@ -6452,17 +4461,22 @@ snapshots: transitivePeerDependencies: - supports-color - mdast-util-heading-style@2.0.1: + /mdast-util-heading-style@2.0.1: + resolution: {integrity: sha512-0L5rthU4xKDVbw+UQ7D8Y8xOEsX4JXZvemWoEAsL+WAaeSH+TvVVwFnTb3G/OrjyP4VYQULoNWU+PdZfkmNu4A==} dependencies: '@types/mdast': 3.0.15 + dev: true - mdast-util-math@2.0.2: + /mdast-util-math@2.0.2: + resolution: {integrity: sha512-8gmkKVp9v6+Tgjtq6SYx9kGPpTf6FVYRa53/DLh479aldR9AyP48qeVOgNZ5X7QUK7nOy4yw7vg6mbiGcs9jWQ==} dependencies: '@types/mdast': 3.0.15 longest-streak: 3.1.0 mdast-util-to-markdown: 1.5.0 + dev: false - mdast-util-mdx-expression@1.3.2: + /mdast-util-mdx-expression@1.3.2: + resolution: {integrity: sha512-xIPmR5ReJDu/DHH1OoIT1HkuybIfRGYRywC+gJtI7qHjCJp/M9jrmBEJW22O8lskDWm562BX2W8TiAwRTb0rKA==} dependencies: '@types/estree-jsx': 1.0.5 '@types/hast': 2.3.10 @@ -6472,7 +4486,8 @@ snapshots: transitivePeerDependencies: - supports-color - mdast-util-mdx-jsx@2.1.4: + /mdast-util-mdx-jsx@2.1.4: + resolution: {integrity: sha512-DtMn9CmVhVzZx3f+optVDF8yFgQVt7FghCRNdlIaS3X5Bnym3hZwPbg/XW86vdpKjlc1PVj26SpnLGeJBXD3JA==} dependencies: '@types/estree-jsx': 1.0.5 '@types/hast': 2.3.10 @@ -6489,7 +4504,8 @@ snapshots: transitivePeerDependencies: - supports-color - mdast-util-mdx@2.0.1: + /mdast-util-mdx@2.0.1: + resolution: {integrity: sha512-38w5y+r8nyKlGvNjSEqWrhG0w5PmnRA+wnBvm+ulYCct7nsGYhFVb0lljS9bQav4psDAS1eGkP2LMVcZBi/aqw==} dependencies: mdast-util-from-markdown: 1.3.1 mdast-util-mdx-expression: 1.3.2 @@ -6499,7 +4515,8 @@ snapshots: transitivePeerDependencies: - supports-color - mdast-util-mdxjs-esm@1.3.1: + /mdast-util-mdxjs-esm@1.3.1: + resolution: {integrity: sha512-SXqglS0HrEvSdUEfoXFtcg7DRl7S2cwOXc7jkuusG472Mmjag34DUDeOJUZtl+BVnyeO1frIgVpHlNRWc2gk/w==} dependencies: '@types/estree-jsx': 1.0.5 '@types/hast': 2.3.10 @@ -6509,17 +4526,21 @@ snapshots: transitivePeerDependencies: - supports-color - mdast-util-phrasing@3.0.1: + /mdast-util-phrasing@3.0.1: + resolution: {integrity: sha512-WmI1gTXUBJo4/ZmSk79Wcb2HcjPJBzM1nlI/OUWA8yk2X9ik3ffNbBGsU+09BFmXaL1IBb9fiuvq6/KMiNycSg==} dependencies: '@types/mdast': 3.0.15 unist-util-is: 5.2.1 - mdast-util-phrasing@4.1.0: + /mdast-util-phrasing@4.1.0: + resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==} dependencies: '@types/mdast': 4.0.3 unist-util-is: 6.0.0 + dev: true - mdast-util-to-hast@12.3.0: + /mdast-util-to-hast@12.3.0: + resolution: {integrity: sha512-pits93r8PhnIoU4Vy9bjW39M2jJ6/tdHyja9rrot9uujkN7UTU9SDnE6WNJz/IGyQk3XHX6yNNtrBH6cQzm8Hw==} dependencies: '@types/hast': 2.3.10 '@types/mdast': 3.0.15 @@ -6529,8 +4550,10 @@ snapshots: unist-util-generated: 2.0.1 unist-util-position: 4.0.4 unist-util-visit: 4.1.2 + dev: false - mdast-util-to-hast@13.1.0: + /mdast-util-to-hast@13.1.0: + resolution: {integrity: sha512-/e2l/6+OdGp/FB+ctrJ9Avz71AN/GRH3oi/3KAx/kMnoUsD6q0woXlDT8lLEeViVKE7oZxE7RXzvO3T8kF2/sA==} dependencies: '@types/hast': 3.0.4 '@types/mdast': 4.0.3 @@ -6541,8 +4564,10 @@ snapshots: unist-util-position: 5.0.0 unist-util-visit: 5.0.0 vfile: 6.0.1 + dev: false - mdast-util-to-markdown@1.5.0: + /mdast-util-to-markdown@1.5.0: + resolution: {integrity: sha512-bbv7TPv/WC49thZPg3jXuqzuvI45IL2EVAr/KxF0BSdHsU0ceFHOmwQn6evxAh1GaoK/6GQ1wp4R4oW2+LFL/A==} dependencies: '@types/mdast': 3.0.15 '@types/unist': 2.0.10 @@ -6553,7 +4578,8 @@ snapshots: unist-util-visit: 4.1.2 zwitch: 2.0.4 - mdast-util-to-markdown@2.1.0: + /mdast-util-to-markdown@2.1.0: + resolution: {integrity: sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ==} dependencies: '@types/mdast': 4.0.3 '@types/unist': 3.0.2 @@ -6563,28 +4589,40 @@ snapshots: micromark-util-decode-string: 2.0.0 unist-util-visit: 5.0.0 zwitch: 2.0.4 + dev: true - mdast-util-to-string@2.0.0: {} + /mdast-util-to-string@2.0.0: + resolution: {integrity: sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==} + dev: true - mdast-util-to-string@3.2.0: + /mdast-util-to-string@3.2.0: + resolution: {integrity: sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg==} dependencies: '@types/mdast': 3.0.15 - mdast-util-to-string@4.0.0: + /mdast-util-to-string@4.0.0: + resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} dependencies: '@types/mdast': 4.0.3 + dev: true - merge2@1.4.1: {} + /merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} - merkletreejs@0.3.11: + /merkletreejs@0.3.11: + resolution: {integrity: sha512-LJKTl4iVNTndhL+3Uz/tfkjD0klIWsHlUzgtuNnNrsf7bAlXR30m+xYB7lHr5Z/l6e/yAIsr26Dabx6Buo4VGQ==} + engines: {node: '>= 7.6.0'} dependencies: bignumber.js: 9.1.2 buffer-reverse: 1.0.1 crypto-js: 4.2.0 treeify: 1.1.0 web3-utils: 1.10.4 + dev: true - mermaid@10.9.0: + /mermaid@10.9.0: + resolution: {integrity: sha512-swZju0hFox/B/qoLKK0rOxxgh8Cf7rJSfAUc1u8fezVihYMvrJAS45GzAxTVf4Q+xn9uMgitBcmWk7nWGXOs/g==} dependencies: '@braintree/sanitize-url': 6.0.4 '@types/d3-scale': 4.0.8 @@ -6595,7 +4633,7 @@ snapshots: d3-sankey: 0.12.3 dagre-d3-es: 7.0.10 dayjs: 1.11.11 - dompurify: 3.1.7 + dompurify: 3.1.1 elkjs: 0.9.3 katex: 0.16.10 khroma: 2.1.0 @@ -6608,10 +4646,14 @@ snapshots: web-worker: 1.3.0 transitivePeerDependencies: - supports-color + dev: false - micro-ftch@0.3.1: {} + /micro-ftch@0.3.1: + resolution: {integrity: sha512-/0LLxhzP0tfiR5hcQebtudP56gUurs2CLkGarnCiB/OqEyUFQ6U3paQi/tgLv0hBJYt2rnr9MNpxz4fiiugstg==} + dev: true - micromark-core-commonmark@1.1.0: + /micromark-core-commonmark@1.1.0: + resolution: {integrity: sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw==} dependencies: decode-named-character-reference: 1.0.2 micromark-factory-destination: 1.1.0 @@ -6630,7 +4672,8 @@ snapshots: micromark-util-types: 1.1.0 uvu: 0.5.6 - micromark-core-commonmark@2.0.1: + /micromark-core-commonmark@2.0.1: + resolution: {integrity: sha512-CUQyKr1e///ZODyD1U3xit6zXwy1a8q2a1S1HKtIlmgvurrEpaw/Y9y6KSIbF8P59cn/NjzHyO+Q2fAyYLQrAA==} dependencies: decode-named-character-reference: 1.0.2 devlop: 1.1.0 @@ -6648,22 +4691,27 @@ snapshots: micromark-util-subtokenize: 2.0.1 micromark-util-symbol: 2.0.0 micromark-util-types: 2.0.0 + dev: true - micromark-extension-frontmatter@2.0.0: + /micromark-extension-frontmatter@2.0.0: + resolution: {integrity: sha512-C4AkuM3dA58cgZha7zVnuVxBhDsbttIMiytjgsM2XbHAB2faRVaHRle40558FBN+DJcrLNCoqG5mlrpdU4cRtg==} dependencies: fault: 2.0.1 micromark-util-character: 2.1.0 micromark-util-symbol: 2.0.0 micromark-util-types: 2.0.0 + dev: true - micromark-extension-gfm-autolink-literal@1.0.5: + /micromark-extension-gfm-autolink-literal@1.0.5: + resolution: {integrity: sha512-z3wJSLrDf8kRDOh2qBtoTRD53vJ+CWIyo7uyZuxf/JAbNJjiHsOpG1y5wxk8drtv3ETAHutCu6N3thkOOgueWg==} dependencies: micromark-util-character: 1.2.0 micromark-util-sanitize-uri: 1.2.0 micromark-util-symbol: 1.1.0 micromark-util-types: 1.1.0 - micromark-extension-gfm-footnote@1.1.2: + /micromark-extension-gfm-footnote@1.1.2: + resolution: {integrity: sha512-Yxn7z7SxgyGWRNa4wzf8AhYYWNrwl5q1Z8ii+CSTTIqVkmGZF1CElX2JI8g5yGoM3GAman9/PVCUFUSJ0kB/8Q==} dependencies: micromark-core-commonmark: 1.1.0 micromark-factory-space: 1.1.0 @@ -6674,7 +4722,8 @@ snapshots: micromark-util-types: 1.1.0 uvu: 0.5.6 - micromark-extension-gfm-strikethrough@1.0.7: + /micromark-extension-gfm-strikethrough@1.0.7: + resolution: {integrity: sha512-sX0FawVE1o3abGk3vRjOH50L5TTLr3b5XMqnP9YDRb34M0v5OoZhG+OHFz1OffZ9dlwgpTBKaT4XW/AsUVnSDw==} dependencies: micromark-util-chunked: 1.1.0 micromark-util-classify-character: 1.1.0 @@ -6683,7 +4732,8 @@ snapshots: micromark-util-types: 1.1.0 uvu: 0.5.6 - micromark-extension-gfm-table@1.0.7: + /micromark-extension-gfm-table@1.0.7: + resolution: {integrity: sha512-3ZORTHtcSnMQEKtAOsBQ9/oHp9096pI/UvdPtN7ehKvrmZZ2+bbWhi0ln+I9drmwXMt5boocn6OlwQzNXeVeqw==} dependencies: micromark-factory-space: 1.1.0 micromark-util-character: 1.2.0 @@ -6691,11 +4741,13 @@ snapshots: micromark-util-types: 1.1.0 uvu: 0.5.6 - micromark-extension-gfm-tagfilter@1.0.2: + /micromark-extension-gfm-tagfilter@1.0.2: + resolution: {integrity: sha512-5XWB9GbAUSHTn8VPU8/1DBXMuKYT5uOgEjJb8gN3mW0PNW5OPHpSdojoqf+iq1xo7vWzw/P8bAHY0n6ijpXF7g==} dependencies: micromark-util-types: 1.1.0 - micromark-extension-gfm-task-list-item@1.0.5: + /micromark-extension-gfm-task-list-item@1.0.5: + resolution: {integrity: sha512-RMFXl2uQ0pNQy6Lun2YBYT9g9INXtWJULgbt01D/x8/6yJ2qpKyzdZD3pi6UIkzF++Da49xAelVKUeUMqd5eIQ==} dependencies: micromark-factory-space: 1.1.0 micromark-util-character: 1.2.0 @@ -6703,7 +4755,8 @@ snapshots: micromark-util-types: 1.1.0 uvu: 0.5.6 - micromark-extension-gfm@2.0.3: + /micromark-extension-gfm@2.0.3: + resolution: {integrity: sha512-vb9OoHqrhCmbRidQv/2+Bc6pkP0FrtlhurxZofvOEy5o8RtuuvTq+RQ1Vw5ZDNrVraQZu3HixESqbG+0iKk/MQ==} dependencies: micromark-extension-gfm-autolink-literal: 1.0.5 micromark-extension-gfm-footnote: 1.1.2 @@ -6714,7 +4767,8 @@ snapshots: micromark-util-combine-extensions: 1.1.0 micromark-util-types: 1.1.0 - micromark-extension-math@2.1.2: + /micromark-extension-math@2.1.2: + resolution: {integrity: sha512-es0CcOV89VNS9wFmyn+wyFTKweXGW4CEvdaAca6SWRWPyYCbBisnjaHLjWO4Nszuiud84jCpkHsqAJoa768Pvg==} dependencies: '@types/katex': 0.16.7 katex: 0.16.10 @@ -6723,8 +4777,10 @@ snapshots: micromark-util-symbol: 1.1.0 micromark-util-types: 1.1.0 uvu: 0.5.6 + dev: false - micromark-extension-mdx-expression@1.0.8: + /micromark-extension-mdx-expression@1.0.8: + resolution: {integrity: sha512-zZpeQtc5wfWKdzDsHRBY003H2Smg+PUi2REhqgIhdzAa5xonhP03FcXxqFSerFiNUr5AWmHpaNPQTBVOS4lrXw==} dependencies: '@types/estree': 1.0.5 micromark-factory-mdx-expression: 1.0.9 @@ -6735,7 +4791,8 @@ snapshots: micromark-util-types: 1.1.0 uvu: 0.5.6 - micromark-extension-mdx-jsx@1.0.5: + /micromark-extension-mdx-jsx@1.0.5: + resolution: {integrity: sha512-gPH+9ZdmDflbu19Xkb8+gheqEDqkSpdCEubQyxuz/Hn8DOXiXvrXeikOoBA71+e8Pfi0/UYmU3wW3H58kr7akA==} dependencies: '@types/acorn': 4.0.6 '@types/estree': 1.0.5 @@ -6748,11 +4805,13 @@ snapshots: uvu: 0.5.6 vfile-message: 3.1.4 - micromark-extension-mdx-md@1.0.1: + /micromark-extension-mdx-md@1.0.1: + resolution: {integrity: sha512-7MSuj2S7xjOQXAjjkbjBsHkMtb+mDGVW6uI2dBL9snOBCbZmoNgDAeZ0nSn9j3T42UE/g2xVNMn18PJxZvkBEA==} dependencies: micromark-util-types: 1.1.0 - micromark-extension-mdxjs-esm@1.0.5: + /micromark-extension-mdxjs-esm@1.0.5: + resolution: {integrity: sha512-xNRBw4aoURcyz/S69B19WnZAkWJMxHMT5hE36GtDAyhoyn/8TuAeqjFJQlwk+MKQsUD7b3l7kFX+vlfVWgcX1w==} dependencies: '@types/estree': 1.0.5 micromark-core-commonmark: 1.1.0 @@ -6764,7 +4823,8 @@ snapshots: uvu: 0.5.6 vfile-message: 3.1.4 - micromark-extension-mdxjs@1.0.1: + /micromark-extension-mdxjs@1.0.1: + resolution: {integrity: sha512-7YA7hF6i5eKOfFUzZ+0z6avRG52GpWR8DL+kN47y3f2KhxbBZMhmxe7auOeaTBrW2DenbbZTf1ea9tA2hDpC2Q==} dependencies: acorn: 8.11.3 acorn-jsx: 5.3.2(acorn@8.11.3) @@ -6775,33 +4835,40 @@ snapshots: micromark-util-combine-extensions: 1.1.0 micromark-util-types: 1.1.0 - micromark-factory-destination@1.1.0: + /micromark-factory-destination@1.1.0: + resolution: {integrity: sha512-XaNDROBgx9SgSChd69pjiGKbV+nfHGDPVYFs5dOoDd7ZnMAE+Cuu91BCpsY8RT2NP9vo/B8pds2VQNCLiu0zhg==} dependencies: micromark-util-character: 1.2.0 micromark-util-symbol: 1.1.0 micromark-util-types: 1.1.0 - micromark-factory-destination@2.0.0: + /micromark-factory-destination@2.0.0: + resolution: {integrity: sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==} dependencies: micromark-util-character: 2.1.0 micromark-util-symbol: 2.0.0 micromark-util-types: 2.0.0 + dev: true - micromark-factory-label@1.1.0: + /micromark-factory-label@1.1.0: + resolution: {integrity: sha512-OLtyez4vZo/1NjxGhcpDSbHQ+m0IIGnT8BoPamh+7jVlzLJBH98zzuCoUeMxvM6WsNeh8wx8cKvqLiPHEACn0w==} dependencies: micromark-util-character: 1.2.0 micromark-util-symbol: 1.1.0 micromark-util-types: 1.1.0 uvu: 0.5.6 - micromark-factory-label@2.0.0: + /micromark-factory-label@2.0.0: + resolution: {integrity: sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==} dependencies: devlop: 1.1.0 micromark-util-character: 2.1.0 micromark-util-symbol: 2.0.0 micromark-util-types: 2.0.0 + dev: true - micromark-factory-mdx-expression@1.0.9: + /micromark-factory-mdx-expression@1.0.9: + resolution: {integrity: sha512-jGIWzSmNfdnkJq05c7b0+Wv0Kfz3NJ3N4cBjnbO4zjXIlxJr+f8lk+5ZmwFvqdAbUy2q6B5rCY//g0QAAaXDWA==} dependencies: '@types/estree': 1.0.5 micromark-util-character: 1.2.0 @@ -6812,111 +4879,140 @@ snapshots: uvu: 0.5.6 vfile-message: 3.1.4 - micromark-factory-space@1.1.0: + /micromark-factory-space@1.1.0: + resolution: {integrity: sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==} dependencies: micromark-util-character: 1.2.0 micromark-util-types: 1.1.0 - micromark-factory-space@2.0.0: + /micromark-factory-space@2.0.0: + resolution: {integrity: sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==} dependencies: micromark-util-character: 2.1.0 micromark-util-types: 2.0.0 + dev: true - micromark-factory-title@1.1.0: + /micromark-factory-title@1.1.0: + resolution: {integrity: sha512-J7n9R3vMmgjDOCY8NPw55jiyaQnH5kBdV2/UXCtZIpnHH3P6nHUKaH7XXEYuWwx/xUJcawa8plLBEjMPU24HzQ==} dependencies: micromark-factory-space: 1.1.0 micromark-util-character: 1.2.0 micromark-util-symbol: 1.1.0 micromark-util-types: 1.1.0 - micromark-factory-title@2.0.0: + /micromark-factory-title@2.0.0: + resolution: {integrity: sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A==} dependencies: micromark-factory-space: 2.0.0 micromark-util-character: 2.1.0 micromark-util-symbol: 2.0.0 micromark-util-types: 2.0.0 + dev: true - micromark-factory-whitespace@1.1.0: + /micromark-factory-whitespace@1.1.0: + resolution: {integrity: sha512-v2WlmiymVSp5oMg+1Q0N1Lxmt6pMhIHD457whWM7/GUlEks1hI9xj5w3zbc4uuMKXGisksZk8DzP2UyGbGqNsQ==} dependencies: micromark-factory-space: 1.1.0 micromark-util-character: 1.2.0 micromark-util-symbol: 1.1.0 micromark-util-types: 1.1.0 - micromark-factory-whitespace@2.0.0: + /micromark-factory-whitespace@2.0.0: + resolution: {integrity: sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==} dependencies: micromark-factory-space: 2.0.0 micromark-util-character: 2.1.0 micromark-util-symbol: 2.0.0 micromark-util-types: 2.0.0 + dev: true - micromark-util-character@1.2.0: + /micromark-util-character@1.2.0: + resolution: {integrity: sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==} dependencies: micromark-util-symbol: 1.1.0 micromark-util-types: 1.1.0 - micromark-util-character@2.1.0: + /micromark-util-character@2.1.0: + resolution: {integrity: sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==} dependencies: micromark-util-symbol: 2.0.0 micromark-util-types: 2.0.0 - micromark-util-chunked@1.1.0: + /micromark-util-chunked@1.1.0: + resolution: {integrity: sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ==} dependencies: micromark-util-symbol: 1.1.0 - micromark-util-chunked@2.0.0: + /micromark-util-chunked@2.0.0: + resolution: {integrity: sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==} dependencies: micromark-util-symbol: 2.0.0 + dev: true - micromark-util-classify-character@1.1.0: + /micromark-util-classify-character@1.1.0: + resolution: {integrity: sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw==} dependencies: micromark-util-character: 1.2.0 micromark-util-symbol: 1.1.0 micromark-util-types: 1.1.0 - micromark-util-classify-character@2.0.0: + /micromark-util-classify-character@2.0.0: + resolution: {integrity: sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==} dependencies: micromark-util-character: 2.1.0 micromark-util-symbol: 2.0.0 micromark-util-types: 2.0.0 + dev: true - micromark-util-combine-extensions@1.1.0: + /micromark-util-combine-extensions@1.1.0: + resolution: {integrity: sha512-Q20sp4mfNf9yEqDL50WwuWZHUrCO4fEyeDCnMGmG5Pr0Cz15Uo7KBs6jq+dq0EgX4DPwwrh9m0X+zPV1ypFvUA==} dependencies: micromark-util-chunked: 1.1.0 micromark-util-types: 1.1.0 - micromark-util-combine-extensions@2.0.0: + /micromark-util-combine-extensions@2.0.0: + resolution: {integrity: sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ==} dependencies: micromark-util-chunked: 2.0.0 micromark-util-types: 2.0.0 + dev: true - micromark-util-decode-numeric-character-reference@1.1.0: + /micromark-util-decode-numeric-character-reference@1.1.0: + resolution: {integrity: sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw==} dependencies: micromark-util-symbol: 1.1.0 - micromark-util-decode-numeric-character-reference@2.0.1: + /micromark-util-decode-numeric-character-reference@2.0.1: + resolution: {integrity: sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ==} dependencies: micromark-util-symbol: 2.0.0 + dev: true - micromark-util-decode-string@1.1.0: + /micromark-util-decode-string@1.1.0: + resolution: {integrity: sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ==} dependencies: decode-named-character-reference: 1.0.2 micromark-util-character: 1.2.0 micromark-util-decode-numeric-character-reference: 1.1.0 micromark-util-symbol: 1.1.0 - micromark-util-decode-string@2.0.0: + /micromark-util-decode-string@2.0.0: + resolution: {integrity: sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA==} dependencies: decode-named-character-reference: 1.0.2 micromark-util-character: 2.1.0 micromark-util-decode-numeric-character-reference: 2.0.1 micromark-util-symbol: 2.0.0 + dev: true - micromark-util-encode@1.1.0: {} + /micromark-util-encode@1.1.0: + resolution: {integrity: sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw==} - micromark-util-encode@2.0.0: {} + /micromark-util-encode@2.0.0: + resolution: {integrity: sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==} - micromark-util-events-to-acorn@1.2.3: + /micromark-util-events-to-acorn@1.2.3: + resolution: {integrity: sha512-ij4X7Wuc4fED6UoLWkmo0xJQhsktfNh1J0m8g4PbIMPlx+ek/4YdW5mvbye8z/aZvAPUoxgXHrwVlXAPKMRp1w==} dependencies: '@types/acorn': 4.0.6 '@types/estree': 1.0.5 @@ -6927,68 +5023,89 @@ snapshots: uvu: 0.5.6 vfile-message: 3.1.4 - micromark-util-html-tag-name@1.2.0: {} + /micromark-util-html-tag-name@1.2.0: + resolution: {integrity: sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q==} - micromark-util-html-tag-name@2.0.0: {} + /micromark-util-html-tag-name@2.0.0: + resolution: {integrity: sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==} + dev: true - micromark-util-normalize-identifier@1.1.0: + /micromark-util-normalize-identifier@1.1.0: + resolution: {integrity: sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q==} dependencies: micromark-util-symbol: 1.1.0 - micromark-util-normalize-identifier@2.0.0: + /micromark-util-normalize-identifier@2.0.0: + resolution: {integrity: sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==} dependencies: micromark-util-symbol: 2.0.0 + dev: true - micromark-util-resolve-all@1.1.0: + /micromark-util-resolve-all@1.1.0: + resolution: {integrity: sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA==} dependencies: micromark-util-types: 1.1.0 - micromark-util-resolve-all@2.0.0: + /micromark-util-resolve-all@2.0.0: + resolution: {integrity: sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==} dependencies: micromark-util-types: 2.0.0 + dev: true - micromark-util-sanitize-uri@1.2.0: + /micromark-util-sanitize-uri@1.2.0: + resolution: {integrity: sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A==} dependencies: micromark-util-character: 1.2.0 micromark-util-encode: 1.1.0 micromark-util-symbol: 1.1.0 - micromark-util-sanitize-uri@2.0.0: + /micromark-util-sanitize-uri@2.0.0: + resolution: {integrity: sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==} dependencies: micromark-util-character: 2.1.0 micromark-util-encode: 2.0.0 micromark-util-symbol: 2.0.0 - micromark-util-subtokenize@1.1.0: + /micromark-util-subtokenize@1.1.0: + resolution: {integrity: sha512-kUQHyzRoxvZO2PuLzMt2P/dwVsTiivCK8icYTeR+3WgbuPqfHgPPy7nFKbeqRivBvn/3N3GBiNC+JRTMSxEC7A==} dependencies: micromark-util-chunked: 1.1.0 micromark-util-symbol: 1.1.0 micromark-util-types: 1.1.0 uvu: 0.5.6 - micromark-util-subtokenize@2.0.1: + /micromark-util-subtokenize@2.0.1: + resolution: {integrity: sha512-jZNtiFl/1aY73yS3UGQkutD0UbhTt68qnRpw2Pifmz5wV9h8gOVsN70v+Lq/f1rKaU/W8pxRe8y8Q9FX1AOe1Q==} dependencies: devlop: 1.1.0 micromark-util-chunked: 2.0.0 micromark-util-symbol: 2.0.0 micromark-util-types: 2.0.0 + dev: true - micromark-util-symbol@1.1.0: {} + /micromark-util-symbol@1.1.0: + resolution: {integrity: sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==} - micromark-util-symbol@2.0.0: {} + /micromark-util-symbol@2.0.0: + resolution: {integrity: sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==} - micromark-util-types@1.1.0: {} + /micromark-util-types@1.1.0: + resolution: {integrity: sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==} - micromark-util-types@2.0.0: {} + /micromark-util-types@2.0.0: + resolution: {integrity: sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==} - micromark@2.11.4: + /micromark@2.11.4: + resolution: {integrity: sha512-+WoovN/ppKolQOFIAajxi7Lu9kInbPxFuTBVEavFcL8eAfVstoc5MocPmqBeAdBOJV00uaVjegzH4+MA0DN/uA==} dependencies: debug: 4.3.4 parse-entities: 2.0.0 transitivePeerDependencies: - supports-color + dev: true - micromark@3.2.0: + /micromark@3.2.0: + resolution: {integrity: sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA==} dependencies: '@types/debug': 4.1.12 debug: 4.3.4 @@ -7010,7 +5127,8 @@ snapshots: transitivePeerDependencies: - supports-color - micromark@4.0.0: + /micromark@4.0.0: + resolution: {integrity: sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==} dependencies: '@types/debug': 4.1.12 debug: 4.3.4 @@ -7031,47 +5149,87 @@ snapshots: micromark-util-types: 2.0.0 transitivePeerDependencies: - supports-color + dev: true - micromatch@4.0.8: + /micromatch@4.0.5: + resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + engines: {node: '>=8.6'} dependencies: - braces: 3.0.3 + braces: 3.0.2 picomatch: 2.3.1 - min-indent@1.0.1: {} + /min-indent@1.0.1: + resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} + engines: {node: '>=4'} + dev: true - minimalistic-assert@1.0.1: {} + /minimalistic-assert@1.0.1: + resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} + dev: true - minimalistic-crypto-utils@1.0.1: {} + /minimalistic-crypto-utils@1.0.1: + resolution: {integrity: sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==} + dev: true - minimatch@3.1.2: + /minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} dependencies: brace-expansion: 1.1.11 + dev: true - minimatch@5.1.6: + /minimatch@5.1.6: + resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} + engines: {node: '>=10'} dependencies: brace-expansion: 2.0.1 + dev: true - minimatch@9.0.3: + /minimatch@9.0.3: + resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} + engines: {node: '>=16 || 14 >=14.17'} dependencies: brace-expansion: 2.0.1 + dev: true - minimatch@9.0.4: + /minimatch@9.0.4: + resolution: {integrity: sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==} + engines: {node: '>=16 || 14 >=14.17'} dependencies: brace-expansion: 2.0.1 + dev: true - minimist@1.2.8: {} + /minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + dev: false - minipass@7.0.4: {} + /minipass@7.0.4: + resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==} + engines: {node: '>=16 || 14 >=14.17'} + dev: true - mri@1.2.0: {} + /mri@1.2.0: + resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} + engines: {node: '>=4'} - ms@2.1.2: {} + /ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - nanoid@3.3.7: {} + /nanoid@3.3.7: + resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + dev: false - natural-compare@1.4.0: {} + /natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + dev: true - next-mdx-remote@4.4.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + /next-mdx-remote@4.4.1(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-1BvyXaIou6xy3XoNF4yaMZUCb6vD2GTAa5ciOa6WoO+gAUTYsb1K4rI/HSC2ogAWLrb/7VSV52skz07vOzmqIQ==} + engines: {node: '>=14', npm: '>=7'} + peerDependencies: + react: '>=16.x <=18.x' + react-dom: '>=16.x <=18.x' dependencies: '@mdx-js/mdx': 2.3.0 '@mdx-js/react': 2.3.0(react@18.3.1) @@ -7081,28 +5239,63 @@ snapshots: vfile-matter: 3.0.1 transitivePeerDependencies: - supports-color + dev: false - next-seo@6.5.0(next@14.2.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + /next-seo@6.5.0(next@14.2.10)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-MfzUeWTN/x/rsKp/1n0213eojO97lIl0unxqbeCY+6pAucViHDA8GSLRRcXpgjsSmBxfCFdfpu7LXbt4ANQoNQ==} + peerDependencies: + next: ^8.1.1-canary.54 || >=9.0.0 + react: '>=16.0.0' + react-dom: '>=16.0.0' dependencies: - next: 14.2.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + next: 14.2.10(react-dom@18.3.1)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) + dev: false - next-sitemap@4.2.3(next@14.2.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1)): + /next-sitemap@4.2.3(next@14.2.10): + resolution: {integrity: sha512-vjdCxeDuWDzldhCnyFCQipw5bfpl4HmZA7uoo3GAaYGjGgfL4Cxb1CiztPuWGmS+auYs7/8OekRS8C2cjdAsjQ==} + engines: {node: '>=14.18'} + hasBin: true + peerDependencies: + next: '*' dependencies: '@corex/deepmerge': 4.0.43 '@next/env': 13.5.6 fast-glob: 3.3.2 minimist: 1.2.8 - next: 14.2.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + next: 14.2.10(react-dom@18.3.1)(react@18.3.1) + dev: false - next-themes@0.2.1(next@14.2.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + /next-themes@0.2.1(next@14.2.10)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-B+AKNfYNIzh0vqQQKqQItTS8evEouKD7H5Hj3kmuPERwddR2TxvDSFZuTj6T7Jfn1oyeUyJMydPl1Bkxkh0W7A==} + peerDependencies: + next: '*' + react: '*' + react-dom: '*' dependencies: - next: 14.2.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + next: 14.2.10(react-dom@18.3.1)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) + dev: false - next@14.2.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + /next@14.2.10(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-sDDExXnh33cY3RkS9JuFEKaS4HmlWmDKP1VJioucCG6z5KuA008DPsDZOzi8UfqEk3Ii+2NCQSJrfbEWtZZfww==} + engines: {node: '>=18.17.0'} + hasBin: true + peerDependencies: + '@opentelemetry/api': ^1.1.0 + '@playwright/test': ^1.41.2 + react: ^18.2.0 + react-dom: ^18.2.0 + sass: ^1.3.0 + peerDependenciesMeta: + '@opentelemetry/api': + optional: true + '@playwright/test': + optional: true + sass: + optional: true dependencies: '@next/env': 14.2.10 '@swc/helpers': 0.5.5 @@ -7126,10 +5319,17 @@ snapshots: transitivePeerDependencies: - '@babel/core' - babel-plugin-macros + dev: false - nextra-theme-docs@2.13.2(next@14.2.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(nextra@2.13.2(patch_hash=a4rp2hgojklggjmthmkiyqaek4)(next@14.2.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + /nextra-theme-docs@2.13.2(next@14.2.10)(nextra@2.13.2)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-yE4umXaImp1/kf/sFciPj2+EFrNSwd9Db26hi98sIIiujzGf3+9eUgAz45vF9CwBw50FSXxm1QGRcY+slQ4xQQ==} + peerDependencies: + next: '>=9.5.3' + nextra: 2.13.2 + react: '>=16.13.1' + react-dom: '>=16.13.1' dependencies: - '@headlessui/react': 1.7.19(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@headlessui/react': 1.7.19(react-dom@18.3.1)(react@18.3.1) '@popperjs/core': 2.11.8 clsx: 2.1.1 escape-string-regexp: 5.0.0 @@ -7138,18 +5338,25 @@ snapshots: git-url-parse: 13.1.1 intersection-observer: 0.12.2 match-sorter: 6.3.4 - next: 14.2.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - next-seo: 6.5.0(next@14.2.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - next-themes: 0.2.1(next@14.2.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - nextra: 2.13.2(patch_hash=a4rp2hgojklggjmthmkiyqaek4)(next@14.2.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + next: 14.2.10(react-dom@18.3.1)(react@18.3.1) + next-seo: 6.5.0(next@14.2.10)(react-dom@18.3.1)(react@18.3.1) + next-themes: 0.2.1(next@14.2.10)(react-dom@18.3.1)(react@18.3.1) + nextra: 2.13.2(patch_hash=a4rp2hgojklggjmthmkiyqaek4)(next@14.2.10)(react-dom@18.3.1)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) scroll-into-view-if-needed: 3.1.0 zod: 3.23.8 + dev: false - nextra@2.13.2(patch_hash=a4rp2hgojklggjmthmkiyqaek4)(next@14.2.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + /nextra@2.13.2(patch_hash=a4rp2hgojklggjmthmkiyqaek4)(next@14.2.10)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-pIgOSXNUqTz1laxV4ChFZOU7lzJAoDHHaBPj8L09PuxrLKqU1BU/iZtXAG6bQeKCx8EPdBsoXxEuENnL9QGnGA==} + engines: {node: '>=16'} + peerDependencies: + next: '>=9.5.3' + react: '>=16.13.1' + react-dom: '>=16.13.1' dependencies: - '@headlessui/react': 1.7.19(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@headlessui/react': 1.7.19(react-dom@18.3.1)(react@18.3.1) '@mdx-js/mdx': 2.3.0 '@mdx-js/react': 2.3.0(react@18.3.1) '@napi-rs/simple-git': 0.1.16 @@ -7161,8 +5368,8 @@ snapshots: gray-matter: 4.0.3 katex: 0.16.10 lodash.get: 4.4.2 - next: 14.2.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - next-mdx-remote: 4.4.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + next: 14.2.10(react-dom@18.3.1)(react@18.3.1) + next-mdx-remote: 4.4.1(react-dom@18.3.1)(react@18.3.1) p-limit: 3.1.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -7180,56 +5387,101 @@ snapshots: zod: 3.23.8 transitivePeerDependencies: - supports-color + dev: false + patched: true - no-case@3.0.4: + /no-case@3.0.4: + resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} dependencies: lower-case: 2.0.2 tslib: 2.6.2 + dev: false - node-fetch@2.7.0: + /node-fetch@2.7.0: + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true dependencies: whatwg-url: 5.0.0 + dev: true - non-layered-tidy-tree-layout@2.0.2: {} + /non-layered-tidy-tree-layout@2.0.2: + resolution: {integrity: sha512-gkXMxRzUH+PB0ax9dUN0yYF0S25BqeAYqhgMaLUFmpXLEk7Fcu8f4emJuOAY0V8kjDICxROIKsTAKsV/v355xw==} + dev: false - nopt@7.2.0: + /nopt@7.2.0: + resolution: {integrity: sha512-CVDtwCdhYIvnAzFoJ6NJ6dX3oga9/HyciQDnG1vQDjSLMeKLJ4A93ZqYKDrgYSr1FBY5/hMYC+2VCi24pgpkGA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + hasBin: true dependencies: abbrev: 2.0.0 + dev: true - npm-normalize-package-bin@3.0.1: {} + /npm-normalize-package-bin@3.0.1: + resolution: {integrity: sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dev: true - npm-run-path@2.0.2: + /npm-run-path@2.0.2: + resolution: {integrity: sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==} + engines: {node: '>=4'} dependencies: path-key: 2.0.1 + dev: false - npm-to-yarn@2.2.1: {} + /npm-to-yarn@2.2.1: + resolution: {integrity: sha512-O/j/ROyX0KGLG7O6Ieut/seQ0oiTpHF2tXAcFbpdTLQFiaNtkyTXXocM1fwpaa60dg1qpWj0nHlbNhx6qwuENQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: false - number-to-bn@1.7.0: + /number-to-bn@1.7.0: + resolution: {integrity: sha512-wsJ9gfSz1/s4ZsJN01lyonwuxA1tml6X1yBDnfpMglypcBRFZZkus26EdPSlqS5GJfYddVZa22p3VNb3z5m5Ig==} + engines: {node: '>=6.5.0', npm: '>=3'} dependencies: bn.js: 4.11.6 strip-hex-prefix: 1.0.0 + dev: true - object-inspect@1.13.1: {} + /object-inspect@1.13.1: + resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} + dev: false - object-is@1.1.6: + /object-is@1.1.6: + resolution: {integrity: sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==} + engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 define-properties: 1.2.1 + dev: false - object-keys@1.1.1: {} + /object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + dev: false - object.assign@4.1.5: + /object.assign@4.1.5: + resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} + engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 define-properties: 1.2.1 has-symbols: 1.0.3 object-keys: 1.1.1 + dev: false - once@1.4.0: + /once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} dependencies: wrappy: 1.0.2 + dev: true - optionator@0.9.4: + /optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + engines: {node: '>= 0.8.0'} dependencies: deep-is: 0.1.4 fast-levenshtein: 2.0.6 @@ -7237,39 +5489,63 @@ snapshots: prelude-ls: 1.2.1 type-check: 0.4.0 word-wrap: 1.2.5 + dev: true - p-finally@1.0.0: {} + /p-finally@1.0.0: + resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==} + engines: {node: '>=4'} + dev: false - p-limit@3.1.0: + /p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} dependencies: yocto-queue: 0.1.0 - p-limit@4.0.0: + /p-limit@4.0.0: + resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dependencies: yocto-queue: 1.0.0 + dev: true - p-locate@5.0.0: + /p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} dependencies: p-limit: 3.1.0 + dev: true - p-locate@6.0.0: + /p-locate@6.0.0: + resolution: {integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dependencies: p-limit: 4.0.0 + dev: true - param-case@3.0.4: + /param-case@3.0.4: + resolution: {integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==} dependencies: dot-case: 3.0.4 tslib: 2.6.2 + dev: false - parent-module@1.0.1: + /parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} dependencies: callsites: 3.1.0 + dev: true - parent-module@2.0.0: + /parent-module@2.0.0: + resolution: {integrity: sha512-uo0Z9JJeWzv8BG+tRcapBKNJ0dro9cLyczGzulS6EfeyAdeC9sbojtW6XwvYxJkEne9En+J2XEl4zyglVeIwFg==} + engines: {node: '>=8'} dependencies: callsites: 3.1.0 + dev: true - parse-entities@2.0.0: + /parse-entities@2.0.0: + resolution: {integrity: sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==} dependencies: character-entities: 1.2.4 character-entities-legacy: 1.1.4 @@ -7277,8 +5553,10 @@ snapshots: is-alphanumerical: 1.0.4 is-decimal: 1.0.4 is-hexadecimal: 1.0.4 + dev: true - parse-entities@4.0.1: + /parse-entities@4.0.1: + resolution: {integrity: sha512-SWzvYcSJh4d/SGLIOQfZ/CoNv6BTlI6YEQ7Nj82oDVnRpwe/Z/F1EMx42x3JAOwGBlCjeCH0BRJQbQ/opHL17w==} dependencies: '@types/unist': 2.0.10 character-entities: 2.0.2 @@ -7289,135 +5567,231 @@ snapshots: is-decimal: 2.0.1 is-hexadecimal: 2.0.1 - parse-json@6.0.2: + /parse-json@6.0.2: + resolution: {integrity: sha512-SA5aMiaIjXkAiBrW/yPgLgQAQg42f7K3ACO+2l/zOvtQBwX58DMUsFJXelW2fx3yMBmWOVkR6j1MGsdSbCA4UA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dependencies: '@babel/code-frame': 7.24.2 error-ex: 1.3.2 json-parse-even-better-errors: 2.3.1 lines-and-columns: 2.0.4 + dev: true - parse-numeric-range@1.3.0: {} + /parse-numeric-range@1.3.0: + resolution: {integrity: sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ==} + dev: false - parse-path@7.0.0: + /parse-path@7.0.0: + resolution: {integrity: sha512-Euf9GG8WT9CdqwuWJGdf3RkUcTBArppHABkO7Lm8IzRQp0e2r/kkFnmhu4TSK30Wcu5rVAZLmfPKSBBi9tWFog==} dependencies: protocols: 2.0.1 + dev: false - parse-url@8.1.0: + /parse-url@8.1.0: + resolution: {integrity: sha512-xDvOoLU5XRrcOZvnI6b8zA6n9O9ejNk/GExuz1yBuWUGn9KA97GI6HTs6u02wKara1CeVmZhH+0TZFdWScR89w==} dependencies: parse-path: 7.0.0 + dev: false - parse5@7.1.2: + /parse5@7.1.2: + resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} dependencies: entities: 4.5.0 + dev: false - pascal-case@3.1.2: + /pascal-case@3.1.2: + resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==} dependencies: no-case: 3.0.4 tslib: 2.6.2 + dev: false - path-case@3.0.4: + /path-case@3.0.4: + resolution: {integrity: sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg==} dependencies: dot-case: 3.0.4 tslib: 2.6.2 + dev: false - path-exists@4.0.0: {} + /path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + dev: true - path-exists@5.0.0: {} + /path-exists@5.0.0: + resolution: {integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: true - path-is-absolute@1.0.1: {} + /path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + dev: true - path-key@2.0.1: {} + /path-key@2.0.1: + resolution: {integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==} + engines: {node: '>=4'} + dev: false - path-key@3.1.1: {} + /path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + dev: true - path-scurry@1.10.2: + /path-scurry@1.10.2: + resolution: {integrity: sha512-7xTavNy5RQXnsjANvVvMkEjvloOinkAjv/Z6Ildz9v2RinZ4SBKTWFOVRbaF8p0vpHnyjV/UwNDdKuUv6M5qcA==} + engines: {node: '>=16 || 14 >=14.17'} dependencies: lru-cache: 10.2.2 minipass: 7.0.4 + dev: true - path-type@4.0.0: {} + /path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + dev: true - pathval@1.1.1: {} + /pathval@1.1.1: + resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} + dev: true - periscopic@3.1.0: + /periscopic@3.1.0: + resolution: {integrity: sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==} dependencies: '@types/estree': 1.0.5 estree-walker: 3.0.3 is-reference: 3.0.2 + dev: false - picocolors@1.0.0: {} + /picocolors@1.0.0: + resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} - picomatch@2.3.1: {} + /picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} - pluralize@8.0.0: {} + /pluralize@8.0.0: + resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} + engines: {node: '>=4'} + dev: true - possible-typed-array-names@1.0.0: {} + /possible-typed-array-names@1.0.0: + resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} + engines: {node: '>= 0.4'} + dev: false - postcss@8.4.31: + /postcss@8.4.31: + resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} + engines: {node: ^10 || ^12 || >=14} dependencies: nanoid: 3.3.7 picocolors: 1.0.0 source-map-js: 1.2.0 + dev: false - prelude-ls@1.2.1: {} + /prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + dev: true - pretty-format@27.5.1: + /pretty-format@27.5.1: + resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: ansi-regex: 5.0.1 ansi-styles: 5.2.0 react-is: 17.0.2 + dev: false - proc-log@3.0.0: {} + /proc-log@3.0.0: + resolution: {integrity: sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dev: true - property-information@6.5.0: {} + /property-information@6.5.0: + resolution: {integrity: sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==} + dev: false - protocols@2.0.1: {} + /protocols@2.0.1: + resolution: {integrity: sha512-/XJ368cyBJ7fzLMwLKv1e4vLxOju2MNAIokcr7meSaNcVbWz/CPcW22cP04mwxOErdA5mwjA8Q6w/cdAQxVn7Q==} + dev: false - pseudomap@1.0.2: {} + /pseudomap@1.0.2: + resolution: {integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==} + dev: false - punycode@2.3.1: {} + /punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + dev: true - queue-microtask@1.2.3: {} + /queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - randombytes@2.1.0: + /randombytes@2.1.0: + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} dependencies: safe-buffer: 5.2.1 + dev: true - react-dom@18.3.1(react@18.3.1): + /react-dom@18.3.1(react@18.3.1): + resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==} + peerDependencies: + react: ^18.3.1 dependencies: loose-envify: 1.4.0 react: 18.3.1 scheduler: 0.23.2 + dev: false - react-is@17.0.2: {} + /react-is@17.0.2: + resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} + dev: false - react@18.3.1: + /react@18.3.1: + resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} + engines: {node: '>=0.10.0'} dependencies: loose-envify: 1.4.0 + dev: false - read-package-json-fast@3.0.2: + /read-package-json-fast@3.0.2: + resolution: {integrity: sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} dependencies: json-parse-even-better-errors: 3.0.1 npm-normalize-package-bin: 3.0.1 + dev: true - readable-stream@3.6.2: + /readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} dependencies: inherits: 2.0.4 string_decoder: 1.3.0 util-deprecate: 1.0.2 + dev: true - reading-time@1.5.0: {} + /reading-time@1.5.0: + resolution: {integrity: sha512-onYyVhBNr4CmAxFsKS7bz+uTLRakypIe4R+5A824vBSkQy/hB3fZepoVEf8OVAxzLvK+H/jm9TzpI3ETSm64Kg==} + dev: false - regenerator-runtime@0.14.1: {} + /regenerator-runtime@0.14.1: + resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} + dev: false - regexp.prototype.flags@1.5.2: + /regexp.prototype.flags@1.5.2: + resolution: {integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==} + engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-errors: 1.3.0 set-function-name: 2.0.2 + dev: false - rehype-katex@7.0.0: + /rehype-katex@7.0.0: + resolution: {integrity: sha512-h8FPkGE00r2XKU+/acgqwWUlyzve1IiOKwsEkg4pDL3k48PiE0Pt+/uLtVHDVkN1yA4iurZN6UES8ivHVEQV6Q==} dependencies: '@types/hast': 3.0.4 '@types/katex': 0.16.7 @@ -7426,27 +5800,40 @@ snapshots: katex: 0.16.10 unist-util-visit-parents: 6.0.1 vfile: 6.0.1 + dev: false - rehype-pretty-code@0.9.11(shiki@0.14.7): + /rehype-pretty-code@0.9.11(shiki@0.14.7): + resolution: {integrity: sha512-Eq90eCYXQJISktfRZ8PPtwc5SUyH6fJcxS8XOMnHPUQZBtC6RYo67gGlley9X2nR8vlniPj0/7oCDEYHKQa/oA==} + engines: {node: '>=16'} + peerDependencies: + shiki: '*' dependencies: '@types/hast': 2.3.10 hash-obj: 4.0.0 parse-numeric-range: 1.3.0 shiki: 0.14.7 + dev: false - rehype-raw@7.0.0: + /rehype-raw@7.0.0: + resolution: {integrity: sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==} dependencies: '@types/hast': 3.0.4 hast-util-raw: 9.0.2 vfile: 6.0.1 + dev: false - remark-code-import@1.2.0(patch_hash=heylvfasxh3ubj2edns2svea2m): + /remark-code-import@1.2.0(patch_hash=heylvfasxh3ubj2edns2svea2m): + resolution: {integrity: sha512-fgwLruqlZbVOIhCJFjY+JDwPZhA4/eK3InJzN8Ox8UDdtudpG212JwtRj6la+lAzJU7JmSEyewZSukVZdknt3Q==} + engines: {node: '>= 12'} dependencies: strip-indent: 4.0.0 to-gatsby-remark-plugin: 0.1.0 unist-util-visit: 4.1.2 + dev: true + patched: true - remark-frontmatter@5.0.0: + /remark-frontmatter@5.0.0: + resolution: {integrity: sha512-XTFYvNASMe5iPN0719nPrdItC9aU0ssC4v14mH1BCi1u0n1gAocqcujWUrByftZTbLhRtiKRyjYTSIOcr69UVQ==} dependencies: '@types/mdast': 4.0.3 mdast-util-frontmatter: 2.0.1 @@ -7454,8 +5841,10 @@ snapshots: unified: 11.0.4 transitivePeerDependencies: - supports-color + dev: true - remark-gfm@3.0.1: + /remark-gfm@3.0.1: + resolution: {integrity: sha512-lEFDoi2PICJyNrACFOfDD3JlLkuSbOa5Wd8EPt06HUdptv8Gn0bxYTdbU/XXQ3swAPkEaGxxPN9cbnMHvVu1Ig==} dependencies: '@types/mdast': 3.0.15 mdast-util-gfm: 2.0.2 @@ -7464,7 +5853,8 @@ snapshots: transitivePeerDependencies: - supports-color - remark-lint-blockquote-indentation@3.1.2: + /remark-lint-blockquote-indentation@3.1.2: + resolution: {integrity: sha512-5DOrFsZd5dXqA4p/VZvWSrqIWNFbBXjX7IV/FkVkxlNhNF/0FMf/4v8x1I2W3mzaZ7yDsWS/egpZnmligq1ckQ==} dependencies: '@types/mdast': 3.0.15 pluralize: 8.0.0 @@ -7473,16 +5863,20 @@ snapshots: unist-util-generated: 2.0.1 unist-util-position: 4.0.4 unist-util-visit: 4.1.2 + dev: true - remark-lint-checkbox-character-style@4.1.2: + /remark-lint-checkbox-character-style@4.1.2: + resolution: {integrity: sha512-5ITz+1cCuJ3Jv/Q7rKgDEucCOnIgjWDnSHPJA1tb4TI/D316h+ALbDhZIpP8gyfAm6sBAh3Pwz9XZJN2uJB5UQ==} dependencies: '@types/mdast': 3.0.15 unified: 10.1.2 unified-lint-rule: 2.1.2 unist-util-position: 4.0.4 unist-util-visit: 4.1.2 + dev: true - remark-lint-code-block-style@3.1.2: + /remark-lint-code-block-style@3.1.2: + resolution: {integrity: sha512-3wsWmzzdyEsB9sOzBOf46TSkwwVKXN2JpTEQb6feN0Tl6Vg75F7T9MHqMz7aqk/56bOXSxUzdpXDscGBhziLRA==} dependencies: '@types/mdast': 3.0.15 unified: 10.1.2 @@ -7490,30 +5884,38 @@ snapshots: unist-util-generated: 2.0.1 unist-util-position: 4.0.4 unist-util-visit: 4.1.2 + dev: true - remark-lint-emphasis-marker@3.1.2: + /remark-lint-emphasis-marker@3.1.2: + resolution: {integrity: sha512-hPZ8vxZrIfxmLA5B66bA8y3PdHjcCQuaLsySIqi5PM2DkpN6a7zAP3v1znyRSaYJ1ANVWcu00/0bNzuUjflGCA==} dependencies: '@types/mdast': 3.0.15 unified: 10.1.2 unified-lint-rule: 2.1.2 unist-util-position: 4.0.4 unist-util-visit: 4.1.2 + dev: true - remark-lint-fenced-code-marker@3.1.2: + /remark-lint-fenced-code-marker@3.1.2: + resolution: {integrity: sha512-6XNqjOuhT+0c7Q/22aCsMz61ne9g8HRpYF79EXQPdbzYa+PcfPXMiQKStONY3PfC8OE2/3WXI2zcs8w9x+8+VQ==} dependencies: '@types/mdast': 3.0.15 unified: 10.1.2 unified-lint-rule: 2.1.2 unist-util-position: 4.0.4 unist-util-visit: 4.1.2 + dev: true - remark-lint-final-newline@2.1.2: + /remark-lint-final-newline@2.1.2: + resolution: {integrity: sha512-K0FdPGPyEB94PwNgopwVJFE8oRWi7IhY2ycXFVAMReI51el7EHB8F1gX14tB6p6zyGy6mUh69bCVU9mMTNeOUg==} dependencies: '@types/mdast': 3.0.15 unified: 10.1.2 unified-lint-rule: 2.1.2 + dev: true - remark-lint-frontmatter-schema@3.15.4(patch_hash=jaxvkozlhcbn7zjsiti5ocoubi): + /remark-lint-frontmatter-schema@3.15.4(patch_hash=jaxvkozlhcbn7zjsiti5ocoubi): + resolution: {integrity: sha512-egChkbtCCG4hw1F2qoipzSxp6Ea9z4pxaVkWYa36DnCZ9fn3GhCNyOUjbFSIvdhVcWN+AqvHdqPbXC9Pp81Hmg==} dependencies: '@apidevtools/json-schema-ref-parser': 11.1.0 ajv: 8.12.0 @@ -7522,8 +5924,11 @@ snapshots: minimatch: 9.0.3 unified-lint-rule: 2.1.2 yaml: 2.3.3 + dev: true + patched: true - remark-lint-hard-break-spaces@3.1.2: + /remark-lint-hard-break-spaces@3.1.2: + resolution: {integrity: sha512-HaW0xsl3TI7VFAqGWWcZtPqyz0NWu19KKjSO7OGFTUJU4S9YiRnhIxmSFM0ZLSsVAynE+dhzVKa8U7dOpWDcOg==} dependencies: '@types/mdast': 3.0.15 unified: 10.1.2 @@ -7531,8 +5936,10 @@ snapshots: unist-util-generated: 2.0.1 unist-util-position: 4.0.4 unist-util-visit: 4.1.2 + dev: true - remark-lint-heading-style@3.1.2: + /remark-lint-heading-style@3.1.2: + resolution: {integrity: sha512-0RkcRPV/H2bPFgeInzBkK1cWUwtFTm83I+Db/Z5tDY02GzKOosHLvxtJyj/1391/opAH1LYbHtHWffir99IUgw==} dependencies: '@types/mdast': 3.0.15 mdast-util-heading-style: 2.0.1 @@ -7540,8 +5947,10 @@ snapshots: unified-lint-rule: 2.1.2 unist-util-generated: 2.0.1 unist-util-visit: 4.1.2 + dev: true - remark-lint-link-title-style@3.1.2: + /remark-lint-link-title-style@3.1.2: + resolution: {integrity: sha512-if4MahYJVvQUWlrXDF8GSv4b9VtLSgMSDHeikQp1/hGYlihLl9uGw3nlL5Lf9DqTN0qaT6RPbXOjuuzHlk38sg==} dependencies: '@types/mdast': 3.0.15 unified: 10.1.2 @@ -7549,16 +5958,20 @@ snapshots: unist-util-position: 4.0.4 unist-util-visit: 4.1.2 vfile-location: 4.1.0 + dev: true - remark-lint-list-item-bullet-indent@4.1.2: + /remark-lint-list-item-bullet-indent@4.1.2: + resolution: {integrity: sha512-WgU5nooqIEm6f35opcbHKBzWrdFJA3XcyTfB3nv/v0KX43/h6qFGmmMJ5kEiaFExuQp3dZSdatWuY0YZ9YRbUg==} dependencies: '@types/mdast': 3.0.15 pluralize: 8.0.0 unified: 10.1.2 unified-lint-rule: 2.1.2 unist-util-visit: 4.1.2 + dev: true - remark-lint-list-item-content-indent@3.1.2: + /remark-lint-list-item-content-indent@3.1.2: + resolution: {integrity: sha512-TB0pmrWiRaQW80Y/PILFQTnHDghRxXNzMwyawlP+DBF9gNom3pEBmb4ZlGQlN0aa3r8VWeIKdv1ylHrfXE0vqA==} dependencies: '@types/mdast': 3.0.15 pluralize: 8.0.0 @@ -7566,8 +5979,10 @@ snapshots: unified-lint-rule: 2.1.2 unist-util-position: 4.0.4 unist-util-visit: 4.1.2 + dev: true - remark-lint-list-item-indent@3.1.2: + /remark-lint-list-item-indent@3.1.2: + resolution: {integrity: sha512-tkrra1pxZVE4OVJGfN435u/v0ljruXU+dHzWiKDYeifquD4aWhJxvSApu7+FbE098D/4usVXgMxwFkNhrpZcSQ==} dependencies: '@types/mdast': 3.0.15 pluralize: 8.0.0 @@ -7576,8 +5991,10 @@ snapshots: unist-util-generated: 2.0.1 unist-util-position: 4.0.4 unist-util-visit: 4.1.2 + dev: true - remark-lint-no-blockquote-without-marker@5.1.2: + /remark-lint-no-blockquote-without-marker@5.1.2: + resolution: {integrity: sha512-QPbqsrt7EfpSWqTkZJ9tepabPIhBDlNqZkuxxMQYD0OQ2N+tHDUq3zE1JxI5ts1V9o/mWApgySocqGd3jlcKmQ==} dependencies: '@types/mdast': 3.0.15 unified: 10.1.2 @@ -7586,8 +6003,10 @@ snapshots: unist-util-position: 4.0.4 unist-util-visit: 4.1.2 vfile-location: 4.1.0 + dev: true - remark-lint-no-duplicate-definitions@3.1.2: + /remark-lint-no-duplicate-definitions@3.1.2: + resolution: {integrity: sha512-vi0nXA7p+pjQOorZOkr9E+QDhG74JAdbzqglWPrWWNI3z2rUYWYHTNSyWJbwEXaIIcev1ZAw8SCAOis5MNm+pA==} dependencies: '@types/mdast': 3.0.15 unified: 10.1.2 @@ -7596,8 +6015,10 @@ snapshots: unist-util-position: 4.0.4 unist-util-stringify-position: 3.0.3 unist-util-visit: 4.1.2 + dev: true - remark-lint-no-heading-content-indent@4.1.2: + /remark-lint-no-heading-content-indent@4.1.2: + resolution: {integrity: sha512-TTxFsm1f4ZHFxZQCuz7j0QK4RvP6oArTiwazKLr16yaZe1608ypogMek4A30j2xX8WuO9+2uBzLXCY5OBo5x5Q==} dependencies: '@types/mdast': 3.0.15 mdast-util-heading-style: 2.0.1 @@ -7607,8 +6028,10 @@ snapshots: unist-util-generated: 2.0.1 unist-util-position: 4.0.4 unist-util-visit: 4.1.2 + dev: true - remark-lint-no-inline-padding@4.1.2: + /remark-lint-no-inline-padding@4.1.2: + resolution: {integrity: sha512-dGyhWsiqCZS3Slob0EVBUfsFBbdpMIBCvb56LlCgaHbnLsnNYx8PpF/wA5CgsN8BXIbXfRpyPB5cIJwIq5taYg==} dependencies: '@types/mdast': 3.0.15 mdast-util-to-string: 3.2.0 @@ -7616,8 +6039,10 @@ snapshots: unified-lint-rule: 2.1.2 unist-util-generated: 2.0.1 unist-util-visit: 4.1.2 + dev: true - remark-lint-no-literal-urls@3.1.2: + /remark-lint-no-literal-urls@3.1.2: + resolution: {integrity: sha512-4tV9JGLKxAMFSuWDMOqLozkFJ3HyRvhzgrPrxASoziaml23m7UXAozk5dkIrFny1cN2oG988Z8tORxX2FL1Ilw==} dependencies: '@types/mdast': 3.0.15 mdast-util-to-string: 3.2.0 @@ -7626,24 +6051,30 @@ snapshots: unist-util-generated: 2.0.1 unist-util-position: 4.0.4 unist-util-visit: 4.1.2 + dev: true - remark-lint-no-shortcut-reference-image@3.1.2: + /remark-lint-no-shortcut-reference-image@3.1.2: + resolution: {integrity: sha512-NX4XJFPyDeJJ77pmETxRj4oM/zayf7Lmn/O87HgExBkQIPz2NYbDeKD8QEyliLaV/oKA2rQufpzuFw55xa1Tww==} dependencies: '@types/mdast': 3.0.15 unified: 10.1.2 unified-lint-rule: 2.1.2 unist-util-generated: 2.0.1 unist-util-visit: 4.1.2 + dev: true - remark-lint-no-shortcut-reference-link@3.1.2: + /remark-lint-no-shortcut-reference-link@3.1.2: + resolution: {integrity: sha512-/9iPN7FLKaaIzw4tLWKu7Rx0wAP7E2EuzIeentQlkY0rO/mMHipmT3IlgiebsAInKagzTY6TNFoG1rq2VnaCcA==} dependencies: '@types/mdast': 3.0.15 unified: 10.1.2 unified-lint-rule: 2.1.2 unist-util-generated: 2.0.1 unist-util-visit: 4.1.2 + dev: true - remark-lint-no-undefined-references@4.2.1: + /remark-lint-no-undefined-references@4.2.1: + resolution: {integrity: sha512-HdNg5b2KiuNplcuVvRtsrUiROw557kAG1CiZYB7jQrrVWFgd86lKTa3bDiywe+87dGrGmHd3qQ28eZYTuHz2Nw==} dependencies: '@types/mdast': 3.0.15 micromark-util-normalize-identifier: 1.1.0 @@ -7653,16 +6084,20 @@ snapshots: unist-util-position: 4.0.4 unist-util-visit: 4.1.2 vfile-location: 4.1.0 + dev: true - remark-lint-no-unused-definitions@3.1.2: + /remark-lint-no-unused-definitions@3.1.2: + resolution: {integrity: sha512-bOcaJAnjKxT3kASFquUA3fO9xem9wZhVqt8TbqjA84+G4n40qjaLXDs/4vq73aMsSde73K0f3j1u0pMe7et8yQ==} dependencies: '@types/mdast': 3.0.15 unified: 10.1.2 unified-lint-rule: 2.1.2 unist-util-generated: 2.0.1 unist-util-visit: 4.1.2 + dev: true - remark-lint-ordered-list-marker-style@3.1.2: + /remark-lint-ordered-list-marker-style@3.1.2: + resolution: {integrity: sha512-62iVE/YQsA0Azaqt8yAJWPplWLS47kDLjXeC2PlRIAzCqbNt9qH3HId8vZ15QTSrp8rHmJwrCMdcqV6AZUi7gQ==} dependencies: '@types/mdast': 3.0.15 unified: 10.1.2 @@ -7670,24 +6105,30 @@ snapshots: unist-util-generated: 2.0.1 unist-util-position: 4.0.4 unist-util-visit: 4.1.2 + dev: true - remark-lint-rule-style@3.1.2: + /remark-lint-rule-style@3.1.2: + resolution: {integrity: sha512-0CsX2XcX9pIhAP5N7Y8mhYXp3/Ld+NvxXY1p0LHAq0NZu17UsZLuegvx/s25uFbQs08DcmSqyKnepU9qGGqmTQ==} dependencies: '@types/mdast': 3.0.15 unified: 10.1.2 unified-lint-rule: 2.1.2 unist-util-position: 4.0.4 unist-util-visit: 4.1.2 + dev: true - remark-lint-strong-marker@3.1.2: + /remark-lint-strong-marker@3.1.2: + resolution: {integrity: sha512-U/g4wngmiI0Q6WBRQG6pZxnDS33Wt/0QYA3+KNFBDykoi1vXsDEorIqy3dEag9z6XHwcMvFDsff6VRUhaOJWQg==} dependencies: '@types/mdast': 3.0.15 unified: 10.1.2 unified-lint-rule: 2.1.2 unist-util-position: 4.0.4 unist-util-visit: 4.1.2 + dev: true - remark-lint-table-cell-padding@4.1.3: + /remark-lint-table-cell-padding@4.1.3: + resolution: {integrity: sha512-N9xtnS6MG/H3srAMjqqaF26A7socr87pIgt64dr5rxoSbDRWRPChGQ8y7wKyV8VeyRNF37e3E5KB3bQVqjSYaQ==} dependencies: '@types/mdast': 3.0.15 '@types/unist': 2.0.10 @@ -7695,24 +6136,30 @@ snapshots: unified-lint-rule: 2.1.2 unist-util-position: 4.0.4 unist-util-visit: 4.1.2 + dev: true - remark-lint-table-pipe-alignment@3.1.3: + /remark-lint-table-pipe-alignment@3.1.3: + resolution: {integrity: sha512-bnE8WrB4kSrN+Yr+xN2GHWVgGukeSFU43qPMrpCzTyOSbzep366wORlFKqZmyFPEkIZ/uAUFS0Qm9DND66Yz/A==} dependencies: '@types/mdast': 3.0.15 unified: 10.1.2 unified-lint-rule: 2.1.2 unist-util-position: 4.0.4 unist-util-visit: 4.1.2 + dev: true - remark-lint-table-pipes@4.1.2: + /remark-lint-table-pipes@4.1.2: + resolution: {integrity: sha512-Ex2cJDXA0hdD9CC5Nu0p3K5LP+AhzPvk4sIOSbevCTSRyCS/SkNk4CQ6pwWBxuPVuHQUkqXkT8lgu8wwr/9A3A==} dependencies: '@types/mdast': 3.0.15 unified: 10.1.2 unified-lint-rule: 2.1.2 unist-util-position: 4.0.4 unist-util-visit: 4.1.2 + dev: true - remark-lint-unordered-list-marker-style@3.1.2: + /remark-lint-unordered-list-marker-style@3.1.2: + resolution: {integrity: sha512-JFiyB4ZprJGGndCaFB8FssXd48m4Kh+CUqzNgu3lBLEiW8dEAGRlD9M2AzyyA+Q29WJP/FntDCbP22DeON91UA==} dependencies: '@types/mdast': 3.0.15 unified: 10.1.2 @@ -7720,30 +6167,37 @@ snapshots: unist-util-generated: 2.0.1 unist-util-position: 4.0.4 unist-util-visit: 4.1.2 + dev: true - remark-lint@9.1.2: + /remark-lint@9.1.2: + resolution: {integrity: sha512-m9e/aPlh7tsvfJfj8tPxrQzD6oEdb9Foko+Ya/6OwUP9EoGMfehv1Qtv26W1DoH58Wn8rT8CD+KuprTWscMmIA==} dependencies: '@types/mdast': 3.0.15 remark-message-control: 7.1.1 unified: 10.1.2 transitivePeerDependencies: - supports-color + dev: true - remark-math@5.1.1: + /remark-math@5.1.1: + resolution: {integrity: sha512-cE5T2R/xLVtfFI4cCePtiRn+e6jKMtFDR3P8V3qpv8wpKjwvHoBA4eJzvX+nVrnlNy0911bdGmuspCSwetfYHw==} dependencies: '@types/mdast': 3.0.15 mdast-util-math: 2.0.2 micromark-extension-math: 2.1.2 unified: 10.1.2 + dev: false - remark-mdx@2.3.0: + /remark-mdx@2.3.0: + resolution: {integrity: sha512-g53hMkpM0I98MU266IzDFMrTD980gNF3BJnkyFcmN+dD873mQeD5rdMO3Y2X+x8umQfbSE0PcoEDl7ledSA+2g==} dependencies: mdast-util-mdx: 2.0.1 micromark-extension-mdxjs: 1.0.1 transitivePeerDependencies: - supports-color - remark-message-control@7.1.1: + /remark-message-control@7.1.1: + resolution: {integrity: sha512-xKRWl1NTBOKed0oEtCd8BUfH5m4s8WXxFFSoo7uUwx6GW/qdCy4zov5LfPyw7emantDmhfWn5PdIZgcbVcWMDQ==} dependencies: '@types/mdast': 3.0.15 mdast-comment-marker: 2.1.2 @@ -7752,8 +6206,10 @@ snapshots: vfile: 5.3.7 transitivePeerDependencies: - supports-color + dev: true - remark-parse@10.0.2: + /remark-parse@10.0.2: + resolution: {integrity: sha512-3ydxgHa/ZQzG8LvC7jTXccARYDcRld3VfcgIIFs7bI6vbRSxJJmzgLEIIoYKyrfhaY+ujuWaf/PJiMZXoiCXgw==} dependencies: '@types/mdast': 3.0.15 mdast-util-from-markdown: 1.3.1 @@ -7761,7 +6217,8 @@ snapshots: transitivePeerDependencies: - supports-color - remark-parse@11.0.0: + /remark-parse@11.0.0: + resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==} dependencies: '@types/mdast': 4.0.3 mdast-util-from-markdown: 2.0.0 @@ -7769,8 +6226,10 @@ snapshots: unified: 11.0.4 transitivePeerDependencies: - supports-color + dev: true - remark-preset-lint-consistent@5.1.2: + /remark-preset-lint-consistent@5.1.2: + resolution: {integrity: sha512-RQrWBFmyIkKfXtp9P1Fui7UbGSfXth9nuvRJUVnO0vfevBJe02iyMZWPokXSwkDOI/cM539wj0i3vrQupz+v5A==} dependencies: '@types/mdast': 3.0.15 remark-lint: 9.1.2 @@ -7789,8 +6248,10 @@ snapshots: unified: 10.1.2 transitivePeerDependencies: - supports-color + dev: true - remark-preset-lint-recommended@6.1.3: + /remark-preset-lint-recommended@6.1.3: + resolution: {integrity: sha512-DGjbeP2TsFmQeJflUiIvJWAOs1PxJt7SG3WQyMxOppkRr/up+mxWVkuv+6AUuaR0EsuaaFGz7WmZM5TrSSFWJw==} dependencies: '@types/mdast': 3.0.15 remark-lint: 9.1.2 @@ -7811,34 +6272,44 @@ snapshots: unified: 10.1.2 transitivePeerDependencies: - supports-color + dev: true - remark-reading-time@2.0.1: + /remark-reading-time@2.0.1: + resolution: {integrity: sha512-fy4BKy9SRhtYbEHvp6AItbRTnrhiDGbqLQTSYVbQPGuRCncU1ubSsh9p/W5QZSxtYcUXv8KGL0xBgPLyNJA1xw==} dependencies: estree-util-is-identifier-name: 2.1.0 estree-util-value-to-estree: 1.3.0 reading-time: 1.5.0 unist-util-visit: 3.1.0 + dev: false - remark-rehype@10.1.0: + /remark-rehype@10.1.0: + resolution: {integrity: sha512-EFmR5zppdBp0WQeDVZ/b66CWJipB2q2VLNFMabzDSGR66Z2fQii83G5gTBbgGEnEEA0QRussvrFHxk1HWGJskw==} dependencies: '@types/hast': 2.3.10 '@types/mdast': 3.0.15 mdast-util-to-hast: 12.3.0 unified: 10.1.2 + dev: false - remark-stringify@10.0.3: + /remark-stringify@10.0.3: + resolution: {integrity: sha512-koyOzCMYoUHudypbj4XpnAKFbkddRMYZHwghnxd7ue5210WzGw6kOBwauJTRUMq16jsovXx8dYNvSSWP89kZ3A==} dependencies: '@types/mdast': 3.0.15 mdast-util-to-markdown: 1.5.0 unified: 10.1.2 + dev: true - remark-stringify@11.0.0: + /remark-stringify@11.0.0: + resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==} dependencies: '@types/mdast': 4.0.3 mdast-util-to-markdown: 2.1.0 unified: 11.0.4 + dev: true - remark@15.0.1: + /remark@15.0.1: + resolution: {integrity: sha512-Eht5w30ruCXgFmxVUSlNWQ9iiimq07URKeFS3hNc8cUWy1llX4KDWfyEDZRycMc+znsN9Ux5/tJ/BFdgdOwA3A==} dependencies: '@types/mdast': 4.0.3 remark-parse: 11.0.0 @@ -7846,71 +6317,123 @@ snapshots: unified: 11.0.4 transitivePeerDependencies: - supports-color + dev: true - remove-accents@0.5.0: {} + /remove-accents@0.5.0: + resolution: {integrity: sha512-8g3/Otx1eJaVD12e31UbJj1YzdtVvzH85HV7t+9MJYk/u3XmkOUJ5Ys9wQrf9PCPK8+xn4ymzqYCiZl6QWKn+A==} + dev: false - repeat-string@1.6.1: {} + /repeat-string@1.6.1: + resolution: {integrity: sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==} + engines: {node: '>=0.10'} + dev: true - require-from-string@2.0.2: {} + /require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + dev: true - resolve-from@4.0.0: {} + /resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + dev: true - resolve-from@5.0.0: {} + /resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + dev: true - reusify@1.0.4: {} + /reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - rimraf@3.0.2: + /rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + hasBin: true dependencies: glob: 7.2.3 + dev: true - rlp@2.2.7: + /rlp@2.2.7: + resolution: {integrity: sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ==} + hasBin: true dependencies: bn.js: 5.2.1 + dev: true - robust-predicates@3.0.2: {} + /robust-predicates@3.0.2: + resolution: {integrity: sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==} + dev: false - run-parallel@1.2.0: + /run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} dependencies: queue-microtask: 1.2.3 - rw@1.3.3: {} + /rw@1.3.3: + resolution: {integrity: sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==} + dev: false - sade@1.8.1: + /sade@1.8.1: + resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} + engines: {node: '>=6'} dependencies: mri: 1.2.0 - safe-buffer@5.2.1: {} + /safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + dev: true - safer-buffer@2.1.2: {} + /safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + dev: false - scheduler@0.23.2: + /scheduler@0.23.2: + resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} dependencies: loose-envify: 1.4.0 + dev: false - scroll-into-view-if-needed@3.1.0: + /scroll-into-view-if-needed@3.1.0: + resolution: {integrity: sha512-49oNpRjWRvnU8NyGVmUaYG4jtTkNonFZI86MmGRDqBphEK2EXT9gdEUoQPZhuBM8yWHxCWbobltqYO5M4XrUvQ==} dependencies: compute-scroll-into-view: 3.1.0 + dev: false - scrypt-js@3.0.1: {} + /scrypt-js@3.0.1: + resolution: {integrity: sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==} + dev: true - search-insights@2.15.0: {} + /search-insights@2.17.2: + resolution: {integrity: sha512-zFNpOpUO+tY2D85KrxJ+aqwnIfdEGi06UH2+xEb+Bp9Mwznmauqc9djbnBibJO5mpfUPPa8st6Sx65+vbeO45g==} + dev: false - section-matter@1.0.0: + /section-matter@1.0.0: + resolution: {integrity: sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==} + engines: {node: '>=4'} dependencies: extend-shallow: 2.0.1 kind-of: 6.0.3 - semver@7.6.0: + /semver@7.6.0: + resolution: {integrity: sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==} + engines: {node: '>=10'} + hasBin: true dependencies: lru-cache: 6.0.0 + dev: true - sentence-case@3.0.4: + /sentence-case@3.0.4: + resolution: {integrity: sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg==} dependencies: no-case: 3.0.4 tslib: 2.6.2 upper-case-first: 2.0.2 + dev: false - set-function-length@1.2.2: + /set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} dependencies: define-data-property: 1.1.4 es-errors: 1.3.0 @@ -7918,206 +6441,363 @@ snapshots: get-intrinsic: 1.2.4 gopd: 1.0.1 has-property-descriptors: 1.0.2 + dev: false - set-function-name@2.0.2: + /set-function-name@2.0.2: + resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} + engines: {node: '>= 0.4'} dependencies: define-data-property: 1.1.4 es-errors: 1.3.0 functions-have-names: 1.2.3 has-property-descriptors: 1.0.2 + dev: false - shebang-command@1.2.0: + /shebang-command@1.2.0: + resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} + engines: {node: '>=0.10.0'} dependencies: shebang-regex: 1.0.0 + dev: false - shebang-command@2.0.0: + /shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} dependencies: shebang-regex: 3.0.0 + dev: true - shebang-regex@1.0.0: {} + /shebang-regex@1.0.0: + resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==} + engines: {node: '>=0.10.0'} + dev: false - shebang-regex@3.0.0: {} + /shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + dev: true - shiki@0.14.7: + /shiki@0.14.7: + resolution: {integrity: sha512-dNPAPrxSc87ua2sKJ3H5dQ/6ZaY8RNnaAqK+t0eG7p0Soi2ydiqbGOTaZCqaYvA/uZYfS1LJnemt3Q+mSfcPCg==} dependencies: ansi-sequence-parser: 1.1.1 jsonc-parser: 3.2.1 vscode-oniguruma: 1.7.0 vscode-textmate: 8.0.0 + dev: false - side-channel@1.0.6: + /side-channel@1.0.6: + resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} + engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 es-errors: 1.3.0 get-intrinsic: 1.2.4 object-inspect: 1.13.1 + dev: false - signal-exit@3.0.7: {} + /signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} - signal-exit@4.1.0: {} + /signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + dev: true - slash@3.0.0: {} + /slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} - snake-case@3.0.4: + /snake-case@3.0.4: + resolution: {integrity: sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==} dependencies: dot-case: 3.0.4 tslib: 2.6.2 + dev: false - sort-keys@5.0.0: + /sort-keys@5.0.0: + resolution: {integrity: sha512-Pdz01AvCAottHTPQGzndktFNdbRA75BgOfeT1hH+AMnJFv8lynkPi42rfeEhpx1saTEI3YNMWxfqu0sFD1G8pw==} + engines: {node: '>=12'} dependencies: is-plain-obj: 4.1.0 + dev: false - source-map-js@1.2.0: {} + /source-map-js@1.2.0: + resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} + engines: {node: '>=0.10.0'} + dev: false - source-map@0.7.4: {} + /source-map@0.7.4: + resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} + engines: {node: '>= 8'} + dev: false - space-separated-tokens@2.0.2: {} + /space-separated-tokens@2.0.2: + resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} + dev: false - sprintf-js@1.0.3: {} + /sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} - stop-iteration-iterator@1.0.0: + /stop-iteration-iterator@1.0.0: + resolution: {integrity: sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==} + engines: {node: '>= 0.4'} dependencies: internal-slot: 1.0.7 + dev: false - streamsearch@1.1.0: {} + /streamsearch@1.1.0: + resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} + engines: {node: '>=10.0.0'} + dev: false - string-width@4.2.3: + /string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} dependencies: emoji-regex: 8.0.0 is-fullwidth-code-point: 3.0.0 strip-ansi: 6.0.1 + dev: true - string-width@5.1.2: + /string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} dependencies: eastasianwidth: 0.2.0 emoji-regex: 9.2.2 strip-ansi: 7.1.0 + dev: true - string_decoder@1.3.0: + /string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} dependencies: safe-buffer: 5.2.1 + dev: true - stringify-entities@4.0.4: + /stringify-entities@4.0.4: + resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} dependencies: character-entities-html4: 2.1.0 character-entities-legacy: 3.0.0 - strip-ansi@6.0.1: + /strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} dependencies: ansi-regex: 5.0.1 + dev: true - strip-ansi@7.1.0: + /strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} dependencies: ansi-regex: 6.0.1 + dev: true - strip-bom-string@1.0.0: {} + /strip-bom-string@1.0.0: + resolution: {integrity: sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==} + engines: {node: '>=0.10.0'} - strip-eof@1.0.0: {} + /strip-eof@1.0.0: + resolution: {integrity: sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==} + engines: {node: '>=0.10.0'} + dev: false - strip-hex-prefix@1.0.0: + /strip-hex-prefix@1.0.0: + resolution: {integrity: sha512-q8d4ue7JGEiVcypji1bALTos+0pWtyGlivAWyPuTkHzuTCJqrK9sWxYQZUq6Nq3cuyv3bm734IhHvHtGGURU6A==} + engines: {node: '>=6.5.0', npm: '>=3'} dependencies: is-hex-prefixed: 1.0.0 + dev: true - strip-indent@4.0.0: + /strip-indent@4.0.0: + resolution: {integrity: sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA==} + engines: {node: '>=12'} dependencies: min-indent: 1.0.1 + dev: true - strip-json-comments@3.1.1: {} + /strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + dev: true - style-to-object@0.4.4: + /style-to-object@0.4.4: + resolution: {integrity: sha512-HYNoHZa2GorYNyqiCaBgsxvcJIn7OHq6inEga+E6Ke3m5JkoqpQbnFssk4jwe+K7AhGa2fcha4wSOf1Kn01dMg==} dependencies: inline-style-parser: 0.1.1 + dev: false - styled-jsx@5.1.1(react@18.3.1): + /styled-jsx@5.1.1(react@18.3.1): + resolution: {integrity: sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==} + engines: {node: '>= 12.0.0'} + peerDependencies: + '@babel/core': '*' + babel-plugin-macros: '*' + react: '>= 16.8.0 || 17.x.x || ^18.0.0-0' + peerDependenciesMeta: + '@babel/core': + optional: true + babel-plugin-macros: + optional: true dependencies: client-only: 0.0.1 react: 18.3.1 + dev: false - stylis@4.3.2: {} + /stylis@4.3.2: + resolution: {integrity: sha512-bhtUjWd/z6ltJiQwg0dUfxEJ+W+jdqQd8TbWLWyeIJHlnsqmGLRFFd8e5mA0AZi/zx90smXRlN66YMTcaSFifg==} + dev: false - supports-color@4.5.0: + /supports-color@4.5.0: + resolution: {integrity: sha512-ycQR/UbvI9xIlEdQT1TQqwoXtEldExbCEAJgRo5YXlmSKjv6ThHnP9/vwGa1gr19Gfw+LkFd7KqYMhzrRC5JYw==} + engines: {node: '>=4'} dependencies: has-flag: 2.0.0 + dev: false - supports-color@5.5.0: + /supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} dependencies: has-flag: 3.0.0 - supports-color@7.2.0: + /supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} dependencies: has-flag: 4.0.0 - supports-color@9.4.0: {} + /supports-color@9.4.0: + resolution: {integrity: sha512-VL+lNrEoIXww1coLPOmiEmK/0sGigko5COxI09KzHc2VJXJsQ37UaQ+8quuxjDeA7+KnLGTWRyOXSLLR2Wb4jw==} + engines: {node: '>=12'} + dev: true - synckit@0.9.0: + /synckit@0.9.0: + resolution: {integrity: sha512-7RnqIMq572L8PeEzKeBINYEJDDxpcH8JEgLwUqBd3TkofhFRbkq4QLR0u+36avGAhCRbk2nnmjcW9SE531hPDg==} + engines: {node: ^14.18.0 || >=16.0.0} dependencies: '@pkgr/core': 0.1.1 tslib: 2.6.2 + dev: true - tabbable@6.2.0: {} + /tabbable@6.2.0: + resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==} + dev: false - text-table@0.2.0: {} + /text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + dev: true - tinyurl@1.1.7: {} + /tinyurl@1.1.7: + resolution: {integrity: sha512-NCnyDkBTByS/pLH/Vrx/DPL8EciAUDoAvruaM/WnQLfX6Uame3D1nuWNy2Z9CXw7rcsok0tjuonRLolhmyz5rg==} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. + dev: true - title@3.5.3: + /title@3.5.3: + resolution: {integrity: sha512-20JyowYglSEeCvZv3EZ0nZ046vLarO37prvV0mbtQV7C8DJPGgN967r8SJkqd3XK3K3lD3/Iyfp3avjfil8Q2Q==} + hasBin: true dependencies: arg: 1.0.0 chalk: 2.3.0 clipboardy: 1.2.2 titleize: 1.0.0 + dev: false - titleize@1.0.0: {} + /titleize@1.0.0: + resolution: {integrity: sha512-TARUb7z1pGvlLxgPk++7wJ6aycXF3GJ0sNSBTAsTuJrQG5QuZlkUQP+zl+nbjAh4gMX9yDw9ZYklMd7vAfJKEw==} + engines: {node: '>=0.10.0'} + dev: false - to-gatsby-remark-plugin@0.1.0: + /to-gatsby-remark-plugin@0.1.0: + resolution: {integrity: sha512-blmhJ/gIrytWnWLgPSRCkhCPeki6UBK2daa3k9mGahN7GjwHu8KrS7F70MvwlsG7IE794JLgwAdCbi4hU4faFQ==} dependencies: to-vfile: 6.1.0 + dev: true - to-regex-range@5.0.1: + /to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} dependencies: is-number: 7.0.0 - to-vfile@6.1.0: + /to-vfile@6.1.0: + resolution: {integrity: sha512-BxX8EkCxOAZe+D/ToHdDsJcVI4HqQfmw0tCkp31zf3dNP/XWIAjU4CmeuSwsSoOzOTqHPOL0KUzyZqJplkD0Qw==} dependencies: is-buffer: 2.0.5 vfile: 4.2.1 + dev: true - to-vfile@7.2.4: + /to-vfile@7.2.4: + resolution: {integrity: sha512-2eQ+rJ2qGbyw3senPI0qjuM7aut8IYXK6AEoOWb+fJx/mQYzviTckm1wDjq91QYHAPBTYzmdJXxMFA6Mk14mdw==} dependencies: is-buffer: 2.0.5 vfile: 5.3.7 + dev: true - tr46@0.0.3: {} + /tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + dev: true - treeify@1.1.0: {} + /treeify@1.1.0: + resolution: {integrity: sha512-1m4RA7xVAJrSGrrXGs0L3YTwyvBs2S8PbRHaLZAkFw7JR8oIFwYtysxlBZhYIa7xSyiYJKZ3iGrrk55cGA3i9A==} + engines: {node: '>=0.6'} + dev: true - trim-lines@3.0.1: {} + /trim-lines@3.0.1: + resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} + dev: false - trough@2.2.0: {} + /trough@2.2.0: + resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} - ts-dedent@2.2.0: {} + /ts-dedent@2.2.0: + resolution: {integrity: sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==} + engines: {node: '>=6.10'} + dev: false - tslib@2.6.2: {} + /tslib@2.6.2: + resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} - type-check@0.4.0: + /type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} dependencies: prelude-ls: 1.2.1 + dev: true - type-detect@4.0.8: {} + /type-detect@4.0.8: + resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} + engines: {node: '>=4'} + dev: true - type-fest@0.20.2: {} + /type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + dev: true - type-fest@1.4.0: {} + /type-fest@1.4.0: + resolution: {integrity: sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==} + engines: {node: '>=10'} - typedarray-to-buffer@3.1.5: + /typedarray-to-buffer@3.1.5: + resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} dependencies: is-typedarray: 1.0.0 + dev: true - typedarray@0.0.6: {} + /typedarray@0.0.6: + resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} + dev: true - typescript@5.4.5: {} + /typescript@5.4.5: + resolution: {integrity: sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==} + engines: {node: '>=14.17'} + hasBin: true - unified-engine@10.1.0: + /unified-engine@10.1.0: + resolution: {integrity: sha512-5+JDIs4hqKfHnJcVCxTid1yBoI/++FfF/1PFdSMpaftZZZY+qg2JFruRbf7PaIwa9KgLotXQV3gSjtY0IdcFGQ==} dependencies: '@types/concat-stream': 2.0.3 '@types/debug': 4.1.12 @@ -8143,15 +6823,19 @@ snapshots: yaml: 2.4.2 transitivePeerDependencies: - supports-color + dev: true - unified-lint-rule@2.1.2: + /unified-lint-rule@2.1.2: + resolution: {integrity: sha512-JWudPtRN7TLFHVLEVZ+Rm8FUb6kCAtHxEXFgBGDxRSdNMnGyTU5zyYvduHSF/liExlFB3vdFvsAHnNVE/UjAwA==} dependencies: '@types/unist': 2.0.10 trough: 2.2.0 unified: 10.1.2 vfile: 5.3.7 + dev: true - unified-message-control@4.0.0: + /unified-message-control@4.0.0: + resolution: {integrity: sha512-1b92N+VkPHftOsvXNOtkJm4wHlr+UDmTBF2dUzepn40oy9NxanJ9xS1RwUBTjXJwqr2K0kMbEyv1Krdsho7+Iw==} dependencies: '@types/unist': 2.0.10 unist-util-is: 5.2.1 @@ -8159,8 +6843,10 @@ snapshots: vfile: 5.3.7 vfile-location: 4.1.0 vfile-message: 3.1.4 + dev: true - unified@10.1.2: + /unified@10.1.2: + resolution: {integrity: sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==} dependencies: '@types/unist': 2.0.10 bail: 2.0.2 @@ -8170,7 +6856,8 @@ snapshots: trough: 2.2.0 vfile: 5.3.7 - unified@11.0.4: + /unified@11.0.4: + resolution: {integrity: sha512-apMPnyLjAX+ty4OrNap7yumyVAMlKx5IWU2wlzzUdYJO9A8f1p9m/gywF/GM2ZDFcjQPrx59Mc90KwmxsoklxQ==} dependencies: '@types/unist': 3.0.2 bail: 2.0.2 @@ -8179,160 +6866,217 @@ snapshots: is-plain-obj: 4.1.0 trough: 2.2.0 vfile: 6.0.1 + dev: true - unique-string@3.0.0: + /unique-string@3.0.0: + resolution: {integrity: sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==} + engines: {node: '>=12'} dependencies: crypto-random-string: 4.0.0 + dev: true - unist-util-find-after@5.0.0: + /unist-util-find-after@5.0.0: + resolution: {integrity: sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==} dependencies: '@types/unist': 3.0.2 unist-util-is: 6.0.0 + dev: false - unist-util-generated@2.0.1: {} + /unist-util-generated@2.0.1: + resolution: {integrity: sha512-qF72kLmPxAw0oN2fwpWIqbXAVyEqUzDHMsbtPvOudIlUzXYFIeQIuxXQCRCFh22B7cixvU0MG7m3MW8FTq/S+A==} - unist-util-inspect@7.0.2: + /unist-util-inspect@7.0.2: + resolution: {integrity: sha512-Op0XnmHUl6C2zo/yJCwhXQSm/SmW22eDZdWP2qdf4WpGrgO1ZxFodq+5zFyeRGasFjJotAnLgfuD1jkcKqiH1Q==} dependencies: '@types/unist': 2.0.10 + dev: true - unist-util-is@5.2.1: + /unist-util-is@5.2.1: + resolution: {integrity: sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==} dependencies: '@types/unist': 2.0.10 - unist-util-is@6.0.0: + /unist-util-is@6.0.0: + resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} dependencies: '@types/unist': 3.0.2 - unist-util-position-from-estree@1.1.2: + /unist-util-position-from-estree@1.1.2: + resolution: {integrity: sha512-poZa0eXpS+/XpoQwGwl79UUdea4ol2ZuCYguVaJS4qzIOMDzbqz8a3erUCOmubSZkaOuGamb3tX790iwOIROww==} dependencies: '@types/unist': 2.0.10 - unist-util-position@4.0.4: + /unist-util-position@4.0.4: + resolution: {integrity: sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg==} dependencies: '@types/unist': 2.0.10 - unist-util-position@5.0.0: + /unist-util-position@5.0.0: + resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} dependencies: '@types/unist': 3.0.2 + dev: false - unist-util-remove-position@4.0.2: + /unist-util-remove-position@4.0.2: + resolution: {integrity: sha512-TkBb0HABNmxzAcfLf4qsIbFbaPDvMO6wa3b3j4VcEzFVaw1LBKwnW4/sRJ/atSLSzoIg41JWEdnE7N6DIhGDGQ==} dependencies: '@types/unist': 2.0.10 unist-util-visit: 4.1.2 - unist-util-remove-position@5.0.0: + /unist-util-remove-position@5.0.0: + resolution: {integrity: sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==} dependencies: '@types/unist': 3.0.2 unist-util-visit: 5.0.0 + dev: false - unist-util-remove@4.0.0: + /unist-util-remove@4.0.0: + resolution: {integrity: sha512-b4gokeGId57UVRX/eVKej5gXqGlc9+trkORhFJpu9raqZkZhU0zm8Doi05+HaiBsMEIJowL+2WtQ5ItjsngPXg==} dependencies: '@types/unist': 3.0.2 unist-util-is: 6.0.0 unist-util-visit-parents: 6.0.1 + dev: false - unist-util-stringify-position@2.0.3: + /unist-util-stringify-position@2.0.3: + resolution: {integrity: sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==} dependencies: '@types/unist': 2.0.10 + dev: true - unist-util-stringify-position@3.0.3: + /unist-util-stringify-position@3.0.3: + resolution: {integrity: sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==} dependencies: '@types/unist': 2.0.10 - unist-util-stringify-position@4.0.0: + /unist-util-stringify-position@4.0.0: + resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} dependencies: '@types/unist': 3.0.2 - unist-util-visit-parents@4.1.1: + /unist-util-visit-parents@4.1.1: + resolution: {integrity: sha512-1xAFJXAKpnnJl8G7K5KgU7FY55y3GcLIXqkzUj5QF/QVP7biUm0K0O2oqVkYsdjzJKifYeWn9+o6piAK2hGSHw==} dependencies: '@types/unist': 2.0.10 unist-util-is: 5.2.1 - unist-util-visit-parents@5.1.3: + /unist-util-visit-parents@5.1.3: + resolution: {integrity: sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==} dependencies: '@types/unist': 2.0.10 unist-util-is: 5.2.1 - unist-util-visit-parents@6.0.1: + /unist-util-visit-parents@6.0.1: + resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==} dependencies: '@types/unist': 3.0.2 unist-util-is: 6.0.0 - unist-util-visit@3.1.0: + /unist-util-visit@3.1.0: + resolution: {integrity: sha512-Szoh+R/Ll68QWAyQyZZpQzZQm2UPbxibDvaY8Xc9SUtYgPsDzx5AWSk++UUt2hJuow8mvwR+rG+LQLw+KsuAKA==} dependencies: '@types/unist': 2.0.10 unist-util-is: 5.2.1 unist-util-visit-parents: 4.1.1 - unist-util-visit@4.1.2: + /unist-util-visit@4.1.2: + resolution: {integrity: sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==} dependencies: '@types/unist': 2.0.10 unist-util-is: 5.2.1 unist-util-visit-parents: 5.1.3 - unist-util-visit@5.0.0: + /unist-util-visit@5.0.0: + resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} dependencies: '@types/unist': 3.0.2 unist-util-is: 6.0.0 unist-util-visit-parents: 6.0.1 - upper-case-first@2.0.2: + /upper-case-first@2.0.2: + resolution: {integrity: sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==} dependencies: tslib: 2.6.2 + dev: false - upper-case@2.0.2: + /upper-case@2.0.2: + resolution: {integrity: sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg==} dependencies: tslib: 2.6.2 + dev: false - uri-js@4.4.1: + /uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} dependencies: punycode: 2.3.1 + dev: true - utf8@3.0.0: {} + /utf8@3.0.0: + resolution: {integrity: sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ==} + dev: true - util-deprecate@1.0.2: {} + /util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + dev: true - uuid@9.0.1: {} + /uuid@9.0.1: + resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} + hasBin: true + dev: false - uvu@0.5.6: + /uvu@0.5.6: + resolution: {integrity: sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA==} + engines: {node: '>=8'} + hasBin: true dependencies: dequal: 2.0.3 diff: 5.2.0 kleur: 4.1.5 sade: 1.8.1 - vfile-location@4.1.0: + /vfile-location@4.1.0: + resolution: {integrity: sha512-YF23YMyASIIJXpktBa4vIGLJ5Gs88UB/XePgqPmTa7cDA+JeO3yclbpheQYCHjVHBn/yePzrXuygIL+xbvRYHw==} dependencies: '@types/unist': 2.0.10 vfile: 5.3.7 + dev: true - vfile-location@5.0.2: + /vfile-location@5.0.2: + resolution: {integrity: sha512-NXPYyxyBSH7zB5U6+3uDdd6Nybz6o6/od9rk8bp9H8GR3L+cm/fC0uUTbqBmUTnMCUDslAGBOIKNfvvb+gGlDg==} dependencies: '@types/unist': 3.0.2 vfile: 6.0.1 + dev: false - vfile-matter@3.0.1: + /vfile-matter@3.0.1: + resolution: {integrity: sha512-CAAIDwnh6ZdtrqAuxdElUqQRQDQgbbIrYtDYI8gCjXS1qQ+1XdLoK8FIZWxJwn0/I+BkSSZpar3SOgjemQz4fg==} dependencies: '@types/js-yaml': 4.0.9 is-buffer: 2.0.5 js-yaml: 4.1.0 + dev: false - vfile-message@2.0.4: + /vfile-message@2.0.4: + resolution: {integrity: sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==} dependencies: '@types/unist': 2.0.10 unist-util-stringify-position: 2.0.3 + dev: true - vfile-message@3.1.4: + /vfile-message@3.1.4: + resolution: {integrity: sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==} dependencies: '@types/unist': 2.0.10 unist-util-stringify-position: 3.0.3 - vfile-message@4.0.2: + /vfile-message@4.0.2: + resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==} dependencies: '@types/unist': 3.0.2 unist-util-stringify-position: 4.0.0 - vfile-reporter@7.0.5: + /vfile-reporter@7.0.5: + resolution: {integrity: sha512-NdWWXkv6gcd7AZMvDomlQbK3MqFWL1RlGzMn++/O2TI+68+nqxCPTvLugdOtfSzXmjh+xUyhp07HhlrbJjT+mw==} dependencies: '@types/supports-color': 8.1.3 string-width: 5.1.2 @@ -8342,69 +7086,100 @@ snapshots: vfile-message: 3.1.4 vfile-sort: 3.0.1 vfile-statistics: 2.0.1 + dev: true - vfile-sort@3.0.1: + /vfile-sort@3.0.1: + resolution: {integrity: sha512-1os1733XY6y0D5x0ugqSeaVJm9lYgj0j5qdcZQFyxlZOSy1jYarL77lLyb5gK4Wqr1d5OxmuyflSO3zKyFnTFw==} dependencies: vfile: 5.3.7 vfile-message: 3.1.4 + dev: true - vfile-statistics@2.0.1: + /vfile-statistics@2.0.1: + resolution: {integrity: sha512-W6dkECZmP32EG/l+dp2jCLdYzmnDBIw6jwiLZSER81oR5AHRcVqL+k3Z+pfH1R73le6ayDkJRMk0sutj1bMVeg==} dependencies: vfile: 5.3.7 vfile-message: 3.1.4 + dev: true - vfile@4.2.1: + /vfile@4.2.1: + resolution: {integrity: sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==} dependencies: '@types/unist': 2.0.10 is-buffer: 2.0.5 unist-util-stringify-position: 2.0.3 vfile-message: 2.0.4 + dev: true - vfile@5.3.7: + /vfile@5.3.7: + resolution: {integrity: sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==} dependencies: '@types/unist': 2.0.10 is-buffer: 2.0.5 unist-util-stringify-position: 3.0.3 vfile-message: 3.1.4 - vfile@6.0.1: + /vfile@6.0.1: + resolution: {integrity: sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw==} dependencies: '@types/unist': 3.0.2 unist-util-stringify-position: 4.0.0 vfile-message: 4.0.2 - viem@2.9.28(typescript@5.4.5)(zod@3.23.8): + /viem@2.9.28(typescript@5.4.5): + resolution: {integrity: sha512-/1iTg8yQlCNJ+7wSmdsBNB/vhjWqFJtTH6XZXHjGXrZnlBxAtHR5ZAr5TvTJc/2nhVIVE4BkCe5JCrIiSuZodg==} + peerDependencies: + typescript: '>=5.0.4' + peerDependenciesMeta: + typescript: + optional: true dependencies: '@adraffy/ens-normalize': 1.10.0 '@noble/curves': 1.2.0 '@noble/hashes': 1.3.2 '@scure/bip32': 1.3.2 '@scure/bip39': 1.2.1 - abitype: 1.0.0(typescript@5.4.5)(zod@3.23.8) + abitype: 1.0.0(typescript@5.4.5) isows: 1.0.3(ws@8.13.0) - ws: 8.13.0 - optionalDependencies: typescript: 5.4.5 + ws: 8.13.0 transitivePeerDependencies: - bufferutil - utf-8-validate - zod + dev: false - vscode-languageserver-textdocument@1.0.11: {} + /vscode-languageserver-textdocument@1.0.11: + resolution: {integrity: sha512-X+8T3GoiwTVlJbicx/sIAF+yuJAqz8VvwJyoMVhwEMoEKE/fkDmrqUgDMyBECcM2A2frVZIUj5HI/ErRXCfOeA==} + dev: true - vscode-oniguruma@1.7.0: {} + /vscode-oniguruma@1.7.0: + resolution: {integrity: sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==} + dev: false - vscode-textmate@8.0.0: {} + /vscode-textmate@8.0.0: + resolution: {integrity: sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg==} + dev: false - vscode-uri@3.0.8: {} + /vscode-uri@3.0.8: + resolution: {integrity: sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==} + dev: true - walk-up-path@3.0.1: {} + /walk-up-path@3.0.1: + resolution: {integrity: sha512-9YlCL/ynK3CTlrSRrDxZvUauLzAswPCrsaCgilqFevUYpeEW0/3ScEjaa3kbW/T0ghhkEr7mv+fpjqn1Y1YuTA==} + dev: true - web-namespaces@2.0.1: {} + /web-namespaces@2.0.1: + resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} + dev: false - web-worker@1.3.0: {} + /web-worker@1.3.0: + resolution: {integrity: sha512-BSR9wyRsy/KOValMgd5kMyr3JzpdeoR9KVId8u5GVlTTAtNChlsE4yTxeY7zMdNSyOmoKBv8NH2qeRY9Tg+IaA==} + dev: false - web3-utils@1.10.4: + /web3-utils@1.10.4: + resolution: {integrity: sha512-tsu8FiKJLk2PzhDl9fXbGUWTkkVXYhtTA+SmEFkKft+9BgwLxfCRpU96sWv7ICC8zixBNd3JURVoiR3dUXgP8A==} + engines: {node: '>=8.0.0'} dependencies: '@ethereumjs/util': 8.1.0 bn.js: 5.2.1 @@ -8414,86 +7189,163 @@ snapshots: number-to-bn: 1.7.0 randombytes: 2.1.0 utf8: 3.0.0 + dev: true - webidl-conversions@3.0.1: {} + /webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + dev: true - whatwg-url@5.0.0: + /whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} dependencies: tr46: 0.0.3 webidl-conversions: 3.0.1 + dev: true - which-boxed-primitive@1.0.2: + /which-boxed-primitive@1.0.2: + resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} dependencies: is-bigint: 1.0.4 is-boolean-object: 1.1.2 is-number-object: 1.0.7 is-string: 1.0.7 is-symbol: 1.0.4 + dev: false - which-collection@1.0.2: + /which-collection@1.0.2: + resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} + engines: {node: '>= 0.4'} dependencies: is-map: 2.0.3 is-set: 2.0.3 is-weakmap: 2.0.2 is-weakset: 2.0.3 + dev: false - which-typed-array@1.1.15: + /which-typed-array@1.1.15: + resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==} + engines: {node: '>= 0.4'} dependencies: available-typed-arrays: 1.0.7 call-bind: 1.0.7 for-each: 0.3.3 gopd: 1.0.1 has-tostringtag: 1.0.2 + dev: false - which@1.3.1: + /which@1.3.1: + resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} + hasBin: true dependencies: isexe: 2.0.0 + dev: false - which@2.0.2: + /which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true dependencies: isexe: 2.0.0 + dev: true - word-wrap@1.2.5: {} + /word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + dev: true - wrap-ansi@7.0.0: + /wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} dependencies: ansi-styles: 4.3.0 string-width: 4.2.3 strip-ansi: 6.0.1 + dev: true - wrap-ansi@8.1.0: + /wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} dependencies: ansi-styles: 6.2.1 string-width: 5.1.2 strip-ansi: 7.1.0 + dev: true - wrappy@1.0.2: {} + /wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + dev: true - write-file-atomic@3.0.3: + /write-file-atomic@3.0.3: + resolution: {integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==} dependencies: imurmurhash: 0.1.4 is-typedarray: 1.0.0 signal-exit: 3.0.7 typedarray-to-buffer: 3.1.5 + dev: true - ws@7.4.6: {} + /ws@7.4.6: + resolution: {integrity: sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==} + engines: {node: '>=8.3.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + dev: true - ws@8.13.0: {} + /ws@8.13.0: + resolution: {integrity: sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + dev: false - xdg-basedir@5.1.0: {} + /xdg-basedir@5.1.0: + resolution: {integrity: sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ==} + engines: {node: '>=12'} + dev: true - yallist@2.1.2: {} + /yallist@2.1.2: + resolution: {integrity: sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==} + dev: false - yallist@4.0.0: {} + /yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + dev: true - yaml@2.3.3: {} + /yaml@2.3.3: + resolution: {integrity: sha512-zw0VAJxgeZ6+++/su5AFoqBbZbrEakwu+X0M5HmcwUiBL7AzcuPKjj5we4xfQLp78LkEMpD0cOnUhmgOVy3KdQ==} + engines: {node: '>= 14'} + dev: true - yaml@2.4.2: {} + /yaml@2.4.2: + resolution: {integrity: sha512-B3VqDZ+JAg1nZpaEmWtTXUlBneoGx6CPM9b0TENK6aoSu5t73dItudwdgmi6tHlIZZId4dZ9skcAQ2UbcyAeVA==} + engines: {node: '>= 14'} + hasBin: true + dev: true - yocto-queue@0.1.0: {} + /yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} - yocto-queue@1.0.0: {} + /yocto-queue@1.0.0: + resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} + engines: {node: '>=12.20'} + dev: true - zod@3.23.8: {} + /zod@3.23.8: + resolution: {integrity: sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==} + dev: false - zwitch@2.0.4: {} + /zwitch@2.0.4: + resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} diff --git a/words.txt b/words.txt index 33bb71948..b9abf02ce 100644 --- a/words.txt +++ b/words.txt @@ -346,6 +346,7 @@ superchain Superchain's Superchains Superscan +supersim SYNCMODE syncmode SYNCTARGET From 25bcb571d691856f3bb41068c1d778827bd98d81 Mon Sep 17 00:00:00 2001 From: cpengilly <29023967+cpengilly@users.noreply.github.com> Date: Fri, 11 Oct 2024 12:51:24 -0700 Subject: [PATCH 157/565] Update pages/stack/protocol/interop/supersim.mdx Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> --- pages/stack/protocol/interop/supersim.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/stack/protocol/interop/supersim.mdx b/pages/stack/protocol/interop/supersim.mdx index 154af5e4a..6f3aafd2a 100644 --- a/pages/stack/protocol/interop/supersim.mdx +++ b/pages/stack/protocol/interop/supersim.mdx @@ -9,7 +9,7 @@ import { Callout } from 'nextra/components' # SuperSim Explainer - Interop is currently in active development and not yet ready for production use. The information provided here may change, so we recommend checking back regularly for the most up-to-date information. + Interop is currently in active development and not yet ready for production use. The information provided here may change. It is recommended to check back regularly for the most up-to-date information. [SuperSim](https://github.com/ethereum-optimism/supersim) is a local development environment tool designed to simulate the Optimism Superchain for developers building multi-chain applications. It provides a simplified way to test and develop applications that interact with multiple chains within the Superchain ecosystem. From 80cdbf88378ba51edc5dc5803ae7a73f344dec30 Mon Sep 17 00:00:00 2001 From: krofax Date: Fri, 11 Oct 2024 20:57:00 +0100 Subject: [PATCH 158/565] enable same-page navigation --- theme.config.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/theme.config.tsx b/theme.config.tsx index b720e1a0e..1200969a0 100644 --- a/theme.config.tsx +++ b/theme.config.tsx @@ -31,7 +31,7 @@ const config: DocsThemeConfig = { banner: { key: 'viem/op-stack', text: ( - + 🎉 We are deprecating the Optimism SDK and migrating all tutorials to use viem/op-stack. Read more → ) From 63d0fe0fa11ae79648aa16725e5469356953140e Mon Sep 17 00:00:00 2001 From: cpengilly <29023967+cpengilly@users.noreply.github.com> Date: Fri, 11 Oct 2024 17:16:58 -0700 Subject: [PATCH 159/565] updates per review --- .../builders/app-developers/tools/_meta.json | 2 +- pages/stack/protocol/interop/_meta.json | 2 +- .../protocol/interop/cross-chain-message.mdx | 2 +- pages/stack/protocol/interop/explainer.mdx | 2 +- pages/stack/protocol/interop/supersim.mdx | 31 ++++++++++--------- words.txt | 1 + 6 files changed, 21 insertions(+), 19 deletions(-) diff --git a/pages/builders/app-developers/tools/_meta.json b/pages/builders/app-developers/tools/_meta.json index 37ebfbd01..6eabf1a34 100644 --- a/pages/builders/app-developers/tools/_meta.json +++ b/pages/builders/app-developers/tools/_meta.json @@ -1,6 +1,6 @@ { "ecosystem-overview": "Open Source Code Repo", - "supersim": "SuperSim IDE", + "supersim": "Supersim Multichain Development Environment", "console": { "title": "Superchain Dev Console", "href": "https://console.optimism.io/?utm_source=docs", diff --git a/pages/stack/protocol/interop/_meta.json b/pages/stack/protocol/interop/_meta.json index b45d6ad40..309682173 100644 --- a/pages/stack/protocol/interop/_meta.json +++ b/pages/stack/protocol/interop/_meta.json @@ -1,5 +1,5 @@ { "explainer": "Interop Explainer", "cross-chain-message": "Anatomy of Cross-Chain Message", - "supersim": "SuperSim Explainer" + "supersim": "Supersim Multichain Development Environment" } \ No newline at end of file diff --git a/pages/stack/protocol/interop/cross-chain-message.mdx b/pages/stack/protocol/interop/cross-chain-message.mdx index 615d852ab..c00ef600a 100644 --- a/pages/stack/protocol/interop/cross-chain-message.mdx +++ b/pages/stack/protocol/interop/cross-chain-message.mdx @@ -32,5 +32,5 @@ In the example above, `Ox123` sends 1 OP from OP Mainnet to Base, but this appli ## Next Steps * More questions? Check out the FAQ section in the [Superchain Interop Explainer](explainer#faqs) or check out this [Superchain interop design video walk-thru](https://www.youtube.com/watch?v=FKc5RgjtGes). -* Ready to get started? Use [SuperSim](https://github.com/ethereum-optimism/supersim), a local dev environment that simulates Superchain interop for testing applications against a local version of the Superchain. +* Ready to get started? Use [Supersim](supersim), a local dev environment that simulates Superchain interop for testing applications against a local version of the Superchain. * For more info about how Superchain interoperability works under the hood, [check out the specs](https://specs.optimism.io/interop/overview.html). diff --git a/pages/stack/protocol/interop/explainer.mdx b/pages/stack/protocol/interop/explainer.mdx index 284420bb0..9969ebaaa 100644 --- a/pages/stack/protocol/interop/explainer.mdx +++ b/pages/stack/protocol/interop/explainer.mdx @@ -52,7 +52,7 @@ For additional considerations, join the [Interop discussion](https://github.com/ ## Next Steps * Want to learn more? Read our guide on the anatomy of a [cross-chain message](cross-chain-message) or check out this [interop design video walk-thru](https://www.youtube.com/watch?v=FKc5RgjtGes). -* Ready to get started? Use [SuperSim](https://github.com/ethereum-optimism/supersim), a local dev environment that simulates interop for testing applications against a local version of the Superchain. +* Ready to get started? Use [Supersim](supersim), a local dev environment that simulates interop for testing applications against a local version of the Superchain. * For more info about how OP Stack interoperability works under the hood, [check out the specs](https://specs.optimism.io/interop/overview.html). ## FAQs diff --git a/pages/stack/protocol/interop/supersim.mdx b/pages/stack/protocol/interop/supersim.mdx index 6f3aafd2a..5dbcaaa06 100644 --- a/pages/stack/protocol/interop/supersim.mdx +++ b/pages/stack/protocol/interop/supersim.mdx @@ -1,48 +1,49 @@ --- -title: SuperSim Explainer +title: Supersim Multichain Development Environment lang: en-US -description: Learn how to use the SuperSim local dev environment tool designed to simulate the Optimism Superchain. +description: Learn how to use the Supersim local dev environment tool designed to simulate the Optimism Superchain. --- import { Callout } from 'nextra/components' -# SuperSim Explainer +# Supersim Multichain Development Environment Interop is currently in active development and not yet ready for production use. The information provided here may change. It is recommended to check back regularly for the most up-to-date information. -[SuperSim](https://github.com/ethereum-optimism/supersim) is a local development environment tool designed to simulate the Optimism Superchain for developers building multi-chain applications. It provides a simplified way to test and develop applications that interact with multiple chains within the Superchain ecosystem. +[Supersim](https://github.com/ethereum-optimism/Supersim) is a local development environment tool designed to simulate the Optimism Superchain for developers building multi-chain applications. It provides a simplified way to test and develop applications that interact with multiple chains within the Superchain ecosystem. -## SuperSim Workflow +## Supersim Workflow ```mermaid graph LR - A[Write Smart Contracts] --> B[Deploy on SuperSim] + A[Write Smart Contracts] --> B[Deploy on Supersim] B --> C[Test Cross-Chain Interactions] C --> D[Debug and Refine] D --> B C --> E[Ready for Production] ``` -This diagram illustrates the typical workflow for developers using SuperSim, from writing smart contracts to testing and refining cross-chain interactions. +This diagram illustrates the typical workflow for developers using Supersim, from writing smart contracts to testing and refining cross-chain interactions. ## Features and Benefits * Simulates multiple OP Stack chains locally (e.g., chain 901, 902) * Supports testing of cross-chain messaging and interactions * Includes pre-deployed interoperability contracts -* Offers a CLI interface for starting and managing SuperSim instances -* Provides JSON-RPC endpoints for each simulated chain +* Offers a CLI interface for starting and managing Supersim instances +* Provides local JSON-RPC endpoints for each simulated chain * Allows for custom configuration of chain parameters -* Facilitates testing of Superchain-specific features like SupERC20 tokens -* Integration with common Ethereum development tools (e.g., Hardhat, Foundry) +* Facilitates testing of Superchain-specific features like SuperchainERC20 tokens +* Easy to use with common Ethereum development tools +* Supports chain forking -## SuperSim CLI Interaction +## Supersim CLI Interaction ```mermaid graph TD - A[Developer] --> B[SuperSim CLI] + A[Developer] --> B[Supersim CLI] B --> C[Chain 901] B --> D[Chain 902] B --> E[...] @@ -54,10 +55,10 @@ graph TD I --> E ``` -This diagram illustrates how developers interact with SuperSim through the CLI, which then manages multiple simulated chains, each with its own JSON-RPC endpoint and pre-deployed interoperability contracts. +This diagram illustrates how developers interact with Supersim through the CLI, which simulates OP Stack specific features (specifically interop) on locally run chains, each with its own JSON-RPC endpoint and pre-deployed interoperability contracts. ## Next Steps -* Check out the dedicated [SuperSim docs](https://supersim.pages.dev/) for tutorials and specific use cases. +* Check out the dedicated [Supersim docs](https://Supersim.pages.dev/) for tutorials and specific use cases. * Questions about Interop? Check out the FAQ section in the [Superchain Interop Explainer](/stack/protocol/interop/explainer#faqs) or check out this [Superchain interop design video walk-thru](https://www.youtube.com/watch?v=FKc5RgjtGes). * For more info about how Superchain interoperability works under the hood, [check out the specs](https://specs.optimism.io/interop/overview.html). diff --git a/words.txt b/words.txt index b9abf02ce..7e0fda447 100644 --- a/words.txt +++ b/words.txt @@ -346,6 +346,7 @@ superchain Superchain's Superchains Superscan +Supersim supersim SYNCMODE syncmode From e9248cd6670cad2f6cdd110d41643e673f4e1a2e Mon Sep 17 00:00:00 2001 From: cpengilly <29023967+cpengilly@users.noreply.github.com> Date: Fri, 11 Oct 2024 17:25:16 -0700 Subject: [PATCH 160/565] lint fixes --- words.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/words.txt b/words.txt index 7e0fda447..e3500e2dd 100644 --- a/words.txt +++ b/words.txt @@ -203,6 +203,7 @@ MTHI MTLO MULT multiaddr +Multichain multiclient multisigs MULTU From c2bf12ae15ab2f8ac0af421db306155e404ec3a1 Mon Sep 17 00:00:00 2001 From: cpengilly <29023967+cpengilly@users.noreply.github.com> Date: Fri, 11 Oct 2024 17:42:37 -0700 Subject: [PATCH 161/565] address review feedback --- pages/builders/app-developers/tools/supersim.mdx | 4 ++-- pages/stack/protocol/interop/supersim.mdx | 3 --- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/pages/builders/app-developers/tools/supersim.mdx b/pages/builders/app-developers/tools/supersim.mdx index 8d02a19ec..f25adb1bc 100644 --- a/pages/builders/app-developers/tools/supersim.mdx +++ b/pages/builders/app-developers/tools/supersim.mdx @@ -1,6 +1,6 @@ --- --- -import SuperSim from '@/pages/stack/protocol/interop/supersim.mdx' +import Supersim from '@/pages/stack/protocol/interop/supersim.mdx' - + diff --git a/pages/stack/protocol/interop/supersim.mdx b/pages/stack/protocol/interop/supersim.mdx index 5dbcaaa06..aa968b0f5 100644 --- a/pages/stack/protocol/interop/supersim.mdx +++ b/pages/stack/protocol/interop/supersim.mdx @@ -50,9 +50,6 @@ graph TD C --> F[JSON-RPC Endpoint] D --> G[JSON-RPC Endpoint] E --> H[JSON-RPC Endpoint] - I[Pre-deployed Interoperability Contracts] --> C - I --> D - I --> E ``` This diagram illustrates how developers interact with Supersim through the CLI, which simulates OP Stack specific features (specifically interop) on locally run chains, each with its own JSON-RPC endpoint and pre-deployed interoperability contracts. From d9ad5bfb6dc2cf49a4093eb06ef2bd4dfcb934d2 Mon Sep 17 00:00:00 2001 From: DOM CHAROENYOS Date: Sat, 12 Oct 2024 09:41:34 +0700 Subject: [PATCH 162/565] Update batcher.mdx plasma -> altda --- .../chain-operators/configuration/batcher.mdx | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/pages/builders/chain-operators/configuration/batcher.mdx b/pages/builders/chain-operators/configuration/batcher.mdx index ac07942aa..df5dfadea 100644 --- a/pages/builders/chain-operators/configuration/batcher.mdx +++ b/pages/builders/chain-operators/configuration/batcher.mdx @@ -262,24 +262,24 @@ default value is `10`. `OP_BATCHER_NUM_CONFIRMATIONS=10` -### plasma.da-server +### altda.da-server HTTP address of a DA Server. - `--plasma.da-server=` - `--plasma.da-server=` + `--altda.da-server=` + `--altda.da-server=` `OP_BATCHER_PLASMA_DA_SERVER=` -### plasma.da-service +### altda.da-service Use DA service type where commitments are generated by plasma server. The default value is `false`. - `--plasma.da-service=` - `--plasma.da-service=false` + `--altda.da-service=` + `--altda.da-service=false` `OP_BATCHER_PLASMA_DA_SERVICE=false` @@ -288,8 +288,8 @@ default value is `false`. Enable plasma mode. The default value is `false`. - `--plasma.enabled=` - `--plasma.enabled=false` + `--altda.enabled=` + `--altda.enabled=false` `OP_BATCHER_PLASMA_ENABLED=false` @@ -299,8 +299,8 @@ Verify input data matches the commitments from the DA storage service. The default value is `true`. - `--plasma.verify-on-read=` - `--plasma.verify-on-read=true` + `--altda.verify-on-read=` + `--altda.verify-on-read=true` `OP_BATCHER_PLASMA_VERIFY_ON_READ=true` From 7e5b078a1d1f4c94b5a4744cde79d849caa73b83 Mon Sep 17 00:00:00 2001 From: Will Papper Date: Sat, 12 Oct 2024 01:50:40 -0700 Subject: [PATCH 163/565] Add ports for L2 and L1 dev nodes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Here is the command output of `make devnet-up` for reference: ``` [+] Running 3/3 ✔ Container ops-bedrock-l1-1 Started 0.1s ✔ Container ops-bedrock-l1-bn-1 Started 0.2s ✔ Container ops-bedrock-l1-vc-1 Started 0.4s [INFO|10-12-2024 08:43:12] Trying 127.0.0.1:8545 [INFO|10-12-2024 08:43:12] Connected 127.0.0.1:8545 [INFO|10-12-2024 08:43:12] Waiting for RPC server at 127.0.0.1:8545 [INFO|10-12-2024 08:43:12] RPC server at 127.0.0.1:8545 ready [INFO|10-12-2024 08:43:12] L2 genesis and rollup configs already generated. [INFO|10-12-2024 08:43:12] Bringing up L2. WARN[0000] The "DG_TYPE" variable is not set. Defaulting to a blank string. WARN[0000] The "L2OO_ADDRESS" variable is not set. Defaulting to a blank string. WARN[0000] The "DGF_ADDRESS" variable is not set. Defaulting to a blank string. WARN[0000] The "PROPOSAL_INTERVAL" variable is not set. Defaulting to a blank string. WARN[0000] The "ALTDA_ENABLED" variable is not set. Defaulting to a blank string. WARN[0000] The "ALTDA_SERVICE" variable is not set. Defaulting to a blank string. WARN[0000] The "DA_TYPE" variable is not set. Defaulting to a blank string. WARN[0000] The "DGF_ADDRESS" variable is not set. Defaulting to a blank string. WARN[0000] The "ALTDA_GENERIC_DA" variable is not set. Defaulting to a blank string. WARN[0000] The "ALTDA_ENABLED" variable is not set. Defaulting to a blank string. WARN[0000] The "ALTDA_SERVICE" variable is not set. Defaulting to a blank string. [+] Running 1/1 ✔ Container ops-bedrock-l2-1 Started 0.1s [INFO|10-12-2024 08:43:12] Trying 127.0.0.1:9545 [INFO|10-12-2024 08:43:12] Connected 127.0.0.1:9545 [INFO|10-12-2024 08:43:12] Waiting for RPC server at 127.0.0.1:9545 [INFO|10-12-2024 08:43:12] Waiting for RPC server at 127.0.0.1:9545 [INFO|10-12-2024 08:43:13] RPC server at 127.0.0.1:9545 ready [INFO|10-12-2024 08:43:13] Using batch inbox 0x00289c189bee4e70334629f04cd5ed602b6600eb [INFO|10-12-2024 08:43:13] Using DisputeGameFactory 0xeCb92a686D1ab066fc4E559A305FEB75DD512377 [INFO|10-12-2024 08:43:13] Bringing up `op-node`, `op-proposer` and `op-batcher`. WARN[0000] The "L2OO_ADDRESS" variable is not set. Defaulting to a blank string. ``` --- pages/chain/testing/dev-node.mdx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pages/chain/testing/dev-node.mdx b/pages/chain/testing/dev-node.mdx index 233bb1e18..894056cf3 100644 --- a/pages/chain/testing/dev-node.mdx +++ b/pages/chain/testing/dev-node.mdx @@ -109,6 +109,8 @@ After installation, you can verify Go is correctly installed by running: * To start, run (in the root directory of the monorepo) `make devnet-up`.\ The first time it runs it will be relatively slow because it needs to download the images, after that it will be faster. + After the devnet starts, the L2 RPC HTTP server will be available at `127.0.0.1:9545` and the L1 RPC HTTP server will be available at `127.0.0.1:8545`. + * To stop, run (in the root directory of the monorepo) `make devnet-down`. * To clean everything, run (in the root directory of the monorepo) `make devnet-clean`. From d7c3c9e76bbdff264ed4f5c06660cd1462411499 Mon Sep 17 00:00:00 2001 From: Will Papper Date: Sat, 12 Oct 2024 01:54:51 -0700 Subject: [PATCH 164/565] Remove HTTP reference for ports This matches the CLI output --- pages/chain/testing/dev-node.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/chain/testing/dev-node.mdx b/pages/chain/testing/dev-node.mdx index 894056cf3..60c728a08 100644 --- a/pages/chain/testing/dev-node.mdx +++ b/pages/chain/testing/dev-node.mdx @@ -109,7 +109,7 @@ After installation, you can verify Go is correctly installed by running: * To start, run (in the root directory of the monorepo) `make devnet-up`.\ The first time it runs it will be relatively slow because it needs to download the images, after that it will be faster. - After the devnet starts, the L2 RPC HTTP server will be available at `127.0.0.1:9545` and the L1 RPC HTTP server will be available at `127.0.0.1:8545`. + After the devnet starts, the L2 RPC server will be available at `127.0.0.1:9545` and the L1 RPC server will be available at `127.0.0.1:8545`. * To stop, run (in the root directory of the monorepo) `make devnet-down`. From 9ef8cae395f415a226b225b5ae9fcc73e5444fd7 Mon Sep 17 00:00:00 2001 From: Will Papper Date: Sat, 12 Oct 2024 02:05:57 -0700 Subject: [PATCH 165/565] Fix spacing --- pages/chain/testing/dev-node.mdx | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/pages/chain/testing/dev-node.mdx b/pages/chain/testing/dev-node.mdx index 60c728a08..d6887e4b6 100644 --- a/pages/chain/testing/dev-node.mdx +++ b/pages/chain/testing/dev-node.mdx @@ -107,8 +107,7 @@ After installation, you can verify Go is correctly installed by running: ## Operations * To start, run (in the root directory of the monorepo) `make devnet-up`.\ - The first time it runs it will be relatively slow because it needs to download the images, after that it will be faster. - + The first time it runs it will be relatively slow because it needs to download the images, after that it will be faster.\ After the devnet starts, the L2 RPC server will be available at `127.0.0.1:9545` and the L1 RPC server will be available at `127.0.0.1:8545`. * To stop, run (in the root directory of the monorepo) `make devnet-down`. From 7b0a3c304a7bb5086c8184a45081b773c8df8b68 Mon Sep 17 00:00:00 2001 From: Chomtana Date: Sun, 13 Oct 2024 19:43:26 +0700 Subject: [PATCH 166/565] Fix duplicated Retro Funding Governance contribution issuer --- pages/chain/identity/schemas.mdx | 1 - 1 file changed, 1 deletion(-) diff --git a/pages/chain/identity/schemas.mdx b/pages/chain/identity/schemas.mdx index 721b4091c..c11e46b87 100644 --- a/pages/chain/identity/schemas.mdx +++ b/pages/chain/identity/schemas.mdx @@ -126,7 +126,6 @@ These attestations are voting Badges issued for Retro Round 5 and beyond. They a | Schema UID | `0x3743be2afa818ee40304516c153427be55931f238d961af5d98653a93192cdb3` | | ---------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Issuer | Currently, the Optimism Foundation issues these from one of the following addresses: `0x621477dBA416E12df7FF0d48E14c4D20DC85D7D9` or `0xE4553b743E74dA3424Ac51f8C1E586fd43aE226F`. | -| Issuer | Currently, the Optimism Foundation issues these from one of the following addresses: `0x621477dBA416E12df7FF0d48E14c4D20DC85D7D9` or `0xE4553b743E74dA3424Ac51f8C1E586fd43aE226F` | | Recipient | The address of the individual who made the contribution | | Rpgf\_round | The round number for which this contribution was made | | RetroPGF\_Contribution | The type of contribution made | From 0b3016d23cbc2b951699cb1d36dd15b4f1b4b31d Mon Sep 17 00:00:00 2001 From: cpengilly <29023967+cpengilly@users.noreply.github.com> Date: Sun, 13 Oct 2024 18:26:41 -0700 Subject: [PATCH 167/565] Apply suggestions from code review Co-authored-by: soyboy <85043086+sbvegan@users.noreply.github.com> --- pages/stack/protocol/interop/explainer.mdx | 2 +- pages/stack/protocol/interop/supersim.mdx | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/pages/stack/protocol/interop/explainer.mdx b/pages/stack/protocol/interop/explainer.mdx index 9969ebaaa..06758368e 100644 --- a/pages/stack/protocol/interop/explainer.mdx +++ b/pages/stack/protocol/interop/explainer.mdx @@ -50,7 +50,7 @@ Chain operators will need to run additional infrastructure to be part of the int For additional considerations, join the [Interop discussion](https://github.com/ethereum-optimism/specs/discussions/128) in our specs repo. -## Next Steps +## Next steps * Want to learn more? Read our guide on the anatomy of a [cross-chain message](cross-chain-message) or check out this [interop design video walk-thru](https://www.youtube.com/watch?v=FKc5RgjtGes). * Ready to get started? Use [Supersim](supersim), a local dev environment that simulates interop for testing applications against a local version of the Superchain. * For more info about how OP Stack interoperability works under the hood, [check out the specs](https://specs.optimism.io/interop/overview.html). diff --git a/pages/stack/protocol/interop/supersim.mdx b/pages/stack/protocol/interop/supersim.mdx index aa968b0f5..859205468 100644 --- a/pages/stack/protocol/interop/supersim.mdx +++ b/pages/stack/protocol/interop/supersim.mdx @@ -6,7 +6,7 @@ description: Learn how to use the Supersim local dev environment tool designed t import { Callout } from 'nextra/components' -# Supersim Multichain Development Environment +# Supersim multichain development environment Interop is currently in active development and not yet ready for production use. The information provided here may change. It is recommended to check back regularly for the most up-to-date information. @@ -14,7 +14,7 @@ import { Callout } from 'nextra/components' [Supersim](https://github.com/ethereum-optimism/Supersim) is a local development environment tool designed to simulate the Optimism Superchain for developers building multi-chain applications. It provides a simplified way to test and develop applications that interact with multiple chains within the Superchain ecosystem. -## Supersim Workflow +## Supersim workflow ```mermaid graph LR @@ -27,7 +27,7 @@ graph LR This diagram illustrates the typical workflow for developers using Supersim, from writing smart contracts to testing and refining cross-chain interactions. -## Features and Benefits +## Features and benefits * Simulates multiple OP Stack chains locally (e.g., chain 901, 902) * Supports testing of cross-chain messaging and interactions @@ -54,7 +54,7 @@ graph TD This diagram illustrates how developers interact with Supersim through the CLI, which simulates OP Stack specific features (specifically interop) on locally run chains, each with its own JSON-RPC endpoint and pre-deployed interoperability contracts. -## Next Steps +## Next steps * Check out the dedicated [Supersim docs](https://Supersim.pages.dev/) for tutorials and specific use cases. * Questions about Interop? Check out the FAQ section in the [Superchain Interop Explainer](/stack/protocol/interop/explainer#faqs) or check out this [Superchain interop design video walk-thru](https://www.youtube.com/watch?v=FKc5RgjtGes). From 8c92df7ae0d226140c80a576b840f1fd6e1d0aed Mon Sep 17 00:00:00 2001 From: cpengilly <29023967+cpengilly@users.noreply.github.com> Date: Sun, 13 Oct 2024 18:36:37 -0700 Subject: [PATCH 168/565] Update pages/stack/protocol/interop/supersim.mdx Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> --- pages/stack/protocol/interop/supersim.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/stack/protocol/interop/supersim.mdx b/pages/stack/protocol/interop/supersim.mdx index 859205468..555e523a4 100644 --- a/pages/stack/protocol/interop/supersim.mdx +++ b/pages/stack/protocol/interop/supersim.mdx @@ -9,7 +9,7 @@ import { Callout } from 'nextra/components' # Supersim multichain development environment - Interop is currently in active development and not yet ready for production use. The information provided here may change. It is recommended to check back regularly for the most up-to-date information. + Interop is currently in active development and not yet ready for production use. The information provided here may change. Check back regularly for the most up-to-date information. [Supersim](https://github.com/ethereum-optimism/Supersim) is a local development environment tool designed to simulate the Optimism Superchain for developers building multi-chain applications. It provides a simplified way to test and develop applications that interact with multiple chains within the Superchain ecosystem. From c5c22351da5faf7e36929c95c750d9808cc79dda Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 14 Oct 2024 01:40:45 +0000 Subject: [PATCH 169/565] Bump dompurify from 3.1.1 to 3.1.7 Bumps [dompurify](https://github.com/cure53/DOMPurify) from 3.1.1 to 3.1.7. - [Release notes](https://github.com/cure53/DOMPurify/releases) - [Commits](https://github.com/cure53/DOMPurify/compare/3.1.1...3.1.7) --- updated-dependencies: - dependency-name: dompurify dependency-type: indirect ... Signed-off-by: dependabot[bot] --- pnpm-lock.yaml | 8188 +++++++++++++++++++++++++++--------------------- 1 file changed, 4668 insertions(+), 3520 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 4a5f3c76a..8b2c4d3a5 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,4 +1,4 @@ -lockfileVersion: '6.0' +lockfileVersion: '9.0' settings: autoInstallPeers: true @@ -15,204 +15,3716 @@ patchedDependencies: hash: jaxvkozlhcbn7zjsiti5ocoubi path: patches/remark-lint-frontmatter-schema@3.15.4.patch -dependencies: - '@eth-optimism/contracts-ts': - specifier: ^0.17.0 - version: 0.17.2(typescript@5.4.5) - '@eth-optimism/tokenlist': - specifier: ^9.0.9 - version: 9.0.51 - '@feelback/react': - specifier: ^0.3.4 - version: 0.3.4(react@18.3.1) - '@headlessui/react': - specifier: ^2.1.8 - version: 2.1.10(react-dom@18.3.1)(react@18.3.1) - algoliasearch: - specifier: ^4.23.3 - version: 4.23.3 - clsx: - specifier: ^2.1.1 - version: 2.1.1 - escape-string-regexp: - specifier: ^5.0.0 - version: 5.0.0 - next: - specifier: 14.2.10 - version: 14.2.10(react-dom@18.3.1)(react@18.3.1) - next-sitemap: - specifier: ^4.2.3 - version: 4.2.3(next@14.2.10) - nextra: - specifier: 2.13.2 - version: 2.13.2(patch_hash=a4rp2hgojklggjmthmkiyqaek4)(next@14.2.10)(react-dom@18.3.1)(react@18.3.1) - nextra-theme-docs: - specifier: 2.13.2 - version: 2.13.2(next@14.2.10)(nextra@2.13.2)(react-dom@18.3.1)(react@18.3.1) - react: - specifier: ^18.2.0 - version: 18.3.1 - react-dom: - specifier: ^18.2.0 - version: 18.3.1(react@18.3.1) - search-insights: - specifier: ^2.15.0 - version: 2.17.2 - -devDependencies: - '@double-great/remark-lint-alt-text': - specifier: ^1.0.0 - version: 1.0.0 - '@eth-optimism/core-utils': - specifier: ^0.13.1 - version: 0.13.2 - '@eth-optimism/sdk': - specifier: ^3.1.6 - version: 3.3.0(ethers@5.7.2) - '@types/node': - specifier: 18.11.10 - version: 18.11.10 - cspell: - specifier: ^8.1.3 - version: 8.7.0 - eslint: - specifier: ^8.53.0 - version: 8.57.0 - eslint-plugin-mdx: - specifier: ^2.2.0 - version: 2.3.4(eslint@8.57.0) - ethers: - specifier: ^5 - version: 5.7.2 - globby: - specifier: ^11.0.4 - version: 11.1.0 - gray-matter: - specifier: ^4.0.3 - version: 4.0.3 - remark: - specifier: ^15.0.1 - version: 15.0.1 - remark-code-import: - specifier: ^1.2.0 - version: 1.2.0(patch_hash=heylvfasxh3ubj2edns2svea2m) - remark-frontmatter: - specifier: ^5.0.0 - version: 5.0.0 - remark-gfm: - specifier: ^3.0.1 - version: 3.0.1 - remark-lint-frontmatter-schema: - specifier: ^3.15.4 - version: 3.15.4(patch_hash=jaxvkozlhcbn7zjsiti5ocoubi) - remark-lint-heading-style: - specifier: ^3.1.2 - version: 3.1.2 - remark-lint-list-item-indent: - specifier: ^3.1.2 - version: 3.1.2 - remark-lint-table-cell-padding: - specifier: ^4.1.3 - version: 4.1.3 - remark-lint-table-pipe-alignment: - specifier: ^3.1.3 - version: 3.1.3 - remark-lint-table-pipes: - specifier: ^4.1.2 - version: 4.1.2 - remark-lint-unordered-list-marker-style: - specifier: ^3.1.2 - version: 3.1.2 - remark-preset-lint-consistent: - specifier: ^5.1.2 - version: 5.1.2 - remark-preset-lint-recommended: - specifier: ^6.1.3 - version: 6.1.3 - typescript: - specifier: ^5.2.2 - version: 5.4.5 - unified-lint-rule: - specifier: ^2.1.2 - version: 2.1.2 - unist-util-visit: - specifier: ^5.0.0 - version: 5.0.0 +importers: + + .: + dependencies: + '@eth-optimism/contracts-ts': + specifier: ^0.17.0 + version: 0.17.2(typescript@5.4.5)(zod@3.23.8) + '@eth-optimism/tokenlist': + specifier: ^9.0.9 + version: 9.0.51 + '@feelback/react': + specifier: ^0.3.4 + version: 0.3.4(react@18.3.1) + '@headlessui/react': + specifier: ^2.1.8 + version: 2.1.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + algoliasearch: + specifier: ^4.23.3 + version: 4.23.3 + clsx: + specifier: ^2.1.1 + version: 2.1.1 + escape-string-regexp: + specifier: ^5.0.0 + version: 5.0.0 + next: + specifier: 14.2.10 + version: 14.2.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + next-sitemap: + specifier: ^4.2.3 + version: 4.2.3(next@14.2.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + nextra: + specifier: 2.13.2 + version: 2.13.2(patch_hash=a4rp2hgojklggjmthmkiyqaek4)(next@14.2.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + nextra-theme-docs: + specifier: 2.13.2 + version: 2.13.2(next@14.2.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(nextra@2.13.2(patch_hash=a4rp2hgojklggjmthmkiyqaek4)(next@14.2.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: + specifier: ^18.2.0 + version: 18.3.1 + react-dom: + specifier: ^18.2.0 + version: 18.3.1(react@18.3.1) + search-insights: + specifier: ^2.15.0 + version: 2.17.2 + devDependencies: + '@double-great/remark-lint-alt-text': + specifier: ^1.0.0 + version: 1.0.0 + '@eth-optimism/core-utils': + specifier: ^0.13.1 + version: 0.13.2 + '@eth-optimism/sdk': + specifier: ^3.1.6 + version: 3.3.0(ethers@5.7.2) + '@types/node': + specifier: 18.11.10 + version: 18.11.10 + cspell: + specifier: ^8.1.3 + version: 8.7.0 + eslint: + specifier: ^8.53.0 + version: 8.57.0 + eslint-plugin-mdx: + specifier: ^2.2.0 + version: 2.3.4(eslint@8.57.0) + ethers: + specifier: ^5 + version: 5.7.2 + globby: + specifier: ^11.0.4 + version: 11.1.0 + gray-matter: + specifier: ^4.0.3 + version: 4.0.3 + remark: + specifier: ^15.0.1 + version: 15.0.1 + remark-code-import: + specifier: ^1.2.0 + version: 1.2.0(patch_hash=heylvfasxh3ubj2edns2svea2m) + remark-frontmatter: + specifier: ^5.0.0 + version: 5.0.0 + remark-gfm: + specifier: ^3.0.1 + version: 3.0.1 + remark-lint-frontmatter-schema: + specifier: ^3.15.4 + version: 3.15.4(patch_hash=jaxvkozlhcbn7zjsiti5ocoubi) + remark-lint-heading-style: + specifier: ^3.1.2 + version: 3.1.2 + remark-lint-list-item-indent: + specifier: ^3.1.2 + version: 3.1.2 + remark-lint-table-cell-padding: + specifier: ^4.1.3 + version: 4.1.3 + remark-lint-table-pipe-alignment: + specifier: ^3.1.3 + version: 3.1.3 + remark-lint-table-pipes: + specifier: ^4.1.2 + version: 4.1.2 + remark-lint-unordered-list-marker-style: + specifier: ^3.1.2 + version: 3.1.2 + remark-preset-lint-consistent: + specifier: ^5.1.2 + version: 5.1.2 + remark-preset-lint-recommended: + specifier: ^6.1.3 + version: 6.1.3 + typescript: + specifier: ^5.2.2 + version: 5.4.5 + unified-lint-rule: + specifier: ^2.1.2 + version: 2.1.2 + unist-util-visit: + specifier: ^5.0.0 + version: 5.0.0 + +packages: + + '@adraffy/ens-normalize@1.10.0': + resolution: {integrity: sha512-nA9XHtlAkYfJxY7bce8DcN7eKxWWCWkU+1GR9d+U6MbNpfwQp8TI7vqOsBsMcHoT4mBu2kypKoSKnghEzOOq5Q==} + + '@algolia/cache-browser-local-storage@4.23.3': + resolution: {integrity: sha512-vRHXYCpPlTDE7i6UOy2xE03zHF2C8MEFjPN2v7fRbqVpcOvAUQK81x3Kc21xyb5aSIpYCjWCZbYZuz8Glyzyyg==} + + '@algolia/cache-common@4.23.3': + resolution: {integrity: sha512-h9XcNI6lxYStaw32pHpB1TMm0RuxphF+Ik4o7tcQiodEdpKK+wKufY6QXtba7t3k8eseirEMVB83uFFF3Nu54A==} + + '@algolia/cache-in-memory@4.23.3': + resolution: {integrity: sha512-yvpbuUXg/+0rbcagxNT7un0eo3czx2Uf0y4eiR4z4SD7SiptwYTpbuS0IHxcLHG3lq22ukx1T6Kjtk/rT+mqNg==} + + '@algolia/client-account@4.23.3': + resolution: {integrity: sha512-hpa6S5d7iQmretHHF40QGq6hz0anWEHGlULcTIT9tbUssWUriN9AUXIFQ8Ei4w9azD0hc1rUok9/DeQQobhQMA==} + + '@algolia/client-analytics@4.23.3': + resolution: {integrity: sha512-LBsEARGS9cj8VkTAVEZphjxTjMVCci+zIIiRhpFun9jGDUlS1XmhCW7CTrnaWeIuCQS/2iPyRqSy1nXPjcBLRA==} + + '@algolia/client-common@4.23.3': + resolution: {integrity: sha512-l6EiPxdAlg8CYhroqS5ybfIczsGUIAC47slLPOMDeKSVXYG1n0qGiz4RjAHLw2aD0xzh2EXZ7aRguPfz7UKDKw==} + + '@algolia/client-personalization@4.23.3': + resolution: {integrity: sha512-3E3yF3Ocr1tB/xOZiuC3doHQBQ2zu2MPTYZ0d4lpfWads2WTKG7ZzmGnsHmm63RflvDeLK/UVx7j2b3QuwKQ2g==} + + '@algolia/client-search@4.23.3': + resolution: {integrity: sha512-P4VAKFHqU0wx9O+q29Q8YVuaowaZ5EM77rxfmGnkHUJggh28useXQdopokgwMeYw2XUht49WX5RcTQ40rZIabw==} + + '@algolia/logger-common@4.23.3': + resolution: {integrity: sha512-y9kBtmJwiZ9ZZ+1Ek66P0M68mHQzKRxkW5kAAXYN/rdzgDN0d2COsViEFufxJ0pb45K4FRcfC7+33YB4BLrZ+g==} + + '@algolia/logger-console@4.23.3': + resolution: {integrity: sha512-8xoiseoWDKuCVnWP8jHthgaeobDLolh00KJAdMe9XPrWPuf1by732jSpgy2BlsLTaT9m32pHI8CRfrOqQzHv3A==} + + '@algolia/recommend@4.23.3': + resolution: {integrity: sha512-9fK4nXZF0bFkdcLBRDexsnGzVmu4TSYZqxdpgBW2tEyfuSSY54D4qSRkLmNkrrz4YFvdh2GM1gA8vSsnZPR73w==} + + '@algolia/requester-browser-xhr@4.23.3': + resolution: {integrity: sha512-jDWGIQ96BhXbmONAQsasIpTYWslyjkiGu0Quydjlowe+ciqySpiDUrJHERIRfELE5+wFc7hc1Q5hqjGoV7yghw==} + + '@algolia/requester-common@4.23.3': + resolution: {integrity: sha512-xloIdr/bedtYEGcXCiF2muajyvRhwop4cMZo+K2qzNht0CMzlRkm8YsDdj5IaBhshqfgmBb3rTg4sL4/PpvLYw==} + + '@algolia/requester-node-http@4.23.3': + resolution: {integrity: sha512-zgu++8Uj03IWDEJM3fuNl34s746JnZOWn1Uz5taV1dFyJhVM/kTNw9Ik7YJWiUNHJQXcaD8IXD1eCb0nq/aByA==} + + '@algolia/transporter@4.23.3': + resolution: {integrity: sha512-Wjl5gttqnf/gQKJA+dafnD0Y6Yw97yvfY8R9h0dQltX1GXTgNs1zWgvtWW0tHl1EgMdhAyw189uWiZMnL3QebQ==} + + '@apidevtools/json-schema-ref-parser@11.1.0': + resolution: {integrity: sha512-g/VW9ZQEFJAOwAyUb8JFf7MLiLy2uEB4rU270rGzDwICxnxMlPy0O11KVePSgS36K1NI29gSlK84n5INGhd4Ag==} + engines: {node: '>= 16'} + + '@babel/code-frame@7.24.2': + resolution: {integrity: sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.22.20': + resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} + engines: {node: '>=6.9.0'} + + '@babel/highlight@7.24.2': + resolution: {integrity: sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==} + engines: {node: '>=6.9.0'} + + '@babel/runtime@7.24.4': + resolution: {integrity: sha512-dkxf7+hn8mFBwKjs9bvBlArzLVxVbS8usaPUDd5p2a9JCL9tB8OaOVN1isD4+Xyk4ns89/xeOmbQvgdK7IIVdA==} + engines: {node: '>=6.9.0'} + + '@braintree/sanitize-url@6.0.4': + resolution: {integrity: sha512-s3jaWicZd0pkP0jf5ysyHUI/RE7MHos6qlToFcGWXVp+ykHOy77OUMrfbgJ9it2C5bow7OIQwYYaHjk9XlBQ2A==} + + '@corex/deepmerge@4.0.43': + resolution: {integrity: sha512-N8uEMrMPL0cu/bdboEWpQYb/0i2K5Qn8eCsxzOmxSggJbbQte7ljMRoXm917AbntqTGOzdTu+vP3KOOzoC70HQ==} + + '@cspell/cspell-bundled-dicts@8.7.0': + resolution: {integrity: sha512-B5YQI7Dd9m0JHTmHgs7PiyP4BWXzl8ixpK+HGOwhxzh7GyfFt1Eo/gxMxBDX/9SaewEzeb2OjRpRKEFtEsto3A==} + engines: {node: '>=18'} + + '@cspell/cspell-json-reporter@8.7.0': + resolution: {integrity: sha512-LTQPEvXvCqnc+ok9WXpSISZyt4/nGse9fVEM430g0BpGzKpt3RMx49B8uasvvnanzCuikaW9+wFLmwgvraERhA==} + engines: {node: '>=18'} + + '@cspell/cspell-pipe@8.7.0': + resolution: {integrity: sha512-ePqddIQ4arqPQgOkC146SkZxvZb9/jL7xIM5Igy2n3tiWTC5ijrX/mbHpPZ1VGcFck+1M0cJUuyhuJk+vMj3rg==} + engines: {node: '>=18'} + + '@cspell/cspell-resolver@8.7.0': + resolution: {integrity: sha512-grZwDFYqcBYQDaz4AkUtdyqc4UUH2J3/7yWVkBbYDPE+FQHa9ofFXzXxyjs56GJlPfi9ULpe5/Wz6uVLg8rQkQ==} + engines: {node: '>=18'} + + '@cspell/cspell-service-bus@8.7.0': + resolution: {integrity: sha512-KW48iu0nTDzbedixc7iB7K7mlAZQ7QeMLuM/akxigOlvtOdVJrRa9Pfn44lwejts1ANb/IXil3GH8YylkVi76Q==} + engines: {node: '>=18'} + + '@cspell/cspell-types@8.7.0': + resolution: {integrity: sha512-Rb+LCE5I9JEb/LE8nSViVSF8z1CWv/z4mPBIG37VMa7aUx2gAQa6gJekNfpY9YZiMzx4Tv3gDujN80ytks4pGA==} + engines: {node: '>=18'} + + '@cspell/dict-ada@4.0.2': + resolution: {integrity: sha512-0kENOWQeHjUlfyId/aCM/mKXtkEgV0Zu2RhUXCBr4hHo9F9vph+Uu8Ww2b0i5a4ZixoIkudGA+eJvyxrG1jUpA==} + + '@cspell/dict-aws@4.0.1': + resolution: {integrity: sha512-NXO+kTPQGqaaJKa4kO92NAXoqS+i99dQzf3/L1BxxWVSBS3/k1f3uhmqIh7Crb/n22W793lOm0D9x952BFga3Q==} + + '@cspell/dict-bash@4.1.3': + resolution: {integrity: sha512-tOdI3QVJDbQSwPjUkOiQFhYcu2eedmX/PtEpVWg0aFps/r6AyjUQINtTgpqMYnYuq8O1QUIQqnpx21aovcgZCw==} + + '@cspell/dict-companies@3.0.31': + resolution: {integrity: sha512-hKVpV/lcGKP4/DpEPS8P4osPvFH/YVLJaDn9cBIOH6/HSmL5LbFgJNKpMGaYRbhm2FEX56MKE3yn/MNeNYuesQ==} + + '@cspell/dict-cpp@5.1.3': + resolution: {integrity: sha512-sqnriXRAInZH9W75C+APBh6dtben9filPqVbIsiRMUXGg+s02ekz0z6LbS7kXeJ5mD2qXoMLBrv13qH2eIwutQ==} + + '@cspell/dict-cryptocurrencies@5.0.0': + resolution: {integrity: sha512-Z4ARIw5+bvmShL+4ZrhDzGhnc9znaAGHOEMaB/GURdS/jdoreEDY34wdN0NtdLHDO5KO7GduZnZyqGdRoiSmYA==} + + '@cspell/dict-csharp@4.0.2': + resolution: {integrity: sha512-1JMofhLK+4p4KairF75D3A924m5ERMgd1GvzhwK2geuYgd2ZKuGW72gvXpIV7aGf52E3Uu1kDXxxGAiZ5uVG7g==} + + '@cspell/dict-css@4.0.12': + resolution: {integrity: sha512-vGBgPM92MkHQF5/2jsWcnaahOZ+C6OE/fPvd5ScBP72oFY9tn5GLuomcyO0z8vWCr2e0nUSX1OGimPtcQAlvSw==} + + '@cspell/dict-dart@2.0.3': + resolution: {integrity: sha512-cLkwo1KT5CJY5N5RJVHks2genFkNCl/WLfj+0fFjqNR+tk3tBI1LY7ldr9piCtSFSm4x9pO1x6IV3kRUY1lLiw==} + + '@cspell/dict-data-science@1.0.11': + resolution: {integrity: sha512-TaHAZRVe0Zlcc3C23StZqqbzC0NrodRwoSAc8dis+5qLeLLnOCtagYQeROQvDlcDg3X/VVEO9Whh4W/z4PAmYQ==} + + '@cspell/dict-django@4.1.0': + resolution: {integrity: sha512-bKJ4gPyrf+1c78Z0Oc4trEB9MuhcB+Yg+uTTWsvhY6O2ncFYbB/LbEZfqhfmmuK/XJJixXfI1laF2zicyf+l0w==} + + '@cspell/dict-docker@1.1.7': + resolution: {integrity: sha512-XlXHAr822euV36GGsl2J1CkBIVg3fZ6879ZOg5dxTIssuhUOCiV2BuzKZmt6aIFmcdPmR14+9i9Xq+3zuxeX0A==} + + '@cspell/dict-dotnet@5.0.0': + resolution: {integrity: sha512-EOwGd533v47aP5QYV8GlSSKkmM9Eq8P3G/eBzSpH3Nl2+IneDOYOBLEUraHuiCtnOkNsz0xtZHArYhAB2bHWAw==} + + '@cspell/dict-elixir@4.0.3': + resolution: {integrity: sha512-g+uKLWvOp9IEZvrIvBPTr/oaO6619uH/wyqypqvwpmnmpjcfi8+/hqZH8YNKt15oviK8k4CkINIqNhyndG9d9Q==} + + '@cspell/dict-en-common-misspellings@2.0.0': + resolution: {integrity: sha512-NOg8dlv37/YqLkCfBs5OXeJm/Wcfb/CzeOmOZJ2ZXRuxwsNuolb4TREUce0yAXRqMhawahY5TSDRJJBgKjBOdw==} + + '@cspell/dict-en-gb@1.1.33': + resolution: {integrity: sha512-tKSSUf9BJEV+GJQAYGw5e+ouhEe2ZXE620S7BLKe3ZmpnjlNG9JqlnaBhkIMxKnNFkLY2BP/EARzw31AZnOv4g==} + + '@cspell/dict-en_us@4.3.19': + resolution: {integrity: sha512-tHcXdkmm0t9LlRct1vgu3+h0KW/wlXCInkTiR4D/rl730q1zu2qVEgiy1saMiTUSNmdu7Hiy+Mhb+1braVqnZQ==} + + '@cspell/dict-filetypes@3.0.3': + resolution: {integrity: sha512-J9UP+qwwBLfOQ8Qg9tAsKtSY/WWmjj21uj6zXTI9hRLD1eG1uUOLcfVovAmtmVqUWziPSKMr87F6SXI3xmJXgw==} + + '@cspell/dict-fonts@4.0.0': + resolution: {integrity: sha512-t9V4GeN/m517UZn63kZPUYP3OQg5f0OBLSd3Md5CU3eH1IFogSvTzHHnz4Wqqbv8NNRiBZ3HfdY/pqREZ6br3Q==} + + '@cspell/dict-fsharp@1.0.1': + resolution: {integrity: sha512-23xyPcD+j+NnqOjRHgW3IU7Li912SX9wmeefcY0QxukbAxJ/vAN4rBpjSwwYZeQPAn3fxdfdNZs03fg+UM+4yQ==} + + '@cspell/dict-fullstack@3.1.5': + resolution: {integrity: sha512-6ppvo1dkXUZ3fbYn/wwzERxCa76RtDDl5Afzv2lijLoijGGUw5yYdLBKJnx8PJBGNLh829X352ftE7BElG4leA==} + + '@cspell/dict-gaming-terms@1.0.5': + resolution: {integrity: sha512-C3riccZDD3d9caJQQs1+MPfrUrQ+0KHdlj9iUR1QD92FgTOF6UxoBpvHUUZ9YSezslcmpFQK4xQQ5FUGS7uWfw==} + + '@cspell/dict-git@3.0.0': + resolution: {integrity: sha512-simGS/lIiXbEaqJu9E2VPoYW1OTC2xrwPPXNXFMa2uo/50av56qOuaxDrZ5eH1LidFXwoc8HROCHYeKoNrDLSw==} + + '@cspell/dict-golang@6.0.5': + resolution: {integrity: sha512-w4mEqGz4/wV+BBljLxduFNkMrd3rstBNDXmoX5kD4UTzIb4Sy0QybWCtg2iVT+R0KWiRRA56QKOvBsgXiddksA==} + + '@cspell/dict-haskell@4.0.1': + resolution: {integrity: sha512-uRrl65mGrOmwT7NxspB4xKXFUenNC7IikmpRZW8Uzqbqcu7ZRCUfstuVH7T1rmjRgRkjcIjE4PC11luDou4wEQ==} + + '@cspell/dict-html-symbol-entities@4.0.0': + resolution: {integrity: sha512-HGRu+48ErJjoweR5IbcixxETRewrBb0uxQBd6xFGcxbEYCX8CnQFTAmKI5xNaIt2PKaZiJH3ijodGSqbKdsxhw==} + + '@cspell/dict-html@4.0.5': + resolution: {integrity: sha512-p0brEnRybzSSWi8sGbuVEf7jSTDmXPx7XhQUb5bgG6b54uj+Z0Qf0V2n8b/LWwIPJNd1GygaO9l8k3HTCy1h4w==} + + '@cspell/dict-java@5.0.6': + resolution: {integrity: sha512-kdE4AHHHrixyZ5p6zyms1SLoYpaJarPxrz8Tveo6gddszBVVwIUZ+JkQE1bWNLK740GWzIXdkznpUfw1hP9nXw==} + + '@cspell/dict-julia@1.0.1': + resolution: {integrity: sha512-4JsCLCRhhLMLiaHpmR7zHFjj1qOauzDI5ZzCNQS31TUMfsOo26jAKDfo0jljFAKgw5M2fEG7sKr8IlPpQAYrmQ==} + + '@cspell/dict-k8s@1.0.2': + resolution: {integrity: sha512-tLT7gZpNPnGa+IIFvK9SP1LrSpPpJ94a/DulzAPOb1Q2UBFwdpFd82UWhio0RNShduvKG/WiMZf/wGl98pn+VQ==} + + '@cspell/dict-latex@4.0.0': + resolution: {integrity: sha512-LPY4y6D5oI7D3d+5JMJHK/wxYTQa2lJMSNxps2JtuF8hbAnBQb3igoWEjEbIbRRH1XBM0X8dQqemnjQNCiAtxQ==} + + '@cspell/dict-lorem-ipsum@4.0.0': + resolution: {integrity: sha512-1l3yjfNvMzZPibW8A7mQU4kTozwVZVw0AvFEdy+NcqtbxH+TvbSkNMqROOFWrkD2PjnKG0+Ea0tHI2Pi6Gchnw==} + + '@cspell/dict-lua@4.0.3': + resolution: {integrity: sha512-lDHKjsrrbqPaea13+G9s0rtXjMO06gPXPYRjRYawbNmo4E/e3XFfVzeci3OQDQNDmf2cPOwt9Ef5lu2lDmwfJg==} + + '@cspell/dict-makefile@1.0.0': + resolution: {integrity: sha512-3W9tHPcSbJa6s0bcqWo6VisEDTSN5zOtDbnPabF7rbyjRpNo0uHXHRJQF8gAbFzoTzBBhgkTmrfSiuyQm7vBUQ==} + + '@cspell/dict-monkeyc@1.0.6': + resolution: {integrity: sha512-oO8ZDu/FtZ55aq9Mb67HtaCnsLn59xvhO/t2mLLTHAp667hJFxpp7bCtr2zOrR1NELzFXmKln/2lw/PvxMSvrA==} + + '@cspell/dict-node@4.0.3': + resolution: {integrity: sha512-sFlUNI5kOogy49KtPg8SMQYirDGIAoKBO3+cDLIwD4MLdsWy1q0upc7pzGht3mrjuyMiPRUV14Bb0rkVLrxOhg==} + + '@cspell/dict-npm@5.0.15': + resolution: {integrity: sha512-sX0X5YWNW54F4baW7b5JJB6705OCBIZtUqjOghlJNORS5No7QY1IX1zc5FxNNu4gsaCZITAmfMi4ityXEsEThA==} + + '@cspell/dict-php@4.0.6': + resolution: {integrity: sha512-ySAXisf7twoVFZqBV2o/DKiCLIDTHNqfnj0EfH9OoOUR7HL3rb6zJkm0viLUFDO2G/8SyIi6YrN/6KX+Scjjjg==} + + '@cspell/dict-powershell@5.0.3': + resolution: {integrity: sha512-lEdzrcyau6mgzu1ie98GjOEegwVHvoaWtzQnm1ie4DyZgMr+N6D0Iyj1lzvtmt0snvsDFa5F2bsYzf3IMKcpcA==} + + '@cspell/dict-public-licenses@2.0.6': + resolution: {integrity: sha512-bHqpSpJvLCUcWxj1ov/Ki8WjmESpYwRpQlqfdchekOTc93Huhvjm/RXVN1R4fVf4Hspyem1QVkCGqAmjJMj6sw==} + + '@cspell/dict-python@4.1.11': + resolution: {integrity: sha512-XG+v3PumfzUW38huSbfT15Vqt3ihNb462ulfXifpQllPok5OWynhszCLCRQjQReV+dgz784ST4ggRxW452/kVg==} + + '@cspell/dict-r@2.0.1': + resolution: {integrity: sha512-KCmKaeYMLm2Ip79mlYPc8p+B2uzwBp4KMkzeLd5E6jUlCL93Y5Nvq68wV5fRLDRTf7N1LvofkVFWfDcednFOgA==} + + '@cspell/dict-ruby@5.0.2': + resolution: {integrity: sha512-cIh8KTjpldzFzKGgrqUX4bFyav5lC52hXDKo4LbRuMVncs3zg4hcSf4HtURY+f2AfEZzN6ZKzXafQpThq3dl2g==} + + '@cspell/dict-rust@4.0.2': + resolution: {integrity: sha512-RhziKDrklzOntxAbY3AvNR58wnFGIo3YS8+dNeLY36GFuWOvXDHFStYw5Pod4f/VXbO/+1tXtywCC4zWfB2p1w==} + + '@cspell/dict-scala@5.0.0': + resolution: {integrity: sha512-ph0twaRoV+ylui022clEO1dZ35QbeEQaKTaV2sPOsdwIokABPIiK09oWwGK9qg7jRGQwVaRPEq0Vp+IG1GpqSQ==} + + '@cspell/dict-software-terms@3.3.20': + resolution: {integrity: sha512-KmPwCxYWEu7SGyT/0m/n6i6R4ZgxbmN3XcerzA6Z629Wm5iZTVfJaMWqDK2RKAyBawS7OMfxGz0W/wYU4FhJlA==} + + '@cspell/dict-sql@2.1.3': + resolution: {integrity: sha512-SEyTNKJrjqD6PAzZ9WpdSu6P7wgdNtGV2RV8Kpuw1x6bV+YsSptuClYG+JSdRExBTE6LwIe1bTklejUp3ZP8TQ==} + + '@cspell/dict-svelte@1.0.2': + resolution: {integrity: sha512-rPJmnn/GsDs0btNvrRBciOhngKV98yZ9SHmg8qI6HLS8hZKvcXc0LMsf9LLuMK1TmS2+WQFAan6qeqg6bBxL2Q==} + + '@cspell/dict-swift@2.0.1': + resolution: {integrity: sha512-gxrCMUOndOk7xZFmXNtkCEeroZRnS2VbeaIPiymGRHj5H+qfTAzAKxtv7jJbVA3YYvEzWcVE2oKDP4wcbhIERw==} + + '@cspell/dict-terraform@1.0.0': + resolution: {integrity: sha512-Ak+vy4HP/bOgzf06BAMC30+ZvL9mzv21xLM2XtfnBLTDJGdxlk/nK0U6QT8VfFLqJ0ZZSpyOxGsUebWDCTr/zQ==} + + '@cspell/dict-typescript@3.1.4': + resolution: {integrity: sha512-jUcPa0rsPca5ur1+G56DXnSc5hbbJkzvPHHvyQtkbPXBQd3CXPMNfrTVCgzex/7cY/7FONcpFCUwgwfni9Jqbw==} + + '@cspell/dict-vue@3.0.0': + resolution: {integrity: sha512-niiEMPWPV9IeRBRzZ0TBZmNnkK3olkOPYxC1Ny2AX4TGlYRajcW0WUtoSHmvvjZNfWLSg2L6ruiBeuPSbjnG6A==} + + '@cspell/dynamic-import@8.7.0': + resolution: {integrity: sha512-xlEPdiHVDu+4xYkvwjL9MgklxOi9XB+Pr1H9s3Ww9WEq+q6BA3xOHxLIU/k8mhqFTMZGFZRCsdy/EwMu6SyRhQ==} + engines: {node: '>=18.0'} + + '@cspell/strong-weak-map@8.7.0': + resolution: {integrity: sha512-0bo0WwDr2lzGoCP7vbpWbDpPyuOrHKK+218txnUpx6Pn1EDBLfcDQsiZED5B6zlpwgbGi6y3vc0rWtJbjKvwzg==} + engines: {node: '>=18'} + + '@double-great/alt-text@3.1.0': + resolution: {integrity: sha512-5gSW9AI0KUO2GQe9K+KjyiCisxl4xL0kesQCxUsko4T9s8zler/stW0qcH5XryUgtKebb293qX9sz1nCmQpdTw==} + + '@double-great/remark-lint-alt-text@1.0.0': + resolution: {integrity: sha512-2FFjSX2VhT/USmsOEkcw40SiCHXXio2sWs4S7docKNFh+W7/z+bHYau+UHfrP4yDRVzfUVSV1MKnsxmigkhixg==} + + '@eslint-community/eslint-utils@4.4.0': + resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + + '@eslint-community/regexpp@4.10.0': + resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + '@eslint/eslintrc@2.1.4': + resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@eslint/js@8.57.0': + resolution: {integrity: sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@eth-optimism/contracts-bedrock@0.17.2': + resolution: {integrity: sha512-YVwPHpBZgFwFX9qY8+iToVAAH7mSnVIVmih+YfHhqjAhlLvLZfYjvj+hRNgcB9eRyl1SOOB0jevp4JOOV1v2BA==} + + '@eth-optimism/contracts-ts@0.17.2': + resolution: {integrity: sha512-5aM+pn1uK8Hx9r9+PHCF6NQTYKVHmrm7Gc7LQ6sO9MQItVP1WdIWNcQYT7TQhkxGKHYG2arF06rbHGeGNqzBeg==} + peerDependencies: + '@wagmi/core': ^2.6.3 + wagmi: ^2.5.5 + peerDependenciesMeta: + '@wagmi/core': + optional: true + wagmi: + optional: true + + '@eth-optimism/contracts@0.6.0': + resolution: {integrity: sha512-vQ04wfG9kMf1Fwy3FEMqH2QZbgS0gldKhcBeBUPfO8zu68L61VI97UDXmsMQXzTsEAxK8HnokW3/gosl4/NW3w==} + peerDependencies: + ethers: ^5 + + '@eth-optimism/core-utils@0.12.0': + resolution: {integrity: sha512-qW+7LZYCz7i8dRa7SRlUKIo1VBU8lvN0HeXCxJR+z+xtMzMQpPds20XJNCMclszxYQHkXY00fOT6GvFw9ZL6nw==} + + '@eth-optimism/core-utils@0.13.2': + resolution: {integrity: sha512-u7TOKm1RxH1V5zw7dHmfy91bOuEAZU68LT/9vJPkuWEjaTl+BgvPDRDTurjzclHzN0GbWdcpOqPZg4ftjkJGaw==} + + '@eth-optimism/sdk@3.3.0': + resolution: {integrity: sha512-0Wt9roWe3itdzp08caCQLoFqhmT47ssquKAzBe7yXI6saVL+f2vWl6VgEaq0aYe2FsWvD9L0tSAJHLx1FiquNw==} + peerDependencies: + ethers: ^5 + + '@eth-optimism/tokenlist@9.0.51': + resolution: {integrity: sha512-GfKk4euEfNLniyRisP7sB/N9Kp96M+2t529mkvwC6nXITouzH4faDP8JdtwU6AOcgC4UlrFjXJ9w8ecnWWNQbw==} + + '@ethereumjs/rlp@4.0.1': + resolution: {integrity: sha512-tqsQiBQDQdmPWE1xkkBq4rlSW5QZpLOUJ5RJh2/9fug+q9tnUhuZoVLk7s0scUIKTOzEtR72DFBXI4WiZcMpvw==} + engines: {node: '>=14'} + hasBin: true + + '@ethereumjs/util@8.1.0': + resolution: {integrity: sha512-zQ0IqbdX8FZ9aw11vP+dZkKDkS+kgIvQPHnSAXzP9pLu+Rfu3D3XEeLbicvoXJTYnhZiPmsZUxgdzXwNKxRPbA==} + engines: {node: '>=14'} + + '@ethersproject/abi@5.7.0': + resolution: {integrity: sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA==} + + '@ethersproject/abstract-provider@5.7.0': + resolution: {integrity: sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw==} + + '@ethersproject/abstract-signer@5.7.0': + resolution: {integrity: sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ==} + + '@ethersproject/address@5.7.0': + resolution: {integrity: sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==} + + '@ethersproject/base64@5.7.0': + resolution: {integrity: sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ==} + + '@ethersproject/basex@5.7.0': + resolution: {integrity: sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw==} + + '@ethersproject/bignumber@5.7.0': + resolution: {integrity: sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw==} + + '@ethersproject/bytes@5.7.0': + resolution: {integrity: sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A==} + + '@ethersproject/constants@5.7.0': + resolution: {integrity: sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA==} + + '@ethersproject/contracts@5.7.0': + resolution: {integrity: sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg==} + + '@ethersproject/hash@5.7.0': + resolution: {integrity: sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g==} + + '@ethersproject/hdnode@5.7.0': + resolution: {integrity: sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg==} + + '@ethersproject/json-wallets@5.7.0': + resolution: {integrity: sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g==} + + '@ethersproject/keccak256@5.7.0': + resolution: {integrity: sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg==} + + '@ethersproject/logger@5.7.0': + resolution: {integrity: sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig==} + + '@ethersproject/networks@5.7.1': + resolution: {integrity: sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ==} + + '@ethersproject/pbkdf2@5.7.0': + resolution: {integrity: sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw==} + + '@ethersproject/properties@5.7.0': + resolution: {integrity: sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw==} + + '@ethersproject/providers@5.7.2': + resolution: {integrity: sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg==} + + '@ethersproject/random@5.7.0': + resolution: {integrity: sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ==} + + '@ethersproject/rlp@5.7.0': + resolution: {integrity: sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w==} + + '@ethersproject/sha2@5.7.0': + resolution: {integrity: sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw==} + + '@ethersproject/signing-key@5.7.0': + resolution: {integrity: sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q==} + + '@ethersproject/solidity@5.7.0': + resolution: {integrity: sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA==} + + '@ethersproject/strings@5.7.0': + resolution: {integrity: sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg==} + + '@ethersproject/transactions@5.7.0': + resolution: {integrity: sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ==} + + '@ethersproject/units@5.7.0': + resolution: {integrity: sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg==} + + '@ethersproject/wallet@5.7.0': + resolution: {integrity: sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA==} + + '@ethersproject/web@5.7.1': + resolution: {integrity: sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w==} + + '@ethersproject/wordlists@5.7.0': + resolution: {integrity: sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA==} + + '@feelback/js@0.3.4': + resolution: {integrity: sha512-xr7gTqSJcVUYQlELs1TntYovCBjMcYUr/hGKTnDoF64/lig5CbX4bOmqLoF50IImCy5q3oIwg9w+TSFvtBwsIA==} + + '@feelback/react@0.3.4': + resolution: {integrity: sha512-ZWzUQAmPwl4nYR2olzBKddHzoLtGW/2pb8TiesiJCirxhaDW2E/XBx2ZaB4fL5TGXtjBt4eYq/qZxJZ0fIE0kg==} + engines: {node: '>=14'} + peerDependencies: + react: '>=17' + + '@floating-ui/core@1.6.2': + resolution: {integrity: sha512-+2XpQV9LLZeanU4ZevzRnGFg2neDeKHgFLjP6YLW+tly0IvrhqT4u8enLGjLH3qeh85g19xY5rsAusfwTdn5lg==} + + '@floating-ui/dom@1.6.5': + resolution: {integrity: sha512-Nsdud2X65Dz+1RHjAIP0t8z5e2ff/IRbei6BqFrl1urT8sDVzM1HMQ+R0XcU5ceRfyO3I6ayeqIfh+6Wb8LGTw==} + + '@floating-ui/react-dom@2.1.0': + resolution: {integrity: sha512-lNzj5EQmEKn5FFKc04+zasr09h/uX8RtJRNj5gUXsSQIXHVWTVh+hVAg1vOMCexkX8EgvemMvIFpQfkosnVNyA==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + + '@floating-ui/react@0.26.17': + resolution: {integrity: sha512-ESD+jYWwqwVzaIgIhExrArdsCL1rOAzryG/Sjlu8yaD3Mtqi3uVyhbE2V7jD58Mo52qbzKz2eUY/Xgh5I86FCQ==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + + '@floating-ui/utils@0.2.2': + resolution: {integrity: sha512-J4yDIIthosAsRZ5CPYP/jQvUAQtlZTTD/4suA08/FEnlxqW3sKS9iAhgsa9VYLZ6vDHn/ixJgIqRQPotoBjxIw==} + + '@headlessui/react@1.7.19': + resolution: {integrity: sha512-Ll+8q3OlMJfJbAKM/+/Y2q6PPYbryqNTXDbryx7SXLIDamkF6iQFbriYHga0dY44PvDhvvBWCx1Xj4U5+G4hOw==} + engines: {node: '>=10'} + peerDependencies: + react: ^16 || ^17 || ^18 + react-dom: ^16 || ^17 || ^18 + + '@headlessui/react@2.1.10': + resolution: {integrity: sha512-6mLa2fjMDAFQi+/R10B+zU3edsUk/MDtENB2zHho0lqKU1uzhAfJLUduWds4nCo8wbl3vULtC5rJfZAQ1yqIng==} + engines: {node: '>=10'} + peerDependencies: + react: ^18 + react-dom: ^18 + + '@humanwhocodes/config-array@0.11.14': + resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} + engines: {node: '>=10.10.0'} + deprecated: Use @eslint/config-array instead + + '@humanwhocodes/module-importer@1.0.1': + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + + '@humanwhocodes/object-schema@2.0.3': + resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} + deprecated: Use @eslint/object-schema instead + + '@isaacs/cliui@8.0.2': + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + + '@jsdevtools/ono@7.1.3': + resolution: {integrity: sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==} + + '@mdx-js/mdx@2.3.0': + resolution: {integrity: sha512-jLuwRlz8DQfQNiUCJR50Y09CGPq3fLtmtUQfVrj79E0JWu3dvsVcxVIcfhR5h0iXu+/z++zDrYeiJqifRynJkA==} + + '@mdx-js/react@2.3.0': + resolution: {integrity: sha512-zQH//gdOmuu7nt2oJR29vFhDv88oGPmVw6BggmrHeMI+xgEkp1B2dX9/bMBSYtK0dyLX/aOmesKS09g222K1/g==} + peerDependencies: + react: '>=16' + + '@napi-rs/simple-git-android-arm-eabi@0.1.16': + resolution: {integrity: sha512-dbrCL0Pl5KZG7x7tXdtVsA5CO6At5ohDX3myf5xIYn9kN4jDFxsocl8bNt6Vb/hZQoJd8fI+k5VlJt+rFhbdVw==} + engines: {node: '>= 10'} + cpu: [arm] + os: [android] + + '@napi-rs/simple-git-android-arm64@0.1.16': + resolution: {integrity: sha512-xYz+TW5J09iK8SuTAKK2D5MMIsBUXVSs8nYp7HcMi8q6FCRO7yJj96YfP9PvKsc/k64hOyqGmL5DhCzY9Cu1FQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [android] + + '@napi-rs/simple-git-darwin-arm64@0.1.16': + resolution: {integrity: sha512-XfgsYqxhUE022MJobeiX563TJqyQyX4FmYCnqrtJwAfivESVeAJiH6bQIum8dDEYMHXCsG7nL8Ok0Dp8k2m42g==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + + '@napi-rs/simple-git-darwin-x64@0.1.16': + resolution: {integrity: sha512-tkEVBhD6vgRCbeWsaAQqM3bTfpIVGeitamPPRVSbsq8qgzJ5Dx6ZedH27R7KSsA/uao7mZ3dsrNLXbu1Wy5MzA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + + '@napi-rs/simple-git-linux-arm-gnueabihf@0.1.16': + resolution: {integrity: sha512-R6VAyNnp/yRaT7DV1Ao3r67SqTWDa+fNq2LrNy0Z8gXk2wB9ZKlrxFtLPE1WSpWknWtyRDLpRlsorh7Evk7+7w==} + engines: {node: '>= 10'} + cpu: [arm] + os: [linux] + + '@napi-rs/simple-git-linux-arm64-gnu@0.1.16': + resolution: {integrity: sha512-LAGI0opFKw/HBMCV2qIBK3uWSEW9h4xd2ireZKLJy8DBPymX6NrWIamuxYNyCuACnFdPRxR4LaRFy4J5ZwuMdw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@napi-rs/simple-git-linux-arm64-musl@0.1.16': + resolution: {integrity: sha512-I57Ph0F0Yn2KW93ep+V1EzKhACqX0x49vvSiapqIsdDA2PifdEWLc1LJarBolmK7NKoPqKmf6lAKKO9lhiZzkg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@napi-rs/simple-git-linux-x64-gnu@0.1.16': + resolution: {integrity: sha512-AZYYFY2V7hlcQASPEOWyOa3e1skzTct9QPzz0LiDM3f/hCFY/wBaU2M6NC5iG3d2Kr38heuyFS/+JqxLm5WaKA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@napi-rs/simple-git-linux-x64-musl@0.1.16': + resolution: {integrity: sha512-9TyMcYSBJwjT8jwjY9m24BZbu7ozyWTjsmYBYNtK3B0Um1Ov6jthSNneLVvouQ6x+k3Ow+00TiFh6bvmT00r8g==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@napi-rs/simple-git-win32-arm64-msvc@0.1.16': + resolution: {integrity: sha512-uslJ1WuAHCYJWui6xjsyT47SjX6KOHDtClmNO8hqKz1pmDSNY7AjyUY8HxvD1lK9bDnWwc4JYhikS9cxCqHybw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + + '@napi-rs/simple-git-win32-x64-msvc@0.1.16': + resolution: {integrity: sha512-SoEaVeCZCDF1MP+M9bMSXsZWgEjk4On9GWADO5JOulvzR1bKjk0s9PMHwe/YztR9F0sJzrCxwtvBZowhSJsQPg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + + '@napi-rs/simple-git@0.1.16': + resolution: {integrity: sha512-C5wRPw9waqL2jk3jEDeJv+f7ScuO3N0a39HVdyFLkwKxHH4Sya4ZbzZsu2JLi6eEqe7RuHipHL6mC7B2OfYZZw==} + engines: {node: '>= 10'} + + '@next/env@13.5.6': + resolution: {integrity: sha512-Yac/bV5sBGkkEXmAX5FWPS9Mmo2rthrOPRQQNfycJPkjUAUclomCPH7QFVCDQ4Mp2k2K1SSM6m0zrxYrOwtFQw==} + + '@next/env@14.2.10': + resolution: {integrity: sha512-dZIu93Bf5LUtluBXIv4woQw2cZVZ2DJTjax5/5DOs3lzEOeKLy7GxRSr4caK9/SCPdaW6bCgpye6+n4Dh9oJPw==} + + '@next/swc-darwin-arm64@14.2.10': + resolution: {integrity: sha512-V3z10NV+cvMAfxQUMhKgfQnPbjw+Ew3cnr64b0lr8MDiBJs3eLnM6RpGC46nhfMZsiXgQngCJKWGTC/yDcgrDQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + + '@next/swc-darwin-x64@14.2.10': + resolution: {integrity: sha512-Y0TC+FXbFUQ2MQgimJ/7Ina2mXIKhE7F+GUe1SgnzRmwFY3hX2z8nyVCxE82I2RicspdkZnSWMn4oTjIKz4uzA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + + '@next/swc-linux-arm64-gnu@14.2.10': + resolution: {integrity: sha512-ZfQ7yOy5zyskSj9rFpa0Yd7gkrBnJTkYVSya95hX3zeBG9E55Z6OTNPn1j2BTFWvOVVj65C3T+qsjOyVI9DQpA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@next/swc-linux-arm64-musl@14.2.10': + resolution: {integrity: sha512-n2i5o3y2jpBfXFRxDREr342BGIQCJbdAUi/K4q6Env3aSx8erM9VuKXHw5KNROK9ejFSPf0LhoSkU/ZiNdacpQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@next/swc-linux-x64-gnu@14.2.10': + resolution: {integrity: sha512-GXvajAWh2woTT0GKEDlkVhFNxhJS/XdDmrVHrPOA83pLzlGPQnixqxD8u3bBB9oATBKB//5e4vpACnx5Vaxdqg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@next/swc-linux-x64-musl@14.2.10': + resolution: {integrity: sha512-opFFN5B0SnO+HTz4Wq4HaylXGFV+iHrVxd3YvREUX9K+xfc4ePbRrxqOuPOFjtSuiVouwe6uLeDtabjEIbkmDA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@next/swc-win32-arm64-msvc@14.2.10': + resolution: {integrity: sha512-9NUzZuR8WiXTvv+EiU/MXdcQ1XUvFixbLIMNQiVHuzs7ZIFrJDLJDaOF1KaqttoTujpcxljM/RNAOmw1GhPPQQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + + '@next/swc-win32-ia32-msvc@14.2.10': + resolution: {integrity: sha512-fr3aEbSd1GeW3YUMBkWAu4hcdjZ6g4NBl1uku4gAn661tcxd1bHs1THWYzdsbTRLcCKLjrDZlNp6j2HTfrw+Bg==} + engines: {node: '>= 10'} + cpu: [ia32] + os: [win32] + + '@next/swc-win32-x64-msvc@14.2.10': + resolution: {integrity: sha512-UjeVoRGKNL2zfbcQ6fscmgjBAS/inHBh63mjIlfPg/NG8Yn2ztqylXt5qilYb6hoHIwaU2ogHknHWWmahJjgZQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + + '@noble/curves@1.2.0': + resolution: {integrity: sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==} + + '@noble/curves@1.3.0': + resolution: {integrity: sha512-t01iSXPuN+Eqzb4eBX0S5oubSqXbK/xXa1Ne18Hj8f9pStxztHCE2gfboSp/dZRLSqfuLpRK2nDXDK+W9puocA==} + + '@noble/hashes@1.3.2': + resolution: {integrity: sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==} + engines: {node: '>= 16'} + + '@noble/hashes@1.3.3': + resolution: {integrity: sha512-V7/fPHgl+jsVPXqqeOzT8egNj2iBIVt+ECeMMG8TdcnTikP3oaBtUVqpT/gYCR68aEBJSF+XbYUxStjbFMqIIA==} + engines: {node: '>= 16'} + + '@noble/hashes@1.4.0': + resolution: {integrity: sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==} + engines: {node: '>= 16'} + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@npmcli/config@6.4.1': + resolution: {integrity: sha512-uSz+elSGzjCMANWa5IlbGczLYPkNI/LeR+cHrgaTqTrTSh9RHhOFA4daD2eRUz6lMtOW+Fnsb+qv7V2Zz8ML0g==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + '@npmcli/map-workspaces@3.0.6': + resolution: {integrity: sha512-tkYs0OYnzQm6iIRdfy+LcLBjcKuQCeE5YLb8KnrIlutJfheNaPvPpgoFEyEFgbjzl5PLZ3IA/BWAwRU0eHuQDA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + '@npmcli/name-from-folder@2.0.0': + resolution: {integrity: sha512-pwK+BfEBZJbKdNYpHHRTNBwBoqrN/iIMO0AiGvYsp3Hoaq0WbgGSWQR6SCldZovoDpY3yje5lkFUe6gsDgJ2vg==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + + '@pkgr/core@0.1.1': + resolution: {integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + + '@popperjs/core@2.11.8': + resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==} + + '@react-aria/focus@3.17.1': + resolution: {integrity: sha512-FLTySoSNqX++u0nWZJPPN5etXY0WBxaIe/YuL/GTEeuqUIuC/2bJSaw5hlsM6T2yjy6Y/VAxBcKSdAFUlU6njQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + + '@react-aria/interactions@3.21.3': + resolution: {integrity: sha512-BWIuf4qCs5FreDJ9AguawLVS0lV9UU+sK4CCnbCNNmYqOWY+1+gRXCsnOM32K+oMESBxilAjdHW5n1hsMqYMpA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + + '@react-aria/ssr@3.9.4': + resolution: {integrity: sha512-4jmAigVq409qcJvQyuorsmBR4+9r3+JEC60wC+Y0MZV0HCtTmm8D9guYXlJMdx0SSkgj0hHAyFm/HvPNFofCoQ==} + engines: {node: '>= 12'} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + + '@react-aria/utils@3.24.1': + resolution: {integrity: sha512-O3s9qhPMd6n42x9sKeJ3lhu5V1Tlnzhu6Yk8QOvDuXf7UGuUjXf9mzfHJt1dYzID4l9Fwm8toczBzPM9t0jc8Q==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + + '@react-stately/utils@3.10.1': + resolution: {integrity: sha512-VS/EHRyicef25zDZcM/ClpzYMC5i2YGN6uegOeQawmgfGjb02yaCX0F0zR69Pod9m2Hr3wunTbtpgVXvYbZItg==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + + '@react-types/shared@3.23.1': + resolution: {integrity: sha512-5d+3HbFDxGZjhbMBeFHRQhexMFt4pUce3okyRtUVKbbedQFUrtXSBg9VszgF2RTeQDKDkMCIQDtz5ccP/Lk1gw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + + '@scure/base@1.1.6': + resolution: {integrity: sha512-ok9AWwhcgYuGG3Zfhyqg+zwl+Wn5uE+dwC0NV/2qQkx4dABbb/bx96vWu8NSj+BNjjSjno+JRYRjle1jV08k3g==} + + '@scure/bip32@1.3.2': + resolution: {integrity: sha512-N1ZhksgwD3OBlwTv3R6KFEcPojl/W4ElJOeCZdi+vuI5QmTFwLq3OFf2zd2ROpKvxFdgZ6hUpb0dx9bVNEwYCA==} + + '@scure/bip32@1.3.3': + resolution: {integrity: sha512-LJaN3HwRbfQK0X1xFSi0Q9amqOgzQnnDngIt+ZlsBC3Bm7/nE7K0kwshZHyaru79yIVRv/e1mQAjZyuZG6jOFQ==} + + '@scure/bip39@1.2.1': + resolution: {integrity: sha512-Z3/Fsz1yr904dduJD0NpiyRHhRYHdcnyh73FZWiV+/qhWi83wNJ3NWolYqCEN+ZWsUz2TWwajJggcRE9r1zUYg==} + + '@scure/bip39@1.2.2': + resolution: {integrity: sha512-HYf9TUXG80beW+hGAt3TRM8wU6pQoYur9iNypTROm42dorCGmLnFe3eWjz3gOq6G62H2WRh0FCzAR1PI+29zIA==} + + '@swc/counter@0.1.3': + resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} + + '@swc/helpers@0.5.2': + resolution: {integrity: sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==} + + '@swc/helpers@0.5.5': + resolution: {integrity: sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A==} + + '@tanstack/react-virtual@3.10.8': + resolution: {integrity: sha512-VbzbVGSsZlQktyLrP5nxE+vE1ZR+U0NFAWPbJLoG2+DKPwd2D7dVICTVIIaYlJqX1ZCEnYDbaOpmMwbsyhBoIA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + + '@tanstack/react-virtual@3.5.0': + resolution: {integrity: sha512-rtvo7KwuIvqK9zb0VZ5IL7fiJAEnG+0EiFZz8FUOs+2mhGqdGmjKIaT1XU7Zq0eFqL0jonLlhbayJI/J2SA/Bw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + + '@tanstack/virtual-core@3.10.8': + resolution: {integrity: sha512-PBu00mtt95jbKFi6Llk9aik8bnR3tR/oQP1o3TSi+iG//+Q2RTIzCEgKkHG8BB86kxMNW6O8wku+Lmi+QFR6jA==} + + '@tanstack/virtual-core@3.5.0': + resolution: {integrity: sha512-KnPRCkQTyqhanNC0K63GBG3wA8I+D1fQuVnAvcBF8f13akOKeQp1gSbu6f77zCxhEk727iV5oQnbHLYzHrECLg==} + + '@testing-library/dom@9.3.4': + resolution: {integrity: sha512-FlS4ZWlp97iiNWig0Muq8p+3rVDjRiYE+YKGbAqXOu9nwJFFOdL00kFpz42M+4huzYi86vAK1sOOfyOG45muIQ==} + engines: {node: '>=14'} + + '@testing-library/react@14.3.1': + resolution: {integrity: sha512-H99XjUhWQw0lTgyMN05W3xQG1Nh4lq574D8keFf1dDoNTJgp66VbJozRaczoF+wsiaPJNt/TcnfpLGufGxSrZQ==} + engines: {node: '>=14'} + peerDependencies: + react: ^18.0.0 + react-dom: ^18.0.0 + + '@theguild/remark-mermaid@0.0.5': + resolution: {integrity: sha512-e+ZIyJkEv9jabI4m7q29wZtZv+2iwPGsXJ2d46Zi7e+QcFudiyuqhLhHG/3gX3ZEB+hxTch+fpItyMS8jwbIcw==} + peerDependencies: + react: ^18.2.0 + + '@theguild/remark-npm2yarn@0.2.1': + resolution: {integrity: sha512-jUTFWwDxtLEFtGZh/TW/w30ySaDJ8atKWH8dq2/IiQF61dPrGfETpl0WxD0VdBfuLOeU14/kop466oBSRO/5CA==} + + '@types/acorn@4.0.6': + resolution: {integrity: sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ==} + + '@types/aria-query@5.0.4': + resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==} + + '@types/change-case@2.3.1': + resolution: {integrity: sha512-HYiGjhmGInNzJjtt6ciXEfl2s8ZQGUQpPiwgWSth1fycE69hXbV/RgWH7MvSq2QPhMBzi4SGhu1vE+cMx1xB8g==} + deprecated: This is a stub types definition for change-case (https://github.com/blakeembrey/change-case). change-case provides its own type definitions, so you don't need @types/change-case installed! + + '@types/concat-stream@2.0.3': + resolution: {integrity: sha512-3qe4oQAPNwVNwK4C9c8u+VJqv9kez+2MR4qJpoPFfXtgxxif1QbFusvXzK0/Wra2VX07smostI2VMmJNSpZjuQ==} + + '@types/d3-scale-chromatic@3.0.3': + resolution: {integrity: sha512-laXM4+1o5ImZv3RpFAsTRn3TEkzqkytiOY0Dz0sq5cnd1dtNlk6sHLon4OvqaiJb28T0S/TdsBI3Sjsy+keJrw==} + + '@types/d3-scale@4.0.8': + resolution: {integrity: sha512-gkK1VVTr5iNiYJ7vWDI+yUFFlszhNMtVeneJ6lUTKPjprsvLLI9/tgEGiXJOnlINJA8FyA88gfnQsHbybVZrYQ==} + + '@types/d3-time@3.0.3': + resolution: {integrity: sha512-2p6olUZ4w3s+07q3Tm2dbiMZy5pCDfYwtLXXHUnVzXgQlZ/OyPtUz6OL382BkOuGlLXqfT+wqv8Fw2v8/0geBw==} + + '@types/debug@4.1.12': + resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} + + '@types/estree-jsx@1.0.5': + resolution: {integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==} + + '@types/estree@1.0.5': + resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} + + '@types/hast@2.3.10': + resolution: {integrity: sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw==} + + '@types/hast@3.0.4': + resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} + + '@types/is-empty@1.2.3': + resolution: {integrity: sha512-4J1l5d79hoIvsrKh5VUKVRA1aIdsOb10Hu5j3J2VfP/msDnfTdGPmNp2E1Wg+vs97Bktzo+MZePFFXSGoykYJw==} + + '@types/js-yaml@4.0.9': + resolution: {integrity: sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==} + + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + + '@types/katex@0.16.7': + resolution: {integrity: sha512-HMwFiRujE5PjrgwHQ25+bsLJgowjGjm5Z8FVSf0N6PwgJrwxH0QxzHYDcKsTfV3wva0vzrpqMTJS2jXPr5BMEQ==} + + '@types/lodash.clonedeep@4.5.9': + resolution: {integrity: sha512-19429mWC+FyaAhOLzsS8kZUsI+/GmBAQ0HFiCPsKGU+7pBXOQWhyrY6xNNDwUSX8SMZMJvuFVMF9O5dQOlQK9Q==} + + '@types/lodash@4.17.0': + resolution: {integrity: sha512-t7dhREVv6dbNj0q17X12j7yDG4bD/DHYX7o5/DbDxobP0HnGPgpRz2Ej77aL7TZT3DSw13fqUTj8J4mMnqa7WA==} + + '@types/mdast@3.0.15': + resolution: {integrity: sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==} + + '@types/mdast@4.0.3': + resolution: {integrity: sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg==} + + '@types/mdx@2.0.13': + resolution: {integrity: sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==} + + '@types/ms@0.7.34': + resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==} + + '@types/node@18.11.10': + resolution: {integrity: sha512-juG3RWMBOqcOuXC643OAdSA525V44cVgGV6dUDuiFtss+8Fk5x1hI93Rsld43VeJVIeqlP9I7Fn9/qaVqoEAuQ==} + + '@types/prop-types@15.7.12': + resolution: {integrity: sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==} + + '@types/react-dom@18.3.0': + resolution: {integrity: sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==} + + '@types/react@18.3.1': + resolution: {integrity: sha512-V0kuGBX3+prX+DQ/7r2qsv1NsdfnCLnTgnRJ1pYnxykBhGMz+qj+box5lq7XsO5mtZsBqpjwwTu/7wszPfMBcw==} + + '@types/supports-color@8.1.3': + resolution: {integrity: sha512-Hy6UMpxhE3j1tLpl27exp1XqHD7n8chAiNPzWfz16LPZoMMoSc4dzLl6w9qijkEb/r5O1ozdu1CWGA2L83ZeZg==} + + '@types/unist@2.0.10': + resolution: {integrity: sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==} + + '@types/unist@3.0.2': + resolution: {integrity: sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==} + + '@ungap/structured-clone@1.2.0': + resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} + + abbrev@2.0.0: + resolution: {integrity: sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + abitype@1.0.0: + resolution: {integrity: sha512-NMeMah//6bJ56H5XRj8QCV4AwuW6hB6zqz2LnhhLdcWVQOsXki6/Pn3APeqxCma62nXIcmZWdu1DlHWS74umVQ==} + peerDependencies: + typescript: '>=5.0.4' + zod: ^3 >=3.22.0 + peerDependenciesMeta: + typescript: + optional: true + zod: + optional: true + + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn@8.11.3: + resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} + engines: {node: '>=0.4.0'} + hasBin: true + + aes-js@3.0.0: + resolution: {integrity: sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==} + + ajv-formats@2.1.1: + resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + + ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + + ajv@8.12.0: + resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} + + algoliasearch@4.23.3: + resolution: {integrity: sha512-Le/3YgNvjW9zxIQMRhUHuhiUjAlKY/zsdZpfq4dlLqg6mEm0nL6yk+7f2hDOtLpxsgE4jSzDmvHL7nXdBp5feg==} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-regex@6.0.1: + resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} + engines: {node: '>=12'} + + ansi-sequence-parser@1.1.1: + resolution: {integrity: sha512-vJXt3yiaUL4UU546s3rPXlsry/RnM730G1+HkpKE012AN0sx1eOrxSu95oKDIonskeLTijMgqWZ3uDEe3NFvyg==} + + ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + ansi-styles@5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + + ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + + arch@2.2.0: + resolution: {integrity: sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==} + + arg@1.0.0: + resolution: {integrity: sha512-Wk7TEzl1KqvTGs/uyhmHO/3XLd3t1UeU4IstvPXVzGPM522cTjqjNZ99esCkcL52sjqjo8e8CTBcWhkxvGzoAw==} + + argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + aria-query@5.1.3: + resolution: {integrity: sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==} + + array-buffer-byte-length@1.0.1: + resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} + engines: {node: '>= 0.4'} + + array-timsort@1.0.3: + resolution: {integrity: sha512-/+3GRL7dDAGEfM6TseQk/U+mi18TU2Ms9I3UlLdUMhz2hbvGNTKdj9xniwXfUqgYhHxRx0+8UnKkvlNwVU+cWQ==} + + array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + + assertion-error@1.1.0: + resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} + + astring@1.8.6: + resolution: {integrity: sha512-ISvCdHdlTDlH5IpxQJIex7BWBywFWgjJSVdwst+/iQCoEYnyOaQ95+X1JGshuBjGp6nxKUy1jMgE3zPqN7fQdg==} + hasBin: true + + available-typed-arrays@1.0.7: + resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} + engines: {node: '>= 0.4'} + + bail@2.0.2: + resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + bech32@1.1.4: + resolution: {integrity: sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==} + + bignumber.js@9.1.2: + resolution: {integrity: sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==} + + bn.js@4.11.6: + resolution: {integrity: sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA==} + + bn.js@4.12.0: + resolution: {integrity: sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==} + + bn.js@5.2.1: + resolution: {integrity: sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==} + + brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + + brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + + braces@3.0.2: + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + engines: {node: '>=8'} + + brorand@1.1.0: + resolution: {integrity: sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==} + + buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + + buffer-reverse@1.0.1: + resolution: {integrity: sha512-M87YIUBsZ6N924W57vDwT/aOu8hw7ZgdByz6ijksLjmHJELBASmYTTlNHRgjE+pTsT9oJXGaDSgqqwfdHotDUg==} + + bufio@1.2.1: + resolution: {integrity: sha512-9oR3zNdupcg/Ge2sSHQF3GX+kmvL/fTPvD0nd5AGLq8SjUYnTz+SlFjK/GXidndbZtIj+pVKXiWeR9w6e9wKCA==} + engines: {node: '>=14.0.0'} + + busboy@1.6.0: + resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} + engines: {node: '>=10.16.0'} + + call-bind@1.0.7: + resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} + engines: {node: '>= 0.4'} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + camel-case@4.1.2: + resolution: {integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==} + + caniuse-lite@1.0.30001614: + resolution: {integrity: sha512-jmZQ1VpmlRwHgdP1/uiKzgiAuGOfLEJsYFP4+GBou/QQ4U6IOJCB4NP1c+1p9RGLpwObcT94jA5/uO+F1vBbog==} + + capital-case@1.0.4: + resolution: {integrity: sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==} + + ccount@2.0.1: + resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} + + chai@4.4.1: + resolution: {integrity: sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==} + engines: {node: '>=4'} + + chalk-template@1.1.0: + resolution: {integrity: sha512-T2VJbcDuZQ0Tb2EWwSotMPJjgpy1/tGee1BTpUNsGZ/qgNjV2t7Mvu+d4600U564nbLesN1x2dPL+xii174Ekg==} + engines: {node: '>=14.16'} + + chalk@2.3.0: + resolution: {integrity: sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==} + engines: {node: '>=4'} + + chalk@2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + chalk@5.3.0: + resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + + change-case@4.1.2: + resolution: {integrity: sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A==} + + character-entities-html4@2.1.0: + resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} + + character-entities-legacy@1.1.4: + resolution: {integrity: sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==} + + character-entities-legacy@3.0.0: + resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} + + character-entities@1.2.4: + resolution: {integrity: sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==} + + character-entities@2.0.2: + resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} + + character-reference-invalid@1.1.4: + resolution: {integrity: sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==} + + character-reference-invalid@2.0.1: + resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} + + check-error@1.0.3: + resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} + + ci-info@4.0.0: + resolution: {integrity: sha512-TdHqgGf9odd8SXNuxtUBVx8Nv+qZOejE6qyqiy5NtbYYQOeFa6zmHkxlPzmaLxWWHsU6nJmB7AETdVPi+2NBUg==} + engines: {node: '>=8'} + + clear-module@4.1.2: + resolution: {integrity: sha512-LWAxzHqdHsAZlPlEyJ2Poz6AIs384mPeqLVCru2p0BrP9G/kVGuhNyZYClLO6cXlnuJjzC8xtsJIuMjKqLXoAw==} + engines: {node: '>=8'} + + client-only@0.0.1: + resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} + + clipboardy@1.2.2: + resolution: {integrity: sha512-16KrBOV7bHmHdxcQiCvfUFYVFyEah4FI8vYT1Fr7CGSA4G+xBWMEfUEQJS1hxeHGtI9ju1Bzs9uXSbj5HZKArw==} + engines: {node: '>=4'} + + clsx@2.1.1: + resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} + engines: {node: '>=6'} + + color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + comma-separated-tokens@2.0.3: + resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} + + commander@12.0.0: + resolution: {integrity: sha512-MwVNWlYjDTtOjX5PiD7o5pK0UrFU/OYgcJfjjK4RaHZETNtjJqrZa9Y9ds88+A+f+d5lv+561eZ+yCKoS3gbAA==} + engines: {node: '>=18'} + + commander@7.2.0: + resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} + engines: {node: '>= 10'} + + commander@8.3.0: + resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} + engines: {node: '>= 12'} + + comment-json@4.2.3: + resolution: {integrity: sha512-SsxdiOf064DWoZLH799Ata6u7iV658A11PlWtZATDlXPpKGJnbJZ5Z24ybixAi+LUUqJ/GKowAejtC5GFUG7Tw==} + engines: {node: '>= 6'} + + compute-scroll-into-view@3.1.0: + resolution: {integrity: sha512-rj8l8pD4bJ1nx+dAkMhV1xB5RuZEyVysfxJqB1pRchh1KVvwOv9b7CGB8ZfjTImVv2oF+sYMUkMZq6Na5Ftmbg==} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + concat-stream@2.0.0: + resolution: {integrity: sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==} + engines: {'0': node >= 6.0} + + configstore@6.0.0: + resolution: {integrity: sha512-cD31W1v3GqUlQvbBCGcXmd2Nj9SvLDOP1oQ0YFuLETufzSPaKp11rYBsSOm7rCsW3OnIRAFM3OxRhceaXNYHkA==} + engines: {node: '>=12'} + + constant-case@3.0.4: + resolution: {integrity: sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ==} + + core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + + cose-base@1.0.3: + resolution: {integrity: sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg==} + + cross-spawn@5.1.0: + resolution: {integrity: sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==} + + cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + + crypto-js@4.2.0: + resolution: {integrity: sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==} + + crypto-random-string@4.0.0: + resolution: {integrity: sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==} + engines: {node: '>=12'} + + cspell-config-lib@8.7.0: + resolution: {integrity: sha512-depsd01GbLBo71/tfRrL5iECWQLS4CjCxA9C01dVkFAJqVB0s+K9KLKjTlq5aHOhcvo9Z3dHV+bGQCf5/Q7bfw==} + engines: {node: '>=18'} + + cspell-dictionary@8.7.0: + resolution: {integrity: sha512-S6IpZSzIMxlOO/33NgCOuP0TPH2mZbw8d5CP44z5jajflloq8l74MeJLkeDzYfCRcm0Rtk0A5drBeMg+Ai34OA==} + engines: {node: '>=18'} + + cspell-gitignore@8.7.0: + resolution: {integrity: sha512-yvUZ86qyopUpDgn+YXP1qTpUe/lp65ZFvpMtw21lWHTFlg1OWKntr349EQU/5ben/K6koxk1FiElCBV7Lr4uFg==} + engines: {node: '>=18'} + hasBin: true + + cspell-glob@8.7.0: + resolution: {integrity: sha512-AMdfx0gvROA/aIL8t8b5Y5NtMgscGZELFj6WhCSZiQSuWRxXUKiLGGLUFjx2y0hgXN9LUYOo6aBjvhnxI/v71g==} + engines: {node: '>=18'} + + cspell-grammar@8.7.0: + resolution: {integrity: sha512-SGcXc7322wU2WNRi7vtpToWDXTqZHhxqvR+aIXHT2kkxlMSWp3Rvfpshd0ckgY54nZtgw7R/JtKND2jeACRpwQ==} + engines: {node: '>=18'} + hasBin: true + + cspell-io@8.7.0: + resolution: {integrity: sha512-o7OltyyvVkRG1gQrIqGpN5pUkHNnv6rvihb7Qu6cJ8jITinLGuWJuEQpgt0eF5yIr624jDbFwSzAxsFox8riQg==} + engines: {node: '>=18'} + + cspell-lib@8.7.0: + resolution: {integrity: sha512-qDSHZGekwiDmouYRECTQokE+hgAuPqREm+Hb+G3DoIo3ZK5H47TtEUo8fNCw22XsKefcF8X28LiyoZwiYHVpSg==} + engines: {node: '>=18'} + + cspell-trie-lib@8.7.0: + resolution: {integrity: sha512-W3Nh2cO7gMV91r+hLqyTMgKlvRl4W5diKs5YiyOxjZumRkMBy42IzcNYtgIIacOxghklv96F5Bd1Vx/zY6ylGA==} + engines: {node: '>=18'} + + cspell@8.7.0: + resolution: {integrity: sha512-77nRPgLl240C6FK8RKVKo34lP15Lzp/6bk+SKYJFwUKKXlcgWXDis+Lw4JolA741/JgHtuxmhW1C8P7dCKjJ3w==} + engines: {node: '>=18'} + hasBin: true + + csstype@3.1.3: + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + + cytoscape-cose-bilkent@4.1.0: + resolution: {integrity: sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ==} + peerDependencies: + cytoscape: ^3.2.0 + + cytoscape@3.29.2: + resolution: {integrity: sha512-2G1ycU28Nh7OHT9rkXRLpCDP30MKH1dXJORZuBhtEhEW7pKwgPi77ImqlCWinouyE1PNepIOGZBOrE84DG7LyQ==} + engines: {node: '>=0.10'} + + d3-array@2.12.1: + resolution: {integrity: sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==} + + d3-array@3.2.4: + resolution: {integrity: sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==} + engines: {node: '>=12'} + + d3-axis@3.0.0: + resolution: {integrity: sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==} + engines: {node: '>=12'} + + d3-brush@3.0.0: + resolution: {integrity: sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==} + engines: {node: '>=12'} + + d3-chord@3.0.1: + resolution: {integrity: sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==} + engines: {node: '>=12'} + + d3-color@3.1.0: + resolution: {integrity: sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==} + engines: {node: '>=12'} + + d3-contour@4.0.2: + resolution: {integrity: sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==} + engines: {node: '>=12'} + + d3-delaunay@6.0.4: + resolution: {integrity: sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==} + engines: {node: '>=12'} + + d3-dispatch@3.0.1: + resolution: {integrity: sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==} + engines: {node: '>=12'} + + d3-drag@3.0.0: + resolution: {integrity: sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==} + engines: {node: '>=12'} + + d3-dsv@3.0.1: + resolution: {integrity: sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==} + engines: {node: '>=12'} + hasBin: true + + d3-ease@3.0.1: + resolution: {integrity: sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==} + engines: {node: '>=12'} + + d3-fetch@3.0.1: + resolution: {integrity: sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==} + engines: {node: '>=12'} + + d3-force@3.0.0: + resolution: {integrity: sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==} + engines: {node: '>=12'} + + d3-format@3.1.0: + resolution: {integrity: sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==} + engines: {node: '>=12'} + + d3-geo@3.1.1: + resolution: {integrity: sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==} + engines: {node: '>=12'} + + d3-hierarchy@3.1.2: + resolution: {integrity: sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==} + engines: {node: '>=12'} + + d3-interpolate@3.0.1: + resolution: {integrity: sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==} + engines: {node: '>=12'} + + d3-path@1.0.9: + resolution: {integrity: sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==} + + d3-path@3.1.0: + resolution: {integrity: sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==} + engines: {node: '>=12'} + + d3-polygon@3.0.1: + resolution: {integrity: sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==} + engines: {node: '>=12'} + + d3-quadtree@3.0.1: + resolution: {integrity: sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==} + engines: {node: '>=12'} + + d3-random@3.0.1: + resolution: {integrity: sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==} + engines: {node: '>=12'} + + d3-sankey@0.12.3: + resolution: {integrity: sha512-nQhsBRmM19Ax5xEIPLMY9ZmJ/cDvd1BG3UVvt5h3WRxKg5zGRbvnteTyWAbzeSvlh3tW7ZEmq4VwR5mB3tutmQ==} + + d3-scale-chromatic@3.1.0: + resolution: {integrity: sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==} + engines: {node: '>=12'} + + d3-scale@4.0.2: + resolution: {integrity: sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==} + engines: {node: '>=12'} + + d3-selection@3.0.0: + resolution: {integrity: sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==} + engines: {node: '>=12'} + + d3-shape@1.3.7: + resolution: {integrity: sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==} + + d3-shape@3.2.0: + resolution: {integrity: sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==} + engines: {node: '>=12'} + + d3-time-format@4.1.0: + resolution: {integrity: sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==} + engines: {node: '>=12'} + + d3-time@3.1.0: + resolution: {integrity: sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==} + engines: {node: '>=12'} + + d3-timer@3.0.1: + resolution: {integrity: sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==} + engines: {node: '>=12'} + + d3-transition@3.0.1: + resolution: {integrity: sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==} + engines: {node: '>=12'} + peerDependencies: + d3-selection: 2 - 3 + + d3-zoom@3.0.0: + resolution: {integrity: sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==} + engines: {node: '>=12'} + + d3@7.9.0: + resolution: {integrity: sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==} + engines: {node: '>=12'} + + dagre-d3-es@7.0.10: + resolution: {integrity: sha512-qTCQmEhcynucuaZgY5/+ti3X/rnszKZhEQH/ZdWdtP1tA/y3VoHJzcVrO9pjjJCNpigfscAtoUB5ONcd2wNn0A==} + + dayjs@1.11.11: + resolution: {integrity: sha512-okzr3f11N6WuqYtZSvm+F776mB41wRZMhKP+hc34YdW+KmtYYK9iqvHSwo2k9FEH3fhGXvOPV6yz2IcSrfRUDg==} + + debug@4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + decode-named-character-reference@1.0.2: + resolution: {integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==} + + deep-eql@4.1.3: + resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} + engines: {node: '>=6'} + + deep-equal@2.2.3: + resolution: {integrity: sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==} + engines: {node: '>= 0.4'} + + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + + define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + + define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + + delaunator@5.0.1: + resolution: {integrity: sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw==} + + dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + + devlop@1.1.0: + resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + + diff@5.2.0: + resolution: {integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==} + engines: {node: '>=0.3.1'} + + dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + + doctrine@3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + + dom-accessibility-api@0.5.16: + resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==} + + dompurify@3.1.7: + resolution: {integrity: sha512-VaTstWtsneJY8xzy7DekmYWEOZcmzIe3Qb3zPd4STve1OBTa+e+WmS1ITQec1fZYXI3HCsOZZiSMpG6oxoWMWQ==} + + dot-case@3.0.4: + resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} + + dot-prop@6.0.1: + resolution: {integrity: sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==} + engines: {node: '>=10'} + + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + + elkjs@0.9.3: + resolution: {integrity: sha512-f/ZeWvW/BCXbhGEf1Ujp29EASo/lk1FDnETgNKwJrsVvGZhUWCZyg3xLJjAsxfOmt8KjswHmI5EwCQcPMpOYhQ==} + + elliptic@6.5.4: + resolution: {integrity: sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==} + + emoji-regex@10.3.0: + resolution: {integrity: sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + + error-ex@1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + + es-define-property@1.0.0: + resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-get-iterator@1.1.3: + resolution: {integrity: sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==} + + escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + escape-string-regexp@5.0.0: + resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} + engines: {node: '>=12'} + + eslint-mdx@2.3.4: + resolution: {integrity: sha512-u4NszEUyoGtR7Q0A4qs0OymsEQdCO6yqWlTzDa9vGWsK7aMotdnW0hqifHTkf6lEtA2vHk2xlkWHTCrhYLyRbw==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + peerDependencies: + eslint: '>=8.0.0' + + eslint-plugin-markdown@3.0.1: + resolution: {integrity: sha512-8rqoc148DWdGdmYF6WSQFT3uQ6PO7zXYgeBpHAOAakX/zpq+NvFYbDA/H7PYzHajwtmaOzAwfxyl++x0g1/N9A==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + + eslint-plugin-mdx@2.3.4: + resolution: {integrity: sha512-kr6tgaifKL+AVGYMtdYc2VCsIjfYQXuUCKz4rK58d2DpnPFHrmgXIOC7NcMvaEld+VOEpxBSCCnjnsf4IVCQGg==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + peerDependencies: + eslint: '>=8.0.0' + + eslint-scope@7.2.2: + resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint@8.57.0: + resolution: {integrity: sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. + hasBin: true + + espree@9.6.1: + resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + + esquery@1.5.0: + resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} + engines: {node: '>=0.10'} + + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + estree-util-attach-comments@2.1.1: + resolution: {integrity: sha512-+5Ba/xGGS6mnwFbXIuQiDPTbuTxuMCooq3arVv7gPZtYpjp+VXH/NkHAP35OOefPhNG/UGqU3vt/LTABwcHX0w==} + + estree-util-build-jsx@2.2.2: + resolution: {integrity: sha512-m56vOXcOBuaF+Igpb9OPAy7f9w9OIkb5yhjsZuaPm7HoGi4oTOQi0h2+yZ+AtKklYFZ+rPC4n0wYCJCEU1ONqg==} + + estree-util-is-identifier-name@2.1.0: + resolution: {integrity: sha512-bEN9VHRyXAUOjkKVQVvArFym08BTWB0aJPppZZr0UNyAqWsLaVfAqP7hbaTJjzHifmB5ebnR8Wm7r7yGN/HonQ==} + + estree-util-to-js@1.2.0: + resolution: {integrity: sha512-IzU74r1PK5IMMGZXUVZbmiu4A1uhiPgW5hm1GjcOfr4ZzHaMPpLNJjR7HjXiIOzi25nZDrgFTobHTkV5Q6ITjA==} + + estree-util-value-to-estree@1.3.0: + resolution: {integrity: sha512-Y+ughcF9jSUJvncXwqRageavjrNPAI+1M/L3BI3PyLp1nmgYTGUXU6t5z1Y7OWuThoDdhPME07bQU+d5LxdJqw==} + engines: {node: '>=12.0.0'} + + estree-util-visit@1.2.1: + resolution: {integrity: sha512-xbgqcrkIVbIG+lI/gzbvd9SGTJL4zqJKBFttUl5pP27KhAjtMKbX/mQXJ7qgyXpMgVy/zvpm0xoQQaGL8OloOw==} + + estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + ethereum-bloom-filters@1.1.0: + resolution: {integrity: sha512-J1gDRkLpuGNvWYzWslBQR9cDV4nd4kfvVTE/Wy4Kkm4yb3EYRSlyi0eB/inTsSTTVyA0+HyzHgbr95Fn/Z1fSw==} + deprecated: do not use this package use package versions above as this can miss some topics + + ethereum-cryptography@2.1.3: + resolution: {integrity: sha512-BlwbIL7/P45W8FGW2r7LGuvoEZ+7PWsniMvQ4p5s2xCyw9tmaDlpfsN9HjAucbF+t/qpVHwZUisgfK24TCW8aA==} + + ethers@5.7.2: + resolution: {integrity: sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==} + + ethjs-unit@0.1.6: + resolution: {integrity: sha512-/Sn9Y0oKl0uqQuvgFk/zQgR7aw1g36qX/jzSQ5lSwlO0GigPymk4eGQfeNTD03w1dPOqfz8V77Cy43jH56pagw==} + engines: {node: '>=6.5.0', npm: '>=3'} + + execa@0.8.0: + resolution: {integrity: sha512-zDWS+Rb1E8BlqqhALSt9kUhss8Qq4nN3iof3gsOdyINksElaPyNBtKUMTR62qhvgVWR0CqCX7sdnKe4MnUbFEA==} + engines: {node: '>=4'} + + extend-shallow@2.0.1: + resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} + engines: {node: '>=0.10.0'} + + extend@3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-equals@5.0.1: + resolution: {integrity: sha512-WF1Wi8PwwSY7/6Kx0vKXtw8RwuSGoM1bvDaJbu7MxDlR1vovZjIAKrnzyrThgAjm6JDTu0fVgWXDlMGspodfoQ==} + engines: {node: '>=6.0.0'} + + fast-glob@3.3.2: + resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + engines: {node: '>=8.6.0'} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + fastq@1.17.1: + resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + + fault@2.0.1: + resolution: {integrity: sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ==} + + file-entry-cache@6.0.1: + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} + engines: {node: ^10.12.0 || >=12.0.0} + + file-entry-cache@8.0.0: + resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} + engines: {node: '>=16.0.0'} + + fill-range@7.0.1: + resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + engines: {node: '>=8'} + + find-up-simple@1.0.0: + resolution: {integrity: sha512-q7Us7kcjj2VMePAa02hDAF6d+MzsdsAWEwYyOpwUtlerRBkOEPBCRZrAV4XfcSN8fHAgaD0hP7miwoay6DCprw==} + engines: {node: '>=18'} + + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + + find-up@6.3.0: + resolution: {integrity: sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + flat-cache@3.2.0: + resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} + engines: {node: ^10.12.0 || >=12.0.0} + + flat-cache@4.0.1: + resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} + engines: {node: '>=16'} + + flatted@3.3.1: + resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} + + flexsearch@0.7.43: + resolution: {integrity: sha512-c5o/+Um8aqCSOXGcZoqZOm+NqtVwNsvVpWv6lfmSclU954O3wvQKxxK8zj74fPaSJbXpSLTs4PRhh+wnoCXnKg==} + + focus-visible@5.2.0: + resolution: {integrity: sha512-Rwix9pBtC1Nuy5wysTmKy+UjbDJpIfg8eHjw0rjZ1mX4GNLz1Bmd16uDpI3Gk1i70Fgcs8Csg2lPm8HULFg9DQ==} + + for-each@0.3.3: + resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} + + foreground-child@3.1.1: + resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} + engines: {node: '>=14'} + + format@0.2.2: + resolution: {integrity: sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==} + engines: {node: '>=0.4.x'} + + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + functions-have-names@1.2.3: + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + + gensequence@7.0.0: + resolution: {integrity: sha512-47Frx13aZh01afHJTB3zTtKIlFI6vWY+MYCN9Qpew6i52rfKjnhCF/l1YlC8UmEMvvntZZ6z4PiCcmyuedR2aQ==} + engines: {node: '>=18'} + + get-func-name@2.0.2: + resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} + + get-intrinsic@1.2.4: + resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} + engines: {node: '>= 0.4'} + + get-stdin@9.0.0: + resolution: {integrity: sha512-dVKBjfWisLAicarI2Sf+JuBE/DghV4UzNAVe9yhEJuzeREd3JhOTE9cUaJTeSa77fsbQUK3pcOpJfM59+VKZaA==} + engines: {node: '>=12'} + + get-stream@3.0.0: + resolution: {integrity: sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==} + engines: {node: '>=4'} + + git-up@7.0.0: + resolution: {integrity: sha512-ONdIrbBCFusq1Oy0sC71F5azx8bVkvtZtMJAsv+a6lz5YAmbNnLD6HAB4gptHZVLPR8S2/kVN6Gab7lryq5+lQ==} + + git-url-parse@13.1.1: + resolution: {integrity: sha512-PCFJyeSSdtnbfhSNRw9Wk96dDCNx+sogTe4YNXeXSJxt7xz5hvXekuRn9JX7m+Mf4OscCu8h+mtAl3+h5Fo8lQ==} + + github-slugger@1.5.0: + resolution: {integrity: sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw==} + + github-slugger@2.0.0: + resolution: {integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + + glob@10.3.12: + resolution: {integrity: sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Glob versions prior to v9 are no longer supported + + glob@8.1.0: + resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} + engines: {node: '>=12'} + deprecated: Glob versions prior to v9 are no longer supported + + global-directory@4.0.1: + resolution: {integrity: sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==} + engines: {node: '>=18'} + + globals@13.24.0: + resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} + engines: {node: '>=8'} + + globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + + gopd@1.0.1: + resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + + gray-matter@4.0.3: + resolution: {integrity: sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==} + engines: {node: '>=6.0'} + + has-bigints@1.0.2: + resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} + + has-flag@2.0.0: + resolution: {integrity: sha512-P+1n3MnwjR/Epg9BBo1KT8qbye2g2Ou4sFumihwt6I4tsUX7jnLcX4BTOSKg/B1ZrIYMN9FcEnG4x5a7NB8Eng==} + engines: {node: '>=0.10.0'} + + has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + has-own-prop@2.0.0: + resolution: {integrity: sha512-Pq0h+hvsVm6dDEa8x82GnLSYHOzNDt7f0ddFa3FqcQlgzEiptPqL+XrOJNavjOzSYiYWIrgeVYYgGlLmnxwilQ==} + engines: {node: '>=8'} + + has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + + has-proto@1.0.3: + resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} + engines: {node: '>= 0.4'} + + has-symbols@1.0.3: + resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + + hash-obj@4.0.0: + resolution: {integrity: sha512-FwO1BUVWkyHasWDW4S8o0ssQXjvyghLV2rfVhnN36b2bbcj45eGiuzdn9XOvOpjV3TKQD7Gm2BWNXdE9V4KKYg==} + engines: {node: '>=12'} + + hash.js@1.1.7: + resolution: {integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + hast-util-from-dom@5.0.0: + resolution: {integrity: sha512-d6235voAp/XR3Hh5uy7aGLbM3S4KamdW0WEgOaU1YoewnuYw4HXb5eRtv9g65m/RFGEfUY1Mw4UqCc5Y8L4Stg==} + + hast-util-from-html-isomorphic@2.0.0: + resolution: {integrity: sha512-zJfpXq44yff2hmE0XmwEOzdWin5xwH+QIhMLOScpX91e/NSGPsAzNCvLQDIEPyO2TXi+lBmU6hjLIhV8MwP2kw==} + + hast-util-from-html@2.0.1: + resolution: {integrity: sha512-RXQBLMl9kjKVNkJTIO6bZyb2n+cUH8LFaSSzo82jiLT6Tfc+Pt7VQCS+/h3YwG4jaNE2TA2sdJisGWR+aJrp0g==} + + hast-util-from-parse5@8.0.1: + resolution: {integrity: sha512-Er/Iixbc7IEa7r/XLtuG52zoqn/b3Xng/w6aZQ0xGVxzhw5xUFxcRqdPzP6yFi/4HBYRaifaI5fQ1RH8n0ZeOQ==} + + hast-util-is-element@3.0.0: + resolution: {integrity: sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==} + + hast-util-parse-selector@4.0.0: + resolution: {integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==} + + hast-util-raw@9.0.2: + resolution: {integrity: sha512-PldBy71wO9Uq1kyaMch9AHIghtQvIwxBUkv823pKmkTM3oV1JxtsTNYdevMxvUHqcnOAuO65JKU2+0NOxc2ksA==} + + hast-util-to-estree@2.3.3: + resolution: {integrity: sha512-ihhPIUPxN0v0w6M5+IiAZZrn0LH2uZomeWwhn7uP7avZC6TE7lIiEh2yBMPr5+zi1aUCXq6VoYRgs2Bw9xmycQ==} + + hast-util-to-parse5@8.0.0: + resolution: {integrity: sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==} + + hast-util-to-text@4.0.2: + resolution: {integrity: sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A==} + + hast-util-whitespace@2.0.1: + resolution: {integrity: sha512-nAxA0v8+vXSBDt3AnRUNjyRIQ0rD+ntpbAp4LnPkumc5M9yUbSMa4XDU9Q6etY4f1Wp4bNgvc1yjiZtsTTrSng==} + + hastscript@8.0.0: + resolution: {integrity: sha512-dMOtzCEd3ABUeSIISmrETiKuyydk1w0pa+gE/uormcTpSYuaNJPbX1NU3JLyscSLjwAQM8bWMhhIlnCqnRvDTw==} + + header-case@2.0.4: + resolution: {integrity: sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q==} + + hmac-drbg@1.0.1: + resolution: {integrity: sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==} + + html-void-elements@3.0.0: + resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} + + iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + + ignore@5.3.1: + resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} + engines: {node: '>= 4'} + + import-fresh@3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + + import-meta-resolve@2.2.2: + resolution: {integrity: sha512-f8KcQ1D80V7RnqVm+/lirO9zkOxjGxhaTC1IPrBGd3MEfNgmNG67tSUO9gTi2F3Blr2Az6g1vocaxzkVnWl9MA==} + + import-meta-resolve@4.1.0: + resolution: {integrity: sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==} + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + ini@4.1.1: + resolution: {integrity: sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + ini@4.1.2: + resolution: {integrity: sha512-AMB1mvwR1pyBFY/nSevUX6y8nJWS63/SzUKD3JyQn97s4xgIdgQPT75IRouIiBAN4yLQBUShNYVW0+UG25daCw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + inline-style-parser@0.1.1: + resolution: {integrity: sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==} + + internal-slot@1.0.7: + resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==} + engines: {node: '>= 0.4'} + + internmap@1.0.1: + resolution: {integrity: sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==} + + internmap@2.0.3: + resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==} + engines: {node: '>=12'} + + intersection-observer@0.12.2: + resolution: {integrity: sha512-7m1vEcPCxXYI8HqnL8CKI6siDyD+eIWSwgB3DZA+ZTogxk9I4CDnj4wilt9x/+/QbHI4YG5YZNmC6458/e9Ktg==} + + is-alphabetical@1.0.4: + resolution: {integrity: sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==} + + is-alphabetical@2.0.1: + resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==} + + is-alphanumerical@1.0.4: + resolution: {integrity: sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==} + + is-alphanumerical@2.0.1: + resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==} + + is-arguments@1.1.1: + resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} + engines: {node: '>= 0.4'} + + is-array-buffer@3.0.4: + resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==} + engines: {node: '>= 0.4'} + + is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + + is-bigint@1.0.4: + resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} + + is-boolean-object@1.1.2: + resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} + engines: {node: '>= 0.4'} + + is-buffer@2.0.5: + resolution: {integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==} + engines: {node: '>=4'} + + is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + + is-date-object@1.0.5: + resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} + engines: {node: '>= 0.4'} + + is-decimal@1.0.4: + resolution: {integrity: sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==} + + is-decimal@2.0.1: + resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} + + is-empty@1.2.0: + resolution: {integrity: sha512-F2FnH/otLNJv0J6wc73A5Xo7oHLNnqplYqZhUu01tD54DIPvxIRSTSLkrUB/M0nHO4vo1O9PDfN4KoTxCzLh/w==} + + is-extendable@0.1.1: + resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} + engines: {node: '>=0.10.0'} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-hex-prefixed@1.0.0: + resolution: {integrity: sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA==} + engines: {node: '>=6.5.0', npm: '>=3'} + + is-hexadecimal@1.0.4: + resolution: {integrity: sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==} + + is-hexadecimal@2.0.1: + resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} + + is-map@2.0.3: + resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} + engines: {node: '>= 0.4'} + + is-number-object@1.0.7: + resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} + engines: {node: '>= 0.4'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-obj@2.0.0: + resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} + engines: {node: '>=8'} + + is-obj@3.0.0: + resolution: {integrity: sha512-IlsXEHOjtKhpN8r/tRFj2nDyTmHvcfNeu/nrRIcXE17ROeatXchkojffa1SpdqW4cr/Fj6QkEf/Gn4zf6KKvEQ==} + engines: {node: '>=12'} + + is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + + is-plain-obj@3.0.0: + resolution: {integrity: sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==} + engines: {node: '>=10'} + + is-plain-obj@4.1.0: + resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} + engines: {node: '>=12'} + + is-reference@3.0.2: + resolution: {integrity: sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==} + + is-regex@1.1.4: + resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} + engines: {node: '>= 0.4'} + + is-set@2.0.3: + resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} + engines: {node: '>= 0.4'} + + is-shared-array-buffer@1.0.3: + resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==} + engines: {node: '>= 0.4'} + + is-ssh@1.4.0: + resolution: {integrity: sha512-x7+VxdxOdlV3CYpjvRLBv5Lo9OJerlYanjwFrPR9fuGPjCiNiCzFgAWpiLAohSbsnH4ZAys3SBh+hq5rJosxUQ==} + + is-stream@1.1.0: + resolution: {integrity: sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==} + engines: {node: '>=0.10.0'} + + is-string@1.0.7: + resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} + engines: {node: '>= 0.4'} + + is-symbol@1.0.4: + resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} + engines: {node: '>= 0.4'} + + is-typedarray@1.0.0: + resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} + + is-weakmap@2.0.2: + resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} + engines: {node: '>= 0.4'} + + is-weakset@2.0.3: + resolution: {integrity: sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==} + engines: {node: '>= 0.4'} + + isarray@2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + isows@1.0.3: + resolution: {integrity: sha512-2cKei4vlmg2cxEjm3wVSqn8pcoRF/LX/wpifuuNquFO4SQmPwarClT+SUCA2lt+l581tTeZIPIZuIDo2jWN1fg==} + peerDependencies: + ws: '*' + + jackspeak@2.3.6: + resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} + engines: {node: '>=14'} + + js-sha3@0.8.0: + resolution: {integrity: sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==} + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-yaml@3.14.1: + resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} + hasBin: true + + js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + + json-parse-even-better-errors@3.0.1: + resolution: {integrity: sha512-aatBvbL26wVUCLmbWdCpeu9iF5wOyWpagiKkInA+kfws3sWdBrTnsvN2CKcyCYyUrc7rebNBlK6+kteg7ksecg==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + + json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + + jsonc-parser@3.2.1: + resolution: {integrity: sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==} + + katex@0.16.10: + resolution: {integrity: sha512-ZiqaC04tp2O5utMsl2TEZTXxa6WSC4yo0fv5ML++D3QZv/vx2Mct0mTlRx3O+uUkjfuAgOkzsCmq5MiUEsDDdA==} + hasBin: true + + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + + khroma@2.1.0: + resolution: {integrity: sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw==} + + kind-of@6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} + + kleur@4.1.5: + resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} + engines: {node: '>=6'} + + layout-base@1.0.2: + resolution: {integrity: sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==} + + levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + + lines-and-columns@2.0.4: + resolution: {integrity: sha512-wM1+Z03eypVAVUCE7QdSqpVIvelbOakn1M0bPDoA4SGWPx3sNDVUiMo3L6To6WWGClB7VyXnhQ4Sn7gxiJbE6A==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + load-plugin@5.1.0: + resolution: {integrity: sha512-Lg1CZa1CFj2CbNaxijTL6PCbzd4qGTlZov+iH2p5Xwy/ApcZJh+i6jMN2cYePouTfjJfrNu3nXFdEw8LvbjPFQ==} + + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + + locate-path@7.2.0: + resolution: {integrity: sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + lodash-es@4.17.21: + resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} + + lodash.clonedeep@4.5.0: + resolution: {integrity: sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==} + + lodash.get@4.4.2: + resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} + + lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + longest-streak@3.1.0: + resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} + + loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + + loupe@2.3.7: + resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} + + lower-case@2.0.2: + resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} + + lru-cache@10.2.2: + resolution: {integrity: sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==} + engines: {node: 14 || >=16.14} + + lru-cache@4.1.5: + resolution: {integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==} + + lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + + lz-string@1.5.0: + resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} + hasBin: true + + markdown-extensions@1.1.1: + resolution: {integrity: sha512-WWC0ZuMzCyDHYCasEGs4IPvLyTGftYwh6wIEOULOF0HXcqZlhwRzrK0w2VUlxWA98xnvb/jszw4ZSkJ6ADpM6Q==} + engines: {node: '>=0.10.0'} + + markdown-table@3.0.3: + resolution: {integrity: sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==} + + match-sorter@6.3.4: + resolution: {integrity: sha512-jfZW7cWS5y/1xswZo8VBOdudUiSd9nifYRWphc9M5D/ee4w4AoXLgBEdRbgVaxbMuagBPeUC5y2Hi8DO6o9aDg==} + + mdast-comment-marker@2.1.2: + resolution: {integrity: sha512-HED3ezseRVkBzZ0uK4q6RJMdufr/2p3VfVZstE3H1N9K8bwtspztWo6Xd7rEatuGNoCXaBna8oEqMwUn0Ve1bw==} + + mdast-util-definitions@5.1.2: + resolution: {integrity: sha512-8SVPMuHqlPME/z3gqVwWY4zVXn8lqKv/pAhC57FuJ40ImXyBpmO5ukh98zB2v7Blql2FiHjHv9LVztSIqjY+MA==} + + mdast-util-find-and-replace@2.2.2: + resolution: {integrity: sha512-MTtdFRz/eMDHXzeK6W3dO7mXUlF82Gom4y0oOgvHhh/HXZAGvIQDUvQ0SuUx+j2tv44b8xTHOm8K/9OoRFnXKw==} + + mdast-util-from-markdown@0.8.5: + resolution: {integrity: sha512-2hkTXtYYnr+NubD/g6KGBS/0mFmBcifAsI0yIWRiRo0PjVs6SSOSOdtzbp6kSGnShDN6G5aWZpKQ2lWRy27mWQ==} + + mdast-util-from-markdown@1.3.1: + resolution: {integrity: sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww==} + + mdast-util-from-markdown@2.0.0: + resolution: {integrity: sha512-n7MTOr/z+8NAX/wmhhDji8O3bRvPTV/U0oTCaZJkjhPSKTPhS3xufVhKGF8s1pJ7Ox4QgoIU7KHseh09S+9rTA==} + + mdast-util-frontmatter@2.0.1: + resolution: {integrity: sha512-LRqI9+wdgC25P0URIJY9vwocIzCcksduHQ9OF2joxQoyTNVduwLAFUzjoopuRJbJAReaKrNQKAZKL3uCMugWJA==} + + mdast-util-gfm-autolink-literal@1.0.3: + resolution: {integrity: sha512-My8KJ57FYEy2W2LyNom4n3E7hKTuQk/0SES0u16tjA9Z3oFkF4RrC/hPAPgjlSpezsOvI8ObcXcElo92wn5IGA==} + + mdast-util-gfm-footnote@1.0.2: + resolution: {integrity: sha512-56D19KOGbE00uKVj3sgIykpwKL179QsVFwx/DCW0u/0+URsryacI4MAdNJl0dh+u2PSsD9FtxPFbHCzJ78qJFQ==} + + mdast-util-gfm-strikethrough@1.0.3: + resolution: {integrity: sha512-DAPhYzTYrRcXdMjUtUjKvW9z/FNAMTdU0ORyMcbmkwYNbKocDpdk+PX1L1dQgOID/+vVs1uBQ7ElrBQfZ0cuiQ==} + + mdast-util-gfm-table@1.0.7: + resolution: {integrity: sha512-jjcpmNnQvrmN5Vx7y7lEc2iIOEytYv7rTvu+MeyAsSHTASGCCRA79Igg2uKssgOs1i1po8s3plW0sTu1wkkLGg==} + + mdast-util-gfm-task-list-item@1.0.2: + resolution: {integrity: sha512-PFTA1gzfp1B1UaiJVyhJZA1rm0+Tzn690frc/L8vNX1Jop4STZgOE6bxUhnzdVSB+vm2GU1tIsuQcA9bxTQpMQ==} + + mdast-util-gfm@2.0.2: + resolution: {integrity: sha512-qvZ608nBppZ4icQlhQQIAdc6S3Ffj9RGmzwUKUWuEICFnd1LVkN3EktF7ZHAgfcEdvZB5owU9tQgt99e2TlLjg==} + + mdast-util-heading-style@2.0.1: + resolution: {integrity: sha512-0L5rthU4xKDVbw+UQ7D8Y8xOEsX4JXZvemWoEAsL+WAaeSH+TvVVwFnTb3G/OrjyP4VYQULoNWU+PdZfkmNu4A==} + + mdast-util-math@2.0.2: + resolution: {integrity: sha512-8gmkKVp9v6+Tgjtq6SYx9kGPpTf6FVYRa53/DLh479aldR9AyP48qeVOgNZ5X7QUK7nOy4yw7vg6mbiGcs9jWQ==} + + mdast-util-mdx-expression@1.3.2: + resolution: {integrity: sha512-xIPmR5ReJDu/DHH1OoIT1HkuybIfRGYRywC+gJtI7qHjCJp/M9jrmBEJW22O8lskDWm562BX2W8TiAwRTb0rKA==} + + mdast-util-mdx-jsx@2.1.4: + resolution: {integrity: sha512-DtMn9CmVhVzZx3f+optVDF8yFgQVt7FghCRNdlIaS3X5Bnym3hZwPbg/XW86vdpKjlc1PVj26SpnLGeJBXD3JA==} + + mdast-util-mdx@2.0.1: + resolution: {integrity: sha512-38w5y+r8nyKlGvNjSEqWrhG0w5PmnRA+wnBvm+ulYCct7nsGYhFVb0lljS9bQav4psDAS1eGkP2LMVcZBi/aqw==} + + mdast-util-mdxjs-esm@1.3.1: + resolution: {integrity: sha512-SXqglS0HrEvSdUEfoXFtcg7DRl7S2cwOXc7jkuusG472Mmjag34DUDeOJUZtl+BVnyeO1frIgVpHlNRWc2gk/w==} + + mdast-util-phrasing@3.0.1: + resolution: {integrity: sha512-WmI1gTXUBJo4/ZmSk79Wcb2HcjPJBzM1nlI/OUWA8yk2X9ik3ffNbBGsU+09BFmXaL1IBb9fiuvq6/KMiNycSg==} + + mdast-util-phrasing@4.1.0: + resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==} + + mdast-util-to-hast@12.3.0: + resolution: {integrity: sha512-pits93r8PhnIoU4Vy9bjW39M2jJ6/tdHyja9rrot9uujkN7UTU9SDnE6WNJz/IGyQk3XHX6yNNtrBH6cQzm8Hw==} + + mdast-util-to-hast@13.1.0: + resolution: {integrity: sha512-/e2l/6+OdGp/FB+ctrJ9Avz71AN/GRH3oi/3KAx/kMnoUsD6q0woXlDT8lLEeViVKE7oZxE7RXzvO3T8kF2/sA==} + + mdast-util-to-markdown@1.5.0: + resolution: {integrity: sha512-bbv7TPv/WC49thZPg3jXuqzuvI45IL2EVAr/KxF0BSdHsU0ceFHOmwQn6evxAh1GaoK/6GQ1wp4R4oW2+LFL/A==} + + mdast-util-to-markdown@2.1.0: + resolution: {integrity: sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ==} + + mdast-util-to-string@2.0.0: + resolution: {integrity: sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==} + + mdast-util-to-string@3.2.0: + resolution: {integrity: sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg==} + + mdast-util-to-string@4.0.0: + resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + merkletreejs@0.3.11: + resolution: {integrity: sha512-LJKTl4iVNTndhL+3Uz/tfkjD0klIWsHlUzgtuNnNrsf7bAlXR30m+xYB7lHr5Z/l6e/yAIsr26Dabx6Buo4VGQ==} + engines: {node: '>= 7.6.0'} + + mermaid@10.9.0: + resolution: {integrity: sha512-swZju0hFox/B/qoLKK0rOxxgh8Cf7rJSfAUc1u8fezVihYMvrJAS45GzAxTVf4Q+xn9uMgitBcmWk7nWGXOs/g==} + + micro-ftch@0.3.1: + resolution: {integrity: sha512-/0LLxhzP0tfiR5hcQebtudP56gUurs2CLkGarnCiB/OqEyUFQ6U3paQi/tgLv0hBJYt2rnr9MNpxz4fiiugstg==} + + micromark-core-commonmark@1.1.0: + resolution: {integrity: sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw==} + + micromark-core-commonmark@2.0.1: + resolution: {integrity: sha512-CUQyKr1e///ZODyD1U3xit6zXwy1a8q2a1S1HKtIlmgvurrEpaw/Y9y6KSIbF8P59cn/NjzHyO+Q2fAyYLQrAA==} + + micromark-extension-frontmatter@2.0.0: + resolution: {integrity: sha512-C4AkuM3dA58cgZha7zVnuVxBhDsbttIMiytjgsM2XbHAB2faRVaHRle40558FBN+DJcrLNCoqG5mlrpdU4cRtg==} + + micromark-extension-gfm-autolink-literal@1.0.5: + resolution: {integrity: sha512-z3wJSLrDf8kRDOh2qBtoTRD53vJ+CWIyo7uyZuxf/JAbNJjiHsOpG1y5wxk8drtv3ETAHutCu6N3thkOOgueWg==} + + micromark-extension-gfm-footnote@1.1.2: + resolution: {integrity: sha512-Yxn7z7SxgyGWRNa4wzf8AhYYWNrwl5q1Z8ii+CSTTIqVkmGZF1CElX2JI8g5yGoM3GAman9/PVCUFUSJ0kB/8Q==} + + micromark-extension-gfm-strikethrough@1.0.7: + resolution: {integrity: sha512-sX0FawVE1o3abGk3vRjOH50L5TTLr3b5XMqnP9YDRb34M0v5OoZhG+OHFz1OffZ9dlwgpTBKaT4XW/AsUVnSDw==} + + micromark-extension-gfm-table@1.0.7: + resolution: {integrity: sha512-3ZORTHtcSnMQEKtAOsBQ9/oHp9096pI/UvdPtN7ehKvrmZZ2+bbWhi0ln+I9drmwXMt5boocn6OlwQzNXeVeqw==} + + micromark-extension-gfm-tagfilter@1.0.2: + resolution: {integrity: sha512-5XWB9GbAUSHTn8VPU8/1DBXMuKYT5uOgEjJb8gN3mW0PNW5OPHpSdojoqf+iq1xo7vWzw/P8bAHY0n6ijpXF7g==} + + micromark-extension-gfm-task-list-item@1.0.5: + resolution: {integrity: sha512-RMFXl2uQ0pNQy6Lun2YBYT9g9INXtWJULgbt01D/x8/6yJ2qpKyzdZD3pi6UIkzF++Da49xAelVKUeUMqd5eIQ==} + + micromark-extension-gfm@2.0.3: + resolution: {integrity: sha512-vb9OoHqrhCmbRidQv/2+Bc6pkP0FrtlhurxZofvOEy5o8RtuuvTq+RQ1Vw5ZDNrVraQZu3HixESqbG+0iKk/MQ==} + + micromark-extension-math@2.1.2: + resolution: {integrity: sha512-es0CcOV89VNS9wFmyn+wyFTKweXGW4CEvdaAca6SWRWPyYCbBisnjaHLjWO4Nszuiud84jCpkHsqAJoa768Pvg==} + + micromark-extension-mdx-expression@1.0.8: + resolution: {integrity: sha512-zZpeQtc5wfWKdzDsHRBY003H2Smg+PUi2REhqgIhdzAa5xonhP03FcXxqFSerFiNUr5AWmHpaNPQTBVOS4lrXw==} + + micromark-extension-mdx-jsx@1.0.5: + resolution: {integrity: sha512-gPH+9ZdmDflbu19Xkb8+gheqEDqkSpdCEubQyxuz/Hn8DOXiXvrXeikOoBA71+e8Pfi0/UYmU3wW3H58kr7akA==} + + micromark-extension-mdx-md@1.0.1: + resolution: {integrity: sha512-7MSuj2S7xjOQXAjjkbjBsHkMtb+mDGVW6uI2dBL9snOBCbZmoNgDAeZ0nSn9j3T42UE/g2xVNMn18PJxZvkBEA==} + + micromark-extension-mdxjs-esm@1.0.5: + resolution: {integrity: sha512-xNRBw4aoURcyz/S69B19WnZAkWJMxHMT5hE36GtDAyhoyn/8TuAeqjFJQlwk+MKQsUD7b3l7kFX+vlfVWgcX1w==} + + micromark-extension-mdxjs@1.0.1: + resolution: {integrity: sha512-7YA7hF6i5eKOfFUzZ+0z6avRG52GpWR8DL+kN47y3f2KhxbBZMhmxe7auOeaTBrW2DenbbZTf1ea9tA2hDpC2Q==} + + micromark-factory-destination@1.1.0: + resolution: {integrity: sha512-XaNDROBgx9SgSChd69pjiGKbV+nfHGDPVYFs5dOoDd7ZnMAE+Cuu91BCpsY8RT2NP9vo/B8pds2VQNCLiu0zhg==} + + micromark-factory-destination@2.0.0: + resolution: {integrity: sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==} + + micromark-factory-label@1.1.0: + resolution: {integrity: sha512-OLtyez4vZo/1NjxGhcpDSbHQ+m0IIGnT8BoPamh+7jVlzLJBH98zzuCoUeMxvM6WsNeh8wx8cKvqLiPHEACn0w==} + + micromark-factory-label@2.0.0: + resolution: {integrity: sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==} + + micromark-factory-mdx-expression@1.0.9: + resolution: {integrity: sha512-jGIWzSmNfdnkJq05c7b0+Wv0Kfz3NJ3N4cBjnbO4zjXIlxJr+f8lk+5ZmwFvqdAbUy2q6B5rCY//g0QAAaXDWA==} + + micromark-factory-space@1.1.0: + resolution: {integrity: sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==} + + micromark-factory-space@2.0.0: + resolution: {integrity: sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==} + + micromark-factory-title@1.1.0: + resolution: {integrity: sha512-J7n9R3vMmgjDOCY8NPw55jiyaQnH5kBdV2/UXCtZIpnHH3P6nHUKaH7XXEYuWwx/xUJcawa8plLBEjMPU24HzQ==} + + micromark-factory-title@2.0.0: + resolution: {integrity: sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A==} + + micromark-factory-whitespace@1.1.0: + resolution: {integrity: sha512-v2WlmiymVSp5oMg+1Q0N1Lxmt6pMhIHD457whWM7/GUlEks1hI9xj5w3zbc4uuMKXGisksZk8DzP2UyGbGqNsQ==} + + micromark-factory-whitespace@2.0.0: + resolution: {integrity: sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==} + + micromark-util-character@1.2.0: + resolution: {integrity: sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==} + + micromark-util-character@2.1.0: + resolution: {integrity: sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==} + + micromark-util-chunked@1.1.0: + resolution: {integrity: sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ==} + + micromark-util-chunked@2.0.0: + resolution: {integrity: sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==} + + micromark-util-classify-character@1.1.0: + resolution: {integrity: sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw==} + + micromark-util-classify-character@2.0.0: + resolution: {integrity: sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==} + + micromark-util-combine-extensions@1.1.0: + resolution: {integrity: sha512-Q20sp4mfNf9yEqDL50WwuWZHUrCO4fEyeDCnMGmG5Pr0Cz15Uo7KBs6jq+dq0EgX4DPwwrh9m0X+zPV1ypFvUA==} + + micromark-util-combine-extensions@2.0.0: + resolution: {integrity: sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ==} + + micromark-util-decode-numeric-character-reference@1.1.0: + resolution: {integrity: sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw==} + + micromark-util-decode-numeric-character-reference@2.0.1: + resolution: {integrity: sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ==} + + micromark-util-decode-string@1.1.0: + resolution: {integrity: sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ==} + + micromark-util-decode-string@2.0.0: + resolution: {integrity: sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA==} + + micromark-util-encode@1.1.0: + resolution: {integrity: sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw==} + + micromark-util-encode@2.0.0: + resolution: {integrity: sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==} + + micromark-util-events-to-acorn@1.2.3: + resolution: {integrity: sha512-ij4X7Wuc4fED6UoLWkmo0xJQhsktfNh1J0m8g4PbIMPlx+ek/4YdW5mvbye8z/aZvAPUoxgXHrwVlXAPKMRp1w==} + + micromark-util-html-tag-name@1.2.0: + resolution: {integrity: sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q==} + + micromark-util-html-tag-name@2.0.0: + resolution: {integrity: sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==} + + micromark-util-normalize-identifier@1.1.0: + resolution: {integrity: sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q==} + + micromark-util-normalize-identifier@2.0.0: + resolution: {integrity: sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==} + + micromark-util-resolve-all@1.1.0: + resolution: {integrity: sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA==} + + micromark-util-resolve-all@2.0.0: + resolution: {integrity: sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==} + + micromark-util-sanitize-uri@1.2.0: + resolution: {integrity: sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A==} + + micromark-util-sanitize-uri@2.0.0: + resolution: {integrity: sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==} + + micromark-util-subtokenize@1.1.0: + resolution: {integrity: sha512-kUQHyzRoxvZO2PuLzMt2P/dwVsTiivCK8icYTeR+3WgbuPqfHgPPy7nFKbeqRivBvn/3N3GBiNC+JRTMSxEC7A==} + + micromark-util-subtokenize@2.0.1: + resolution: {integrity: sha512-jZNtiFl/1aY73yS3UGQkutD0UbhTt68qnRpw2Pifmz5wV9h8gOVsN70v+Lq/f1rKaU/W8pxRe8y8Q9FX1AOe1Q==} + + micromark-util-symbol@1.1.0: + resolution: {integrity: sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==} + + micromark-util-symbol@2.0.0: + resolution: {integrity: sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==} + + micromark-util-types@1.1.0: + resolution: {integrity: sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==} + + micromark-util-types@2.0.0: + resolution: {integrity: sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==} + + micromark@2.11.4: + resolution: {integrity: sha512-+WoovN/ppKolQOFIAajxi7Lu9kInbPxFuTBVEavFcL8eAfVstoc5MocPmqBeAdBOJV00uaVjegzH4+MA0DN/uA==} + + micromark@3.2.0: + resolution: {integrity: sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA==} + + micromark@4.0.0: + resolution: {integrity: sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==} + + micromatch@4.0.5: + resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + engines: {node: '>=8.6'} + + min-indent@1.0.1: + resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} + engines: {node: '>=4'} + + minimalistic-assert@1.0.1: + resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} + + minimalistic-crypto-utils@1.0.1: + resolution: {integrity: sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==} + + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + minimatch@5.1.6: + resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} + engines: {node: '>=10'} + + minimatch@9.0.3: + resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} + engines: {node: '>=16 || 14 >=14.17'} + + minimatch@9.0.4: + resolution: {integrity: sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==} + engines: {node: '>=16 || 14 >=14.17'} + + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + minipass@7.0.4: + resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==} + engines: {node: '>=16 || 14 >=14.17'} + + mri@1.2.0: + resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} + engines: {node: '>=4'} + + ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + + nanoid@3.3.7: + resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + + next-mdx-remote@4.4.1: + resolution: {integrity: sha512-1BvyXaIou6xy3XoNF4yaMZUCb6vD2GTAa5ciOa6WoO+gAUTYsb1K4rI/HSC2ogAWLrb/7VSV52skz07vOzmqIQ==} + engines: {node: '>=14', npm: '>=7'} + peerDependencies: + react: '>=16.x <=18.x' + react-dom: '>=16.x <=18.x' + + next-seo@6.5.0: + resolution: {integrity: sha512-MfzUeWTN/x/rsKp/1n0213eojO97lIl0unxqbeCY+6pAucViHDA8GSLRRcXpgjsSmBxfCFdfpu7LXbt4ANQoNQ==} + peerDependencies: + next: ^8.1.1-canary.54 || >=9.0.0 + react: '>=16.0.0' + react-dom: '>=16.0.0' + + next-sitemap@4.2.3: + resolution: {integrity: sha512-vjdCxeDuWDzldhCnyFCQipw5bfpl4HmZA7uoo3GAaYGjGgfL4Cxb1CiztPuWGmS+auYs7/8OekRS8C2cjdAsjQ==} + engines: {node: '>=14.18'} + hasBin: true + peerDependencies: + next: '*' + + next-themes@0.2.1: + resolution: {integrity: sha512-B+AKNfYNIzh0vqQQKqQItTS8evEouKD7H5Hj3kmuPERwddR2TxvDSFZuTj6T7Jfn1oyeUyJMydPl1Bkxkh0W7A==} + peerDependencies: + next: '*' + react: '*' + react-dom: '*' + + next@14.2.10: + resolution: {integrity: sha512-sDDExXnh33cY3RkS9JuFEKaS4HmlWmDKP1VJioucCG6z5KuA008DPsDZOzi8UfqEk3Ii+2NCQSJrfbEWtZZfww==} + engines: {node: '>=18.17.0'} + hasBin: true + peerDependencies: + '@opentelemetry/api': ^1.1.0 + '@playwright/test': ^1.41.2 + react: ^18.2.0 + react-dom: ^18.2.0 + sass: ^1.3.0 + peerDependenciesMeta: + '@opentelemetry/api': + optional: true + '@playwright/test': + optional: true + sass: + optional: true + + nextra-theme-docs@2.13.2: + resolution: {integrity: sha512-yE4umXaImp1/kf/sFciPj2+EFrNSwd9Db26hi98sIIiujzGf3+9eUgAz45vF9CwBw50FSXxm1QGRcY+slQ4xQQ==} + peerDependencies: + next: '>=9.5.3' + nextra: 2.13.2 + react: '>=16.13.1' + react-dom: '>=16.13.1' + + nextra@2.13.2: + resolution: {integrity: sha512-pIgOSXNUqTz1laxV4ChFZOU7lzJAoDHHaBPj8L09PuxrLKqU1BU/iZtXAG6bQeKCx8EPdBsoXxEuENnL9QGnGA==} + engines: {node: '>=16'} + peerDependencies: + next: '>=9.5.3' + react: '>=16.13.1' + react-dom: '>=16.13.1' + + no-case@3.0.4: + resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} + + node-fetch@2.7.0: + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + + non-layered-tidy-tree-layout@2.0.2: + resolution: {integrity: sha512-gkXMxRzUH+PB0ax9dUN0yYF0S25BqeAYqhgMaLUFmpXLEk7Fcu8f4emJuOAY0V8kjDICxROIKsTAKsV/v355xw==} + + nopt@7.2.0: + resolution: {integrity: sha512-CVDtwCdhYIvnAzFoJ6NJ6dX3oga9/HyciQDnG1vQDjSLMeKLJ4A93ZqYKDrgYSr1FBY5/hMYC+2VCi24pgpkGA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + hasBin: true + + npm-normalize-package-bin@3.0.1: + resolution: {integrity: sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + npm-run-path@2.0.2: + resolution: {integrity: sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==} + engines: {node: '>=4'} + + npm-to-yarn@2.2.1: + resolution: {integrity: sha512-O/j/ROyX0KGLG7O6Ieut/seQ0oiTpHF2tXAcFbpdTLQFiaNtkyTXXocM1fwpaa60dg1qpWj0nHlbNhx6qwuENQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + number-to-bn@1.7.0: + resolution: {integrity: sha512-wsJ9gfSz1/s4ZsJN01lyonwuxA1tml6X1yBDnfpMglypcBRFZZkus26EdPSlqS5GJfYddVZa22p3VNb3z5m5Ig==} + engines: {node: '>=6.5.0', npm: '>=3'} + + object-inspect@1.13.1: + resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} + + object-is@1.1.6: + resolution: {integrity: sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==} + engines: {node: '>= 0.4'} + + object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + + object.assign@4.1.5: + resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} + engines: {node: '>= 0.4'} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + engines: {node: '>= 0.8.0'} + + p-finally@1.0.0: + resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==} + engines: {node: '>=4'} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-limit@4.0.0: + resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + + p-locate@6.0.0: + resolution: {integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + param-case@3.0.4: + resolution: {integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==} + + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + parent-module@2.0.0: + resolution: {integrity: sha512-uo0Z9JJeWzv8BG+tRcapBKNJ0dro9cLyczGzulS6EfeyAdeC9sbojtW6XwvYxJkEne9En+J2XEl4zyglVeIwFg==} + engines: {node: '>=8'} + + parse-entities@2.0.0: + resolution: {integrity: sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==} + + parse-entities@4.0.1: + resolution: {integrity: sha512-SWzvYcSJh4d/SGLIOQfZ/CoNv6BTlI6YEQ7Nj82oDVnRpwe/Z/F1EMx42x3JAOwGBlCjeCH0BRJQbQ/opHL17w==} + + parse-json@6.0.2: + resolution: {integrity: sha512-SA5aMiaIjXkAiBrW/yPgLgQAQg42f7K3ACO+2l/zOvtQBwX58DMUsFJXelW2fx3yMBmWOVkR6j1MGsdSbCA4UA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + parse-numeric-range@1.3.0: + resolution: {integrity: sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ==} + + parse-path@7.0.0: + resolution: {integrity: sha512-Euf9GG8WT9CdqwuWJGdf3RkUcTBArppHABkO7Lm8IzRQp0e2r/kkFnmhu4TSK30Wcu5rVAZLmfPKSBBi9tWFog==} + + parse-url@8.1.0: + resolution: {integrity: sha512-xDvOoLU5XRrcOZvnI6b8zA6n9O9ejNk/GExuz1yBuWUGn9KA97GI6HTs6u02wKara1CeVmZhH+0TZFdWScR89w==} + + parse5@7.1.2: + resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} + + pascal-case@3.1.2: + resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==} + + path-case@3.0.4: + resolution: {integrity: sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg==} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-exists@5.0.0: + resolution: {integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + path-key@2.0.1: + resolution: {integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==} + engines: {node: '>=4'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-scurry@1.10.2: + resolution: {integrity: sha512-7xTavNy5RQXnsjANvVvMkEjvloOinkAjv/Z6Ildz9v2RinZ4SBKTWFOVRbaF8p0vpHnyjV/UwNDdKuUv6M5qcA==} + engines: {node: '>=16 || 14 >=14.17'} + + path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + + pathval@1.1.1: + resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} + + periscopic@3.1.0: + resolution: {integrity: sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==} + + picocolors@1.0.0: + resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + pluralize@8.0.0: + resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} + engines: {node: '>=4'} + + possible-typed-array-names@1.0.0: + resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} + engines: {node: '>= 0.4'} + + postcss@8.4.31: + resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} + engines: {node: ^10 || ^12 || >=14} + + prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + + pretty-format@27.5.1: + resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + + proc-log@3.0.0: + resolution: {integrity: sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + property-information@6.5.0: + resolution: {integrity: sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==} + + protocols@2.0.1: + resolution: {integrity: sha512-/XJ368cyBJ7fzLMwLKv1e4vLxOju2MNAIokcr7meSaNcVbWz/CPcW22cP04mwxOErdA5mwjA8Q6w/cdAQxVn7Q==} + + pseudomap@1.0.2: + resolution: {integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + randombytes@2.1.0: + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + + react-dom@18.3.1: + resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==} + peerDependencies: + react: ^18.3.1 + + react-is@17.0.2: + resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} + + react@18.3.1: + resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} + engines: {node: '>=0.10.0'} + + read-package-json-fast@3.0.2: + resolution: {integrity: sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + + reading-time@1.5.0: + resolution: {integrity: sha512-onYyVhBNr4CmAxFsKS7bz+uTLRakypIe4R+5A824vBSkQy/hB3fZepoVEf8OVAxzLvK+H/jm9TzpI3ETSm64Kg==} + + regenerator-runtime@0.14.1: + resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} + + regexp.prototype.flags@1.5.2: + resolution: {integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==} + engines: {node: '>= 0.4'} + + rehype-katex@7.0.0: + resolution: {integrity: sha512-h8FPkGE00r2XKU+/acgqwWUlyzve1IiOKwsEkg4pDL3k48PiE0Pt+/uLtVHDVkN1yA4iurZN6UES8ivHVEQV6Q==} + + rehype-pretty-code@0.9.11: + resolution: {integrity: sha512-Eq90eCYXQJISktfRZ8PPtwc5SUyH6fJcxS8XOMnHPUQZBtC6RYo67gGlley9X2nR8vlniPj0/7oCDEYHKQa/oA==} + engines: {node: '>=16'} + peerDependencies: + shiki: '*' + + rehype-raw@7.0.0: + resolution: {integrity: sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==} + + remark-code-import@1.2.0: + resolution: {integrity: sha512-fgwLruqlZbVOIhCJFjY+JDwPZhA4/eK3InJzN8Ox8UDdtudpG212JwtRj6la+lAzJU7JmSEyewZSukVZdknt3Q==} + engines: {node: '>= 12'} + + remark-frontmatter@5.0.0: + resolution: {integrity: sha512-XTFYvNASMe5iPN0719nPrdItC9aU0ssC4v14mH1BCi1u0n1gAocqcujWUrByftZTbLhRtiKRyjYTSIOcr69UVQ==} + + remark-gfm@3.0.1: + resolution: {integrity: sha512-lEFDoi2PICJyNrACFOfDD3JlLkuSbOa5Wd8EPt06HUdptv8Gn0bxYTdbU/XXQ3swAPkEaGxxPN9cbnMHvVu1Ig==} + + remark-lint-blockquote-indentation@3.1.2: + resolution: {integrity: sha512-5DOrFsZd5dXqA4p/VZvWSrqIWNFbBXjX7IV/FkVkxlNhNF/0FMf/4v8x1I2W3mzaZ7yDsWS/egpZnmligq1ckQ==} + + remark-lint-checkbox-character-style@4.1.2: + resolution: {integrity: sha512-5ITz+1cCuJ3Jv/Q7rKgDEucCOnIgjWDnSHPJA1tb4TI/D316h+ALbDhZIpP8gyfAm6sBAh3Pwz9XZJN2uJB5UQ==} + + remark-lint-code-block-style@3.1.2: + resolution: {integrity: sha512-3wsWmzzdyEsB9sOzBOf46TSkwwVKXN2JpTEQb6feN0Tl6Vg75F7T9MHqMz7aqk/56bOXSxUzdpXDscGBhziLRA==} + + remark-lint-emphasis-marker@3.1.2: + resolution: {integrity: sha512-hPZ8vxZrIfxmLA5B66bA8y3PdHjcCQuaLsySIqi5PM2DkpN6a7zAP3v1znyRSaYJ1ANVWcu00/0bNzuUjflGCA==} + + remark-lint-fenced-code-marker@3.1.2: + resolution: {integrity: sha512-6XNqjOuhT+0c7Q/22aCsMz61ne9g8HRpYF79EXQPdbzYa+PcfPXMiQKStONY3PfC8OE2/3WXI2zcs8w9x+8+VQ==} + + remark-lint-final-newline@2.1.2: + resolution: {integrity: sha512-K0FdPGPyEB94PwNgopwVJFE8oRWi7IhY2ycXFVAMReI51el7EHB8F1gX14tB6p6zyGy6mUh69bCVU9mMTNeOUg==} + + remark-lint-frontmatter-schema@3.15.4: + resolution: {integrity: sha512-egChkbtCCG4hw1F2qoipzSxp6Ea9z4pxaVkWYa36DnCZ9fn3GhCNyOUjbFSIvdhVcWN+AqvHdqPbXC9Pp81Hmg==} + + remark-lint-hard-break-spaces@3.1.2: + resolution: {integrity: sha512-HaW0xsl3TI7VFAqGWWcZtPqyz0NWu19KKjSO7OGFTUJU4S9YiRnhIxmSFM0ZLSsVAynE+dhzVKa8U7dOpWDcOg==} + + remark-lint-heading-style@3.1.2: + resolution: {integrity: sha512-0RkcRPV/H2bPFgeInzBkK1cWUwtFTm83I+Db/Z5tDY02GzKOosHLvxtJyj/1391/opAH1LYbHtHWffir99IUgw==} + + remark-lint-link-title-style@3.1.2: + resolution: {integrity: sha512-if4MahYJVvQUWlrXDF8GSv4b9VtLSgMSDHeikQp1/hGYlihLl9uGw3nlL5Lf9DqTN0qaT6RPbXOjuuzHlk38sg==} + + remark-lint-list-item-bullet-indent@4.1.2: + resolution: {integrity: sha512-WgU5nooqIEm6f35opcbHKBzWrdFJA3XcyTfB3nv/v0KX43/h6qFGmmMJ5kEiaFExuQp3dZSdatWuY0YZ9YRbUg==} + + remark-lint-list-item-content-indent@3.1.2: + resolution: {integrity: sha512-TB0pmrWiRaQW80Y/PILFQTnHDghRxXNzMwyawlP+DBF9gNom3pEBmb4ZlGQlN0aa3r8VWeIKdv1ylHrfXE0vqA==} + + remark-lint-list-item-indent@3.1.2: + resolution: {integrity: sha512-tkrra1pxZVE4OVJGfN435u/v0ljruXU+dHzWiKDYeifquD4aWhJxvSApu7+FbE098D/4usVXgMxwFkNhrpZcSQ==} + + remark-lint-no-blockquote-without-marker@5.1.2: + resolution: {integrity: sha512-QPbqsrt7EfpSWqTkZJ9tepabPIhBDlNqZkuxxMQYD0OQ2N+tHDUq3zE1JxI5ts1V9o/mWApgySocqGd3jlcKmQ==} + + remark-lint-no-duplicate-definitions@3.1.2: + resolution: {integrity: sha512-vi0nXA7p+pjQOorZOkr9E+QDhG74JAdbzqglWPrWWNI3z2rUYWYHTNSyWJbwEXaIIcev1ZAw8SCAOis5MNm+pA==} + + remark-lint-no-heading-content-indent@4.1.2: + resolution: {integrity: sha512-TTxFsm1f4ZHFxZQCuz7j0QK4RvP6oArTiwazKLr16yaZe1608ypogMek4A30j2xX8WuO9+2uBzLXCY5OBo5x5Q==} + + remark-lint-no-inline-padding@4.1.2: + resolution: {integrity: sha512-dGyhWsiqCZS3Slob0EVBUfsFBbdpMIBCvb56LlCgaHbnLsnNYx8PpF/wA5CgsN8BXIbXfRpyPB5cIJwIq5taYg==} + + remark-lint-no-literal-urls@3.1.2: + resolution: {integrity: sha512-4tV9JGLKxAMFSuWDMOqLozkFJ3HyRvhzgrPrxASoziaml23m7UXAozk5dkIrFny1cN2oG988Z8tORxX2FL1Ilw==} + + remark-lint-no-shortcut-reference-image@3.1.2: + resolution: {integrity: sha512-NX4XJFPyDeJJ77pmETxRj4oM/zayf7Lmn/O87HgExBkQIPz2NYbDeKD8QEyliLaV/oKA2rQufpzuFw55xa1Tww==} + + remark-lint-no-shortcut-reference-link@3.1.2: + resolution: {integrity: sha512-/9iPN7FLKaaIzw4tLWKu7Rx0wAP7E2EuzIeentQlkY0rO/mMHipmT3IlgiebsAInKagzTY6TNFoG1rq2VnaCcA==} + + remark-lint-no-undefined-references@4.2.1: + resolution: {integrity: sha512-HdNg5b2KiuNplcuVvRtsrUiROw557kAG1CiZYB7jQrrVWFgd86lKTa3bDiywe+87dGrGmHd3qQ28eZYTuHz2Nw==} + + remark-lint-no-unused-definitions@3.1.2: + resolution: {integrity: sha512-bOcaJAnjKxT3kASFquUA3fO9xem9wZhVqt8TbqjA84+G4n40qjaLXDs/4vq73aMsSde73K0f3j1u0pMe7et8yQ==} + + remark-lint-ordered-list-marker-style@3.1.2: + resolution: {integrity: sha512-62iVE/YQsA0Azaqt8yAJWPplWLS47kDLjXeC2PlRIAzCqbNt9qH3HId8vZ15QTSrp8rHmJwrCMdcqV6AZUi7gQ==} + + remark-lint-rule-style@3.1.2: + resolution: {integrity: sha512-0CsX2XcX9pIhAP5N7Y8mhYXp3/Ld+NvxXY1p0LHAq0NZu17UsZLuegvx/s25uFbQs08DcmSqyKnepU9qGGqmTQ==} + + remark-lint-strong-marker@3.1.2: + resolution: {integrity: sha512-U/g4wngmiI0Q6WBRQG6pZxnDS33Wt/0QYA3+KNFBDykoi1vXsDEorIqy3dEag9z6XHwcMvFDsff6VRUhaOJWQg==} + + remark-lint-table-cell-padding@4.1.3: + resolution: {integrity: sha512-N9xtnS6MG/H3srAMjqqaF26A7socr87pIgt64dr5rxoSbDRWRPChGQ8y7wKyV8VeyRNF37e3E5KB3bQVqjSYaQ==} + + remark-lint-table-pipe-alignment@3.1.3: + resolution: {integrity: sha512-bnE8WrB4kSrN+Yr+xN2GHWVgGukeSFU43qPMrpCzTyOSbzep366wORlFKqZmyFPEkIZ/uAUFS0Qm9DND66Yz/A==} + + remark-lint-table-pipes@4.1.2: + resolution: {integrity: sha512-Ex2cJDXA0hdD9CC5Nu0p3K5LP+AhzPvk4sIOSbevCTSRyCS/SkNk4CQ6pwWBxuPVuHQUkqXkT8lgu8wwr/9A3A==} + + remark-lint-unordered-list-marker-style@3.1.2: + resolution: {integrity: sha512-JFiyB4ZprJGGndCaFB8FssXd48m4Kh+CUqzNgu3lBLEiW8dEAGRlD9M2AzyyA+Q29WJP/FntDCbP22DeON91UA==} + + remark-lint@9.1.2: + resolution: {integrity: sha512-m9e/aPlh7tsvfJfj8tPxrQzD6oEdb9Foko+Ya/6OwUP9EoGMfehv1Qtv26W1DoH58Wn8rT8CD+KuprTWscMmIA==} + + remark-math@5.1.1: + resolution: {integrity: sha512-cE5T2R/xLVtfFI4cCePtiRn+e6jKMtFDR3P8V3qpv8wpKjwvHoBA4eJzvX+nVrnlNy0911bdGmuspCSwetfYHw==} + + remark-mdx@2.3.0: + resolution: {integrity: sha512-g53hMkpM0I98MU266IzDFMrTD980gNF3BJnkyFcmN+dD873mQeD5rdMO3Y2X+x8umQfbSE0PcoEDl7ledSA+2g==} + + remark-message-control@7.1.1: + resolution: {integrity: sha512-xKRWl1NTBOKed0oEtCd8BUfH5m4s8WXxFFSoo7uUwx6GW/qdCy4zov5LfPyw7emantDmhfWn5PdIZgcbVcWMDQ==} + + remark-parse@10.0.2: + resolution: {integrity: sha512-3ydxgHa/ZQzG8LvC7jTXccARYDcRld3VfcgIIFs7bI6vbRSxJJmzgLEIIoYKyrfhaY+ujuWaf/PJiMZXoiCXgw==} + + remark-parse@11.0.0: + resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==} + + remark-preset-lint-consistent@5.1.2: + resolution: {integrity: sha512-RQrWBFmyIkKfXtp9P1Fui7UbGSfXth9nuvRJUVnO0vfevBJe02iyMZWPokXSwkDOI/cM539wj0i3vrQupz+v5A==} + + remark-preset-lint-recommended@6.1.3: + resolution: {integrity: sha512-DGjbeP2TsFmQeJflUiIvJWAOs1PxJt7SG3WQyMxOppkRr/up+mxWVkuv+6AUuaR0EsuaaFGz7WmZM5TrSSFWJw==} + + remark-reading-time@2.0.1: + resolution: {integrity: sha512-fy4BKy9SRhtYbEHvp6AItbRTnrhiDGbqLQTSYVbQPGuRCncU1ubSsh9p/W5QZSxtYcUXv8KGL0xBgPLyNJA1xw==} + + remark-rehype@10.1.0: + resolution: {integrity: sha512-EFmR5zppdBp0WQeDVZ/b66CWJipB2q2VLNFMabzDSGR66Z2fQii83G5gTBbgGEnEEA0QRussvrFHxk1HWGJskw==} + + remark-stringify@10.0.3: + resolution: {integrity: sha512-koyOzCMYoUHudypbj4XpnAKFbkddRMYZHwghnxd7ue5210WzGw6kOBwauJTRUMq16jsovXx8dYNvSSWP89kZ3A==} + + remark-stringify@11.0.0: + resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==} + + remark@15.0.1: + resolution: {integrity: sha512-Eht5w30ruCXgFmxVUSlNWQ9iiimq07URKeFS3hNc8cUWy1llX4KDWfyEDZRycMc+znsN9Ux5/tJ/BFdgdOwA3A==} + + remove-accents@0.5.0: + resolution: {integrity: sha512-8g3/Otx1eJaVD12e31UbJj1YzdtVvzH85HV7t+9MJYk/u3XmkOUJ5Ys9wQrf9PCPK8+xn4ymzqYCiZl6QWKn+A==} + + repeat-string@1.6.1: + resolution: {integrity: sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==} + engines: {node: '>=0.10'} + + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + + reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + deprecated: Rimraf versions prior to v4 are no longer supported + hasBin: true + + rlp@2.2.7: + resolution: {integrity: sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ==} + hasBin: true + + robust-predicates@3.0.2: + resolution: {integrity: sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==} + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + rw@1.3.3: + resolution: {integrity: sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==} + + sade@1.8.1: + resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} + engines: {node: '>=6'} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + scheduler@0.23.2: + resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} + + scroll-into-view-if-needed@3.1.0: + resolution: {integrity: sha512-49oNpRjWRvnU8NyGVmUaYG4jtTkNonFZI86MmGRDqBphEK2EXT9gdEUoQPZhuBM8yWHxCWbobltqYO5M4XrUvQ==} + + scrypt-js@3.0.1: + resolution: {integrity: sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==} + + search-insights@2.17.2: + resolution: {integrity: sha512-zFNpOpUO+tY2D85KrxJ+aqwnIfdEGi06UH2+xEb+Bp9Mwznmauqc9djbnBibJO5mpfUPPa8st6Sx65+vbeO45g==} + + section-matter@1.0.0: + resolution: {integrity: sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==} + engines: {node: '>=4'} + + semver@7.6.0: + resolution: {integrity: sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==} + engines: {node: '>=10'} + hasBin: true + + sentence-case@3.0.4: + resolution: {integrity: sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg==} + + set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} + + set-function-name@2.0.2: + resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} + engines: {node: '>= 0.4'} + + shebang-command@1.2.0: + resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} + engines: {node: '>=0.10.0'} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@1.0.0: + resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==} + engines: {node: '>=0.10.0'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + shiki@0.14.7: + resolution: {integrity: sha512-dNPAPrxSc87ua2sKJ3H5dQ/6ZaY8RNnaAqK+t0eG7p0Soi2ydiqbGOTaZCqaYvA/uZYfS1LJnemt3Q+mSfcPCg==} + + side-channel@1.0.6: + resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} + engines: {node: '>= 0.4'} + + signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + + snake-case@3.0.4: + resolution: {integrity: sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==} + + sort-keys@5.0.0: + resolution: {integrity: sha512-Pdz01AvCAottHTPQGzndktFNdbRA75BgOfeT1hH+AMnJFv8lynkPi42rfeEhpx1saTEI3YNMWxfqu0sFD1G8pw==} + engines: {node: '>=12'} + + source-map-js@1.2.0: + resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} + engines: {node: '>=0.10.0'} + + source-map@0.7.4: + resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} + engines: {node: '>= 8'} + + space-separated-tokens@2.0.2: + resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} + + sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + + stop-iteration-iterator@1.0.0: + resolution: {integrity: sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==} + engines: {node: '>= 0.4'} + + streamsearch@1.1.0: + resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} + engines: {node: '>=10.0.0'} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + + stringify-entities@4.0.4: + resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + + strip-bom-string@1.0.0: + resolution: {integrity: sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==} + engines: {node: '>=0.10.0'} + + strip-eof@1.0.0: + resolution: {integrity: sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==} + engines: {node: '>=0.10.0'} + + strip-hex-prefix@1.0.0: + resolution: {integrity: sha512-q8d4ue7JGEiVcypji1bALTos+0pWtyGlivAWyPuTkHzuTCJqrK9sWxYQZUq6Nq3cuyv3bm734IhHvHtGGURU6A==} + engines: {node: '>=6.5.0', npm: '>=3'} + + strip-indent@4.0.0: + resolution: {integrity: sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA==} + engines: {node: '>=12'} + + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + style-to-object@0.4.4: + resolution: {integrity: sha512-HYNoHZa2GorYNyqiCaBgsxvcJIn7OHq6inEga+E6Ke3m5JkoqpQbnFssk4jwe+K7AhGa2fcha4wSOf1Kn01dMg==} + + styled-jsx@5.1.1: + resolution: {integrity: sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==} + engines: {node: '>= 12.0.0'} + peerDependencies: + '@babel/core': '*' + babel-plugin-macros: '*' + react: '>= 16.8.0 || 17.x.x || ^18.0.0-0' + peerDependenciesMeta: + '@babel/core': + optional: true + babel-plugin-macros: + optional: true + + stylis@4.3.2: + resolution: {integrity: sha512-bhtUjWd/z6ltJiQwg0dUfxEJ+W+jdqQd8TbWLWyeIJHlnsqmGLRFFd8e5mA0AZi/zx90smXRlN66YMTcaSFifg==} + + supports-color@4.5.0: + resolution: {integrity: sha512-ycQR/UbvI9xIlEdQT1TQqwoXtEldExbCEAJgRo5YXlmSKjv6ThHnP9/vwGa1gr19Gfw+LkFd7KqYMhzrRC5JYw==} + engines: {node: '>=4'} + + supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + supports-color@9.4.0: + resolution: {integrity: sha512-VL+lNrEoIXww1coLPOmiEmK/0sGigko5COxI09KzHc2VJXJsQ37UaQ+8quuxjDeA7+KnLGTWRyOXSLLR2Wb4jw==} + engines: {node: '>=12'} + + synckit@0.9.0: + resolution: {integrity: sha512-7RnqIMq572L8PeEzKeBINYEJDDxpcH8JEgLwUqBd3TkofhFRbkq4QLR0u+36avGAhCRbk2nnmjcW9SE531hPDg==} + engines: {node: ^14.18.0 || >=16.0.0} + + tabbable@6.2.0: + resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==} + + text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + + tinyurl@1.1.7: + resolution: {integrity: sha512-NCnyDkBTByS/pLH/Vrx/DPL8EciAUDoAvruaM/WnQLfX6Uame3D1nuWNy2Z9CXw7rcsok0tjuonRLolhmyz5rg==} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. + + title@3.5.3: + resolution: {integrity: sha512-20JyowYglSEeCvZv3EZ0nZ046vLarO37prvV0mbtQV7C8DJPGgN967r8SJkqd3XK3K3lD3/Iyfp3avjfil8Q2Q==} + hasBin: true + + titleize@1.0.0: + resolution: {integrity: sha512-TARUb7z1pGvlLxgPk++7wJ6aycXF3GJ0sNSBTAsTuJrQG5QuZlkUQP+zl+nbjAh4gMX9yDw9ZYklMd7vAfJKEw==} + engines: {node: '>=0.10.0'} + + to-gatsby-remark-plugin@0.1.0: + resolution: {integrity: sha512-blmhJ/gIrytWnWLgPSRCkhCPeki6UBK2daa3k9mGahN7GjwHu8KrS7F70MvwlsG7IE794JLgwAdCbi4hU4faFQ==} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + to-vfile@6.1.0: + resolution: {integrity: sha512-BxX8EkCxOAZe+D/ToHdDsJcVI4HqQfmw0tCkp31zf3dNP/XWIAjU4CmeuSwsSoOzOTqHPOL0KUzyZqJplkD0Qw==} + + to-vfile@7.2.4: + resolution: {integrity: sha512-2eQ+rJ2qGbyw3senPI0qjuM7aut8IYXK6AEoOWb+fJx/mQYzviTckm1wDjq91QYHAPBTYzmdJXxMFA6Mk14mdw==} + + tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + + treeify@1.1.0: + resolution: {integrity: sha512-1m4RA7xVAJrSGrrXGs0L3YTwyvBs2S8PbRHaLZAkFw7JR8oIFwYtysxlBZhYIa7xSyiYJKZ3iGrrk55cGA3i9A==} + engines: {node: '>=0.6'} + + trim-lines@3.0.1: + resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} + + trough@2.2.0: + resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} + + ts-dedent@2.2.0: + resolution: {integrity: sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==} + engines: {node: '>=6.10'} + + tslib@2.6.2: + resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} + + type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + + type-detect@4.0.8: + resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} + engines: {node: '>=4'} + + type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} -packages: + type-fest@1.4.0: + resolution: {integrity: sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==} + engines: {node: '>=10'} - /@adraffy/ens-normalize@1.10.0: - resolution: {integrity: sha512-nA9XHtlAkYfJxY7bce8DcN7eKxWWCWkU+1GR9d+U6MbNpfwQp8TI7vqOsBsMcHoT4mBu2kypKoSKnghEzOOq5Q==} - dev: false + typedarray-to-buffer@3.1.5: + resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} - /@algolia/cache-browser-local-storage@4.23.3: - resolution: {integrity: sha512-vRHXYCpPlTDE7i6UOy2xE03zHF2C8MEFjPN2v7fRbqVpcOvAUQK81x3Kc21xyb5aSIpYCjWCZbYZuz8Glyzyyg==} + typedarray@0.0.6: + resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} + + typescript@5.4.5: + resolution: {integrity: sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==} + engines: {node: '>=14.17'} + hasBin: true + + unified-engine@10.1.0: + resolution: {integrity: sha512-5+JDIs4hqKfHnJcVCxTid1yBoI/++FfF/1PFdSMpaftZZZY+qg2JFruRbf7PaIwa9KgLotXQV3gSjtY0IdcFGQ==} + + unified-lint-rule@2.1.2: + resolution: {integrity: sha512-JWudPtRN7TLFHVLEVZ+Rm8FUb6kCAtHxEXFgBGDxRSdNMnGyTU5zyYvduHSF/liExlFB3vdFvsAHnNVE/UjAwA==} + + unified-message-control@4.0.0: + resolution: {integrity: sha512-1b92N+VkPHftOsvXNOtkJm4wHlr+UDmTBF2dUzepn40oy9NxanJ9xS1RwUBTjXJwqr2K0kMbEyv1Krdsho7+Iw==} + + unified@10.1.2: + resolution: {integrity: sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==} + + unified@11.0.4: + resolution: {integrity: sha512-apMPnyLjAX+ty4OrNap7yumyVAMlKx5IWU2wlzzUdYJO9A8f1p9m/gywF/GM2ZDFcjQPrx59Mc90KwmxsoklxQ==} + + unique-string@3.0.0: + resolution: {integrity: sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==} + engines: {node: '>=12'} + + unist-util-find-after@5.0.0: + resolution: {integrity: sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==} + + unist-util-generated@2.0.1: + resolution: {integrity: sha512-qF72kLmPxAw0oN2fwpWIqbXAVyEqUzDHMsbtPvOudIlUzXYFIeQIuxXQCRCFh22B7cixvU0MG7m3MW8FTq/S+A==} + + unist-util-inspect@7.0.2: + resolution: {integrity: sha512-Op0XnmHUl6C2zo/yJCwhXQSm/SmW22eDZdWP2qdf4WpGrgO1ZxFodq+5zFyeRGasFjJotAnLgfuD1jkcKqiH1Q==} + + unist-util-is@5.2.1: + resolution: {integrity: sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==} + + unist-util-is@6.0.0: + resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} + + unist-util-position-from-estree@1.1.2: + resolution: {integrity: sha512-poZa0eXpS+/XpoQwGwl79UUdea4ol2ZuCYguVaJS4qzIOMDzbqz8a3erUCOmubSZkaOuGamb3tX790iwOIROww==} + + unist-util-position@4.0.4: + resolution: {integrity: sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg==} + + unist-util-position@5.0.0: + resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} + + unist-util-remove-position@4.0.2: + resolution: {integrity: sha512-TkBb0HABNmxzAcfLf4qsIbFbaPDvMO6wa3b3j4VcEzFVaw1LBKwnW4/sRJ/atSLSzoIg41JWEdnE7N6DIhGDGQ==} + + unist-util-remove-position@5.0.0: + resolution: {integrity: sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==} + + unist-util-remove@4.0.0: + resolution: {integrity: sha512-b4gokeGId57UVRX/eVKej5gXqGlc9+trkORhFJpu9raqZkZhU0zm8Doi05+HaiBsMEIJowL+2WtQ5ItjsngPXg==} + + unist-util-stringify-position@2.0.3: + resolution: {integrity: sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==} + + unist-util-stringify-position@3.0.3: + resolution: {integrity: sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==} + + unist-util-stringify-position@4.0.0: + resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} + + unist-util-visit-parents@4.1.1: + resolution: {integrity: sha512-1xAFJXAKpnnJl8G7K5KgU7FY55y3GcLIXqkzUj5QF/QVP7biUm0K0O2oqVkYsdjzJKifYeWn9+o6piAK2hGSHw==} + + unist-util-visit-parents@5.1.3: + resolution: {integrity: sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==} + + unist-util-visit-parents@6.0.1: + resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==} + + unist-util-visit@3.1.0: + resolution: {integrity: sha512-Szoh+R/Ll68QWAyQyZZpQzZQm2UPbxibDvaY8Xc9SUtYgPsDzx5AWSk++UUt2hJuow8mvwR+rG+LQLw+KsuAKA==} + + unist-util-visit@4.1.2: + resolution: {integrity: sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==} + + unist-util-visit@5.0.0: + resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} + + upper-case-first@2.0.2: + resolution: {integrity: sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==} + + upper-case@2.0.2: + resolution: {integrity: sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg==} + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + utf8@3.0.0: + resolution: {integrity: sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ==} + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + uuid@9.0.1: + resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} + hasBin: true + + uvu@0.5.6: + resolution: {integrity: sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA==} + engines: {node: '>=8'} + hasBin: true + + vfile-location@4.1.0: + resolution: {integrity: sha512-YF23YMyASIIJXpktBa4vIGLJ5Gs88UB/XePgqPmTa7cDA+JeO3yclbpheQYCHjVHBn/yePzrXuygIL+xbvRYHw==} + + vfile-location@5.0.2: + resolution: {integrity: sha512-NXPYyxyBSH7zB5U6+3uDdd6Nybz6o6/od9rk8bp9H8GR3L+cm/fC0uUTbqBmUTnMCUDslAGBOIKNfvvb+gGlDg==} + + vfile-matter@3.0.1: + resolution: {integrity: sha512-CAAIDwnh6ZdtrqAuxdElUqQRQDQgbbIrYtDYI8gCjXS1qQ+1XdLoK8FIZWxJwn0/I+BkSSZpar3SOgjemQz4fg==} + + vfile-message@2.0.4: + resolution: {integrity: sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==} + + vfile-message@3.1.4: + resolution: {integrity: sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==} + + vfile-message@4.0.2: + resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==} + + vfile-reporter@7.0.5: + resolution: {integrity: sha512-NdWWXkv6gcd7AZMvDomlQbK3MqFWL1RlGzMn++/O2TI+68+nqxCPTvLugdOtfSzXmjh+xUyhp07HhlrbJjT+mw==} + + vfile-sort@3.0.1: + resolution: {integrity: sha512-1os1733XY6y0D5x0ugqSeaVJm9lYgj0j5qdcZQFyxlZOSy1jYarL77lLyb5gK4Wqr1d5OxmuyflSO3zKyFnTFw==} + + vfile-statistics@2.0.1: + resolution: {integrity: sha512-W6dkECZmP32EG/l+dp2jCLdYzmnDBIw6jwiLZSER81oR5AHRcVqL+k3Z+pfH1R73le6ayDkJRMk0sutj1bMVeg==} + + vfile@4.2.1: + resolution: {integrity: sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==} + + vfile@5.3.7: + resolution: {integrity: sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==} + + vfile@6.0.1: + resolution: {integrity: sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw==} + + viem@2.9.28: + resolution: {integrity: sha512-/1iTg8yQlCNJ+7wSmdsBNB/vhjWqFJtTH6XZXHjGXrZnlBxAtHR5ZAr5TvTJc/2nhVIVE4BkCe5JCrIiSuZodg==} + peerDependencies: + typescript: '>=5.0.4' + peerDependenciesMeta: + typescript: + optional: true + + vscode-languageserver-textdocument@1.0.11: + resolution: {integrity: sha512-X+8T3GoiwTVlJbicx/sIAF+yuJAqz8VvwJyoMVhwEMoEKE/fkDmrqUgDMyBECcM2A2frVZIUj5HI/ErRXCfOeA==} + + vscode-oniguruma@1.7.0: + resolution: {integrity: sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==} + + vscode-textmate@8.0.0: + resolution: {integrity: sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg==} + + vscode-uri@3.0.8: + resolution: {integrity: sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==} + + walk-up-path@3.0.1: + resolution: {integrity: sha512-9YlCL/ynK3CTlrSRrDxZvUauLzAswPCrsaCgilqFevUYpeEW0/3ScEjaa3kbW/T0ghhkEr7mv+fpjqn1Y1YuTA==} + + web-namespaces@2.0.1: + resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} + + web-worker@1.3.0: + resolution: {integrity: sha512-BSR9wyRsy/KOValMgd5kMyr3JzpdeoR9KVId8u5GVlTTAtNChlsE4yTxeY7zMdNSyOmoKBv8NH2qeRY9Tg+IaA==} + + web3-utils@1.10.4: + resolution: {integrity: sha512-tsu8FiKJLk2PzhDl9fXbGUWTkkVXYhtTA+SmEFkKft+9BgwLxfCRpU96sWv7ICC8zixBNd3JURVoiR3dUXgP8A==} + engines: {node: '>=8.0.0'} + + webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + + whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + + which-boxed-primitive@1.0.2: + resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} + + which-collection@1.0.2: + resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} + engines: {node: '>= 0.4'} + + which-typed-array@1.1.15: + resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==} + engines: {node: '>= 0.4'} + + which@1.3.1: + resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} + hasBin: true + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + write-file-atomic@3.0.3: + resolution: {integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==} + + ws@7.4.6: + resolution: {integrity: sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==} + engines: {node: '>=8.3.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + ws@8.13.0: + resolution: {integrity: sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + xdg-basedir@5.1.0: + resolution: {integrity: sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ==} + engines: {node: '>=12'} + + yallist@2.1.2: + resolution: {integrity: sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==} + + yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + + yaml@2.3.3: + resolution: {integrity: sha512-zw0VAJxgeZ6+++/su5AFoqBbZbrEakwu+X0M5HmcwUiBL7AzcuPKjj5we4xfQLp78LkEMpD0cOnUhmgOVy3KdQ==} + engines: {node: '>= 14'} + + yaml@2.4.2: + resolution: {integrity: sha512-B3VqDZ+JAg1nZpaEmWtTXUlBneoGx6CPM9b0TENK6aoSu5t73dItudwdgmi6tHlIZZId4dZ9skcAQ2UbcyAeVA==} + engines: {node: '>= 14'} + hasBin: true + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + + yocto-queue@1.0.0: + resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} + engines: {node: '>=12.20'} + + zod@3.23.8: + resolution: {integrity: sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==} + + zwitch@2.0.4: + resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} + +snapshots: + + '@adraffy/ens-normalize@1.10.0': {} + + '@algolia/cache-browser-local-storage@4.23.3': dependencies: '@algolia/cache-common': 4.23.3 - dev: false - /@algolia/cache-common@4.23.3: - resolution: {integrity: sha512-h9XcNI6lxYStaw32pHpB1TMm0RuxphF+Ik4o7tcQiodEdpKK+wKufY6QXtba7t3k8eseirEMVB83uFFF3Nu54A==} - dev: false + '@algolia/cache-common@4.23.3': {} - /@algolia/cache-in-memory@4.23.3: - resolution: {integrity: sha512-yvpbuUXg/+0rbcagxNT7un0eo3czx2Uf0y4eiR4z4SD7SiptwYTpbuS0IHxcLHG3lq22ukx1T6Kjtk/rT+mqNg==} + '@algolia/cache-in-memory@4.23.3': dependencies: '@algolia/cache-common': 4.23.3 - dev: false - /@algolia/client-account@4.23.3: - resolution: {integrity: sha512-hpa6S5d7iQmretHHF40QGq6hz0anWEHGlULcTIT9tbUssWUriN9AUXIFQ8Ei4w9azD0hc1rUok9/DeQQobhQMA==} + '@algolia/client-account@4.23.3': dependencies: '@algolia/client-common': 4.23.3 '@algolia/client-search': 4.23.3 '@algolia/transporter': 4.23.3 - dev: false - /@algolia/client-analytics@4.23.3: - resolution: {integrity: sha512-LBsEARGS9cj8VkTAVEZphjxTjMVCci+zIIiRhpFun9jGDUlS1XmhCW7CTrnaWeIuCQS/2iPyRqSy1nXPjcBLRA==} + '@algolia/client-analytics@4.23.3': dependencies: '@algolia/client-common': 4.23.3 '@algolia/client-search': 4.23.3 '@algolia/requester-common': 4.23.3 '@algolia/transporter': 4.23.3 - dev: false - /@algolia/client-common@4.23.3: - resolution: {integrity: sha512-l6EiPxdAlg8CYhroqS5ybfIczsGUIAC47slLPOMDeKSVXYG1n0qGiz4RjAHLw2aD0xzh2EXZ7aRguPfz7UKDKw==} + '@algolia/client-common@4.23.3': dependencies: '@algolia/requester-common': 4.23.3 '@algolia/transporter': 4.23.3 - dev: false - /@algolia/client-personalization@4.23.3: - resolution: {integrity: sha512-3E3yF3Ocr1tB/xOZiuC3doHQBQ2zu2MPTYZ0d4lpfWads2WTKG7ZzmGnsHmm63RflvDeLK/UVx7j2b3QuwKQ2g==} + '@algolia/client-personalization@4.23.3': dependencies: '@algolia/client-common': 4.23.3 '@algolia/requester-common': 4.23.3 '@algolia/transporter': 4.23.3 - dev: false - /@algolia/client-search@4.23.3: - resolution: {integrity: sha512-P4VAKFHqU0wx9O+q29Q8YVuaowaZ5EM77rxfmGnkHUJggh28useXQdopokgwMeYw2XUht49WX5RcTQ40rZIabw==} + '@algolia/client-search@4.23.3': dependencies: '@algolia/client-common': 4.23.3 '@algolia/requester-common': 4.23.3 '@algolia/transporter': 4.23.3 - dev: false - /@algolia/logger-common@4.23.3: - resolution: {integrity: sha512-y9kBtmJwiZ9ZZ+1Ek66P0M68mHQzKRxkW5kAAXYN/rdzgDN0d2COsViEFufxJ0pb45K4FRcfC7+33YB4BLrZ+g==} - dev: false + '@algolia/logger-common@4.23.3': {} - /@algolia/logger-console@4.23.3: - resolution: {integrity: sha512-8xoiseoWDKuCVnWP8jHthgaeobDLolh00KJAdMe9XPrWPuf1by732jSpgy2BlsLTaT9m32pHI8CRfrOqQzHv3A==} + '@algolia/logger-console@4.23.3': dependencies: '@algolia/logger-common': 4.23.3 - dev: false - /@algolia/recommend@4.23.3: - resolution: {integrity: sha512-9fK4nXZF0bFkdcLBRDexsnGzVmu4TSYZqxdpgBW2tEyfuSSY54D4qSRkLmNkrrz4YFvdh2GM1gA8vSsnZPR73w==} + '@algolia/recommend@4.23.3': dependencies: '@algolia/cache-browser-local-storage': 4.23.3 '@algolia/cache-common': 4.23.3 @@ -225,81 +3737,54 @@ packages: '@algolia/requester-common': 4.23.3 '@algolia/requester-node-http': 4.23.3 '@algolia/transporter': 4.23.3 - dev: false - /@algolia/requester-browser-xhr@4.23.3: - resolution: {integrity: sha512-jDWGIQ96BhXbmONAQsasIpTYWslyjkiGu0Quydjlowe+ciqySpiDUrJHERIRfELE5+wFc7hc1Q5hqjGoV7yghw==} + '@algolia/requester-browser-xhr@4.23.3': dependencies: '@algolia/requester-common': 4.23.3 - dev: false - /@algolia/requester-common@4.23.3: - resolution: {integrity: sha512-xloIdr/bedtYEGcXCiF2muajyvRhwop4cMZo+K2qzNht0CMzlRkm8YsDdj5IaBhshqfgmBb3rTg4sL4/PpvLYw==} - dev: false + '@algolia/requester-common@4.23.3': {} - /@algolia/requester-node-http@4.23.3: - resolution: {integrity: sha512-zgu++8Uj03IWDEJM3fuNl34s746JnZOWn1Uz5taV1dFyJhVM/kTNw9Ik7YJWiUNHJQXcaD8IXD1eCb0nq/aByA==} + '@algolia/requester-node-http@4.23.3': dependencies: '@algolia/requester-common': 4.23.3 - dev: false - /@algolia/transporter@4.23.3: - resolution: {integrity: sha512-Wjl5gttqnf/gQKJA+dafnD0Y6Yw97yvfY8R9h0dQltX1GXTgNs1zWgvtWW0tHl1EgMdhAyw189uWiZMnL3QebQ==} + '@algolia/transporter@4.23.3': dependencies: '@algolia/cache-common': 4.23.3 '@algolia/logger-common': 4.23.3 '@algolia/requester-common': 4.23.3 - dev: false - /@apidevtools/json-schema-ref-parser@11.1.0: - resolution: {integrity: sha512-g/VW9ZQEFJAOwAyUb8JFf7MLiLy2uEB4rU270rGzDwICxnxMlPy0O11KVePSgS36K1NI29gSlK84n5INGhd4Ag==} - engines: {node: '>= 16'} + '@apidevtools/json-schema-ref-parser@11.1.0': dependencies: '@jsdevtools/ono': 7.1.3 '@types/json-schema': 7.0.15 '@types/lodash.clonedeep': 4.5.9 js-yaml: 4.1.0 lodash.clonedeep: 4.5.0 - dev: true - /@babel/code-frame@7.24.2: - resolution: {integrity: sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==} - engines: {node: '>=6.9.0'} + '@babel/code-frame@7.24.2': dependencies: '@babel/highlight': 7.24.2 picocolors: 1.0.0 - /@babel/helper-validator-identifier@7.22.20: - resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} - engines: {node: '>=6.9.0'} + '@babel/helper-validator-identifier@7.22.20': {} - /@babel/highlight@7.24.2: - resolution: {integrity: sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==} - engines: {node: '>=6.9.0'} + '@babel/highlight@7.24.2': dependencies: '@babel/helper-validator-identifier': 7.22.20 chalk: 2.4.2 js-tokens: 4.0.0 picocolors: 1.0.0 - /@babel/runtime@7.24.4: - resolution: {integrity: sha512-dkxf7+hn8mFBwKjs9bvBlArzLVxVbS8usaPUDd5p2a9JCL9tB8OaOVN1isD4+Xyk4ns89/xeOmbQvgdK7IIVdA==} - engines: {node: '>=6.9.0'} + '@babel/runtime@7.24.4': dependencies: regenerator-runtime: 0.14.1 - dev: false - /@braintree/sanitize-url@6.0.4: - resolution: {integrity: sha512-s3jaWicZd0pkP0jf5ysyHUI/RE7MHos6qlToFcGWXVp+ykHOy77OUMrfbgJ9it2C5bow7OIQwYYaHjk9XlBQ2A==} - dev: false + '@braintree/sanitize-url@6.0.4': {} - /@corex/deepmerge@4.0.43: - resolution: {integrity: sha512-N8uEMrMPL0cu/bdboEWpQYb/0i2K5Qn8eCsxzOmxSggJbbQte7ljMRoXm917AbntqTGOzdTu+vP3KOOzoC70HQ==} - dev: false + '@corex/deepmerge@4.0.43': {} - /@cspell/cspell-bundled-dicts@8.7.0: - resolution: {integrity: sha512-B5YQI7Dd9m0JHTmHgs7PiyP4BWXzl8ixpK+HGOwhxzh7GyfFt1Eo/gxMxBDX/9SaewEzeb2OjRpRKEFtEsto3A==} - engines: {node: '>=18'} + '@cspell/cspell-bundled-dicts@8.7.0': dependencies: '@cspell/dict-ada': 4.0.2 '@cspell/dict-aws': 4.0.1 @@ -352,293 +3837,153 @@ packages: '@cspell/dict-terraform': 1.0.0 '@cspell/dict-typescript': 3.1.4 '@cspell/dict-vue': 3.0.0 - dev: true - /@cspell/cspell-json-reporter@8.7.0: - resolution: {integrity: sha512-LTQPEvXvCqnc+ok9WXpSISZyt4/nGse9fVEM430g0BpGzKpt3RMx49B8uasvvnanzCuikaW9+wFLmwgvraERhA==} - engines: {node: '>=18'} + '@cspell/cspell-json-reporter@8.7.0': dependencies: '@cspell/cspell-types': 8.7.0 - dev: true - /@cspell/cspell-pipe@8.7.0: - resolution: {integrity: sha512-ePqddIQ4arqPQgOkC146SkZxvZb9/jL7xIM5Igy2n3tiWTC5ijrX/mbHpPZ1VGcFck+1M0cJUuyhuJk+vMj3rg==} - engines: {node: '>=18'} - dev: true + '@cspell/cspell-pipe@8.7.0': {} - /@cspell/cspell-resolver@8.7.0: - resolution: {integrity: sha512-grZwDFYqcBYQDaz4AkUtdyqc4UUH2J3/7yWVkBbYDPE+FQHa9ofFXzXxyjs56GJlPfi9ULpe5/Wz6uVLg8rQkQ==} - engines: {node: '>=18'} + '@cspell/cspell-resolver@8.7.0': dependencies: global-directory: 4.0.1 - dev: true - /@cspell/cspell-service-bus@8.7.0: - resolution: {integrity: sha512-KW48iu0nTDzbedixc7iB7K7mlAZQ7QeMLuM/akxigOlvtOdVJrRa9Pfn44lwejts1ANb/IXil3GH8YylkVi76Q==} - engines: {node: '>=18'} - dev: true + '@cspell/cspell-service-bus@8.7.0': {} - /@cspell/cspell-types@8.7.0: - resolution: {integrity: sha512-Rb+LCE5I9JEb/LE8nSViVSF8z1CWv/z4mPBIG37VMa7aUx2gAQa6gJekNfpY9YZiMzx4Tv3gDujN80ytks4pGA==} - engines: {node: '>=18'} - dev: true + '@cspell/cspell-types@8.7.0': {} - /@cspell/dict-ada@4.0.2: - resolution: {integrity: sha512-0kENOWQeHjUlfyId/aCM/mKXtkEgV0Zu2RhUXCBr4hHo9F9vph+Uu8Ww2b0i5a4ZixoIkudGA+eJvyxrG1jUpA==} - dev: true + '@cspell/dict-ada@4.0.2': {} - /@cspell/dict-aws@4.0.1: - resolution: {integrity: sha512-NXO+kTPQGqaaJKa4kO92NAXoqS+i99dQzf3/L1BxxWVSBS3/k1f3uhmqIh7Crb/n22W793lOm0D9x952BFga3Q==} - dev: true + '@cspell/dict-aws@4.0.1': {} - /@cspell/dict-bash@4.1.3: - resolution: {integrity: sha512-tOdI3QVJDbQSwPjUkOiQFhYcu2eedmX/PtEpVWg0aFps/r6AyjUQINtTgpqMYnYuq8O1QUIQqnpx21aovcgZCw==} - dev: true + '@cspell/dict-bash@4.1.3': {} - /@cspell/dict-companies@3.0.31: - resolution: {integrity: sha512-hKVpV/lcGKP4/DpEPS8P4osPvFH/YVLJaDn9cBIOH6/HSmL5LbFgJNKpMGaYRbhm2FEX56MKE3yn/MNeNYuesQ==} - dev: true + '@cspell/dict-companies@3.0.31': {} - /@cspell/dict-cpp@5.1.3: - resolution: {integrity: sha512-sqnriXRAInZH9W75C+APBh6dtben9filPqVbIsiRMUXGg+s02ekz0z6LbS7kXeJ5mD2qXoMLBrv13qH2eIwutQ==} - dev: true + '@cspell/dict-cpp@5.1.3': {} - /@cspell/dict-cryptocurrencies@5.0.0: - resolution: {integrity: sha512-Z4ARIw5+bvmShL+4ZrhDzGhnc9znaAGHOEMaB/GURdS/jdoreEDY34wdN0NtdLHDO5KO7GduZnZyqGdRoiSmYA==} - dev: true + '@cspell/dict-cryptocurrencies@5.0.0': {} - /@cspell/dict-csharp@4.0.2: - resolution: {integrity: sha512-1JMofhLK+4p4KairF75D3A924m5ERMgd1GvzhwK2geuYgd2ZKuGW72gvXpIV7aGf52E3Uu1kDXxxGAiZ5uVG7g==} - dev: true + '@cspell/dict-csharp@4.0.2': {} - /@cspell/dict-css@4.0.12: - resolution: {integrity: sha512-vGBgPM92MkHQF5/2jsWcnaahOZ+C6OE/fPvd5ScBP72oFY9tn5GLuomcyO0z8vWCr2e0nUSX1OGimPtcQAlvSw==} - dev: true + '@cspell/dict-css@4.0.12': {} - /@cspell/dict-dart@2.0.3: - resolution: {integrity: sha512-cLkwo1KT5CJY5N5RJVHks2genFkNCl/WLfj+0fFjqNR+tk3tBI1LY7ldr9piCtSFSm4x9pO1x6IV3kRUY1lLiw==} - dev: true + '@cspell/dict-dart@2.0.3': {} - /@cspell/dict-data-science@1.0.11: - resolution: {integrity: sha512-TaHAZRVe0Zlcc3C23StZqqbzC0NrodRwoSAc8dis+5qLeLLnOCtagYQeROQvDlcDg3X/VVEO9Whh4W/z4PAmYQ==} - dev: true + '@cspell/dict-data-science@1.0.11': {} - /@cspell/dict-django@4.1.0: - resolution: {integrity: sha512-bKJ4gPyrf+1c78Z0Oc4trEB9MuhcB+Yg+uTTWsvhY6O2ncFYbB/LbEZfqhfmmuK/XJJixXfI1laF2zicyf+l0w==} - dev: true + '@cspell/dict-django@4.1.0': {} - /@cspell/dict-docker@1.1.7: - resolution: {integrity: sha512-XlXHAr822euV36GGsl2J1CkBIVg3fZ6879ZOg5dxTIssuhUOCiV2BuzKZmt6aIFmcdPmR14+9i9Xq+3zuxeX0A==} - dev: true + '@cspell/dict-docker@1.1.7': {} - /@cspell/dict-dotnet@5.0.0: - resolution: {integrity: sha512-EOwGd533v47aP5QYV8GlSSKkmM9Eq8P3G/eBzSpH3Nl2+IneDOYOBLEUraHuiCtnOkNsz0xtZHArYhAB2bHWAw==} - dev: true + '@cspell/dict-dotnet@5.0.0': {} - /@cspell/dict-elixir@4.0.3: - resolution: {integrity: sha512-g+uKLWvOp9IEZvrIvBPTr/oaO6619uH/wyqypqvwpmnmpjcfi8+/hqZH8YNKt15oviK8k4CkINIqNhyndG9d9Q==} - dev: true + '@cspell/dict-elixir@4.0.3': {} - /@cspell/dict-en-common-misspellings@2.0.0: - resolution: {integrity: sha512-NOg8dlv37/YqLkCfBs5OXeJm/Wcfb/CzeOmOZJ2ZXRuxwsNuolb4TREUce0yAXRqMhawahY5TSDRJJBgKjBOdw==} - dev: true + '@cspell/dict-en-common-misspellings@2.0.0': {} - /@cspell/dict-en-gb@1.1.33: - resolution: {integrity: sha512-tKSSUf9BJEV+GJQAYGw5e+ouhEe2ZXE620S7BLKe3ZmpnjlNG9JqlnaBhkIMxKnNFkLY2BP/EARzw31AZnOv4g==} - dev: true + '@cspell/dict-en-gb@1.1.33': {} - /@cspell/dict-en_us@4.3.19: - resolution: {integrity: sha512-tHcXdkmm0t9LlRct1vgu3+h0KW/wlXCInkTiR4D/rl730q1zu2qVEgiy1saMiTUSNmdu7Hiy+Mhb+1braVqnZQ==} - dev: true + '@cspell/dict-en_us@4.3.19': {} - /@cspell/dict-filetypes@3.0.3: - resolution: {integrity: sha512-J9UP+qwwBLfOQ8Qg9tAsKtSY/WWmjj21uj6zXTI9hRLD1eG1uUOLcfVovAmtmVqUWziPSKMr87F6SXI3xmJXgw==} - dev: true + '@cspell/dict-filetypes@3.0.3': {} - /@cspell/dict-fonts@4.0.0: - resolution: {integrity: sha512-t9V4GeN/m517UZn63kZPUYP3OQg5f0OBLSd3Md5CU3eH1IFogSvTzHHnz4Wqqbv8NNRiBZ3HfdY/pqREZ6br3Q==} - dev: true + '@cspell/dict-fonts@4.0.0': {} - /@cspell/dict-fsharp@1.0.1: - resolution: {integrity: sha512-23xyPcD+j+NnqOjRHgW3IU7Li912SX9wmeefcY0QxukbAxJ/vAN4rBpjSwwYZeQPAn3fxdfdNZs03fg+UM+4yQ==} - dev: true + '@cspell/dict-fsharp@1.0.1': {} - /@cspell/dict-fullstack@3.1.5: - resolution: {integrity: sha512-6ppvo1dkXUZ3fbYn/wwzERxCa76RtDDl5Afzv2lijLoijGGUw5yYdLBKJnx8PJBGNLh829X352ftE7BElG4leA==} - dev: true + '@cspell/dict-fullstack@3.1.5': {} - /@cspell/dict-gaming-terms@1.0.5: - resolution: {integrity: sha512-C3riccZDD3d9caJQQs1+MPfrUrQ+0KHdlj9iUR1QD92FgTOF6UxoBpvHUUZ9YSezslcmpFQK4xQQ5FUGS7uWfw==} - dev: true + '@cspell/dict-gaming-terms@1.0.5': {} - /@cspell/dict-git@3.0.0: - resolution: {integrity: sha512-simGS/lIiXbEaqJu9E2VPoYW1OTC2xrwPPXNXFMa2uo/50av56qOuaxDrZ5eH1LidFXwoc8HROCHYeKoNrDLSw==} - dev: true + '@cspell/dict-git@3.0.0': {} - /@cspell/dict-golang@6.0.5: - resolution: {integrity: sha512-w4mEqGz4/wV+BBljLxduFNkMrd3rstBNDXmoX5kD4UTzIb4Sy0QybWCtg2iVT+R0KWiRRA56QKOvBsgXiddksA==} - dev: true + '@cspell/dict-golang@6.0.5': {} - /@cspell/dict-haskell@4.0.1: - resolution: {integrity: sha512-uRrl65mGrOmwT7NxspB4xKXFUenNC7IikmpRZW8Uzqbqcu7ZRCUfstuVH7T1rmjRgRkjcIjE4PC11luDou4wEQ==} - dev: true + '@cspell/dict-haskell@4.0.1': {} - /@cspell/dict-html-symbol-entities@4.0.0: - resolution: {integrity: sha512-HGRu+48ErJjoweR5IbcixxETRewrBb0uxQBd6xFGcxbEYCX8CnQFTAmKI5xNaIt2PKaZiJH3ijodGSqbKdsxhw==} - dev: true + '@cspell/dict-html-symbol-entities@4.0.0': {} - /@cspell/dict-html@4.0.5: - resolution: {integrity: sha512-p0brEnRybzSSWi8sGbuVEf7jSTDmXPx7XhQUb5bgG6b54uj+Z0Qf0V2n8b/LWwIPJNd1GygaO9l8k3HTCy1h4w==} - dev: true + '@cspell/dict-html@4.0.5': {} - /@cspell/dict-java@5.0.6: - resolution: {integrity: sha512-kdE4AHHHrixyZ5p6zyms1SLoYpaJarPxrz8Tveo6gddszBVVwIUZ+JkQE1bWNLK740GWzIXdkznpUfw1hP9nXw==} - dev: true + '@cspell/dict-java@5.0.6': {} - /@cspell/dict-julia@1.0.1: - resolution: {integrity: sha512-4JsCLCRhhLMLiaHpmR7zHFjj1qOauzDI5ZzCNQS31TUMfsOo26jAKDfo0jljFAKgw5M2fEG7sKr8IlPpQAYrmQ==} - dev: true + '@cspell/dict-julia@1.0.1': {} - /@cspell/dict-k8s@1.0.2: - resolution: {integrity: sha512-tLT7gZpNPnGa+IIFvK9SP1LrSpPpJ94a/DulzAPOb1Q2UBFwdpFd82UWhio0RNShduvKG/WiMZf/wGl98pn+VQ==} - dev: true + '@cspell/dict-k8s@1.0.2': {} - /@cspell/dict-latex@4.0.0: - resolution: {integrity: sha512-LPY4y6D5oI7D3d+5JMJHK/wxYTQa2lJMSNxps2JtuF8hbAnBQb3igoWEjEbIbRRH1XBM0X8dQqemnjQNCiAtxQ==} - dev: true + '@cspell/dict-latex@4.0.0': {} - /@cspell/dict-lorem-ipsum@4.0.0: - resolution: {integrity: sha512-1l3yjfNvMzZPibW8A7mQU4kTozwVZVw0AvFEdy+NcqtbxH+TvbSkNMqROOFWrkD2PjnKG0+Ea0tHI2Pi6Gchnw==} - dev: true + '@cspell/dict-lorem-ipsum@4.0.0': {} - /@cspell/dict-lua@4.0.3: - resolution: {integrity: sha512-lDHKjsrrbqPaea13+G9s0rtXjMO06gPXPYRjRYawbNmo4E/e3XFfVzeci3OQDQNDmf2cPOwt9Ef5lu2lDmwfJg==} - dev: true + '@cspell/dict-lua@4.0.3': {} - /@cspell/dict-makefile@1.0.0: - resolution: {integrity: sha512-3W9tHPcSbJa6s0bcqWo6VisEDTSN5zOtDbnPabF7rbyjRpNo0uHXHRJQF8gAbFzoTzBBhgkTmrfSiuyQm7vBUQ==} - dev: true + '@cspell/dict-makefile@1.0.0': {} - /@cspell/dict-monkeyc@1.0.6: - resolution: {integrity: sha512-oO8ZDu/FtZ55aq9Mb67HtaCnsLn59xvhO/t2mLLTHAp667hJFxpp7bCtr2zOrR1NELzFXmKln/2lw/PvxMSvrA==} - dev: true + '@cspell/dict-monkeyc@1.0.6': {} - /@cspell/dict-node@4.0.3: - resolution: {integrity: sha512-sFlUNI5kOogy49KtPg8SMQYirDGIAoKBO3+cDLIwD4MLdsWy1q0upc7pzGht3mrjuyMiPRUV14Bb0rkVLrxOhg==} - dev: true + '@cspell/dict-node@4.0.3': {} - /@cspell/dict-npm@5.0.15: - resolution: {integrity: sha512-sX0X5YWNW54F4baW7b5JJB6705OCBIZtUqjOghlJNORS5No7QY1IX1zc5FxNNu4gsaCZITAmfMi4ityXEsEThA==} - dev: true + '@cspell/dict-npm@5.0.15': {} - /@cspell/dict-php@4.0.6: - resolution: {integrity: sha512-ySAXisf7twoVFZqBV2o/DKiCLIDTHNqfnj0EfH9OoOUR7HL3rb6zJkm0viLUFDO2G/8SyIi6YrN/6KX+Scjjjg==} - dev: true + '@cspell/dict-php@4.0.6': {} - /@cspell/dict-powershell@5.0.3: - resolution: {integrity: sha512-lEdzrcyau6mgzu1ie98GjOEegwVHvoaWtzQnm1ie4DyZgMr+N6D0Iyj1lzvtmt0snvsDFa5F2bsYzf3IMKcpcA==} - dev: true + '@cspell/dict-powershell@5.0.3': {} - /@cspell/dict-public-licenses@2.0.6: - resolution: {integrity: sha512-bHqpSpJvLCUcWxj1ov/Ki8WjmESpYwRpQlqfdchekOTc93Huhvjm/RXVN1R4fVf4Hspyem1QVkCGqAmjJMj6sw==} - dev: true + '@cspell/dict-public-licenses@2.0.6': {} - /@cspell/dict-python@4.1.11: - resolution: {integrity: sha512-XG+v3PumfzUW38huSbfT15Vqt3ihNb462ulfXifpQllPok5OWynhszCLCRQjQReV+dgz784ST4ggRxW452/kVg==} + '@cspell/dict-python@4.1.11': dependencies: '@cspell/dict-data-science': 1.0.11 - dev: true - /@cspell/dict-r@2.0.1: - resolution: {integrity: sha512-KCmKaeYMLm2Ip79mlYPc8p+B2uzwBp4KMkzeLd5E6jUlCL93Y5Nvq68wV5fRLDRTf7N1LvofkVFWfDcednFOgA==} - dev: true + '@cspell/dict-r@2.0.1': {} - /@cspell/dict-ruby@5.0.2: - resolution: {integrity: sha512-cIh8KTjpldzFzKGgrqUX4bFyav5lC52hXDKo4LbRuMVncs3zg4hcSf4HtURY+f2AfEZzN6ZKzXafQpThq3dl2g==} - dev: true + '@cspell/dict-ruby@5.0.2': {} - /@cspell/dict-rust@4.0.2: - resolution: {integrity: sha512-RhziKDrklzOntxAbY3AvNR58wnFGIo3YS8+dNeLY36GFuWOvXDHFStYw5Pod4f/VXbO/+1tXtywCC4zWfB2p1w==} - dev: true + '@cspell/dict-rust@4.0.2': {} - /@cspell/dict-scala@5.0.0: - resolution: {integrity: sha512-ph0twaRoV+ylui022clEO1dZ35QbeEQaKTaV2sPOsdwIokABPIiK09oWwGK9qg7jRGQwVaRPEq0Vp+IG1GpqSQ==} - dev: true + '@cspell/dict-scala@5.0.0': {} - /@cspell/dict-software-terms@3.3.20: - resolution: {integrity: sha512-KmPwCxYWEu7SGyT/0m/n6i6R4ZgxbmN3XcerzA6Z629Wm5iZTVfJaMWqDK2RKAyBawS7OMfxGz0W/wYU4FhJlA==} - dev: true + '@cspell/dict-software-terms@3.3.20': {} - /@cspell/dict-sql@2.1.3: - resolution: {integrity: sha512-SEyTNKJrjqD6PAzZ9WpdSu6P7wgdNtGV2RV8Kpuw1x6bV+YsSptuClYG+JSdRExBTE6LwIe1bTklejUp3ZP8TQ==} - dev: true + '@cspell/dict-sql@2.1.3': {} - /@cspell/dict-svelte@1.0.2: - resolution: {integrity: sha512-rPJmnn/GsDs0btNvrRBciOhngKV98yZ9SHmg8qI6HLS8hZKvcXc0LMsf9LLuMK1TmS2+WQFAan6qeqg6bBxL2Q==} - dev: true + '@cspell/dict-svelte@1.0.2': {} - /@cspell/dict-swift@2.0.1: - resolution: {integrity: sha512-gxrCMUOndOk7xZFmXNtkCEeroZRnS2VbeaIPiymGRHj5H+qfTAzAKxtv7jJbVA3YYvEzWcVE2oKDP4wcbhIERw==} - dev: true + '@cspell/dict-swift@2.0.1': {} - /@cspell/dict-terraform@1.0.0: - resolution: {integrity: sha512-Ak+vy4HP/bOgzf06BAMC30+ZvL9mzv21xLM2XtfnBLTDJGdxlk/nK0U6QT8VfFLqJ0ZZSpyOxGsUebWDCTr/zQ==} - dev: true + '@cspell/dict-terraform@1.0.0': {} - /@cspell/dict-typescript@3.1.4: - resolution: {integrity: sha512-jUcPa0rsPca5ur1+G56DXnSc5hbbJkzvPHHvyQtkbPXBQd3CXPMNfrTVCgzex/7cY/7FONcpFCUwgwfni9Jqbw==} - dev: true + '@cspell/dict-typescript@3.1.4': {} - /@cspell/dict-vue@3.0.0: - resolution: {integrity: sha512-niiEMPWPV9IeRBRzZ0TBZmNnkK3olkOPYxC1Ny2AX4TGlYRajcW0WUtoSHmvvjZNfWLSg2L6ruiBeuPSbjnG6A==} - dev: true + '@cspell/dict-vue@3.0.0': {} - /@cspell/dynamic-import@8.7.0: - resolution: {integrity: sha512-xlEPdiHVDu+4xYkvwjL9MgklxOi9XB+Pr1H9s3Ww9WEq+q6BA3xOHxLIU/k8mhqFTMZGFZRCsdy/EwMu6SyRhQ==} - engines: {node: '>=18.0'} + '@cspell/dynamic-import@8.7.0': dependencies: import-meta-resolve: 4.1.0 - dev: true - /@cspell/strong-weak-map@8.7.0: - resolution: {integrity: sha512-0bo0WwDr2lzGoCP7vbpWbDpPyuOrHKK+218txnUpx6Pn1EDBLfcDQsiZED5B6zlpwgbGi6y3vc0rWtJbjKvwzg==} - engines: {node: '>=18'} - dev: true + '@cspell/strong-weak-map@8.7.0': {} - /@double-great/alt-text@3.1.0: - resolution: {integrity: sha512-5gSW9AI0KUO2GQe9K+KjyiCisxl4xL0kesQCxUsko4T9s8zler/stW0qcH5XryUgtKebb293qX9sz1nCmQpdTw==} + '@double-great/alt-text@3.1.0': dependencies: emoji-regex: 10.3.0 github-slugger: 1.5.0 tinyurl: 1.1.7 - dev: true - /@double-great/remark-lint-alt-text@1.0.0: - resolution: {integrity: sha512-2FFjSX2VhT/USmsOEkcw40SiCHXXio2sWs4S7docKNFh+W7/z+bHYau+UHfrP4yDRVzfUVSV1MKnsxmigkhixg==} + '@double-great/remark-lint-alt-text@1.0.0': dependencies: '@double-great/alt-text': 3.1.0 unified-lint-rule: 2.1.2 unist-util-visit-parents: 5.1.3 - dev: true - /@eslint-community/eslint-utils@4.4.0(eslint@8.57.0): - resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + '@eslint-community/eslint-utils@4.4.0(eslint@8.57.0)': dependencies: eslint: 8.57.0 eslint-visitor-keys: 3.4.3 - dev: true - /@eslint-community/regexpp@4.10.0: - resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} - engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - dev: true + '@eslint-community/regexpp@4.10.0': {} - /@eslint/eslintrc@2.1.4: - resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@eslint/eslintrc@2.1.4': dependencies: ajv: 6.12.6 debug: 4.3.4 @@ -651,45 +3996,26 @@ packages: strip-json-comments: 3.1.1 transitivePeerDependencies: - supports-color - dev: true - /@eslint/js@8.57.0: - resolution: {integrity: sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dev: true + '@eslint/js@8.57.0': {} - /@eth-optimism/contracts-bedrock@0.17.2: - resolution: {integrity: sha512-YVwPHpBZgFwFX9qY8+iToVAAH7mSnVIVmih+YfHhqjAhlLvLZfYjvj+hRNgcB9eRyl1SOOB0jevp4JOOV1v2BA==} - dev: true + '@eth-optimism/contracts-bedrock@0.17.2': {} - /@eth-optimism/contracts-ts@0.17.2(typescript@5.4.5): - resolution: {integrity: sha512-5aM+pn1uK8Hx9r9+PHCF6NQTYKVHmrm7Gc7LQ6sO9MQItVP1WdIWNcQYT7TQhkxGKHYG2arF06rbHGeGNqzBeg==} - peerDependencies: - '@wagmi/core': ^2.6.3 - wagmi: ^2.5.5 - peerDependenciesMeta: - '@wagmi/core': - optional: true - wagmi: - optional: true + '@eth-optimism/contracts-ts@0.17.2(typescript@5.4.5)(zod@3.23.8)': dependencies: - '@testing-library/react': 14.3.1(react-dom@18.3.1)(react@18.3.1) + '@testing-library/react': 14.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@types/change-case': 2.3.1 change-case: 4.1.2 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - viem: 2.9.28(typescript@5.4.5) + viem: 2.9.28(typescript@5.4.5)(zod@3.23.8) transitivePeerDependencies: - bufferutil - typescript - utf-8-validate - zod - dev: false - /@eth-optimism/contracts@0.6.0(ethers@5.7.2): - resolution: {integrity: sha512-vQ04wfG9kMf1Fwy3FEMqH2QZbgS0gldKhcBeBUPfO8zu68L61VI97UDXmsMQXzTsEAxK8HnokW3/gosl4/NW3w==} - peerDependencies: - ethers: ^5 + '@eth-optimism/contracts@0.6.0(ethers@5.7.2)': dependencies: '@eth-optimism/core-utils': 0.12.0 '@ethersproject/abstract-provider': 5.7.0 @@ -698,10 +4024,8 @@ packages: transitivePeerDependencies: - bufferutil - utf-8-validate - dev: true - /@eth-optimism/core-utils@0.12.0: - resolution: {integrity: sha512-qW+7LZYCz7i8dRa7SRlUKIo1VBU8lvN0HeXCxJR+z+xtMzMQpPds20XJNCMclszxYQHkXY00fOT6GvFw9ZL6nw==} + '@eth-optimism/core-utils@0.12.0': dependencies: '@ethersproject/abi': 5.7.0 '@ethersproject/abstract-provider': 5.7.0 @@ -722,10 +4046,8 @@ packages: transitivePeerDependencies: - bufferutil - utf-8-validate - dev: true - /@eth-optimism/core-utils@0.13.2: - resolution: {integrity: sha512-u7TOKm1RxH1V5zw7dHmfy91bOuEAZU68LT/9vJPkuWEjaTl+BgvPDRDTurjzclHzN0GbWdcpOqPZg4ftjkJGaw==} + '@eth-optimism/core-utils@0.13.2': dependencies: '@ethersproject/abi': 5.7.0 '@ethersproject/abstract-provider': 5.7.0 @@ -745,12 +4067,8 @@ packages: - bufferutil - encoding - utf-8-validate - dev: true - /@eth-optimism/sdk@3.3.0(ethers@5.7.2): - resolution: {integrity: sha512-0Wt9roWe3itdzp08caCQLoFqhmT47ssquKAzBe7yXI6saVL+f2vWl6VgEaq0aYe2FsWvD9L0tSAJHLx1FiquNw==} - peerDependencies: - ethers: ^5 + '@eth-optimism/sdk@3.3.0(ethers@5.7.2)': dependencies: '@eth-optimism/contracts': 0.6.0(ethers@5.7.2) '@eth-optimism/contracts-bedrock': 0.17.2 @@ -764,29 +4082,18 @@ packages: - bufferutil - encoding - utf-8-validate - dev: true - /@eth-optimism/tokenlist@9.0.51: - resolution: {integrity: sha512-GfKk4euEfNLniyRisP7sB/N9Kp96M+2t529mkvwC6nXITouzH4faDP8JdtwU6AOcgC4UlrFjXJ9w8ecnWWNQbw==} - dev: false + '@eth-optimism/tokenlist@9.0.51': {} - /@ethereumjs/rlp@4.0.1: - resolution: {integrity: sha512-tqsQiBQDQdmPWE1xkkBq4rlSW5QZpLOUJ5RJh2/9fug+q9tnUhuZoVLk7s0scUIKTOzEtR72DFBXI4WiZcMpvw==} - engines: {node: '>=14'} - hasBin: true - dev: true + '@ethereumjs/rlp@4.0.1': {} - /@ethereumjs/util@8.1.0: - resolution: {integrity: sha512-zQ0IqbdX8FZ9aw11vP+dZkKDkS+kgIvQPHnSAXzP9pLu+Rfu3D3XEeLbicvoXJTYnhZiPmsZUxgdzXwNKxRPbA==} - engines: {node: '>=14'} + '@ethereumjs/util@8.1.0': dependencies: '@ethereumjs/rlp': 4.0.1 ethereum-cryptography: 2.1.3 micro-ftch: 0.3.1 - dev: true - /@ethersproject/abi@5.7.0: - resolution: {integrity: sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA==} + '@ethersproject/abi@5.7.0': dependencies: '@ethersproject/address': 5.7.0 '@ethersproject/bignumber': 5.7.0 @@ -797,10 +4104,8 @@ packages: '@ethersproject/logger': 5.7.0 '@ethersproject/properties': 5.7.0 '@ethersproject/strings': 5.7.0 - dev: true - /@ethersproject/abstract-provider@5.7.0: - resolution: {integrity: sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw==} + '@ethersproject/abstract-provider@5.7.0': dependencies: '@ethersproject/bignumber': 5.7.0 '@ethersproject/bytes': 5.7.0 @@ -809,63 +4114,47 @@ packages: '@ethersproject/properties': 5.7.0 '@ethersproject/transactions': 5.7.0 '@ethersproject/web': 5.7.1 - dev: true - /@ethersproject/abstract-signer@5.7.0: - resolution: {integrity: sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ==} + '@ethersproject/abstract-signer@5.7.0': dependencies: '@ethersproject/abstract-provider': 5.7.0 '@ethersproject/bignumber': 5.7.0 '@ethersproject/bytes': 5.7.0 '@ethersproject/logger': 5.7.0 '@ethersproject/properties': 5.7.0 - dev: true - /@ethersproject/address@5.7.0: - resolution: {integrity: sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==} + '@ethersproject/address@5.7.0': dependencies: '@ethersproject/bignumber': 5.7.0 '@ethersproject/bytes': 5.7.0 '@ethersproject/keccak256': 5.7.0 '@ethersproject/logger': 5.7.0 '@ethersproject/rlp': 5.7.0 - dev: true - /@ethersproject/base64@5.7.0: - resolution: {integrity: sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ==} + '@ethersproject/base64@5.7.0': dependencies: '@ethersproject/bytes': 5.7.0 - dev: true - /@ethersproject/basex@5.7.0: - resolution: {integrity: sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw==} + '@ethersproject/basex@5.7.0': dependencies: '@ethersproject/bytes': 5.7.0 '@ethersproject/properties': 5.7.0 - dev: true - /@ethersproject/bignumber@5.7.0: - resolution: {integrity: sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw==} + '@ethersproject/bignumber@5.7.0': dependencies: '@ethersproject/bytes': 5.7.0 '@ethersproject/logger': 5.7.0 bn.js: 5.2.1 - dev: true - /@ethersproject/bytes@5.7.0: - resolution: {integrity: sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A==} + '@ethersproject/bytes@5.7.0': dependencies: '@ethersproject/logger': 5.7.0 - dev: true - /@ethersproject/constants@5.7.0: - resolution: {integrity: sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA==} + '@ethersproject/constants@5.7.0': dependencies: '@ethersproject/bignumber': 5.7.0 - dev: true - /@ethersproject/contracts@5.7.0: - resolution: {integrity: sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg==} + '@ethersproject/contracts@5.7.0': dependencies: '@ethersproject/abi': 5.7.0 '@ethersproject/abstract-provider': 5.7.0 @@ -877,10 +4166,8 @@ packages: '@ethersproject/logger': 5.7.0 '@ethersproject/properties': 5.7.0 '@ethersproject/transactions': 5.7.0 - dev: true - /@ethersproject/hash@5.7.0: - resolution: {integrity: sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g==} + '@ethersproject/hash@5.7.0': dependencies: '@ethersproject/abstract-signer': 5.7.0 '@ethersproject/address': 5.7.0 @@ -891,10 +4178,8 @@ packages: '@ethersproject/logger': 5.7.0 '@ethersproject/properties': 5.7.0 '@ethersproject/strings': 5.7.0 - dev: true - /@ethersproject/hdnode@5.7.0: - resolution: {integrity: sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg==} + '@ethersproject/hdnode@5.7.0': dependencies: '@ethersproject/abstract-signer': 5.7.0 '@ethersproject/basex': 5.7.0 @@ -908,10 +4193,8 @@ packages: '@ethersproject/strings': 5.7.0 '@ethersproject/transactions': 5.7.0 '@ethersproject/wordlists': 5.7.0 - dev: true - /@ethersproject/json-wallets@5.7.0: - resolution: {integrity: sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g==} + '@ethersproject/json-wallets@5.7.0': dependencies: '@ethersproject/abstract-signer': 5.7.0 '@ethersproject/address': 5.7.0 @@ -926,40 +4209,28 @@ packages: '@ethersproject/transactions': 5.7.0 aes-js: 3.0.0 scrypt-js: 3.0.1 - dev: true - /@ethersproject/keccak256@5.7.0: - resolution: {integrity: sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg==} + '@ethersproject/keccak256@5.7.0': dependencies: '@ethersproject/bytes': 5.7.0 js-sha3: 0.8.0 - dev: true - /@ethersproject/logger@5.7.0: - resolution: {integrity: sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig==} - dev: true + '@ethersproject/logger@5.7.0': {} - /@ethersproject/networks@5.7.1: - resolution: {integrity: sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ==} + '@ethersproject/networks@5.7.1': dependencies: '@ethersproject/logger': 5.7.0 - dev: true - /@ethersproject/pbkdf2@5.7.0: - resolution: {integrity: sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw==} + '@ethersproject/pbkdf2@5.7.0': dependencies: '@ethersproject/bytes': 5.7.0 '@ethersproject/sha2': 5.7.0 - dev: true - /@ethersproject/properties@5.7.0: - resolution: {integrity: sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw==} + '@ethersproject/properties@5.7.0': dependencies: '@ethersproject/logger': 5.7.0 - dev: true - /@ethersproject/providers@5.7.2: - resolution: {integrity: sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg==} + '@ethersproject/providers@5.7.2': dependencies: '@ethersproject/abstract-provider': 5.7.0 '@ethersproject/abstract-signer': 5.7.0 @@ -984,32 +4255,24 @@ packages: transitivePeerDependencies: - bufferutil - utf-8-validate - dev: true - /@ethersproject/random@5.7.0: - resolution: {integrity: sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ==} + '@ethersproject/random@5.7.0': dependencies: '@ethersproject/bytes': 5.7.0 '@ethersproject/logger': 5.7.0 - dev: true - /@ethersproject/rlp@5.7.0: - resolution: {integrity: sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w==} + '@ethersproject/rlp@5.7.0': dependencies: '@ethersproject/bytes': 5.7.0 '@ethersproject/logger': 5.7.0 - dev: true - /@ethersproject/sha2@5.7.0: - resolution: {integrity: sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw==} + '@ethersproject/sha2@5.7.0': dependencies: '@ethersproject/bytes': 5.7.0 '@ethersproject/logger': 5.7.0 hash.js: 1.1.7 - dev: true - /@ethersproject/signing-key@5.7.0: - resolution: {integrity: sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q==} + '@ethersproject/signing-key@5.7.0': dependencies: '@ethersproject/bytes': 5.7.0 '@ethersproject/logger': 5.7.0 @@ -1017,10 +4280,8 @@ packages: bn.js: 5.2.1 elliptic: 6.5.4 hash.js: 1.1.7 - dev: true - /@ethersproject/solidity@5.7.0: - resolution: {integrity: sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA==} + '@ethersproject/solidity@5.7.0': dependencies: '@ethersproject/bignumber': 5.7.0 '@ethersproject/bytes': 5.7.0 @@ -1028,18 +4289,14 @@ packages: '@ethersproject/logger': 5.7.0 '@ethersproject/sha2': 5.7.0 '@ethersproject/strings': 5.7.0 - dev: true - /@ethersproject/strings@5.7.0: - resolution: {integrity: sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg==} + '@ethersproject/strings@5.7.0': dependencies: '@ethersproject/bytes': 5.7.0 '@ethersproject/constants': 5.7.0 '@ethersproject/logger': 5.7.0 - dev: true - /@ethersproject/transactions@5.7.0: - resolution: {integrity: sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ==} + '@ethersproject/transactions@5.7.0': dependencies: '@ethersproject/address': 5.7.0 '@ethersproject/bignumber': 5.7.0 @@ -1050,18 +4307,14 @@ packages: '@ethersproject/properties': 5.7.0 '@ethersproject/rlp': 5.7.0 '@ethersproject/signing-key': 5.7.0 - dev: true - /@ethersproject/units@5.7.0: - resolution: {integrity: sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg==} + '@ethersproject/units@5.7.0': dependencies: '@ethersproject/bignumber': 5.7.0 '@ethersproject/constants': 5.7.0 '@ethersproject/logger': 5.7.0 - dev: true - /@ethersproject/wallet@5.7.0: - resolution: {integrity: sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA==} + '@ethersproject/wallet@5.7.0': dependencies: '@ethersproject/abstract-provider': 5.7.0 '@ethersproject/abstract-signer': 5.7.0 @@ -1078,149 +4331,95 @@ packages: '@ethersproject/signing-key': 5.7.0 '@ethersproject/transactions': 5.7.0 '@ethersproject/wordlists': 5.7.0 - dev: true - /@ethersproject/web@5.7.1: - resolution: {integrity: sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w==} + '@ethersproject/web@5.7.1': dependencies: '@ethersproject/base64': 5.7.0 '@ethersproject/bytes': 5.7.0 '@ethersproject/logger': 5.7.0 '@ethersproject/properties': 5.7.0 '@ethersproject/strings': 5.7.0 - dev: true - /@ethersproject/wordlists@5.7.0: - resolution: {integrity: sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA==} + '@ethersproject/wordlists@5.7.0': dependencies: '@ethersproject/bytes': 5.7.0 '@ethersproject/hash': 5.7.0 '@ethersproject/logger': 5.7.0 '@ethersproject/properties': 5.7.0 '@ethersproject/strings': 5.7.0 - dev: true - /@feelback/js@0.3.4: - resolution: {integrity: sha512-xr7gTqSJcVUYQlELs1TntYovCBjMcYUr/hGKTnDoF64/lig5CbX4bOmqLoF50IImCy5q3oIwg9w+TSFvtBwsIA==} - dev: false + '@feelback/js@0.3.4': {} - /@feelback/react@0.3.4(react@18.3.1): - resolution: {integrity: sha512-ZWzUQAmPwl4nYR2olzBKddHzoLtGW/2pb8TiesiJCirxhaDW2E/XBx2ZaB4fL5TGXtjBt4eYq/qZxJZ0fIE0kg==} - engines: {node: '>=14'} - peerDependencies: - react: '>=17' + '@feelback/react@0.3.4(react@18.3.1)': dependencies: '@feelback/js': 0.3.4 react: 18.3.1 - dev: false - /@floating-ui/core@1.6.2: - resolution: {integrity: sha512-+2XpQV9LLZeanU4ZevzRnGFg2neDeKHgFLjP6YLW+tly0IvrhqT4u8enLGjLH3qeh85g19xY5rsAusfwTdn5lg==} + '@floating-ui/core@1.6.2': dependencies: '@floating-ui/utils': 0.2.2 - dev: false - /@floating-ui/dom@1.6.5: - resolution: {integrity: sha512-Nsdud2X65Dz+1RHjAIP0t8z5e2ff/IRbei6BqFrl1urT8sDVzM1HMQ+R0XcU5ceRfyO3I6ayeqIfh+6Wb8LGTw==} + '@floating-ui/dom@1.6.5': dependencies: '@floating-ui/core': 1.6.2 '@floating-ui/utils': 0.2.2 - dev: false - /@floating-ui/react-dom@2.1.0(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-lNzj5EQmEKn5FFKc04+zasr09h/uX8RtJRNj5gUXsSQIXHVWTVh+hVAg1vOMCexkX8EgvemMvIFpQfkosnVNyA==} - peerDependencies: - react: '>=16.8.0' - react-dom: '>=16.8.0' + '@floating-ui/react-dom@2.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@floating-ui/dom': 1.6.5 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - dev: false - /@floating-ui/react@0.26.17(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-ESD+jYWwqwVzaIgIhExrArdsCL1rOAzryG/Sjlu8yaD3Mtqi3uVyhbE2V7jD58Mo52qbzKz2eUY/Xgh5I86FCQ==} - peerDependencies: - react: '>=16.8.0' - react-dom: '>=16.8.0' + '@floating-ui/react@0.26.17(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@floating-ui/react-dom': 2.1.0(react-dom@18.3.1)(react@18.3.1) + '@floating-ui/react-dom': 2.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@floating-ui/utils': 0.2.2 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) tabbable: 6.2.0 - dev: false - /@floating-ui/utils@0.2.2: - resolution: {integrity: sha512-J4yDIIthosAsRZ5CPYP/jQvUAQtlZTTD/4suA08/FEnlxqW3sKS9iAhgsa9VYLZ6vDHn/ixJgIqRQPotoBjxIw==} - dev: false + '@floating-ui/utils@0.2.2': {} - /@headlessui/react@1.7.19(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-Ll+8q3OlMJfJbAKM/+/Y2q6PPYbryqNTXDbryx7SXLIDamkF6iQFbriYHga0dY44PvDhvvBWCx1Xj4U5+G4hOw==} - engines: {node: '>=10'} - peerDependencies: - react: ^16 || ^17 || ^18 - react-dom: ^16 || ^17 || ^18 + '@headlessui/react@1.7.19(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@tanstack/react-virtual': 3.5.0(react-dom@18.3.1)(react@18.3.1) + '@tanstack/react-virtual': 3.5.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) client-only: 0.0.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - dev: false - /@headlessui/react@2.1.10(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-6mLa2fjMDAFQi+/R10B+zU3edsUk/MDtENB2zHho0lqKU1uzhAfJLUduWds4nCo8wbl3vULtC5rJfZAQ1yqIng==} - engines: {node: '>=10'} - peerDependencies: - react: ^18 - react-dom: ^18 + '@headlessui/react@2.1.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@floating-ui/react': 0.26.17(react-dom@18.3.1)(react@18.3.1) + '@floating-ui/react': 0.26.17(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@react-aria/focus': 3.17.1(react@18.3.1) '@react-aria/interactions': 3.21.3(react@18.3.1) - '@tanstack/react-virtual': 3.10.8(react-dom@18.3.1)(react@18.3.1) + '@tanstack/react-virtual': 3.10.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - dev: false - /@humanwhocodes/config-array@0.11.14: - resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} - engines: {node: '>=10.10.0'} + '@humanwhocodes/config-array@0.11.14': dependencies: '@humanwhocodes/object-schema': 2.0.3 debug: 4.3.4 minimatch: 3.1.2 transitivePeerDependencies: - supports-color - dev: true - /@humanwhocodes/module-importer@1.0.1: - resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} - engines: {node: '>=12.22'} - dev: true + '@humanwhocodes/module-importer@1.0.1': {} - /@humanwhocodes/object-schema@2.0.3: - resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} - dev: true + '@humanwhocodes/object-schema@2.0.3': {} - /@isaacs/cliui@8.0.2: - resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} - engines: {node: '>=12'} + '@isaacs/cliui@8.0.2': dependencies: string-width: 5.1.2 - string-width-cjs: /string-width@4.2.3 + string-width-cjs: string-width@4.2.3 strip-ansi: 7.1.0 - strip-ansi-cjs: /strip-ansi@6.0.1 + strip-ansi-cjs: strip-ansi@6.0.1 wrap-ansi: 8.1.0 - wrap-ansi-cjs: /wrap-ansi@7.0.0 - dev: true + wrap-ansi-cjs: wrap-ansi@7.0.0 - /@jsdevtools/ono@7.1.3: - resolution: {integrity: sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==} - dev: true + '@jsdevtools/ono@7.1.3': {} - /@mdx-js/mdx@2.3.0: - resolution: {integrity: sha512-jLuwRlz8DQfQNiUCJR50Y09CGPq3fLtmtUQfVrj79E0JWu3dvsVcxVIcfhR5h0iXu+/z++zDrYeiJqifRynJkA==} + '@mdx-js/mdx@2.3.0': dependencies: '@types/estree-jsx': 1.0.5 '@types/mdx': 2.0.13 @@ -1241,120 +4440,47 @@ packages: vfile: 5.3.7 transitivePeerDependencies: - supports-color - dev: false - /@mdx-js/react@2.3.0(react@18.3.1): - resolution: {integrity: sha512-zQH//gdOmuu7nt2oJR29vFhDv88oGPmVw6BggmrHeMI+xgEkp1B2dX9/bMBSYtK0dyLX/aOmesKS09g222K1/g==} - peerDependencies: - react: '>=16' + '@mdx-js/react@2.3.0(react@18.3.1)': dependencies: '@types/mdx': 2.0.13 '@types/react': 18.3.1 react: 18.3.1 - dev: false - /@napi-rs/simple-git-android-arm-eabi@0.1.16: - resolution: {integrity: sha512-dbrCL0Pl5KZG7x7tXdtVsA5CO6At5ohDX3myf5xIYn9kN4jDFxsocl8bNt6Vb/hZQoJd8fI+k5VlJt+rFhbdVw==} - engines: {node: '>= 10'} - cpu: [arm] - os: [android] - requiresBuild: true - dev: false + '@napi-rs/simple-git-android-arm-eabi@0.1.16': optional: true - /@napi-rs/simple-git-android-arm64@0.1.16: - resolution: {integrity: sha512-xYz+TW5J09iK8SuTAKK2D5MMIsBUXVSs8nYp7HcMi8q6FCRO7yJj96YfP9PvKsc/k64hOyqGmL5DhCzY9Cu1FQ==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [android] - requiresBuild: true - dev: false + '@napi-rs/simple-git-android-arm64@0.1.16': optional: true - /@napi-rs/simple-git-darwin-arm64@0.1.16: - resolution: {integrity: sha512-XfgsYqxhUE022MJobeiX563TJqyQyX4FmYCnqrtJwAfivESVeAJiH6bQIum8dDEYMHXCsG7nL8Ok0Dp8k2m42g==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: false + '@napi-rs/simple-git-darwin-arm64@0.1.16': optional: true - /@napi-rs/simple-git-darwin-x64@0.1.16: - resolution: {integrity: sha512-tkEVBhD6vgRCbeWsaAQqM3bTfpIVGeitamPPRVSbsq8qgzJ5Dx6ZedH27R7KSsA/uao7mZ3dsrNLXbu1Wy5MzA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: false + '@napi-rs/simple-git-darwin-x64@0.1.16': optional: true - /@napi-rs/simple-git-linux-arm-gnueabihf@0.1.16: - resolution: {integrity: sha512-R6VAyNnp/yRaT7DV1Ao3r67SqTWDa+fNq2LrNy0Z8gXk2wB9ZKlrxFtLPE1WSpWknWtyRDLpRlsorh7Evk7+7w==} - engines: {node: '>= 10'} - cpu: [arm] - os: [linux] - requiresBuild: true - dev: false + '@napi-rs/simple-git-linux-arm-gnueabihf@0.1.16': optional: true - /@napi-rs/simple-git-linux-arm64-gnu@0.1.16: - resolution: {integrity: sha512-LAGI0opFKw/HBMCV2qIBK3uWSEW9h4xd2ireZKLJy8DBPymX6NrWIamuxYNyCuACnFdPRxR4LaRFy4J5ZwuMdw==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: false + '@napi-rs/simple-git-linux-arm64-gnu@0.1.16': optional: true - /@napi-rs/simple-git-linux-arm64-musl@0.1.16: - resolution: {integrity: sha512-I57Ph0F0Yn2KW93ep+V1EzKhACqX0x49vvSiapqIsdDA2PifdEWLc1LJarBolmK7NKoPqKmf6lAKKO9lhiZzkg==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: false + '@napi-rs/simple-git-linux-arm64-musl@0.1.16': optional: true - /@napi-rs/simple-git-linux-x64-gnu@0.1.16: - resolution: {integrity: sha512-AZYYFY2V7hlcQASPEOWyOa3e1skzTct9QPzz0LiDM3f/hCFY/wBaU2M6NC5iG3d2Kr38heuyFS/+JqxLm5WaKA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: false + '@napi-rs/simple-git-linux-x64-gnu@0.1.16': optional: true - /@napi-rs/simple-git-linux-x64-musl@0.1.16: - resolution: {integrity: sha512-9TyMcYSBJwjT8jwjY9m24BZbu7ozyWTjsmYBYNtK3B0Um1Ov6jthSNneLVvouQ6x+k3Ow+00TiFh6bvmT00r8g==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: false + '@napi-rs/simple-git-linux-x64-musl@0.1.16': optional: true - /@napi-rs/simple-git-win32-arm64-msvc@0.1.16: - resolution: {integrity: sha512-uslJ1WuAHCYJWui6xjsyT47SjX6KOHDtClmNO8hqKz1pmDSNY7AjyUY8HxvD1lK9bDnWwc4JYhikS9cxCqHybw==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: false + '@napi-rs/simple-git-win32-arm64-msvc@0.1.16': optional: true - /@napi-rs/simple-git-win32-x64-msvc@0.1.16: - resolution: {integrity: sha512-SoEaVeCZCDF1MP+M9bMSXsZWgEjk4On9GWADO5JOulvzR1bKjk0s9PMHwe/YztR9F0sJzrCxwtvBZowhSJsQPg==} - engines: {node: '>= 10'} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: false + '@napi-rs/simple-git-win32-x64-msvc@0.1.16': optional: true - /@napi-rs/simple-git@0.1.16: - resolution: {integrity: sha512-C5wRPw9waqL2jk3jEDeJv+f7ScuO3N0a39HVdyFLkwKxHH4Sya4ZbzZsu2JLi6eEqe7RuHipHL6mC7B2OfYZZw==} - engines: {node: '>= 10'} + '@napi-rs/simple-git@0.1.16': optionalDependencies: '@napi-rs/simple-git-android-arm-eabi': 0.1.16 '@napi-rs/simple-git-android-arm64': 0.1.16 @@ -1367,145 +4493,65 @@ packages: '@napi-rs/simple-git-linux-x64-musl': 0.1.16 '@napi-rs/simple-git-win32-arm64-msvc': 0.1.16 '@napi-rs/simple-git-win32-x64-msvc': 0.1.16 - dev: false - /@next/env@13.5.6: - resolution: {integrity: sha512-Yac/bV5sBGkkEXmAX5FWPS9Mmo2rthrOPRQQNfycJPkjUAUclomCPH7QFVCDQ4Mp2k2K1SSM6m0zrxYrOwtFQw==} - dev: false + '@next/env@13.5.6': {} - /@next/env@14.2.10: - resolution: {integrity: sha512-dZIu93Bf5LUtluBXIv4woQw2cZVZ2DJTjax5/5DOs3lzEOeKLy7GxRSr4caK9/SCPdaW6bCgpye6+n4Dh9oJPw==} - dev: false + '@next/env@14.2.10': {} - /@next/swc-darwin-arm64@14.2.10: - resolution: {integrity: sha512-V3z10NV+cvMAfxQUMhKgfQnPbjw+Ew3cnr64b0lr8MDiBJs3eLnM6RpGC46nhfMZsiXgQngCJKWGTC/yDcgrDQ==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: false + '@next/swc-darwin-arm64@14.2.10': optional: true - /@next/swc-darwin-x64@14.2.10: - resolution: {integrity: sha512-Y0TC+FXbFUQ2MQgimJ/7Ina2mXIKhE7F+GUe1SgnzRmwFY3hX2z8nyVCxE82I2RicspdkZnSWMn4oTjIKz4uzA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: false + '@next/swc-darwin-x64@14.2.10': optional: true - /@next/swc-linux-arm64-gnu@14.2.10: - resolution: {integrity: sha512-ZfQ7yOy5zyskSj9rFpa0Yd7gkrBnJTkYVSya95hX3zeBG9E55Z6OTNPn1j2BTFWvOVVj65C3T+qsjOyVI9DQpA==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: false + '@next/swc-linux-arm64-gnu@14.2.10': optional: true - /@next/swc-linux-arm64-musl@14.2.10: - resolution: {integrity: sha512-n2i5o3y2jpBfXFRxDREr342BGIQCJbdAUi/K4q6Env3aSx8erM9VuKXHw5KNROK9ejFSPf0LhoSkU/ZiNdacpQ==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: false + '@next/swc-linux-arm64-musl@14.2.10': optional: true - /@next/swc-linux-x64-gnu@14.2.10: - resolution: {integrity: sha512-GXvajAWh2woTT0GKEDlkVhFNxhJS/XdDmrVHrPOA83pLzlGPQnixqxD8u3bBB9oATBKB//5e4vpACnx5Vaxdqg==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: false + '@next/swc-linux-x64-gnu@14.2.10': optional: true - /@next/swc-linux-x64-musl@14.2.10: - resolution: {integrity: sha512-opFFN5B0SnO+HTz4Wq4HaylXGFV+iHrVxd3YvREUX9K+xfc4ePbRrxqOuPOFjtSuiVouwe6uLeDtabjEIbkmDA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: false + '@next/swc-linux-x64-musl@14.2.10': optional: true - /@next/swc-win32-arm64-msvc@14.2.10: - resolution: {integrity: sha512-9NUzZuR8WiXTvv+EiU/MXdcQ1XUvFixbLIMNQiVHuzs7ZIFrJDLJDaOF1KaqttoTujpcxljM/RNAOmw1GhPPQQ==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: false + '@next/swc-win32-arm64-msvc@14.2.10': optional: true - /@next/swc-win32-ia32-msvc@14.2.10: - resolution: {integrity: sha512-fr3aEbSd1GeW3YUMBkWAu4hcdjZ6g4NBl1uku4gAn661tcxd1bHs1THWYzdsbTRLcCKLjrDZlNp6j2HTfrw+Bg==} - engines: {node: '>= 10'} - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: false + '@next/swc-win32-ia32-msvc@14.2.10': optional: true - /@next/swc-win32-x64-msvc@14.2.10: - resolution: {integrity: sha512-UjeVoRGKNL2zfbcQ6fscmgjBAS/inHBh63mjIlfPg/NG8Yn2ztqylXt5qilYb6hoHIwaU2ogHknHWWmahJjgZQ==} - engines: {node: '>= 10'} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: false + '@next/swc-win32-x64-msvc@14.2.10': optional: true - /@noble/curves@1.2.0: - resolution: {integrity: sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==} + '@noble/curves@1.2.0': dependencies: '@noble/hashes': 1.3.2 - dev: false - /@noble/curves@1.3.0: - resolution: {integrity: sha512-t01iSXPuN+Eqzb4eBX0S5oubSqXbK/xXa1Ne18Hj8f9pStxztHCE2gfboSp/dZRLSqfuLpRK2nDXDK+W9puocA==} + '@noble/curves@1.3.0': dependencies: '@noble/hashes': 1.3.3 - dev: true - /@noble/hashes@1.3.2: - resolution: {integrity: sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==} - engines: {node: '>= 16'} - dev: false + '@noble/hashes@1.3.2': {} - /@noble/hashes@1.3.3: - resolution: {integrity: sha512-V7/fPHgl+jsVPXqqeOzT8egNj2iBIVt+ECeMMG8TdcnTikP3oaBtUVqpT/gYCR68aEBJSF+XbYUxStjbFMqIIA==} - engines: {node: '>= 16'} - dev: true + '@noble/hashes@1.3.3': {} - /@noble/hashes@1.4.0: - resolution: {integrity: sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==} - engines: {node: '>= 16'} - dev: true + '@noble/hashes@1.4.0': {} - /@nodelib/fs.scandir@2.1.5: - resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} - engines: {node: '>= 8'} + '@nodelib/fs.scandir@2.1.5': dependencies: '@nodelib/fs.stat': 2.0.5 run-parallel: 1.2.0 - /@nodelib/fs.stat@2.0.5: - resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} - engines: {node: '>= 8'} + '@nodelib/fs.stat@2.0.5': {} - /@nodelib/fs.walk@1.2.8: - resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} - engines: {node: '>= 8'} + '@nodelib/fs.walk@1.2.8': dependencies: '@nodelib/fs.scandir': 2.1.5 fastq: 1.17.1 - /@npmcli/config@6.4.1: - resolution: {integrity: sha512-uSz+elSGzjCMANWa5IlbGczLYPkNI/LeR+cHrgaTqTrTSh9RHhOFA4daD2eRUz6lMtOW+Fnsb+qv7V2Zz8ML0g==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + '@npmcli/config@6.4.1': dependencies: '@npmcli/map-workspaces': 3.0.6 ci-info: 4.0.0 @@ -1515,43 +4561,24 @@ packages: read-package-json-fast: 3.0.2 semver: 7.6.0 walk-up-path: 3.0.1 - dev: true - /@npmcli/map-workspaces@3.0.6: - resolution: {integrity: sha512-tkYs0OYnzQm6iIRdfy+LcLBjcKuQCeE5YLb8KnrIlutJfheNaPvPpgoFEyEFgbjzl5PLZ3IA/BWAwRU0eHuQDA==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + '@npmcli/map-workspaces@3.0.6': dependencies: '@npmcli/name-from-folder': 2.0.0 glob: 10.3.12 minimatch: 9.0.4 read-package-json-fast: 3.0.2 - dev: true - /@npmcli/name-from-folder@2.0.0: - resolution: {integrity: sha512-pwK+BfEBZJbKdNYpHHRTNBwBoqrN/iIMO0AiGvYsp3Hoaq0WbgGSWQR6SCldZovoDpY3yje5lkFUe6gsDgJ2vg==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dev: true + '@npmcli/name-from-folder@2.0.0': {} - /@pkgjs/parseargs@0.11.0: - resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} - engines: {node: '>=14'} - requiresBuild: true - dev: true + '@pkgjs/parseargs@0.11.0': optional: true - /@pkgr/core@0.1.1: - resolution: {integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==} - engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} - dev: true + '@pkgr/core@0.1.1': {} - /@popperjs/core@2.11.8: - resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==} - dev: false + '@popperjs/core@2.11.8': {} - /@react-aria/focus@3.17.1(react@18.3.1): - resolution: {integrity: sha512-FLTySoSNqX++u0nWZJPPN5etXY0WBxaIe/YuL/GTEeuqUIuC/2bJSaw5hlsM6T2yjy6Y/VAxBcKSdAFUlU6njQ==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + '@react-aria/focus@3.17.1(react@18.3.1)': dependencies: '@react-aria/interactions': 3.21.3(react@18.3.1) '@react-aria/utils': 3.24.1(react@18.3.1) @@ -1559,34 +4586,21 @@ packages: '@swc/helpers': 0.5.2 clsx: 2.1.1 react: 18.3.1 - dev: false - /@react-aria/interactions@3.21.3(react@18.3.1): - resolution: {integrity: sha512-BWIuf4qCs5FreDJ9AguawLVS0lV9UU+sK4CCnbCNNmYqOWY+1+gRXCsnOM32K+oMESBxilAjdHW5n1hsMqYMpA==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + '@react-aria/interactions@3.21.3(react@18.3.1)': dependencies: '@react-aria/ssr': 3.9.4(react@18.3.1) '@react-aria/utils': 3.24.1(react@18.3.1) '@react-types/shared': 3.23.1(react@18.3.1) '@swc/helpers': 0.5.2 react: 18.3.1 - dev: false - /@react-aria/ssr@3.9.4(react@18.3.1): - resolution: {integrity: sha512-4jmAigVq409qcJvQyuorsmBR4+9r3+JEC60wC+Y0MZV0HCtTmm8D9guYXlJMdx0SSkgj0hHAyFm/HvPNFofCoQ==} - engines: {node: '>= 12'} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + '@react-aria/ssr@3.9.4(react@18.3.1)': dependencies: '@swc/helpers': 0.5.2 react: 18.3.1 - dev: false - /@react-aria/utils@3.24.1(react@18.3.1): - resolution: {integrity: sha512-O3s9qhPMd6n42x9sKeJ3lhu5V1Tlnzhu6Yk8QOvDuXf7UGuUjXf9mzfHJt1dYzID4l9Fwm8toczBzPM9t0jc8Q==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + '@react-aria/utils@3.24.1(react@18.3.1)': dependencies: '@react-aria/ssr': 3.9.4(react@18.3.1) '@react-stately/utils': 3.10.1(react@18.3.1) @@ -1594,108 +4608,68 @@ packages: '@swc/helpers': 0.5.2 clsx: 2.1.1 react: 18.3.1 - dev: false - /@react-stately/utils@3.10.1(react@18.3.1): - resolution: {integrity: sha512-VS/EHRyicef25zDZcM/ClpzYMC5i2YGN6uegOeQawmgfGjb02yaCX0F0zR69Pod9m2Hr3wunTbtpgVXvYbZItg==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + '@react-stately/utils@3.10.1(react@18.3.1)': dependencies: '@swc/helpers': 0.5.2 react: 18.3.1 - dev: false - /@react-types/shared@3.23.1(react@18.3.1): - resolution: {integrity: sha512-5d+3HbFDxGZjhbMBeFHRQhexMFt4pUce3okyRtUVKbbedQFUrtXSBg9VszgF2RTeQDKDkMCIQDtz5ccP/Lk1gw==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + '@react-types/shared@3.23.1(react@18.3.1)': dependencies: react: 18.3.1 - dev: false - /@scure/base@1.1.6: - resolution: {integrity: sha512-ok9AWwhcgYuGG3Zfhyqg+zwl+Wn5uE+dwC0NV/2qQkx4dABbb/bx96vWu8NSj+BNjjSjno+JRYRjle1jV08k3g==} + '@scure/base@1.1.6': {} - /@scure/bip32@1.3.2: - resolution: {integrity: sha512-N1ZhksgwD3OBlwTv3R6KFEcPojl/W4ElJOeCZdi+vuI5QmTFwLq3OFf2zd2ROpKvxFdgZ6hUpb0dx9bVNEwYCA==} + '@scure/bip32@1.3.2': dependencies: '@noble/curves': 1.2.0 '@noble/hashes': 1.3.2 '@scure/base': 1.1.6 - dev: false - /@scure/bip32@1.3.3: - resolution: {integrity: sha512-LJaN3HwRbfQK0X1xFSi0Q9amqOgzQnnDngIt+ZlsBC3Bm7/nE7K0kwshZHyaru79yIVRv/e1mQAjZyuZG6jOFQ==} + '@scure/bip32@1.3.3': dependencies: '@noble/curves': 1.3.0 '@noble/hashes': 1.3.3 '@scure/base': 1.1.6 - dev: true - /@scure/bip39@1.2.1: - resolution: {integrity: sha512-Z3/Fsz1yr904dduJD0NpiyRHhRYHdcnyh73FZWiV+/qhWi83wNJ3NWolYqCEN+ZWsUz2TWwajJggcRE9r1zUYg==} + '@scure/bip39@1.2.1': dependencies: '@noble/hashes': 1.3.2 '@scure/base': 1.1.6 - dev: false - /@scure/bip39@1.2.2: - resolution: {integrity: sha512-HYf9TUXG80beW+hGAt3TRM8wU6pQoYur9iNypTROm42dorCGmLnFe3eWjz3gOq6G62H2WRh0FCzAR1PI+29zIA==} + '@scure/bip39@1.2.2': dependencies: '@noble/hashes': 1.3.3 '@scure/base': 1.1.6 - dev: true - /@swc/counter@0.1.3: - resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} - dev: false + '@swc/counter@0.1.3': {} - /@swc/helpers@0.5.2: - resolution: {integrity: sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==} + '@swc/helpers@0.5.2': dependencies: tslib: 2.6.2 - dev: false - /@swc/helpers@0.5.5: - resolution: {integrity: sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A==} + '@swc/helpers@0.5.5': dependencies: '@swc/counter': 0.1.3 tslib: 2.6.2 - dev: false - /@tanstack/react-virtual@3.10.8(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-VbzbVGSsZlQktyLrP5nxE+vE1ZR+U0NFAWPbJLoG2+DKPwd2D7dVICTVIIaYlJqX1ZCEnYDbaOpmMwbsyhBoIA==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + '@tanstack/react-virtual@3.10.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@tanstack/virtual-core': 3.10.8 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - dev: false - /@tanstack/react-virtual@3.5.0(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-rtvo7KwuIvqK9zb0VZ5IL7fiJAEnG+0EiFZz8FUOs+2mhGqdGmjKIaT1XU7Zq0eFqL0jonLlhbayJI/J2SA/Bw==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + '@tanstack/react-virtual@3.5.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@tanstack/virtual-core': 3.5.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - dev: false - /@tanstack/virtual-core@3.10.8: - resolution: {integrity: sha512-PBu00mtt95jbKFi6Llk9aik8bnR3tR/oQP1o3TSi+iG//+Q2RTIzCEgKkHG8BB86kxMNW6O8wku+Lmi+QFR6jA==} - dev: false + '@tanstack/virtual-core@3.10.8': {} - /@tanstack/virtual-core@3.5.0: - resolution: {integrity: sha512-KnPRCkQTyqhanNC0K63GBG3wA8I+D1fQuVnAvcBF8f13akOKeQp1gSbu6f77zCxhEk727iV5oQnbHLYzHrECLg==} - dev: false + '@tanstack/virtual-core@3.5.0': {} - /@testing-library/dom@9.3.4: - resolution: {integrity: sha512-FlS4ZWlp97iiNWig0Muq8p+3rVDjRiYE+YKGbAqXOu9nwJFFOdL00kFpz42M+4huzYi86vAK1sOOfyOG45muIQ==} - engines: {node: '>=14'} + '@testing-library/dom@9.3.4': dependencies: '@babel/code-frame': 7.24.2 '@babel/runtime': 7.24.4 @@ -1705,244 +4679,149 @@ packages: dom-accessibility-api: 0.5.16 lz-string: 1.5.0 pretty-format: 27.5.1 - dev: false - /@testing-library/react@14.3.1(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-H99XjUhWQw0lTgyMN05W3xQG1Nh4lq574D8keFf1dDoNTJgp66VbJozRaczoF+wsiaPJNt/TcnfpLGufGxSrZQ==} - engines: {node: '>=14'} - peerDependencies: - react: ^18.0.0 - react-dom: ^18.0.0 + '@testing-library/react@14.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@babel/runtime': 7.24.4 '@testing-library/dom': 9.3.4 '@types/react-dom': 18.3.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - dev: false - /@theguild/remark-mermaid@0.0.5(react@18.3.1): - resolution: {integrity: sha512-e+ZIyJkEv9jabI4m7q29wZtZv+2iwPGsXJ2d46Zi7e+QcFudiyuqhLhHG/3gX3ZEB+hxTch+fpItyMS8jwbIcw==} - peerDependencies: - react: ^18.2.0 + '@theguild/remark-mermaid@0.0.5(react@18.3.1)': dependencies: mermaid: 10.9.0 react: 18.3.1 unist-util-visit: 5.0.0 transitivePeerDependencies: - supports-color - dev: false - /@theguild/remark-npm2yarn@0.2.1: - resolution: {integrity: sha512-jUTFWwDxtLEFtGZh/TW/w30ySaDJ8atKWH8dq2/IiQF61dPrGfETpl0WxD0VdBfuLOeU14/kop466oBSRO/5CA==} + '@theguild/remark-npm2yarn@0.2.1': dependencies: npm-to-yarn: 2.2.1 unist-util-visit: 5.0.0 - dev: false - /@types/acorn@4.0.6: - resolution: {integrity: sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ==} + '@types/acorn@4.0.6': dependencies: '@types/estree': 1.0.5 - /@types/aria-query@5.0.4: - resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==} - dev: false + '@types/aria-query@5.0.4': {} - /@types/change-case@2.3.1: - resolution: {integrity: sha512-HYiGjhmGInNzJjtt6ciXEfl2s8ZQGUQpPiwgWSth1fycE69hXbV/RgWH7MvSq2QPhMBzi4SGhu1vE+cMx1xB8g==} - deprecated: This is a stub types definition for change-case (https://github.com/blakeembrey/change-case). change-case provides its own type definitions, so you don't need @types/change-case installed! + '@types/change-case@2.3.1': dependencies: change-case: 4.1.2 - dev: false - /@types/concat-stream@2.0.3: - resolution: {integrity: sha512-3qe4oQAPNwVNwK4C9c8u+VJqv9kez+2MR4qJpoPFfXtgxxif1QbFusvXzK0/Wra2VX07smostI2VMmJNSpZjuQ==} + '@types/concat-stream@2.0.3': dependencies: '@types/node': 18.11.10 - dev: true - /@types/d3-scale-chromatic@3.0.3: - resolution: {integrity: sha512-laXM4+1o5ImZv3RpFAsTRn3TEkzqkytiOY0Dz0sq5cnd1dtNlk6sHLon4OvqaiJb28T0S/TdsBI3Sjsy+keJrw==} - dev: false + '@types/d3-scale-chromatic@3.0.3': {} - /@types/d3-scale@4.0.8: - resolution: {integrity: sha512-gkK1VVTr5iNiYJ7vWDI+yUFFlszhNMtVeneJ6lUTKPjprsvLLI9/tgEGiXJOnlINJA8FyA88gfnQsHbybVZrYQ==} + '@types/d3-scale@4.0.8': dependencies: '@types/d3-time': 3.0.3 - dev: false - /@types/d3-time@3.0.3: - resolution: {integrity: sha512-2p6olUZ4w3s+07q3Tm2dbiMZy5pCDfYwtLXXHUnVzXgQlZ/OyPtUz6OL382BkOuGlLXqfT+wqv8Fw2v8/0geBw==} - dev: false + '@types/d3-time@3.0.3': {} - /@types/debug@4.1.12: - resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} + '@types/debug@4.1.12': dependencies: '@types/ms': 0.7.34 - /@types/estree-jsx@1.0.5: - resolution: {integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==} + '@types/estree-jsx@1.0.5': dependencies: '@types/estree': 1.0.5 - /@types/estree@1.0.5: - resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} + '@types/estree@1.0.5': {} - /@types/hast@2.3.10: - resolution: {integrity: sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw==} + '@types/hast@2.3.10': dependencies: '@types/unist': 2.0.10 - /@types/hast@3.0.4: - resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} + '@types/hast@3.0.4': dependencies: '@types/unist': 3.0.2 - dev: false - /@types/is-empty@1.2.3: - resolution: {integrity: sha512-4J1l5d79hoIvsrKh5VUKVRA1aIdsOb10Hu5j3J2VfP/msDnfTdGPmNp2E1Wg+vs97Bktzo+MZePFFXSGoykYJw==} - dev: true + '@types/is-empty@1.2.3': {} - /@types/js-yaml@4.0.9: - resolution: {integrity: sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==} - dev: false + '@types/js-yaml@4.0.9': {} - /@types/json-schema@7.0.15: - resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - dev: true + '@types/json-schema@7.0.15': {} - /@types/katex@0.16.7: - resolution: {integrity: sha512-HMwFiRujE5PjrgwHQ25+bsLJgowjGjm5Z8FVSf0N6PwgJrwxH0QxzHYDcKsTfV3wva0vzrpqMTJS2jXPr5BMEQ==} - dev: false + '@types/katex@0.16.7': {} - /@types/lodash.clonedeep@4.5.9: - resolution: {integrity: sha512-19429mWC+FyaAhOLzsS8kZUsI+/GmBAQ0HFiCPsKGU+7pBXOQWhyrY6xNNDwUSX8SMZMJvuFVMF9O5dQOlQK9Q==} + '@types/lodash.clonedeep@4.5.9': dependencies: '@types/lodash': 4.17.0 - dev: true - /@types/lodash@4.17.0: - resolution: {integrity: sha512-t7dhREVv6dbNj0q17X12j7yDG4bD/DHYX7o5/DbDxobP0HnGPgpRz2Ej77aL7TZT3DSw13fqUTj8J4mMnqa7WA==} - dev: true + '@types/lodash@4.17.0': {} - /@types/mdast@3.0.15: - resolution: {integrity: sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==} + '@types/mdast@3.0.15': dependencies: '@types/unist': 2.0.10 - /@types/mdast@4.0.3: - resolution: {integrity: sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg==} + '@types/mdast@4.0.3': dependencies: '@types/unist': 3.0.2 - /@types/mdx@2.0.13: - resolution: {integrity: sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==} - dev: false + '@types/mdx@2.0.13': {} - /@types/ms@0.7.34: - resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==} + '@types/ms@0.7.34': {} - /@types/node@18.11.10: - resolution: {integrity: sha512-juG3RWMBOqcOuXC643OAdSA525V44cVgGV6dUDuiFtss+8Fk5x1hI93Rsld43VeJVIeqlP9I7Fn9/qaVqoEAuQ==} - dev: true + '@types/node@18.11.10': {} - /@types/prop-types@15.7.12: - resolution: {integrity: sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==} - dev: false + '@types/prop-types@15.7.12': {} - /@types/react-dom@18.3.0: - resolution: {integrity: sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==} + '@types/react-dom@18.3.0': dependencies: '@types/react': 18.3.1 - dev: false - /@types/react@18.3.1: - resolution: {integrity: sha512-V0kuGBX3+prX+DQ/7r2qsv1NsdfnCLnTgnRJ1pYnxykBhGMz+qj+box5lq7XsO5mtZsBqpjwwTu/7wszPfMBcw==} + '@types/react@18.3.1': dependencies: '@types/prop-types': 15.7.12 csstype: 3.1.3 - dev: false - /@types/supports-color@8.1.3: - resolution: {integrity: sha512-Hy6UMpxhE3j1tLpl27exp1XqHD7n8chAiNPzWfz16LPZoMMoSc4dzLl6w9qijkEb/r5O1ozdu1CWGA2L83ZeZg==} - dev: true + '@types/supports-color@8.1.3': {} - /@types/unist@2.0.10: - resolution: {integrity: sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==} + '@types/unist@2.0.10': {} - /@types/unist@3.0.2: - resolution: {integrity: sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==} + '@types/unist@3.0.2': {} - /@ungap/structured-clone@1.2.0: - resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} + '@ungap/structured-clone@1.2.0': {} - /abbrev@2.0.0: - resolution: {integrity: sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dev: true + abbrev@2.0.0: {} - /abitype@1.0.0(typescript@5.4.5): - resolution: {integrity: sha512-NMeMah//6bJ56H5XRj8QCV4AwuW6hB6zqz2LnhhLdcWVQOsXki6/Pn3APeqxCma62nXIcmZWdu1DlHWS74umVQ==} - peerDependencies: - typescript: '>=5.0.4' - zod: ^3 >=3.22.0 - peerDependenciesMeta: - typescript: - optional: true - zod: - optional: true - dependencies: + abitype@1.0.0(typescript@5.4.5)(zod@3.23.8): + optionalDependencies: typescript: 5.4.5 - dev: false + zod: 3.23.8 - /acorn-jsx@5.3.2(acorn@8.11.3): - resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} - peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + acorn-jsx@5.3.2(acorn@8.11.3): dependencies: acorn: 8.11.3 - /acorn@8.11.3: - resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} - engines: {node: '>=0.4.0'} - hasBin: true + acorn@8.11.3: {} - /aes-js@3.0.0: - resolution: {integrity: sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==} - dev: true + aes-js@3.0.0: {} - /ajv-formats@2.1.1(ajv@8.12.0): - resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} - peerDependencies: - ajv: ^8.0.0 - peerDependenciesMeta: - ajv: - optional: true - dependencies: + ajv-formats@2.1.1(ajv@8.12.0): + optionalDependencies: ajv: 8.12.0 - dev: true - /ajv@6.12.6: - resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + ajv@6.12.6: dependencies: fast-deep-equal: 3.1.3 fast-json-stable-stringify: 2.1.0 json-schema-traverse: 0.4.1 uri-js: 4.4.1 - dev: true - /ajv@8.12.0: - resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} + ajv@8.12.0: dependencies: fast-deep-equal: 3.1.3 json-schema-traverse: 1.0.0 require-from-string: 2.0.2 uri-js: 4.4.1 - dev: true - /algoliasearch@4.23.3: - resolution: {integrity: sha512-Le/3YgNvjW9zxIQMRhUHuhiUjAlKY/zsdZpfq4dlLqg6mEm0nL6yk+7f2hDOtLpxsgE4jSzDmvHL7nXdBp5feg==} + algoliasearch@4.23.3: dependencies: '@algolia/cache-browser-local-storage': 4.23.3 '@algolia/cache-common': 4.23.3 @@ -1959,209 +4838,121 @@ packages: '@algolia/requester-common': 4.23.3 '@algolia/requester-node-http': 4.23.3 '@algolia/transporter': 4.23.3 - dev: false - /ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} + ansi-regex@5.0.1: {} - /ansi-regex@6.0.1: - resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} - engines: {node: '>=12'} - dev: true + ansi-regex@6.0.1: {} - /ansi-sequence-parser@1.1.1: - resolution: {integrity: sha512-vJXt3yiaUL4UU546s3rPXlsry/RnM730G1+HkpKE012AN0sx1eOrxSu95oKDIonskeLTijMgqWZ3uDEe3NFvyg==} - dev: false + ansi-sequence-parser@1.1.1: {} - /ansi-styles@3.2.1: - resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} - engines: {node: '>=4'} + ansi-styles@3.2.1: dependencies: color-convert: 1.9.3 - /ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} + ansi-styles@4.3.0: dependencies: color-convert: 2.0.1 - /ansi-styles@5.2.0: - resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} - engines: {node: '>=10'} - dev: false + ansi-styles@5.2.0: {} - /ansi-styles@6.2.1: - resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} - engines: {node: '>=12'} - dev: true + ansi-styles@6.2.1: {} - /arch@2.2.0: - resolution: {integrity: sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==} - dev: false + arch@2.2.0: {} - /arg@1.0.0: - resolution: {integrity: sha512-Wk7TEzl1KqvTGs/uyhmHO/3XLd3t1UeU4IstvPXVzGPM522cTjqjNZ99esCkcL52sjqjo8e8CTBcWhkxvGzoAw==} - dev: false + arg@1.0.0: {} - /argparse@1.0.10: - resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + argparse@1.0.10: dependencies: sprintf-js: 1.0.3 - /argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + argparse@2.0.1: {} - /aria-query@5.1.3: - resolution: {integrity: sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==} + aria-query@5.1.3: dependencies: deep-equal: 2.2.3 - dev: false - /array-buffer-byte-length@1.0.1: - resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} - engines: {node: '>= 0.4'} + array-buffer-byte-length@1.0.1: dependencies: call-bind: 1.0.7 is-array-buffer: 3.0.4 - dev: false - /array-timsort@1.0.3: - resolution: {integrity: sha512-/+3GRL7dDAGEfM6TseQk/U+mi18TU2Ms9I3UlLdUMhz2hbvGNTKdj9xniwXfUqgYhHxRx0+8UnKkvlNwVU+cWQ==} - dev: true + array-timsort@1.0.3: {} - /array-union@2.1.0: - resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} - engines: {node: '>=8'} - dev: true + array-union@2.1.0: {} - /assertion-error@1.1.0: - resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} - dev: true + assertion-error@1.1.0: {} - /astring@1.8.6: - resolution: {integrity: sha512-ISvCdHdlTDlH5IpxQJIex7BWBywFWgjJSVdwst+/iQCoEYnyOaQ95+X1JGshuBjGp6nxKUy1jMgE3zPqN7fQdg==} - hasBin: true - dev: false + astring@1.8.6: {} - /available-typed-arrays@1.0.7: - resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} - engines: {node: '>= 0.4'} + available-typed-arrays@1.0.7: dependencies: possible-typed-array-names: 1.0.0 - dev: false - /bail@2.0.2: - resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} + bail@2.0.2: {} - /balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - dev: true + balanced-match@1.0.2: {} - /bech32@1.1.4: - resolution: {integrity: sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==} - dev: true + bech32@1.1.4: {} - /bignumber.js@9.1.2: - resolution: {integrity: sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==} - dev: true + bignumber.js@9.1.2: {} - /bn.js@4.11.6: - resolution: {integrity: sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA==} - dev: true + bn.js@4.11.6: {} - /bn.js@4.12.0: - resolution: {integrity: sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==} - dev: true + bn.js@4.12.0: {} - /bn.js@5.2.1: - resolution: {integrity: sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==} - dev: true + bn.js@5.2.1: {} - /brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + brace-expansion@1.1.11: dependencies: balanced-match: 1.0.2 concat-map: 0.0.1 - dev: true - /brace-expansion@2.0.1: - resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + brace-expansion@2.0.1: dependencies: balanced-match: 1.0.2 - dev: true - /braces@3.0.2: - resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} - engines: {node: '>=8'} + braces@3.0.2: dependencies: fill-range: 7.0.1 - /brorand@1.1.0: - resolution: {integrity: sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==} - dev: true + brorand@1.1.0: {} - /buffer-from@1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - dev: true + buffer-from@1.1.2: {} - /buffer-reverse@1.0.1: - resolution: {integrity: sha512-M87YIUBsZ6N924W57vDwT/aOu8hw7ZgdByz6ijksLjmHJELBASmYTTlNHRgjE+pTsT9oJXGaDSgqqwfdHotDUg==} - dev: true + buffer-reverse@1.0.1: {} - /bufio@1.2.1: - resolution: {integrity: sha512-9oR3zNdupcg/Ge2sSHQF3GX+kmvL/fTPvD0nd5AGLq8SjUYnTz+SlFjK/GXidndbZtIj+pVKXiWeR9w6e9wKCA==} - engines: {node: '>=14.0.0'} - dev: true + bufio@1.2.1: {} - /busboy@1.6.0: - resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} - engines: {node: '>=10.16.0'} + busboy@1.6.0: dependencies: streamsearch: 1.1.0 - dev: false - /call-bind@1.0.7: - resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} - engines: {node: '>= 0.4'} + call-bind@1.0.7: dependencies: es-define-property: 1.0.0 es-errors: 1.3.0 function-bind: 1.1.2 get-intrinsic: 1.2.4 set-function-length: 1.2.2 - dev: false - /callsites@3.1.0: - resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} - engines: {node: '>=6'} - dev: true + callsites@3.1.0: {} - /camel-case@4.1.2: - resolution: {integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==} + camel-case@4.1.2: dependencies: pascal-case: 3.1.2 tslib: 2.6.2 - dev: false - /caniuse-lite@1.0.30001614: - resolution: {integrity: sha512-jmZQ1VpmlRwHgdP1/uiKzgiAuGOfLEJsYFP4+GBou/QQ4U6IOJCB4NP1c+1p9RGLpwObcT94jA5/uO+F1vBbog==} - dev: false + caniuse-lite@1.0.30001614: {} - /capital-case@1.0.4: - resolution: {integrity: sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==} + capital-case@1.0.4: dependencies: no-case: 3.0.4 tslib: 2.6.2 upper-case-first: 2.0.2 - dev: false - /ccount@2.0.1: - resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} + ccount@2.0.1: {} - /chai@4.4.1: - resolution: {integrity: sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==} - engines: {node: '>=4'} + chai@4.4.1: dependencies: assertion-error: 1.1.0 check-error: 1.0.3 @@ -2170,46 +4961,31 @@ packages: loupe: 2.3.7 pathval: 1.1.1 type-detect: 4.0.8 - dev: true - /chalk-template@1.1.0: - resolution: {integrity: sha512-T2VJbcDuZQ0Tb2EWwSotMPJjgpy1/tGee1BTpUNsGZ/qgNjV2t7Mvu+d4600U564nbLesN1x2dPL+xii174Ekg==} - engines: {node: '>=14.16'} + chalk-template@1.1.0: dependencies: chalk: 5.3.0 - dev: true - /chalk@2.3.0: - resolution: {integrity: sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==} - engines: {node: '>=4'} + chalk@2.3.0: dependencies: ansi-styles: 3.2.1 escape-string-regexp: 1.0.5 supports-color: 4.5.0 - dev: false - /chalk@2.4.2: - resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} - engines: {node: '>=4'} + chalk@2.4.2: dependencies: ansi-styles: 3.2.1 escape-string-regexp: 1.0.5 supports-color: 5.5.0 - /chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} + chalk@4.1.2: dependencies: ansi-styles: 4.3.0 supports-color: 7.2.0 - /chalk@5.3.0: - resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - dev: true + chalk@5.3.0: {} - /change-case@4.1.2: - resolution: {integrity: sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A==} + change-case@4.1.2: dependencies: camel-case: 4.1.2 capital-case: 1.0.4 @@ -2223,245 +4999,151 @@ packages: sentence-case: 3.0.4 snake-case: 3.0.4 tslib: 2.6.2 - dev: false - /character-entities-html4@2.1.0: - resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} + character-entities-html4@2.1.0: {} - /character-entities-legacy@1.1.4: - resolution: {integrity: sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==} - dev: true + character-entities-legacy@1.1.4: {} - /character-entities-legacy@3.0.0: - resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} + character-entities-legacy@3.0.0: {} - /character-entities@1.2.4: - resolution: {integrity: sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==} - dev: true + character-entities@1.2.4: {} - /character-entities@2.0.2: - resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} + character-entities@2.0.2: {} - /character-reference-invalid@1.1.4: - resolution: {integrity: sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==} - dev: true + character-reference-invalid@1.1.4: {} - /character-reference-invalid@2.0.1: - resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} + character-reference-invalid@2.0.1: {} - /check-error@1.0.3: - resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} + check-error@1.0.3: dependencies: get-func-name: 2.0.2 - dev: true - /ci-info@4.0.0: - resolution: {integrity: sha512-TdHqgGf9odd8SXNuxtUBVx8Nv+qZOejE6qyqiy5NtbYYQOeFa6zmHkxlPzmaLxWWHsU6nJmB7AETdVPi+2NBUg==} - engines: {node: '>=8'} - dev: true + ci-info@4.0.0: {} - /clear-module@4.1.2: - resolution: {integrity: sha512-LWAxzHqdHsAZlPlEyJ2Poz6AIs384mPeqLVCru2p0BrP9G/kVGuhNyZYClLO6cXlnuJjzC8xtsJIuMjKqLXoAw==} - engines: {node: '>=8'} + clear-module@4.1.2: dependencies: parent-module: 2.0.0 resolve-from: 5.0.0 - dev: true - /client-only@0.0.1: - resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} - dev: false + client-only@0.0.1: {} - /clipboardy@1.2.2: - resolution: {integrity: sha512-16KrBOV7bHmHdxcQiCvfUFYVFyEah4FI8vYT1Fr7CGSA4G+xBWMEfUEQJS1hxeHGtI9ju1Bzs9uXSbj5HZKArw==} - engines: {node: '>=4'} + clipboardy@1.2.2: dependencies: arch: 2.2.0 execa: 0.8.0 - dev: false - /clsx@2.1.1: - resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} - engines: {node: '>=6'} - dev: false + clsx@2.1.1: {} - /color-convert@1.9.3: - resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + color-convert@1.9.3: dependencies: color-name: 1.1.3 - /color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} + color-convert@2.0.1: dependencies: color-name: 1.1.4 - /color-name@1.1.3: - resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + color-name@1.1.3: {} - /color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + color-name@1.1.4: {} - /comma-separated-tokens@2.0.3: - resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} - dev: false + comma-separated-tokens@2.0.3: {} - /commander@12.0.0: - resolution: {integrity: sha512-MwVNWlYjDTtOjX5PiD7o5pK0UrFU/OYgcJfjjK4RaHZETNtjJqrZa9Y9ds88+A+f+d5lv+561eZ+yCKoS3gbAA==} - engines: {node: '>=18'} - dev: true + commander@12.0.0: {} - /commander@7.2.0: - resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} - engines: {node: '>= 10'} - dev: false + commander@7.2.0: {} - /commander@8.3.0: - resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} - engines: {node: '>= 12'} - dev: false + commander@8.3.0: {} - /comment-json@4.2.3: - resolution: {integrity: sha512-SsxdiOf064DWoZLH799Ata6u7iV658A11PlWtZATDlXPpKGJnbJZ5Z24ybixAi+LUUqJ/GKowAejtC5GFUG7Tw==} - engines: {node: '>= 6'} + comment-json@4.2.3: dependencies: array-timsort: 1.0.3 core-util-is: 1.0.3 esprima: 4.0.1 has-own-prop: 2.0.0 repeat-string: 1.6.1 - dev: true - /compute-scroll-into-view@3.1.0: - resolution: {integrity: sha512-rj8l8pD4bJ1nx+dAkMhV1xB5RuZEyVysfxJqB1pRchh1KVvwOv9b7CGB8ZfjTImVv2oF+sYMUkMZq6Na5Ftmbg==} - dev: false + compute-scroll-into-view@3.1.0: {} - /concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - dev: true + concat-map@0.0.1: {} - /concat-stream@2.0.0: - resolution: {integrity: sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==} - engines: {'0': node >= 6.0} + concat-stream@2.0.0: dependencies: buffer-from: 1.1.2 inherits: 2.0.4 readable-stream: 3.6.2 typedarray: 0.0.6 - dev: true - /configstore@6.0.0: - resolution: {integrity: sha512-cD31W1v3GqUlQvbBCGcXmd2Nj9SvLDOP1oQ0YFuLETufzSPaKp11rYBsSOm7rCsW3OnIRAFM3OxRhceaXNYHkA==} - engines: {node: '>=12'} + configstore@6.0.0: dependencies: dot-prop: 6.0.1 graceful-fs: 4.2.11 unique-string: 3.0.0 write-file-atomic: 3.0.3 xdg-basedir: 5.1.0 - dev: true - /constant-case@3.0.4: - resolution: {integrity: sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ==} + constant-case@3.0.4: dependencies: no-case: 3.0.4 tslib: 2.6.2 upper-case: 2.0.2 - dev: false - /core-util-is@1.0.3: - resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} - dev: true + core-util-is@1.0.3: {} - /cose-base@1.0.3: - resolution: {integrity: sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg==} + cose-base@1.0.3: dependencies: layout-base: 1.0.2 - dev: false - /cross-spawn@5.1.0: - resolution: {integrity: sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==} + cross-spawn@5.1.0: dependencies: lru-cache: 4.1.5 shebang-command: 1.2.0 which: 1.3.1 - dev: false - /cross-spawn@7.0.3: - resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} - engines: {node: '>= 8'} + cross-spawn@7.0.3: dependencies: path-key: 3.1.1 shebang-command: 2.0.0 which: 2.0.2 - dev: true - /crypto-js@4.2.0: - resolution: {integrity: sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==} - dev: true + crypto-js@4.2.0: {} - /crypto-random-string@4.0.0: - resolution: {integrity: sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==} - engines: {node: '>=12'} + crypto-random-string@4.0.0: dependencies: type-fest: 1.4.0 - dev: true - /cspell-config-lib@8.7.0: - resolution: {integrity: sha512-depsd01GbLBo71/tfRrL5iECWQLS4CjCxA9C01dVkFAJqVB0s+K9KLKjTlq5aHOhcvo9Z3dHV+bGQCf5/Q7bfw==} - engines: {node: '>=18'} + cspell-config-lib@8.7.0: dependencies: '@cspell/cspell-types': 8.7.0 comment-json: 4.2.3 yaml: 2.4.2 - dev: true - /cspell-dictionary@8.7.0: - resolution: {integrity: sha512-S6IpZSzIMxlOO/33NgCOuP0TPH2mZbw8d5CP44z5jajflloq8l74MeJLkeDzYfCRcm0Rtk0A5drBeMg+Ai34OA==} - engines: {node: '>=18'} + cspell-dictionary@8.7.0: dependencies: '@cspell/cspell-pipe': 8.7.0 '@cspell/cspell-types': 8.7.0 cspell-trie-lib: 8.7.0 fast-equals: 5.0.1 gensequence: 7.0.0 - dev: true - /cspell-gitignore@8.7.0: - resolution: {integrity: sha512-yvUZ86qyopUpDgn+YXP1qTpUe/lp65ZFvpMtw21lWHTFlg1OWKntr349EQU/5ben/K6koxk1FiElCBV7Lr4uFg==} - engines: {node: '>=18'} - hasBin: true + cspell-gitignore@8.7.0: dependencies: cspell-glob: 8.7.0 find-up-simple: 1.0.0 - dev: true - /cspell-glob@8.7.0: - resolution: {integrity: sha512-AMdfx0gvROA/aIL8t8b5Y5NtMgscGZELFj6WhCSZiQSuWRxXUKiLGGLUFjx2y0hgXN9LUYOo6aBjvhnxI/v71g==} - engines: {node: '>=18'} + cspell-glob@8.7.0: dependencies: micromatch: 4.0.5 - dev: true - /cspell-grammar@8.7.0: - resolution: {integrity: sha512-SGcXc7322wU2WNRi7vtpToWDXTqZHhxqvR+aIXHT2kkxlMSWp3Rvfpshd0ckgY54nZtgw7R/JtKND2jeACRpwQ==} - engines: {node: '>=18'} - hasBin: true + cspell-grammar@8.7.0: dependencies: '@cspell/cspell-pipe': 8.7.0 '@cspell/cspell-types': 8.7.0 - dev: true - /cspell-io@8.7.0: - resolution: {integrity: sha512-o7OltyyvVkRG1gQrIqGpN5pUkHNnv6rvihb7Qu6cJ8jITinLGuWJuEQpgt0eF5yIr624jDbFwSzAxsFox8riQg==} - engines: {node: '>=18'} + cspell-io@8.7.0: dependencies: '@cspell/cspell-service-bus': 8.7.0 - dev: true - /cspell-lib@8.7.0: - resolution: {integrity: sha512-qDSHZGekwiDmouYRECTQokE+hgAuPqREm+Hb+G3DoIo3ZK5H47TtEUo8fNCw22XsKefcF8X28LiyoZwiYHVpSg==} - engines: {node: '>=18'} + cspell-lib@8.7.0: dependencies: '@cspell/cspell-bundled-dicts': 8.7.0 '@cspell/cspell-pipe': 8.7.0 @@ -2484,21 +5166,14 @@ packages: resolve-from: 5.0.0 vscode-languageserver-textdocument: 1.0.11 vscode-uri: 3.0.8 - dev: true - /cspell-trie-lib@8.7.0: - resolution: {integrity: sha512-W3Nh2cO7gMV91r+hLqyTMgKlvRl4W5diKs5YiyOxjZumRkMBy42IzcNYtgIIacOxghklv96F5Bd1Vx/zY6ylGA==} - engines: {node: '>=18'} + cspell-trie-lib@8.7.0: dependencies: '@cspell/cspell-pipe': 8.7.0 '@cspell/cspell-types': 8.7.0 gensequence: 7.0.0 - dev: true - /cspell@8.7.0: - resolution: {integrity: sha512-77nRPgLl240C6FK8RKVKo34lP15Lzp/6bk+SKYJFwUKKXlcgWXDis+Lw4JolA741/JgHtuxmhW1C8P7dCKjJ3w==} - engines: {node: '>=18'} - hasBin: true + cspell@8.7.0: dependencies: '@cspell/cspell-json-reporter': 8.7.0 '@cspell/cspell-pipe': 8.7.0 @@ -2518,241 +5193,134 @@ packages: semver: 7.6.0 strip-ansi: 7.1.0 vscode-uri: 3.0.8 - dev: true - - /csstype@3.1.3: - resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} - dev: false - - /cytoscape-cose-bilkent@4.1.0(cytoscape@3.29.2): - resolution: {integrity: sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ==} - peerDependencies: - cytoscape: ^3.2.0 + + csstype@3.1.3: {} + + cytoscape-cose-bilkent@4.1.0(cytoscape@3.29.2): dependencies: cose-base: 1.0.3 cytoscape: 3.29.2 - dev: false - /cytoscape@3.29.2: - resolution: {integrity: sha512-2G1ycU28Nh7OHT9rkXRLpCDP30MKH1dXJORZuBhtEhEW7pKwgPi77ImqlCWinouyE1PNepIOGZBOrE84DG7LyQ==} - engines: {node: '>=0.10'} - dev: false + cytoscape@3.29.2: {} - /d3-array@2.12.1: - resolution: {integrity: sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==} + d3-array@2.12.1: dependencies: internmap: 1.0.1 - dev: false - /d3-array@3.2.4: - resolution: {integrity: sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==} - engines: {node: '>=12'} + d3-array@3.2.4: dependencies: internmap: 2.0.3 - dev: false - /d3-axis@3.0.0: - resolution: {integrity: sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==} - engines: {node: '>=12'} - dev: false + d3-axis@3.0.0: {} - /d3-brush@3.0.0: - resolution: {integrity: sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==} - engines: {node: '>=12'} + d3-brush@3.0.0: dependencies: d3-dispatch: 3.0.1 d3-drag: 3.0.0 d3-interpolate: 3.0.1 d3-selection: 3.0.0 d3-transition: 3.0.1(d3-selection@3.0.0) - dev: false - /d3-chord@3.0.1: - resolution: {integrity: sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==} - engines: {node: '>=12'} + d3-chord@3.0.1: dependencies: d3-path: 3.1.0 - dev: false - /d3-color@3.1.0: - resolution: {integrity: sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==} - engines: {node: '>=12'} - dev: false + d3-color@3.1.0: {} - /d3-contour@4.0.2: - resolution: {integrity: sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==} - engines: {node: '>=12'} + d3-contour@4.0.2: dependencies: d3-array: 3.2.4 - dev: false - /d3-delaunay@6.0.4: - resolution: {integrity: sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==} - engines: {node: '>=12'} + d3-delaunay@6.0.4: dependencies: delaunator: 5.0.1 - dev: false - /d3-dispatch@3.0.1: - resolution: {integrity: sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==} - engines: {node: '>=12'} - dev: false + d3-dispatch@3.0.1: {} - /d3-drag@3.0.0: - resolution: {integrity: sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==} - engines: {node: '>=12'} + d3-drag@3.0.0: dependencies: d3-dispatch: 3.0.1 d3-selection: 3.0.0 - dev: false - /d3-dsv@3.0.1: - resolution: {integrity: sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==} - engines: {node: '>=12'} - hasBin: true + d3-dsv@3.0.1: dependencies: commander: 7.2.0 iconv-lite: 0.6.3 rw: 1.3.3 - dev: false - /d3-ease@3.0.1: - resolution: {integrity: sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==} - engines: {node: '>=12'} - dev: false + d3-ease@3.0.1: {} - /d3-fetch@3.0.1: - resolution: {integrity: sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==} - engines: {node: '>=12'} + d3-fetch@3.0.1: dependencies: d3-dsv: 3.0.1 - dev: false - /d3-force@3.0.0: - resolution: {integrity: sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==} - engines: {node: '>=12'} + d3-force@3.0.0: dependencies: d3-dispatch: 3.0.1 d3-quadtree: 3.0.1 d3-timer: 3.0.1 - dev: false - /d3-format@3.1.0: - resolution: {integrity: sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==} - engines: {node: '>=12'} - dev: false + d3-format@3.1.0: {} - /d3-geo@3.1.1: - resolution: {integrity: sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==} - engines: {node: '>=12'} + d3-geo@3.1.1: dependencies: d3-array: 3.2.4 - dev: false - /d3-hierarchy@3.1.2: - resolution: {integrity: sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==} - engines: {node: '>=12'} - dev: false + d3-hierarchy@3.1.2: {} - /d3-interpolate@3.0.1: - resolution: {integrity: sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==} - engines: {node: '>=12'} + d3-interpolate@3.0.1: dependencies: d3-color: 3.1.0 - dev: false - /d3-path@1.0.9: - resolution: {integrity: sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==} - dev: false + d3-path@1.0.9: {} - /d3-path@3.1.0: - resolution: {integrity: sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==} - engines: {node: '>=12'} - dev: false + d3-path@3.1.0: {} - /d3-polygon@3.0.1: - resolution: {integrity: sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==} - engines: {node: '>=12'} - dev: false + d3-polygon@3.0.1: {} - /d3-quadtree@3.0.1: - resolution: {integrity: sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==} - engines: {node: '>=12'} - dev: false + d3-quadtree@3.0.1: {} - /d3-random@3.0.1: - resolution: {integrity: sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==} - engines: {node: '>=12'} - dev: false + d3-random@3.0.1: {} - /d3-sankey@0.12.3: - resolution: {integrity: sha512-nQhsBRmM19Ax5xEIPLMY9ZmJ/cDvd1BG3UVvt5h3WRxKg5zGRbvnteTyWAbzeSvlh3tW7ZEmq4VwR5mB3tutmQ==} + d3-sankey@0.12.3: dependencies: d3-array: 2.12.1 d3-shape: 1.3.7 - dev: false - /d3-scale-chromatic@3.1.0: - resolution: {integrity: sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==} - engines: {node: '>=12'} + d3-scale-chromatic@3.1.0: dependencies: d3-color: 3.1.0 d3-interpolate: 3.0.1 - dev: false - /d3-scale@4.0.2: - resolution: {integrity: sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==} - engines: {node: '>=12'} + d3-scale@4.0.2: dependencies: d3-array: 3.2.4 d3-format: 3.1.0 d3-interpolate: 3.0.1 d3-time: 3.1.0 d3-time-format: 4.1.0 - dev: false - /d3-selection@3.0.0: - resolution: {integrity: sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==} - engines: {node: '>=12'} - dev: false + d3-selection@3.0.0: {} - /d3-shape@1.3.7: - resolution: {integrity: sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==} + d3-shape@1.3.7: dependencies: d3-path: 1.0.9 - dev: false - /d3-shape@3.2.0: - resolution: {integrity: sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==} - engines: {node: '>=12'} + d3-shape@3.2.0: dependencies: d3-path: 3.1.0 - dev: false - /d3-time-format@4.1.0: - resolution: {integrity: sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==} - engines: {node: '>=12'} + d3-time-format@4.1.0: dependencies: d3-time: 3.1.0 - dev: false - /d3-time@3.1.0: - resolution: {integrity: sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==} - engines: {node: '>=12'} + d3-time@3.1.0: dependencies: d3-array: 3.2.4 - dev: false - /d3-timer@3.0.1: - resolution: {integrity: sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==} - engines: {node: '>=12'} - dev: false + d3-timer@3.0.1: {} - /d3-transition@3.0.1(d3-selection@3.0.0): - resolution: {integrity: sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==} - engines: {node: '>=12'} - peerDependencies: - d3-selection: 2 - 3 + d3-transition@3.0.1(d3-selection@3.0.0): dependencies: d3-color: 3.1.0 d3-dispatch: 3.0.1 @@ -2760,22 +5328,16 @@ packages: d3-interpolate: 3.0.1 d3-selection: 3.0.0 d3-timer: 3.0.1 - dev: false - /d3-zoom@3.0.0: - resolution: {integrity: sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==} - engines: {node: '>=12'} + d3-zoom@3.0.0: dependencies: d3-dispatch: 3.0.1 d3-drag: 3.0.0 d3-interpolate: 3.0.1 d3-selection: 3.0.0 d3-transition: 3.0.1(d3-selection@3.0.0) - dev: false - /d3@7.9.0: - resolution: {integrity: sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==} - engines: {node: '>=12'} + d3@7.9.0: dependencies: d3-array: 3.2.4 d3-axis: 3.0.0 @@ -2807,45 +5369,27 @@ packages: d3-timer: 3.0.1 d3-transition: 3.0.1(d3-selection@3.0.0) d3-zoom: 3.0.0 - dev: false - /dagre-d3-es@7.0.10: - resolution: {integrity: sha512-qTCQmEhcynucuaZgY5/+ti3X/rnszKZhEQH/ZdWdtP1tA/y3VoHJzcVrO9pjjJCNpigfscAtoUB5ONcd2wNn0A==} + dagre-d3-es@7.0.10: dependencies: d3: 7.9.0 lodash-es: 4.17.21 - dev: false - /dayjs@1.11.11: - resolution: {integrity: sha512-okzr3f11N6WuqYtZSvm+F776mB41wRZMhKP+hc34YdW+KmtYYK9iqvHSwo2k9FEH3fhGXvOPV6yz2IcSrfRUDg==} - dev: false + dayjs@1.11.11: {} - /debug@4.3.4: - resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true + debug@4.3.4: dependencies: ms: 2.1.2 - /decode-named-character-reference@1.0.2: - resolution: {integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==} + decode-named-character-reference@1.0.2: dependencies: character-entities: 2.0.2 - /deep-eql@4.1.3: - resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} - engines: {node: '>=6'} + deep-eql@4.1.3: dependencies: type-detect: 4.0.8 - dev: true - /deep-equal@2.2.3: - resolution: {integrity: sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==} - engines: {node: '>= 0.4'} + deep-equal@2.2.3: dependencies: array-buffer-byte-length: 1.0.1 call-bind: 1.0.7 @@ -2865,95 +5409,59 @@ packages: which-boxed-primitive: 1.0.2 which-collection: 1.0.2 which-typed-array: 1.1.15 - dev: false - /deep-is@0.1.4: - resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} - dev: true + deep-is@0.1.4: {} - /define-data-property@1.1.4: - resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} - engines: {node: '>= 0.4'} + define-data-property@1.1.4: dependencies: es-define-property: 1.0.0 es-errors: 1.3.0 gopd: 1.0.1 - dev: false - /define-properties@1.2.1: - resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} - engines: {node: '>= 0.4'} + define-properties@1.2.1: dependencies: define-data-property: 1.1.4 has-property-descriptors: 1.0.2 object-keys: 1.1.1 - dev: false - /delaunator@5.0.1: - resolution: {integrity: sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw==} + delaunator@5.0.1: dependencies: robust-predicates: 3.0.2 - dev: false - /dequal@2.0.3: - resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} - engines: {node: '>=6'} + dequal@2.0.3: {} - /devlop@1.1.0: - resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + devlop@1.1.0: dependencies: dequal: 2.0.3 - /diff@5.2.0: - resolution: {integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==} - engines: {node: '>=0.3.1'} + diff@5.2.0: {} - /dir-glob@3.0.1: - resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} - engines: {node: '>=8'} + dir-glob@3.0.1: dependencies: path-type: 4.0.0 - dev: true - /doctrine@3.0.0: - resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} - engines: {node: '>=6.0.0'} + doctrine@3.0.0: dependencies: esutils: 2.0.3 - dev: true - /dom-accessibility-api@0.5.16: - resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==} - dev: false + dom-accessibility-api@0.5.16: {} - /dompurify@3.1.1: - resolution: {integrity: sha512-tVP8C/GJwnABOn/7cx/ymx/hXpmBfWIPihC1aOEvS8GbMqy3pgeYtJk1HXN3CO7tu+8bpY18f6isjR5Cymj0TQ==} - dev: false + dompurify@3.1.7: {} - /dot-case@3.0.4: - resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} + dot-case@3.0.4: dependencies: no-case: 3.0.4 tslib: 2.6.2 - dev: false - /dot-prop@6.0.1: - resolution: {integrity: sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==} - engines: {node: '>=10'} + dot-prop@6.0.1: dependencies: is-obj: 2.0.0 - dev: true - /eastasianwidth@0.2.0: - resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - dev: true + eastasianwidth@0.2.0: {} - /elkjs@0.9.3: - resolution: {integrity: sha512-f/ZeWvW/BCXbhGEf1Ujp29EASo/lk1FDnETgNKwJrsVvGZhUWCZyg3xLJjAsxfOmt8KjswHmI5EwCQcPMpOYhQ==} - dev: false + elkjs@0.9.3: {} - /elliptic@6.5.4: - resolution: {integrity: sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==} + elliptic@6.5.4: dependencies: bn.js: 4.12.0 brorand: 1.1.0 @@ -2962,45 +5470,26 @@ packages: inherits: 2.0.4 minimalistic-assert: 1.0.1 minimalistic-crypto-utils: 1.0.1 - dev: true - /emoji-regex@10.3.0: - resolution: {integrity: sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==} - dev: true + emoji-regex@10.3.0: {} - /emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - dev: true + emoji-regex@8.0.0: {} - /emoji-regex@9.2.2: - resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} - dev: true + emoji-regex@9.2.2: {} - /entities@4.5.0: - resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} - engines: {node: '>=0.12'} - dev: false + entities@4.5.0: {} - /error-ex@1.3.2: - resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + error-ex@1.3.2: dependencies: is-arrayish: 0.2.1 - dev: true - /es-define-property@1.0.0: - resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} - engines: {node: '>= 0.4'} + es-define-property@1.0.0: dependencies: get-intrinsic: 1.2.4 - dev: false - /es-errors@1.3.0: - resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} - engines: {node: '>= 0.4'} - dev: false + es-errors@1.3.0: {} - /es-get-iterator@1.1.3: - resolution: {integrity: sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==} + es-get-iterator@1.1.3: dependencies: call-bind: 1.0.7 get-intrinsic: 1.2.4 @@ -3011,26 +5500,14 @@ packages: is-string: 1.0.7 isarray: 2.0.5 stop-iteration-iterator: 1.0.0 - dev: false - /escape-string-regexp@1.0.5: - resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} - engines: {node: '>=0.8.0'} + escape-string-regexp@1.0.5: {} - /escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} - dev: true + escape-string-regexp@4.0.0: {} - /escape-string-regexp@5.0.0: - resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} - engines: {node: '>=12'} + escape-string-regexp@5.0.0: {} - /eslint-mdx@2.3.4(eslint@8.57.0): - resolution: {integrity: sha512-u4NszEUyoGtR7Q0A4qs0OymsEQdCO6yqWlTzDa9vGWsK7aMotdnW0hqifHTkf6lEtA2vHk2xlkWHTCrhYLyRbw==} - engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} - peerDependencies: - eslint: '>=8.0.0' + eslint-mdx@2.3.4(eslint@8.57.0): dependencies: acorn: 8.11.3 acorn-jsx: 5.3.2(acorn@8.11.3) @@ -3049,25 +5526,15 @@ packages: vfile: 5.3.7 transitivePeerDependencies: - supports-color - dev: true - /eslint-plugin-markdown@3.0.1(eslint@8.57.0): - resolution: {integrity: sha512-8rqoc148DWdGdmYF6WSQFT3uQ6PO7zXYgeBpHAOAakX/zpq+NvFYbDA/H7PYzHajwtmaOzAwfxyl++x0g1/N9A==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + eslint-plugin-markdown@3.0.1(eslint@8.57.0): dependencies: eslint: 8.57.0 mdast-util-from-markdown: 0.8.5 transitivePeerDependencies: - supports-color - dev: true - /eslint-plugin-mdx@2.3.4(eslint@8.57.0): - resolution: {integrity: sha512-kr6tgaifKL+AVGYMtdYc2VCsIjfYQXuUCKz4rK58d2DpnPFHrmgXIOC7NcMvaEld+VOEpxBSCCnjnsf4IVCQGg==} - engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} - peerDependencies: - eslint: '>=8.0.0' + eslint-plugin-mdx@2.3.4(eslint@8.57.0): dependencies: eslint: 8.57.0 eslint-mdx: 2.3.4(eslint@8.57.0) @@ -3080,25 +5547,15 @@ packages: vfile: 5.3.7 transitivePeerDependencies: - supports-color - dev: true - /eslint-scope@7.2.2: - resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + eslint-scope@7.2.2: dependencies: esrecurse: 4.3.0 estraverse: 5.3.0 - dev: true - /eslint-visitor-keys@3.4.3: - resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dev: true + eslint-visitor-keys@3.4.3: {} - /eslint@8.57.0: - resolution: {integrity: sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - hasBin: true + eslint@8.57.0: dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) '@eslint-community/regexpp': 4.10.0 @@ -3140,107 +5597,70 @@ packages: text-table: 0.2.0 transitivePeerDependencies: - supports-color - dev: true - /espree@9.6.1: - resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + espree@9.6.1: dependencies: acorn: 8.11.3 acorn-jsx: 5.3.2(acorn@8.11.3) eslint-visitor-keys: 3.4.3 - dev: true - /esprima@4.0.1: - resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} - engines: {node: '>=4'} - hasBin: true + esprima@4.0.1: {} - /esquery@1.5.0: - resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} - engines: {node: '>=0.10'} + esquery@1.5.0: dependencies: estraverse: 5.3.0 - dev: true - /esrecurse@4.3.0: - resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} - engines: {node: '>=4.0'} + esrecurse@4.3.0: dependencies: estraverse: 5.3.0 - dev: true - /estraverse@5.3.0: - resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} - engines: {node: '>=4.0'} - dev: true + estraverse@5.3.0: {} - /estree-util-attach-comments@2.1.1: - resolution: {integrity: sha512-+5Ba/xGGS6mnwFbXIuQiDPTbuTxuMCooq3arVv7gPZtYpjp+VXH/NkHAP35OOefPhNG/UGqU3vt/LTABwcHX0w==} + estree-util-attach-comments@2.1.1: dependencies: '@types/estree': 1.0.5 - dev: false - /estree-util-build-jsx@2.2.2: - resolution: {integrity: sha512-m56vOXcOBuaF+Igpb9OPAy7f9w9OIkb5yhjsZuaPm7HoGi4oTOQi0h2+yZ+AtKklYFZ+rPC4n0wYCJCEU1ONqg==} + estree-util-build-jsx@2.2.2: dependencies: '@types/estree-jsx': 1.0.5 estree-util-is-identifier-name: 2.1.0 estree-walker: 3.0.3 - dev: false - /estree-util-is-identifier-name@2.1.0: - resolution: {integrity: sha512-bEN9VHRyXAUOjkKVQVvArFym08BTWB0aJPppZZr0UNyAqWsLaVfAqP7hbaTJjzHifmB5ebnR8Wm7r7yGN/HonQ==} + estree-util-is-identifier-name@2.1.0: {} - /estree-util-to-js@1.2.0: - resolution: {integrity: sha512-IzU74r1PK5IMMGZXUVZbmiu4A1uhiPgW5hm1GjcOfr4ZzHaMPpLNJjR7HjXiIOzi25nZDrgFTobHTkV5Q6ITjA==} + estree-util-to-js@1.2.0: dependencies: '@types/estree-jsx': 1.0.5 astring: 1.8.6 source-map: 0.7.4 - dev: false - /estree-util-value-to-estree@1.3.0: - resolution: {integrity: sha512-Y+ughcF9jSUJvncXwqRageavjrNPAI+1M/L3BI3PyLp1nmgYTGUXU6t5z1Y7OWuThoDdhPME07bQU+d5LxdJqw==} - engines: {node: '>=12.0.0'} + estree-util-value-to-estree@1.3.0: dependencies: is-plain-obj: 3.0.0 - dev: false - /estree-util-visit@1.2.1: - resolution: {integrity: sha512-xbgqcrkIVbIG+lI/gzbvd9SGTJL4zqJKBFttUl5pP27KhAjtMKbX/mQXJ7qgyXpMgVy/zvpm0xoQQaGL8OloOw==} + estree-util-visit@1.2.1: dependencies: '@types/estree-jsx': 1.0.5 '@types/unist': 2.0.10 - /estree-walker@3.0.3: - resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + estree-walker@3.0.3: dependencies: '@types/estree': 1.0.5 - dev: false - /esutils@2.0.3: - resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} - engines: {node: '>=0.10.0'} - dev: true + esutils@2.0.3: {} - /ethereum-bloom-filters@1.1.0: - resolution: {integrity: sha512-J1gDRkLpuGNvWYzWslBQR9cDV4nd4kfvVTE/Wy4Kkm4yb3EYRSlyi0eB/inTsSTTVyA0+HyzHgbr95Fn/Z1fSw==} + ethereum-bloom-filters@1.1.0: dependencies: '@noble/hashes': 1.4.0 - dev: true - /ethereum-cryptography@2.1.3: - resolution: {integrity: sha512-BlwbIL7/P45W8FGW2r7LGuvoEZ+7PWsniMvQ4p5s2xCyw9tmaDlpfsN9HjAucbF+t/qpVHwZUisgfK24TCW8aA==} + ethereum-cryptography@2.1.3: dependencies: '@noble/curves': 1.3.0 '@noble/hashes': 1.3.3 '@scure/bip32': 1.3.3 '@scure/bip39': 1.2.2 - dev: true - /ethers@5.7.2: - resolution: {integrity: sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==} + ethers@5.7.2: dependencies: '@ethersproject/abi': 5.7.0 '@ethersproject/abstract-provider': 5.7.0 @@ -3275,19 +5695,13 @@ packages: transitivePeerDependencies: - bufferutil - utf-8-validate - dev: true - /ethjs-unit@0.1.6: - resolution: {integrity: sha512-/Sn9Y0oKl0uqQuvgFk/zQgR7aw1g36qX/jzSQ5lSwlO0GigPymk4eGQfeNTD03w1dPOqfz8V77Cy43jH56pagw==} - engines: {node: '>=6.5.0', npm: '>=3'} + ethjs-unit@0.1.6: dependencies: bn.js: 4.11.6 number-to-bn: 1.7.0 - dev: true - /execa@0.8.0: - resolution: {integrity: sha512-zDWS+Rb1E8BlqqhALSt9kUhss8Qq4nN3iof3gsOdyINksElaPyNBtKUMTR62qhvgVWR0CqCX7sdnKe4MnUbFEA==} - engines: {node: '>=4'} + execa@0.8.0: dependencies: cross-spawn: 5.1.0 get-stream: 3.0.0 @@ -3296,29 +5710,18 @@ packages: p-finally: 1.0.0 signal-exit: 3.0.7 strip-eof: 1.0.0 - dev: false - /extend-shallow@2.0.1: - resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} - engines: {node: '>=0.10.0'} + extend-shallow@2.0.1: dependencies: is-extendable: 0.1.1 - /extend@3.0.2: - resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + extend@3.0.2: {} - /fast-deep-equal@3.1.3: - resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - dev: true + fast-deep-equal@3.1.3: {} - /fast-equals@5.0.1: - resolution: {integrity: sha512-WF1Wi8PwwSY7/6Kx0vKXtw8RwuSGoM1bvDaJbu7MxDlR1vovZjIAKrnzyrThgAjm6JDTu0fVgWXDlMGspodfoQ==} - engines: {node: '>=6.0.0'} - dev: true + fast-equals@5.0.1: {} - /fast-glob@3.3.2: - resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} - engines: {node: '>=8.6.0'} + fast-glob@3.3.2: dependencies: '@nodelib/fs.stat': 2.0.5 '@nodelib/fs.walk': 1.2.8 @@ -3326,204 +5729,122 @@ packages: merge2: 1.4.1 micromatch: 4.0.5 - /fast-json-stable-stringify@2.1.0: - resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} - dev: true + fast-json-stable-stringify@2.1.0: {} - /fast-levenshtein@2.0.6: - resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - dev: true + fast-levenshtein@2.0.6: {} - /fastq@1.17.1: - resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + fastq@1.17.1: dependencies: reusify: 1.0.4 - /fault@2.0.1: - resolution: {integrity: sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ==} + fault@2.0.1: dependencies: format: 0.2.2 - dev: true - /file-entry-cache@6.0.1: - resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} - engines: {node: ^10.12.0 || >=12.0.0} + file-entry-cache@6.0.1: dependencies: flat-cache: 3.2.0 - dev: true - /file-entry-cache@8.0.0: - resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} - engines: {node: '>=16.0.0'} + file-entry-cache@8.0.0: dependencies: flat-cache: 4.0.1 - dev: true - /fill-range@7.0.1: - resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} - engines: {node: '>=8'} + fill-range@7.0.1: dependencies: to-regex-range: 5.0.1 - /find-up-simple@1.0.0: - resolution: {integrity: sha512-q7Us7kcjj2VMePAa02hDAF6d+MzsdsAWEwYyOpwUtlerRBkOEPBCRZrAV4XfcSN8fHAgaD0hP7miwoay6DCprw==} - engines: {node: '>=18'} - dev: true + find-up-simple@1.0.0: {} - /find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} + find-up@5.0.0: dependencies: locate-path: 6.0.0 path-exists: 4.0.0 - dev: true - /find-up@6.3.0: - resolution: {integrity: sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + find-up@6.3.0: dependencies: locate-path: 7.2.0 path-exists: 5.0.0 - dev: true - /flat-cache@3.2.0: - resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} - engines: {node: ^10.12.0 || >=12.0.0} + flat-cache@3.2.0: dependencies: flatted: 3.3.1 keyv: 4.5.4 rimraf: 3.0.2 - dev: true - /flat-cache@4.0.1: - resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} - engines: {node: '>=16'} + flat-cache@4.0.1: dependencies: flatted: 3.3.1 keyv: 4.5.4 - dev: true - /flatted@3.3.1: - resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} - dev: true + flatted@3.3.1: {} - /flexsearch@0.7.43: - resolution: {integrity: sha512-c5o/+Um8aqCSOXGcZoqZOm+NqtVwNsvVpWv6lfmSclU954O3wvQKxxK8zj74fPaSJbXpSLTs4PRhh+wnoCXnKg==} - dev: false + flexsearch@0.7.43: {} - /focus-visible@5.2.0: - resolution: {integrity: sha512-Rwix9pBtC1Nuy5wysTmKy+UjbDJpIfg8eHjw0rjZ1mX4GNLz1Bmd16uDpI3Gk1i70Fgcs8Csg2lPm8HULFg9DQ==} - dev: false + focus-visible@5.2.0: {} - /for-each@0.3.3: - resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} + for-each@0.3.3: dependencies: is-callable: 1.2.7 - dev: false - /foreground-child@3.1.1: - resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} - engines: {node: '>=14'} + foreground-child@3.1.1: dependencies: cross-spawn: 7.0.3 signal-exit: 4.1.0 - dev: true - /format@0.2.2: - resolution: {integrity: sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==} - engines: {node: '>=0.4.x'} - dev: true + format@0.2.2: {} - /fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - dev: true + fs.realpath@1.0.0: {} - /function-bind@1.1.2: - resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - dev: false + function-bind@1.1.2: {} - /functions-have-names@1.2.3: - resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} - dev: false + functions-have-names@1.2.3: {} - /gensequence@7.0.0: - resolution: {integrity: sha512-47Frx13aZh01afHJTB3zTtKIlFI6vWY+MYCN9Qpew6i52rfKjnhCF/l1YlC8UmEMvvntZZ6z4PiCcmyuedR2aQ==} - engines: {node: '>=18'} - dev: true + gensequence@7.0.0: {} - /get-func-name@2.0.2: - resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} - dev: true + get-func-name@2.0.2: {} - /get-intrinsic@1.2.4: - resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} - engines: {node: '>= 0.4'} + get-intrinsic@1.2.4: dependencies: es-errors: 1.3.0 function-bind: 1.1.2 has-proto: 1.0.3 has-symbols: 1.0.3 hasown: 2.0.2 - dev: false - /get-stdin@9.0.0: - resolution: {integrity: sha512-dVKBjfWisLAicarI2Sf+JuBE/DghV4UzNAVe9yhEJuzeREd3JhOTE9cUaJTeSa77fsbQUK3pcOpJfM59+VKZaA==} - engines: {node: '>=12'} - dev: true + get-stdin@9.0.0: {} - /get-stream@3.0.0: - resolution: {integrity: sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==} - engines: {node: '>=4'} - dev: false + get-stream@3.0.0: {} - /git-up@7.0.0: - resolution: {integrity: sha512-ONdIrbBCFusq1Oy0sC71F5azx8bVkvtZtMJAsv+a6lz5YAmbNnLD6HAB4gptHZVLPR8S2/kVN6Gab7lryq5+lQ==} + git-up@7.0.0: dependencies: is-ssh: 1.4.0 parse-url: 8.1.0 - dev: false - /git-url-parse@13.1.1: - resolution: {integrity: sha512-PCFJyeSSdtnbfhSNRw9Wk96dDCNx+sogTe4YNXeXSJxt7xz5hvXekuRn9JX7m+Mf4OscCu8h+mtAl3+h5Fo8lQ==} + git-url-parse@13.1.1: dependencies: git-up: 7.0.0 - dev: false - /github-slugger@1.5.0: - resolution: {integrity: sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw==} - dev: true + github-slugger@1.5.0: {} - /github-slugger@2.0.0: - resolution: {integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==} - dev: false + github-slugger@2.0.0: {} - /glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} + glob-parent@5.1.2: dependencies: is-glob: 4.0.3 - /glob-parent@6.0.2: - resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} - engines: {node: '>=10.13.0'} + glob-parent@6.0.2: dependencies: is-glob: 4.0.3 - dev: true - /glob@10.3.12: - resolution: {integrity: sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg==} - engines: {node: '>=16 || 14 >=14.17'} - hasBin: true + glob@10.3.12: dependencies: foreground-child: 3.1.1 jackspeak: 2.3.6 minimatch: 9.0.4 minipass: 7.0.4 path-scurry: 1.10.2 - dev: true - /glob@7.2.3: - resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + glob@7.2.3: dependencies: fs.realpath: 1.0.0 inflight: 1.0.6 @@ -3531,36 +5852,24 @@ packages: minimatch: 3.1.2 once: 1.4.0 path-is-absolute: 1.0.1 - dev: true - /glob@8.1.0: - resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} - engines: {node: '>=12'} + glob@8.1.0: dependencies: fs.realpath: 1.0.0 inflight: 1.0.6 inherits: 2.0.4 minimatch: 5.1.6 once: 1.4.0 - dev: true - /global-directory@4.0.1: - resolution: {integrity: sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==} - engines: {node: '>=18'} + global-directory@4.0.1: dependencies: ini: 4.1.1 - dev: true - /globals@13.24.0: - resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} - engines: {node: '>=8'} + globals@13.24.0: dependencies: type-fest: 0.20.2 - dev: true - /globby@11.1.0: - resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} - engines: {node: '>=10'} + globby@11.1.0: dependencies: array-union: 2.1.0 dir-glob: 3.0.1 @@ -3568,117 +5877,73 @@ packages: ignore: 5.3.1 merge2: 1.4.1 slash: 3.0.0 - dev: true - /gopd@1.0.1: - resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + gopd@1.0.1: dependencies: get-intrinsic: 1.2.4 - dev: false - /graceful-fs@4.2.11: - resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + graceful-fs@4.2.11: {} - /graphemer@1.4.0: - resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} - dev: true + graphemer@1.4.0: {} - /gray-matter@4.0.3: - resolution: {integrity: sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==} - engines: {node: '>=6.0'} + gray-matter@4.0.3: dependencies: js-yaml: 3.14.1 kind-of: 6.0.3 section-matter: 1.0.0 strip-bom-string: 1.0.0 - /has-bigints@1.0.2: - resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} - dev: false - - /has-flag@2.0.0: - resolution: {integrity: sha512-P+1n3MnwjR/Epg9BBo1KT8qbye2g2Ou4sFumihwt6I4tsUX7jnLcX4BTOSKg/B1ZrIYMN9FcEnG4x5a7NB8Eng==} - engines: {node: '>=0.10.0'} - dev: false + has-bigints@1.0.2: {} - /has-flag@3.0.0: - resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} - engines: {node: '>=4'} + has-flag@2.0.0: {} - /has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} + has-flag@3.0.0: {} - /has-own-prop@2.0.0: - resolution: {integrity: sha512-Pq0h+hvsVm6dDEa8x82GnLSYHOzNDt7f0ddFa3FqcQlgzEiptPqL+XrOJNavjOzSYiYWIrgeVYYgGlLmnxwilQ==} - engines: {node: '>=8'} - dev: true + has-flag@4.0.0: {} - /has-property-descriptors@1.0.2: - resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + has-own-prop@2.0.0: {} + + has-property-descriptors@1.0.2: dependencies: es-define-property: 1.0.0 - dev: false - /has-proto@1.0.3: - resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} - engines: {node: '>= 0.4'} - dev: false + has-proto@1.0.3: {} - /has-symbols@1.0.3: - resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} - engines: {node: '>= 0.4'} - dev: false + has-symbols@1.0.3: {} - /has-tostringtag@1.0.2: - resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} - engines: {node: '>= 0.4'} + has-tostringtag@1.0.2: dependencies: has-symbols: 1.0.3 - dev: false - /hash-obj@4.0.0: - resolution: {integrity: sha512-FwO1BUVWkyHasWDW4S8o0ssQXjvyghLV2rfVhnN36b2bbcj45eGiuzdn9XOvOpjV3TKQD7Gm2BWNXdE9V4KKYg==} - engines: {node: '>=12'} + hash-obj@4.0.0: dependencies: is-obj: 3.0.0 sort-keys: 5.0.0 type-fest: 1.4.0 - dev: false - /hash.js@1.1.7: - resolution: {integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==} + hash.js@1.1.7: dependencies: inherits: 2.0.4 minimalistic-assert: 1.0.1 - dev: true - /hasown@2.0.2: - resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} - engines: {node: '>= 0.4'} + hasown@2.0.2: dependencies: function-bind: 1.1.2 - dev: false - /hast-util-from-dom@5.0.0: - resolution: {integrity: sha512-d6235voAp/XR3Hh5uy7aGLbM3S4KamdW0WEgOaU1YoewnuYw4HXb5eRtv9g65m/RFGEfUY1Mw4UqCc5Y8L4Stg==} + hast-util-from-dom@5.0.0: dependencies: '@types/hast': 3.0.4 hastscript: 8.0.0 web-namespaces: 2.0.1 - dev: false - /hast-util-from-html-isomorphic@2.0.0: - resolution: {integrity: sha512-zJfpXq44yff2hmE0XmwEOzdWin5xwH+QIhMLOScpX91e/NSGPsAzNCvLQDIEPyO2TXi+lBmU6hjLIhV8MwP2kw==} + hast-util-from-html-isomorphic@2.0.0: dependencies: '@types/hast': 3.0.4 hast-util-from-dom: 5.0.0 hast-util-from-html: 2.0.1 unist-util-remove-position: 5.0.0 - dev: false - /hast-util-from-html@2.0.1: - resolution: {integrity: sha512-RXQBLMl9kjKVNkJTIO6bZyb2n+cUH8LFaSSzo82jiLT6Tfc+Pt7VQCS+/h3YwG4jaNE2TA2sdJisGWR+aJrp0g==} + hast-util-from-html@2.0.1: dependencies: '@types/hast': 3.0.4 devlop: 1.1.0 @@ -3686,10 +5951,8 @@ packages: parse5: 7.1.2 vfile: 6.0.1 vfile-message: 4.0.2 - dev: false - /hast-util-from-parse5@8.0.1: - resolution: {integrity: sha512-Er/Iixbc7IEa7r/XLtuG52zoqn/b3Xng/w6aZQ0xGVxzhw5xUFxcRqdPzP6yFi/4HBYRaifaI5fQ1RH8n0ZeOQ==} + hast-util-from-parse5@8.0.1: dependencies: '@types/hast': 3.0.4 '@types/unist': 3.0.2 @@ -3699,22 +5962,16 @@ packages: vfile: 6.0.1 vfile-location: 5.0.2 web-namespaces: 2.0.1 - dev: false - /hast-util-is-element@3.0.0: - resolution: {integrity: sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==} + hast-util-is-element@3.0.0: dependencies: '@types/hast': 3.0.4 - dev: false - /hast-util-parse-selector@4.0.0: - resolution: {integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==} + hast-util-parse-selector@4.0.0: dependencies: '@types/hast': 3.0.4 - dev: false - /hast-util-raw@9.0.2: - resolution: {integrity: sha512-PldBy71wO9Uq1kyaMch9AHIghtQvIwxBUkv823pKmkTM3oV1JxtsTNYdevMxvUHqcnOAuO65JKU2+0NOxc2ksA==} + hast-util-raw@9.0.2: dependencies: '@types/hast': 3.0.4 '@types/unist': 3.0.2 @@ -3729,10 +5986,8 @@ packages: vfile: 6.0.1 web-namespaces: 2.0.1 zwitch: 2.0.4 - dev: false - /hast-util-to-estree@2.3.3: - resolution: {integrity: sha512-ihhPIUPxN0v0w6M5+IiAZZrn0LH2uZomeWwhn7uP7avZC6TE7lIiEh2yBMPr5+zi1aUCXq6VoYRgs2Bw9xmycQ==} + hast-util-to-estree@2.3.3: dependencies: '@types/estree': 1.0.5 '@types/estree-jsx': 1.0.5 @@ -3751,10 +6006,8 @@ packages: zwitch: 2.0.4 transitivePeerDependencies: - supports-color - dev: false - /hast-util-to-parse5@8.0.0: - resolution: {integrity: sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==} + hast-util-to-parse5@8.0.0: dependencies: '@types/hast': 3.0.4 comma-separated-tokens: 2.0.3 @@ -3763,594 +6016,344 @@ packages: space-separated-tokens: 2.0.2 web-namespaces: 2.0.1 zwitch: 2.0.4 - dev: false - /hast-util-to-text@4.0.2: - resolution: {integrity: sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A==} + hast-util-to-text@4.0.2: dependencies: '@types/hast': 3.0.4 '@types/unist': 3.0.2 hast-util-is-element: 3.0.0 unist-util-find-after: 5.0.0 - dev: false - /hast-util-whitespace@2.0.1: - resolution: {integrity: sha512-nAxA0v8+vXSBDt3AnRUNjyRIQ0rD+ntpbAp4LnPkumc5M9yUbSMa4XDU9Q6etY4f1Wp4bNgvc1yjiZtsTTrSng==} - dev: false + hast-util-whitespace@2.0.1: {} - /hastscript@8.0.0: - resolution: {integrity: sha512-dMOtzCEd3ABUeSIISmrETiKuyydk1w0pa+gE/uormcTpSYuaNJPbX1NU3JLyscSLjwAQM8bWMhhIlnCqnRvDTw==} + hastscript@8.0.0: dependencies: '@types/hast': 3.0.4 comma-separated-tokens: 2.0.3 hast-util-parse-selector: 4.0.0 property-information: 6.5.0 space-separated-tokens: 2.0.2 - dev: false - /header-case@2.0.4: - resolution: {integrity: sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q==} + header-case@2.0.4: dependencies: capital-case: 1.0.4 tslib: 2.6.2 - dev: false - /hmac-drbg@1.0.1: - resolution: {integrity: sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==} + hmac-drbg@1.0.1: dependencies: hash.js: 1.1.7 minimalistic-assert: 1.0.1 minimalistic-crypto-utils: 1.0.1 - dev: true - /html-void-elements@3.0.0: - resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} - dev: false + html-void-elements@3.0.0: {} - /iconv-lite@0.6.3: - resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} - engines: {node: '>=0.10.0'} + iconv-lite@0.6.3: dependencies: safer-buffer: 2.1.2 - dev: false - /ignore@5.3.1: - resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} - engines: {node: '>= 4'} - dev: true + ignore@5.3.1: {} - /import-fresh@3.3.0: - resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} - engines: {node: '>=6'} + import-fresh@3.3.0: dependencies: parent-module: 1.0.1 resolve-from: 4.0.0 - dev: true - /import-meta-resolve@2.2.2: - resolution: {integrity: sha512-f8KcQ1D80V7RnqVm+/lirO9zkOxjGxhaTC1IPrBGd3MEfNgmNG67tSUO9gTi2F3Blr2Az6g1vocaxzkVnWl9MA==} - dev: true + import-meta-resolve@2.2.2: {} - /import-meta-resolve@4.1.0: - resolution: {integrity: sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==} - dev: true + import-meta-resolve@4.1.0: {} - /imurmurhash@0.1.4: - resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} - engines: {node: '>=0.8.19'} - dev: true + imurmurhash@0.1.4: {} - /inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + inflight@1.0.6: dependencies: once: 1.4.0 wrappy: 1.0.2 - dev: true - /inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - dev: true + inherits@2.0.4: {} - /ini@4.1.1: - resolution: {integrity: sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dev: true + ini@4.1.1: {} - /ini@4.1.2: - resolution: {integrity: sha512-AMB1mvwR1pyBFY/nSevUX6y8nJWS63/SzUKD3JyQn97s4xgIdgQPT75IRouIiBAN4yLQBUShNYVW0+UG25daCw==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dev: true + ini@4.1.2: {} - /inline-style-parser@0.1.1: - resolution: {integrity: sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==} - dev: false + inline-style-parser@0.1.1: {} - /internal-slot@1.0.7: - resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==} - engines: {node: '>= 0.4'} + internal-slot@1.0.7: dependencies: es-errors: 1.3.0 hasown: 2.0.2 side-channel: 1.0.6 - dev: false - /internmap@1.0.1: - resolution: {integrity: sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==} - dev: false + internmap@1.0.1: {} - /internmap@2.0.3: - resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==} - engines: {node: '>=12'} - dev: false + internmap@2.0.3: {} - /intersection-observer@0.12.2: - resolution: {integrity: sha512-7m1vEcPCxXYI8HqnL8CKI6siDyD+eIWSwgB3DZA+ZTogxk9I4CDnj4wilt9x/+/QbHI4YG5YZNmC6458/e9Ktg==} - dev: false + intersection-observer@0.12.2: {} - /is-alphabetical@1.0.4: - resolution: {integrity: sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==} - dev: true + is-alphabetical@1.0.4: {} - /is-alphabetical@2.0.1: - resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==} + is-alphabetical@2.0.1: {} - /is-alphanumerical@1.0.4: - resolution: {integrity: sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==} + is-alphanumerical@1.0.4: dependencies: is-alphabetical: 1.0.4 is-decimal: 1.0.4 - dev: true - /is-alphanumerical@2.0.1: - resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==} + is-alphanumerical@2.0.1: dependencies: is-alphabetical: 2.0.1 is-decimal: 2.0.1 - /is-arguments@1.1.1: - resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} - engines: {node: '>= 0.4'} + is-arguments@1.1.1: dependencies: call-bind: 1.0.7 has-tostringtag: 1.0.2 - dev: false - /is-array-buffer@3.0.4: - resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==} - engines: {node: '>= 0.4'} + is-array-buffer@3.0.4: dependencies: call-bind: 1.0.7 get-intrinsic: 1.2.4 - dev: false - /is-arrayish@0.2.1: - resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} - dev: true + is-arrayish@0.2.1: {} - /is-bigint@1.0.4: - resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} + is-bigint@1.0.4: dependencies: has-bigints: 1.0.2 - dev: false - /is-boolean-object@1.1.2: - resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} - engines: {node: '>= 0.4'} + is-boolean-object@1.1.2: dependencies: call-bind: 1.0.7 has-tostringtag: 1.0.2 - dev: false - /is-buffer@2.0.5: - resolution: {integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==} - engines: {node: '>=4'} + is-buffer@2.0.5: {} - /is-callable@1.2.7: - resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} - engines: {node: '>= 0.4'} - dev: false + is-callable@1.2.7: {} - /is-date-object@1.0.5: - resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} - engines: {node: '>= 0.4'} + is-date-object@1.0.5: dependencies: has-tostringtag: 1.0.2 - dev: false - /is-decimal@1.0.4: - resolution: {integrity: sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==} - dev: true + is-decimal@1.0.4: {} - /is-decimal@2.0.1: - resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} + is-decimal@2.0.1: {} - /is-empty@1.2.0: - resolution: {integrity: sha512-F2FnH/otLNJv0J6wc73A5Xo7oHLNnqplYqZhUu01tD54DIPvxIRSTSLkrUB/M0nHO4vo1O9PDfN4KoTxCzLh/w==} - dev: true + is-empty@1.2.0: {} - /is-extendable@0.1.1: - resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} - engines: {node: '>=0.10.0'} + is-extendable@0.1.1: {} - /is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} + is-extglob@2.1.1: {} - /is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} - dev: true + is-fullwidth-code-point@3.0.0: {} - /is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} + is-glob@4.0.3: dependencies: is-extglob: 2.1.1 - /is-hex-prefixed@1.0.0: - resolution: {integrity: sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA==} - engines: {node: '>=6.5.0', npm: '>=3'} - dev: true + is-hex-prefixed@1.0.0: {} - /is-hexadecimal@1.0.4: - resolution: {integrity: sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==} - dev: true + is-hexadecimal@1.0.4: {} - /is-hexadecimal@2.0.1: - resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} + is-hexadecimal@2.0.1: {} - /is-map@2.0.3: - resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} - engines: {node: '>= 0.4'} - dev: false + is-map@2.0.3: {} - /is-number-object@1.0.7: - resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} - engines: {node: '>= 0.4'} + is-number-object@1.0.7: dependencies: has-tostringtag: 1.0.2 - dev: false - /is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} + is-number@7.0.0: {} - /is-obj@2.0.0: - resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} - engines: {node: '>=8'} - dev: true + is-obj@2.0.0: {} - /is-obj@3.0.0: - resolution: {integrity: sha512-IlsXEHOjtKhpN8r/tRFj2nDyTmHvcfNeu/nrRIcXE17ROeatXchkojffa1SpdqW4cr/Fj6QkEf/Gn4zf6KKvEQ==} - engines: {node: '>=12'} - dev: false + is-obj@3.0.0: {} - /is-path-inside@3.0.3: - resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} - engines: {node: '>=8'} - dev: true + is-path-inside@3.0.3: {} - /is-plain-obj@3.0.0: - resolution: {integrity: sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==} - engines: {node: '>=10'} - dev: false + is-plain-obj@3.0.0: {} - /is-plain-obj@4.1.0: - resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} - engines: {node: '>=12'} + is-plain-obj@4.1.0: {} - /is-reference@3.0.2: - resolution: {integrity: sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==} + is-reference@3.0.2: dependencies: '@types/estree': 1.0.5 - dev: false - /is-regex@1.1.4: - resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} - engines: {node: '>= 0.4'} + is-regex@1.1.4: dependencies: call-bind: 1.0.7 has-tostringtag: 1.0.2 - dev: false - /is-set@2.0.3: - resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} - engines: {node: '>= 0.4'} - dev: false + is-set@2.0.3: {} - /is-shared-array-buffer@1.0.3: - resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==} - engines: {node: '>= 0.4'} + is-shared-array-buffer@1.0.3: dependencies: call-bind: 1.0.7 - dev: false - /is-ssh@1.4.0: - resolution: {integrity: sha512-x7+VxdxOdlV3CYpjvRLBv5Lo9OJerlYanjwFrPR9fuGPjCiNiCzFgAWpiLAohSbsnH4ZAys3SBh+hq5rJosxUQ==} + is-ssh@1.4.0: dependencies: protocols: 2.0.1 - dev: false - /is-stream@1.1.0: - resolution: {integrity: sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==} - engines: {node: '>=0.10.0'} - dev: false + is-stream@1.1.0: {} - /is-string@1.0.7: - resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} - engines: {node: '>= 0.4'} + is-string@1.0.7: dependencies: has-tostringtag: 1.0.2 - dev: false - /is-symbol@1.0.4: - resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} - engines: {node: '>= 0.4'} + is-symbol@1.0.4: dependencies: has-symbols: 1.0.3 - dev: false - /is-typedarray@1.0.0: - resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} - dev: true + is-typedarray@1.0.0: {} - /is-weakmap@2.0.2: - resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} - engines: {node: '>= 0.4'} - dev: false + is-weakmap@2.0.2: {} - /is-weakset@2.0.3: - resolution: {integrity: sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==} - engines: {node: '>= 0.4'} + is-weakset@2.0.3: dependencies: call-bind: 1.0.7 get-intrinsic: 1.2.4 - dev: false - /isarray@2.0.5: - resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} - dev: false + isarray@2.0.5: {} - /isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + isexe@2.0.0: {} - /isows@1.0.3(ws@8.13.0): - resolution: {integrity: sha512-2cKei4vlmg2cxEjm3wVSqn8pcoRF/LX/wpifuuNquFO4SQmPwarClT+SUCA2lt+l581tTeZIPIZuIDo2jWN1fg==} - peerDependencies: - ws: '*' + isows@1.0.3(ws@8.13.0): dependencies: ws: 8.13.0 - dev: false - /jackspeak@2.3.6: - resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} - engines: {node: '>=14'} + jackspeak@2.3.6: dependencies: '@isaacs/cliui': 8.0.2 optionalDependencies: '@pkgjs/parseargs': 0.11.0 - dev: true - /js-sha3@0.8.0: - resolution: {integrity: sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==} - dev: true + js-sha3@0.8.0: {} - /js-tokens@4.0.0: - resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + js-tokens@4.0.0: {} - /js-yaml@3.14.1: - resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} - hasBin: true + js-yaml@3.14.1: dependencies: argparse: 1.0.10 esprima: 4.0.1 - /js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} - hasBin: true + js-yaml@4.1.0: dependencies: argparse: 2.0.1 - /json-buffer@3.0.1: - resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} - dev: true + json-buffer@3.0.1: {} - /json-parse-even-better-errors@2.3.1: - resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} - dev: true + json-parse-even-better-errors@2.3.1: {} - /json-parse-even-better-errors@3.0.1: - resolution: {integrity: sha512-aatBvbL26wVUCLmbWdCpeu9iF5wOyWpagiKkInA+kfws3sWdBrTnsvN2CKcyCYyUrc7rebNBlK6+kteg7ksecg==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dev: true + json-parse-even-better-errors@3.0.1: {} - /json-schema-traverse@0.4.1: - resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} - dev: true + json-schema-traverse@0.4.1: {} - /json-schema-traverse@1.0.0: - resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} - dev: true + json-schema-traverse@1.0.0: {} - /json-stable-stringify-without-jsonify@1.0.1: - resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} - dev: true + json-stable-stringify-without-jsonify@1.0.1: {} - /jsonc-parser@3.2.1: - resolution: {integrity: sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==} - dev: false + jsonc-parser@3.2.1: {} - /katex@0.16.10: - resolution: {integrity: sha512-ZiqaC04tp2O5utMsl2TEZTXxa6WSC4yo0fv5ML++D3QZv/vx2Mct0mTlRx3O+uUkjfuAgOkzsCmq5MiUEsDDdA==} - hasBin: true + katex@0.16.10: dependencies: commander: 8.3.0 - dev: false - /keyv@4.5.4: - resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + keyv@4.5.4: dependencies: json-buffer: 3.0.1 - dev: true - /khroma@2.1.0: - resolution: {integrity: sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw==} - dev: false + khroma@2.1.0: {} - /kind-of@6.0.3: - resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} - engines: {node: '>=0.10.0'} + kind-of@6.0.3: {} - /kleur@4.1.5: - resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} - engines: {node: '>=6'} + kleur@4.1.5: {} - /layout-base@1.0.2: - resolution: {integrity: sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==} - dev: false + layout-base@1.0.2: {} - /levn@0.4.1: - resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} - engines: {node: '>= 0.8.0'} + levn@0.4.1: dependencies: prelude-ls: 1.2.1 type-check: 0.4.0 - dev: true - /lines-and-columns@2.0.4: - resolution: {integrity: sha512-wM1+Z03eypVAVUCE7QdSqpVIvelbOakn1M0bPDoA4SGWPx3sNDVUiMo3L6To6WWGClB7VyXnhQ4Sn7gxiJbE6A==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dev: true + lines-and-columns@2.0.4: {} - /load-plugin@5.1.0: - resolution: {integrity: sha512-Lg1CZa1CFj2CbNaxijTL6PCbzd4qGTlZov+iH2p5Xwy/ApcZJh+i6jMN2cYePouTfjJfrNu3nXFdEw8LvbjPFQ==} + load-plugin@5.1.0: dependencies: '@npmcli/config': 6.4.1 import-meta-resolve: 2.2.2 - dev: true - /locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} + locate-path@6.0.0: dependencies: p-locate: 5.0.0 - dev: true - /locate-path@7.2.0: - resolution: {integrity: sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + locate-path@7.2.0: dependencies: p-locate: 6.0.0 - dev: true - /lodash-es@4.17.21: - resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} - dev: false + lodash-es@4.17.21: {} - /lodash.clonedeep@4.5.0: - resolution: {integrity: sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==} - dev: true + lodash.clonedeep@4.5.0: {} - /lodash.get@4.4.2: - resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} - dev: false + lodash.get@4.4.2: {} - /lodash.merge@4.6.2: - resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} - dev: true + lodash.merge@4.6.2: {} - /lodash@4.17.21: - resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - dev: true + lodash@4.17.21: {} - /longest-streak@3.1.0: - resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} + longest-streak@3.1.0: {} - /loose-envify@1.4.0: - resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} - hasBin: true + loose-envify@1.4.0: dependencies: js-tokens: 4.0.0 - dev: false - /loupe@2.3.7: - resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} + loupe@2.3.7: dependencies: get-func-name: 2.0.2 - dev: true - /lower-case@2.0.2: - resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} + lower-case@2.0.2: dependencies: tslib: 2.6.2 - dev: false - /lru-cache@10.2.2: - resolution: {integrity: sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==} - engines: {node: 14 || >=16.14} - dev: true + lru-cache@10.2.2: {} - /lru-cache@4.1.5: - resolution: {integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==} + lru-cache@4.1.5: dependencies: pseudomap: 1.0.2 yallist: 2.1.2 - dev: false - /lru-cache@6.0.0: - resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} - engines: {node: '>=10'} + lru-cache@6.0.0: dependencies: yallist: 4.0.0 - dev: true - /lz-string@1.5.0: - resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} - hasBin: true - dev: false + lz-string@1.5.0: {} - /markdown-extensions@1.1.1: - resolution: {integrity: sha512-WWC0ZuMzCyDHYCasEGs4IPvLyTGftYwh6wIEOULOF0HXcqZlhwRzrK0w2VUlxWA98xnvb/jszw4ZSkJ6ADpM6Q==} - engines: {node: '>=0.10.0'} - dev: false + markdown-extensions@1.1.1: {} - /markdown-table@3.0.3: - resolution: {integrity: sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==} + markdown-table@3.0.3: {} - /match-sorter@6.3.4: - resolution: {integrity: sha512-jfZW7cWS5y/1xswZo8VBOdudUiSd9nifYRWphc9M5D/ee4w4AoXLgBEdRbgVaxbMuagBPeUC5y2Hi8DO6o9aDg==} + match-sorter@6.3.4: dependencies: '@babel/runtime': 7.24.4 remove-accents: 0.5.0 - dev: false - /mdast-comment-marker@2.1.2: - resolution: {integrity: sha512-HED3ezseRVkBzZ0uK4q6RJMdufr/2p3VfVZstE3H1N9K8bwtspztWo6Xd7rEatuGNoCXaBna8oEqMwUn0Ve1bw==} + mdast-comment-marker@2.1.2: dependencies: '@types/mdast': 3.0.15 mdast-util-mdx-expression: 1.3.2 transitivePeerDependencies: - supports-color - dev: true - /mdast-util-definitions@5.1.2: - resolution: {integrity: sha512-8SVPMuHqlPME/z3gqVwWY4zVXn8lqKv/pAhC57FuJ40ImXyBpmO5ukh98zB2v7Blql2FiHjHv9LVztSIqjY+MA==} + mdast-util-definitions@5.1.2: dependencies: '@types/mdast': 3.0.15 '@types/unist': 2.0.10 unist-util-visit: 4.1.2 - dev: false - /mdast-util-find-and-replace@2.2.2: - resolution: {integrity: sha512-MTtdFRz/eMDHXzeK6W3dO7mXUlF82Gom4y0oOgvHhh/HXZAGvIQDUvQ0SuUx+j2tv44b8xTHOm8K/9OoRFnXKw==} + mdast-util-find-and-replace@2.2.2: dependencies: '@types/mdast': 3.0.15 escape-string-regexp: 5.0.0 unist-util-is: 5.2.1 unist-util-visit-parents: 5.1.3 - /mdast-util-from-markdown@0.8.5: - resolution: {integrity: sha512-2hkTXtYYnr+NubD/g6KGBS/0mFmBcifAsI0yIWRiRo0PjVs6SSOSOdtzbp6kSGnShDN6G5aWZpKQ2lWRy27mWQ==} + mdast-util-from-markdown@0.8.5: dependencies: '@types/mdast': 3.0.15 mdast-util-to-string: 2.0.0 @@ -4359,10 +6362,8 @@ packages: unist-util-stringify-position: 2.0.3 transitivePeerDependencies: - supports-color - dev: true - /mdast-util-from-markdown@1.3.1: - resolution: {integrity: sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww==} + mdast-util-from-markdown@1.3.1: dependencies: '@types/mdast': 3.0.15 '@types/unist': 2.0.10 @@ -4379,8 +6380,7 @@ packages: transitivePeerDependencies: - supports-color - /mdast-util-from-markdown@2.0.0: - resolution: {integrity: sha512-n7MTOr/z+8NAX/wmhhDji8O3bRvPTV/U0oTCaZJkjhPSKTPhS3xufVhKGF8s1pJ7Ox4QgoIU7KHseh09S+9rTA==} + mdast-util-from-markdown@2.0.0: dependencies: '@types/mdast': 4.0.3 '@types/unist': 3.0.2 @@ -4396,10 +6396,8 @@ packages: unist-util-stringify-position: 4.0.0 transitivePeerDependencies: - supports-color - dev: true - /mdast-util-frontmatter@2.0.1: - resolution: {integrity: sha512-LRqI9+wdgC25P0URIJY9vwocIzCcksduHQ9OF2joxQoyTNVduwLAFUzjoopuRJbJAReaKrNQKAZKL3uCMugWJA==} + mdast-util-frontmatter@2.0.1: dependencies: '@types/mdast': 4.0.3 devlop: 1.1.0 @@ -4409,31 +6407,26 @@ packages: micromark-extension-frontmatter: 2.0.0 transitivePeerDependencies: - supports-color - dev: true - /mdast-util-gfm-autolink-literal@1.0.3: - resolution: {integrity: sha512-My8KJ57FYEy2W2LyNom4n3E7hKTuQk/0SES0u16tjA9Z3oFkF4RrC/hPAPgjlSpezsOvI8ObcXcElo92wn5IGA==} + mdast-util-gfm-autolink-literal@1.0.3: dependencies: '@types/mdast': 3.0.15 ccount: 2.0.1 mdast-util-find-and-replace: 2.2.2 micromark-util-character: 1.2.0 - /mdast-util-gfm-footnote@1.0.2: - resolution: {integrity: sha512-56D19KOGbE00uKVj3sgIykpwKL179QsVFwx/DCW0u/0+URsryacI4MAdNJl0dh+u2PSsD9FtxPFbHCzJ78qJFQ==} + mdast-util-gfm-footnote@1.0.2: dependencies: '@types/mdast': 3.0.15 mdast-util-to-markdown: 1.5.0 micromark-util-normalize-identifier: 1.1.0 - /mdast-util-gfm-strikethrough@1.0.3: - resolution: {integrity: sha512-DAPhYzTYrRcXdMjUtUjKvW9z/FNAMTdU0ORyMcbmkwYNbKocDpdk+PX1L1dQgOID/+vVs1uBQ7ElrBQfZ0cuiQ==} + mdast-util-gfm-strikethrough@1.0.3: dependencies: '@types/mdast': 3.0.15 mdast-util-to-markdown: 1.5.0 - /mdast-util-gfm-table@1.0.7: - resolution: {integrity: sha512-jjcpmNnQvrmN5Vx7y7lEc2iIOEytYv7rTvu+MeyAsSHTASGCCRA79Igg2uKssgOs1i1po8s3plW0sTu1wkkLGg==} + mdast-util-gfm-table@1.0.7: dependencies: '@types/mdast': 3.0.15 markdown-table: 3.0.3 @@ -4442,14 +6435,12 @@ packages: transitivePeerDependencies: - supports-color - /mdast-util-gfm-task-list-item@1.0.2: - resolution: {integrity: sha512-PFTA1gzfp1B1UaiJVyhJZA1rm0+Tzn690frc/L8vNX1Jop4STZgOE6bxUhnzdVSB+vm2GU1tIsuQcA9bxTQpMQ==} + mdast-util-gfm-task-list-item@1.0.2: dependencies: '@types/mdast': 3.0.15 mdast-util-to-markdown: 1.5.0 - /mdast-util-gfm@2.0.2: - resolution: {integrity: sha512-qvZ608nBppZ4icQlhQQIAdc6S3Ffj9RGmzwUKUWuEICFnd1LVkN3EktF7ZHAgfcEdvZB5owU9tQgt99e2TlLjg==} + mdast-util-gfm@2.0.2: dependencies: mdast-util-from-markdown: 1.3.1 mdast-util-gfm-autolink-literal: 1.0.3 @@ -4461,22 +6452,17 @@ packages: transitivePeerDependencies: - supports-color - /mdast-util-heading-style@2.0.1: - resolution: {integrity: sha512-0L5rthU4xKDVbw+UQ7D8Y8xOEsX4JXZvemWoEAsL+WAaeSH+TvVVwFnTb3G/OrjyP4VYQULoNWU+PdZfkmNu4A==} + mdast-util-heading-style@2.0.1: dependencies: '@types/mdast': 3.0.15 - dev: true - /mdast-util-math@2.0.2: - resolution: {integrity: sha512-8gmkKVp9v6+Tgjtq6SYx9kGPpTf6FVYRa53/DLh479aldR9AyP48qeVOgNZ5X7QUK7nOy4yw7vg6mbiGcs9jWQ==} + mdast-util-math@2.0.2: dependencies: '@types/mdast': 3.0.15 longest-streak: 3.1.0 mdast-util-to-markdown: 1.5.0 - dev: false - /mdast-util-mdx-expression@1.3.2: - resolution: {integrity: sha512-xIPmR5ReJDu/DHH1OoIT1HkuybIfRGYRywC+gJtI7qHjCJp/M9jrmBEJW22O8lskDWm562BX2W8TiAwRTb0rKA==} + mdast-util-mdx-expression@1.3.2: dependencies: '@types/estree-jsx': 1.0.5 '@types/hast': 2.3.10 @@ -4486,8 +6472,7 @@ packages: transitivePeerDependencies: - supports-color - /mdast-util-mdx-jsx@2.1.4: - resolution: {integrity: sha512-DtMn9CmVhVzZx3f+optVDF8yFgQVt7FghCRNdlIaS3X5Bnym3hZwPbg/XW86vdpKjlc1PVj26SpnLGeJBXD3JA==} + mdast-util-mdx-jsx@2.1.4: dependencies: '@types/estree-jsx': 1.0.5 '@types/hast': 2.3.10 @@ -4504,8 +6489,7 @@ packages: transitivePeerDependencies: - supports-color - /mdast-util-mdx@2.0.1: - resolution: {integrity: sha512-38w5y+r8nyKlGvNjSEqWrhG0w5PmnRA+wnBvm+ulYCct7nsGYhFVb0lljS9bQav4psDAS1eGkP2LMVcZBi/aqw==} + mdast-util-mdx@2.0.1: dependencies: mdast-util-from-markdown: 1.3.1 mdast-util-mdx-expression: 1.3.2 @@ -4515,8 +6499,7 @@ packages: transitivePeerDependencies: - supports-color - /mdast-util-mdxjs-esm@1.3.1: - resolution: {integrity: sha512-SXqglS0HrEvSdUEfoXFtcg7DRl7S2cwOXc7jkuusG472Mmjag34DUDeOJUZtl+BVnyeO1frIgVpHlNRWc2gk/w==} + mdast-util-mdxjs-esm@1.3.1: dependencies: '@types/estree-jsx': 1.0.5 '@types/hast': 2.3.10 @@ -4526,21 +6509,17 @@ packages: transitivePeerDependencies: - supports-color - /mdast-util-phrasing@3.0.1: - resolution: {integrity: sha512-WmI1gTXUBJo4/ZmSk79Wcb2HcjPJBzM1nlI/OUWA8yk2X9ik3ffNbBGsU+09BFmXaL1IBb9fiuvq6/KMiNycSg==} + mdast-util-phrasing@3.0.1: dependencies: '@types/mdast': 3.0.15 unist-util-is: 5.2.1 - /mdast-util-phrasing@4.1.0: - resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==} + mdast-util-phrasing@4.1.0: dependencies: '@types/mdast': 4.0.3 unist-util-is: 6.0.0 - dev: true - /mdast-util-to-hast@12.3.0: - resolution: {integrity: sha512-pits93r8PhnIoU4Vy9bjW39M2jJ6/tdHyja9rrot9uujkN7UTU9SDnE6WNJz/IGyQk3XHX6yNNtrBH6cQzm8Hw==} + mdast-util-to-hast@12.3.0: dependencies: '@types/hast': 2.3.10 '@types/mdast': 3.0.15 @@ -4550,10 +6529,8 @@ packages: unist-util-generated: 2.0.1 unist-util-position: 4.0.4 unist-util-visit: 4.1.2 - dev: false - /mdast-util-to-hast@13.1.0: - resolution: {integrity: sha512-/e2l/6+OdGp/FB+ctrJ9Avz71AN/GRH3oi/3KAx/kMnoUsD6q0woXlDT8lLEeViVKE7oZxE7RXzvO3T8kF2/sA==} + mdast-util-to-hast@13.1.0: dependencies: '@types/hast': 3.0.4 '@types/mdast': 4.0.3 @@ -4564,10 +6541,8 @@ packages: unist-util-position: 5.0.0 unist-util-visit: 5.0.0 vfile: 6.0.1 - dev: false - /mdast-util-to-markdown@1.5.0: - resolution: {integrity: sha512-bbv7TPv/WC49thZPg3jXuqzuvI45IL2EVAr/KxF0BSdHsU0ceFHOmwQn6evxAh1GaoK/6GQ1wp4R4oW2+LFL/A==} + mdast-util-to-markdown@1.5.0: dependencies: '@types/mdast': 3.0.15 '@types/unist': 2.0.10 @@ -4578,8 +6553,7 @@ packages: unist-util-visit: 4.1.2 zwitch: 2.0.4 - /mdast-util-to-markdown@2.1.0: - resolution: {integrity: sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ==} + mdast-util-to-markdown@2.1.0: dependencies: '@types/mdast': 4.0.3 '@types/unist': 3.0.2 @@ -4589,40 +6563,28 @@ packages: micromark-util-decode-string: 2.0.0 unist-util-visit: 5.0.0 zwitch: 2.0.4 - dev: true - /mdast-util-to-string@2.0.0: - resolution: {integrity: sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==} - dev: true + mdast-util-to-string@2.0.0: {} - /mdast-util-to-string@3.2.0: - resolution: {integrity: sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg==} + mdast-util-to-string@3.2.0: dependencies: '@types/mdast': 3.0.15 - /mdast-util-to-string@4.0.0: - resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} + mdast-util-to-string@4.0.0: dependencies: '@types/mdast': 4.0.3 - dev: true - /merge2@1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} - engines: {node: '>= 8'} + merge2@1.4.1: {} - /merkletreejs@0.3.11: - resolution: {integrity: sha512-LJKTl4iVNTndhL+3Uz/tfkjD0klIWsHlUzgtuNnNrsf7bAlXR30m+xYB7lHr5Z/l6e/yAIsr26Dabx6Buo4VGQ==} - engines: {node: '>= 7.6.0'} + merkletreejs@0.3.11: dependencies: bignumber.js: 9.1.2 buffer-reverse: 1.0.1 crypto-js: 4.2.0 treeify: 1.1.0 web3-utils: 1.10.4 - dev: true - /mermaid@10.9.0: - resolution: {integrity: sha512-swZju0hFox/B/qoLKK0rOxxgh8Cf7rJSfAUc1u8fezVihYMvrJAS45GzAxTVf4Q+xn9uMgitBcmWk7nWGXOs/g==} + mermaid@10.9.0: dependencies: '@braintree/sanitize-url': 6.0.4 '@types/d3-scale': 4.0.8 @@ -4633,7 +6595,7 @@ packages: d3-sankey: 0.12.3 dagre-d3-es: 7.0.10 dayjs: 1.11.11 - dompurify: 3.1.1 + dompurify: 3.1.7 elkjs: 0.9.3 katex: 0.16.10 khroma: 2.1.0 @@ -4646,14 +6608,10 @@ packages: web-worker: 1.3.0 transitivePeerDependencies: - supports-color - dev: false - /micro-ftch@0.3.1: - resolution: {integrity: sha512-/0LLxhzP0tfiR5hcQebtudP56gUurs2CLkGarnCiB/OqEyUFQ6U3paQi/tgLv0hBJYt2rnr9MNpxz4fiiugstg==} - dev: true + micro-ftch@0.3.1: {} - /micromark-core-commonmark@1.1.0: - resolution: {integrity: sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw==} + micromark-core-commonmark@1.1.0: dependencies: decode-named-character-reference: 1.0.2 micromark-factory-destination: 1.1.0 @@ -4672,8 +6630,7 @@ packages: micromark-util-types: 1.1.0 uvu: 0.5.6 - /micromark-core-commonmark@2.0.1: - resolution: {integrity: sha512-CUQyKr1e///ZODyD1U3xit6zXwy1a8q2a1S1HKtIlmgvurrEpaw/Y9y6KSIbF8P59cn/NjzHyO+Q2fAyYLQrAA==} + micromark-core-commonmark@2.0.1: dependencies: decode-named-character-reference: 1.0.2 devlop: 1.1.0 @@ -4691,27 +6648,22 @@ packages: micromark-util-subtokenize: 2.0.1 micromark-util-symbol: 2.0.0 micromark-util-types: 2.0.0 - dev: true - /micromark-extension-frontmatter@2.0.0: - resolution: {integrity: sha512-C4AkuM3dA58cgZha7zVnuVxBhDsbttIMiytjgsM2XbHAB2faRVaHRle40558FBN+DJcrLNCoqG5mlrpdU4cRtg==} + micromark-extension-frontmatter@2.0.0: dependencies: fault: 2.0.1 micromark-util-character: 2.1.0 micromark-util-symbol: 2.0.0 micromark-util-types: 2.0.0 - dev: true - /micromark-extension-gfm-autolink-literal@1.0.5: - resolution: {integrity: sha512-z3wJSLrDf8kRDOh2qBtoTRD53vJ+CWIyo7uyZuxf/JAbNJjiHsOpG1y5wxk8drtv3ETAHutCu6N3thkOOgueWg==} + micromark-extension-gfm-autolink-literal@1.0.5: dependencies: micromark-util-character: 1.2.0 micromark-util-sanitize-uri: 1.2.0 micromark-util-symbol: 1.1.0 micromark-util-types: 1.1.0 - /micromark-extension-gfm-footnote@1.1.2: - resolution: {integrity: sha512-Yxn7z7SxgyGWRNa4wzf8AhYYWNrwl5q1Z8ii+CSTTIqVkmGZF1CElX2JI8g5yGoM3GAman9/PVCUFUSJ0kB/8Q==} + micromark-extension-gfm-footnote@1.1.2: dependencies: micromark-core-commonmark: 1.1.0 micromark-factory-space: 1.1.0 @@ -4722,8 +6674,7 @@ packages: micromark-util-types: 1.1.0 uvu: 0.5.6 - /micromark-extension-gfm-strikethrough@1.0.7: - resolution: {integrity: sha512-sX0FawVE1o3abGk3vRjOH50L5TTLr3b5XMqnP9YDRb34M0v5OoZhG+OHFz1OffZ9dlwgpTBKaT4XW/AsUVnSDw==} + micromark-extension-gfm-strikethrough@1.0.7: dependencies: micromark-util-chunked: 1.1.0 micromark-util-classify-character: 1.1.0 @@ -4732,8 +6683,7 @@ packages: micromark-util-types: 1.1.0 uvu: 0.5.6 - /micromark-extension-gfm-table@1.0.7: - resolution: {integrity: sha512-3ZORTHtcSnMQEKtAOsBQ9/oHp9096pI/UvdPtN7ehKvrmZZ2+bbWhi0ln+I9drmwXMt5boocn6OlwQzNXeVeqw==} + micromark-extension-gfm-table@1.0.7: dependencies: micromark-factory-space: 1.1.0 micromark-util-character: 1.2.0 @@ -4741,13 +6691,11 @@ packages: micromark-util-types: 1.1.0 uvu: 0.5.6 - /micromark-extension-gfm-tagfilter@1.0.2: - resolution: {integrity: sha512-5XWB9GbAUSHTn8VPU8/1DBXMuKYT5uOgEjJb8gN3mW0PNW5OPHpSdojoqf+iq1xo7vWzw/P8bAHY0n6ijpXF7g==} + micromark-extension-gfm-tagfilter@1.0.2: dependencies: micromark-util-types: 1.1.0 - /micromark-extension-gfm-task-list-item@1.0.5: - resolution: {integrity: sha512-RMFXl2uQ0pNQy6Lun2YBYT9g9INXtWJULgbt01D/x8/6yJ2qpKyzdZD3pi6UIkzF++Da49xAelVKUeUMqd5eIQ==} + micromark-extension-gfm-task-list-item@1.0.5: dependencies: micromark-factory-space: 1.1.0 micromark-util-character: 1.2.0 @@ -4755,8 +6703,7 @@ packages: micromark-util-types: 1.1.0 uvu: 0.5.6 - /micromark-extension-gfm@2.0.3: - resolution: {integrity: sha512-vb9OoHqrhCmbRidQv/2+Bc6pkP0FrtlhurxZofvOEy5o8RtuuvTq+RQ1Vw5ZDNrVraQZu3HixESqbG+0iKk/MQ==} + micromark-extension-gfm@2.0.3: dependencies: micromark-extension-gfm-autolink-literal: 1.0.5 micromark-extension-gfm-footnote: 1.1.2 @@ -4767,8 +6714,7 @@ packages: micromark-util-combine-extensions: 1.1.0 micromark-util-types: 1.1.0 - /micromark-extension-math@2.1.2: - resolution: {integrity: sha512-es0CcOV89VNS9wFmyn+wyFTKweXGW4CEvdaAca6SWRWPyYCbBisnjaHLjWO4Nszuiud84jCpkHsqAJoa768Pvg==} + micromark-extension-math@2.1.2: dependencies: '@types/katex': 0.16.7 katex: 0.16.10 @@ -4777,10 +6723,8 @@ packages: micromark-util-symbol: 1.1.0 micromark-util-types: 1.1.0 uvu: 0.5.6 - dev: false - /micromark-extension-mdx-expression@1.0.8: - resolution: {integrity: sha512-zZpeQtc5wfWKdzDsHRBY003H2Smg+PUi2REhqgIhdzAa5xonhP03FcXxqFSerFiNUr5AWmHpaNPQTBVOS4lrXw==} + micromark-extension-mdx-expression@1.0.8: dependencies: '@types/estree': 1.0.5 micromark-factory-mdx-expression: 1.0.9 @@ -4791,8 +6735,7 @@ packages: micromark-util-types: 1.1.0 uvu: 0.5.6 - /micromark-extension-mdx-jsx@1.0.5: - resolution: {integrity: sha512-gPH+9ZdmDflbu19Xkb8+gheqEDqkSpdCEubQyxuz/Hn8DOXiXvrXeikOoBA71+e8Pfi0/UYmU3wW3H58kr7akA==} + micromark-extension-mdx-jsx@1.0.5: dependencies: '@types/acorn': 4.0.6 '@types/estree': 1.0.5 @@ -4805,13 +6748,11 @@ packages: uvu: 0.5.6 vfile-message: 3.1.4 - /micromark-extension-mdx-md@1.0.1: - resolution: {integrity: sha512-7MSuj2S7xjOQXAjjkbjBsHkMtb+mDGVW6uI2dBL9snOBCbZmoNgDAeZ0nSn9j3T42UE/g2xVNMn18PJxZvkBEA==} + micromark-extension-mdx-md@1.0.1: dependencies: micromark-util-types: 1.1.0 - /micromark-extension-mdxjs-esm@1.0.5: - resolution: {integrity: sha512-xNRBw4aoURcyz/S69B19WnZAkWJMxHMT5hE36GtDAyhoyn/8TuAeqjFJQlwk+MKQsUD7b3l7kFX+vlfVWgcX1w==} + micromark-extension-mdxjs-esm@1.0.5: dependencies: '@types/estree': 1.0.5 micromark-core-commonmark: 1.1.0 @@ -4823,8 +6764,7 @@ packages: uvu: 0.5.6 vfile-message: 3.1.4 - /micromark-extension-mdxjs@1.0.1: - resolution: {integrity: sha512-7YA7hF6i5eKOfFUzZ+0z6avRG52GpWR8DL+kN47y3f2KhxbBZMhmxe7auOeaTBrW2DenbbZTf1ea9tA2hDpC2Q==} + micromark-extension-mdxjs@1.0.1: dependencies: acorn: 8.11.3 acorn-jsx: 5.3.2(acorn@8.11.3) @@ -4835,40 +6775,33 @@ packages: micromark-util-combine-extensions: 1.1.0 micromark-util-types: 1.1.0 - /micromark-factory-destination@1.1.0: - resolution: {integrity: sha512-XaNDROBgx9SgSChd69pjiGKbV+nfHGDPVYFs5dOoDd7ZnMAE+Cuu91BCpsY8RT2NP9vo/B8pds2VQNCLiu0zhg==} + micromark-factory-destination@1.1.0: dependencies: micromark-util-character: 1.2.0 micromark-util-symbol: 1.1.0 micromark-util-types: 1.1.0 - /micromark-factory-destination@2.0.0: - resolution: {integrity: sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==} + micromark-factory-destination@2.0.0: dependencies: micromark-util-character: 2.1.0 micromark-util-symbol: 2.0.0 micromark-util-types: 2.0.0 - dev: true - /micromark-factory-label@1.1.0: - resolution: {integrity: sha512-OLtyez4vZo/1NjxGhcpDSbHQ+m0IIGnT8BoPamh+7jVlzLJBH98zzuCoUeMxvM6WsNeh8wx8cKvqLiPHEACn0w==} + micromark-factory-label@1.1.0: dependencies: micromark-util-character: 1.2.0 micromark-util-symbol: 1.1.0 micromark-util-types: 1.1.0 uvu: 0.5.6 - /micromark-factory-label@2.0.0: - resolution: {integrity: sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==} + micromark-factory-label@2.0.0: dependencies: devlop: 1.1.0 micromark-util-character: 2.1.0 micromark-util-symbol: 2.0.0 micromark-util-types: 2.0.0 - dev: true - /micromark-factory-mdx-expression@1.0.9: - resolution: {integrity: sha512-jGIWzSmNfdnkJq05c7b0+Wv0Kfz3NJ3N4cBjnbO4zjXIlxJr+f8lk+5ZmwFvqdAbUy2q6B5rCY//g0QAAaXDWA==} + micromark-factory-mdx-expression@1.0.9: dependencies: '@types/estree': 1.0.5 micromark-util-character: 1.2.0 @@ -4879,140 +6812,111 @@ packages: uvu: 0.5.6 vfile-message: 3.1.4 - /micromark-factory-space@1.1.0: - resolution: {integrity: sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==} + micromark-factory-space@1.1.0: dependencies: micromark-util-character: 1.2.0 micromark-util-types: 1.1.0 - /micromark-factory-space@2.0.0: - resolution: {integrity: sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==} + micromark-factory-space@2.0.0: dependencies: micromark-util-character: 2.1.0 micromark-util-types: 2.0.0 - dev: true - /micromark-factory-title@1.1.0: - resolution: {integrity: sha512-J7n9R3vMmgjDOCY8NPw55jiyaQnH5kBdV2/UXCtZIpnHH3P6nHUKaH7XXEYuWwx/xUJcawa8plLBEjMPU24HzQ==} + micromark-factory-title@1.1.0: dependencies: micromark-factory-space: 1.1.0 micromark-util-character: 1.2.0 micromark-util-symbol: 1.1.0 micromark-util-types: 1.1.0 - /micromark-factory-title@2.0.0: - resolution: {integrity: sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A==} + micromark-factory-title@2.0.0: dependencies: micromark-factory-space: 2.0.0 micromark-util-character: 2.1.0 micromark-util-symbol: 2.0.0 micromark-util-types: 2.0.0 - dev: true - /micromark-factory-whitespace@1.1.0: - resolution: {integrity: sha512-v2WlmiymVSp5oMg+1Q0N1Lxmt6pMhIHD457whWM7/GUlEks1hI9xj5w3zbc4uuMKXGisksZk8DzP2UyGbGqNsQ==} + micromark-factory-whitespace@1.1.0: dependencies: micromark-factory-space: 1.1.0 micromark-util-character: 1.2.0 micromark-util-symbol: 1.1.0 micromark-util-types: 1.1.0 - /micromark-factory-whitespace@2.0.0: - resolution: {integrity: sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==} + micromark-factory-whitespace@2.0.0: dependencies: micromark-factory-space: 2.0.0 micromark-util-character: 2.1.0 micromark-util-symbol: 2.0.0 micromark-util-types: 2.0.0 - dev: true - /micromark-util-character@1.2.0: - resolution: {integrity: sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==} + micromark-util-character@1.2.0: dependencies: micromark-util-symbol: 1.1.0 micromark-util-types: 1.1.0 - /micromark-util-character@2.1.0: - resolution: {integrity: sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==} + micromark-util-character@2.1.0: dependencies: micromark-util-symbol: 2.0.0 micromark-util-types: 2.0.0 - /micromark-util-chunked@1.1.0: - resolution: {integrity: sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ==} + micromark-util-chunked@1.1.0: dependencies: micromark-util-symbol: 1.1.0 - /micromark-util-chunked@2.0.0: - resolution: {integrity: sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==} + micromark-util-chunked@2.0.0: dependencies: micromark-util-symbol: 2.0.0 - dev: true - /micromark-util-classify-character@1.1.0: - resolution: {integrity: sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw==} + micromark-util-classify-character@1.1.0: dependencies: micromark-util-character: 1.2.0 micromark-util-symbol: 1.1.0 micromark-util-types: 1.1.0 - /micromark-util-classify-character@2.0.0: - resolution: {integrity: sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==} + micromark-util-classify-character@2.0.0: dependencies: micromark-util-character: 2.1.0 micromark-util-symbol: 2.0.0 micromark-util-types: 2.0.0 - dev: true - /micromark-util-combine-extensions@1.1.0: - resolution: {integrity: sha512-Q20sp4mfNf9yEqDL50WwuWZHUrCO4fEyeDCnMGmG5Pr0Cz15Uo7KBs6jq+dq0EgX4DPwwrh9m0X+zPV1ypFvUA==} + micromark-util-combine-extensions@1.1.0: dependencies: micromark-util-chunked: 1.1.0 micromark-util-types: 1.1.0 - /micromark-util-combine-extensions@2.0.0: - resolution: {integrity: sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ==} + micromark-util-combine-extensions@2.0.0: dependencies: micromark-util-chunked: 2.0.0 micromark-util-types: 2.0.0 - dev: true - /micromark-util-decode-numeric-character-reference@1.1.0: - resolution: {integrity: sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw==} + micromark-util-decode-numeric-character-reference@1.1.0: dependencies: micromark-util-symbol: 1.1.0 - /micromark-util-decode-numeric-character-reference@2.0.1: - resolution: {integrity: sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ==} + micromark-util-decode-numeric-character-reference@2.0.1: dependencies: micromark-util-symbol: 2.0.0 - dev: true - /micromark-util-decode-string@1.1.0: - resolution: {integrity: sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ==} + micromark-util-decode-string@1.1.0: dependencies: decode-named-character-reference: 1.0.2 micromark-util-character: 1.2.0 micromark-util-decode-numeric-character-reference: 1.1.0 micromark-util-symbol: 1.1.0 - /micromark-util-decode-string@2.0.0: - resolution: {integrity: sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA==} + micromark-util-decode-string@2.0.0: dependencies: decode-named-character-reference: 1.0.2 micromark-util-character: 2.1.0 micromark-util-decode-numeric-character-reference: 2.0.1 micromark-util-symbol: 2.0.0 - dev: true - /micromark-util-encode@1.1.0: - resolution: {integrity: sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw==} + micromark-util-encode@1.1.0: {} - /micromark-util-encode@2.0.0: - resolution: {integrity: sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==} + micromark-util-encode@2.0.0: {} - /micromark-util-events-to-acorn@1.2.3: - resolution: {integrity: sha512-ij4X7Wuc4fED6UoLWkmo0xJQhsktfNh1J0m8g4PbIMPlx+ek/4YdW5mvbye8z/aZvAPUoxgXHrwVlXAPKMRp1w==} + micromark-util-events-to-acorn@1.2.3: dependencies: '@types/acorn': 4.0.6 '@types/estree': 1.0.5 @@ -5023,89 +6927,68 @@ packages: uvu: 0.5.6 vfile-message: 3.1.4 - /micromark-util-html-tag-name@1.2.0: - resolution: {integrity: sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q==} + micromark-util-html-tag-name@1.2.0: {} - /micromark-util-html-tag-name@2.0.0: - resolution: {integrity: sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==} - dev: true + micromark-util-html-tag-name@2.0.0: {} - /micromark-util-normalize-identifier@1.1.0: - resolution: {integrity: sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q==} + micromark-util-normalize-identifier@1.1.0: dependencies: micromark-util-symbol: 1.1.0 - /micromark-util-normalize-identifier@2.0.0: - resolution: {integrity: sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==} + micromark-util-normalize-identifier@2.0.0: dependencies: micromark-util-symbol: 2.0.0 - dev: true - /micromark-util-resolve-all@1.1.0: - resolution: {integrity: sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA==} + micromark-util-resolve-all@1.1.0: dependencies: micromark-util-types: 1.1.0 - /micromark-util-resolve-all@2.0.0: - resolution: {integrity: sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==} + micromark-util-resolve-all@2.0.0: dependencies: micromark-util-types: 2.0.0 - dev: true - /micromark-util-sanitize-uri@1.2.0: - resolution: {integrity: sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A==} + micromark-util-sanitize-uri@1.2.0: dependencies: micromark-util-character: 1.2.0 micromark-util-encode: 1.1.0 micromark-util-symbol: 1.1.0 - /micromark-util-sanitize-uri@2.0.0: - resolution: {integrity: sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==} + micromark-util-sanitize-uri@2.0.0: dependencies: micromark-util-character: 2.1.0 micromark-util-encode: 2.0.0 micromark-util-symbol: 2.0.0 - /micromark-util-subtokenize@1.1.0: - resolution: {integrity: sha512-kUQHyzRoxvZO2PuLzMt2P/dwVsTiivCK8icYTeR+3WgbuPqfHgPPy7nFKbeqRivBvn/3N3GBiNC+JRTMSxEC7A==} + micromark-util-subtokenize@1.1.0: dependencies: micromark-util-chunked: 1.1.0 micromark-util-symbol: 1.1.0 micromark-util-types: 1.1.0 uvu: 0.5.6 - /micromark-util-subtokenize@2.0.1: - resolution: {integrity: sha512-jZNtiFl/1aY73yS3UGQkutD0UbhTt68qnRpw2Pifmz5wV9h8gOVsN70v+Lq/f1rKaU/W8pxRe8y8Q9FX1AOe1Q==} + micromark-util-subtokenize@2.0.1: dependencies: devlop: 1.1.0 micromark-util-chunked: 2.0.0 micromark-util-symbol: 2.0.0 micromark-util-types: 2.0.0 - dev: true - /micromark-util-symbol@1.1.0: - resolution: {integrity: sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==} + micromark-util-symbol@1.1.0: {} - /micromark-util-symbol@2.0.0: - resolution: {integrity: sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==} + micromark-util-symbol@2.0.0: {} - /micromark-util-types@1.1.0: - resolution: {integrity: sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==} + micromark-util-types@1.1.0: {} - /micromark-util-types@2.0.0: - resolution: {integrity: sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==} + micromark-util-types@2.0.0: {} - /micromark@2.11.4: - resolution: {integrity: sha512-+WoovN/ppKolQOFIAajxi7Lu9kInbPxFuTBVEavFcL8eAfVstoc5MocPmqBeAdBOJV00uaVjegzH4+MA0DN/uA==} + micromark@2.11.4: dependencies: debug: 4.3.4 parse-entities: 2.0.0 transitivePeerDependencies: - supports-color - dev: true - /micromark@3.2.0: - resolution: {integrity: sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA==} + micromark@3.2.0: dependencies: '@types/debug': 4.1.12 debug: 4.3.4 @@ -5127,8 +7010,7 @@ packages: transitivePeerDependencies: - supports-color - /micromark@4.0.0: - resolution: {integrity: sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==} + micromark@4.0.0: dependencies: '@types/debug': 4.1.12 debug: 4.3.4 @@ -5149,87 +7031,47 @@ packages: micromark-util-types: 2.0.0 transitivePeerDependencies: - supports-color - dev: true - /micromatch@4.0.5: - resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} - engines: {node: '>=8.6'} + micromatch@4.0.5: dependencies: braces: 3.0.2 picomatch: 2.3.1 - /min-indent@1.0.1: - resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} - engines: {node: '>=4'} - dev: true + min-indent@1.0.1: {} - /minimalistic-assert@1.0.1: - resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} - dev: true + minimalistic-assert@1.0.1: {} - /minimalistic-crypto-utils@1.0.1: - resolution: {integrity: sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==} - dev: true + minimalistic-crypto-utils@1.0.1: {} - /minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + minimatch@3.1.2: dependencies: brace-expansion: 1.1.11 - dev: true - /minimatch@5.1.6: - resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} - engines: {node: '>=10'} + minimatch@5.1.6: dependencies: brace-expansion: 2.0.1 - dev: true - /minimatch@9.0.3: - resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} - engines: {node: '>=16 || 14 >=14.17'} + minimatch@9.0.3: dependencies: brace-expansion: 2.0.1 - dev: true - /minimatch@9.0.4: - resolution: {integrity: sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==} - engines: {node: '>=16 || 14 >=14.17'} + minimatch@9.0.4: dependencies: brace-expansion: 2.0.1 - dev: true - /minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - dev: false + minimist@1.2.8: {} - /minipass@7.0.4: - resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==} - engines: {node: '>=16 || 14 >=14.17'} - dev: true + minipass@7.0.4: {} - /mri@1.2.0: - resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} - engines: {node: '>=4'} + mri@1.2.0: {} - /ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + ms@2.1.2: {} - /nanoid@3.3.7: - resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - dev: false + nanoid@3.3.7: {} - /natural-compare@1.4.0: - resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - dev: true + natural-compare@1.4.0: {} - /next-mdx-remote@4.4.1(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-1BvyXaIou6xy3XoNF4yaMZUCb6vD2GTAa5ciOa6WoO+gAUTYsb1K4rI/HSC2ogAWLrb/7VSV52skz07vOzmqIQ==} - engines: {node: '>=14', npm: '>=7'} - peerDependencies: - react: '>=16.x <=18.x' - react-dom: '>=16.x <=18.x' + next-mdx-remote@4.4.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@mdx-js/mdx': 2.3.0 '@mdx-js/react': 2.3.0(react@18.3.1) @@ -5239,63 +7081,28 @@ packages: vfile-matter: 3.0.1 transitivePeerDependencies: - supports-color - dev: false - /next-seo@6.5.0(next@14.2.10)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-MfzUeWTN/x/rsKp/1n0213eojO97lIl0unxqbeCY+6pAucViHDA8GSLRRcXpgjsSmBxfCFdfpu7LXbt4ANQoNQ==} - peerDependencies: - next: ^8.1.1-canary.54 || >=9.0.0 - react: '>=16.0.0' - react-dom: '>=16.0.0' + next-seo@6.5.0(next@14.2.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - next: 14.2.10(react-dom@18.3.1)(react@18.3.1) + next: 14.2.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - dev: false - /next-sitemap@4.2.3(next@14.2.10): - resolution: {integrity: sha512-vjdCxeDuWDzldhCnyFCQipw5bfpl4HmZA7uoo3GAaYGjGgfL4Cxb1CiztPuWGmS+auYs7/8OekRS8C2cjdAsjQ==} - engines: {node: '>=14.18'} - hasBin: true - peerDependencies: - next: '*' + next-sitemap@4.2.3(next@14.2.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1)): dependencies: '@corex/deepmerge': 4.0.43 '@next/env': 13.5.6 fast-glob: 3.3.2 minimist: 1.2.8 - next: 14.2.10(react-dom@18.3.1)(react@18.3.1) - dev: false + next: 14.2.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - /next-themes@0.2.1(next@14.2.10)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-B+AKNfYNIzh0vqQQKqQItTS8evEouKD7H5Hj3kmuPERwddR2TxvDSFZuTj6T7Jfn1oyeUyJMydPl1Bkxkh0W7A==} - peerDependencies: - next: '*' - react: '*' - react-dom: '*' + next-themes@0.2.1(next@14.2.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - next: 14.2.10(react-dom@18.3.1)(react@18.3.1) + next: 14.2.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - dev: false - /next@14.2.10(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-sDDExXnh33cY3RkS9JuFEKaS4HmlWmDKP1VJioucCG6z5KuA008DPsDZOzi8UfqEk3Ii+2NCQSJrfbEWtZZfww==} - engines: {node: '>=18.17.0'} - hasBin: true - peerDependencies: - '@opentelemetry/api': ^1.1.0 - '@playwright/test': ^1.41.2 - react: ^18.2.0 - react-dom: ^18.2.0 - sass: ^1.3.0 - peerDependenciesMeta: - '@opentelemetry/api': - optional: true - '@playwright/test': - optional: true - sass: - optional: true + next@14.2.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@next/env': 14.2.10 '@swc/helpers': 0.5.5 @@ -5319,17 +7126,10 @@ packages: transitivePeerDependencies: - '@babel/core' - babel-plugin-macros - dev: false - /nextra-theme-docs@2.13.2(next@14.2.10)(nextra@2.13.2)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-yE4umXaImp1/kf/sFciPj2+EFrNSwd9Db26hi98sIIiujzGf3+9eUgAz45vF9CwBw50FSXxm1QGRcY+slQ4xQQ==} - peerDependencies: - next: '>=9.5.3' - nextra: 2.13.2 - react: '>=16.13.1' - react-dom: '>=16.13.1' + nextra-theme-docs@2.13.2(next@14.2.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(nextra@2.13.2(patch_hash=a4rp2hgojklggjmthmkiyqaek4)(next@14.2.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - '@headlessui/react': 1.7.19(react-dom@18.3.1)(react@18.3.1) + '@headlessui/react': 1.7.19(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@popperjs/core': 2.11.8 clsx: 2.1.1 escape-string-regexp: 5.0.0 @@ -5338,25 +7138,18 @@ packages: git-url-parse: 13.1.1 intersection-observer: 0.12.2 match-sorter: 6.3.4 - next: 14.2.10(react-dom@18.3.1)(react@18.3.1) - next-seo: 6.5.0(next@14.2.10)(react-dom@18.3.1)(react@18.3.1) - next-themes: 0.2.1(next@14.2.10)(react-dom@18.3.1)(react@18.3.1) - nextra: 2.13.2(patch_hash=a4rp2hgojklggjmthmkiyqaek4)(next@14.2.10)(react-dom@18.3.1)(react@18.3.1) + next: 14.2.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + next-seo: 6.5.0(next@14.2.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + next-themes: 0.2.1(next@14.2.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + nextra: 2.13.2(patch_hash=a4rp2hgojklggjmthmkiyqaek4)(next@14.2.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) scroll-into-view-if-needed: 3.1.0 zod: 3.23.8 - dev: false - /nextra@2.13.2(patch_hash=a4rp2hgojklggjmthmkiyqaek4)(next@14.2.10)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-pIgOSXNUqTz1laxV4ChFZOU7lzJAoDHHaBPj8L09PuxrLKqU1BU/iZtXAG6bQeKCx8EPdBsoXxEuENnL9QGnGA==} - engines: {node: '>=16'} - peerDependencies: - next: '>=9.5.3' - react: '>=16.13.1' - react-dom: '>=16.13.1' + nextra@2.13.2(patch_hash=a4rp2hgojklggjmthmkiyqaek4)(next@14.2.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - '@headlessui/react': 1.7.19(react-dom@18.3.1)(react@18.3.1) + '@headlessui/react': 1.7.19(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@mdx-js/mdx': 2.3.0 '@mdx-js/react': 2.3.0(react@18.3.1) '@napi-rs/simple-git': 0.1.16 @@ -5368,8 +7161,8 @@ packages: gray-matter: 4.0.3 katex: 0.16.10 lodash.get: 4.4.2 - next: 14.2.10(react-dom@18.3.1)(react@18.3.1) - next-mdx-remote: 4.4.1(react-dom@18.3.1)(react@18.3.1) + next: 14.2.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + next-mdx-remote: 4.4.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) p-limit: 3.1.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -5387,101 +7180,56 @@ packages: zod: 3.23.8 transitivePeerDependencies: - supports-color - dev: false - patched: true - /no-case@3.0.4: - resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} + no-case@3.0.4: dependencies: lower-case: 2.0.2 tslib: 2.6.2 - dev: false - /node-fetch@2.7.0: - resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} - engines: {node: 4.x || >=6.0.0} - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true + node-fetch@2.7.0: dependencies: whatwg-url: 5.0.0 - dev: true - /non-layered-tidy-tree-layout@2.0.2: - resolution: {integrity: sha512-gkXMxRzUH+PB0ax9dUN0yYF0S25BqeAYqhgMaLUFmpXLEk7Fcu8f4emJuOAY0V8kjDICxROIKsTAKsV/v355xw==} - dev: false + non-layered-tidy-tree-layout@2.0.2: {} - /nopt@7.2.0: - resolution: {integrity: sha512-CVDtwCdhYIvnAzFoJ6NJ6dX3oga9/HyciQDnG1vQDjSLMeKLJ4A93ZqYKDrgYSr1FBY5/hMYC+2VCi24pgpkGA==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - hasBin: true + nopt@7.2.0: dependencies: abbrev: 2.0.0 - dev: true - /npm-normalize-package-bin@3.0.1: - resolution: {integrity: sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dev: true + npm-normalize-package-bin@3.0.1: {} - /npm-run-path@2.0.2: - resolution: {integrity: sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==} - engines: {node: '>=4'} + npm-run-path@2.0.2: dependencies: path-key: 2.0.1 - dev: false - /npm-to-yarn@2.2.1: - resolution: {integrity: sha512-O/j/ROyX0KGLG7O6Ieut/seQ0oiTpHF2tXAcFbpdTLQFiaNtkyTXXocM1fwpaa60dg1qpWj0nHlbNhx6qwuENQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dev: false + npm-to-yarn@2.2.1: {} - /number-to-bn@1.7.0: - resolution: {integrity: sha512-wsJ9gfSz1/s4ZsJN01lyonwuxA1tml6X1yBDnfpMglypcBRFZZkus26EdPSlqS5GJfYddVZa22p3VNb3z5m5Ig==} - engines: {node: '>=6.5.0', npm: '>=3'} + number-to-bn@1.7.0: dependencies: bn.js: 4.11.6 strip-hex-prefix: 1.0.0 - dev: true - /object-inspect@1.13.1: - resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} - dev: false + object-inspect@1.13.1: {} - /object-is@1.1.6: - resolution: {integrity: sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==} - engines: {node: '>= 0.4'} + object-is@1.1.6: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - dev: false - /object-keys@1.1.1: - resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} - engines: {node: '>= 0.4'} - dev: false + object-keys@1.1.1: {} - /object.assign@4.1.5: - resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} - engines: {node: '>= 0.4'} + object.assign@4.1.5: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 has-symbols: 1.0.3 object-keys: 1.1.1 - dev: false - /once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + once@1.4.0: dependencies: wrappy: 1.0.2 - dev: true - /optionator@0.9.4: - resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} - engines: {node: '>= 0.8.0'} + optionator@0.9.4: dependencies: deep-is: 0.1.4 fast-levenshtein: 2.0.6 @@ -5489,63 +7237,39 @@ packages: prelude-ls: 1.2.1 type-check: 0.4.0 word-wrap: 1.2.5 - dev: true - /p-finally@1.0.0: - resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==} - engines: {node: '>=4'} - dev: false + p-finally@1.0.0: {} - /p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} + p-limit@3.1.0: dependencies: yocto-queue: 0.1.0 - /p-limit@4.0.0: - resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + p-limit@4.0.0: dependencies: yocto-queue: 1.0.0 - dev: true - /p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} + p-locate@5.0.0: dependencies: p-limit: 3.1.0 - dev: true - /p-locate@6.0.0: - resolution: {integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + p-locate@6.0.0: dependencies: p-limit: 4.0.0 - dev: true - /param-case@3.0.4: - resolution: {integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==} + param-case@3.0.4: dependencies: dot-case: 3.0.4 tslib: 2.6.2 - dev: false - /parent-module@1.0.1: - resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} - engines: {node: '>=6'} + parent-module@1.0.1: dependencies: callsites: 3.1.0 - dev: true - /parent-module@2.0.0: - resolution: {integrity: sha512-uo0Z9JJeWzv8BG+tRcapBKNJ0dro9cLyczGzulS6EfeyAdeC9sbojtW6XwvYxJkEne9En+J2XEl4zyglVeIwFg==} - engines: {node: '>=8'} + parent-module@2.0.0: dependencies: callsites: 3.1.0 - dev: true - /parse-entities@2.0.0: - resolution: {integrity: sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==} + parse-entities@2.0.0: dependencies: character-entities: 1.2.4 character-entities-legacy: 1.1.4 @@ -5553,10 +7277,8 @@ packages: is-alphanumerical: 1.0.4 is-decimal: 1.0.4 is-hexadecimal: 1.0.4 - dev: true - /parse-entities@4.0.1: - resolution: {integrity: sha512-SWzvYcSJh4d/SGLIOQfZ/CoNv6BTlI6YEQ7Nj82oDVnRpwe/Z/F1EMx42x3JAOwGBlCjeCH0BRJQbQ/opHL17w==} + parse-entities@4.0.1: dependencies: '@types/unist': 2.0.10 character-entities: 2.0.2 @@ -5567,231 +7289,135 @@ packages: is-decimal: 2.0.1 is-hexadecimal: 2.0.1 - /parse-json@6.0.2: - resolution: {integrity: sha512-SA5aMiaIjXkAiBrW/yPgLgQAQg42f7K3ACO+2l/zOvtQBwX58DMUsFJXelW2fx3yMBmWOVkR6j1MGsdSbCA4UA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + parse-json@6.0.2: dependencies: '@babel/code-frame': 7.24.2 error-ex: 1.3.2 json-parse-even-better-errors: 2.3.1 lines-and-columns: 2.0.4 - dev: true - /parse-numeric-range@1.3.0: - resolution: {integrity: sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ==} - dev: false + parse-numeric-range@1.3.0: {} - /parse-path@7.0.0: - resolution: {integrity: sha512-Euf9GG8WT9CdqwuWJGdf3RkUcTBArppHABkO7Lm8IzRQp0e2r/kkFnmhu4TSK30Wcu5rVAZLmfPKSBBi9tWFog==} + parse-path@7.0.0: dependencies: protocols: 2.0.1 - dev: false - /parse-url@8.1.0: - resolution: {integrity: sha512-xDvOoLU5XRrcOZvnI6b8zA6n9O9ejNk/GExuz1yBuWUGn9KA97GI6HTs6u02wKara1CeVmZhH+0TZFdWScR89w==} + parse-url@8.1.0: dependencies: parse-path: 7.0.0 - dev: false - /parse5@7.1.2: - resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} + parse5@7.1.2: dependencies: entities: 4.5.0 - dev: false - /pascal-case@3.1.2: - resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==} + pascal-case@3.1.2: dependencies: no-case: 3.0.4 tslib: 2.6.2 - dev: false - /path-case@3.0.4: - resolution: {integrity: sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg==} + path-case@3.0.4: dependencies: dot-case: 3.0.4 tslib: 2.6.2 - dev: false - /path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} - dev: true + path-exists@4.0.0: {} - /path-exists@5.0.0: - resolution: {integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dev: true + path-exists@5.0.0: {} - /path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} - dev: true + path-is-absolute@1.0.1: {} - /path-key@2.0.1: - resolution: {integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==} - engines: {node: '>=4'} - dev: false + path-key@2.0.1: {} - /path-key@3.1.1: - resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} - engines: {node: '>=8'} - dev: true + path-key@3.1.1: {} - /path-scurry@1.10.2: - resolution: {integrity: sha512-7xTavNy5RQXnsjANvVvMkEjvloOinkAjv/Z6Ildz9v2RinZ4SBKTWFOVRbaF8p0vpHnyjV/UwNDdKuUv6M5qcA==} - engines: {node: '>=16 || 14 >=14.17'} + path-scurry@1.10.2: dependencies: lru-cache: 10.2.2 minipass: 7.0.4 - dev: true - /path-type@4.0.0: - resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} - engines: {node: '>=8'} - dev: true + path-type@4.0.0: {} - /pathval@1.1.1: - resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} - dev: true + pathval@1.1.1: {} - /periscopic@3.1.0: - resolution: {integrity: sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==} + periscopic@3.1.0: dependencies: '@types/estree': 1.0.5 estree-walker: 3.0.3 is-reference: 3.0.2 - dev: false - /picocolors@1.0.0: - resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + picocolors@1.0.0: {} - /picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} + picomatch@2.3.1: {} - /pluralize@8.0.0: - resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} - engines: {node: '>=4'} - dev: true + pluralize@8.0.0: {} - /possible-typed-array-names@1.0.0: - resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} - engines: {node: '>= 0.4'} - dev: false + possible-typed-array-names@1.0.0: {} - /postcss@8.4.31: - resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} - engines: {node: ^10 || ^12 || >=14} + postcss@8.4.31: dependencies: nanoid: 3.3.7 picocolors: 1.0.0 source-map-js: 1.2.0 - dev: false - /prelude-ls@1.2.1: - resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} - engines: {node: '>= 0.8.0'} - dev: true + prelude-ls@1.2.1: {} - /pretty-format@27.5.1: - resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + pretty-format@27.5.1: dependencies: ansi-regex: 5.0.1 ansi-styles: 5.2.0 react-is: 17.0.2 - dev: false - /proc-log@3.0.0: - resolution: {integrity: sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dev: true + proc-log@3.0.0: {} - /property-information@6.5.0: - resolution: {integrity: sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==} - dev: false + property-information@6.5.0: {} - /protocols@2.0.1: - resolution: {integrity: sha512-/XJ368cyBJ7fzLMwLKv1e4vLxOju2MNAIokcr7meSaNcVbWz/CPcW22cP04mwxOErdA5mwjA8Q6w/cdAQxVn7Q==} - dev: false + protocols@2.0.1: {} - /pseudomap@1.0.2: - resolution: {integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==} - dev: false + pseudomap@1.0.2: {} - /punycode@2.3.1: - resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} - engines: {node: '>=6'} - dev: true + punycode@2.3.1: {} - /queue-microtask@1.2.3: - resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + queue-microtask@1.2.3: {} - /randombytes@2.1.0: - resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + randombytes@2.1.0: dependencies: safe-buffer: 5.2.1 - dev: true - /react-dom@18.3.1(react@18.3.1): - resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==} - peerDependencies: - react: ^18.3.1 + react-dom@18.3.1(react@18.3.1): dependencies: loose-envify: 1.4.0 react: 18.3.1 scheduler: 0.23.2 - dev: false - /react-is@17.0.2: - resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} - dev: false + react-is@17.0.2: {} - /react@18.3.1: - resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} - engines: {node: '>=0.10.0'} + react@18.3.1: dependencies: loose-envify: 1.4.0 - dev: false - /read-package-json-fast@3.0.2: - resolution: {integrity: sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + read-package-json-fast@3.0.2: dependencies: json-parse-even-better-errors: 3.0.1 npm-normalize-package-bin: 3.0.1 - dev: true - /readable-stream@3.6.2: - resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} - engines: {node: '>= 6'} + readable-stream@3.6.2: dependencies: inherits: 2.0.4 string_decoder: 1.3.0 util-deprecate: 1.0.2 - dev: true - /reading-time@1.5.0: - resolution: {integrity: sha512-onYyVhBNr4CmAxFsKS7bz+uTLRakypIe4R+5A824vBSkQy/hB3fZepoVEf8OVAxzLvK+H/jm9TzpI3ETSm64Kg==} - dev: false + reading-time@1.5.0: {} - /regenerator-runtime@0.14.1: - resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} - dev: false + regenerator-runtime@0.14.1: {} - /regexp.prototype.flags@1.5.2: - resolution: {integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==} - engines: {node: '>= 0.4'} + regexp.prototype.flags@1.5.2: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-errors: 1.3.0 set-function-name: 2.0.2 - dev: false - /rehype-katex@7.0.0: - resolution: {integrity: sha512-h8FPkGE00r2XKU+/acgqwWUlyzve1IiOKwsEkg4pDL3k48PiE0Pt+/uLtVHDVkN1yA4iurZN6UES8ivHVEQV6Q==} + rehype-katex@7.0.0: dependencies: '@types/hast': 3.0.4 '@types/katex': 0.16.7 @@ -5800,40 +7426,27 @@ packages: katex: 0.16.10 unist-util-visit-parents: 6.0.1 vfile: 6.0.1 - dev: false - /rehype-pretty-code@0.9.11(shiki@0.14.7): - resolution: {integrity: sha512-Eq90eCYXQJISktfRZ8PPtwc5SUyH6fJcxS8XOMnHPUQZBtC6RYo67gGlley9X2nR8vlniPj0/7oCDEYHKQa/oA==} - engines: {node: '>=16'} - peerDependencies: - shiki: '*' + rehype-pretty-code@0.9.11(shiki@0.14.7): dependencies: '@types/hast': 2.3.10 hash-obj: 4.0.0 parse-numeric-range: 1.3.0 shiki: 0.14.7 - dev: false - /rehype-raw@7.0.0: - resolution: {integrity: sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==} + rehype-raw@7.0.0: dependencies: '@types/hast': 3.0.4 hast-util-raw: 9.0.2 vfile: 6.0.1 - dev: false - /remark-code-import@1.2.0(patch_hash=heylvfasxh3ubj2edns2svea2m): - resolution: {integrity: sha512-fgwLruqlZbVOIhCJFjY+JDwPZhA4/eK3InJzN8Ox8UDdtudpG212JwtRj6la+lAzJU7JmSEyewZSukVZdknt3Q==} - engines: {node: '>= 12'} + remark-code-import@1.2.0(patch_hash=heylvfasxh3ubj2edns2svea2m): dependencies: strip-indent: 4.0.0 to-gatsby-remark-plugin: 0.1.0 unist-util-visit: 4.1.2 - dev: true - patched: true - /remark-frontmatter@5.0.0: - resolution: {integrity: sha512-XTFYvNASMe5iPN0719nPrdItC9aU0ssC4v14mH1BCi1u0n1gAocqcujWUrByftZTbLhRtiKRyjYTSIOcr69UVQ==} + remark-frontmatter@5.0.0: dependencies: '@types/mdast': 4.0.3 mdast-util-frontmatter: 2.0.1 @@ -5841,10 +7454,8 @@ packages: unified: 11.0.4 transitivePeerDependencies: - supports-color - dev: true - /remark-gfm@3.0.1: - resolution: {integrity: sha512-lEFDoi2PICJyNrACFOfDD3JlLkuSbOa5Wd8EPt06HUdptv8Gn0bxYTdbU/XXQ3swAPkEaGxxPN9cbnMHvVu1Ig==} + remark-gfm@3.0.1: dependencies: '@types/mdast': 3.0.15 mdast-util-gfm: 2.0.2 @@ -5853,8 +7464,7 @@ packages: transitivePeerDependencies: - supports-color - /remark-lint-blockquote-indentation@3.1.2: - resolution: {integrity: sha512-5DOrFsZd5dXqA4p/VZvWSrqIWNFbBXjX7IV/FkVkxlNhNF/0FMf/4v8x1I2W3mzaZ7yDsWS/egpZnmligq1ckQ==} + remark-lint-blockquote-indentation@3.1.2: dependencies: '@types/mdast': 3.0.15 pluralize: 8.0.0 @@ -5863,20 +7473,16 @@ packages: unist-util-generated: 2.0.1 unist-util-position: 4.0.4 unist-util-visit: 4.1.2 - dev: true - /remark-lint-checkbox-character-style@4.1.2: - resolution: {integrity: sha512-5ITz+1cCuJ3Jv/Q7rKgDEucCOnIgjWDnSHPJA1tb4TI/D316h+ALbDhZIpP8gyfAm6sBAh3Pwz9XZJN2uJB5UQ==} + remark-lint-checkbox-character-style@4.1.2: dependencies: '@types/mdast': 3.0.15 unified: 10.1.2 unified-lint-rule: 2.1.2 unist-util-position: 4.0.4 unist-util-visit: 4.1.2 - dev: true - /remark-lint-code-block-style@3.1.2: - resolution: {integrity: sha512-3wsWmzzdyEsB9sOzBOf46TSkwwVKXN2JpTEQb6feN0Tl6Vg75F7T9MHqMz7aqk/56bOXSxUzdpXDscGBhziLRA==} + remark-lint-code-block-style@3.1.2: dependencies: '@types/mdast': 3.0.15 unified: 10.1.2 @@ -5884,38 +7490,30 @@ packages: unist-util-generated: 2.0.1 unist-util-position: 4.0.4 unist-util-visit: 4.1.2 - dev: true - /remark-lint-emphasis-marker@3.1.2: - resolution: {integrity: sha512-hPZ8vxZrIfxmLA5B66bA8y3PdHjcCQuaLsySIqi5PM2DkpN6a7zAP3v1znyRSaYJ1ANVWcu00/0bNzuUjflGCA==} + remark-lint-emphasis-marker@3.1.2: dependencies: '@types/mdast': 3.0.15 unified: 10.1.2 unified-lint-rule: 2.1.2 unist-util-position: 4.0.4 unist-util-visit: 4.1.2 - dev: true - /remark-lint-fenced-code-marker@3.1.2: - resolution: {integrity: sha512-6XNqjOuhT+0c7Q/22aCsMz61ne9g8HRpYF79EXQPdbzYa+PcfPXMiQKStONY3PfC8OE2/3WXI2zcs8w9x+8+VQ==} + remark-lint-fenced-code-marker@3.1.2: dependencies: '@types/mdast': 3.0.15 unified: 10.1.2 unified-lint-rule: 2.1.2 unist-util-position: 4.0.4 unist-util-visit: 4.1.2 - dev: true - /remark-lint-final-newline@2.1.2: - resolution: {integrity: sha512-K0FdPGPyEB94PwNgopwVJFE8oRWi7IhY2ycXFVAMReI51el7EHB8F1gX14tB6p6zyGy6mUh69bCVU9mMTNeOUg==} + remark-lint-final-newline@2.1.2: dependencies: '@types/mdast': 3.0.15 unified: 10.1.2 unified-lint-rule: 2.1.2 - dev: true - /remark-lint-frontmatter-schema@3.15.4(patch_hash=jaxvkozlhcbn7zjsiti5ocoubi): - resolution: {integrity: sha512-egChkbtCCG4hw1F2qoipzSxp6Ea9z4pxaVkWYa36DnCZ9fn3GhCNyOUjbFSIvdhVcWN+AqvHdqPbXC9Pp81Hmg==} + remark-lint-frontmatter-schema@3.15.4(patch_hash=jaxvkozlhcbn7zjsiti5ocoubi): dependencies: '@apidevtools/json-schema-ref-parser': 11.1.0 ajv: 8.12.0 @@ -5924,11 +7522,8 @@ packages: minimatch: 9.0.3 unified-lint-rule: 2.1.2 yaml: 2.3.3 - dev: true - patched: true - /remark-lint-hard-break-spaces@3.1.2: - resolution: {integrity: sha512-HaW0xsl3TI7VFAqGWWcZtPqyz0NWu19KKjSO7OGFTUJU4S9YiRnhIxmSFM0ZLSsVAynE+dhzVKa8U7dOpWDcOg==} + remark-lint-hard-break-spaces@3.1.2: dependencies: '@types/mdast': 3.0.15 unified: 10.1.2 @@ -5936,10 +7531,8 @@ packages: unist-util-generated: 2.0.1 unist-util-position: 4.0.4 unist-util-visit: 4.1.2 - dev: true - /remark-lint-heading-style@3.1.2: - resolution: {integrity: sha512-0RkcRPV/H2bPFgeInzBkK1cWUwtFTm83I+Db/Z5tDY02GzKOosHLvxtJyj/1391/opAH1LYbHtHWffir99IUgw==} + remark-lint-heading-style@3.1.2: dependencies: '@types/mdast': 3.0.15 mdast-util-heading-style: 2.0.1 @@ -5947,10 +7540,8 @@ packages: unified-lint-rule: 2.1.2 unist-util-generated: 2.0.1 unist-util-visit: 4.1.2 - dev: true - /remark-lint-link-title-style@3.1.2: - resolution: {integrity: sha512-if4MahYJVvQUWlrXDF8GSv4b9VtLSgMSDHeikQp1/hGYlihLl9uGw3nlL5Lf9DqTN0qaT6RPbXOjuuzHlk38sg==} + remark-lint-link-title-style@3.1.2: dependencies: '@types/mdast': 3.0.15 unified: 10.1.2 @@ -5958,20 +7549,16 @@ packages: unist-util-position: 4.0.4 unist-util-visit: 4.1.2 vfile-location: 4.1.0 - dev: true - /remark-lint-list-item-bullet-indent@4.1.2: - resolution: {integrity: sha512-WgU5nooqIEm6f35opcbHKBzWrdFJA3XcyTfB3nv/v0KX43/h6qFGmmMJ5kEiaFExuQp3dZSdatWuY0YZ9YRbUg==} + remark-lint-list-item-bullet-indent@4.1.2: dependencies: '@types/mdast': 3.0.15 pluralize: 8.0.0 unified: 10.1.2 unified-lint-rule: 2.1.2 unist-util-visit: 4.1.2 - dev: true - /remark-lint-list-item-content-indent@3.1.2: - resolution: {integrity: sha512-TB0pmrWiRaQW80Y/PILFQTnHDghRxXNzMwyawlP+DBF9gNom3pEBmb4ZlGQlN0aa3r8VWeIKdv1ylHrfXE0vqA==} + remark-lint-list-item-content-indent@3.1.2: dependencies: '@types/mdast': 3.0.15 pluralize: 8.0.0 @@ -5979,10 +7566,8 @@ packages: unified-lint-rule: 2.1.2 unist-util-position: 4.0.4 unist-util-visit: 4.1.2 - dev: true - /remark-lint-list-item-indent@3.1.2: - resolution: {integrity: sha512-tkrra1pxZVE4OVJGfN435u/v0ljruXU+dHzWiKDYeifquD4aWhJxvSApu7+FbE098D/4usVXgMxwFkNhrpZcSQ==} + remark-lint-list-item-indent@3.1.2: dependencies: '@types/mdast': 3.0.15 pluralize: 8.0.0 @@ -5991,10 +7576,8 @@ packages: unist-util-generated: 2.0.1 unist-util-position: 4.0.4 unist-util-visit: 4.1.2 - dev: true - /remark-lint-no-blockquote-without-marker@5.1.2: - resolution: {integrity: sha512-QPbqsrt7EfpSWqTkZJ9tepabPIhBDlNqZkuxxMQYD0OQ2N+tHDUq3zE1JxI5ts1V9o/mWApgySocqGd3jlcKmQ==} + remark-lint-no-blockquote-without-marker@5.1.2: dependencies: '@types/mdast': 3.0.15 unified: 10.1.2 @@ -6003,10 +7586,8 @@ packages: unist-util-position: 4.0.4 unist-util-visit: 4.1.2 vfile-location: 4.1.0 - dev: true - /remark-lint-no-duplicate-definitions@3.1.2: - resolution: {integrity: sha512-vi0nXA7p+pjQOorZOkr9E+QDhG74JAdbzqglWPrWWNI3z2rUYWYHTNSyWJbwEXaIIcev1ZAw8SCAOis5MNm+pA==} + remark-lint-no-duplicate-definitions@3.1.2: dependencies: '@types/mdast': 3.0.15 unified: 10.1.2 @@ -6015,10 +7596,8 @@ packages: unist-util-position: 4.0.4 unist-util-stringify-position: 3.0.3 unist-util-visit: 4.1.2 - dev: true - /remark-lint-no-heading-content-indent@4.1.2: - resolution: {integrity: sha512-TTxFsm1f4ZHFxZQCuz7j0QK4RvP6oArTiwazKLr16yaZe1608ypogMek4A30j2xX8WuO9+2uBzLXCY5OBo5x5Q==} + remark-lint-no-heading-content-indent@4.1.2: dependencies: '@types/mdast': 3.0.15 mdast-util-heading-style: 2.0.1 @@ -6028,10 +7607,8 @@ packages: unist-util-generated: 2.0.1 unist-util-position: 4.0.4 unist-util-visit: 4.1.2 - dev: true - /remark-lint-no-inline-padding@4.1.2: - resolution: {integrity: sha512-dGyhWsiqCZS3Slob0EVBUfsFBbdpMIBCvb56LlCgaHbnLsnNYx8PpF/wA5CgsN8BXIbXfRpyPB5cIJwIq5taYg==} + remark-lint-no-inline-padding@4.1.2: dependencies: '@types/mdast': 3.0.15 mdast-util-to-string: 3.2.0 @@ -6039,10 +7616,8 @@ packages: unified-lint-rule: 2.1.2 unist-util-generated: 2.0.1 unist-util-visit: 4.1.2 - dev: true - /remark-lint-no-literal-urls@3.1.2: - resolution: {integrity: sha512-4tV9JGLKxAMFSuWDMOqLozkFJ3HyRvhzgrPrxASoziaml23m7UXAozk5dkIrFny1cN2oG988Z8tORxX2FL1Ilw==} + remark-lint-no-literal-urls@3.1.2: dependencies: '@types/mdast': 3.0.15 mdast-util-to-string: 3.2.0 @@ -6051,30 +7626,24 @@ packages: unist-util-generated: 2.0.1 unist-util-position: 4.0.4 unist-util-visit: 4.1.2 - dev: true - /remark-lint-no-shortcut-reference-image@3.1.2: - resolution: {integrity: sha512-NX4XJFPyDeJJ77pmETxRj4oM/zayf7Lmn/O87HgExBkQIPz2NYbDeKD8QEyliLaV/oKA2rQufpzuFw55xa1Tww==} + remark-lint-no-shortcut-reference-image@3.1.2: dependencies: '@types/mdast': 3.0.15 unified: 10.1.2 unified-lint-rule: 2.1.2 unist-util-generated: 2.0.1 unist-util-visit: 4.1.2 - dev: true - /remark-lint-no-shortcut-reference-link@3.1.2: - resolution: {integrity: sha512-/9iPN7FLKaaIzw4tLWKu7Rx0wAP7E2EuzIeentQlkY0rO/mMHipmT3IlgiebsAInKagzTY6TNFoG1rq2VnaCcA==} + remark-lint-no-shortcut-reference-link@3.1.2: dependencies: '@types/mdast': 3.0.15 unified: 10.1.2 unified-lint-rule: 2.1.2 unist-util-generated: 2.0.1 unist-util-visit: 4.1.2 - dev: true - /remark-lint-no-undefined-references@4.2.1: - resolution: {integrity: sha512-HdNg5b2KiuNplcuVvRtsrUiROw557kAG1CiZYB7jQrrVWFgd86lKTa3bDiywe+87dGrGmHd3qQ28eZYTuHz2Nw==} + remark-lint-no-undefined-references@4.2.1: dependencies: '@types/mdast': 3.0.15 micromark-util-normalize-identifier: 1.1.0 @@ -6084,20 +7653,16 @@ packages: unist-util-position: 4.0.4 unist-util-visit: 4.1.2 vfile-location: 4.1.0 - dev: true - /remark-lint-no-unused-definitions@3.1.2: - resolution: {integrity: sha512-bOcaJAnjKxT3kASFquUA3fO9xem9wZhVqt8TbqjA84+G4n40qjaLXDs/4vq73aMsSde73K0f3j1u0pMe7et8yQ==} + remark-lint-no-unused-definitions@3.1.2: dependencies: '@types/mdast': 3.0.15 unified: 10.1.2 unified-lint-rule: 2.1.2 unist-util-generated: 2.0.1 unist-util-visit: 4.1.2 - dev: true - /remark-lint-ordered-list-marker-style@3.1.2: - resolution: {integrity: sha512-62iVE/YQsA0Azaqt8yAJWPplWLS47kDLjXeC2PlRIAzCqbNt9qH3HId8vZ15QTSrp8rHmJwrCMdcqV6AZUi7gQ==} + remark-lint-ordered-list-marker-style@3.1.2: dependencies: '@types/mdast': 3.0.15 unified: 10.1.2 @@ -6105,30 +7670,24 @@ packages: unist-util-generated: 2.0.1 unist-util-position: 4.0.4 unist-util-visit: 4.1.2 - dev: true - /remark-lint-rule-style@3.1.2: - resolution: {integrity: sha512-0CsX2XcX9pIhAP5N7Y8mhYXp3/Ld+NvxXY1p0LHAq0NZu17UsZLuegvx/s25uFbQs08DcmSqyKnepU9qGGqmTQ==} + remark-lint-rule-style@3.1.2: dependencies: '@types/mdast': 3.0.15 unified: 10.1.2 unified-lint-rule: 2.1.2 unist-util-position: 4.0.4 unist-util-visit: 4.1.2 - dev: true - /remark-lint-strong-marker@3.1.2: - resolution: {integrity: sha512-U/g4wngmiI0Q6WBRQG6pZxnDS33Wt/0QYA3+KNFBDykoi1vXsDEorIqy3dEag9z6XHwcMvFDsff6VRUhaOJWQg==} + remark-lint-strong-marker@3.1.2: dependencies: '@types/mdast': 3.0.15 unified: 10.1.2 unified-lint-rule: 2.1.2 unist-util-position: 4.0.4 unist-util-visit: 4.1.2 - dev: true - /remark-lint-table-cell-padding@4.1.3: - resolution: {integrity: sha512-N9xtnS6MG/H3srAMjqqaF26A7socr87pIgt64dr5rxoSbDRWRPChGQ8y7wKyV8VeyRNF37e3E5KB3bQVqjSYaQ==} + remark-lint-table-cell-padding@4.1.3: dependencies: '@types/mdast': 3.0.15 '@types/unist': 2.0.10 @@ -6136,30 +7695,24 @@ packages: unified-lint-rule: 2.1.2 unist-util-position: 4.0.4 unist-util-visit: 4.1.2 - dev: true - /remark-lint-table-pipe-alignment@3.1.3: - resolution: {integrity: sha512-bnE8WrB4kSrN+Yr+xN2GHWVgGukeSFU43qPMrpCzTyOSbzep366wORlFKqZmyFPEkIZ/uAUFS0Qm9DND66Yz/A==} + remark-lint-table-pipe-alignment@3.1.3: dependencies: '@types/mdast': 3.0.15 unified: 10.1.2 unified-lint-rule: 2.1.2 unist-util-position: 4.0.4 unist-util-visit: 4.1.2 - dev: true - /remark-lint-table-pipes@4.1.2: - resolution: {integrity: sha512-Ex2cJDXA0hdD9CC5Nu0p3K5LP+AhzPvk4sIOSbevCTSRyCS/SkNk4CQ6pwWBxuPVuHQUkqXkT8lgu8wwr/9A3A==} + remark-lint-table-pipes@4.1.2: dependencies: '@types/mdast': 3.0.15 unified: 10.1.2 unified-lint-rule: 2.1.2 unist-util-position: 4.0.4 unist-util-visit: 4.1.2 - dev: true - /remark-lint-unordered-list-marker-style@3.1.2: - resolution: {integrity: sha512-JFiyB4ZprJGGndCaFB8FssXd48m4Kh+CUqzNgu3lBLEiW8dEAGRlD9M2AzyyA+Q29WJP/FntDCbP22DeON91UA==} + remark-lint-unordered-list-marker-style@3.1.2: dependencies: '@types/mdast': 3.0.15 unified: 10.1.2 @@ -6167,37 +7720,30 @@ packages: unist-util-generated: 2.0.1 unist-util-position: 4.0.4 unist-util-visit: 4.1.2 - dev: true - /remark-lint@9.1.2: - resolution: {integrity: sha512-m9e/aPlh7tsvfJfj8tPxrQzD6oEdb9Foko+Ya/6OwUP9EoGMfehv1Qtv26W1DoH58Wn8rT8CD+KuprTWscMmIA==} + remark-lint@9.1.2: dependencies: '@types/mdast': 3.0.15 remark-message-control: 7.1.1 unified: 10.1.2 transitivePeerDependencies: - supports-color - dev: true - /remark-math@5.1.1: - resolution: {integrity: sha512-cE5T2R/xLVtfFI4cCePtiRn+e6jKMtFDR3P8V3qpv8wpKjwvHoBA4eJzvX+nVrnlNy0911bdGmuspCSwetfYHw==} + remark-math@5.1.1: dependencies: '@types/mdast': 3.0.15 mdast-util-math: 2.0.2 micromark-extension-math: 2.1.2 unified: 10.1.2 - dev: false - /remark-mdx@2.3.0: - resolution: {integrity: sha512-g53hMkpM0I98MU266IzDFMrTD980gNF3BJnkyFcmN+dD873mQeD5rdMO3Y2X+x8umQfbSE0PcoEDl7ledSA+2g==} + remark-mdx@2.3.0: dependencies: mdast-util-mdx: 2.0.1 micromark-extension-mdxjs: 1.0.1 transitivePeerDependencies: - supports-color - /remark-message-control@7.1.1: - resolution: {integrity: sha512-xKRWl1NTBOKed0oEtCd8BUfH5m4s8WXxFFSoo7uUwx6GW/qdCy4zov5LfPyw7emantDmhfWn5PdIZgcbVcWMDQ==} + remark-message-control@7.1.1: dependencies: '@types/mdast': 3.0.15 mdast-comment-marker: 2.1.2 @@ -6206,10 +7752,8 @@ packages: vfile: 5.3.7 transitivePeerDependencies: - supports-color - dev: true - /remark-parse@10.0.2: - resolution: {integrity: sha512-3ydxgHa/ZQzG8LvC7jTXccARYDcRld3VfcgIIFs7bI6vbRSxJJmzgLEIIoYKyrfhaY+ujuWaf/PJiMZXoiCXgw==} + remark-parse@10.0.2: dependencies: '@types/mdast': 3.0.15 mdast-util-from-markdown: 1.3.1 @@ -6217,8 +7761,7 @@ packages: transitivePeerDependencies: - supports-color - /remark-parse@11.0.0: - resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==} + remark-parse@11.0.0: dependencies: '@types/mdast': 4.0.3 mdast-util-from-markdown: 2.0.0 @@ -6226,10 +7769,8 @@ packages: unified: 11.0.4 transitivePeerDependencies: - supports-color - dev: true - /remark-preset-lint-consistent@5.1.2: - resolution: {integrity: sha512-RQrWBFmyIkKfXtp9P1Fui7UbGSfXth9nuvRJUVnO0vfevBJe02iyMZWPokXSwkDOI/cM539wj0i3vrQupz+v5A==} + remark-preset-lint-consistent@5.1.2: dependencies: '@types/mdast': 3.0.15 remark-lint: 9.1.2 @@ -6248,10 +7789,8 @@ packages: unified: 10.1.2 transitivePeerDependencies: - supports-color - dev: true - /remark-preset-lint-recommended@6.1.3: - resolution: {integrity: sha512-DGjbeP2TsFmQeJflUiIvJWAOs1PxJt7SG3WQyMxOppkRr/up+mxWVkuv+6AUuaR0EsuaaFGz7WmZM5TrSSFWJw==} + remark-preset-lint-recommended@6.1.3: dependencies: '@types/mdast': 3.0.15 remark-lint: 9.1.2 @@ -6272,44 +7811,34 @@ packages: unified: 10.1.2 transitivePeerDependencies: - supports-color - dev: true - /remark-reading-time@2.0.1: - resolution: {integrity: sha512-fy4BKy9SRhtYbEHvp6AItbRTnrhiDGbqLQTSYVbQPGuRCncU1ubSsh9p/W5QZSxtYcUXv8KGL0xBgPLyNJA1xw==} + remark-reading-time@2.0.1: dependencies: estree-util-is-identifier-name: 2.1.0 estree-util-value-to-estree: 1.3.0 reading-time: 1.5.0 unist-util-visit: 3.1.0 - dev: false - /remark-rehype@10.1.0: - resolution: {integrity: sha512-EFmR5zppdBp0WQeDVZ/b66CWJipB2q2VLNFMabzDSGR66Z2fQii83G5gTBbgGEnEEA0QRussvrFHxk1HWGJskw==} + remark-rehype@10.1.0: dependencies: '@types/hast': 2.3.10 '@types/mdast': 3.0.15 mdast-util-to-hast: 12.3.0 unified: 10.1.2 - dev: false - /remark-stringify@10.0.3: - resolution: {integrity: sha512-koyOzCMYoUHudypbj4XpnAKFbkddRMYZHwghnxd7ue5210WzGw6kOBwauJTRUMq16jsovXx8dYNvSSWP89kZ3A==} + remark-stringify@10.0.3: dependencies: '@types/mdast': 3.0.15 mdast-util-to-markdown: 1.5.0 unified: 10.1.2 - dev: true - /remark-stringify@11.0.0: - resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==} + remark-stringify@11.0.0: dependencies: '@types/mdast': 4.0.3 mdast-util-to-markdown: 2.1.0 unified: 11.0.4 - dev: true - /remark@15.0.1: - resolution: {integrity: sha512-Eht5w30ruCXgFmxVUSlNWQ9iiimq07URKeFS3hNc8cUWy1llX4KDWfyEDZRycMc+znsN9Ux5/tJ/BFdgdOwA3A==} + remark@15.0.1: dependencies: '@types/mdast': 4.0.3 remark-parse: 11.0.0 @@ -6317,123 +7846,71 @@ packages: unified: 11.0.4 transitivePeerDependencies: - supports-color - dev: true - - /remove-accents@0.5.0: - resolution: {integrity: sha512-8g3/Otx1eJaVD12e31UbJj1YzdtVvzH85HV7t+9MJYk/u3XmkOUJ5Ys9wQrf9PCPK8+xn4ymzqYCiZl6QWKn+A==} - dev: false - /repeat-string@1.6.1: - resolution: {integrity: sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==} - engines: {node: '>=0.10'} - dev: true + remove-accents@0.5.0: {} - /require-from-string@2.0.2: - resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} - engines: {node: '>=0.10.0'} - dev: true + repeat-string@1.6.1: {} - /resolve-from@4.0.0: - resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} - engines: {node: '>=4'} - dev: true + require-from-string@2.0.2: {} - /resolve-from@5.0.0: - resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} - engines: {node: '>=8'} - dev: true + resolve-from@4.0.0: {} - /reusify@1.0.4: - resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} - engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + resolve-from@5.0.0: {} - /rimraf@3.0.2: - resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} - hasBin: true + reusify@1.0.4: {} + + rimraf@3.0.2: dependencies: glob: 7.2.3 - dev: true - /rlp@2.2.7: - resolution: {integrity: sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ==} - hasBin: true + rlp@2.2.7: dependencies: bn.js: 5.2.1 - dev: true - /robust-predicates@3.0.2: - resolution: {integrity: sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==} - dev: false + robust-predicates@3.0.2: {} - /run-parallel@1.2.0: - resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + run-parallel@1.2.0: dependencies: queue-microtask: 1.2.3 - /rw@1.3.3: - resolution: {integrity: sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==} - dev: false + rw@1.3.3: {} - /sade@1.8.1: - resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} - engines: {node: '>=6'} + sade@1.8.1: dependencies: mri: 1.2.0 - /safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - dev: true + safe-buffer@5.2.1: {} - /safer-buffer@2.1.2: - resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - dev: false + safer-buffer@2.1.2: {} - /scheduler@0.23.2: - resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} + scheduler@0.23.2: dependencies: loose-envify: 1.4.0 - dev: false - /scroll-into-view-if-needed@3.1.0: - resolution: {integrity: sha512-49oNpRjWRvnU8NyGVmUaYG4jtTkNonFZI86MmGRDqBphEK2EXT9gdEUoQPZhuBM8yWHxCWbobltqYO5M4XrUvQ==} + scroll-into-view-if-needed@3.1.0: dependencies: compute-scroll-into-view: 3.1.0 - dev: false - /scrypt-js@3.0.1: - resolution: {integrity: sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==} - dev: true + scrypt-js@3.0.1: {} - /search-insights@2.17.2: - resolution: {integrity: sha512-zFNpOpUO+tY2D85KrxJ+aqwnIfdEGi06UH2+xEb+Bp9Mwznmauqc9djbnBibJO5mpfUPPa8st6Sx65+vbeO45g==} - dev: false + search-insights@2.17.2: {} - /section-matter@1.0.0: - resolution: {integrity: sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==} - engines: {node: '>=4'} + section-matter@1.0.0: dependencies: extend-shallow: 2.0.1 kind-of: 6.0.3 - /semver@7.6.0: - resolution: {integrity: sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==} - engines: {node: '>=10'} - hasBin: true + semver@7.6.0: dependencies: lru-cache: 6.0.0 - dev: true - /sentence-case@3.0.4: - resolution: {integrity: sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg==} + sentence-case@3.0.4: dependencies: no-case: 3.0.4 tslib: 2.6.2 upper-case-first: 2.0.2 - dev: false - /set-function-length@1.2.2: - resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} - engines: {node: '>= 0.4'} + set-function-length@1.2.2: dependencies: define-data-property: 1.1.4 es-errors: 1.3.0 @@ -6441,363 +7918,206 @@ packages: get-intrinsic: 1.2.4 gopd: 1.0.1 has-property-descriptors: 1.0.2 - dev: false - /set-function-name@2.0.2: - resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} - engines: {node: '>= 0.4'} + set-function-name@2.0.2: dependencies: define-data-property: 1.1.4 es-errors: 1.3.0 functions-have-names: 1.2.3 has-property-descriptors: 1.0.2 - dev: false - /shebang-command@1.2.0: - resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} - engines: {node: '>=0.10.0'} + shebang-command@1.2.0: dependencies: shebang-regex: 1.0.0 - dev: false - /shebang-command@2.0.0: - resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} - engines: {node: '>=8'} + shebang-command@2.0.0: dependencies: shebang-regex: 3.0.0 - dev: true - /shebang-regex@1.0.0: - resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==} - engines: {node: '>=0.10.0'} - dev: false + shebang-regex@1.0.0: {} - /shebang-regex@3.0.0: - resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} - engines: {node: '>=8'} - dev: true + shebang-regex@3.0.0: {} - /shiki@0.14.7: - resolution: {integrity: sha512-dNPAPrxSc87ua2sKJ3H5dQ/6ZaY8RNnaAqK+t0eG7p0Soi2ydiqbGOTaZCqaYvA/uZYfS1LJnemt3Q+mSfcPCg==} + shiki@0.14.7: dependencies: ansi-sequence-parser: 1.1.1 jsonc-parser: 3.2.1 vscode-oniguruma: 1.7.0 vscode-textmate: 8.0.0 - dev: false - /side-channel@1.0.6: - resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} - engines: {node: '>= 0.4'} + side-channel@1.0.6: dependencies: call-bind: 1.0.7 es-errors: 1.3.0 get-intrinsic: 1.2.4 object-inspect: 1.13.1 - dev: false - /signal-exit@3.0.7: - resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + signal-exit@3.0.7: {} - /signal-exit@4.1.0: - resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} - engines: {node: '>=14'} - dev: true + signal-exit@4.1.0: {} - /slash@3.0.0: - resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} - engines: {node: '>=8'} + slash@3.0.0: {} - /snake-case@3.0.4: - resolution: {integrity: sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==} + snake-case@3.0.4: dependencies: dot-case: 3.0.4 tslib: 2.6.2 - dev: false - /sort-keys@5.0.0: - resolution: {integrity: sha512-Pdz01AvCAottHTPQGzndktFNdbRA75BgOfeT1hH+AMnJFv8lynkPi42rfeEhpx1saTEI3YNMWxfqu0sFD1G8pw==} - engines: {node: '>=12'} + sort-keys@5.0.0: dependencies: is-plain-obj: 4.1.0 - dev: false - /source-map-js@1.2.0: - resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} - engines: {node: '>=0.10.0'} - dev: false + source-map-js@1.2.0: {} - /source-map@0.7.4: - resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} - engines: {node: '>= 8'} - dev: false + source-map@0.7.4: {} - /space-separated-tokens@2.0.2: - resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} - dev: false + space-separated-tokens@2.0.2: {} - /sprintf-js@1.0.3: - resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + sprintf-js@1.0.3: {} - /stop-iteration-iterator@1.0.0: - resolution: {integrity: sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==} - engines: {node: '>= 0.4'} + stop-iteration-iterator@1.0.0: dependencies: internal-slot: 1.0.7 - dev: false - /streamsearch@1.1.0: - resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} - engines: {node: '>=10.0.0'} - dev: false + streamsearch@1.1.0: {} - /string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} + string-width@4.2.3: dependencies: emoji-regex: 8.0.0 is-fullwidth-code-point: 3.0.0 strip-ansi: 6.0.1 - dev: true - /string-width@5.1.2: - resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} - engines: {node: '>=12'} + string-width@5.1.2: dependencies: eastasianwidth: 0.2.0 emoji-regex: 9.2.2 strip-ansi: 7.1.0 - dev: true - /string_decoder@1.3.0: - resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + string_decoder@1.3.0: dependencies: safe-buffer: 5.2.1 - dev: true - /stringify-entities@4.0.4: - resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} + stringify-entities@4.0.4: dependencies: character-entities-html4: 2.1.0 character-entities-legacy: 3.0.0 - /strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} + strip-ansi@6.0.1: dependencies: ansi-regex: 5.0.1 - dev: true - /strip-ansi@7.1.0: - resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} - engines: {node: '>=12'} + strip-ansi@7.1.0: dependencies: ansi-regex: 6.0.1 - dev: true - /strip-bom-string@1.0.0: - resolution: {integrity: sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==} - engines: {node: '>=0.10.0'} + strip-bom-string@1.0.0: {} - /strip-eof@1.0.0: - resolution: {integrity: sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==} - engines: {node: '>=0.10.0'} - dev: false + strip-eof@1.0.0: {} - /strip-hex-prefix@1.0.0: - resolution: {integrity: sha512-q8d4ue7JGEiVcypji1bALTos+0pWtyGlivAWyPuTkHzuTCJqrK9sWxYQZUq6Nq3cuyv3bm734IhHvHtGGURU6A==} - engines: {node: '>=6.5.0', npm: '>=3'} + strip-hex-prefix@1.0.0: dependencies: is-hex-prefixed: 1.0.0 - dev: true - /strip-indent@4.0.0: - resolution: {integrity: sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA==} - engines: {node: '>=12'} + strip-indent@4.0.0: dependencies: min-indent: 1.0.1 - dev: true - /strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} - dev: true + strip-json-comments@3.1.1: {} - /style-to-object@0.4.4: - resolution: {integrity: sha512-HYNoHZa2GorYNyqiCaBgsxvcJIn7OHq6inEga+E6Ke3m5JkoqpQbnFssk4jwe+K7AhGa2fcha4wSOf1Kn01dMg==} + style-to-object@0.4.4: dependencies: inline-style-parser: 0.1.1 - dev: false - /styled-jsx@5.1.1(react@18.3.1): - resolution: {integrity: sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==} - engines: {node: '>= 12.0.0'} - peerDependencies: - '@babel/core': '*' - babel-plugin-macros: '*' - react: '>= 16.8.0 || 17.x.x || ^18.0.0-0' - peerDependenciesMeta: - '@babel/core': - optional: true - babel-plugin-macros: - optional: true + styled-jsx@5.1.1(react@18.3.1): dependencies: client-only: 0.0.1 react: 18.3.1 - dev: false - /stylis@4.3.2: - resolution: {integrity: sha512-bhtUjWd/z6ltJiQwg0dUfxEJ+W+jdqQd8TbWLWyeIJHlnsqmGLRFFd8e5mA0AZi/zx90smXRlN66YMTcaSFifg==} - dev: false + stylis@4.3.2: {} - /supports-color@4.5.0: - resolution: {integrity: sha512-ycQR/UbvI9xIlEdQT1TQqwoXtEldExbCEAJgRo5YXlmSKjv6ThHnP9/vwGa1gr19Gfw+LkFd7KqYMhzrRC5JYw==} - engines: {node: '>=4'} + supports-color@4.5.0: dependencies: has-flag: 2.0.0 - dev: false - /supports-color@5.5.0: - resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} - engines: {node: '>=4'} + supports-color@5.5.0: dependencies: has-flag: 3.0.0 - /supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} + supports-color@7.2.0: dependencies: has-flag: 4.0.0 - /supports-color@9.4.0: - resolution: {integrity: sha512-VL+lNrEoIXww1coLPOmiEmK/0sGigko5COxI09KzHc2VJXJsQ37UaQ+8quuxjDeA7+KnLGTWRyOXSLLR2Wb4jw==} - engines: {node: '>=12'} - dev: true + supports-color@9.4.0: {} - /synckit@0.9.0: - resolution: {integrity: sha512-7RnqIMq572L8PeEzKeBINYEJDDxpcH8JEgLwUqBd3TkofhFRbkq4QLR0u+36avGAhCRbk2nnmjcW9SE531hPDg==} - engines: {node: ^14.18.0 || >=16.0.0} + synckit@0.9.0: dependencies: '@pkgr/core': 0.1.1 tslib: 2.6.2 - dev: true - /tabbable@6.2.0: - resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==} - dev: false + tabbable@6.2.0: {} - /text-table@0.2.0: - resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} - dev: true + text-table@0.2.0: {} - /tinyurl@1.1.7: - resolution: {integrity: sha512-NCnyDkBTByS/pLH/Vrx/DPL8EciAUDoAvruaM/WnQLfX6Uame3D1nuWNy2Z9CXw7rcsok0tjuonRLolhmyz5rg==} - deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. - dev: true + tinyurl@1.1.7: {} - /title@3.5.3: - resolution: {integrity: sha512-20JyowYglSEeCvZv3EZ0nZ046vLarO37prvV0mbtQV7C8DJPGgN967r8SJkqd3XK3K3lD3/Iyfp3avjfil8Q2Q==} - hasBin: true + title@3.5.3: dependencies: arg: 1.0.0 chalk: 2.3.0 clipboardy: 1.2.2 titleize: 1.0.0 - dev: false - /titleize@1.0.0: - resolution: {integrity: sha512-TARUb7z1pGvlLxgPk++7wJ6aycXF3GJ0sNSBTAsTuJrQG5QuZlkUQP+zl+nbjAh4gMX9yDw9ZYklMd7vAfJKEw==} - engines: {node: '>=0.10.0'} - dev: false + titleize@1.0.0: {} - /to-gatsby-remark-plugin@0.1.0: - resolution: {integrity: sha512-blmhJ/gIrytWnWLgPSRCkhCPeki6UBK2daa3k9mGahN7GjwHu8KrS7F70MvwlsG7IE794JLgwAdCbi4hU4faFQ==} + to-gatsby-remark-plugin@0.1.0: dependencies: to-vfile: 6.1.0 - dev: true - /to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} + to-regex-range@5.0.1: dependencies: is-number: 7.0.0 - /to-vfile@6.1.0: - resolution: {integrity: sha512-BxX8EkCxOAZe+D/ToHdDsJcVI4HqQfmw0tCkp31zf3dNP/XWIAjU4CmeuSwsSoOzOTqHPOL0KUzyZqJplkD0Qw==} + to-vfile@6.1.0: dependencies: is-buffer: 2.0.5 vfile: 4.2.1 - dev: true - /to-vfile@7.2.4: - resolution: {integrity: sha512-2eQ+rJ2qGbyw3senPI0qjuM7aut8IYXK6AEoOWb+fJx/mQYzviTckm1wDjq91QYHAPBTYzmdJXxMFA6Mk14mdw==} + to-vfile@7.2.4: dependencies: is-buffer: 2.0.5 vfile: 5.3.7 - dev: true - /tr46@0.0.3: - resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - dev: true + tr46@0.0.3: {} - /treeify@1.1.0: - resolution: {integrity: sha512-1m4RA7xVAJrSGrrXGs0L3YTwyvBs2S8PbRHaLZAkFw7JR8oIFwYtysxlBZhYIa7xSyiYJKZ3iGrrk55cGA3i9A==} - engines: {node: '>=0.6'} - dev: true + treeify@1.1.0: {} - /trim-lines@3.0.1: - resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} - dev: false + trim-lines@3.0.1: {} - /trough@2.2.0: - resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} + trough@2.2.0: {} - /ts-dedent@2.2.0: - resolution: {integrity: sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==} - engines: {node: '>=6.10'} - dev: false + ts-dedent@2.2.0: {} - /tslib@2.6.2: - resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} + tslib@2.6.2: {} - /type-check@0.4.0: - resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} - engines: {node: '>= 0.8.0'} + type-check@0.4.0: dependencies: prelude-ls: 1.2.1 - dev: true - /type-detect@4.0.8: - resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} - engines: {node: '>=4'} - dev: true + type-detect@4.0.8: {} - /type-fest@0.20.2: - resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} - engines: {node: '>=10'} - dev: true + type-fest@0.20.2: {} - /type-fest@1.4.0: - resolution: {integrity: sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==} - engines: {node: '>=10'} + type-fest@1.4.0: {} - /typedarray-to-buffer@3.1.5: - resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} + typedarray-to-buffer@3.1.5: dependencies: is-typedarray: 1.0.0 - dev: true - /typedarray@0.0.6: - resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} - dev: true + typedarray@0.0.6: {} - /typescript@5.4.5: - resolution: {integrity: sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==} - engines: {node: '>=14.17'} - hasBin: true + typescript@5.4.5: {} - /unified-engine@10.1.0: - resolution: {integrity: sha512-5+JDIs4hqKfHnJcVCxTid1yBoI/++FfF/1PFdSMpaftZZZY+qg2JFruRbf7PaIwa9KgLotXQV3gSjtY0IdcFGQ==} + unified-engine@10.1.0: dependencies: '@types/concat-stream': 2.0.3 '@types/debug': 4.1.12 @@ -6823,19 +8143,15 @@ packages: yaml: 2.4.2 transitivePeerDependencies: - supports-color - dev: true - /unified-lint-rule@2.1.2: - resolution: {integrity: sha512-JWudPtRN7TLFHVLEVZ+Rm8FUb6kCAtHxEXFgBGDxRSdNMnGyTU5zyYvduHSF/liExlFB3vdFvsAHnNVE/UjAwA==} + unified-lint-rule@2.1.2: dependencies: '@types/unist': 2.0.10 trough: 2.2.0 unified: 10.1.2 vfile: 5.3.7 - dev: true - /unified-message-control@4.0.0: - resolution: {integrity: sha512-1b92N+VkPHftOsvXNOtkJm4wHlr+UDmTBF2dUzepn40oy9NxanJ9xS1RwUBTjXJwqr2K0kMbEyv1Krdsho7+Iw==} + unified-message-control@4.0.0: dependencies: '@types/unist': 2.0.10 unist-util-is: 5.2.1 @@ -6843,10 +8159,8 @@ packages: vfile: 5.3.7 vfile-location: 4.1.0 vfile-message: 3.1.4 - dev: true - /unified@10.1.2: - resolution: {integrity: sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==} + unified@10.1.2: dependencies: '@types/unist': 2.0.10 bail: 2.0.2 @@ -6856,8 +8170,7 @@ packages: trough: 2.2.0 vfile: 5.3.7 - /unified@11.0.4: - resolution: {integrity: sha512-apMPnyLjAX+ty4OrNap7yumyVAMlKx5IWU2wlzzUdYJO9A8f1p9m/gywF/GM2ZDFcjQPrx59Mc90KwmxsoklxQ==} + unified@11.0.4: dependencies: '@types/unist': 3.0.2 bail: 2.0.2 @@ -6866,217 +8179,160 @@ packages: is-plain-obj: 4.1.0 trough: 2.2.0 vfile: 6.0.1 - dev: true - /unique-string@3.0.0: - resolution: {integrity: sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==} - engines: {node: '>=12'} + unique-string@3.0.0: dependencies: crypto-random-string: 4.0.0 - dev: true - /unist-util-find-after@5.0.0: - resolution: {integrity: sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==} + unist-util-find-after@5.0.0: dependencies: '@types/unist': 3.0.2 unist-util-is: 6.0.0 - dev: false - /unist-util-generated@2.0.1: - resolution: {integrity: sha512-qF72kLmPxAw0oN2fwpWIqbXAVyEqUzDHMsbtPvOudIlUzXYFIeQIuxXQCRCFh22B7cixvU0MG7m3MW8FTq/S+A==} + unist-util-generated@2.0.1: {} - /unist-util-inspect@7.0.2: - resolution: {integrity: sha512-Op0XnmHUl6C2zo/yJCwhXQSm/SmW22eDZdWP2qdf4WpGrgO1ZxFodq+5zFyeRGasFjJotAnLgfuD1jkcKqiH1Q==} + unist-util-inspect@7.0.2: dependencies: '@types/unist': 2.0.10 - dev: true - /unist-util-is@5.2.1: - resolution: {integrity: sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==} + unist-util-is@5.2.1: dependencies: '@types/unist': 2.0.10 - /unist-util-is@6.0.0: - resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} + unist-util-is@6.0.0: dependencies: '@types/unist': 3.0.2 - /unist-util-position-from-estree@1.1.2: - resolution: {integrity: sha512-poZa0eXpS+/XpoQwGwl79UUdea4ol2ZuCYguVaJS4qzIOMDzbqz8a3erUCOmubSZkaOuGamb3tX790iwOIROww==} + unist-util-position-from-estree@1.1.2: dependencies: '@types/unist': 2.0.10 - /unist-util-position@4.0.4: - resolution: {integrity: sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg==} + unist-util-position@4.0.4: dependencies: '@types/unist': 2.0.10 - /unist-util-position@5.0.0: - resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} + unist-util-position@5.0.0: dependencies: '@types/unist': 3.0.2 - dev: false - /unist-util-remove-position@4.0.2: - resolution: {integrity: sha512-TkBb0HABNmxzAcfLf4qsIbFbaPDvMO6wa3b3j4VcEzFVaw1LBKwnW4/sRJ/atSLSzoIg41JWEdnE7N6DIhGDGQ==} + unist-util-remove-position@4.0.2: dependencies: '@types/unist': 2.0.10 unist-util-visit: 4.1.2 - /unist-util-remove-position@5.0.0: - resolution: {integrity: sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==} + unist-util-remove-position@5.0.0: dependencies: '@types/unist': 3.0.2 unist-util-visit: 5.0.0 - dev: false - /unist-util-remove@4.0.0: - resolution: {integrity: sha512-b4gokeGId57UVRX/eVKej5gXqGlc9+trkORhFJpu9raqZkZhU0zm8Doi05+HaiBsMEIJowL+2WtQ5ItjsngPXg==} + unist-util-remove@4.0.0: dependencies: '@types/unist': 3.0.2 unist-util-is: 6.0.0 unist-util-visit-parents: 6.0.1 - dev: false - /unist-util-stringify-position@2.0.3: - resolution: {integrity: sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==} + unist-util-stringify-position@2.0.3: dependencies: '@types/unist': 2.0.10 - dev: true - /unist-util-stringify-position@3.0.3: - resolution: {integrity: sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==} + unist-util-stringify-position@3.0.3: dependencies: '@types/unist': 2.0.10 - /unist-util-stringify-position@4.0.0: - resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} + unist-util-stringify-position@4.0.0: dependencies: '@types/unist': 3.0.2 - /unist-util-visit-parents@4.1.1: - resolution: {integrity: sha512-1xAFJXAKpnnJl8G7K5KgU7FY55y3GcLIXqkzUj5QF/QVP7biUm0K0O2oqVkYsdjzJKifYeWn9+o6piAK2hGSHw==} + unist-util-visit-parents@4.1.1: dependencies: '@types/unist': 2.0.10 unist-util-is: 5.2.1 - /unist-util-visit-parents@5.1.3: - resolution: {integrity: sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==} + unist-util-visit-parents@5.1.3: dependencies: '@types/unist': 2.0.10 unist-util-is: 5.2.1 - /unist-util-visit-parents@6.0.1: - resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==} + unist-util-visit-parents@6.0.1: dependencies: '@types/unist': 3.0.2 unist-util-is: 6.0.0 - /unist-util-visit@3.1.0: - resolution: {integrity: sha512-Szoh+R/Ll68QWAyQyZZpQzZQm2UPbxibDvaY8Xc9SUtYgPsDzx5AWSk++UUt2hJuow8mvwR+rG+LQLw+KsuAKA==} + unist-util-visit@3.1.0: dependencies: '@types/unist': 2.0.10 unist-util-is: 5.2.1 unist-util-visit-parents: 4.1.1 - /unist-util-visit@4.1.2: - resolution: {integrity: sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==} + unist-util-visit@4.1.2: dependencies: '@types/unist': 2.0.10 unist-util-is: 5.2.1 unist-util-visit-parents: 5.1.3 - /unist-util-visit@5.0.0: - resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} + unist-util-visit@5.0.0: dependencies: '@types/unist': 3.0.2 unist-util-is: 6.0.0 unist-util-visit-parents: 6.0.1 - /upper-case-first@2.0.2: - resolution: {integrity: sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==} + upper-case-first@2.0.2: dependencies: tslib: 2.6.2 - dev: false - /upper-case@2.0.2: - resolution: {integrity: sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg==} + upper-case@2.0.2: dependencies: tslib: 2.6.2 - dev: false - /uri-js@4.4.1: - resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + uri-js@4.4.1: dependencies: punycode: 2.3.1 - dev: true - /utf8@3.0.0: - resolution: {integrity: sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ==} - dev: true + utf8@3.0.0: {} - /util-deprecate@1.0.2: - resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - dev: true + util-deprecate@1.0.2: {} - /uuid@9.0.1: - resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} - hasBin: true - dev: false + uuid@9.0.1: {} - /uvu@0.5.6: - resolution: {integrity: sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA==} - engines: {node: '>=8'} - hasBin: true + uvu@0.5.6: dependencies: dequal: 2.0.3 diff: 5.2.0 kleur: 4.1.5 sade: 1.8.1 - /vfile-location@4.1.0: - resolution: {integrity: sha512-YF23YMyASIIJXpktBa4vIGLJ5Gs88UB/XePgqPmTa7cDA+JeO3yclbpheQYCHjVHBn/yePzrXuygIL+xbvRYHw==} + vfile-location@4.1.0: dependencies: '@types/unist': 2.0.10 vfile: 5.3.7 - dev: true - /vfile-location@5.0.2: - resolution: {integrity: sha512-NXPYyxyBSH7zB5U6+3uDdd6Nybz6o6/od9rk8bp9H8GR3L+cm/fC0uUTbqBmUTnMCUDslAGBOIKNfvvb+gGlDg==} + vfile-location@5.0.2: dependencies: '@types/unist': 3.0.2 vfile: 6.0.1 - dev: false - /vfile-matter@3.0.1: - resolution: {integrity: sha512-CAAIDwnh6ZdtrqAuxdElUqQRQDQgbbIrYtDYI8gCjXS1qQ+1XdLoK8FIZWxJwn0/I+BkSSZpar3SOgjemQz4fg==} + vfile-matter@3.0.1: dependencies: '@types/js-yaml': 4.0.9 is-buffer: 2.0.5 js-yaml: 4.1.0 - dev: false - /vfile-message@2.0.4: - resolution: {integrity: sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==} + vfile-message@2.0.4: dependencies: '@types/unist': 2.0.10 unist-util-stringify-position: 2.0.3 - dev: true - /vfile-message@3.1.4: - resolution: {integrity: sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==} + vfile-message@3.1.4: dependencies: '@types/unist': 2.0.10 unist-util-stringify-position: 3.0.3 - /vfile-message@4.0.2: - resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==} + vfile-message@4.0.2: dependencies: '@types/unist': 3.0.2 unist-util-stringify-position: 4.0.0 - /vfile-reporter@7.0.5: - resolution: {integrity: sha512-NdWWXkv6gcd7AZMvDomlQbK3MqFWL1RlGzMn++/O2TI+68+nqxCPTvLugdOtfSzXmjh+xUyhp07HhlrbJjT+mw==} + vfile-reporter@7.0.5: dependencies: '@types/supports-color': 8.1.3 string-width: 5.1.2 @@ -7086,100 +8342,69 @@ packages: vfile-message: 3.1.4 vfile-sort: 3.0.1 vfile-statistics: 2.0.1 - dev: true - /vfile-sort@3.0.1: - resolution: {integrity: sha512-1os1733XY6y0D5x0ugqSeaVJm9lYgj0j5qdcZQFyxlZOSy1jYarL77lLyb5gK4Wqr1d5OxmuyflSO3zKyFnTFw==} + vfile-sort@3.0.1: dependencies: vfile: 5.3.7 vfile-message: 3.1.4 - dev: true - /vfile-statistics@2.0.1: - resolution: {integrity: sha512-W6dkECZmP32EG/l+dp2jCLdYzmnDBIw6jwiLZSER81oR5AHRcVqL+k3Z+pfH1R73le6ayDkJRMk0sutj1bMVeg==} + vfile-statistics@2.0.1: dependencies: vfile: 5.3.7 vfile-message: 3.1.4 - dev: true - /vfile@4.2.1: - resolution: {integrity: sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==} + vfile@4.2.1: dependencies: '@types/unist': 2.0.10 is-buffer: 2.0.5 unist-util-stringify-position: 2.0.3 vfile-message: 2.0.4 - dev: true - /vfile@5.3.7: - resolution: {integrity: sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==} + vfile@5.3.7: dependencies: '@types/unist': 2.0.10 is-buffer: 2.0.5 unist-util-stringify-position: 3.0.3 vfile-message: 3.1.4 - /vfile@6.0.1: - resolution: {integrity: sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw==} + vfile@6.0.1: dependencies: '@types/unist': 3.0.2 unist-util-stringify-position: 4.0.0 vfile-message: 4.0.2 - /viem@2.9.28(typescript@5.4.5): - resolution: {integrity: sha512-/1iTg8yQlCNJ+7wSmdsBNB/vhjWqFJtTH6XZXHjGXrZnlBxAtHR5ZAr5TvTJc/2nhVIVE4BkCe5JCrIiSuZodg==} - peerDependencies: - typescript: '>=5.0.4' - peerDependenciesMeta: - typescript: - optional: true + viem@2.9.28(typescript@5.4.5)(zod@3.23.8): dependencies: '@adraffy/ens-normalize': 1.10.0 '@noble/curves': 1.2.0 '@noble/hashes': 1.3.2 '@scure/bip32': 1.3.2 '@scure/bip39': 1.2.1 - abitype: 1.0.0(typescript@5.4.5) + abitype: 1.0.0(typescript@5.4.5)(zod@3.23.8) isows: 1.0.3(ws@8.13.0) - typescript: 5.4.5 ws: 8.13.0 + optionalDependencies: + typescript: 5.4.5 transitivePeerDependencies: - bufferutil - utf-8-validate - zod - dev: false - /vscode-languageserver-textdocument@1.0.11: - resolution: {integrity: sha512-X+8T3GoiwTVlJbicx/sIAF+yuJAqz8VvwJyoMVhwEMoEKE/fkDmrqUgDMyBECcM2A2frVZIUj5HI/ErRXCfOeA==} - dev: true + vscode-languageserver-textdocument@1.0.11: {} - /vscode-oniguruma@1.7.0: - resolution: {integrity: sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==} - dev: false + vscode-oniguruma@1.7.0: {} - /vscode-textmate@8.0.0: - resolution: {integrity: sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg==} - dev: false + vscode-textmate@8.0.0: {} - /vscode-uri@3.0.8: - resolution: {integrity: sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==} - dev: true + vscode-uri@3.0.8: {} - /walk-up-path@3.0.1: - resolution: {integrity: sha512-9YlCL/ynK3CTlrSRrDxZvUauLzAswPCrsaCgilqFevUYpeEW0/3ScEjaa3kbW/T0ghhkEr7mv+fpjqn1Y1YuTA==} - dev: true + walk-up-path@3.0.1: {} - /web-namespaces@2.0.1: - resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} - dev: false + web-namespaces@2.0.1: {} - /web-worker@1.3.0: - resolution: {integrity: sha512-BSR9wyRsy/KOValMgd5kMyr3JzpdeoR9KVId8u5GVlTTAtNChlsE4yTxeY7zMdNSyOmoKBv8NH2qeRY9Tg+IaA==} - dev: false + web-worker@1.3.0: {} - /web3-utils@1.10.4: - resolution: {integrity: sha512-tsu8FiKJLk2PzhDl9fXbGUWTkkVXYhtTA+SmEFkKft+9BgwLxfCRpU96sWv7ICC8zixBNd3JURVoiR3dUXgP8A==} - engines: {node: '>=8.0.0'} + web3-utils@1.10.4: dependencies: '@ethereumjs/util': 8.1.0 bn.js: 5.2.1 @@ -7189,163 +8414,86 @@ packages: number-to-bn: 1.7.0 randombytes: 2.1.0 utf8: 3.0.0 - dev: true - /webidl-conversions@3.0.1: - resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} - dev: true + webidl-conversions@3.0.1: {} - /whatwg-url@5.0.0: - resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + whatwg-url@5.0.0: dependencies: tr46: 0.0.3 webidl-conversions: 3.0.1 - dev: true - /which-boxed-primitive@1.0.2: - resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} + which-boxed-primitive@1.0.2: dependencies: is-bigint: 1.0.4 is-boolean-object: 1.1.2 is-number-object: 1.0.7 is-string: 1.0.7 is-symbol: 1.0.4 - dev: false - /which-collection@1.0.2: - resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} - engines: {node: '>= 0.4'} + which-collection@1.0.2: dependencies: is-map: 2.0.3 is-set: 2.0.3 is-weakmap: 2.0.2 is-weakset: 2.0.3 - dev: false - /which-typed-array@1.1.15: - resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==} - engines: {node: '>= 0.4'} + which-typed-array@1.1.15: dependencies: available-typed-arrays: 1.0.7 call-bind: 1.0.7 for-each: 0.3.3 gopd: 1.0.1 has-tostringtag: 1.0.2 - dev: false - /which@1.3.1: - resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} - hasBin: true + which@1.3.1: dependencies: isexe: 2.0.0 - dev: false - /which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true + which@2.0.2: dependencies: isexe: 2.0.0 - dev: true - /word-wrap@1.2.5: - resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} - engines: {node: '>=0.10.0'} - dev: true + word-wrap@1.2.5: {} - /wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} + wrap-ansi@7.0.0: dependencies: ansi-styles: 4.3.0 string-width: 4.2.3 strip-ansi: 6.0.1 - dev: true - /wrap-ansi@8.1.0: - resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} - engines: {node: '>=12'} + wrap-ansi@8.1.0: dependencies: ansi-styles: 6.2.1 string-width: 5.1.2 strip-ansi: 7.1.0 - dev: true - /wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - dev: true + wrappy@1.0.2: {} - /write-file-atomic@3.0.3: - resolution: {integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==} + write-file-atomic@3.0.3: dependencies: imurmurhash: 0.1.4 is-typedarray: 1.0.0 signal-exit: 3.0.7 typedarray-to-buffer: 3.1.5 - dev: true - /ws@7.4.6: - resolution: {integrity: sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==} - engines: {node: '>=8.3.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - dev: true + ws@7.4.6: {} - /ws@8.13.0: - resolution: {integrity: sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - dev: false + ws@8.13.0: {} - /xdg-basedir@5.1.0: - resolution: {integrity: sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ==} - engines: {node: '>=12'} - dev: true + xdg-basedir@5.1.0: {} - /yallist@2.1.2: - resolution: {integrity: sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==} - dev: false + yallist@2.1.2: {} - /yallist@4.0.0: - resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - dev: true + yallist@4.0.0: {} - /yaml@2.3.3: - resolution: {integrity: sha512-zw0VAJxgeZ6+++/su5AFoqBbZbrEakwu+X0M5HmcwUiBL7AzcuPKjj5we4xfQLp78LkEMpD0cOnUhmgOVy3KdQ==} - engines: {node: '>= 14'} - dev: true + yaml@2.3.3: {} - /yaml@2.4.2: - resolution: {integrity: sha512-B3VqDZ+JAg1nZpaEmWtTXUlBneoGx6CPM9b0TENK6aoSu5t73dItudwdgmi6tHlIZZId4dZ9skcAQ2UbcyAeVA==} - engines: {node: '>= 14'} - hasBin: true - dev: true + yaml@2.4.2: {} - /yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} + yocto-queue@0.1.0: {} - /yocto-queue@1.0.0: - resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} - engines: {node: '>=12.20'} - dev: true + yocto-queue@1.0.0: {} - /zod@3.23.8: - resolution: {integrity: sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==} - dev: false + zod@3.23.8: {} - /zwitch@2.0.4: - resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} + zwitch@2.0.4: {} From cf860120c40c7e5cba6629f5b897fcf4b4b99a4b Mon Sep 17 00:00:00 2001 From: cpengilly <29023967+cpengilly@users.noreply.github.com> Date: Sun, 13 Oct 2024 21:16:20 -0700 Subject: [PATCH 170/565] superchainERC20 - explainer added to op stack > protocol > interop - symbolic link added to builders > app devs > contracts --- .../app-developers/contracts/_meta.json | 3 +- .../contracts/superchain-erc20.mdx | 6 ++ pages/stack/protocol/interop/_meta.json | 3 +- .../protocol/interop/superchain-erc20.mdx | 61 +++++++++++++++++++ words.txt | 2 + 5 files changed, 73 insertions(+), 2 deletions(-) create mode 100644 pages/builders/app-developers/contracts/superchain-erc20.mdx create mode 100644 pages/stack/protocol/interop/superchain-erc20.mdx diff --git a/pages/builders/app-developers/contracts/_meta.json b/pages/builders/app-developers/contracts/_meta.json index f8ed2c3be..50aa18684 100644 --- a/pages/builders/app-developers/contracts/_meta.json +++ b/pages/builders/app-developers/contracts/_meta.json @@ -1,5 +1,6 @@ { "compatibility": "Solidity Compatibility", "system-contracts": "System Contracts", - "optimization": "Cost Optimization" + "optimization": "Cost Optimization", + "superchain-erc20": "SuperchainERC20 Token Standard" } diff --git a/pages/builders/app-developers/contracts/superchain-erc20.mdx b/pages/builders/app-developers/contracts/superchain-erc20.mdx new file mode 100644 index 000000000..e966aac46 --- /dev/null +++ b/pages/builders/app-developers/contracts/superchain-erc20.mdx @@ -0,0 +1,6 @@ +--- +--- + +import SuperchainERC20 from '@/pages/stack/protocol/interop/superchain-erc20.mdx' + + diff --git a/pages/stack/protocol/interop/_meta.json b/pages/stack/protocol/interop/_meta.json index 309682173..d59a68f5d 100644 --- a/pages/stack/protocol/interop/_meta.json +++ b/pages/stack/protocol/interop/_meta.json @@ -1,5 +1,6 @@ { "explainer": "Interop Explainer", "cross-chain-message": "Anatomy of Cross-Chain Message", - "supersim": "Supersim Multichain Development Environment" + "supersim": "Supersim Multichain Development Environment", + "superchain-erc20": "SuperchainERC20 Token Standard" } \ No newline at end of file diff --git a/pages/stack/protocol/interop/superchain-erc20.mdx b/pages/stack/protocol/interop/superchain-erc20.mdx new file mode 100644 index 000000000..7d38205af --- /dev/null +++ b/pages/stack/protocol/interop/superchain-erc20.mdx @@ -0,0 +1,61 @@ +--- +title: SuperchainERC20 Token Standard +lang: en-US +description: Learn basic details about the SuperchainERC20 token standard. +--- + +import { Callout } from 'nextra/components' + +# SuperchainERC20 Token Standard + + + Interop is currently in active development and not yet ready for production use. The information provided here may change. Check back regularly for the most up-to-date information. + + +`SuperchainERC20` is a token standard specifically designed for the Superchain ecosystem. It serves as the foundation for interoperable tokens within the Superchain, including `GovToken`, `WETH` (Wrapped Ether), and migrated `OptimismMintableERC20Tokens`. This standard is crucial for enabling a more interconnected and efficient token ecosystem within the Superchain, balancing the needs for interoperability, security, and simplified governance. + +## Features and benefits + +* **Interoperability**: Enables seamless token transfers between different chains within the Superchain ecosystem. +* **Built-in bridging**: The bridging interface exists on the token itself, eliminating the need for a central bridge predeploy (e.g., `bridgeERC20`, `bridgeERC20To`). +* **Consistency**: Provides a unified standard for tokens across all Superchain-compatible networks. +* **Governance minimized**: Designed to keep tokens within the Superchain ecosystem with minimal governance intervention. +* **Superchain-specific**: Tailored for internal use cases within the Superchain, addressing specific needs that other standards may not cover. + +## Major components + +* **Token Contract**: implements the `SuperchainERC20` standard with bridging functionality. +* **Factory Predeploy**: uses a `create3`-based factory for deploying `SuperchainERC20` tokens consistently across chains. +* **Bridging Functions**: using methods like `bridgeERC20` and `bridgeERC20To` for cross-chain transfers. +* **Minting Role**: modifies the definition to be minting role-based rather than interface-based. + +## Comparison to other standards + +`SuperchainERC20` differs from other token standards in its focus and implementation: + +* `SuperchainERC20` is tailored for the Superchain, while other token standards might aim for broader cross-chain compatibility. +* `SuperchainERC20` is governance-minimized and designed to keep tokens within the Superchain ecosystem. +* The bridging functionality in `SuperchainERC20` is part of the token itself, not relying on external bridges. + + + Projects moving from other token standards may need to adapt to the `SuperchainERC20` specification. + + +## Implementation details + +Application developers must complete two tasks to enable `SuperchainERC20`. This advance setup ensures that `SuperchainERC20` goes live when the interop upgrade happens and your token becomes interoperable. + +1. Deployment at same address on each chain using `create2` function +2. Permission `crosschainMint` and `crosschainBurn` to the Superchain bridge address + +For now, application developers should view `SuperchainERC20`as standard ERC20 tokens with additional built-in functions that will be enabled once interop goes live. + + + The `SuperchainERC20` token must give access to the address where the future interop bridge will live. + + +## Next steps + +* Join the discussion! `SuperchainERC20` implementation is being developed in partnership with Wonderland, with discussions taking place in the [#interop-evm](https://discord.gg/3zvcEFj6Nu) Discord channel. +* For more info about how `SuperchainERC20` works under the hood, [check out the specs](https://specs.optimism.io/interop/token-bridging.html). +* Questions about Interop? Visit the [Superchain Interop Explainer](explainer) or check out this [Superchain interop design video walk-thru](https://www.youtube.com/watch?v=FKc5RgjtGes). diff --git a/words.txt b/words.txt index e3500e2dd..b6c287dd2 100644 --- a/words.txt +++ b/words.txt @@ -204,6 +204,7 @@ MTLO MULT multiaddr Multichain +multichain multiclient multisigs MULTU @@ -260,6 +261,7 @@ POAPs PPROF pprof preconfigured +Predeploy predeploy Predeployed predeployed From a6ac1ab35f839c81358568d0b82753cfd128d39b Mon Sep 17 00:00:00 2001 From: krofax Date: Mon, 14 Oct 2024 11:05:27 +0100 Subject: [PATCH 171/565] Initial commit --- pages/stack/protocol/rollup/finality.mdx | 89 +++++++++++++++++++ public/img/op-stack/protocol/tx-finality.png | Bin 0 -> 48407 bytes words.txt | 1 + 3 files changed, 90 insertions(+) create mode 100644 pages/stack/protocol/rollup/finality.mdx create mode 100644 public/img/op-stack/protocol/tx-finality.png diff --git a/pages/stack/protocol/rollup/finality.mdx b/pages/stack/protocol/rollup/finality.mdx new file mode 100644 index 000000000..e8775afed --- /dev/null +++ b/pages/stack/protocol/rollup/finality.mdx @@ -0,0 +1,89 @@ +--- +title: Transaction Finality +lang: en-US +description: Learn the concept of finality in blockchain systems and the steps involved in achieving transaction settlement. +--- + +import { Callout } from 'nextra/components' + +## Key Concepts + +* Transaction finality: The point at which a transaction is considered irreversible. +* Challenge period: A period during which withdrawals from L2 to L1 can be contested. +* Reorg: A situation where part of the blockchain is replaced, discarding previously confirmed blocks. + +# Transaction Finality + +Transaction finality refers to the point at which a transaction is considered irreversible and is permanently recorded on the blockchain. + +## Finality on Ethereum + +Ethereum is designed to provide strong transaction finality guarantees. Here's how it works: + +* Time Frame: Under typical network conditions, transactions on Ethereum achieves finality in about 15 minutes. +* Consensus Cycles: This finality period is reached after 2 [epochs](https://info.etherscan.com/epoch-in-ethereum/) +* Block Confirmations: During this time, multiple blocks are added to the chain, each providing additional confirmation of the transactions in previous blocks. + +This timeframe ensures enough block confirmations to safeguard against reorgs and guarantees secure settlement of transactions. + +## OP Stack Finality + +OP Stack derive security from Ethereum. Finality occurs when transaction data is posted to Ethereum's data availability (DA) layer, i.e., **Layer 1 (L1)**. +At this point, the state of the rollup becomes finalized, similar to L1 transaction finality, preventing reorgs at the L2 level. + +In OP Stack, transaction finality involves three main stages: + +* Unsafe: The L2 sequencer creates a block containing the transaction, but the transaction data hasn't been posted to L1 yet. It's circulated to the L2 network for speed. + +* Safe: The sequencer's batcher posts transaction data to L1. Any L2 node can now derive this transaction. + +* Finalized: Same as safe, but enough L1 blocks (>65) have passed to ensure the L1 data won't be reorged. This prevents L1 reorgs from affecting the rollup's state and transaction history. + + + The OP Stack ensures that even if an L2 sequencer produces invalid transactions, the network nodes will reject them, maintaining consensus and security. + + +## The Settlement Layer + +This mechanism allows Ethereum to establish a view of the state on an OP Stack chain: + +* Rollup nodes post data to and monitor Ethereum. +* Ethereum processes transactions based on its consensus rules, without knowledge of the L2. +* For L2 to L1 messages (usually withdrawals), the L2 must prove its state's validity. + +To ensure the finality of an OP Stack chain's state, wait for transaction finalization on L1. + +## Sequencer Reliability + +Sequencers are centralized, raising concerns about potential equivocation (lying about block state). However: + +* Sequencers and all L2 nodes must follow consensus rules. +* Invalid transactions are rejected by all network nodes. +* This process is similar to how Ethereum and Bitcoin handle transactions. + +The L2 state is considered final once a batch is posted to L1 and enough blocks have passed to prevent reorgs. + +## Challenge Period + +OP Stack rollups use a 7-day withdrawal challenge period for a specific reason: + +* L1 has no inherent knowledge of L2. +* For L2 to L1 withdrawals, L1 needs to verify the withdrawal's validity. +* The 7-day period allows time to dispute withdrawal claims. +* The challenge process uses L2 transaction history to verify claim validity. + +A successful challenge (a failed withdrawal claim): + +* Doesn't impact the L2 state. +* Doesn't cause an L2 reorg. +* Only determines the validity of the specific withdrawal claim. + + + It's important to understand transaction finality and the challenge period as distinct concepts: + + * The 7-day challenge period verifies the validity of L2 transactions during withdrawals to L1. It does not apply to general L2 transaction finality. + * Users can dispute a withdrawal claim by submitting a fraud proof. This ensures invalid withdrawals are identified before the state is finalized on L1. + * A successful challenge impacts only the withdrawal claim and does not delay L2 transaction finality. + * L2 transaction finality is achieved within minutes after data is posted on L1 and confirmed by approximately 65 blocks (\~10 minutes). + * Even if a challenge is successful, it does not cause a reorg or affect transaction finality on the L2. + diff --git a/public/img/op-stack/protocol/tx-finality.png b/public/img/op-stack/protocol/tx-finality.png new file mode 100644 index 0000000000000000000000000000000000000000..c1d40fb48a32445b4950f2bb8796ae0e6e3da006 GIT binary patch literal 48407 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 Date: Mon, 14 Oct 2024 11:26:06 +0100 Subject: [PATCH 172/565] updated docs --- pages/stack/protocol/rollup/finality.mdx | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/pages/stack/protocol/rollup/finality.mdx b/pages/stack/protocol/rollup/finality.mdx index e8775afed..6aadb668d 100644 --- a/pages/stack/protocol/rollup/finality.mdx +++ b/pages/stack/protocol/rollup/finality.mdx @@ -6,12 +6,6 @@ description: Learn the concept of finality in blockchain systems and the steps i import { Callout } from 'nextra/components' -## Key Concepts - -* Transaction finality: The point at which a transaction is considered irreversible. -* Challenge period: A period during which withdrawals from L2 to L1 can be contested. -* Reorg: A situation where part of the blockchain is replaced, discarding previously confirmed blocks. - # Transaction Finality Transaction finality refers to the point at which a transaction is considered irreversible and is permanently recorded on the blockchain. @@ -26,6 +20,10 @@ Ethereum is designed to provide strong transaction finality guarantees. Here's h This timeframe ensures enough block confirmations to safeguard against reorgs and guarantees secure settlement of transactions. + + Reorg refers to a situation where part of the blockchain is replaced, discarding previously confirmed blocks. + + ## OP Stack Finality OP Stack derive security from Ethereum. Finality occurs when transaction data is posted to Ethereum's data availability (DA) layer, i.e., **Layer 1 (L1)**. From 10bac6569680d63e8107f756dc7b7ef41053d85d Mon Sep 17 00:00:00 2001 From: krofax Date: Mon, 14 Oct 2024 11:46:30 +0100 Subject: [PATCH 173/565] updated the docs and added image --- pages/stack/protocol/rollup/_meta.json | 1 + pages/stack/protocol/rollup/finality.mdx | 21 +++++++++++++-------- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/pages/stack/protocol/rollup/_meta.json b/pages/stack/protocol/rollup/_meta.json index bf5f987a5..c2aaa784f 100644 --- a/pages/stack/protocol/rollup/_meta.json +++ b/pages/stack/protocol/rollup/_meta.json @@ -3,5 +3,6 @@ "deposit-flow": "Deposit Flow", "transaction-flow": "Transaction Flow", "withdrawal-flow": "Withdrawal Flow", + "transaction-finality": "Transaction Finality ", "forced-transaction": "Forced Transaction" } \ No newline at end of file diff --git a/pages/stack/protocol/rollup/finality.mdx b/pages/stack/protocol/rollup/finality.mdx index 6aadb668d..220dd5b5c 100644 --- a/pages/stack/protocol/rollup/finality.mdx +++ b/pages/stack/protocol/rollup/finality.mdx @@ -4,6 +4,7 @@ lang: en-US description: Learn the concept of finality in blockchain systems and the steps involved in achieving transaction settlement. --- +import Image from 'next/image' import { Callout } from 'nextra/components' # Transaction Finality @@ -37,6 +38,10 @@ In OP Stack, transaction finality involves three main stages: * Finalized: Same as safe, but enough L1 blocks (>65) have passed to ensure the L1 data won't be reorged. This prevents L1 reorgs from affecting the rollup's state and transaction history. + +Transaction Finality Diagram. + + The OP Stack ensures that even if an L2 sequencer produces invalid transactions, the network nodes will reject them, maintaining consensus and security. @@ -76,12 +81,12 @@ A successful challenge (a failed withdrawal claim): * Doesn't cause an L2 reorg. * Only determines the validity of the specific withdrawal claim. - - It's important to understand transaction finality and the challenge period as distinct concepts: +## Conclusion + It's important to understand transaction finality and the challenge period as distinct concepts: + + * The 7-day challenge period verifies the validity of L2 transactions during withdrawals to L1. It does not apply to general L2 transaction finality. + * Users can dispute a withdrawal claim by submitting a fraud proof. This ensures invalid withdrawals are identified before the state is finalized on L1. + * A successful challenge impacts only the withdrawal claim and does not delay L2 transaction finality. + * L2 transaction finality is achieved within minutes after data is posted on L1 and confirmed by approximately `65 blocks (\~10 minutes). + * Even if a challenge is successful, it does not cause a reorg or affect transaction finality on the L2. - * The 7-day challenge period verifies the validity of L2 transactions during withdrawals to L1. It does not apply to general L2 transaction finality. - * Users can dispute a withdrawal claim by submitting a fraud proof. This ensures invalid withdrawals are identified before the state is finalized on L1. - * A successful challenge impacts only the withdrawal claim and does not delay L2 transaction finality. - * L2 transaction finality is achieved within minutes after data is posted on L1 and confirmed by approximately 65 blocks (\~10 minutes). - * Even if a challenge is successful, it does not cause a reorg or affect transaction finality on the L2. - From 2063c26534c0d4e640d16b53be6ae330e619931e Mon Sep 17 00:00:00 2001 From: krofax Date: Mon, 14 Oct 2024 12:06:48 +0100 Subject: [PATCH 174/565] updated the docs --- pages/stack/protocol/rollup/finality.mdx | 62 ++++++++++++------------ 1 file changed, 30 insertions(+), 32 deletions(-) diff --git a/pages/stack/protocol/rollup/finality.mdx b/pages/stack/protocol/rollup/finality.mdx index 220dd5b5c..01f4b328e 100644 --- a/pages/stack/protocol/rollup/finality.mdx +++ b/pages/stack/protocol/rollup/finality.mdx @@ -1,7 +1,7 @@ --- title: Transaction Finality lang: en-US -description: Learn the concept of finality in blockchain systems and the steps involved in achieving transaction settlement. +description: Learn about finality in blockchain systems and the steps to achieve transaction settlement. --- import Image from 'next/image' @@ -13,80 +13,78 @@ Transaction finality refers to the point at which a transaction is considered ir ## Finality on Ethereum -Ethereum is designed to provide strong transaction finality guarantees. Here's how it works: +Ethereum provides strong guarantees for transaction finality. Here's how it works: -* Time Frame: Under typical network conditions, transactions on Ethereum achieves finality in about 15 minutes. -* Consensus Cycles: This finality period is reached after 2 [epochs](https://info.etherscan.com/epoch-in-ethereum/) -* Block Confirmations: During this time, multiple blocks are added to the chain, each providing additional confirmation of the transactions in previous blocks. - -This timeframe ensures enough block confirmations to safeguard against reorgs and guarantees secure settlement of transactions. +* Time Frame: Under normal network conditions, Ethereum transactions achieve finality in approximately 15 minutes. +* Consensus Cycles: Finality is reached after two [epochs](https://info.etherscan.com/epoch-in-ethereum/). +* Block Confirmations: During this time, multiple blocks are added to the chain, each providing additional confirmation of transactions in earlier blocks. +This timeframe ensures sufficient block confirmations to protect against reorganizations (reorgs) and guarantees secure settlement. - Reorg refers to a situation where part of the blockchain is replaced, discarding previously confirmed blocks. + A reorg occurs when part of the blockchain is replaced, discarding previously confirmed blocks. ## OP Stack Finality -OP Stack derive security from Ethereum. Finality occurs when transaction data is posted to Ethereum's data availability (DA) layer, i.e., **Layer 1 (L1)**. -At this point, the state of the rollup becomes finalized, similar to L1 transaction finality, preventing reorgs at the L2 level. +The OP Stack derives its security from Ethereum. Finality occurs when transaction data is posted to Ethereum's Layer 1 (L1) data availability layer. At this point, the rollup state becomes finalized, similar to L1 finality, preventing L2 reorgs. In OP Stack, transaction finality involves three main stages: -* Unsafe: The L2 sequencer creates a block containing the transaction, but the transaction data hasn't been posted to L1 yet. It's circulated to the L2 network for speed. +* Unsafe: The L2 sequencer creates a block containing the transaction, but the transaction data has not yet been posted to L1. It is circulated within the L2 network for speed. * Safe: The sequencer's batcher posts transaction data to L1. Any L2 node can now derive this transaction. -* Finalized: Same as safe, but enough L1 blocks (>65) have passed to ensure the L1 data won't be reorged. This prevents L1 reorgs from affecting the rollup's state and transaction history. +* Finalized: The state is considered finalized once more than (>65) L1 blocks have passed(approximately 10 minutes), ensuring the L1 data is secure and won't be reorganized. Transaction Finality Diagram. - The OP Stack ensures that even if an L2 sequencer produces invalid transactions, the network nodes will reject them, maintaining consensus and security. + Even if an L2 sequencer generates invalid transactions, OP Stack ensures that network nodes will reject them, maintaining consensus and security. ## The Settlement Layer -This mechanism allows Ethereum to establish a view of the state on an OP Stack chain: +Ethereum provides a view of the state on an OP Stack chain using the following mechanism: * Rollup nodes post data to and monitor Ethereum. -* Ethereum processes transactions based on its consensus rules, without knowledge of the L2. -* For L2 to L1 messages (usually withdrawals), the L2 must prove its state's validity. +* Ethereum processes transactions according to its consensus rules, without requiring knowledge of the L2. +* For L2 to L1 messages (e.g., withdrawals), L2 must prove the validity of its state. To ensure the finality of an OP Stack chain's state, wait for transaction finalization on L1. ## Sequencer Reliability -Sequencers are centralized, raising concerns about potential equivocation (lying about block state). However: +While sequencers are centralized, the risk of equivocation (false reporting of block state) is mitigated as follows: * Sequencers and all L2 nodes must follow consensus rules. * Invalid transactions are rejected by all network nodes. -* This process is similar to how Ethereum and Bitcoin handle transactions. +* This process mirrors how Ethereum and Bitcoin handle transactions. -The L2 state is considered final once a batch is posted to L1 and enough blocks have passed to prevent reorgs. +The L2 state is considered final once the batch is posted to L1 and enough blocks have passed to prevent a reorg. ## Challenge Period -OP Stack rollups use a 7-day withdrawal challenge period for a specific reason: +OP Stack rollups use a 7-day withdrawal challenge period for specific reasons: -* L1 has no inherent knowledge of L2. -* For L2 to L1 withdrawals, L1 needs to verify the withdrawal's validity. +* L1 has no direct knowledge of L2. +* For L2 to L1 withdrawals, L1 must verify the withdrawal's validity. * The 7-day period allows time to dispute withdrawal claims. -* The challenge process uses L2 transaction history to verify claim validity. +* The challenge process uses L2 transaction history to validate withdrawal claims. -A successful challenge (a failed withdrawal claim): +If a challenge is successful, meaning the withdrawal claim fails: -* Doesn't impact the L2 state. -* Doesn't cause an L2 reorg. -* Only determines the validity of the specific withdrawal claim. +* The L2 state remains unaffected. +* There is no L2 reorganization. +* The challenge only affects the specific withdrawal claim. ## Conclusion It's important to understand transaction finality and the challenge period as distinct concepts: - * The 7-day challenge period verifies the validity of L2 transactions during withdrawals to L1. It does not apply to general L2 transaction finality. - * Users can dispute a withdrawal claim by submitting a fraud proof. This ensures invalid withdrawals are identified before the state is finalized on L1. - * A successful challenge impacts only the withdrawal claim and does not delay L2 transaction finality. - * L2 transaction finality is achieved within minutes after data is posted on L1 and confirmed by approximately `65 blocks (\~10 minutes). - * Even if a challenge is successful, it does not cause a reorg or affect transaction finality on the L2. + * The 7-day challenge window ensures the validity of L2 transactions during withdrawals to L1. It is not related to general L2 transaction finality. + * Users can dispute a withdrawal claim by submitting a fraud proof, ensuring invalid withdrawals are caught before finalizing the state on L1. + * A successful challenge impacts only the withdrawal claim and does not affect L2 transaction finality. + * L2 finality occurs within minutes after data is posted to L1 and confirmed by around 65 blocks (\~10 minutes). + * Even if a challenge is successful, it does not cause a reorg or delay L2 transaction finality. From 880a3ebbc59fccbf3ae190cd7dd363103e2695c1 Mon Sep 17 00:00:00 2001 From: krofax Date: Mon, 14 Oct 2024 12:07:24 +0100 Subject: [PATCH 175/565] fix lint issues --- pages/stack/protocol/rollup/finality.mdx | 25 ++++++++++++------------ 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/pages/stack/protocol/rollup/finality.mdx b/pages/stack/protocol/rollup/finality.mdx index 01f4b328e..1da3d0248 100644 --- a/pages/stack/protocol/rollup/finality.mdx +++ b/pages/stack/protocol/rollup/finality.mdx @@ -20,9 +20,10 @@ Ethereum provides strong guarantees for transaction finality. Here's how it work * Block Confirmations: During this time, multiple blocks are added to the chain, each providing additional confirmation of transactions in earlier blocks. This timeframe ensures sufficient block confirmations to protect against reorganizations (reorgs) and guarantees secure settlement. + - A reorg occurs when part of the blockchain is replaced, discarding previously confirmed blocks. - + A reorg occurs when part of the blockchain is replaced, discarding previously confirmed blocks. + ## OP Stack Finality @@ -36,13 +37,11 @@ In OP Stack, transaction finality involves three main stages: * Finalized: The state is considered finalized once more than (>65) L1 blocks have passed(approximately 10 minutes), ensuring the L1 data is secure and won't be reorganized. - Transaction Finality Diagram. - - - Even if an L2 sequencer generates invalid transactions, OP Stack ensures that network nodes will reject them, maintaining consensus and security. - + + Even if an L2 sequencer generates invalid transactions, OP Stack ensures that network nodes will reject them, maintaining consensus and security. + ## The Settlement Layer @@ -80,11 +79,11 @@ If a challenge is successful, meaning the withdrawal claim fails: * The challenge only affects the specific withdrawal claim. ## Conclusion - It's important to understand transaction finality and the challenge period as distinct concepts: - * The 7-day challenge window ensures the validity of L2 transactions during withdrawals to L1. It is not related to general L2 transaction finality. - * Users can dispute a withdrawal claim by submitting a fraud proof, ensuring invalid withdrawals are caught before finalizing the state on L1. - * A successful challenge impacts only the withdrawal claim and does not affect L2 transaction finality. - * L2 finality occurs within minutes after data is posted to L1 and confirmed by around 65 blocks (\~10 minutes). - * Even if a challenge is successful, it does not cause a reorg or delay L2 transaction finality. +It's important to understand transaction finality and the challenge period as distinct concepts: +* The 7-day challenge window ensures the validity of L2 transactions during withdrawals to L1. It is not related to general L2 transaction finality. +* Users can dispute a withdrawal claim by submitting a fraud proof, ensuring invalid withdrawals are caught before finalizing the state on L1. +* A successful challenge impacts only the withdrawal claim and does not affect L2 transaction finality. +* L2 finality occurs within minutes after data is posted to L1 and confirmed by around 65 blocks (\~10 minutes). +* Even if a challenge is successful, it does not cause a reorg or delay L2 transaction finality. From 070829314d1a87a5ab47629817eb8366e590a3bc Mon Sep 17 00:00:00 2001 From: cpengilly <29023967+cpengilly@users.noreply.github.com> Date: Mon, 14 Oct 2024 09:12:32 -0700 Subject: [PATCH 176/565] Update supersim page title to title case --- pages/stack/protocol/interop/supersim.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/stack/protocol/interop/supersim.mdx b/pages/stack/protocol/interop/supersim.mdx index 555e523a4..10b88e8fe 100644 --- a/pages/stack/protocol/interop/supersim.mdx +++ b/pages/stack/protocol/interop/supersim.mdx @@ -6,7 +6,7 @@ description: Learn how to use the Supersim local dev environment tool designed t import { Callout } from 'nextra/components' -# Supersim multichain development environment +# Supersim Multichain Development Environment Interop is currently in active development and not yet ready for production use. The information provided here may change. Check back regularly for the most up-to-date information. From 7ba5fc07adb09912284d71ff4bc4a7d529a53041 Mon Sep 17 00:00:00 2001 From: krofax Date: Tue, 15 Oct 2024 14:06:23 +0100 Subject: [PATCH 177/565] updated word --- words.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/words.txt b/words.txt index 33bb71948..89b96ca1d 100644 --- a/words.txt +++ b/words.txt @@ -9,6 +9,7 @@ airgap Allnodes Allocs allocs +altda ANDI Apeworx Arweave From 0d3a36a76721f8c75eb5e75e25df25de6f65020c Mon Sep 17 00:00:00 2001 From: krofax Date: Tue, 15 Oct 2024 14:20:50 +0100 Subject: [PATCH 178/565] updated branch --- .../chain-operators/configuration/batcher.mdx | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/pages/builders/chain-operators/configuration/batcher.mdx b/pages/builders/chain-operators/configuration/batcher.mdx index df5dfadea..ac07942aa 100644 --- a/pages/builders/chain-operators/configuration/batcher.mdx +++ b/pages/builders/chain-operators/configuration/batcher.mdx @@ -262,24 +262,24 @@ default value is `10`. `OP_BATCHER_NUM_CONFIRMATIONS=10` -### altda.da-server +### plasma.da-server HTTP address of a DA Server. - `--altda.da-server=` - `--altda.da-server=` + `--plasma.da-server=` + `--plasma.da-server=` `OP_BATCHER_PLASMA_DA_SERVER=` -### altda.da-service +### plasma.da-service Use DA service type where commitments are generated by plasma server. The default value is `false`. - `--altda.da-service=` - `--altda.da-service=false` + `--plasma.da-service=` + `--plasma.da-service=false` `OP_BATCHER_PLASMA_DA_SERVICE=false` @@ -288,8 +288,8 @@ default value is `false`. Enable plasma mode. The default value is `false`. - `--altda.enabled=` - `--altda.enabled=false` + `--plasma.enabled=` + `--plasma.enabled=false` `OP_BATCHER_PLASMA_ENABLED=false` @@ -299,8 +299,8 @@ Verify input data matches the commitments from the DA storage service. The default value is `true`. - `--altda.verify-on-read=` - `--altda.verify-on-read=true` + `--plasma.verify-on-read=` + `--plasma.verify-on-read=true` `OP_BATCHER_PLASMA_VERIFY_ON_READ=true` From 01fb5252f5c9a93a9569084a57c46be6044b0ba0 Mon Sep 17 00:00:00 2001 From: krofax Date: Tue, 15 Oct 2024 16:03:30 +0100 Subject: [PATCH 179/565] updated codebase --- next-env.d.ts | 2 +- .../tutorials/cross-dom-solidity.mdx | 56 ++++++------------- public/tutorials/cross-dom-solidity.js | 48 +++++++++------- 3 files changed, 46 insertions(+), 60 deletions(-) diff --git a/next-env.d.ts b/next-env.d.ts index a4a7b3f5c..4f11a03dc 100644 --- a/next-env.d.ts +++ b/next-env.d.ts @@ -2,4 +2,4 @@ /// // NOTE: This file should not be edited -// see https://nextjs.org/docs/pages/building-your-application/configuring/typescript for more information. +// see https://nextjs.org/docs/basic-features/typescript for more information. diff --git a/pages/builders/app-developers/tutorials/cross-dom-solidity.mdx b/pages/builders/app-developers/tutorials/cross-dom-solidity.mdx index b846658c1..1d086f678 100644 --- a/pages/builders/app-developers/tutorials/cross-dom-solidity.mdx +++ b/pages/builders/app-developers/tutorials/cross-dom-solidity.mdx @@ -5,9 +5,7 @@ description: Learn how to write Solidity contracts on OP Mainnet and Ethereum th --- import { Steps, Callout, Tabs } from 'nextra/components' -import { WipCallout } from '@/components/WipCallout' - # Communicating Between OP Mainnet and Ethereum in Solidity @@ -82,8 +80,8 @@ It will take a few minutes for your message to reach L2. Feel free to take a quick break while you wait. -You can use the Optimism SDK to programmatically check the status of any message between L1 and L2. -Later on in this tutorial you'll learn how to use the Optimism SDK and the `waitForMessageStatus` function to wait for various message statuses. +You can use Viem to programmatically check the status of any message between L1 and L2. +Later on in this tutorial you'll learn how to use Viem and the `waitToProve` function to wait for various message statuses. This same function can be used to wait for a message to be relayed from L1 to L2. @@ -145,20 +143,12 @@ Set up the project as a basic Node.js project with `pnpm` or your favorite packa pnpm init ``` -{

Install the Optimism SDK

} +{

Install Viem

} -Install the Optimism SDK with `pnpm` or your favorite package manager. +Install Viem with `pnpm` or your favorite package manager. ```bash -pnpm add @eth-optimism/sdk -``` - -{

Install ethers.js

} - -Install `ethers` with `pnpm` or your favorite package manager. - -```bash -pnpm add ethers@^5 +pnpm add viem ``` {

Add your private key to your environment

} @@ -189,46 +179,32 @@ Start the Node.js REPL with the `node` command. node ``` -{

Import the Optimism SDK

} +{

Import Viem

} -```js file=/public/tutorials/cross-dom-solidity.js#L3 hash=26b2fdb17dd6c8326a54ec51f0769528 -``` - -{

Import ethers.js

} - -```js file=/public/tutorials/cross-dom-solidity.js#L4 hash=69a65ef97862612e4978b8563e6dbe3a +```js file=/public/tutorials/cross-dom-solidity.js#L3-L5 hash=ed24e2f752f8c16ded84de74af10589d ``` {

Load your private key

} -```js file=/public/tutorials/cross-dom-solidity.js#L6 hash=755b77a7ffc7dfdc186f36c37d3d847a +```js file=/public/tutorials/cross-dom-solidity.js#L7 hash=f5211d75b2d19d7fd6da17ef02449e4b ``` {

Load your transaction hash

} -```js file=/public/tutorials/cross-dom-solidity.js#L8 hash=320cd4f397d7bed8d914d4be0c99f8dc +```js file=/public/tutorials/cross-dom-solidity.js#L9 hash=320cd4f397d7bed8d914d4be0c99f8dc ``` {

Create the RPC providers and wallets

} -```js file=/public/tutorials/cross-dom-solidity.js#L10-L13 hash=9afdce50665ae93bce602068071ffaa1 -``` - -{

Create a CrossChainMessenger instance

} - -The Optimism SDK exports a `CrossChainMessenger` class that makes it easy to prove and relay cross-chain messages. - -Create an instance of the `CrossChainMessenger` class: - -```js file=/public/tutorials/cross-dom-solidity.js#L15-L20 hash=997b9c4cdd5fb1f9d4e0882a683ae016 +```js file=/public/tutorials/cross-dom-solidity.js#L11-L12 hash=cedcc56e3200a039274dda506a897cb6 ``` {

Wait until the message is ready to prove

} -The second step to send messages from L2 to L1 is to prove that the message was sent on L2. +Next, you will send messages from L2 to L1 is to prove that the message was sent on L2. You first need to wait until the message is ready to prove. -```js file=/public/tutorials/cross-dom-solidity.js#L23 hash=25a072666b6147f8d8983d8223f045b8 +```js file=/public/tutorials/cross-dom-solidity.js#L17-L20 hash=be084e2a13c2cad44f6354feeb2bcbcb ``` @@ -240,7 +216,7 @@ Feel free to take a quick break while you wait. Once the message is ready to be proven, you'll send an L1 transaction to prove that the message was sent on L2. -```js file=/public/tutorials/cross-dom-solidity.js#L26 hash=17922abea43b3d379404fedd87422dde +```js file=/public/tutorials/cross-dom-solidity.js#L23-L27 hash=1af494e8b4c1533bc9d1ce981f7ec88c ``` {

Wait until the message is ready for relay

} @@ -253,21 +229,21 @@ On OP Mainnet, this takes 7 days. We're currently testing fault proofs on OP Sepolia, so withdrawal times reflect Mainnet times.
-```js file=/public/tutorials/cross-dom-solidity.js#L29 hash=45d995aab47ec29afee4bb4577ae9303 +```js file=/public/tutorials/cross-dom-solidity.js#L30-L33 hash=ef3598d29f837b59cfb89e7bbbc0645d ``` {

Relay the message on L1

} Once the withdrawal is ready to be relayed you can finally complete the message sending process. -```js file=/public/tutorials/cross-dom-solidity.js#L32 hash=b5515811ffcf8b9ada15dea8ae666e44 +```js file=/public/tutorials/cross-dom-solidity.js#L36-L40 hash=c3e5c5d15c048c231397aebcb92eef2c ``` {

Wait until the message is relayed

} Now you simply wait until the message is relayed. -```js file=/public/tutorials/cross-dom-solidity.js#L35 hash=d6e7f89e929eea0ac3217a6751b7e578 +```js file=/public/tutorials/cross-dom-solidity.js#L43-L46 hash=e9da5a2b27185b0b948ac45b2d42a7f9 ``` {

Check the L1 Greeter

} diff --git a/public/tutorials/cross-dom-solidity.js b/public/tutorials/cross-dom-solidity.js index 9ddafb16b..fba881ebd 100644 --- a/public/tutorials/cross-dom-solidity.js +++ b/public/tutorials/cross-dom-solidity.js @@ -1,37 +1,47 @@ (async () => { -const optimism = require("@eth-optimism/sdk") -const ethers = require("ethers") +const { createPublicClient, http } = require('viem'); +const { optimismSepolia } = require('viem/chains'); +const { publicActionsL2 } = require('viem/op-stack'); -const privateKey = process.env.TUTORIAL_PRIVATE_KEY +const privateKey = process.env.TUTORIAL_PRIVATE_KE const transactionHash = process.env.TUTORIAL_TRANSACTION_HASH -const l1Provider = new ethers.providers.StaticJsonRpcProvider("https://rpc.ankr.com/eth_sepolia") -const l2Provider = new ethers.providers.StaticJsonRpcProvider("https://sepolia.optimism.io") -const l1Wallet = new ethers.Wallet(privateKey, l1Provider) -const l2Wallet = new ethers.Wallet(privateKey, l2Provider) - -const messenger = new optimism.CrossChainMessenger({ - l1ChainId: 11155111, // 11155111 for Sepolia, 1 for Ethereum - l2ChainId: 11155420, // 11155420 for OP Sepolia, 10 for OP Mainnet - l1SignerOrProvider: l1Wallet, - l2SignerOrProvider: l2Wallet, -}) +const l1Provider = createPublicClient({ chain: sepolia, transport: http("https://rpc.ankr.com/eth_sepolia") }).extend(publicActionsL1()) +const l2Provider = createPublicClient({ chain: optimismSepolia, transport: http("https://sepolia.optimism.io") }).extend(publicActionsL2()); console.log('Waiting for message to be provable...') -await messenger.waitForMessageStatus(transactionHash, optimism.MessageStatus.READY_TO_PROVE) +await l1Provider.getWithdrawalStatus({ + receipt, + targetChain: l2Provider.chain, +}) console.log('Proving message...') -await messenger.proveMessage(transactionHash) +const receipt = await l2Provider.getTransactionReceipt(transactionHash) +const output = await l1Provider.waitToProve({ + receipt, + targetChain: l2Provider.chain, +}) console.log('Waiting for message to be relayable...') -await messenger.waitForMessageStatus(transactionHash, optimism.MessageStatus.READY_FOR_RELAY) +await l1Provider.getWithdrawalStatus({ + receipt, + targetChain: l2Provider.chain, +}) console.log('Relaying message...') -await messenger.finalizeMessage(transactionHash) +const [message] = getWithdrawals(receipt) +await l1Provider.waitToFinalize({ + withdrawalHash: message.withdrawalHash, + targetChain: l2Provider.chain +}) console.log('Waiting for message to be relayed...') -await messenger.waitForMessageStatus(transactionHash, optimism.MessageStatus.RELAYED) +await l1Provider.getWithdrawalStatus({ + receipt, + targetChain: l2Provider.chain, +}) + })() From 6901a020f7e2402e074f0722ee6804f0ceda3b5f Mon Sep 17 00:00:00 2001 From: soyboy Date: Tue, 15 Oct 2024 14:22:13 -0600 Subject: [PATCH 180/565] small fixes --- .../chain-operators/tools/op-conductor.mdx | 47 ++++++++++--------- 1 file changed, 26 insertions(+), 21 deletions(-) diff --git a/pages/builders/chain-operators/tools/op-conductor.mdx b/pages/builders/chain-operators/tools/op-conductor.mdx index 6d4d6cff0..312c1a2bb 100644 --- a/pages/builders/chain-operators/tools/op-conductor.mdx +++ b/pages/builders/chain-operators/tools/op-conductor.mdx @@ -84,6 +84,8 @@ At OP Labs, op-conductor is deployed as a kubernetes statefulset because it requires a persistent volume to store the raft log. This guide describes setting up conductor on an existing network without incurring downtime. +You can utilize [op-conductor-ops](https://github.com/ethereum-optimism/infra/tree/main/op-conductor-ops) tool to confirm the conductor status between the steps. + ### Assumptions This setup guide has the following assumptions: @@ -138,7 +140,7 @@ This setup guide has the following assumptions: {

Pause two conductors

} - Pause `sequencer-0` &` sequencer-1` conductors with [conductor\_pause](#conductor_pause) + Pause `sequencer-0` &` sequencer-2` conductors with [conductor_pause](#conductor_pause) RPC request. {

Update op-node configuration and switch the active sequencer

} @@ -150,7 +152,7 @@ This setup guide has the following assumptions: * all sequencer op-node configs: ```yaml - OP_NODE_CONDUCTOR_ENABLED: "true" + OP_NODE_CONDUCTOR_ENABLED: "true" # this is what commits unsafe blocks to the raft logs OP_NODE_RPC_ADMIN_STATE: "" # this flag cant be used with conductor ``` @@ -162,7 +164,7 @@ This setup guide has the following assumptions: {

Add voting nodes

} - Add voting nodes to cluster using [conductor\_AddServerAsVoter](#conductor_addServerAsVoter) + Add voting nodes to cluster using [conductor_AddServerAsVoter](#conductor_addserverasvoter) RPC request to the leader conductor (`sequencer-1`) {

Confirm state

} @@ -188,11 +190,11 @@ This setup guide has the following assumptions: {

Confirm state

} - Confirm all conductors successfully resumed with [conductor\_paused](#conductor_paused) + Confirm all conductors successfully resumed with [conductor_paused](#conductor_paused) {

Tranfer leadership

} - Trigger leadership transfer to `sequencer-0` using [conductor\_transferLeaderToServer](#conductor_transferLeaderToServer) + Trigger leadership transfer to `sequencer-0` using [conductor_transferLeaderToServer](#conductor_transferleadertoserver) {

Confirm state

} @@ -357,7 +359,7 @@ It is configured via its [flags / environment variables](https://github.com/ethe Conductor exposes [admin RPCs](https://github.com/ethereum-optimism/optimism/blob/develop/op-conductor/rpc/api.go#L17) on the `conductor` namespace. -#### conductor\_overrideLeader +#### conductor_overrideLeader `OverrideLeader` is used to override the leader status, this is only used to return true for `Leader()` & `LeaderWithID()` calls. It does not impact the @@ -382,7 +384,7 @@ manually started sequencer. -#### conductor\_pause +#### conductor_pause `Pause` pauses op-conductor. @@ -402,7 +404,7 @@ manually started sequencer. -#### conductor\_resume +#### conductor_resume `Resume` resumes op-conductor. @@ -422,7 +424,7 @@ manually started sequencer. -#### conductor\_paused +#### conductor_paused Paused returns true if the op-conductor is paused. @@ -442,7 +444,7 @@ Paused returns true if the op-conductor is paused. -#### conductor\_stopped +#### conductor_stopped Stopped returns true if the op-conductor is stopped. @@ -482,7 +484,7 @@ SequencerHealthy returns true if the sequencer is healthy. -#### conductor\_leader +#### conductor_leader API related to consensus. @@ -506,7 +508,7 @@ Leader returns true if the server is the leader. -#### conductor\_leaderWithID +#### conductor_leaderWithID API related to consensus. @@ -530,14 +532,16 @@ LeaderWithID returns the current leader's server info. -#### conductor\_addServerAsVoter +#### conductor_addServerAsVoter - API related to consensus. + API related to consensus. This requires the AddServerAsVoter adds a server as a voter to the cluster. +Version + ```sh @@ -554,7 +558,7 @@ AddServerAsVoter adds a server as a voter to the cluster. -#### conductor\_addServerAsNonvoter +#### conductor_addServerAsNonvoter API related to consensus. @@ -579,7 +583,7 @@ The non-voter will not participate in the leader election. -#### conductor\_removeServer +#### conductor_removeServer API related to consensus. @@ -603,7 +607,7 @@ RemoveServer removes a server from the cluster. -#### conductor\_transferLeader +#### conductor_transferLeader API related to consensus. @@ -627,7 +631,7 @@ TransferLeader transfers leadership to another server. -#### conductor\_transferLeaderToServer +#### conductor_transferLeaderToServer API related to consensus. @@ -651,7 +655,7 @@ TransferLeaderToServer transfers leadership to a specific server. -#### conductor\_clusterMembership +#### conductor_clusterMembership ClusterMembership returns the current cluster membership configuration. @@ -671,7 +675,7 @@ ClusterMembership returns the current cluster membership configuration. -#### conductor\_active +#### conductor_active API called by `op-node`. @@ -695,7 +699,7 @@ Active returns true if the op-conductor is active (not paused or stopped). -#### conductor\_commitUnsafePayload +#### conductor_commitUnsafePayload API called by `op-node`. @@ -725,3 +729,4 @@ layer. * Checkout [op-conductor-mon](https://github.com/ethereum-optimism/infra): which monitors multiple op-conductor instances and provides a unified interface for reporting metrics. +* Get familiar with [op-conductor-ops](https://github.com/ethereum-optimism/infra/tree/main/op-conductor-ops)to interact with op-conductor. From 9b16db86f2d4ae363d5fa9f11724bb9995efac5e Mon Sep 17 00:00:00 2001 From: soyboy Date: Tue, 15 Oct 2024 14:33:51 -0600 Subject: [PATCH 181/565] adding comment about the address parameter --- pages/builders/chain-operators/tools/op-conductor.mdx | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/pages/builders/chain-operators/tools/op-conductor.mdx b/pages/builders/chain-operators/tools/op-conductor.mdx index 312c1a2bb..5ec7098d3 100644 --- a/pages/builders/chain-operators/tools/op-conductor.mdx +++ b/pages/builders/chain-operators/tools/op-conductor.mdx @@ -535,12 +535,10 @@ LeaderWithID returns the current leader's server info. #### conductor_addServerAsVoter - API related to consensus. This requires the + API related to consensus. The address parameter is the raft conesensus address, not the RPC address. -AddServerAsVoter adds a server as a voter to the cluster. - -Version +AddServerAsVoter adds a server as a voter to the cluster. @@ -553,7 +551,7 @@ Version ```sh - cast rpc conductor_addServerAsVoter --rpc-url http://127.0.0.1:50050 + cast rpc conductor_addServerAsVoter --rpc-url http://127.0.0.1:50050 ``` From 9fc4de2e5f75098d1738664880a6c44c8ef4a799 Mon Sep 17 00:00:00 2001 From: soyboy <85043086+sbvegan@users.noreply.github.com> Date: Tue, 15 Oct 2024 14:34:25 -0600 Subject: [PATCH 182/565] Update pages/builders/chain-operators/tools/op-conductor.mdx Co-authored-by: Bradley Camacho <42678939+bradleycamacho@users.noreply.github.com> --- pages/builders/chain-operators/tools/op-conductor.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/builders/chain-operators/tools/op-conductor.mdx b/pages/builders/chain-operators/tools/op-conductor.mdx index 5ec7098d3..8c2173486 100644 --- a/pages/builders/chain-operators/tools/op-conductor.mdx +++ b/pages/builders/chain-operators/tools/op-conductor.mdx @@ -84,7 +84,7 @@ At OP Labs, op-conductor is deployed as a kubernetes statefulset because it requires a persistent volume to store the raft log. This guide describes setting up conductor on an existing network without incurring downtime. -You can utilize [op-conductor-ops](https://github.com/ethereum-optimism/infra/tree/main/op-conductor-ops) tool to confirm the conductor status between the steps. +You can utilize the [op-conductor-ops](https://github.com/ethereum-optimism/infra/tree/main/op-conductor-ops) tool to confirm the conductor status between the steps. ### Assumptions From f840ecefd41dc04ebeba16bb2e46173087d67aae Mon Sep 17 00:00:00 2001 From: soyboy Date: Tue, 15 Oct 2024 14:36:09 -0600 Subject: [PATCH 183/565] fixing typo --- pages/builders/chain-operators/tools/op-conductor.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/builders/chain-operators/tools/op-conductor.mdx b/pages/builders/chain-operators/tools/op-conductor.mdx index 8c2173486..2879e8d50 100644 --- a/pages/builders/chain-operators/tools/op-conductor.mdx +++ b/pages/builders/chain-operators/tools/op-conductor.mdx @@ -535,7 +535,7 @@ LeaderWithID returns the current leader's server info. #### conductor_addServerAsVoter - API related to consensus. The address parameter is the raft conesensus address, not the RPC address. + API related to consensus. The address parameter is the raft consensus address, not the RPC address. AddServerAsVoter adds a server as a voter to the cluster. From ab32e3b1d5fad3b1dae4df5474ae57a3a79f4324 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alfonso=20Mu=C3=B1oz=20de=20Laborde?= Date: Wed, 16 Oct 2024 23:22:55 +0400 Subject: [PATCH 184/565] Add placeholder links to OP Mainnet runbooks --- pages/builders/chain-operators/self-hosted.mdx | 2 ++ pages/builders/node-operators/rollup-node.mdx | 2 ++ 2 files changed, 4 insertions(+) diff --git a/pages/builders/chain-operators/self-hosted.mdx b/pages/builders/chain-operators/self-hosted.mdx index 200eb7f4b..9342a2fb6 100644 --- a/pages/builders/chain-operators/self-hosted.mdx +++ b/pages/builders/chain-operators/self-hosted.mdx @@ -105,6 +105,8 @@ They'll help you get a head start deploying your first OP Stack chain. You can also [suggest a new tutorial](https://github.com/ethereum-optimism/docs/issues/new?assignees=\&labels=tutorial%2Cdocumentation%2Ccommunity-request\&projects=\&template=suggest_tutorial.yaml\&title=%5BTUTORIAL%5D+Add+PR+title) if you have something specific in mind. We'd love to grow this list! +Lastly, for deeper insight into the day-to-day operations of OP Mainnet to see how these operational practices could apply to your chain, see the public [OP Mainnet Runbooks](https://www.notion.so/oplabs/Optimism-Runbooks-WIP-120f153ee1628045b230d5cd3df79f63?pvs=4). + ## Next Steps * After deploying your chain, check the [Rollup Operations](./management/operations) guide for common operations you'll need to run with your rollup. diff --git a/pages/builders/node-operators/rollup-node.mdx b/pages/builders/node-operators/rollup-node.mdx index dcffe980d..46acaef0a 100644 --- a/pages/builders/node-operators/rollup-node.mdx +++ b/pages/builders/node-operators/rollup-node.mdx @@ -121,6 +121,8 @@ It is important to regularly monitor your node, and you can optionally configure | [Running an OP Mainnet Node from Source](tutorials/mainnet) | Learn how to run an OP Mainnet node from source code. | 🟡 Medium | | [Running an OP Sepolia Node from Source](tutorials/testnet) | Learn how to run an OP Sepolia node from source code. | 🟡 Medium | +For deeper insight into the day-to-day operations of OP Mainnet to see how these practices could apply to your own node operations, see the public [OP Mainnet Runbooks](https://www.notion.so/oplabs/Optimism-Runbooks-WIP-120f153ee1628045b230d5cd3df79f63?pvs=4). + ## Next Steps * If you've already got your node up and running, check out the [Node Metrics and Monitoring Guide](/builders/node-operators/management/metrics) to learn how to keep tabs on your node and make sure it keeps running smoothly. From dcdbcaee59fd9b822b015e1d0a89f81e21f036c8 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Wed, 16 Oct 2024 21:21:36 +0100 Subject: [PATCH 185/565] updated docs --- .../tutorials/send-tx-from-eth.mdx | 26 +++--- public/tutorials/send-tx-from-eth.js | 81 +++++++++++-------- 2 files changed, 60 insertions(+), 47 deletions(-) diff --git a/pages/builders/app-developers/tutorials/send-tx-from-eth.mdx b/pages/builders/app-developers/tutorials/send-tx-from-eth.mdx index 022ebd92d..1e219b140 100644 --- a/pages/builders/app-developers/tutorials/send-tx-from-eth.mdx +++ b/pages/builders/app-developers/tutorials/send-tx-from-eth.mdx @@ -28,8 +28,8 @@ You're going to use the `viem` package for this tutorial. Since Viem is a [Node. {

Make a Project Folder

} ```bash -mkdir op-sample-project -cd op-sample-project +mkdir trigger-transaction +cd trigger-transaction ``` {

Initialize the Project

} @@ -89,7 +89,7 @@ You need to import some dependencies into your Node REPL session. {

Import Viem

} -```js file=/public/tutorials/send-tx-from-eth.js#L3-L5 hash=7a906fc04fa87f91fc33049240e8e0f8 +```js file=/public/tutorials/send-tx-from-eth.js#L3-L6 hash=1e06dede41cb7ba0bd9414a8962521c6 ``` @@ -102,12 +102,12 @@ You'll need a few variables throughout this tutorial. Let's set those up now. {

Load your private key

} -```js file=/public/tutorials/send-tx-from-eth.js#L7-L8 hash=46ba01375a5d8844b2315f0e579dfac3 +```js file=/public/tutorials/send-tx-from-eth.js#L8-L9 hash=46ba01375a5d8844b2315f0e579dfac3 ``` {

Create the RPC providers and wallets

} -```js file=/public/tutorials/send-tx-from-eth.js#L10-L13 hash=a364c906d788d0614588c8db059cfcca +```js file=/public/tutorials/send-tx-from-eth.js#L11-L13 hash=d5a5a1252f4b6ff026cd58de8e6ae7f1 ``` @@ -116,7 +116,7 @@ You'll need a few variables throughout this tutorial. Let's set those up now. You'll be sending a small amount of ETH as part of this tutorial. Quickly check your balance on OP Sepolia so that you know how much you had at the start of the tutorial. -```js file=/public/tutorials/send-tx-from-eth.js#L15-L17 hash=5b95f18440ad72b6200ed7b5df00ca8f +```js file=/public/tutorials/send-tx-from-eth.js#L17-L18 hash=2bbd74b9de0c0fa0daca043ab9030ff0 ``` ## Trigger the Transaction @@ -127,35 +127,35 @@ Now you'll use the `OptimismPortal` contract to trigger a transaction on OP Sepo {

Create the OptimismPortal object

} -```js file=/public/tutorials/send-tx-from-eth.js#L19-L30 hash=bb10ed96a0eed859d491afc1929001ce +```js file=/public/tutorials/send-tx-from-eth.js#L20-L31 hash=b062257111aacc2f3a985542e451269c ``` {

Estimate the required gas

} When sending transactions via the `OptimismPortal` contract it's important to always include a gas buffer. This is because the `OptimismPortal` charges a variable amount of gas depending on the current demand for L2 transactions triggered via L1. If you do not include a gas buffer, your transactions may fail. -```js file=/public/tutorials/send-tx-from-eth.js#L32-L43 hash=ae495cba1a72841059a32edaf20f854d +```js file=/public/tutorials/send-tx-from-eth.js#L33-L45 hash=f5d0d92f161514a3359997143804af0b ``` {

Send the transaction

} Now you'll send the transaction. Note that you are including a buffer of 20% on top of the gas estimate. -```js file=/public/tutorials/send-tx-from-eth.js#L45-L54 hash=6fb0ba06fb29be7ee2c945fca75a50f4 +```js file=/public/tutorials/send-tx-from-eth.js#L50-L61 hash=59e3ee527809087e9e615f28caa49083 ``` {

Wait for the L1 transaction

} First you'll need to wait for the L1 transaction to be mined. -```js file=/public/tutorials/send-tx-from-eth.js#L56 hash=3c0301f8a9ca78bd8bfbff6aef807c77 +```js file=/public/tutorials/send-tx-from-eth.js#L60 hash=0efd9bd3369de7f5f36ea5540a5d8078 ``` {

Wait for the L2 transaction

} Now you'll need to wait for the corresponding L2 transaction to be included in a block. This transaction is automatically created as a result of your L1 transaction. Here you'll determine the hash of the L2 transaction and then wait for that transaction to be included in the L2 blockchain. -```js file=/public/tutorials/send-tx-from-eth.js#L58-L60 hash=cdd456e54b0f8507f96365dae05b8856 +```js file=/public/tutorials/send-tx-from-eth.js#L67-L73 hash=bf903509fb370c2b4e85dbfbf05650ee ``` @@ -164,12 +164,12 @@ Now you'll need to wait for the corresponding L2 transaction to be included in a You should have a little less ETH on OP Sepolia now. Check your balance to confirm. -```js file=/public/tutorials/send-tx-from-eth.js#L62-L63 hash=7cac2670afeb0fcc88346bc59b90466c +```js file=/public/tutorials/send-tx-from-eth.js#L75-L76 hash=dd456528a8bae103b73c5bcd19216916 ``` Make sure that the difference is equal to the amount you were expecting to send. -```js file=/public/tutorials/send-tx-from-eth.js#L65-L66 hash=e2ef73867c6d755ca89b9d3381522208 +```js file=/public/tutorials/send-tx-from-eth.js#L78-L79 hash=3885097e127ff18b3c2c2fc1d3d5a7c0 ``` ## Next Steps diff --git a/public/tutorials/send-tx-from-eth.js b/public/tutorials/send-tx-from-eth.js index c2921b837..12ea74460 100644 --- a/public/tutorials/send-tx-from-eth.js +++ b/public/tutorials/send-tx-from-eth.js @@ -3,6 +3,7 @@ const { createPublicClient, createWalletClient, http, parseEther, formatEther } = require('viem'); const { optimismSepolia, sepolia } = require('viem/chains'); const { privateKeyToAccount } = require('viem/accounts'); + const { publicActionsL2, publicActionsL1, walletActionsL2, walletActionsL1, getL2TransactionHashes } = require ('viem/op-stack') const privateKey = process.env.TUTORIAL_PRIVATE_KEY; const account = privateKeyToAccount(privateKey); @@ -15,54 +16,66 @@ const address = account.address; const initialBalance = await l2PublicClient.getBalance({ address }); console.log(`Initial balance: ${formatEther(initialBalance)} ETH`); - + const optimismPortalAbi = [ - { + { inputs: [ - { internalType: 'uint256', name: '_gasLimit', type: 'uint256' }, - { internalType: 'bytes', name: '_data', type: 'bytes' }, + { internalType: 'uint256', name: '_gasLimit', type: 'uint256' }, + { internalType: 'bytes', name: '_data', type: 'bytes' }, ], name: 'depositTransaction', outputs: [], stateMutability: 'payable', type: 'function', - }, + }, ]; - - const optimismPortalAddress = '0x1000000000000000000000000000000000000000'; + + const optimismPortalAddress = '0x5b47E1A08Ea6d985D6649300584e6722Ec4B1383'; const gasLimit = 100000n; const data = '0x'; - const value = parseEther('0.000001'); + const value = parseEther('0.000069420'); const gasEstimate = await l1PublicClient.estimateContractGas({ - address: optimismPortalAddress, - abi: optimismPortalAbi, - functionName: 'depositTransaction', - args: [gasLimit, data], - value, + address: optimismPortalAddress, + abi: optimismPortalAbi, + functionName: 'depositTransaction', + args: [gasLimit, data], + value, + account: account.address, }); - const { hash: l1TxHash } = await l1WalletClient.writeContract({ - address: optimismPortalAddress, - abi: optimismPortalAbi, - functionName: 'depositTransaction', - args: [gasLimit, data], - value, - gas: gasEstimate * 120n / 100n, // 20% buffer - }); - - console.log(`L1 transaction hash: ${l1TxHash}`); - - const l1Receipt = await l1PublicClient.waitForTransactionReceipt({ hash: l1TxHash }); - - const l2TxHash = l1Receipt.logs[0].topics[1]; - const l2Receipt = await l2PublicClient.waitForTransactionReceipt({ hash: l2TxHash }); - console.log(`L2 transaction hash: ${l2TxHash}`); - - const finalBalance = await l2PublicClient.getBalance({ address }); + console.log(`Gas estimate: ${gasEstimate}`); + + // Step 3: Send the transaction + const { request } = await l1PublicClient.simulateContract({ + account, + address: optimismPortalAddress, + abi: optimismPortalAbi, + functionName: 'depositTransaction', + args: [gasLimit, data], + value, + gas: gasEstimate * 120n / 100n, // 20% buffer + }) + + const l1TxHash = await l1WalletClient.writeContract(request) + console.log(`L1 transaction hash: ${l1TxHash}`) + + // Step 4: Wait for the L1 transaction + const l1Receipt = await l1PublicClient.waitForTransactionReceipt({hash: l1TxHash}) + console.log('L1 transaction confirmed:', l1Receipt) + + const [l2Hash] = getL2TransactionHashes(l1TxHash) + console.log(`Corresponding L2 transaction hash: ${l2Hash}`); + + const l2Receipt = await l2PublicClient.waitForTransactionReceipt({ + hash: l2Hash, + }); + console.log('L2 transaction confirmed:', l2Receipt); + + const finalBalance = await l2Wallet.getBalance() console.log(`Final balance: ${formatEther(finalBalance)} ETH`); - - const difference = initialBalance - finalBalance; - console.log(`Difference: ${formatEther(difference)} ETH`); + + const difference = initialBalance - finalBalance + console.log(`Difference in balance: ${formatEther(difference)} ETH`); })() From 8717b9c881854c6b26d4897b3fd5e2beb8ff6d64 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Wed, 16 Oct 2024 21:25:29 +0100 Subject: [PATCH 186/565] Update pages/builders/app-developers/tutorials/sdk-estimate-costs.mdx Co-authored-by: Zak Ayesh <44901995+ZakAyesh@users.noreply.github.com> --- pages/builders/app-developers/tutorials/sdk-estimate-costs.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/builders/app-developers/tutorials/sdk-estimate-costs.mdx b/pages/builders/app-developers/tutorials/sdk-estimate-costs.mdx index 3412fa209..58a4c4405 100644 --- a/pages/builders/app-developers/tutorials/sdk-estimate-costs.mdx +++ b/pages/builders/app-developers/tutorials/sdk-estimate-costs.mdx @@ -164,7 +164,7 @@ You're now going to estimate the cost of a transaction on OP Mainnet. {

Estimate the L1 data fee

} - You can estimate the L1 data fee with the [estimateL1GasCost](https://viem.sh/op-stack/actions/estimateL1Gas) function. + You can estimate the L1 data fee with the [estimateL1GasCost on the Gas Price Oracle predeploy contract](https://viem.sh/op-stack/actions/estimateL1Gas) function. Under the hood, this function is estimating the amount of Ethereum gas required to publish this transaction on Ethereum and multiplying it by the current Ethereum gas price (as tracked by the L2). This function returns the current cost estimate in wei. From 952964df068877aeafb8df0fcf5e4238b3eec240 Mon Sep 17 00:00:00 2001 From: Bradley Camacho <42678939+bradleycamacho@users.noreply.github.com> Date: Thu, 17 Oct 2024 11:20:15 -0700 Subject: [PATCH 187/565] Port internal knowledge base info to doc --- pages/chain/differences.mdx | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/pages/chain/differences.mdx b/pages/chain/differences.mdx index 784911879..3f8f63e6a 100644 --- a/pages/chain/differences.mdx +++ b/pages/chain/differences.mdx @@ -11,6 +11,16 @@ import { Callout } from 'nextra/components' OP Mainnet is designed to be [EVM equivalent](https://web.archive.org/web/20231127160757/https://medium.com/ethereum-optimism/introducing-evm-equivalence-5c2021deb306) and introduces as few changes as possible to the Ethereum protocol. However, there are some minor differences between the behavior of Ethereum and OP Mainnet that developers should be aware of. +## Bridging + +### Bridging - Deposit Transactions + +Deposit transactions don't exist on L1's, and are how transactions on an L2 can be initiated from the L1. Importantly, this is how bridge applications can get L1 ETH or tokens into an L2 OP-Stack chain. You can read more on deposit transactions [here](/stack/protocol/rollup/deposit-flow). + +### Bridging - Withdrawal Transactions and Fault Proofs + +Withdrawal transactions are how the state of the L2 rollup can be proven to the L1. Often this involves users withdrawing tokens or ETH to the L1. Fault proofs are the mechanism by which withdrawal transactions are currently proven to the L1. You can read more about fault proofs [here](/stack/protocol/fault-proofs/explainer). + ## Opcodes | Opcode | Solidity Equivalent | Behavior | @@ -55,6 +65,8 @@ In all other cases, the transaction sender address is set according to the same Transactions on OP Mainnet must pay for an [L1 data fee](/stack/transactions/fees#the-l1-data-fee) on top of the standard [execution gas fee](/stack/transactions/fees#execution-gas-fee) you would expect on Ethereum. Refer to the guide on [OP Mainnet Transaction Fees](/stack/transactions/fees) for more information. +You can use the [JS library viem](https://viem.sh/op-stack) to estimate the entire transaction gas costs, including the L1 Data Fee. + ### EIP-1559 Parameters The base fee on OP Mainnet is, like Ethereum, computed via the [EIP-1559](https://notes.ethereum.org/@vbuterin/eip-1559-faq) mechanism. @@ -75,3 +87,15 @@ The EIP-1559 parameters used by OP Mainnet differ from those used by Ethereum as Unlike Ethereum, OP Mainnet does not have a large public mempool. The OP Mainnet Sequencer mempool is currently only visible to the Sequencer. The Sequencer executes transactions from the mempool in priority fee order (highest fee first). + +## Chain Finality + +Unlike L1s such as Ethereum OP-Stack chains have Unsafe, Safe, and Finalized Heads which indicate the state of finality for a given L2 block. Fault proofs do not impact the finalization of the L2 rollup, only the finalization of withdrawal transactions to the L1. You can read more about these [in the docs glossary](/resources/glossary#unsafe-l2-block). + +## What's Next + +There are various useful tools linked above. Here are a few more tools and links you may want to check out: + +* [OP-viem](https://viem.sh/op-stack): JS framework that can handle many of these unique functions on OP-Chains. It is similar to Ethers.js for op-stack chains. We had an SDK but that is deprecated now. + +* [Specs](https://specs.optimism.io/root.html): For more in-depth technical explanations and examples. From 738730364c2adc96f11853361bcdd939c8c3e281 Mon Sep 17 00:00:00 2001 From: Bradley Camacho <42678939+bradleycamacho@users.noreply.github.com> Date: Thu, 17 Oct 2024 11:31:11 -0700 Subject: [PATCH 188/565] Coderabbit suggestions --- pages/chain/differences.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/chain/differences.mdx b/pages/chain/differences.mdx index 3f8f63e6a..5bfb5f340 100644 --- a/pages/chain/differences.mdx +++ b/pages/chain/differences.mdx @@ -96,6 +96,6 @@ Unlike L1s such as Ethereum OP-Stack chains have Unsafe, Safe, and Finalized Hea There are various useful tools linked above. Here are a few more tools and links you may want to check out: -* [OP-viem](https://viem.sh/op-stack): JS framework that can handle many of these unique functions on OP-Chains. It is similar to Ethers.js for op-stack chains. We had an SDK but that is deprecated now. +* [OP-viem](https://viem.sh/op-stack): JS framework that can handle many of these unique functions on OP-Chains. It is similar to Ethers.js for op-stack chains. * [Specs](https://specs.optimism.io/root.html): For more in-depth technical explanations and examples. From e44762fdb9a655904fa0f89d9912ec62ab97236d Mon Sep 17 00:00:00 2001 From: cpengilly <29023967+cpengilly@users.noreply.github.com> Date: Thu, 17 Oct 2024 12:09:51 -0700 Subject: [PATCH 189/565] Update superchain-erc20.mdx --- .../protocol/interop/superchain-erc20.mdx | 23 +++++++++---------- 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/pages/stack/protocol/interop/superchain-erc20.mdx b/pages/stack/protocol/interop/superchain-erc20.mdx index 7d38205af..d79232638 100644 --- a/pages/stack/protocol/interop/superchain-erc20.mdx +++ b/pages/stack/protocol/interop/superchain-erc20.mdx @@ -12,30 +12,29 @@ import { Callout } from 'nextra/components' Interop is currently in active development and not yet ready for production use. The information provided here may change. Check back regularly for the most up-to-date information.
-`SuperchainERC20` is a token standard specifically designed for the Superchain ecosystem. It serves as the foundation for interoperable tokens within the Superchain, including `GovToken`, `WETH` (Wrapped Ether), and migrated `OptimismMintableERC20Tokens`. This standard is crucial for enabling a more interconnected and efficient token ecosystem within the Superchain, balancing the needs for interoperability, security, and simplified governance. +`SuperchainERC20` is a token standard designed to enable asset interoperability in the Superchain ecosystem. +It serves as the foundational token deployment pattern within the Superchain, including `GovToken`, `WETH` (Wrapped Ether), migrated `OptimismMintableERC20Tokens`, and newly minted native `SuperchainERC20`. +This standard is crucial for enabling a more interconnected and efficient token ecosystem within the Superchain, balancing the needs for interoperability, security, and simplified developer experience. ## Features and benefits * **Interoperability**: Enables seamless token transfers between different chains within the Superchain ecosystem. -* **Built-in bridging**: The bridging interface exists on the token itself, eliminating the need for a central bridge predeploy (e.g., `bridgeERC20`, `bridgeERC20To`). -* **Consistency**: Provides a unified standard for tokens across all Superchain-compatible networks. -* **Governance minimized**: Designed to keep tokens within the Superchain ecosystem with minimal governance intervention. +* **Consistency**: Provides a unified standard for tokens across all Superchain-compatible networks and a common crosschain interface for the EVM ecosystem at large. * **Superchain-specific**: Tailored for internal use cases within the Superchain, addressing specific needs that other standards may not cover. ## Major components * **Token Contract**: implements the `SuperchainERC20` standard with bridging functionality. -* **Factory Predeploy**: uses a `create3`-based factory for deploying `SuperchainERC20` tokens consistently across chains. -* **Bridging Functions**: using methods like `bridgeERC20` and `bridgeERC20To` for cross-chain transfers. +* **Factory Predeploy**: uses a `create2`-based factory for deploying `SuperchainERC20` tokens consistently across chains. +* **Bridging Functions**: using methods like `sendERC20` and `relayERC20` for cross-chain transfers. * **Minting Role**: modifies the definition to be minting role-based rather than interface-based. ## Comparison to other standards `SuperchainERC20` differs from other token standards in its focus and implementation: -* `SuperchainERC20` is tailored for the Superchain, while other token standards might aim for broader cross-chain compatibility. -* `SuperchainERC20` is governance-minimized and designed to keep tokens within the Superchain ecosystem. -* The bridging functionality in `SuperchainERC20` is part of the token itself, not relying on external bridges. +* `SuperchainERC20` has minimal differentiation from a standard ERC20 deployment, only requires a minimal crosschain mint/burn interface, which aims to be a common pattern for the EVM ecosystem. +* `SuperchainERC20` shares trust assumptions across all chains in the superchain, such that custom assumptions around security and latency are not required to account for when executing transfers. Projects moving from other token standards may need to adapt to the `SuperchainERC20` specification. @@ -43,10 +42,10 @@ import { Callout } from 'nextra/components' ## Implementation details -Application developers must complete two tasks to enable `SuperchainERC20`. This advance setup ensures that `SuperchainERC20` goes live when the interop upgrade happens and your token becomes interoperable. +Application developers must complete two tasks to enable `SuperchainERC20`. This advance setup ensures that `SuperchainERC20` goes live when the interop upgrade happens and tokens becomes interoperable. -1. Deployment at same address on each chain using `create2` function -2. Permission `crosschainMint` and `crosschainBurn` to the Superchain bridge address +1. Permission only `SuperchainERC20Bridge` to call `crosschainMint` and `crosschainBurn` +2. Deployment at same address on every chain in the Superchain using `create2` function For now, application developers should view `SuperchainERC20`as standard ERC20 tokens with additional built-in functions that will be enabled once interop goes live. From 62ff8563fa52752e658518f2db5de4fc4a38a395 Mon Sep 17 00:00:00 2001 From: cpengilly <29023967+cpengilly@users.noreply.github.com> Date: Thu, 17 Oct 2024 12:12:44 -0700 Subject: [PATCH 190/565] Update words.txt --- words.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/words.txt b/words.txt index b6c287dd2..d7b98eb3e 100644 --- a/words.txt +++ b/words.txt @@ -64,6 +64,7 @@ computependingblock confs corsdomain counterfactually +crosschain Crossmint daserver DATACAP From 0f91eef05b1a914c0862b1665022dbde9b476bab Mon Sep 17 00:00:00 2001 From: cpengilly <29023967+cpengilly@users.noreply.github.com> Date: Thu, 17 Oct 2024 12:47:18 -0700 Subject: [PATCH 191/565] update feature section --- .../stack/protocol/interop/superchain-erc20.mdx | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/pages/stack/protocol/interop/superchain-erc20.mdx b/pages/stack/protocol/interop/superchain-erc20.mdx index d79232638..219fd66eb 100644 --- a/pages/stack/protocol/interop/superchain-erc20.mdx +++ b/pages/stack/protocol/interop/superchain-erc20.mdx @@ -18,8 +18,9 @@ This standard is crucial for enabling a more interconnected and efficient token ## Features and benefits -* **Interoperability**: Enables seamless token transfers between different chains within the Superchain ecosystem. -* **Consistency**: Provides a unified standard for tokens across all Superchain-compatible networks and a common crosschain interface for the EVM ecosystem at large. +* **Interoperability**: Enables seamless token transfers between different chains within the Superchain ecosystem, which decreases fragmentation of liquidity. +* **Simplifies deployments**: Provides a consistent, unified standard for tokens across all Superchain-compatible networks and a common crosschain interface for the EVM ecosystem at large. +* **Permissionless propagation**: Easily clone an existing token contract to a new OP Stack chain using `create2` without requiring the original owner, which enables movement of assets to the new chain once Interop goes live. Importantly, permissionless propagation retains the integrity of the original owner on the contract and preserves security but proliferates the contract's availability to new chains. * **Superchain-specific**: Tailored for internal use cases within the Superchain, addressing specific needs that other standards may not cover. ## Major components @@ -33,7 +34,7 @@ This standard is crucial for enabling a more interconnected and efficient token `SuperchainERC20` differs from other token standards in its focus and implementation: -* `SuperchainERC20` has minimal differentiation from a standard ERC20 deployment, only requires a minimal crosschain mint/burn interface, which aims to be a common pattern for the EVM ecosystem. +* `SuperchainERC20` has minimal differentiation from a standard ERC20 deployment, only requiring a minimal crosschain mint/burn interface, which aims to be a common pattern for the EVM ecosystem. * `SuperchainERC20` shares trust assumptions across all chains in the superchain, such that custom assumptions around security and latency are not required to account for when executing transfers. @@ -42,15 +43,15 @@ This standard is crucial for enabling a more interconnected and efficient token ## Implementation details -Application developers must complete two tasks to enable `SuperchainERC20`. This advance setup ensures that `SuperchainERC20` goes live when the interop upgrade happens and tokens becomes interoperable. +Application developers must complete two tasks to enable `SuperchainERC20`. This advance setup ensures that `SuperchainERC20` goes live when the Interop upgrade happens and tokens becomes interoperable. -1. Permission only `SuperchainERC20Bridge` to call `crosschainMint` and `crosschainBurn` -2. Deployment at same address on every chain in the Superchain using `create2` function +1. Permission only `SuperchainERC20Bridge` to call `crosschainMint` and `crosschainBurn`. +2. Deployment at same address on every chain in the Superchain using `create2` function. -For now, application developers should view `SuperchainERC20`as standard ERC20 tokens with additional built-in functions that will be enabled once interop goes live. +For now, application developers should view `SuperchainERC20`as standard ERC20 tokens with additional built-in functions that will be enabled once Interop goes live. - The `SuperchainERC20` token must give access to the address where the future interop bridge will live. + `SuperchainERC20` token must give access to the address where the future Interop bridge will live. ## Next steps From bc80ac724495fada9828fcba91494c4db88fedf7 Mon Sep 17 00:00:00 2001 From: cpengilly <29023967+cpengilly@users.noreply.github.com> Date: Thu, 17 Oct 2024 13:29:59 -0700 Subject: [PATCH 192/565] Update superchain-erc20.mdx --- pages/stack/protocol/interop/superchain-erc20.mdx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pages/stack/protocol/interop/superchain-erc20.mdx b/pages/stack/protocol/interop/superchain-erc20.mdx index 219fd66eb..c8b22c571 100644 --- a/pages/stack/protocol/interop/superchain-erc20.mdx +++ b/pages/stack/protocol/interop/superchain-erc20.mdx @@ -21,7 +21,7 @@ This standard is crucial for enabling a more interconnected and efficient token * **Interoperability**: Enables seamless token transfers between different chains within the Superchain ecosystem, which decreases fragmentation of liquidity. * **Simplifies deployments**: Provides a consistent, unified standard for tokens across all Superchain-compatible networks and a common crosschain interface for the EVM ecosystem at large. * **Permissionless propagation**: Easily clone an existing token contract to a new OP Stack chain using `create2` without requiring the original owner, which enables movement of assets to the new chain once Interop goes live. Importantly, permissionless propagation retains the integrity of the original owner on the contract and preserves security but proliferates the contract's availability to new chains. -* **Superchain-specific**: Tailored for internal use cases within the Superchain, addressing specific needs that other standards may not cover. +* **Ethereum-aligned**: Intentionally designed to be supported across the EVM ecosystem (RIP coming soon). ## Major components @@ -34,7 +34,7 @@ This standard is crucial for enabling a more interconnected and efficient token `SuperchainERC20` differs from other token standards in its focus and implementation: -* `SuperchainERC20` has minimal differentiation from a standard ERC20 deployment, only requiring a minimal crosschain mint/burn interface, which aims to be a common pattern for the EVM ecosystem. +* `SuperchainERC20` has minimal differentiation from a standard ERC20 deployment, only requiring a minimal crosschain mint/burn interface, which aims to be a common pattern for the EVM ecosystem (RIP coming soon). * `SuperchainERC20` shares trust assumptions across all chains in the superchain, such that custom assumptions around security and latency are not required to account for when executing transfers. From 61bfd9c64dfacf1ee5c792ccbd1be9ef6b7f56e4 Mon Sep 17 00:00:00 2001 From: cpengilly <29023967+cpengilly@users.noreply.github.com> Date: Thu, 17 Oct 2024 22:55:51 -0700 Subject: [PATCH 193/565] include zain's comments --- .../protocol/interop/superchain-erc20.mdx | 28 +++++++++++-------- 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/pages/stack/protocol/interop/superchain-erc20.mdx b/pages/stack/protocol/interop/superchain-erc20.mdx index c8b22c571..7293fe639 100644 --- a/pages/stack/protocol/interop/superchain-erc20.mdx +++ b/pages/stack/protocol/interop/superchain-erc20.mdx @@ -12,16 +12,20 @@ import { Callout } from 'nextra/components' Interop is currently in active development and not yet ready for production use. The information provided here may change. Check back regularly for the most up-to-date information. -`SuperchainERC20` is a token standard designed to enable asset interoperability in the Superchain ecosystem. -It serves as the foundational token deployment pattern within the Superchain, including `GovToken`, `WETH` (Wrapped Ether), migrated `OptimismMintableERC20Tokens`, and newly minted native `SuperchainERC20`. -This standard is crucial for enabling a more interconnected and efficient token ecosystem within the Superchain, balancing the needs for interoperability, security, and simplified developer experience. +`SuperchainERC20` is a token standard designed to enable asset interoperability in the Superchain. +Asset interoperability allows for tokens to securely move across chains without asset wrapping or liquidity pools for maximal capital efficiency, thus unifying liquidity and simplifying the user experience. -## Features and benefits - -* **Interoperability**: Enables seamless token transfers between different chains within the Superchain ecosystem, which decreases fragmentation of liquidity. -* **Simplifies deployments**: Provides a consistent, unified standard for tokens across all Superchain-compatible networks and a common crosschain interface for the EVM ecosystem at large. +Additional features: +* **Simplified deployments**: Provides a consistent, unified standard for tokens across all Superchain-compatible networks and a common crosschain interface for the EVM ecosystem at large. * **Permissionless propagation**: Easily clone an existing token contract to a new OP Stack chain using `create2` without requiring the original owner, which enables movement of assets to the new chain once Interop goes live. Importantly, permissionless propagation retains the integrity of the original owner on the contract and preserves security but proliferates the contract's availability to new chains. -* **Ethereum-aligned**: Intentionally designed to be supported across the EVM ecosystem (RIP coming soon). +* **Ethereum-aligned**: Intentionally designed to be generic and supported as an Ethereum-wide standard (RIP coming soon). + +## How it works + +`SuperchainERC20` token standard facilitates secure token transfers between chains in the Superchain networks via native burning and minting. + +* Initiating message where token is **burned** on the source chain. A user initiates a transfer of token from one blockchain to another and specifies the recipient wallet address on the destination chain. A specified amount of token is burned on the source chain. +* Executing message where token is **minted** on the destination chain. The specified amount of token is minted on the destination chain and sent to the recipient wallet address. ## Major components @@ -35,7 +39,7 @@ This standard is crucial for enabling a more interconnected and efficient token `SuperchainERC20` differs from other token standards in its focus and implementation: * `SuperchainERC20` has minimal differentiation from a standard ERC20 deployment, only requiring a minimal crosschain mint/burn interface, which aims to be a common pattern for the EVM ecosystem (RIP coming soon). -* `SuperchainERC20` shares trust assumptions across all chains in the superchain, such that custom assumptions around security and latency are not required to account for when executing transfers. +* `SuperchainERC20` shares trust assumptions across all chains in the Superchain, such that custom assumptions around security and latency are not required to account for when executing transfers. Projects moving from other token standards may need to adapt to the `SuperchainERC20` specification. @@ -43,15 +47,15 @@ This standard is crucial for enabling a more interconnected and efficient token ## Implementation details -Application developers must complete two tasks to enable `SuperchainERC20`. This advance setup ensures that `SuperchainERC20` goes live when the Interop upgrade happens and tokens becomes interoperable. +Application developers must do two things to make their tokens `SuperchainERC20` compatible. Doing this setup now ensures that tokens can benefit from Interop once the Interop upgrade happens. 1. Permission only `SuperchainERC20Bridge` to call `crosschainMint` and `crosschainBurn`. 2. Deployment at same address on every chain in the Superchain using `create2` function. -For now, application developers should view `SuperchainERC20`as standard ERC20 tokens with additional built-in functions that will be enabled once Interop goes live. +For now, application developers should view `SuperchainERC20`as standard ERC20 tokens with additional built-in functions that allow cross-chain asset movement that will be enabled once Interop goes live. - `SuperchainERC20` token must give access to the address where the future Interop bridge will live. + To enable asset interoperability, `SuperchainERC20` token must give access to the address where the future `SuperchainERC20Bridge` will live. ## Next steps From 494b0293d7deda094f3835846dc063abe9b55394 Mon Sep 17 00:00:00 2001 From: Bradley Camacho <42678939+bradleycamacho@users.noreply.github.com> Date: Thu, 17 Oct 2024 23:36:30 -0700 Subject: [PATCH 194/565] Sentence case all headers (and random cap mistakes) --- .../app-developers/bridging/basics.mdx | 4 +- .../app-developers/bridging/custom-bridge.mdx | 2 +- .../app-developers/bridging/messaging.mdx | 2 +- .../contracts/compatibility.mdx | 8 +-- .../app-developers/contracts/optimization.mdx | 12 ++--- .../contracts/system-contracts.mdx | 18 +++---- pages/builders/app-developers/overview.mdx | 10 ++-- pages/builders/app-developers/quick-start.mdx | 10 ++-- .../tools/ecosystem-overview.mdx | 6 +-- .../app-developers/transactions/estimates.mdx | 10 ++-- .../transactions/parameters.mdx | 8 +-- .../app-developers/transactions/statuses.mdx | 8 +-- .../transactions/troubleshooting.mdx | 6 +-- .../tutorials/cross-dom-bridge-erc20.mdx | 20 +++---- .../tutorials/cross-dom-bridge-eth.mdx | 16 +++--- .../tutorials/cross-dom-solidity.mdx | 26 +++++----- .../tutorials/first-contract.mdx | 28 +++++----- .../tutorials/sdk-estimate-costs.mdx | 14 ++--- .../tutorials/sdk-trace-txns.mdx | 18 +++---- .../tutorials/sdk-view-txns.mdx | 18 +++---- .../tutorials/send-tx-from-eth.mdx | 22 ++++---- .../standard-bridge-custom-token.mdx | 14 +++-- .../standard-bridge-standard-token.mdx | 8 ++- .../cex-wallet-developers/cex-support.mdx | 16 +++--- .../cex-wallet-developers/wallet-support.mdx | 14 ++--- .../builders/chain-operators/architecture.mdx | 10 ++-- .../chain-operators/configuration/batcher.mdx | 10 ++-- .../configuration/overview.mdx | 2 +- .../configuration/proposer.mdx | 4 +- .../chain-operators/configuration/rollup.mdx | 18 +++---- .../chain-operators/deploy/genesis.mdx | 8 +-- .../chain-operators/deploy/overview.mdx | 18 +++---- .../deploy/smart-contracts.mdx | 12 ++--- .../chain-operators/features/alt-da-mode.mdx | 34 ++++++------ .../features/bridged-usdc-standard.mdx | 2 +- .../features/custom-gas-token.mdx | 16 +++--- .../chain-operators/features/preinstalls.mdx | 6 +-- .../chain-operators/features/span-batches.mdx | 6 +-- .../hacks/data-availability.mdx | 4 +- .../chain-operators/hacks/derivation.mdx | 10 ++-- .../chain-operators/hacks/execution.mdx | 6 +-- .../chain-operators/hacks/featured-hacks.mdx | 8 +-- .../chain-operators/hacks/overview.mdx | 8 +-- .../chain-operators/hacks/settlement.mdx | 4 +- .../management/best-practices.mdx | 16 +++--- .../chain-operators/management/blobs.mdx | 22 ++++---- .../management/key-management.mdx | 8 +-- .../chain-operators/management/operations.mdx | 16 +++--- .../chain-operators/management/snap-sync.mdx | 22 ++++---- .../management/troubleshooting.mdx | 10 ++-- .../builders/chain-operators/self-hosted.mdx | 16 +++--- .../tools/chain-monitoring.mdx | 10 ++-- .../chain-operators/tools/explorer.mdx | 6 +-- .../chain-operators/tools/op-challenger.mdx | 14 ++--- .../chain-operators/tools/op-conductor.mdx | 26 +++++----- .../chain-operators/tools/op-deployer.mdx | 16 +++--- .../adding-derivation-attributes.mdx | 4 +- .../tutorials/adding-precompiles.mdx | 4 +- .../tutorials/create-l2-rollup.mdx | 30 +++++------ .../tutorials/integrating-da-layer.mdx | 10 ++-- .../tutorials/modifying-predeploys.mdx | 8 +-- .../chain-operators/tutorials/sdk.mdx | 12 ++--- .../builders/node-operators/architecture.mdx | 12 ++--- .../configuration/base-config.mdx | 22 ++++---- .../configuration/consensus-config.mdx | 8 +-- .../configuration/execution-config.mdx | 8 +-- .../node-operators/management/blobs.mdx | 12 ++--- .../node-operators/management/metrics.mdx | 6 +-- .../node-operators/management/snap-sync.mdx | 10 ++-- .../node-operators/management/snapshots.mdx | 10 ++-- .../node-operators/network-upgrades.mdx | 10 ++-- pages/builders/node-operators/releases.mdx | 10 ++-- pages/builders/node-operators/rollup-node.mdx | 18 +++---- .../node-operators/tutorials/mainnet.mdx | 32 ++++++------ .../tutorials/node-from-docker.mdx | 12 ++--- .../tutorials/node-from-source.mdx | 22 ++++---- .../node-operators/tutorials/testnet.mdx | 20 +++---- pages/builders/notices/fp-changes.mdx | 16 +++--- pages/builders/notices/granite-changes.mdx | 20 +++---- pages/builders/notices/sdk-deprecation.mdx | 2 +- .../tools/build/account-abstraction.mdx | 12 ++--- .../builders/tools/build/block-explorers.mdx | 8 +-- pages/builders/tools/build/faucets.mdx | 12 ++--- pages/builders/tools/build/nft-tools.mdx | 4 +- pages/builders/tools/build/oracles.mdx | 14 ++--- .../builders/tools/connect/rpc-providers.mdx | 34 ++++++------ pages/builders/tools/fee-calculator.mdx | 4 +- .../tools/monitor/analytics-tools.mdx | 8 +-- .../tools/monitor/regenesis-history.mdx | 8 +-- pages/builders/tools/overview.mdx | 6 +-- pages/chain/addresses.mdx | 2 +- pages/chain/differences.mdx | 8 +-- pages/chain/getting-started.mdx | 20 +++---- pages/chain/identity/about-attestations.mdx | 12 ++--- pages/chain/identity/applications.mdx | 6 +-- pages/chain/identity/contracts-eas.mdx | 8 +-- pages/chain/identity/individuals.mdx | 8 +-- pages/chain/identity/overview.mdx | 6 +-- pages/chain/identity/projects.mdx | 6 +-- pages/chain/identity/schemas.mdx | 28 +++++----- pages/chain/networks.mdx | 4 +- pages/chain/security/faq.mdx | 18 +++---- pages/chain/security/security-policy.mdx | 16 +++--- pages/chain/testing/dev-node.mdx | 8 +-- pages/chain/testing/testing-apps.mdx | 4 +- pages/chain/tokenlist.mdx | 4 +- pages/connect/contribute/docs-contribute.mdx | 4 +- pages/connect/contribute/stack-contribute.mdx | 10 ++-- pages/connect/contribute/style-guide.mdx | 6 +-- pages/connect/resources/glossary.mdx | 52 +++++++++---------- pages/stack/components.mdx | 18 +++---- pages/stack/design-principles.mdx | 8 +-- pages/stack/differences.mdx | 6 +-- pages/stack/explainer.mdx | 42 +++++++-------- pages/stack/getting-started.mdx | 6 +-- pages/stack/operators/features/op-txproxy.mdx | 8 +-- pages/stack/operators/features/proxyd.mdx | 15 +++--- pages/stack/protocol/derivation-pipeline.mdx | 12 ++--- pages/stack/protocol/fault-proofs/cannon.mdx | 16 +++--- .../protocol/fault-proofs/challenger.mdx | 16 +++--- .../stack/protocol/fault-proofs/explainer.mdx | 12 ++--- .../protocol/fault-proofs/fp-components.mdx | 14 ++--- .../protocol/fault-proofs/fp-security.mdx | 18 +++---- pages/stack/protocol/fault-proofs/mips.mdx | 22 ++++---- pages/stack/protocol/features/alt-da-mode.mdx | 10 ++-- .../protocol/features/custom-gas-token.mdx | 10 ++-- .../send-raw-transaction-conditional.mdx | 6 +-- .../protocol/interop/cross-chain-message.mdx | 8 +-- pages/stack/protocol/interop/explainer.mdx | 10 ++-- pages/stack/protocol/interop/supersim.mdx | 6 +-- pages/stack/protocol/outages.mdx | 22 ++++---- pages/stack/protocol/rollup/deposit-flow.mdx | 8 +-- .../protocol/rollup/forced-transaction.mdx | 20 +++---- pages/stack/protocol/rollup/overview.mdx | 18 +++---- .../protocol/rollup/transaction-flow.mdx | 2 +- .../stack/protocol/rollup/withdrawal-flow.mdx | 10 ++-- pages/stack/security/faq.mdx | 4 +- pages/stack/security/pause.mdx | 10 ++-- pages/stack/smart-contracts.mdx | 14 ++--- pages/stack/transactions/fees.mdx | 16 +++--- 140 files changed, 857 insertions(+), 874 deletions(-) diff --git a/pages/builders/app-developers/bridging/basics.mdx b/pages/builders/app-developers/bridging/basics.mdx index 283b8ba99..0af641177 100644 --- a/pages/builders/app-developers/bridging/basics.mdx +++ b/pages/builders/app-developers/bridging/basics.mdx @@ -1,5 +1,5 @@ --- -title: Bridging Basics +title: Bridging basics lang: en-US description: Learn about the fundamentals of sending data and tokens between Ethereum and OP Mainnet. --- @@ -17,7 +17,7 @@ One of the most common use cases for bridging is the need to send ETH or ERC-20 OP Mainnet has a system called the [Standard Bridge](./standard-bridge) that makes it easy to move tokens in both directions. If you mostly need to bridge tokens, make sure to check out the [Standard Bridge](./standard-bridge) guide. -## Sending ata +## Sending data Under the hood, the Standard Bridge is just an application that uses the OP Mainnet [message passing system to send arbitrary data between Ethereum and OP Mainnet](./messaging). Applications can use this system to have a contract on Ethereum interact with a contract on OP Mainnet, and vice versa. diff --git a/pages/builders/app-developers/bridging/custom-bridge.mdx b/pages/builders/app-developers/bridging/custom-bridge.mdx index 9df9557d1..e0e60e2c4 100644 --- a/pages/builders/app-developers/bridging/custom-bridge.mdx +++ b/pages/builders/app-developers/bridging/custom-bridge.mdx @@ -1,5 +1,5 @@ --- -title: Custom Bridges +title: Custom bridges lang: en-US description: Important considerations when building custom bridges for OP Mainnet. --- diff --git a/pages/builders/app-developers/bridging/messaging.mdx b/pages/builders/app-developers/bridging/messaging.mdx index c8f29405b..d5e64a09e 100644 --- a/pages/builders/app-developers/bridging/messaging.mdx +++ b/pages/builders/app-developers/bridging/messaging.mdx @@ -1,5 +1,5 @@ --- -title: Sending Data Between L1 and L2 +title: Sending data between L1 and L2 lang: en-US description: Learn how bridging works between L1 and L2, how to use it, and what to watch out for. --- diff --git a/pages/builders/app-developers/contracts/compatibility.mdx b/pages/builders/app-developers/contracts/compatibility.mdx index ed9cc7d7b..7133db286 100644 --- a/pages/builders/app-developers/contracts/compatibility.mdx +++ b/pages/builders/app-developers/contracts/compatibility.mdx @@ -1,21 +1,21 @@ --- -title: Solidity Compatibility +title: Solidity compatibility lang: en-US description: Learn about the differences between OP Mainnet and Ethereum when building Solidity contracts. --- -# Solidity Compatibility +# Solidity compatibility OP Mainnet is designed to be [EVM equivalent](https://web.archive.org/web/20231127160757/https://medium.com/ethereum-optimism/introducing-evm-equivalence-5c2021deb306), which means OP Mainnet looks exactly like Ethereum in every way possible. Almost all Ethereum tooling works out of the box on OP Mainnet, including the [Solidity](https://soliditylang.org/) smart contract language. However, there are a few minor differences between OP Mainnet and Ethereum that you should be aware of when building Solidity contracts. -## EVM/Opcode Differences +## EVM/Opcode differences Most smart contracts will work on OP Mainnet without any changes. Check out the [Differences Between Ethereum and OP Mainnet](/chain/differences#opcodes) page for a detailed list of the few differences you should know about. -## Gas Differences +## Gas differences OP Mainnet uses the same gas costs as Ethereum. However, OP Mainnet also charges an [L1 Data Fee](/stack/transactions/fees#l1-data-fee) for the cost of publishing an L2 transaction to L1. diff --git a/pages/builders/app-developers/contracts/optimization.mdx b/pages/builders/app-developers/contracts/optimization.mdx index 7d599718c..d792cf4b1 100644 --- a/pages/builders/app-developers/contracts/optimization.mdx +++ b/pages/builders/app-developers/contracts/optimization.mdx @@ -1,12 +1,12 @@ --- -title: Contract Optimization on OP Mainnet +title: Contract optimization on OP Mainnet lang: en-US description: Learn how to optimize contracts for OP Mainnet and what to look out for when you do so. --- import { Callout } from 'nextra/components' -# Contract Optimization on OP Mainnet +# Contract optimization on OP Mainnet OP Mainnet is designed to be [EVM equivalent](https://web.archive.org/web/20231127160757/https://medium.com/ethereum-optimism/introducing-evm-equivalence-5c2021deb306), which means OP Mainnet looks exactly like Ethereum in every way possible. One large and mostly unavoidable discrepancy between OP Mainnet and Ethereum is a slight [difference in transaction fee models](/stack/transactions/fees). @@ -36,12 +36,12 @@ This is the basic premise that makes OP Mainnet contract optimization slightly d ## Considerations -### Additional Complexity +### Additional complexity Contract optimizations can create additional complexity, which can in turn create additional risk. Developers should always consider whether this added complexity is worth the reduction in cost. -### Changing Economics +### Changing economics Various potential upgrades to OP Mainnet may also make optimizations to the L1 Data Fee less relevant. For instance, [EIP-4844](https://www.eip4844.com/), if adopted, should significantly reduce the cost of publishing data to Ethereum and would therefore also decrease the L1 Data Fee. @@ -57,7 +57,7 @@ If you expect your contracts to be used mostly in the short term or you have the ## Techniques -### Calldata Compression +### Calldata compression Compressing user data on the client side and decompressing it on the contract side can be an effective way to decrease costs on OP Mainnet. This technique decreases the amount of data provided by the user in exchange for a significant increase in onchain computation. @@ -66,7 +66,7 @@ Although several libraries exist to perform this calldata compression, none of t As a result, links to these libraries have been explicitly omitted here to avoid encouraging developers from using potentially buggy software. Most of these libraries can be found with a quick search online but, as always, be careful with code you find on the internet. -### Custom Encoding +### Custom encoding The [Solidity ABI encoding scheme](https://docs.soliditylang.org/en/v0.8.23/abi-spec.html#argument-encoding) is not particularly data efficient. Contracts can often reduce the amount of calldata provided by defining a custom argument encoding protocol. diff --git a/pages/builders/app-developers/contracts/system-contracts.mdx b/pages/builders/app-developers/contracts/system-contracts.mdx index 2e01eebe1..0818bbac3 100644 --- a/pages/builders/app-developers/contracts/system-contracts.mdx +++ b/pages/builders/app-developers/contracts/system-contracts.mdx @@ -1,12 +1,12 @@ --- -title: Using OP Mainnet System Contracts +title: Using OP Mainnet system contracts lang: en-US description: Learn how to work with OP Mainnet contracts directly from other contracts and how to work with contracts from the client side. --- import { Steps } from 'nextra/components' -# Using OP Mainnet System Contracts +# Using OP Mainnet system contracts System contracts on Ethereum (L1) and OP Mainnet (L2) are an important part of the OP Mainnet ecosystem. You may want to interact with these system contracts for any number of reasons, including: @@ -18,7 +18,7 @@ You may want to interact with these system contracts for any number of reasons, In this tutorial, you'll learn how to work with OP Mainnet contracts directly from other contracts and how to work with them from the client side. -## Before You Begin +## Before you begin You'll need to find the address of the particular contract that you want to interact with before you can actually interact with it. @@ -26,7 +26,7 @@ You'll need to find the address of the particular contract that you want to inte * Find the addresses for all networks on the [Contract Addresses](/chain/addresses) page. * Use the JSON file including contract addresses for all Superchain networks in the [Superchain Registry](https://github.com/ethereum-optimism/superchain-registry/blob/main/superchain/extra/addresses/addresses.json). -## Using System Contracts in Solidity +## Using system contracts in Solidity All you need to interact with the OP Mainnet system contracts from another contract is an address and an interface. You can follow [the instructions above](#finding-contract-addresses) to find the address of the contract you want to interact with. @@ -42,7 +42,7 @@ Install the package as follows: npm install @eth-optimism/contracts-bedrock ``` -### Importing Contracts +### Importing contracts Simply import the desired contract or interface from the `@eth-optimism/contracts-bedrock` package: @@ -57,14 +57,14 @@ For example, if you wanted to import the [`L1CrossDomainMessenger`](https://gith import { L1CrossDomainMessenger } from "@eth-optimism/contracts/L1/messaging/L1CrossDomainMessenger.sol"; ``` -### Getting L2 Contract Addresses +### Getting L2 contract addresses System contracts on L2 are "pre-deployed" to special addresses that are the same on most OP Stack chains. You can find these addresses on the [Contract Addresses](/chain/addresses) page. These addresses are also provided as constants in the [`Predeploys`](https://github.com/ethereum-optimism/optimism/blob/v1.1.4/packages/contracts-bedrock/src/libraries/Predeploys.sol) contract for use in Solidity. -## Using System Contracts in JavaScript +## Using system contracts in JavaScript You can also interact with the OP Mainnet system contracts from the client side. @@ -77,7 +77,7 @@ Install the package as follows: npm install @eth-optimism/contracts-ts ``` -### Getting Contract Artifacts and Interfaces +### Getting contract artifacts and interfaces You can use the `@eth-optimism/contracts-ts` package to easily access the address or ABI of any OP Mainnet contract. @@ -92,7 +92,7 @@ import { // Note that the address is keyed by chain ID! console.log(l2OutputOracleAddresses[10], abi) ``` -### Interacting with the Contract +### Interacting with the contract You can then feed this address and ABI into your favorite web3 library to interact with the contract. `@eth-optimism/contracts-ts` also exports [React hooks](https://wagmi.sh/cli/api/plugins/react) and [wagmi actions](https://wagmi.sh/react/api/actions) for interacting with OP Mainnet contracts. diff --git a/pages/builders/app-developers/overview.mdx b/pages/builders/app-developers/overview.mdx index cf5222e13..8b6a9e1d3 100644 --- a/pages/builders/app-developers/overview.mdx +++ b/pages/builders/app-developers/overview.mdx @@ -1,17 +1,17 @@ --- -title: App Developer Overview +title: App developer overview lang: en-US description: Learn about deploying contracts, cross-chain messaging, and tutorials to help you build applications on OP Mainnet. --- import { Cards, Card } from 'nextra/components' -# App Developer Overview +# App developer overview If you're a developer looking to build on OP Mainnet, you've come to the right place. In this area of the Optimism Docs you'll find everything you need to know about building OP Mainnet applications. -## Getting Started +## Getting started If you're brand new to OP Mainnet, try starting with the guide on [deploying a basic contract](/chain/getting-started). It'll get you familiar with the basic steps required to get a contract deployed to the network. @@ -28,7 +28,7 @@ You might also want to check out the [testing on OP Networks guide](/chain/testi } /> -## Bridging and Messaging +## Bridging and messaging Looking to build an application that sends ETH, tokens, or data between OP Mainnet and Ethereum? You'll find some useful guides and tutorials in this area of the docs. @@ -65,7 +65,7 @@ They'll help you get a head start when building your first Optimistic project. You can also [suggest a new tutorial](https://github.com/ethereum-optimism/docs/issues/new?assignees=\&labels=tutorial%2Cdocumentation%2Ccommunity-request\&projects=\&template=suggest_tutorial.yaml\&title=%5BTUTORIAL%5D+Add+PR+title) if you have something specific in mind. We'd love to grow this list! -## Next Steps +## Next steps If you still can't find the content you're looking for, there's a few options to get extra help. diff --git a/pages/builders/app-developers/quick-start.mdx b/pages/builders/app-developers/quick-start.mdx index 34482b0c1..98cc91da0 100644 --- a/pages/builders/app-developers/quick-start.mdx +++ b/pages/builders/app-developers/quick-start.mdx @@ -1,5 +1,5 @@ --- -title: Superchain App Quick Start +title: Superchain app quick start lang: en-US description: Learn how to quickly build and deploy an app to any OP Chain using Scaffold-OP. --- @@ -8,7 +8,7 @@ import { Callout, Steps } from 'nextra/components' import Image from 'next/image' import { Tabs } from 'nextra/components' -# Superchain App Quick Start +# Superchain App quick start This quick start walks you through an easy three-step process to deploy an app to any OP Chain – in under 15 minutes. This quick start uses [`Scaffold-OP`](https://github.com/ethereum-optimism/scaffold-op) to build the Superchain App, covers the setup process, and links to more detailed guides, so you can dive a bit deeper when needed. @@ -29,7 +29,7 @@ You can request testnet ETH from the Superchain Faucet in one of two ways: **con You can also try using [other available OP Sepolia faucets](/builders/tools/build/faucets). -## Step 2: Build a Basic App with Scaffold-OP +## Step 2: Build a basic app with Scaffold-OP Scaffold-OP is a fork of [`scaffold-ETH2`](https://docs.scaffoldeth.io/) with minimal differences: additional app examples, native support for Superchain testnets, and more low-level instructions. Scaffold-OP is an open-source toolkit for building decentralized applications on the Ethereum blockchain and is designed to make it easier for developers to create and deploy smart contracts and @@ -104,7 +104,7 @@ Before you begin, you need to install the following tools: * Edit your deployment scripts in `packages/hardhat/deploy` -## Step 3: Deploy Contracts to Superchain Testnets +## Step 3: Deploy contracts to Superchain Testnets You will follow the steps below to deploy contracts to a remote testnet (e.g., Optimism Sepolia). Please ensure you have enough Sepolia ETH on all these Superchains before deploying (See [Step 1 above](#step-1-get-testnet-eth-from-superchain-faucet)). @@ -159,7 +159,7 @@ Please ensure you have enough Sepolia ETH on all these Superchains before deploy Congratulations! You now have an OP Mainnet app ready for development, which can also be deployed to more OP Chains! 🎉 -## Next Steps +## Next steps * Share feedback about this quick start or `scaffold-op` in the [developer forum](https://github.com/ethereum-optimism/developers/discussions/262). * You can also [add Foundry to Scaffold-OP](https://github.com/ethereum-optimism/scaffold-op?tab=readme-ov-file#adding-foundry) for more robust and faster testing. diff --git a/pages/builders/app-developers/tools/ecosystem-overview.mdx b/pages/builders/app-developers/tools/ecosystem-overview.mdx index 10fe3a21b..e6f08ef4c 100644 --- a/pages/builders/app-developers/tools/ecosystem-overview.mdx +++ b/pages/builders/app-developers/tools/ecosystem-overview.mdx @@ -1,17 +1,17 @@ --- -title: Open Source Code Repo +title: Open source code repo lang: en-US description: Learn about an ecosystem of libraries and utilities tailored to help you deploy applications on the OP Stack. --- import { Cards, Card } from 'nextra/components' -# Open Source Code Repo for OP Stack Builders +# Open source code repo for OP Stack builders The [ecosystem repository](https://github.com/ethereum-optimism/ecosystem) is a comprehensive resource of libraries, utilities, and forkable code examples specifically tailored for builders deploying applications on the OP stack. The ecosystem repository was developed to help ease and expedite the development process for all builders working on the OP stack, helping them deliver value to the community without the necessity of mastering every detail of how the protocol itself operates. -## Getting Started +## Getting started Our initial launch includes an example [bridge application](https://github.com/ethereum-optimism/ecosystem/tree/main/apps/bridge-app) that demonstrates how to bridge ETH and any ERC20 tokens listed in the [Superchain Token List](/chain/tokenlist). This application serves as a reference for anyone looking to build their own bridge, offering a clearer understanding of how to interact with the protocol on both the L1 and L2 sides. diff --git a/pages/builders/app-developers/transactions/estimates.mdx b/pages/builders/app-developers/transactions/estimates.mdx index 6b7008b18..cbf69818f 100644 --- a/pages/builders/app-developers/transactions/estimates.mdx +++ b/pages/builders/app-developers/transactions/estimates.mdx @@ -1,12 +1,12 @@ --- -title: Estimating Transaction Fees on OP Mainnet +title: Estimating transaction fees on OP Mainnet lang: en-US description: Learn how to properly estimate the total cost of a transaction on OP Mainnet. --- import { Callout, Steps } from 'nextra/components' -# Estimating Transaction Fees on OP Mainnet +# Estimating transaction fees on OP Mainnet Check out the guide on understanding [Transaction Fees on OP Mainnet](./fees) for an in-depth explanation of how OP Mainnet transaction fees work. @@ -16,7 +16,7 @@ It's important to properly estimate the cost of a transaction on OP Mainnet befo Here you'll learn how to estimate both of the components that make up the total cost of an OP Mainnet transaction, the [execution gas fee](./fees#execution-gas-fee) and the [L1 data fee](./fees#l1-data-fee). Make sure to read the guide on [Transaction Fees on OP Mainnet](./fees) for a detailed look at how these fees work under the hood. -## Execution Gas Fee +## Execution gas fee Estimating the execution gas fee on OP Mainnet is just like estimating the execution gas fee on Ethereum. @@ -67,7 +67,7 @@ execution_gas_fee = gas_limit * max_fee_per_gas = 420000 * 0.15 gwei = 0.000063 -## L1 Data Fee +## L1 data fee The Optimism SDK provides a convenient method for estimating the L1 data fee for a transaction. @@ -119,7 +119,7 @@ Selecting the right tool for your use case will depend on your specific needs. * If you are using Ethers v5, the [Optimism SDK](https://sdk.optimism.io/) provides methods for estimating the L1 Data Fee for your transactions and for sending cross-chain transactions. The Optimism SDK is designed to be used alongside Ethers v5 and does not yet support Ethers v6. * If you are using Ethers v6, the [Optimistic Utilities Extension](https://github.com/ethers-io/ext-utils-optimism) provides methods for estimating the L1 Data Fee. The Ethers v6 extension does not yet support sending cross-chain transactions. Use Viem or the Optimism SDK if you need to send cross-chain transactions. -### Future Proofing +### Future proofing The L1 Data Fee formula is subject to change in the future, especially as the data availability landscape evolves. As a result, it's important to future proof your transaction fee estimation code to ensure that it will continue to function properly as the L1 Data Fee formula changes. diff --git a/pages/builders/app-developers/transactions/parameters.mdx b/pages/builders/app-developers/transactions/parameters.mdx index e5e18aa3e..22e450911 100644 --- a/pages/builders/app-developers/transactions/parameters.mdx +++ b/pages/builders/app-developers/transactions/parameters.mdx @@ -1,12 +1,12 @@ --- -title: Setting Transaction Gas Parameters on OP Mainnet +title: Setting transaction gas parameters on OP Mainnet lang: en-US description: Learn how to set gas parameters for transactions on OP Mainnet. --- import { Callout, Steps } from 'nextra/components' -# Setting Transaction Gas Parameters on OP Mainnet +# Setting transaction gas parameters on OP Mainnet OP Mainnet is designed to be [EVM equivalent](https://web.archive.org/web/20231127160757/https://medium.com/ethereum-optimism/introducing-evm-equivalence-5c2021deb306) which means that it is as compatible with Ethereum as possible, down to the client software used to run OP Mainnet nodes. Like Ethereum, OP Mainnet has an EIP-1559 style fee mechanism that dynamically adjusts a [base fee](https://ethereum.org/en/developers/docs/gas/#base-fee) that acts as the minimum fee that a transaction must pay to be included in a block. @@ -15,7 +15,7 @@ OP Mainnet also allows transactions to pay a [priority fee](https://ethereum.org Setting the base fee and the priority fee appropriately is important to ensure that your transactions are included in a timely manner. This guide will walk you through some best practices for determining the base fee and priority fee for your transactions. -## Selecting the Base Fee +## Selecting the base fee The base fee is the minimum fee that a transaction must pay to be included in a block. Transactions that specify a maximum fee per gas that is less than the current base fee cannot be included in the blockchain. @@ -53,7 +53,7 @@ If you are less sensitive to the base fee, you may wish to simply use a large mu -## Selecting the Priority Fee +## Selecting the priority fee The priority fee is an optional tip that can be paid to the Sequencer to incentivize them to include your transaction more quickly. The priority fee is paid in addition to the base fee. diff --git a/pages/builders/app-developers/transactions/statuses.mdx b/pages/builders/app-developers/transactions/statuses.mdx index 0427ab651..ed635a400 100644 --- a/pages/builders/app-developers/transactions/statuses.mdx +++ b/pages/builders/app-developers/transactions/statuses.mdx @@ -1,10 +1,10 @@ --- -title: Transaction Statuses on OP Mainnet +title: Transaction statuses on OP Mainnet lang: en-US description: Learn about the statuses transactions can have on OP Mainnet. --- -# Transaction Statuses on OP Mainnet +# Transaction statuses on OP Mainnet Transactions on OP Mainnet can have a number of different statuses depending on where a transaction is in the process of being included in the blockchain. Understanding these statuses can help you troubleshoot issues, build safer applications, and display more accurate information to your users. @@ -19,7 +19,7 @@ At this point the transaction is not part of the blockchain and there is no guar The list of all pending transactions can be retrieved by calling the standard JSON-RPC method [`eth_getBlockByNumber`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getblockbynumber) with the parameter `pending` as the block number. -## Sequencer Confirmed / Unsafe +## Sequencer confirmed or unsafe **Typically within 2-4 seconds** @@ -30,7 +30,7 @@ Applications should make sure to consider this possibility when displaying infor The latest "sequencer confirmed" block can be retrieved by calling the standard JSON-RPC method [`eth_getBlockByNumber`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getblockbynumber) with the parameter `safe` as the block number and comparing this to the result returned for the `latest` block. If the `safe` block is behind the `latest` block, then the earliest "sequencer confirmed" block is the `safe` block plus one. -## Published to Ethereum / Safe +## Published to Ethereum or safe **Typically within 5-10 minutes, up to 12 hours** diff --git a/pages/builders/app-developers/transactions/troubleshooting.mdx b/pages/builders/app-developers/transactions/troubleshooting.mdx index fdf67ab8b..2953b8479 100644 --- a/pages/builders/app-developers/transactions/troubleshooting.mdx +++ b/pages/builders/app-developers/transactions/troubleshooting.mdx @@ -1,12 +1,12 @@ --- -title: Troubleshooting Transactions +title: Troubleshooting transactions lang: en-US description: Learn how to troubleshoot common problems with transactions. --- -# Troubleshooting Transactions +# Troubleshooting transactions -## Transactions Stuck in the Transaction Pool +## Transactions stuck in the transaction pool OP Chain uses EIP-1559, but with different parameters than L1 Ethereum. As a result, while the base fee on L1 can grow by up to 12.5% in a twelve second period (in the case of a single 30M gas block), the L2 base fee can grow by up to 77% (in the case of six 30M gas blocks). diff --git a/pages/builders/app-developers/tutorials/cross-dom-bridge-erc20.mdx b/pages/builders/app-developers/tutorials/cross-dom-bridge-erc20.mdx index bbddc794d..c2de64336 100644 --- a/pages/builders/app-developers/tutorials/cross-dom-bridge-erc20.mdx +++ b/pages/builders/app-developers/tutorials/cross-dom-bridge-erc20.mdx @@ -9,7 +9,7 @@ import { WipCallout } from '@/components/WipCallout' -# Bridging ERC-20 Tokens to OP Mainnet With the Optimism SDK +# Bridging ERC-20 tokens to OP Mainnet with the Optimism SDK @@ -27,7 +27,7 @@ Make sure to check out the [Standard Bridge guide](/builders/app-developers/brid because they can cause bridge accounting errors. -## Supported Networks +## Supported networks The Optimism SDK supports any of the [Superchain networks](/chain/networks). [Some Superchain networks](https://sdk.optimism.io/enums/l2chainid) are already included in the SDK by default. @@ -38,7 +38,7 @@ If you want to use a network that isn't included by default, you can simply [ins * [node](https://nodejs.org/en/) * [pnpm](https://pnpm.io/installation) -## Create a Demo Project +## Create a demo project You're going to use the Optimism SDK for this tutorial. Since the Optimism SDK is a [Node.js](https://nodejs.org/en/) library, you'll need to create a Node.js project to use it. @@ -89,7 +89,7 @@ You will need to get some ETH on both of these testnets. Sepolia. -## Add a Private Key to Your Environment +## Add a private key to your environment You need a private key to sign transactions. Set your private key as an environment variable with the `export` command. @@ -110,7 +110,7 @@ node This will bring up a Node REPL prompt that allows you to run javascript code. -## Import Dependencies +## Import dependencies You need to import some dependencies into your Node REPL session. @@ -126,7 +126,7 @@ You need to import some dependencies into your Node REPL session. ``` -## Set Session Variables +## Set session variables You'll need a few variables throughout this tutorial. Let's set those up now. @@ -159,7 +159,7 @@ Let's set those up now. -## Get L1 Tokens +## Get L1 tokens You're going to need some tokens on L1 that you can bridge to L2. The L1 testing token located at [`0x5589BB8228C07c4e15558875fAf2B859f678d129`](https://sepolia.etherscan.io/address/0x5589BB8228C07c4e15558875fAf2B859f678d129) has a `faucet` function that makes it easy to get tokens. @@ -186,7 +186,7 @@ The L1 testing token located at [`0x5589BB8228C07c4e15558875fAf2B859f678d129`](h ``` -## Deposit Tokens +## Deposit tokens Now that you have some tokens on L1, you can deposit those tokens into the `L1StandardBridge` contract. You'll then receive the same number of tokens on L2 in return. @@ -259,7 +259,7 @@ You'll then receive the same number of tokens on L2 in return. ``` -## Withdraw Tokens +## Withdraw tokens You just bridged some tokens from L1 to L2. Nice! @@ -336,7 +336,7 @@ Now you're going to repeat the process in reverse to bridge some tokens from L2 ``` -## Next Steps +## Next steps Congrats! You've just deposited and withdrawn tokens using the Optimism SDK. diff --git a/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx b/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx index 5c7d442c8..0c5e5b141 100644 --- a/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx +++ b/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx @@ -9,9 +9,7 @@ import { WipCallout } from '@/components/WipCallout' -# Bridging ETH to OP Mainnet With the Optimism SDK - - +# Bridging ETH to OP Mainnet with the Optimism SDK This tutorial explains how you can use the [Optimism SDK](https://sdk.optimism.io) to bridge ETH from L1 (Ethereum or Sepolia) to L2 (OP Mainnet or OP Sepolia). The Optimism SDK is an easy way to add bridging functionality to your JavaScript-based application. @@ -20,7 +18,7 @@ It also provides some safety rails to prevent common mistakes that could cause E Behind the scenes, the Optimism SDK uses the [Standard Bridge](/builders/app-developers/bridging/standard-bridge) contracts to transfer ETH and ERC-20 tokens. Make sure to check out the [Standard Bridge guide](/builders/app-developers/bridging/standard-bridge) if you want to learn more about how the bridge works under the hood. -## Supported Networks +## Supported networks The Optimism SDK supports any of the [Superchain networks](/chain/networks). [Some Superchain networks](https://sdk.optimism.io/enums/l2chainid) are already included in the SDK by default. @@ -31,7 +29,7 @@ If you want to use a network that isn't included by default you can simply [inst * [node](https://nodejs.org/en/) * [pnpm](https://pnpm.io/installation) -## Create a Demo Project +## Create a demo project You're going to use the Optimism SDK for this tutorial. Since the Optimism SDK is a [Node.js](https://nodejs.org/en/) library, you'll need to create a Node.js project to use it. @@ -78,7 +76,7 @@ You will need to get some ETH on Sepolia to follow along. You can use [this faucet](https://sepoliafaucet.com) to get ETH on Sepolia. -## Add a Private Key to Your Environment +## Add a private key to your environment You need a private key in order to sign transactions. Set your private key as an environment variable with the `export` command. @@ -99,7 +97,7 @@ node This will bring up a Node REPL prompt that allows you to run javascript code. -## Import Dependencies +## Import dependencies You need to import some dependencies into your Node REPL session. @@ -117,7 +115,7 @@ You need to import some dependencies into your Node REPL session. -## Set Session Variables +## Set session variables You'll need a few variables throughout this tutorial. Let's set those up now. @@ -279,7 +277,7 @@ You should now have more ETH on L1. -## Next Steps +## Next steps Congrats! You've just deposited and withdrawn ETH using the Optimism SDK. diff --git a/pages/builders/app-developers/tutorials/cross-dom-solidity.mdx b/pages/builders/app-developers/tutorials/cross-dom-solidity.mdx index b846658c1..5c28e1178 100644 --- a/pages/builders/app-developers/tutorials/cross-dom-solidity.mdx +++ b/pages/builders/app-developers/tutorials/cross-dom-solidity.mdx @@ -1,5 +1,5 @@ --- -title: Communicating Between OP Mainnet and Ethereum in Solidity +title: Communicating between OP Mainnet and Ethereum in Solidity lang: en-US description: Learn how to write Solidity contracts on OP Mainnet and Ethereum that can talk to each other. --- @@ -8,9 +8,7 @@ import { Steps, Callout, Tabs } from 'nextra/components' import { WipCallout } from '@/components/WipCallout' -# Communicating Between OP Mainnet and Ethereum in Solidity - - +# Communicating between OP Mainnet and Ethereum in Solidity This tutorial explains how to write Solidity contracts on OP Mainnet and Ethereum that can talk to each other. Here you'll use a contract on OP Mainnet that can set a "greeting" variable on a contract on Ethereum, and vice-versa. @@ -25,7 +23,7 @@ Just looking to bridge tokens between OP Mainnet and Ethereum? Check out the tutorial on [Bridging ERC-20 Tokens to OP Mainnet With the Optimism SDK](./cross-dom-bridge-erc20). -## Message Passing Basics +## Message passing basics OP Mainnet uses a smart contract called the `CrossDomainMessenger` to pass messages between OP Mainnet and Ethereum. Both chains have a version of this contract (the `L1CrossDomainMessenger` and the `L2CrossDomainMessenger`). @@ -48,7 +46,7 @@ You can use [this faucet](https://sepoliafaucet.com/) to get ETH on Sepolia. You can use the [Superchain Faucet](https://console.optimism.io/faucet?utm_source=docs) to get ETH on OP Sepolia.
-## Review the Contracts +## Review the contracts You're about to use two contracts that have already been deployed to Sepolia and OP Sepolia, the `Greeter` contracts. You can review the source code for the L1 `Greeter` contract [here on Etherscan](https://sepolia.etherscan.io/address/0x31A6Dd971306bb72f2ffF771bF30b1B98dB8B2c5#code). You can review the source code for the L2 `Greeter` contract [here on Etherscan](https://sepolia-optimism.etherscan.io/address/0x5DE8a2957eddb140567fF90ba5d57bc9769f3055#code). @@ -57,7 +55,7 @@ Both contracts have exactly the same source code. Feel free to review the source code for these two contracts now if you'd like. This tutorial will explain how these contracts work in detail later on in the [How It Works](#how-it-works) section below. -## Interact With the L1 Greeter +## Interact with the L1 Greeter You're first going to use the L1 `Greeter` contract to set the greeting on the L2 `Greeter` contract. You'll send a transaction directly to the L1 `Greeter` contract which will ask the `L1CrossDomainMessenger` to send a message to the L2 `Greeter` contract. @@ -102,7 +100,7 @@ L2 transactions triggered on L1 are typically processed within one minute but ca -## Interact With the L2 Greeter +## Interact with the L2 Greeter Now you're going to use the L2 `Greeter` contract to set the greeting on the L1 `Greeter` contract. You'll send a transaction directly to the L2 `Greeter` contract which will ask the `L2CrossDomainMessenger` to send a message to the L1 `Greeter` contract. @@ -279,14 +277,14 @@ You should see the message you sent from L2. -## How It Works +## How it works Congratulations! You've successfully sent a message from L1 to L2 and from L2 to L1. This section will explain how the `Greeter` contracts work so you can follow the same pattern to deploy your own contracts. Luckily, both `Greeter` contracts are exactly the same so it's easy to see how everything comes together. -### The Messenger Variable +### The Messenger variable The `Greeter` contract has a `MESSENGER` variable that keeps track of the `CrossDomainMessenger` contract on the current chain. Check out the [Contract Addresses page](/chain/addresses) to see the addresses of the `CrossDomainMessenger` contracts on whichever network you'll be using. @@ -294,7 +292,7 @@ Check out the [Contract Addresses page](/chain/addresses) to see the addresses o ```solidity file=/public/tutorials/cross-dom-solidity.sol#L14 hash=ce8be857d4b4e1992cd3c16b8f2864b9 ``` -### The Other Greeter Variable +### The other Greeter variable The `Greeter` contract also has an `OTHER_GREETER` variable that keeps track of the `Greeter` contract on the other chain. On L1, this variable is set to the address of the L2 `Greeter` contract, and vice-versa. @@ -302,7 +300,7 @@ On L1, this variable is set to the address of the L2 `Greeter` contract, and vic ```solidity file=/public/tutorials/cross-dom-solidity.sol#L15 hash=eedd8c3050a83e56f37f367c6faa6f5d ``` -### The Greetings Mapping +### The Greetings mapping The `Greeter` contract keeps track of the different greetings that users have sent inside a `greetings` mapping. By using a mapping, this contract can keep track of greetings from different users at the same time. @@ -317,7 +315,7 @@ The `Greeter` has a simple constructor that sets the `MESSENGER` and `OTHER_GREE ```solidity file=/public/tutorials/cross-dom-solidity.sol#L18-L24 hash=718f3dc498975548eec30da99e47adf2 ``` -### The Send Greeting Function +### The sendGreeting function The `sendGreeting` function is the most important function in the `Greeter` contract. This is what you called earlier to send messages in both directions. @@ -330,7 +328,7 @@ The final parameter is the gas limit that gets used when the message is relayed ```solidity file=/public/tutorials/cross-dom-solidity.sol#L26-L38 hash=3104a6775fe3a505cf2f84b71b078aee ``` -### The Set Greeting Function +### The setGreeting function The `setMessage` function is the function that actually sets the greeting. This function is called by the `CrossDomainMessenger` contract on the other chain. diff --git a/pages/builders/app-developers/tutorials/first-contract.mdx b/pages/builders/app-developers/tutorials/first-contract.mdx index 52bd22337..03acec0c1 100644 --- a/pages/builders/app-developers/tutorials/first-contract.mdx +++ b/pages/builders/app-developers/tutorials/first-contract.mdx @@ -1,12 +1,12 @@ --- -title: Deploying Your First Contract on OP Mainnet +title: Deploying your first contract on OP Mainnet lang: en-US description: Learn how to write and deploy your first contract on OP Mainnet using the MetaMask browser extension. --- import { Callout, Steps } from 'nextra/components' -# Deploying Your First Contract on OP Mainnet +# Deploying your first contract on OP Mainnet **This tutorial is meant for developers who are new to OP Mainnet and Solidity.** @@ -20,7 +20,7 @@ This tutorial walks you through the process of deploying your first smart contra * Firefox or any Chromium-based browser (Chrome, Brave, Edge, etc.) -## Wallet Setup +## Wallet setup You'll need access to an [Ethereum wallet](https://ethereum.org/en/wallets/) if you want to deploy a smart contract. This tutorial uses [MetaMask](https://metamask.io), a popular browser extension wallet, just to get you started. @@ -163,13 +163,13 @@ Having issues with the Optimism Superchain Faucet? You can try using [other available OP Sepolia faucets](/builders/tools/build/faucets) instead. -## Check Your Wallet Balance +## Check your wallet balance After you get some ETH on OP Sepolia, you can check your wallet balance in MetaMask. Make sure that your balance has updated before continuing. If you don't see any ETH in your wallet, double check that your MetaMask is connected to the OP Sepolia network. -## Write Your First Contract +## Write your first contract The most popular smart contract development language today is [Solidity](https://docs.soliditylang.org/en/latest/). In this tutorial, you'll be using a browser-based integrated development environment (IDE) called [Remix](https://remix.ethereum.org/). @@ -222,7 +222,7 @@ You shouldn't see any compilation errors for this contract. -## Deploy Your Contract +## Deploy your contract Now that you've written your first contract, you can deploy it to OP Sepolia. Deploying contracts with Remix is pretty straightforward. @@ -268,7 +268,7 @@ Remix will automatically detect when your transaction has confirmed and will sho -## Interact With Your Contract +## Interact with your contract Now that you've deployed your contract, you can interact with it. Remix makes it easy to interact with your contract by providing a built-in user interface. @@ -307,12 +307,12 @@ Congrats, you've successfully deployed and interacted with your first smart cont -## How Your Contract Works +## How your contract works Now that you've deployed your contract, you might be wondering how it works. Let's take a closer look at the code you wrote. -### License Identifier +### License identifier The first line of most Solidity files is the license identifier. This line is used to specify the license under which the code is released. @@ -321,7 +321,7 @@ In this case, the code written is released under the [MIT license](https://opens ```solidity file=/public/tutorials/first-contract.sol#L1 hash=8384d75c38c570f3edb87cf9f64f2ec2 ``` -### Pragma Directive +### Pragma directive The next line is a [pragma directive](https://docs.soliditylang.org/en/latest/layout-of-source-files.html#pragma). This line tells the Solidity compiler which version of the Solidity language to use. @@ -330,7 +330,7 @@ In this case, the code is written for Solidity version 0.8.0 or higher. ```solidity file=/public/tutorials/first-contract.sol#L2 hash=70ebe002bc5488bb81baa0504de273c1 ``` -### Contract Definition +### Contract definition The next line defines a contract called `MyFirstContract`. A contract is a collection of code and data that is stored at a specific address on the blockchain. @@ -340,7 +340,7 @@ The contract definition is followed by a pair of curly braces that contain the c ```solidity file=/public/tutorials/first-contract.sol#L4 hash=8f3ace25e5f9ea06d8cb388eb3ab1775 ``` -### Message Variable +### Message variable The first thing you'll notice inside the contract definition is a variable called `message`. This variable is declared as a `string`, which is a Solidity type that represents a string of characters. @@ -349,7 +349,7 @@ The `public` keyword means that this variable can be read from outside the contr ```solidity file=/public/tutorials/first-contract.sol#L5 hash=42a1bdfe81e5b3bba6b99d3255ef4f2b ``` -### Message Update Function +### Message update function The next thing you'll notice is a function called `setMessage`. This function takes a single argument called `_message` of type `string`. @@ -359,7 +359,7 @@ Since this function doesn't have any access control, anyone can update the `mess ```solidity file=/public/tutorials/first-contract.sol#L7-L9 hash=b7e5531c48425b183e794f9f251c5540 ``` -## Next Steps +## Next steps To learn more about Solidity, check out the [Solidity documentation](https://docs.soliditylang.org/en/latest/) for more information about the language itself. If you learn best by reading source code, check out [this annotated code for an ERC-20 token contract](https://ethereum.org/en/developers/tutorials/erc20-annotated-code/). diff --git a/pages/builders/app-developers/tutorials/sdk-estimate-costs.mdx b/pages/builders/app-developers/tutorials/sdk-estimate-costs.mdx index 25b0f7894..8c1b1d373 100644 --- a/pages/builders/app-developers/tutorials/sdk-estimate-costs.mdx +++ b/pages/builders/app-developers/tutorials/sdk-estimate-costs.mdx @@ -1,5 +1,5 @@ --- -title: Estimating Transaction Costs on OP Mainnet +title: Estimating transaction costs on OP Mainnet lang: en-US description: Learn how to use the Optimism SDK to estimate the cost of a transaction on OP Mainnet. --- @@ -8,7 +8,7 @@ import { Callout, Steps } from 'nextra/components' import { WipCallout } from '@/components/WipCallout' -# Estimating Transaction Costs on OP Mainnet +# Estimating transaction costs on OP Mainnet In this tutorial, you'll learn how to use the [Optimism SDK](https://sdk.optimism.io) to estimate the cost of a transaction on OP Mainnet. @@ -24,7 +24,7 @@ Check out the full explainer on [OP Mainnet transaction fees](/builders/app-deve * [node](https://nodejs.org/en/) * [pnpm](https://pnpm.io/installation) -## Create a Demo Project +## Create a demo project You're going to use the Optimism SDK for this tutorial. Since the Optimism SDK is a [Node.js](https://nodejs.org/en/) library, you'll need to create a Node.js project to use it. @@ -72,7 +72,7 @@ You will need to get some ETH on OP Sepolia in order to run the code in this tut You can use the [Superchain Faucet](https://console.optimism.io/faucet?utm_source=docs) to get ETH on OP Sepolia.
-## Add a Private Key to Your Environment +## Add a private key to your environment You need a private key in order to sign transactions. Set your private key as an environment variable with the `export` command. @@ -93,7 +93,7 @@ node This will bring up a Node REPL prompt that allows you to run javascript code. -## Import Dependencies +## Import dependencies You need to import some dependencies into your Node REPL session. @@ -111,7 +111,7 @@ You need to import some dependencies into your Node REPL session. -## Set Session Variables +## Set session variables You'll need a few variables throughout this tutorial. Let's set those up now. @@ -138,7 +138,7 @@ This will add a few extra functions to the provider object that you'll use later -## Estimate Transaction Costs +## Estimate transaction costs You're now going to use the Optimism SDK to estimate the cost of a transaction on OP Mainnet. Here you'll estimate the cost of a simple transaction that sends a small amount of ETH from your address to the address `0x1000000000000000000000000000000000000000`. diff --git a/pages/builders/app-developers/tutorials/sdk-trace-txns.mdx b/pages/builders/app-developers/tutorials/sdk-trace-txns.mdx index 3a70bacec..637d7cb6a 100644 --- a/pages/builders/app-developers/tutorials/sdk-trace-txns.mdx +++ b/pages/builders/app-developers/tutorials/sdk-trace-txns.mdx @@ -1,5 +1,5 @@ --- -title: Tracing Deposits and Withdrawals +title: Tracing deposits and withdrawals lang: en-US description: Learn how to use the Optimism SDK to trace deposits and withdrawals between L1 and L2. --- @@ -8,9 +8,7 @@ import { Callout, Steps } from 'nextra/components' import { WipCallout } from '@/components/WipCallout' -# Tracing Deposits and Withdrawals - - +# Tracing deposits and withdrawals In this tutorial, you'll learn how to use the [Optimism SDK](https://sdk.optimism.io) to trace a [Standard Bridge](../bridging/standard-bridge) deposit or withdrawal between L1 and L2. You'll specifically learn how to determine the status of a deposit or withdrawal and how to retrieve the transaction receipt for the executed transaction on L1 (for withdrawals) or L2 (for deposits). @@ -25,7 +23,7 @@ You can also check out the tutorial on [Viewing Deposits and Withdrawals by Addr * [node](https://nodejs.org/en/) * [pnpm](https://pnpm.io/installation) -## Create a Demo Project +## Create a demo project You're going to use the Optimism SDK for this tutorial. Since the Optimism SDK is a [Node.js](https://nodejs.org/en/) library, you'll need to create a Node.js project to use it. @@ -60,7 +58,7 @@ pnpm add ethers@^5 -## Add RPC URLs to Your Environment +## Add RPC URLs to your environment You'll be using the `getMessageReceipt` function from the Optimism SDK during this tutorial. This function use event queries to retrieve the receipt for a deposit or withdrawal. @@ -88,7 +86,7 @@ node This will bring up a Node REPL prompt that allows you to run javascript code. -## Import Dependencies +## Import dependencies You need to import some dependencies into your Node REPL session. @@ -106,7 +104,7 @@ You need to import some dependencies into your Node REPL session. -## Set Session Variables +## Set session variables You'll need a few variables throughout this tutorial. Let's set those up now. @@ -152,7 +150,7 @@ Create an instance of the `CrossChainMessenger` class: ```js file=/public/tutorials/sdk-trace-txns.js#L20-L25 hash=158c6888c82bdc2f07c37c3edb3a9a6a ``` -## Trace a Deposit +## Trace a deposit You can use the `CrossChainMessenger` instance to trace a deposit. @@ -191,7 +189,7 @@ Once you have the transaction receipt, you can directly query for the actual L2 -## Trace a Withdrawal +## Trace a withdrawal You can also use the `CrossChainMessenger` instance to trace a withdrawal. diff --git a/pages/builders/app-developers/tutorials/sdk-view-txns.mdx b/pages/builders/app-developers/tutorials/sdk-view-txns.mdx index 7287680de..d93b63610 100644 --- a/pages/builders/app-developers/tutorials/sdk-view-txns.mdx +++ b/pages/builders/app-developers/tutorials/sdk-view-txns.mdx @@ -1,5 +1,5 @@ --- -title: Viewing Deposits and Withdrawals by Address +title: Viewing deposits and withdrawals by address lang: en-US description: Learn how to use the Optimism SDK to view all deposits and withdrawals triggered by a given address. --- @@ -8,9 +8,7 @@ import { Callout, Steps } from 'nextra/components' import { WipCallout } from '@/components/WipCallout' -# Viewing Deposits and Withdrawals by Address - - +# Viewing deposits and withdrawals by address In this tutorial, you'll learn how to use the [Optimism SDK](https://sdk.optimism.io) to view all of the [Standard Bridge](../bridging/standard-bridge) deposits and withdrawals triggered by a given address. @@ -23,7 +21,7 @@ Check out the tutorial on [Bridging ERC-20 Tokens With the Optimism SDK](./cross * [node](https://nodejs.org/en/) * [pnpm](https://pnpm.io/installation) -## Create a Demo Project +## Create a demo project You're going to use the Optimism SDK for this tutorial. Since the Optimism SDK is a [Node.js](https://nodejs.org/en/) library, you'll need to create a Node.js project to use it. @@ -57,7 +55,7 @@ pnpm add ethers@^5 -## Add RPC URLs to Your Environment +## Add RPC URLs to your environment You'll be using the `getDepositsByAddress` and `getWithdrawalsByAddress` functions from the Optimism SDK during this tutorial. These functions use event queries to retrieve the deposits and withdrawals made by a given address. @@ -85,7 +83,7 @@ node This will bring up a Node REPL prompt that allows you to run javascript code. -## Import Dependencies +## Import dependencies You need to import some dependencies into your Node REPL session. @@ -103,7 +101,7 @@ You need to import some dependencies into your Node REPL session. -## Set Session Variables +## Set session variables You'll need a few variables throughout this tutorial. Let's set those up now. @@ -139,7 +137,7 @@ Create an instance of the `CrossChainMessenger` class: ```js file=/public/tutorials/sdk-view-txns.js#L19-L24 hash=158c6888c82bdc2f07c37c3edb3a9a6a ``` -## Query for Deposits +## Query for deposits You'll first query for all of the deposits made by the target address. The `CrossChainMessenger` has a convenient function called `getDepositsByAddress` that makes this easy. @@ -158,7 +156,7 @@ The `CrossChainMessenger` has a convenient function called `getDepositsByAddress -## Query for Withdrawals +## Query for withdrawals You'll next query for all of the withdrawals made by the target address. The `CrossChainMessenger` has a convenient function called `getWithdrawalsByAddress` that makes this easy. diff --git a/pages/builders/app-developers/tutorials/send-tx-from-eth.mdx b/pages/builders/app-developers/tutorials/send-tx-from-eth.mdx index d7a53efe3..5b95054cf 100644 --- a/pages/builders/app-developers/tutorials/send-tx-from-eth.mdx +++ b/pages/builders/app-developers/tutorials/send-tx-from-eth.mdx @@ -1,5 +1,5 @@ --- -title: Triggering OP Mainnet Transactions from Ethereum +title: Triggering OP Mainnet transactions from Ethereum lang: en-US description: Learn how to force transaction inclusion without the OP Mainnet Sequencer. --- @@ -8,9 +8,7 @@ import { Callout, Steps } from 'nextra/components' import { WipCallout } from '@/components/WipCallout' -# Triggering OP Mainnet Transactions from Ethereum - - +# Triggering OP Mainnet transactions from Ethereum OP Mainnet currently uses a single-Sequencer block production model. This means that there is only one Sequencer active on the network at any given time. @@ -28,7 +26,7 @@ You'll use the OP Sepolia testnet, but the same logic will apply to OP Mainnet. * [node](https://nodejs.org/en/) * [pnpm](https://pnpm.io/installation) -## Create a Demo Project +## Create a demo project You're going to use the `@eth-optimism/contracts-ts` package for this tutorial. Since the `@eth-optimism/contracts-ts` package is a [Node.js](https://nodejs.org/en/) library, you'll need to create a Node.js project to use it. @@ -83,7 +81,7 @@ You can use [this faucet](https://sepoliafaucet.com) to get ETH on Sepolia. You can use the [Superchain Faucet](https://console.optimism.io/faucet?utm_source=docs) to get ETH on OP Sepolia.
-## Add a Private Key to Your Environment +## Add a private key to your environment You need a private key in order to sign transactions. Set your private key as an environment variable with the `export` command. @@ -104,7 +102,7 @@ node This will bring up a Node REPL prompt that allows you to run javascript code. -## Import Dependencies +## Import dependencies You need to import some dependencies into your Node REPL session. @@ -127,7 +125,7 @@ You need to import some dependencies into your Node REPL session. -## Set Session Variables +## Set session variables You'll need a few variables throughout this tutorial. Let's set those up now. @@ -146,7 +144,7 @@ Let's set those up now. -## Check Your Initial Balance +## Check your initial balance You'll be sending a small amount of ETH as part of this tutorial. Quickly check your balance on OP Sepolia so that you know how much you had at the start of the tutorial. @@ -154,7 +152,7 @@ Quickly check your balance on OP Sepolia so that you know how much you had at th ```js file=/public/tutorials/send-tx-from-eth.js#L15-L16 hash=062c80bbd70e12144fe45532611a1846 ``` -## Trigger the Transaction +## Trigger the transaction Now you'll use the [`OptimismPortal`](https://github.com/ethereum-optimism/optimism/blob/62c7f3b05a70027b30054d4c8974f44000606fb7/packages/contracts-bedrock/contracts/L1/OptimismPortal.sol) contract to trigger a transaction on OP Sepolia by sending a transaction on Sepolia. @@ -200,7 +198,7 @@ Here you'll determine the hash of the L2 transaction using the `@eth-optimism/co -## Check Your Updated Balance +## Check your updated balance You should have a little less ETH on OP Sepolia now. Check your balance to confirm. @@ -213,7 +211,7 @@ Make sure that the difference is equal to the amount you were expecting to send. ```js file=/public/tutorials/send-tx-from-eth.js#L57-L58 hash=e44227b3ca6f46e6a16a10689b11ad39 ``` -## Next Steps +## Next steps You've successfully triggered a transaction on OP Sepolia by sending a transaction on Sepolia. Although this tutorial demonstrated the simple example of sending a basic ETH transfer from your L2 address via the OptimismPortal contract, you can use this same technique to trigger any transaction you want. diff --git a/pages/builders/app-developers/tutorials/standard-bridge-custom-token.mdx b/pages/builders/app-developers/tutorials/standard-bridge-custom-token.mdx index d6e2a5dbd..71eb9a639 100644 --- a/pages/builders/app-developers/tutorials/standard-bridge-custom-token.mdx +++ b/pages/builders/app-developers/tutorials/standard-bridge-custom-token.mdx @@ -1,5 +1,5 @@ --- -title: Bridging Your Custom ERC-20 Token Using the Standard Bridge +title: Bridging your custom ERC-20 token using the Standard Bridge lang: en-US description: Learn how to bridge your custom ERC-20 token using the standard bridge. --- @@ -8,9 +8,7 @@ import { Callout, Steps } from 'nextra/components' import { WipCallout } from '@/components/WipCallout' -# Bridging Your Custom ERC-20 Token Using the Standard Bridge - - +# Bridging your custom ERC-20 token using the Standard Bridge In this tutorial you'll learn how to bridge a custom ERC-20 token from Ethereum to an OP Stack chain using the Standard Bridge system. This tutorial is meant for developers who already have an existing ERC-20 token on Ethereum and want to create a bridged representation of that token on OP Mainnet. @@ -45,19 +43,19 @@ You can use [this faucet](https://sepoliafaucet.com/) to get ETH on Sepolia. You can use the [Superchain Faucet](https://console.optimism.io/faucet?utm_source=docs) to get ETH on OP Sepolia.
-## Add OP Sepolia to Your Wallet +## Add OP Sepolia to your wallet This tutorial uses [Remix](https://remix.ethereum.org) to deploy contracts. You will need to add the OP Sepolia network to your wallet in order to follow this tutorial. You can use [this website](https://chainid.link?network=op-sepolia) to connect your wallet to OP Sepolia. -## Get an L1 ERC-20 Token Address +## Get an L1 ERC-20 token address You will need an L1 ERC-20 token for this tutorial. If you already have an L1 ERC-20 token deployed on Sepolia, you can skip this step. Otherwise, you can use the testing token located at [`0x5589BB8228C07c4e15558875fAf2B859f678d129`](https://sepolia.etherscan.io/address/0x5589BB8228C07c4e15558875fAf2B859f678d129) that includes a `faucet()` function that can be used to mint tokens. -## Create an L2 ERC-20 Token +## Create an L2 ERC-20 token Once you have an L1 ERC-20 token, you can create a corresponding L2 ERC-20 token on OP Sepolia. This tutorial will use [Remix](https://remix.ethereum.org) so you can easily deploy a token without a framework like [Hardhat](https://hardhat.org) or [Foundry](https://getfoundry.sh). @@ -113,7 +111,7 @@ _SYMBOL: "MCL2T" -## Bridge Some Tokens +## Bridge some tokens Now that you have an L2 ERC-20 token, you can bridge some tokens from L1 to L2. Check out the tutorial on [Bridging ERC-20 tokens with the Optimism SDK](./cross-dom-bridge-erc20) to learn how to bridge your L1 ERC-20 to L2s using the Optimism SDK. diff --git a/pages/builders/app-developers/tutorials/standard-bridge-standard-token.mdx b/pages/builders/app-developers/tutorials/standard-bridge-standard-token.mdx index 57c589f68..f575395f4 100644 --- a/pages/builders/app-developers/tutorials/standard-bridge-standard-token.mdx +++ b/pages/builders/app-developers/tutorials/standard-bridge-standard-token.mdx @@ -1,5 +1,5 @@ --- -title: Bridging Your Standard ERC-20 Token Using the Standard Bridge +title: Bridging your standard ERC-20 token using the Standard Bridge lang: en-US description: Learn how to bridge your standard ERC-20 token using the standard bridge. --- @@ -10,8 +10,6 @@ import { WipCallout } from '@/components/WipCallout' # Bridging Your Standard ERC-20 Token Using the Standard Bridge - - In this tutorial you'll learn how to bridge a standard ERC-20 token from Ethereum to an OP Stack chain using the Standard Bridge system. This tutorial is meant for developers who already have an existing ERC-20 token on Ethereum and want to create a bridged representation of that token on layer 2. @@ -44,7 +42,7 @@ You can use [this faucet](https://sepoliafaucet.com) to get ETH on Sepolia. You can use the [Superchain Faucet](https://console.optimism.io/faucet?utm_source=docs) to get ETH on OP Sepolia.
-## Get an L1 ERC-20 Token Address +## Get an L1 ERC-20 token address You will need an L1 ERC-20 token for this tutorial. If you already have an L1 ERC-20 token deployed on Sepolia, you can skip this step. @@ -95,7 +93,7 @@ The resulting L2 ERC-20 token address is printed to the console. -## Bridge Some Tokens +## Bridge some tokens Now that you have an L2 ERC-20 token, you can bridge some tokens from L1 to L2. Check out the tutorial on [Bridging ERC-20 tokens with the Optimism SDK](./cross-dom-bridge-erc20) to learn how to bridge your L1 ERC-20 to L2s using the Optimism SDK. diff --git a/pages/builders/cex-wallet-developers/cex-support.mdx b/pages/builders/cex-wallet-developers/cex-support.mdx index 044c5118e..b9bf2473c 100644 --- a/pages/builders/cex-wallet-developers/cex-support.mdx +++ b/pages/builders/cex-wallet-developers/cex-support.mdx @@ -1,12 +1,12 @@ --- -title: Supporting OP Mainnet in Your Exchange +title: Supporting OP Mainnet in your exchange lang: en-US description: Learn how to support OP Mainnet in your exchange. --- import { Callout } from 'nextra/components' -# Supporting OP Mainnet in Your Exchange +# Supporting OP Mainnet in your exchange Check out this guide to get an overview of everything you need to know to properly support OP Mainnet within your exchange. @@ -17,23 +17,23 @@ You can use your favorite Ethereum libraries and tools to work with OP Mainnet. Head over to the [Networks and RPC Endpoints](/chain/networks) page for network connection details and check out the [RPC Providers](/builders/tools/connect/rpc-providers) page for an updated list of RPC providers that support OP Mainnet. If you need to run your own OP Mainnet node, head over to the [Node Operator](/builders/node-operators/rollup-node) guide. -## Native Gas Token (ETH) +## Native gas token (ETH) OP Mainnet uses ETH as its native gas token. Transactions are paid for in ETH and account balances are denominated in ETH. -## Transaction Fees +## Transaction fees OP Mainnet charges the standard gas fee for transactions, but also charges an additional L1 data fee for the cost of publishing transaction data to Ethereum. Check out the [Transaction Fees](/stack/transactions/fees) page for more information about how transaction fees work on OP Mainnet. -## Smart Contracts +## Smart contracts Smart contracts on OP Mainnet function the same way they do on Ethereum. This includes ERC-20 token contracts. You can use your existing logic for managing withdrawals and deposits of ERC-20 tokens. -## Token Addresses +## Token addresses The ERC-20 contract address for a token on OP Mainnet may differ from the address for the same token on Ethereum. Make sure to reference the [Bridged Token Addresses](/chain/tokenlist) to confirm that you are using the correct token addresses in your application. @@ -44,7 +44,7 @@ You may need to transfer ETH or ERC-20 tokens between OP Mainnet and Ethereum. For instance, you may need to use this functionality to balance the supply of ETH on OP Mainnet and Ethereum depending on the demand for withdrawals and deposits on the two networks. Refer to the [Basics of Bridging](/builders/app-developers/bridging/basics) and the [Standard Bridge](/builders/app-developers/bridging/standard-bridge) guides for more information about how to bridge ETH and ERC-20 tokens between OP Mainnet and Ethereum. -## Transaction Statuses +## Transaction statuses OP Mainnet transactions have a number of different statuses during the transaction lifecycle. Refer to the [Transaction Statuses](/builders/app-developers/transactions/statuses) page for more information about the different transaction statuses and how to handle them in your application. @@ -55,7 +55,7 @@ For instance, you may only want to credit a deposit if the transaction is finali Make sure to understand the various transaction statuses to avoid security issues in your application.
-## Audits and Security Reviews +## Audits and security reviews The OP Stack codebase upon which OP Mainnet is built has undergone a number of security reviews. Visit [GitHub](https://github.com/ethereum-optimism/optimism/tree/develop/docs/security-reviews) for a full list of the most recent reports. diff --git a/pages/builders/cex-wallet-developers/wallet-support.mdx b/pages/builders/cex-wallet-developers/wallet-support.mdx index 31c085699..ff0341390 100644 --- a/pages/builders/cex-wallet-developers/wallet-support.mdx +++ b/pages/builders/cex-wallet-developers/wallet-support.mdx @@ -1,12 +1,12 @@ --- -title: Supporting OP Mainnet in Your Wallet +title: Supporting OP Mainnet in your wallet lang: en-US description: Learn how to support OP Mainnet in your wallet. --- import { Callout } from 'nextra/components' -# Supporting OP Mainnet in Your Wallet +# Supporting OP Mainnet in your wallet Check out this guide to get an overview of everything you need to know to properly support OP Mainnet within your wallet. @@ -17,12 +17,12 @@ You can use your favorite Ethereum libraries and tools to work with OP Mainnet. Head over to the [Networks and RPC Endpoints](/chain/networks) page for network connection details and check out the [RPC Providers](/builders/tools/connect/rpc-providers) page for an updated list of RPC providers that support OP Mainnet. If you need to run your own OP Mainnet node, head over to the [Node Operator](/builders/node-operators/rollup-node) guide. -## Native Gas Token (ETH) +## Native gas token (ETH) OP Mainnet uses ETH as its native gas token. Transactions are paid for in ETH and account balances are denominated in ETH. -## Transaction Fees +## Transaction fees OP Mainnet charges the standard gas fee for transactions, but also charges an additional L1 data fee for the cost of publishing transaction data to Ethereum. Check out the [Transaction Fees](/stack/transactions/fees) page for more information about how transaction fees work on OP Mainnet. @@ -32,12 +32,12 @@ Transactions on OP Mainnet must pay for an additional "L1 data fee" that often h Make sure that your wallet is configured to display this fee to your users so that they are aware of the total cost of their transaction.
-## Smart Contracts +## Smart contracts Smart contracts on OP Mainnet function the same way they do on Ethereum. You can use your favorite Ethereum libraries and tools to interact with smart contracts on OP Mainnet. -## Token Addresses +## Token addresses The ERC-20 contract address for a token on OP Mainnet may differ from the address for the same token on Ethereum. Addresses for many common tokens will differ between OP Mainnet and Ethereum. @@ -49,7 +49,7 @@ You may need to transfer ETH or ERC-20 tokens between OP Mainnet and Ethereum. This is a useful feature for users who want to move tokens between the two networks. Refer to the [Basics of Bridging](/builders/app-developers/bridging/basics) and the [Standard Bridge](/builders/app-developers/bridging/standard-bridge) guides for more information about how to bridge ETH and ERC-20 tokens between OP Mainnet and Ethereum. -## Transaction Statuses +## Transaction statuses OP Mainnet transactions have a number of different statuses during the transaction lifecycle. The status of a transaction can be useful for users. diff --git a/pages/builders/chain-operators/architecture.mdx b/pages/builders/chain-operators/architecture.mdx index a719bc439..81464816c 100644 --- a/pages/builders/chain-operators/architecture.mdx +++ b/pages/builders/chain-operators/architecture.mdx @@ -1,5 +1,5 @@ --- -title: Chain Architecture +title: Chain architecture lang: en-US description: Learn about the OP chain architecture. --- @@ -8,7 +8,7 @@ import Image from 'next/image' import { Callout } from 'nextra/components' import {OpProposerDescriptionShort} from '@/content/index.js' -# Chain Architecture +# Chain architecture This page contains information about the components of the rollup protocol and how they work together to build the layer 2 blockchain from the Chain Operator's @@ -18,7 +18,7 @@ clients. The OP Stack also has some privileged roles that produce L2 blocks. If you want a more detailed view of the OP Stack protocol, check out the [OP Stack section](/stack/getting-started) of our documentation. -## Permissioned Components +## Permissioned components These clients and services work together to enable the block production on the L2 network. Sequencer nodes (`op-geth` + `op-node`) gather proposed transactions from users. @@ -49,7 +49,7 @@ amount of data required to reproduce L2 blocks. -## Ingress Traffic +## Ingress traffic It is important to setup a robust chain architecture to handle large volumes of RPC requests from your users. The Sequencer node has the important job of working with @@ -96,7 +96,7 @@ replicas can help horizontally scale RPC requests. Replica Node Diagram -## Next Steps +## Next steps * Find out how you can support [snap sync](/builders/chain-operators/management/snap-sync) on your chain. diff --git a/pages/builders/chain-operators/configuration/batcher.mdx b/pages/builders/chain-operators/configuration/batcher.mdx index df5dfadea..37db8c8cc 100644 --- a/pages/builders/chain-operators/configuration/batcher.mdx +++ b/pages/builders/chain-operators/configuration/batcher.mdx @@ -1,18 +1,18 @@ --- -title: Batcher Configuration +title: Batcher configuration lang: en-US description: Learn the OP Stack batcher configurations. --- import { Callout, Tabs } from 'nextra/components' -# Batcher Configuration +# Batcher configuration This page lists all configuration options for the op-batcher. The op-batcher posts L2 sequencer data to the L1, to make it available for verifiers. The following options are from the `--help` in [v1.7.6](https://github.com/ethereum-optimism/optimism/releases/tag/v1.7.6). -## Global Options +## Global options ### active-sequencer-check-duration @@ -633,7 +633,7 @@ Print the version. The default value is false. ## Recommendations -### Set Your `OP_BATCHER_MAX_CHANNEL_DURATION` +### Set your `OP_BATCHER_MAX_CHANNEL_DURATION` The default value inside `op-batcher`, if not specified, is still `0`, which means channel duration tracking is disabled. @@ -652,7 +652,7 @@ To minimize costs, we recommend setting your `OP_BATCHER_MAX_CHANNEL_DURATION` * Thus a larger gap between posting batches can result in significant delays in the operation of certain types of high-security applications. -### Configure Your Batcher to Use Multiple Blobs +### Configure your batcher to use multiple blobs The `op-batcher` has the capabilities to send multiple blobs per single blob transaction. This is accomplished by the use of multi-frame channels, see the [specs](https://specs.optimism.io/protocol/derivation.html#frame-format) for more technical details on channels and frames. diff --git a/pages/builders/chain-operators/configuration/overview.mdx b/pages/builders/chain-operators/configuration/overview.mdx index 8a5c74f08..ecf678b17 100644 --- a/pages/builders/chain-operators/configuration/overview.mdx +++ b/pages/builders/chain-operators/configuration/overview.mdx @@ -6,7 +6,7 @@ description: Learn the how to configure an OP Stack chain. import { Callout, Steps } from 'nextra/components' -# Chain Operator Configurations +# Chain operator configurations OP Stack chains can be configured for the Chain Operator's needs. Each component of the stack has its own considerations. See the following for diff --git a/pages/builders/chain-operators/configuration/proposer.mdx b/pages/builders/chain-operators/configuration/proposer.mdx index da7b24846..4702f208c 100644 --- a/pages/builders/chain-operators/configuration/proposer.mdx +++ b/pages/builders/chain-operators/configuration/proposer.mdx @@ -6,13 +6,13 @@ description: Learn the OP Stack proposer configurations. import { Tabs } from 'nextra/components' -# Proposer Configuration +# Proposer configuration This page list all configuration options for op-proposer. The op-proposer posts the output roots to the L1, to make it available for verifiers. The following options are from the `--help` in [v1.7.6](https://github.com/ethereum-optimism/optimism/releases/tag/v1.7.6). -## Global Options +## Global options ### active-sequencer-check-duration diff --git a/pages/builders/chain-operators/configuration/rollup.mdx b/pages/builders/chain-operators/configuration/rollup.mdx index 6dd615624..5b16b533a 100644 --- a/pages/builders/chain-operators/configuration/rollup.mdx +++ b/pages/builders/chain-operators/configuration/rollup.mdx @@ -1,12 +1,12 @@ --- -title: Rollup Deployment Configuration +title: Rollup deployment configuration lang: en-US description: Learn about the OP Stack rollup deployment configurations. --- import { Callout } from 'nextra/components' -# Rollup Deployment Configuration +# Rollup deployment configuration New OP Stack blockchains are currently configured with a deployment configuration JSON file inside that is passed into the smart contract @@ -29,12 +29,12 @@ This document highlights the deployment configurations and their values. and the actual requirements in the [OP Stack Configurability Specification](https://specs.optimism.io/protocol/configurability.html).
-## Deployment Configuration Values +## Deployment configuration values These values are provided to the deployment configuration JSON file when deploying the L1 contracts. -### Offset Values +### Offset values These offset values determine when network upgrades (hardforks) activate on your blockchain. @@ -168,7 +168,7 @@ makes predeployed contracts easily upgradeable. *** -### Proxy Addresses +### Proxy addresses #### l1StandardBridgeProxy @@ -542,7 +542,7 @@ scalar used for fee calculations. *** -### Proposal Fields +### Proposal fields These fields apply to output root proposals. The l2OutputOracleSubmissionInterval is configurable, see the section below for @@ -686,7 +686,7 @@ SequencerFeeVaultWithdrawalNetwork value. *** -### Minimum Fee Withdrawal Amounts +### Minimum fee withdrawal amounts Withdrawals to L1 are expensive and the minimum fee is to prevent overhead costs of continuous tiny withdrawals. If the withdrawal execution costs more @@ -733,7 +733,7 @@ amount for the SequencerFeeVault. *** -### Withdrawal Network +### Withdrawal network *** @@ -779,7 +779,7 @@ L1 and a value of 1 will withdraw ETH to the recipient address on L2. *** -### Fault Proofs +### Fault proofs *** diff --git a/pages/builders/chain-operators/deploy/genesis.mdx b/pages/builders/chain-operators/deploy/genesis.mdx index a6bf9aa69..17bfdfbf6 100644 --- a/pages/builders/chain-operators/deploy/genesis.mdx +++ b/pages/builders/chain-operators/deploy/genesis.mdx @@ -1,19 +1,19 @@ --- -title: OP Stack Genesis Creation +title: OP Stack genesis creation lang: en-US description: Learn how to create a genesis file for the OP Stack. --- import { Callout } from 'nextra/components' -# OP Stack Genesis Creation +# OP Stack genesis creation The following guide shows you how to generate the L2 genesis file `genesis.json`. This is a JSON file that represents the L2 genesis. You will provide this file to the execution client (op-geth) to initialize your network. There is also the rollup configuration file, `rollup.json`, which will be provided to the consensus client (op-node). -## Solidity Script +## Solidity script At the time of this writing, the preferred method for genesis generation is to use the foundry script located in the monorepo to generate an "L2 state dump" and then pass this into the op-node genesis subcommand. @@ -82,7 +82,7 @@ go run cmd/main.go genesis l2 \ --l1-rpc=> ``` -## Next Steps +## Next steps * Learn how to [initialize](/builders/node-operators/configuration/base-config#initialization-via-genesis-file) `op-geth` with your `genesis.json` file. diff --git a/pages/builders/chain-operators/deploy/overview.mdx b/pages/builders/chain-operators/deploy/overview.mdx index d6ce3695d..1d3617644 100644 --- a/pages/builders/chain-operators/deploy/overview.mdx +++ b/pages/builders/chain-operators/deploy/overview.mdx @@ -1,12 +1,12 @@ --- -title: OP Stack Deployment Overview +title: OP Stack deployment overview lang: en-US description: Learn about the different components of deploying the OP Stack. --- import { Callout } from 'nextra/components' -# OP Stack Deployment Overview +# OP Stack deployment overview When deploying an OP Stack chain, you'll be setting up four different components. It's useful to understand what each of these components does before @@ -14,7 +14,7 @@ you start deploying your chain. The OP Stack can be deployed as a L3, which includes additional considerations. The following information assumes you're deploying a L2 Rollup on Ethereum. -## Smart Contracts +## Smart contracts The OP Stack uses a set of smart contracts on the L1 blockchain to manage aspects of the Rollup. Each OP Stack chain has its own set of L1 smart @@ -27,14 +27,14 @@ contracts that are deployed when the chain is created. changes. Read more about the details on our [Smart Contract Release Section](/stack/smart-contracts#official-releases).
-## Sequencer Node +## Sequencer node OP Stack chains use a Sequencer node to gather proposed transactions from users and publish them to the L1 blockchain. OP Stack chains rely on at least one of these Sequencer nodes. You can also run additional replica (non-Sequencer) nodes. -### Consensus Client +### Consensus client OP Stack Rollup nodes, like Ethereum nodes, have a consensus client. The consensus client is responsible for determining the list and ordering of blocks @@ -43,7 +43,7 @@ the OP Stack consensus client exist, including `op-node` (maintained by the Optimism Foundation), [`magi`](https://github.com/a16z/magi) (maintained by a16z) and [`hildr`](https://github.com/optimism-java/hildr) (maintained by OptimismJ). -### Execution Client +### Execution client OP Stack nodes, like Ethereum nodes, also have an execution client. The execution client is responsible for executing transactions and maintaining the @@ -65,7 +65,7 @@ the form of L2 state roots) to the L1 blockchain. This allows smart contracts on L1 to read the state of the L2, which is necessary for cross-chain communication and reconciliation between state changes. -## Software Dependencies +## Software dependencies | Dependency | Version | Version Check Command | | ------------------------------------------------------------- | -------- | --------------------- | @@ -78,7 +78,7 @@ communication and reconciliation between state changes. | [jq](https://github.com/jqlang/jq) | `^1.6` | `jq --version` | | [direnv](https://direnv.net) | `^2` | `direnv --version` | -### Notes on Specific Dependencies +### Notes on specific dependencies #### `node` @@ -114,7 +114,7 @@ then **close your terminal and reopen it** so that the changes take effect (or (and things might not work later). -## Next Steps +## Next steps * Discover how to [deploy the smart contracts](/builders/chain-operators/deploy/smart-contracts). * Find out how to create your [genesis file](/builders/chain-operators/deploy/genesis). diff --git a/pages/builders/chain-operators/deploy/smart-contracts.mdx b/pages/builders/chain-operators/deploy/smart-contracts.mdx index 63a3512f1..bcea8a6b4 100644 --- a/pages/builders/chain-operators/deploy/smart-contracts.mdx +++ b/pages/builders/chain-operators/deploy/smart-contracts.mdx @@ -6,7 +6,7 @@ description: Learn how to deploy the OP Stack L1 smart contracts. import { Callout } from 'nextra/components' -# OP Stack Smart Contract Deployment +# OP Stack smart contract deployment The following guide shows you how to deploy the OP Stack L1 smart contracts. The primary development branch is `develop`, however **you should only deploy @@ -18,7 +18,7 @@ generally not considered backwards compatible. Standard OP Stack chains should use the latest governance approved and audited versions of the smart contract code. -## Deployment Configuration +## Deployment configuration Deploying your OP Stack contracts requires creating a deployment configuration JSON file. You will create a new deployment configuration file in the following @@ -26,13 +26,13 @@ monorepo subdirectory: [packages/contracts-bedrock/deploy-config](https://github For the full set of deployment configuration options and their meanings, you can see the [rollup deployment configuration page](/builders/chain-operators/configuration/rollup). -## Deployment Script +## Deployment script The smart contracts are deployed using [foundry](https://github.com/foundry-rs) and you can find the script's source code in the monorepo at [packages/contracts-bedrock/scripts/deploy/Deploy.s.sol](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts-bedrock/scripts/deploy/Deploy.s.sol). -### State Diff +### State diff Before deploying the contracts, you can verify the state diff by using the `runWithStateDiff()` function signature in the deployment script, which produces the outputs inside [`snapshots/state-diff/`](https://github.com/ethereum-optimism/optimism/tree/develop/packages/contracts-bedrock/snapshots/state-diff). @@ -77,7 +77,7 @@ All functions for deploying a single contract are public, meaning that the `--sig` argument to forge script can be used to target the deployment of a single contract. -## Best Practices +## Best practices Production users should deploy their L1 contracts from a contracts release. All contracts releases are on git tags with the following format: @@ -90,7 +90,7 @@ running the additional infrastructure requirements: [op-challenger](https://gith additional changes to the economics of operating a permissionless fault proof that chain operators should have a firm understanding of. -## Next Steps +## Next steps * Learn how to [create your genesis file](/builders/chain-operators/deploy/genesis) * See all [configuration options](/builders/chain-operators/configuration/rollup) and example configurations diff --git a/pages/builders/chain-operators/features/alt-da-mode.mdx b/pages/builders/chain-operators/features/alt-da-mode.mdx index e6f6397c7..53eb8f11e 100644 --- a/pages/builders/chain-operators/features/alt-da-mode.mdx +++ b/pages/builders/chain-operators/features/alt-da-mode.mdx @@ -1,12 +1,12 @@ --- -title: How to Run an Alt-DA Mode Chain +title: How to run an Alt-DA mode chain lang: en-US description: Learn how to configure and run an Alt-DA mode chain within the OP Stack. --- import { Callout, Steps } from 'nextra/components' -# How to Run an Alt-DA Mode Chain +# How to run an Alt-DA mode chain The Alt-DA Mode feature is currently in Beta within the MIT-licensed OP Stack. Beta features are built and reviewed by Optimism Collective core contributors, and provide developers with early access to highly requested configurations. @@ -35,7 +35,7 @@ You should use at least the following compatible op\* versions when running your - ### Setup Your DA Server + ### Setup your DA server DA Servers are not built or maintained by Optimism Collective Core Contributors. DA servers are maintained by third parties and run at your own risk. Please reach out to the team who built the DA Server you are trying to run with any questions or issues. @@ -47,7 +47,7 @@ You should use at least the following compatible op\* versions when running your * 0gDA's docs on how to run the [0gDA DA Server](https://github.com/0glabs/0g-da-op-plasma/blob/op0g/README.md) * Near DA's docs on how to run the [Near DA Server](https://github.com/Nuffle-Labs/data-availability/blob/84b484de98f58a91bf12c8abe8df27f5e753f63a/docs/OP-Alt-DA.md) - ### Configure Your `op-node` + ### Configure your `op-node` * Spin up your OP chain as usual but set `--altda.enabled=true` and point both `op-batcher` and `op-node` to the DA server. * No configuration changes are required for `op-geth` or `op-proposer`. @@ -67,7 +67,7 @@ You should use at least the following compatible op\* versions when running your ``` - ### Configure Your Batcher + ### Configure your batcher * Set `--altda.enabled=true` and `--altda.da-service=true`. * Provide the URL for `--atlda.da-server=$DA_SERVER_HTTP_URL`. @@ -88,7 +88,7 @@ You should use at least the following compatible op\* versions when running your After completing steps 1-3 above, you will have an Alt-DA mode chain up and running. - ### Set Your Fee Configuration + ### Set your fee configuration * Chain operators are not posting everything to Ethereum, just commitments, so chain operators will need to determine fee scalars values to charge users. The fee scalar values are network throughput dependent, so values will need to be adjusted by chain operators as needed. * Cost structure for Alt-DA Mode: The transaction data is split up into 128kb chunks and then submitted to your DA Layer. Then, 32 byte commitments are submitted (goes to batch inbox address) to L1 for each 128kb chunk. Then, figure out how much that costs relative to the amount of transactions your chain is putting through. @@ -105,12 +105,12 @@ You should use at least the following compatible op\* versions when running your -## For Node Operators (Full and Archive Nodes) +## For node operators (full and archive nodes) * Run a DA server as laid out in [Step 1](#setup-your-da-server) * Provide the same `--altda.enabled=true, --altda.da-server...` on `op-node` as listed in [Step 2](#configure-your-op-node) -## Inclusion Criteria +## Inclusion criteria Alt DA teams who want to be featured on this page must meet the following criteria: @@ -118,17 +118,17 @@ Alt DA teams who want to be featured on this page must meet the following criter * Supporting detailed documentation, to be referenced [here](#setup-your-da-server) * Functioning OP Stack devnet using your DA server with linked configuration, contract addresses, and RPC address -## Breaking Changes: Renaming Plasma Mode to Alt-DA Mode +## Breaking changes: renaming Plasma Mode to Alt-DA Mode This feature has been renamed from Plasma Mode to Alt-DA Mode in the monorepo at: [0bb2ff5](https://github.com/ethereum-optimism/optimism/commit/0bb2ff57c8133f1e3983820c0bf238001eca119b). There are several breaking changes you should be aware of. These include changes to configuration file parameters, environment variables, and CLI commands. Before proceeding with the migration, ensure you are using [OP Stack v1.9.1](https://github.com/ethereum-optimism/optimism/releases/tag/v1.9.1) or later. -### Modify `rollup.json` Config: +### Modify `rollup.json` config: Update your `rollup.json` configuration file by replacing the old Plasma config with the new Alt-DA config. There are two possible formats for the old Plasma config: -### Legacy Plasma Config +### Legacy plasma config If your config looks like this: @@ -140,7 +140,7 @@ If your config looks like this: "da_resolve_window": 2000, ``` -### Recent Plasma Config +### Recent plasma config Or if it looks like this: @@ -153,7 +153,7 @@ Or if it looks like this: } ``` -### New Alt-DA Config +### New Alt-DA config Replace either of the above configurations with: @@ -170,9 +170,9 @@ Replace either of the above configurations with: Only include fields in the new config that were present in your old config. -## Updating OP Stack Runtime Config Parameters +## Updating OP Stack runtime config parameters -### CLI Parameters +### CLI parameters Update the following CLI parameters for both `op-node` and `op-batcher`: @@ -183,7 +183,7 @@ Update the following CLI parameters for both `op-node` and `op-batcher`: | `--plasma.verify-on-read` | `--altda.verify-on-read` | | `--plasma.da-service` | `--altda.da-service` | -### Environment Variables +### Environment variables #### op-node @@ -222,7 +222,7 @@ After making these changes, your system should be properly configured to use the Remember to thoroughly test your configuration in testnet before going mainnet. -## Next Steps +## Next steps * Additional questions? See the FAQ section in the [Alt-DA Mode Explainer](/stack/protocol/features/alt-da-mode#faqs). * For more detailed info on Alt-DA Mode, see the [specs](https://specs.optimism.io/experimental/alt-da.html). diff --git a/pages/builders/chain-operators/features/bridged-usdc-standard.mdx b/pages/builders/chain-operators/features/bridged-usdc-standard.mdx index f352c5e12..cfadfa2ee 100644 --- a/pages/builders/chain-operators/features/bridged-usdc-standard.mdx +++ b/pages/builders/chain-operators/features/bridged-usdc-standard.mdx @@ -28,7 +28,7 @@ Chain operators can use the Bridged USDC Standard for the OP Stack to get bridge The referenced implementation for the OP Stack has undergone [audits from Spearbit](https://github.com/defi-wonderland/opUSDC/blob/main/audits/spearbit.pdf) and is recommended for production use. -## Next Steps +## Next steps * Ready to get started? Read the setup guide for the [Bridged USDC Standard for the OP Stack](https://github.com/defi-wonderland/opUSDC#setup). * If you experience any problems, please reach out to [developer support](https://github.com/ethereum-optimism/developers/discussions). diff --git a/pages/builders/chain-operators/features/custom-gas-token.mdx b/pages/builders/chain-operators/features/custom-gas-token.mdx index f2a42c986..9a11e5a47 100644 --- a/pages/builders/chain-operators/features/custom-gas-token.mdx +++ b/pages/builders/chain-operators/features/custom-gas-token.mdx @@ -1,12 +1,12 @@ --- -title: How to Run a Custom Gas Token Chain +title: How to run a custom gas token chain lang: en-US description: Learn how to run a custom gas token chain. --- import { Callout, Steps } from 'nextra/components' -# How to Run a Custom Gas Token Chain +# How torRun a custom gas token chain The Custom Gas Token feature is a Beta feature of the MIT licensed OP Stack. While it has received initial review from core contributors, it is still undergoing testing, and may have bugs or other issues. @@ -16,7 +16,7 @@ This guide provides a walkthrough for chain operators who want to run a custom g An OP Stack chain that uses the custom gas token feature enables an end user to deposit an L1 native ERC20 token into L2 where that asset is minted as the native L2 asset and can be used to pay for gas on L2. - ### Deploying Your Contracts + ### Deploying your contracts * Checkout the [`v2.0.0-beta.3` of the contracts](https://github.com/ethereum-optimism/optimism/tree/op-contracts/v2.0.0-beta.3) and use the commit to deploy. @@ -87,7 +87,7 @@ section of the docs. * `DEPLOY_CONFIG_PATH` is the path to the file for the deploy config used to deploy * `STATE_DUMP_PATH` is a path to the generated L2 allocs file, this is the genesis state and is required for the next step. - ### Generating L2 Genesis + ### Generating L2 genesis The `op-node` is used to generate the final L2 genesis file. It takes the allocs created by the forge script as input for the `--l2-allocs` flag. @@ -101,7 +101,7 @@ section of the docs. --outfile.rollup ``` - ### Spinning Up Your Infrastructure + ### Spinning up your infrastructure Ensure that the end to end system is running. @@ -125,7 +125,7 @@ section of the docs. cast call --rpc-url $L1_ETH_RPC_URL 'isCustomGasToken()(bool)' ``` - ### Depositing Custom Gas Token into the Chain + ### Depositing custom gas token into the chain * To deposit the custom gas token into the chain, users must use the **`OptimismPortalProxy.depositERC20Transaction`** method * Users MUST first `approve()` the `OptimismPortal` before they can deposit tokens using `depositERC20Transaction`. @@ -141,7 +141,7 @@ section of the docs. ) public; ``` - ### Withdrawing Custom Gas Tokens out of the Chain + ### Withdrawing custom gas tokens out of the chain * To withdraw your native custom gas token from the chain, users must use the **`L2ToL1MessagePasser.initiateWithdrawal`** method. Proving and finalizing withdrawals is identical to the process on chains that use ETH as the native gas token. @@ -154,7 +154,7 @@ section of the docs. ``` -## Next Steps +## Next steps * Additional questions? See the FAQ section in the [Custom Gas Token Explainer](/stack/protocol/features/custom-gas-token#faqs). * For more detailed info on custom gas tokens, see the [specs](https://specs.optimism.io/experimental/custom-gas-token.html). diff --git a/pages/builders/chain-operators/features/preinstalls.mdx b/pages/builders/chain-operators/features/preinstalls.mdx index 1b571d9aa..7c21d6596 100644 --- a/pages/builders/chain-operators/features/preinstalls.mdx +++ b/pages/builders/chain-operators/features/preinstalls.mdx @@ -6,7 +6,7 @@ description: Learn how to use preinstalls on your chain. import { Callout, Steps } from 'nextra/components' -# OP Stack Preinstalls +# OP Stack preinstalls This guide explains OP Stack preinstalls and what it brings to developers. To go to production on a new chain, developers need their core contracts: Gnosis Safes, the 4337 entrypoint, create2deployer, etc. On a blank EVM, these contracts can take weeks to be deployed. Now, core contracts come *preinstalled* on the OP Stack -- no third party deployment necessary. @@ -19,7 +19,7 @@ With these contracts preinstalled at set addresses, developers can also expect a Preinstalls are automatically enabled for all new OP chains after Ecotone. -## Contracts and Deployed Addresses +## Contracts and deployed addresses This table lists the specific contracts to be pre/deployed for new OP Chains. @@ -36,6 +36,6 @@ This table lists the specific contracts to be pre/deployed for new OP Chains. | [`permit2`](https://github.com/Uniswap/permit2) | `0x000000000022D473030F116dDEE9F6B43aC78BA3` | | [ERC-4337 Entrypoint `v0.6.0`](https://github.com/eth-infinitism/account-abstraction/tree/v0.6.0) | `0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789`
`SenderCreator` dependency @ `0x7fc98430eaedbb6070b35b39d798725049088348` on ETH mainnet | -## Resources and Next Steps +## Resources and next steps * Still Have Questions? You can reach us in our [developer support forum](https://github.com/ethereum-optimism/developers/discussions). diff --git a/pages/builders/chain-operators/features/span-batches.mdx b/pages/builders/chain-operators/features/span-batches.mdx index ccddabd3c..250257df5 100644 --- a/pages/builders/chain-operators/features/span-batches.mdx +++ b/pages/builders/chain-operators/features/span-batches.mdx @@ -6,7 +6,7 @@ description: Learn how to use and enable span batches on your chain. import { Callout, Steps } from 'nextra/components' -# Span Batches +# Span batches Span batches are an important feature that optimizes batch processing within the chain. This section provides an overview of span batches, instructions on how to enable them, and links to detailed design documents. @@ -14,7 +14,7 @@ Span batches are an important feature that optimizes batch processing within the Span batches allow for efficient processing of multiple batches in a single operation, reducing overhead and improving performance. By grouping transactions together, span batches can help optimize the throughput of the network. -## Enabling Span Batches +## Enabling span batches To enable span batches, follow these steps: @@ -41,7 +41,7 @@ To enable span batches, follow these steps: * You should see log entries indicating that batches are being processed according to the configured settings. -## Links to Related Pages +## Links to related pages For more detailed information on the design and implementation of span batches, refer to the following resources: diff --git a/pages/builders/chain-operators/hacks/data-availability.mdx b/pages/builders/chain-operators/hacks/data-availability.mdx index 4f33176a5..32218c494 100644 --- a/pages/builders/chain-operators/hacks/data-availability.mdx +++ b/pages/builders/chain-operators/hacks/data-availability.mdx @@ -1,12 +1,12 @@ --- -title: Data Availability Hacks +title: Data availability hacks lang: en-US description: Learn how to modify the default Data Availability Layer module for an OP Stack chain. --- import { Callout } from 'nextra/components' -# Data Availability Hacks +# Data availability hacks OP Stack Hacks are explicitly things that you can do with the OP Stack that are *not* currently intended for production use. diff --git a/pages/builders/chain-operators/hacks/derivation.mdx b/pages/builders/chain-operators/hacks/derivation.mdx index d8ab14d4c..47651c308 100644 --- a/pages/builders/chain-operators/hacks/derivation.mdx +++ b/pages/builders/chain-operators/hacks/derivation.mdx @@ -1,12 +1,12 @@ --- -title: Derivation Hacks +title: Derivation hacks lang: en-US description: Learn how to modify the default Derivation layer module for an OP Stack chain. --- import { Callout } from 'nextra/components' -# Derivation Hacks +# Derivation hacks OP Stack Hacks are explicitly things that you can do with the OP Stack that are *not* currently intended for production use. @@ -28,11 +28,11 @@ Modifying the Derivation layer can have unintended consequences. For example, re ## Modding -### EVM Event-Triggered Transactions +### EVM event-triggered transactions -The default Rollup configuration of the OP Stack includes "deposited"transactions that are triggered whenever a specific event is emitted by the `OptimismPortal` contract on L1. Using the same principle, an OP Stack chain can derive transactions from events emitted by *any* contract on an EVM-based DA. Refer to [attributes.go](https://github.com/ethereum-optimism/optimism/blob/e468b66efedc5f47f4e04dc1acc803d4db2ce383/op-node/rollup/derive/attributes.go#L70) to understand how deposited transactions are derived and how custom transactions can be created. +The default Rollup configuration of the OP Stack includes "deposited" transactions that are triggered whenever a specific event is emitted by the `OptimismPortal` contract on L1. Using the same principle, an OP Stack chain can derive transactions from events emitted by *any* contract on an EVM-based DA. Refer to [attributes.go](https://github.com/ethereum-optimism/optimism/blob/e468b66efedc5f47f4e04dc1acc803d4db2ce383/op-node/rollup/derive/attributes.go#L70) to understand how deposited transactions are derived and how custom transactions can be created. -### EVM Block-Triggered Transactions +### EVM block-triggered transactions Like with events, transactions on an OP Stack chain can be triggered whenever a new block is published on an EVM-based DA. The default Rollup configuration of the OP Stack already includes a block-triggered transaction in the form of [the "L1 info"transaction](https://github.com/ethereum-optimism/optimism/blob/e468b66efedc5f47f4e04dc1acc803d4db2ce383/op-node/rollup/derive/attributes.go#L103) that relays information like the latest block hash, timestamp, and base fee into L2. The Getting Started guide demonstrates the addition of a new block-triggered transaction in the form of a new transaction that reports the amount of gas burned via the base fee on L1. diff --git a/pages/builders/chain-operators/hacks/execution.mdx b/pages/builders/chain-operators/hacks/execution.mdx index 1a8f9c338..495ceb8a1 100644 --- a/pages/builders/chain-operators/hacks/execution.mdx +++ b/pages/builders/chain-operators/hacks/execution.mdx @@ -1,12 +1,12 @@ --- -title: Execution Hacks +title: Execution hacks lang: en-US description: Learn how to modify the default Execution Layer module for an OP Stack chain. --- import { Callout } from 'nextra/components' -# Execution Hacks +# Execution hacks OP Stack Hacks are explicitly things that you can do with the OP Stack that are *not* currently intended for production use. @@ -28,7 +28,7 @@ As with modifications to the Derivation Layer, modifications to the Execution La ## Modding -### EVM Tweaks +### EVM tweaks The default Execution Layer module is the EVM. It's possible to modify the EVM in many different ways like adding new precompiles or inserting predeployed smart contracts into the genesis state. Precompiles can help make common smart contract operations cheaper and can therefore further reduce the cost of execution for your specific use-case. These modifications should be made directly to [the execution client](https://github.com/ethereum-optimism/op-geth). diff --git a/pages/builders/chain-operators/hacks/featured-hacks.mdx b/pages/builders/chain-operators/hacks/featured-hacks.mdx index 81e4e0645..f844e08eb 100644 --- a/pages/builders/chain-operators/hacks/featured-hacks.mdx +++ b/pages/builders/chain-operators/hacks/featured-hacks.mdx @@ -1,12 +1,12 @@ --- -title: Featured Hacks +title: Featured hacks lang: en-US description: Learn about some of the customizations stack developers have made for an OP Stack chain. --- import { Callout } from 'nextra/components' -# Featured Hacks +# Featured hacks OP Stack Hacks are explicitly things that you can do with the OP Stack that are *not* currently intended for production use. @@ -28,7 +28,7 @@ Featured Hacks is a compilation of some of the cool stuff people are building on OPCraft was an OP Stack chain that ran a modified EVM as the backend for a fully onchain 3D voxel game built with [MUD](https://mud.dev/). -### OP Stack Configuration +### OP Stack configuration * Data Availability: Ethereum DA (Goerli) * Sequencer: Single Sequencer @@ -52,7 +52,7 @@ OPCraft was an OP Stack chain that ran a modified EVM as the backend for a fully Ticking Optimism is a proof-of-concept implementation of an OP Stack chain that calls a `tick` function every block. By using the OP Stack, Ticking Optimism avoids the need for off-chain infrastructure to execute a function on a regular basis. Ticking Conway is a system that uses Ticking Optimism to build [Conway's Game of Life](https://conwaylife.com/) onchain. -### OP Stack Configuration +### OP Stack configuration * Data Availability: Ethereum DA (any) * Sequencer: Single Sequencer diff --git a/pages/builders/chain-operators/hacks/overview.mdx b/pages/builders/chain-operators/hacks/overview.mdx index 8a8221f8c..cf7a56dd6 100644 --- a/pages/builders/chain-operators/hacks/overview.mdx +++ b/pages/builders/chain-operators/hacks/overview.mdx @@ -1,12 +1,12 @@ --- -title: Introduction to OP Stack Hacks +title: Introduction to OP Stack hacks lang: en-US description: Learn general information on how to experiment and customize an OP Stack chain. --- import { Callout } from 'nextra/components' -# Introduction to OP Stack Hacks +# Introduction to OP Stack hacks Welcome to OP Stack Hacks, the **highly experimental** region of the OP Stack docs. OP Stack Hacks are an unofficial guide for messing around with the OP Stack. Here you'll find information about ways that the OP Stack can be modified in interesting ways. @@ -18,7 +18,7 @@ OP Stack Hacks create blockchains that aren't exactly OP Stack, and may be insec OP Stack Hacks are not for the faint of heart. You will not be able to receive significant developer support for OP Stack Hacks — be prepared to get your hands dirty and to work without support. -## OP Stack Hack Guides +## OP Stack hack guides We have curated a list of guides to walk you through different OP stack modules that you can customize as a developer. @@ -28,7 +28,7 @@ We have curated a list of guides to walk you through different OP stack modules * [Settlement Hacks](settlement) * [Featured Hacks](featured-hacks) -## OP Stack Hack Tutorials +## OP Stack hack tutorials We also have a handful of tutorials offering step-by-step instructions on how to make customizations to an OP Stack chain. **As a reminder, you will not be able to receive significant developer support for OP Stack Hacks — be prepared to get your hands dirty and to work without support.** diff --git a/pages/builders/chain-operators/hacks/settlement.mdx b/pages/builders/chain-operators/hacks/settlement.mdx index 87baf9d44..f86fe1d06 100644 --- a/pages/builders/chain-operators/hacks/settlement.mdx +++ b/pages/builders/chain-operators/hacks/settlement.mdx @@ -1,12 +1,12 @@ --- -title: Settlement Hacks +title: Settlement hacks lang: en-US description: Learn how to modify the default Settlement Layer module for an OP Stack chain. --- import { Callout } from 'nextra/components' -# Settlement Hacks +# Settlement hacks OP Stack Hacks are explicitly things that you can do with the OP Stack that are *not* currently intended for production use. diff --git a/pages/builders/chain-operators/management/best-practices.mdx b/pages/builders/chain-operators/management/best-practices.mdx index 33184b384..9f268e0ad 100644 --- a/pages/builders/chain-operators/management/best-practices.mdx +++ b/pages/builders/chain-operators/management/best-practices.mdx @@ -1,19 +1,19 @@ --- -title: Chain Operator Best Practices +title: Chain operator best practices lang: en-US description: Learn some best practices for managing the OP Stack's off-chain components. --- import { Callout } from 'nextra/components' -# Chain Operator Best Practices +# Chain operator best practices The following information has some best practices around running the OP Stack's off-chain components. -## Best Practices +## Best practices -### Correct Release Versions +### Correct release versions Chain and node operators should always run the latest production releases of the OP Stack's off chain components. Our latest releases, notes, and changelogs @@ -35,7 +35,7 @@ and `op-geth` releases can be found [here](https://github.com/ethereum-optimism/ version. Since we cannot left-pad with zeroes, the geth major version is not padded. -### Keep Deployment Artifacts +### Keep deployment artifacts After deploying your contracts on Ethereum, you should keep a record of all the deployment artifacts: @@ -49,20 +49,20 @@ created in [packages/contracts-bedrock/deployments](https://github.com/ethereum- deployment * The genesis file that you generated after the contract deployment -### Incremental Upgrade Rollouts +### Incremental upgrade rollouts When upgrading your nodes, take a staggered approach. This means deploying the upgrade gradually across your infrastructure and ensuring things work as expected before making changes to every node. -### Isolate Your Sequencer +### Isolate your sequencer You can isolate your sequencer node, by not connecting it directly to the internet. Instead, you could handle your ingress traffic behind a proxy. Have the proxy forward traffic to replicas and have them gossip the transactions internally. -### Improve Reliability of Peer-to-Peer transactions +### Improve reliability of peer-to-peer transactions These flags can improve the reliability of peer-to-peer transactions from internal replica nodes and the sequencer node. diff --git a/pages/builders/chain-operators/management/blobs.mdx b/pages/builders/chain-operators/management/blobs.mdx index 398d7c08d..605e1b296 100644 --- a/pages/builders/chain-operators/management/blobs.mdx +++ b/pages/builders/chain-operators/management/blobs.mdx @@ -1,5 +1,5 @@ --- -title: Using Blobs +title: Using blobs lang: en-US description: Learn how to switch to using blobs for your chain. --- @@ -15,10 +15,10 @@ This guide walks you through how to switch to using blobs for your chain after E This guide is intended for chains already upgraded to Ecotone. -## Switch to Using Blobs +## Switch to using blobs - ### Determine Scalar Values for Using Blobs + ### Determine scalar values for using blobs The first step to switching to submit data with Blobs is to calculate the scalar values you wish to set for the formula to charge users fees. @@ -27,7 +27,7 @@ This guide walks you through how to switch to using blobs for your chain after E information is tuned to a network like OP Mainnet. For more details on fee scalar, see [Transaction Fees, Ecotone section](/stack/transactions/fees#ecotone). - #### Adjust Fees to Change Margins + #### Adjust fees to change margins As a chain operator, you may want to scale your scalar values up or down either because the throughput of your chain has changed and you are either filling significantly more or less of blobs, or because you wish to simply increase your margin to cover operational expenses. So, to increase or decrease your margin on L1 data costs, you would simply scale both the `l1baseFeeScalar` and the `l1blobBaseFeeScalar` by the same multiple. @@ -39,7 +39,7 @@ This guide walks you through how to switch to using blobs for your chain after E newBlobBaseFeeScalar = prevBlobBaseFeeScalar * 1.1 ``` - ### Update Your Scalar Values for Blobs + ### Update your scalar values for blobs Once you have determined your ideal `BaseFeeScalar` and `BlobBaseFeeScalar`, you will need to apply those values for your chain. The first step is to encode both values into a single value to be set in your L1 Config: @@ -74,7 +74,7 @@ This guide walks you through how to switch to using blobs for your chain after E - ### Update Your Batcher to Post Blobs + ### Update your batcher to post blobs Now that the fee config has been updated, you should immediately configure your batcher! @@ -89,7 +89,7 @@ This guide walks you through how to switch to using blobs for your chain after E * Optionally, you can configure your batcher to support multi-blobs. See [Multi-Blob Batcher Configuration](/builders/chain-operators/configuration/batcher#configure-your-multi-blob-batcher) for more details. -## Switch Back to Using Calldata +## Switch back to using calldata As a chain operator, if the `blobBaseFee` is expensive enough and your chain is not processing enough transactions to meaningfully fill blobs within your @@ -98,7 +98,7 @@ back to posting data to calldata. Utilize the [fee parameter calculator](https:/ blobs back to using calldata. - ### Determine Your Scalar Values for Using Calldata + ### Determine your scalar values for using calldata If you are using calldata, then you can set your `BaseFeeScalar` similarly to how you would have set "scalar" prior to Ecotone, though with a 5-10% bump to @@ -115,11 +115,11 @@ blobs back to using calldata. BlobBaseFeeScalar = 0 ``` - ### Update Your Scalar Values for Using Calldata + ### Update your scalar values for using calldata To set your scalar values, follow the same process as laid out in [Update your Scalar values for Blobs](#update-your-scalar-values-for-blobs). - ### Update Your Batcher to Post Calldata + ### Update your batcher to post calldata Now that the fee config has been updated, you will want to immediately configure your batcher. @@ -131,7 +131,7 @@ blobs back to using calldata. * Ensure your `OP_BATCHER_MAX_CHANNEL_DURATION` is properly set to maximize savings. **NOTE:** While setting a high value here will lower costs, it will be less meaningful than for low throughput chains using blobs. See [OP Batcher Max Channel Configuration](/builders/chain-operators/configuration/batcher#set-your--op_batcher_max_channel_duration) for more details. -## Other Considerations +## Other considerations * For information on L1 Data Fee changes related to the Ecotone upgrade, visit the [Transaction Fees page](/stack/transactions/fees#ecotone). * If you want to enable archive nodes, you will need to access a blob archiver service. You can use [Optimism's](/builders/node-operators/management/snapshots#op-mainnet-archive-node) or [run your own](/builders/chain-operators/tools/explorer#create-an-archive-node). diff --git a/pages/builders/chain-operators/management/key-management.mdx b/pages/builders/chain-operators/management/key-management.mdx index 3fc1d38e8..be6592825 100644 --- a/pages/builders/chain-operators/management/key-management.mdx +++ b/pages/builders/chain-operators/management/key-management.mdx @@ -1,19 +1,19 @@ --- -title: Key Management +title: Key management lang: en-US description: A guide for chain operators on managing private keys on their chain, covering hot and cold wallets, and the use of a HSM. --- import { Callout } from 'nextra/components' -# Managing Your Keys +# Managing your keys This guide informs chain operators on important key management considerations. There are certain [privileged roles](/chain/security/privileged-roles) that need careful consideration. The privileged roles are categorized as hot wallets or cold wallets. -## Hot Wallets +## Hot wallets The addresses for the `Batcher` and the `Proposer` need to have their private keys online somewhere for a component of the system to work. If these addresses @@ -31,7 +31,7 @@ RPC method. if you're interested in whats happening under the hood. -## Cold Wallets +## Cold wallets The addresses for the cold wallets cannot be used without human intervention. These can be set up as multisig contracts, so they can be controlled by groups diff --git a/pages/builders/chain-operators/management/operations.mdx b/pages/builders/chain-operators/management/operations.mdx index 0cbc68941..b85102f96 100644 --- a/pages/builders/chain-operators/management/operations.mdx +++ b/pages/builders/chain-operators/management/operations.mdx @@ -1,15 +1,15 @@ --- -title: Rollup Operations +title: Rollup operations lang: en-US description: Learn basics of rollup operations, such as how to start and stop your rollup, get your rollup config, and how to add nodes. --- import { Callout, Steps } from 'nextra/components' -# Rollup Operations +# Rollup operations This guide reviews the basics of rollup operations, such as how to start your rollup, stop your rollup, get your rollup config, and add nodes. -## Stopping Your Rollup +## Stopping your rollup An orderly shutdown is done in the reverse order to the order in which components were started: @@ -30,7 +30,7 @@ An orderly shutdown is done in the reverse order to the order in which component Make sure you use **CTRL-C** to avoid database corruption. If Geth stops unexpectedly the database can be corrupted. This is known as an "[unclean shutdown](https://geth.ethereum.org/docs/fundamentals/databases#unclean-shutdowns)" and it can lead to a variety of problems for the node when it is restarted. -## Starting Your Rollup +## Starting your rollup To restart the blockchain, use the same order of components you did when you initialized it. @@ -60,7 +60,7 @@ Just wait until it is. -## Getting Your Rollup Config +## Getting your rollup config Use this tool to get your rollup config from `op-node`. This will only work if your chain is **already** in the [superchain-registry](https://github.com/ethereum-optimism/superchain-registry/blob/main/chainList.json) and `op-node` has been updated to pull those changes in from the registry. @@ -113,13 +113,13 @@ You'll need to run this tool: "use_plasma": false } ``` -### Check the Flags +### Check the flags Ensure that you are using the appropriate flag. The `--network=sepolia` flag allows the tool to pick up the appropriate data from the registry, and uses the OPChains mapping under the hood. -## Adding Nodes +## Adding nodes To add nodes to the rollup, you need to initialize `op-node` and `op-geth`, similar to what you did for the first node. You should *not* add an `op-batcher` because there should be only one. @@ -162,7 +162,7 @@ If you do it this way, you won't have to wait until the transactions are written ### Start `op-node` (using the same command line you used on the initial node) -## Next Steps +## Next steps * See the [Node Configuration](/builders/node-operators/configuration/base-config) guide for additional explanation or customization. * If you experience difficulty at any stage of this process, please reach out to [developer support](https://github.com/ethereum-optimism/developers/discussions). diff --git a/pages/builders/chain-operators/management/snap-sync.mdx b/pages/builders/chain-operators/management/snap-sync.mdx index 07baefa52..97e372754 100644 --- a/pages/builders/chain-operators/management/snap-sync.mdx +++ b/pages/builders/chain-operators/management/snap-sync.mdx @@ -1,23 +1,23 @@ --- -title: Using Snap Sync for Chain Operators +title: Using snap sync for chain operators lang: en-US description: Learn how to use and enable snap sync on your OP chain. --- import { Callout, Steps } from 'nextra/components' -# Using Snap Sync for Chain Operators +# Using snap sync for chain operators -This guide reviews the optional feature of Snap Sync for OP chains, including benefits and how to enable the feature. +This guide reviews the optional feature of snap sync for OP chains, including benefits and how to enable the feature. -Snap Sync significantly improves the experience of syncing an OP Stack node. Snap Sync is a native feature of go-ethereum that is now optionally enabled on `op-node` & `op-geth`. -Snap Sync works by downloading a snapshot of the state from other nodes on the network and is then able to start executing blocks from the completed state rather than having to re-execute every single block. -This means that performing a Snap Sync is significantly faster than performing a full sync. +Snap sync significantly improves the experience of syncing an OP Stack node. Snap sync is a native feature of go-ethereum that is now optionally enabled on `op-node` & `op-geth`. +Snap sync works by downloading a snapshot of the state from other nodes on the network and is then able to start executing blocks from the completed state rather than having to re-execute every single block. +This means that performing a snap sync is significantly faster than performing a full sync. * Snap sync enables node operators on your network to sync faster. * Snap sync removes the need for nodes on your post Ecotone network to run a [blob archiver](/builders/node-operators/management/blobs). -## Enable Snap Sync for Chains +## Enable snap sync for chains To enable snap sync, chain operators need to spin up a node which is exposed to the network and has transaction gossip disabled. @@ -29,17 +29,17 @@ For snap sync, all `op-geth` nodes should expose port `30303` TCP and `30303` UD - ### Setup a Snap Sync Node + ### Setup a snap sync node * Expose port `30303` (`op-geth`'s default discovery port) to the internet on TCP and UDP. * Disable transaction gossip with the [`--rollup.disabletxpoolgossip`](/builders/node-operators/configuration/execution-config#rollupdisabletxpoolgossip) flag - ### Enable Snap Sync on Your Network + ### Enable snap sync on your network - * Follow the [Node Operator Snap Sync Guide](/builders/node-operators/management/snap-sync#enable-snap-sync-for-your-node) to enable snap sync for your chain network. + * Follow the [Node operator snap sync guide](/builders/node-operators/management/snap-sync#enable-snap-sync-for-your-node) to enable snap sync for your chain network. ## Next Steps -* See the [Node Configuration](/builders/node-operators/configuration/base-config#configuration) guide for additional explanation or customization. +* See the [Node configuration](/builders/node-operators/configuration/base-config#configuration) guide for additional explanation or customization. * If you experience difficulty at any stage of this process, please reach out to [developer support](https://github.com/ethereum-optimism/developers/discussions). diff --git a/pages/builders/chain-operators/management/troubleshooting.mdx b/pages/builders/chain-operators/management/troubleshooting.mdx index f24f8561d..e8a00a10d 100644 --- a/pages/builders/chain-operators/management/troubleshooting.mdx +++ b/pages/builders/chain-operators/management/troubleshooting.mdx @@ -1,14 +1,14 @@ --- -title: Troubleshooting Chain Operations +title: Troubleshooting chain operations lang: en-US description: Learn solutions to common problems when troubleshooting chain operations. --- -# Troubleshooting: Chain Operations +# Troubleshooting: chain operations This page lists common troubleshooting scenarios and solutions for chain operators. -## EvmError in Contract Deployment +## EvmError in contract deployment L1 smart contract deployment fails with the following error: @@ -31,7 +31,7 @@ You can generate a random salt value using the following command: export IMPL_SALT=$(openssl rand -hex 32) ``` -## Failed to Find the L2 Heads to Start From +## Failed to find the L2 Heads to start from `op-node` fails to execute the derviation process with the following error: @@ -54,7 +54,7 @@ If you are not following the tutorial, make sure to take the following steps: 4. Reinitialize `op-geth` with the `genesis.json` file. 5. Restart `op-geth` and `op-node`. -## Batcher Unable to Publish Transaction +## Batcher unable to publish transaction `op-batcher` fails to publish transactions with the following error: diff --git a/pages/builders/chain-operators/self-hosted.mdx b/pages/builders/chain-operators/self-hosted.mdx index 200eb7f4b..a94ee4080 100644 --- a/pages/builders/chain-operators/self-hosted.mdx +++ b/pages/builders/chain-operators/self-hosted.mdx @@ -1,16 +1,16 @@ --- -title: How to Start a Self-Hosted Chain +title: How to start a self-hosted chain lang: en-US description: Learn how to start a self-hosted OP Chain with standard configuration. --- import { Callout, Steps } from 'nextra/components' -# How to Start a Self-Hosted Chain +# How to start a self-hosted chain This guide provides an overview of how to start a self-hosted OP Chain with standard configuration. It walks you through how to build, configure, test, and launch your OP Chain. To skip ahead to custom features or settings, you can explore the [chain operator tutorials](#chain-operator-tutorials). -## Build Your Chain +## Build your chain There are two main steps to get started building your own self-hosted OP Chain: learn fundamental components of OP chains and spin up an OP Stack testnet chain. @@ -38,7 +38,7 @@ There are two main steps to get started building your own self-hosted OP Chain: * Just follow the [Creating Your Own L2 Rollup Testnet](/builders/chain-operators/tutorials/create-l2-rollup) tutorial to get started. -## Configure Your Chain +## Configure your chain OP Chains can be configured for throughput, cost, and other decentralization tradeoffs. The following steps are intended for standard configuration of OP Chains. @@ -63,7 +63,7 @@ OP Chains can be configured for throughput, cost, and other decentralization tra * Enable [analytics tracking for your OP Chain](/builders/node-operators/management/metrics), to immediately generate onchain metrics after mainnet launch. -## Test Your Chain +## Test your chain Before launching on Mainnet, thoroughly test and debug OP Chain contracts, features, and security. Here are your options. @@ -84,11 +84,11 @@ Before launching on Mainnet, thoroughly test and debug OP Chain contracts, featu * Run [basic transaction tests](https://metamask.io/) using Metamask. -## Launch Your Chain on Mainnet +## Launch your chain on Mainnet After testing is complete, you are ready to launch your OP Chain on Mainnet. Optionally, you can also request [launch support](https://share.hsforms.com/1yENj8CV9TzGYBASD0JC8_gqoshb) and subscribe to [receive chain upgrade notifications](https://github.com/ethereum-optimism/developers/discussions/categories/announcements). -## Chain Operator Tutorials +## Chain operator tutorials Here's a curated collection of chain operator tutorials put together by the Optimism community. They'll help you get a head start deploying your first OP Stack chain. @@ -105,7 +105,7 @@ They'll help you get a head start deploying your first OP Stack chain. You can also [suggest a new tutorial](https://github.com/ethereum-optimism/docs/issues/new?assignees=\&labels=tutorial%2Cdocumentation%2Ccommunity-request\&projects=\&template=suggest_tutorial.yaml\&title=%5BTUTORIAL%5D+Add+PR+title) if you have something specific in mind. We'd love to grow this list! -## Next Steps +## Next steps * After deploying your chain, check the [Rollup Operations](./management/operations) guide for common operations you'll need to run with your rollup. * If you run into any problems, please visit the [Chain Troubleshooting Guide](./management/troubleshooting) for help. diff --git a/pages/builders/chain-operators/tools/chain-monitoring.mdx b/pages/builders/chain-operators/tools/chain-monitoring.mdx index c97183443..d7c97ef60 100644 --- a/pages/builders/chain-operators/tools/chain-monitoring.mdx +++ b/pages/builders/chain-operators/tools/chain-monitoring.mdx @@ -1,17 +1,17 @@ --- -title: Chain Monitoring Options +title: Chain monitoring options lang: en-US description: Learn about onchain and offchain monitoring options for your OP Stack chain. --- import { Callout } from 'nextra/components' -# Chain Monitoring Options +# Chain monitoring options This explainer covers the basics of onchain and offchain monitoring options for your OP Stack chain. Onchain monitoring services allow chain operators to monitor the overall system and onchain events. Offchain monitoring lets chain operators to monitor the operation and behavior of nodes and other offchain components. -## Onchain Monitoring Services +## Onchain monitoring services Onchain monitoring services provide insights into the overall system, helping chain operators track and monitor on-chain events. Some examples of onchain monitoring services include `monitorism` and `dispute-mon`. @@ -73,7 +73,7 @@ You can find more info on `op-dispute-mon` on [the repo](https://github.com/ethe Chain operators can easily create their grafana dashboard for Dispute Monitor using the following json file: [Download the Dispute Monitor JSON](/grafana/dispute-monitor-1718214549035.json). -## Offchain Component Monitoring +## Offchain component monitoring Offchain monitoring allows chain operators to monitor the operation and behavior of nodes and other offchain components. Some of the more common components that you'll likely want to monitor include `op-node`, `op-geth`, `op-proposer`, `op-batcher`, and `op-challenger`. The general steps for enabling offchain monitoring is pretty consistent for all the OP components: @@ -123,6 +123,6 @@ To enable metrics, pass the `--metrics.enabled` flag to `op-challenger` and foll Metrics listening port ``` -## Next Steps +## Next steps * If you encounter difficulties at any stage of this process, please reach out to [developer support](https://github.com/ethereum-optimism/developers/discussions). diff --git a/pages/builders/chain-operators/tools/explorer.mdx b/pages/builders/chain-operators/tools/explorer.mdx index fe42693ac..3046fe498 100644 --- a/pages/builders/chain-operators/tools/explorer.mdx +++ b/pages/builders/chain-operators/tools/explorer.mdx @@ -1,12 +1,12 @@ --- -title: Block Explorer +title: Block explorer lang: en-US description: Learn how to deploy a Blockscout block explorer for your OP Stack chain. --- import { Callout } from 'nextra/components' -# Deploying a Block Explorer +# Deploying a block explorer [Blockscout](https://www.blockscout.com/) is an open source block explorer that supports OP Stack chains. Keep reading for a quick overview on how to deploy Blockscout for your OP Stack chain. @@ -19,7 +19,7 @@ Keep reading for a quick overview on how to deploy Blockscout for your OP Stack * [Docker](https://docs.docker.com/get-docker/) -## Create an Archive Node +## Create an archive node Blockscout needs access to an [archive node](https://www.alchemy.com/overviews/archive-nodes#archive-nodes) for your OP Stack chain to properly index transactions, blocks, and internal interactions. If using `op-geth`, you can run a node in archive mode with the `--gcmode=archive` flag. diff --git a/pages/builders/chain-operators/tools/op-challenger.mdx b/pages/builders/chain-operators/tools/op-challenger.mdx index 760af2647..4bb43b7ee 100644 --- a/pages/builders/chain-operators/tools/op-challenger.mdx +++ b/pages/builders/chain-operators/tools/op-challenger.mdx @@ -1,17 +1,17 @@ --- -title: How to Configure Challenger For Your Chain +title: How to configure challenger for your chain lang: en-US description: Learn how to configure challenger for your OP Stack chain. --- import { Callout, Steps } from 'nextra/components' -# How to Configure Challenger For Your Chain +# How to configure challenger for your chain This guide provides a walkthrough of setting up the configuration and monitoring options for `op-challenger`. See the [OP-Challenger Explainer](/stack/protocol/fault-proofs/challenger) for a general overview of this fault proofs feature. - ### Build the Executable + ### Build the executable * Clone the monorepo @@ -38,7 +38,7 @@ This guide provides a walkthrough of setting up the configuration and monitoring make op-challenger ``` - ### Configure Challenger + ### Configure challenger * Configure challenger with the required flags. Tip: Use the `op-challenger --help` to view all subcommands, command line, and environment variable options. * The example config file below shows the flags to configure in this step: @@ -172,7 +172,7 @@ This guide provides a walkthrough of setting up the configuration and monitoring Challenger will refuse to interact with any games if it doesn't have the matching prestate. - ### Execute Challenger + ### Execute challenger The final step is to execute challenger with the required flags. It will look something like this (but with required flags added): @@ -193,7 +193,7 @@ This guide provides a walkthrough of setting up the configuration and monitoring --hd-path "m/44'/60'/0'/0/8" \ ``` - ### Test and Debug Challenger (Optional) + ### Test and debug challenger (optional) This is an optional step to use `op-challenger` subcommands, which allow chain operators to interact with the fault proof system onchain for testing and debugging purposes. For example, it is possible to test and explore the system in the following ways: @@ -216,7 +216,7 @@ This guide provides a walkthrough of setting up the configuration and monitoring Chain operators can easily create their grafana dashboard for Dispute Monitor using the following json file: [Download the Dispute Monitor JSON](/resources/grafana/dispute-monitor-1718214549035.json). -## Next Steps +## Next steps * Additional questions? See the FAQ section in the [OP Challenger Explainer](/stack/protocol/fault-proofs/challenger). * For more detailed info on `op-challenger`, see the [specs](https://specs.optimism.io/fault-proof/stage-one/honest-challenger-fdg.html). diff --git a/pages/builders/chain-operators/tools/op-conductor.mdx b/pages/builders/chain-operators/tools/op-conductor.mdx index 2879e8d50..43dfaf4f1 100644 --- a/pages/builders/chain-operators/tools/op-conductor.mdx +++ b/pages/builders/chain-operators/tools/op-conductor.mdx @@ -12,7 +12,7 @@ This page will teach you what the `op-conductor` service is and how it works on a high level. It will also get you started on setting it up in your own environment. -## Enhancing Sequencer Reliability and Availability +## Enhancing sequencer reliability and availability The [op-conductor](https://github.com/ethereum-optimism/optimism/tree/develop/op-conductor) is an auxiliary service designed to enhance the reliability and availability of @@ -26,7 +26,7 @@ It is important to note that the `op-conductor` does not incorporate Byzantine fault tolerance (BFT). This means the system operates under the assumption that all participating nodes are honest and act correctly. -### Summary of Guarantees +### Summary of guarantees The design of the `op-conductor` provides the following guarantees: @@ -40,14 +40,14 @@ The design of the `op-conductor` provides the following guarantees: **On a high level, `op-conductor` serves the following functions:** -### Raft Consensus Layer Participation +### Raft consensus layer participation -* **Leader Determination:** Participates in the Raft consensus algorithm to +* **Leader determination:** Participates in the Raft consensus algorithm to determine the leader among sequencers. -* **State Management:** Stores the latest unsafe block ensuring consistency +* **State management:** Stores the latest unsafe block ensuring consistency across the system. -### RPC Request Handling +### RPC request handling * **Admin RPC:** Provides administrative RPCs for manual recovery scenarios, including, but not limited to: stopping the leadership vote and removing itself @@ -55,18 +55,18 @@ The design of the `op-conductor` provides the following guarantees: * **Health RPC:** Offers health RPCs for the `op-node` to determine whether it should allow the publishing of transactions and unsafe blocks. -### Sequencer Health Monitoring +### Sequencer health monitoring * Continuously monitors the health of the sequencer (op-node) to ensure optimal performance and reliability. -### Control Loop Management +### Control loop management * Implements a control loop to manage the status of the sequencer (op-node), including starting and stopping operations based on different scenarios and health checks. -## Conductor State Transition +## Conductor state transition The following is a state machine diagram of how the op-conductor manages the sequencers Raft consensus. @@ -216,7 +216,7 @@ This setup guide has the following assumptions: `OP_CONDUCTOR_PAUSED: true` flag and `OP_CONDUCTOR_RAFT_BOOTSTRAP` flag. -#### Blue/Green Deployment +#### Blue/green deployment In order to ensure there is no downtime when setting up conductor, you need to have a deployment script that can update sequencers without network downtime. @@ -240,7 +240,7 @@ An example of this workflow might look like: 5. Deploy the change to the original sequencer, wait for it to sync to the chain head. Execute health checks. -#### Post-Conductor Launch Deployments +#### Post-conductor launch deployments After conductor is live, a similar canary style workflow is used to ensure minimal downtime in case there is an issue with deployment: @@ -254,7 +254,7 @@ minimal downtime in case there is an issue with deployment: 1. If not, then there is likely an issue with the deployment. Roll back. 5. Upgrade the remaining sequencers, run healthchecks. -### Configuration Options +### Configuration options It is configured via its [flags / environment variables](https://github.com/ethereum-optimism/optimism/blob/develop/op-conductor/flags/flags.go) @@ -722,7 +722,7 @@ layer. -## Next Steps +## Next steps * Checkout [op-conductor-mon](https://github.com/ethereum-optimism/infra): which monitors multiple op-conductor instances and provides a unified interface diff --git a/pages/builders/chain-operators/tools/op-deployer.mdx b/pages/builders/chain-operators/tools/op-deployer.mdx index 4d8edb21b..723a57b54 100644 --- a/pages/builders/chain-operators/tools/op-deployer.mdx +++ b/pages/builders/chain-operators/tools/op-deployer.mdx @@ -19,7 +19,7 @@ and make whatever changes are necessary for them to match. toolchain installed, you can install `op-deployer` by following these steps: - ### **Clone the Monorepo**: + ### **Clone the monorepo**: Run the following command to clone the monorepo: @@ -27,7 +27,7 @@ toolchain installed, you can install `op-deployer` by following these steps: git clone https://github.com/ethereum-optimism/optimism.git ``` - ### **Build the Binary**: + ### **Build the binary**: Run the following commands to build the binary: @@ -36,7 +36,7 @@ toolchain installed, you can install `op-deployer` by following these steps: make op-deployer ``` - ### (Optional) Move `op-deployer` Into `$PATH` + ### (Optional) move `op-deployer` into `$PATH` Run the following command to move the `op-deployer` binary into your `$PATH`. Note that the path for your system may be different: @@ -48,7 +48,7 @@ toolchain installed, you can install `op-deployer` by following these steps: ## Usage -### Configuring your Chain +### Configuring your chain To get started with `op-deployer`, you need to create an intent file that outlines your desired chain configuration. You can use the built-in `op-deployer` utility to generate this file. Just run the following command to create an example intent file for a development chain: @@ -87,7 +87,7 @@ See the code comments above for explanations of each field. By default, `op-depl with those that match our standard config. You can override these defaults by adding them to your intent file, but that won't be covered here. -### Applying your Intent +### Applying your intent Now that you've created your intent file, you can apply it to your chain: @@ -102,7 +102,7 @@ configuration will be set to the Superchain-wide defaults - i.e., your chain wil and will use the same [protocol versions](https://github.com/ethereum-optimism/specs/blob/main/specs/protocol/superchain-upgrades.md) address as other chains on the Superchain. -### Generating Genesis Files +### Generating genesis files With the contracts deployed, you can generate a genesis file for any of your L2s. Run the following command to do so: @@ -117,11 +117,11 @@ else. You can run another member of the `inspect` family, `rollup`, to get the ` ./bin/op-deployer inspect rollup --outfile rollup.json ``` -## More Information +## More information `op-deployer` uses the OP Contracts Manager (OPCM) under the hood to deploy contracts. -## Next Steps +## Next steps * For more details, check out the tool and documentation in the [op-deployer repository](https://github.com/ethereum-optimism/optimism/tree/develop/op-chain-ops/cmd/op-deployer). * For more information on OP Contracts Manager, refer to the [OPCM documentation](/stack/opcm). diff --git a/pages/builders/chain-operators/tutorials/adding-derivation-attributes.mdx b/pages/builders/chain-operators/tutorials/adding-derivation-attributes.mdx index d626282b8..cfbc718ad 100644 --- a/pages/builders/chain-operators/tutorials/adding-derivation-attributes.mdx +++ b/pages/builders/chain-operators/tutorials/adding-derivation-attributes.mdx @@ -1,12 +1,12 @@ --- -title: Adding Attributes to the Derivation Function +title: Adding attributes to the derivation function lang: en-US description: Learn how to modify the derivation function for an OP Stack chain to track the amount of ETH being burned on L1. --- import { Callout, Steps } from 'nextra/components' -# Adding Attributes to the Derivation Function +# Adding attributes to the derivation function OP Stack Hacks are explicitly things that you can do with the OP Stack that are *not* currently intended for production use. diff --git a/pages/builders/chain-operators/tutorials/adding-precompiles.mdx b/pages/builders/chain-operators/tutorials/adding-precompiles.mdx index c1f328d0b..70d8e678d 100644 --- a/pages/builders/chain-operators/tutorials/adding-precompiles.mdx +++ b/pages/builders/chain-operators/tutorials/adding-precompiles.mdx @@ -1,12 +1,12 @@ --- -title: Adding a Precompile +title: Adding a precompile lang: en-US description: Learn how to run an EVM with a new precompile for OP Stack chain operations to speed up calculations that are not currently supported. --- import { Callout, Steps } from 'nextra/components' -# Adding a Precompile +# Adding a precompile OP Stack Hacks are explicitly things that you can do with the OP Stack that are *not* currently intended for production use. diff --git a/pages/builders/chain-operators/tutorials/create-l2-rollup.mdx b/pages/builders/chain-operators/tutorials/create-l2-rollup.mdx index 80396150e..b94ee8fd5 100644 --- a/pages/builders/chain-operators/tutorials/create-l2-rollup.mdx +++ b/pages/builders/chain-operators/tutorials/create-l2-rollup.mdx @@ -1,5 +1,5 @@ --- -title: Creating Your Own L2 Rollup Testnet +title: Creating your own L2 rollup testnet lang: en-US description: This tutorial walks you through spinning up an OP Stack testnet chain. --- @@ -8,7 +8,7 @@ import { Callout, Steps } from 'nextra/components' import { WipCallout } from '@/components/WipCallout' -# Creating Your Own L2 Rollup Testnet +# Creating your own L2 rollup testnet @@ -33,7 +33,7 @@ Modifications to the OP Stack may prevent a chain from being able to benefit fro Make sure to check out the [Superchain Explainer](/stack/explainer) to learn more. -## Software Dependencies +## Software dependencies | Dependency | Version | Version Check Command | | ------------------------------------------------------------- | -------- | --------------------- | @@ -46,7 +46,7 @@ Make sure to check out the [Superchain Explainer](/stack/explainer) to learn mor | [jq](https://github.com/jqlang/jq) | `^1.6` | `jq --version` | | [direnv](https://direnv.net) | `^2` | `direnv --version` | -### Notes on Specific Dependencies +### Notes on specific dependencies #### `node` @@ -71,7 +71,7 @@ Make sure that you have correctly hooked `direnv` into your shell by modifying y If you haven't edited a config file then you probably haven't configured `direnv` properly (and things might not work later). -## Get Access to a Sepolia Node +## Get access to a sepolia node You'll be deploying a OP Stack Rollup chain that uses a Layer 1 blockchain to host and order transaction data. The OP Stack Rollups were designed to use EVM Equivalent blockchains like Ethereum, OP Mainnet, or standard Ethereum testnets as their L1 chains. @@ -84,7 +84,7 @@ If you want to use an alternative network, make sure to carefully review each co Since you're deploying your OP Stack chain to Sepolia, you'll need to have access to a Sepolia node. You can either use a node provider like [Alchemy](https://www.alchemy.com/) (easier) or run your own Sepolia node (harder). -## Build the Source Code +## Build the source code You're going to be spinning up your OP Stack chain directly from source code instead of using a container system like [Docker](https://www.docker.com/). Although this adds a few extra steps, it means you'll have an easier time modifying the behavior of the stack if you'd like to do so. @@ -96,7 +96,7 @@ You can use any directory you'd like but using the home directory will allow you If you choose to use a different directory, make sure you're using the correct directory in the commands throughout this tutorial. -### Build the Optimism Monorepo +### Build the Optimism monorepo @@ -178,7 +178,7 @@ make geth -## Fill Out Environment Variables +## Fill out environment variables You'll need to fill out a few environment variables before you can start deploying your chain. @@ -207,7 +207,7 @@ Open up the environment variable file and fill out the following variables: -## Generate Addresses +## Generate addresses You'll need four addresses and their private keys when setting up the chain: @@ -279,7 +279,7 @@ It's recommended to fund the addresses with the following amounts when using Sep -## Load Environment variables +## Load environment variables Now that you've filled out the environment variable file, you need to load those variables into your terminal. @@ -357,7 +357,7 @@ It's recommended to keep this file as-is for now so you don't run into any unexp -## Deploy the Create2 Factory (Optional) +## Deploy the Create2 factory (optional) If you're deploying an OP Stack chain to a network other than Sepolia, you may need to deploy a Create2 factory contract to the L1 chain. This factory contract is used to deploy OP Stack smart contracts in a deterministic fashion. @@ -707,13 +707,13 @@ cd ~/optimism/op-proposer -## Connect Your Wallet to Your Chain +## Connect your wallet to your chain You now have a fully functioning OP Stack Rollup with a Sequencer node running on `http://localhost:8545`. You can connect your wallet to this chain the same way you'd connect your wallet to any other EVM chain. If you need an easy way to connect to your chain, just [click here](https://chainid.link?network=opstack-getting-started). -## Get ETH On Your Chain +## Get ETH on your chain Once you've connected your wallet, you'll probably notice that you don't have any ETH to pay for gas on your chain. The easiest way to deposit Sepolia ETH into your chain is to send ETH directly to the `L1StandardBridge` contract. @@ -740,12 +740,12 @@ It may take up to 5 minutes for that ETH to appear in your wallet on L2. -## See Your Rollup in Action +## See your rollup in action You can interact with your Rollup the same way you'd interact with any other EVM chain. Send some transactions, deploy some contracts, and see what happens! -## Next Steps +## Next steps * You can [modify the blockchain in various ways](../hacks/overview). * Check out the [protocol specs](https://specs.optimism.io/) for more detail about the rollup protocol. diff --git a/pages/builders/chain-operators/tutorials/integrating-da-layer.mdx b/pages/builders/chain-operators/tutorials/integrating-da-layer.mdx index a1dbc7c99..dc2a0a936 100644 --- a/pages/builders/chain-operators/tutorials/integrating-da-layer.mdx +++ b/pages/builders/chain-operators/tutorials/integrating-da-layer.mdx @@ -1,12 +1,12 @@ --- -title: Integrating a New DA Layer with Alt-DA +title: Integrating a new DA layer with Alt-DA lang: en-US description: Learn how to add support for a new DA Layer within the OP Stack. --- import { Callout, Steps } from 'nextra/components' -# Integrating a New DA Layer with Alt-DA +# Integrating a new DA layer with Alt-DA The Alt-DA Mode feature is currently in Beta within the MIT-licensed OP Stack. Beta features are built and reviewed by Optimism Collective core contributors, and provide developers with early access to highly requested configurations. @@ -15,7 +15,7 @@ import { Callout, Steps } from 'nextra/components' [Alt-DA Mode](/stack/protocol/features/alt-da-mode) enables seamless integration of any DA Layer, regardless of their commitment type, into the OP Stack. After a DA Server is built for a DA Layer, any chain operator can launch an OP Stack chain using that DA Layer for sustainably low costs. -## Build Your DA Server +## Build your DA server Our suggestion is for every DA Layer to build and maintain their own DA Server, with support from the OP Labs team along the way. The DA Server will need to be run by every node operator, so we highly recommend making your DA Server open source and MIT licensed. @@ -33,7 +33,7 @@ Our suggestion is for every DA Layer to build and maintain their own DA Server, * Claim your [byte](https://github.com/ethereum-optimism/specs/discussions/135) - ### Implement the DA Server + ### Implement the DA server * Write a simple HTTP server which supports `get` and `put` * `put` is used by the batcher and can return the commitment to the batcher in the body. It should not return until the data is known to be submitted to your DA layer. @@ -44,6 +44,6 @@ Our suggestion is for every DA Layer to build and maintain their own DA Server, ## Run Alt-DA Follow our guide on [how to operate an Alt-DA Mode chain](/builders/chain-operators/features/alt-da-mode), except instead of using the S3 DA server, use the DA server that you built. -## Next Steps +## Next steps * For more detail on implementing the DA Server, [see the specification](https://specs.optimism.io/experimental/alt-da.html#da-server). diff --git a/pages/builders/chain-operators/tutorials/modifying-predeploys.mdx b/pages/builders/chain-operators/tutorials/modifying-predeploys.mdx index ac77fb5a4..4391673c0 100644 --- a/pages/builders/chain-operators/tutorials/modifying-predeploys.mdx +++ b/pages/builders/chain-operators/tutorials/modifying-predeploys.mdx @@ -1,12 +1,12 @@ --- -title: Modifying Predeployed Contracts +title: Modifying predeployed contracts lang: en-US description: Learn how to modify predeployed contracts for an OP Stack chain by upgrading the proxy. --- import { Callout, Steps } from 'nextra/components' -# Modifying Predeployed Contracts +# Modifying predeployed contracts OP Stack Hacks are explicitly things that you can do with the OP Stack that are *not* currently intended for production use. @@ -17,13 +17,13 @@ import { Callout, Steps } from 'nextra/components' OP Stack blockchains have a number of [predeployed contracts](https://github.com/ethereum-optimism/optimism/blob/129032f15b76b0d2a940443a39433de931a97a44/packages/contracts-bedrock/src/constants.ts) that provide important functionality. Most of those contracts are proxies that can be upgraded using the `proxyAdminOwner` which was configured when the network was initially deployed. -## Before You Begin +## Before you begin In this tutorial, you learn how to modify predeployed contracts for an OP Stack chain by upgrading the proxy. The predeploys are controlled from a predeploy called [`ProxyAdmin`](https://github.com/ethereum-optimism/optimism/blob/129032f15b76b0d2a940443a39433de931a97a44/packages/contracts-bedrock/contracts/universal/ProxyAdmin.sol), whose address is `0x4200000000000000000000000000000000000018`. The function to call is [`upgrade(address,address)`](https://github.com/ethereum-optimism/optimism/blob/129032f15b76b0d2a940443a39433de931a97a44/packages/contracts-bedrock/contracts/universal/ProxyAdmin.sol#L205-L229). The first parameter is the proxy to upgrade, and the second is the address of a new implementation. -## Modify the Legacy `L1BlockNumber` contract +## Modify the legacy `L1BlockNumber` contract For example, the legacy `L1BlockNumber` contract is at `0x420...013`. To disable this function, we'll set the implementation to `0x00...00`. diff --git a/pages/builders/chain-operators/tutorials/sdk.mdx b/pages/builders/chain-operators/tutorials/sdk.mdx index cbd660442..207c244d5 100644 --- a/pages/builders/chain-operators/tutorials/sdk.mdx +++ b/pages/builders/chain-operators/tutorials/sdk.mdx @@ -10,8 +10,6 @@ import { WipCallout } from '@/components/WipCallout' # Using the Optimism SDK - - This tutorial will walk you through the process of using the [Optimism SDK](https://sdk.optimism.io) to interact with your OP Stack chain. The Optimism SDK **natively** supports various OP Chains including OP Mainnet and Base. To check whether your OP Chain is already supported, [see the Optimism SDK docs](https://sdk.optimism.io/enums/l2chainid). @@ -27,7 +25,7 @@ Check out the tutorial on [Creating Your Own L2 Rollup Testnet](./create-l2-roll * [pnpm](https://pnpm.io/installation) * [jq](https://github.com/jqlang/jq) -## Find Contract Addresses +## Find contract addresses You will need to find the addresses for a number of smart contracts that are part of your OP Stack chain in order to use the Optimism SDK. If you followed the instructions in the [Creating Your Own L2 Rollup Testnet](./create-l2-rollup) tutorial, you can find the addresses by looking at the JSON artifacts within the directory `optimism/packages/contracts-bedrock/deployments/getting-started`. @@ -54,7 +52,7 @@ OptimismPortalProxy: 0x... Save these addresses somewhere so you can use them in the next section. -## Create a Demo Project +## Create a demo project You're going to use the Optimism SDK for this tutorial. Since the Optimism SDK is a [Node.js](https://nodejs.org/en/) library, you'll need to create a Node.js project to use it. @@ -99,7 +97,7 @@ node This will bring up a Node REPL prompt that allows you to run javascript code. -## Import Dependencies +## Import dependencies You need to import some dependencies into your Node REPL session. @@ -117,7 +115,7 @@ You need to import some dependencies into your Node REPL session. -## Set Session Variables +## Set session variables You'll need a few variables throughout this tutorial. Let's set those up now. @@ -155,7 +153,7 @@ Simply create the object: Note that you've passed in the RPC providers you created earlier, the addresses of the smart contracts you deployed, and the chain ID of your OP Stack chain. -## Next Steps +## Next steps You can now use the SDK to interact with your OP Stack chain just like you would with other chains like OP Mainnet. See existing tutorials, like the tutorial on [Bridging ETH With the Optimism SDK](/builders/app-developers/tutorials/cross-dom-bridge-eth) or [Bridging ERC-20 Tokens With the Optimism SDK](/builders/app-developers/tutorials/cross-dom-bridge-erc20), for examples of how to use the Optimism SDK. diff --git a/pages/builders/node-operators/architecture.mdx b/pages/builders/node-operators/architecture.mdx index 5ba68808a..014f7b8dc 100644 --- a/pages/builders/node-operators/architecture.mdx +++ b/pages/builders/node-operators/architecture.mdx @@ -1,25 +1,25 @@ --- -title: Node Architecture +title: Node architecture lang: en-US description: Learn about node architecture. --- -# Node Architecture +# Node architecture This page reviews node architecture for all nodes running on the Superchain network. All OP Mainnet nodes are composed of two core software services, the Rollup Node and the Execution Client. OP Mainnet also optionally supports a third component, Legacy Geth, that can serve stateful queries for blocks and transactions created before the [Bedrock Upgrade](https://web.archive.org/web/20230608050602/https://blog.oplabs.co/introducing-optimism-bedrock/). -## Node Flow Diagram +## Node flow diagram The following diagram shows how the Rollup Node, Execution Client, and Legacy Geth components work together to form a complete node running on the Superchain network. This diagram uses the `op-node` and `op-geth` implementations of the Rollup Node and Execution Client respectively, but the same architecture generally applies to other implementations as well. ![OP Mainnet node architecture diagram.](/img/guides/node-operators/node-arch.svg) -## Rollup Node +## Rollup node The Rollup Node is responsible for deriving L2 block payloads from L1 data and passing those payloads to the Execution Client. The Rollup Node can also optionally participate in a peer-to-peer network to receive blocks directly from the Sequencer before those blocks are submitted to L1. The Rollup Node is largely analogous to a [consensus client](https://ethereum.org/en/developers/docs/nodes-and-clients/#what-are-nodes-and-clients) in Ethereum. -## Execution Client +## Execution client The Execution Client is responsible for executing the block payloads it receives from the Rollup Node over JSON-RPC via the standard [Ethereum Engine API](https://github.com/ethereum/execution-apis/blob/main/src/engine/common.md#engine-api----common-definitions). The Execution Client exposes the standard JSON-RPC API that Ethereum developers are familiar with, and can be used to query blockchain data and submit transactions to the network. @@ -35,7 +35,7 @@ Legacy Geth is the software that was used to run OP Mainnet nodes prior to the B If you run an instance of Legacy Geth alongside your OP Mainnet node, your node will be able to forward requests against historical transactions to the Legacy Geth instance. Legacy Geth is **not** required and is typically only necessary if you want to maintain a complete archive node for OP Mainnet. -## Next Steps +## Next steps * To get your node up and running, start with the [run a node from docker](/builders/node-operators/tutorials/node-from-docker) or [build a node from source](/builders/node-operators/tutorials/node-from-source) tutorial. * If you've already got your node up and running, check out the [Node Metrics and Monitoring Guide](./management/metrics) to learn how to keep tabs on your node and make sure it keeps running smoothly. diff --git a/pages/builders/node-operators/configuration/base-config.mdx b/pages/builders/node-operators/configuration/base-config.mdx index 69fab08ac..610fd7fe6 100644 --- a/pages/builders/node-operators/configuration/base-config.mdx +++ b/pages/builders/node-operators/configuration/base-config.mdx @@ -1,12 +1,12 @@ --- -title: Node Base Configuration +title: Node base configuration lang: en-US description: Learn the node base configuration and recommended flags for op-node, op-geth, and legacy geth. --- import { Callout } from 'nextra/components' -# Node Base Configuration +# Node base configuration Always run `op-node` and `op-geth` in a one-to-one configuration. Don't run multiple `op-geth` instances behind one `op-node`, or vice versa. @@ -37,14 +37,14 @@ Regardless of how `op-geth` is initialized, you'll need to ensure that you have ### Initialize `op-geth` Instructions for each initialization method are below. If you're spinning up an OP Mainnet, use the [Initialization via Data Directory](#initialization-via-data-directory) path. If you're spinning up an OP Sepolia node, use the [Initialization via Network Flags](#initialization-via-network-flags) path. -#### Initialization via Network Flags +#### Initialization via network flags To initialize `op-geth` with the network flags, you simply need to set the `--op-network=` and `--network=` on `op-node`. To see the latest support networks, you can consult the `--help` output for the `op-network` option. -#### Initialization via Genesis File +#### Initialization via genesis file `op-geth` uses JSON files to encode a network's genesis information. For networks that are initialized in this way, you'll receive a URL to the genesis @@ -65,7 +65,7 @@ else fi ``` -#### Initialization via Data Directory +#### Initialization via data directory To initialize `op-geth` with a preconfigured data directory, simply download and extract the data directory to a place of your choosing. The data directory is exported as a tar file. An example command to do this is below: @@ -96,7 +96,7 @@ Then, specify the following flags: * `--authrpc.port`: Sets the port `op-geth`'s authenticated RPC should listen on. The default value is `8551`. * `--authrpc.jwtsecret`: Sets the path to a JWT secret file you generated above. -### Recommended Flags for `op-geth` Configuration +### Recommended flags for `op-geth` configuration You may also want to specify the following flags based on your configuration: @@ -106,7 +106,7 @@ You may also want to specify the following flags based on your configuration: * `--ws`, `--ws.addr`, and `--ws.port`: Enables the WebSocket API. * `--verbosity`: Configures Geth's log level. This is a number between 0 and 5, with 5 being the most verbose. Defaults to 3. -### Working Base Configuration +### Working base configuration A valid command that runs `op-geth` and enables RPC over HTTP and WebSockets looks like: @@ -147,7 +147,7 @@ from a Beacon node. accidentally expose admin controls to the public internet. -### Working Base Configuration +### Working base configuration A minimal valid configuration that runs `op-node` looks like: @@ -167,7 +167,7 @@ You can manually specify a path to a rollup config with the `--rollup.config` fl Each of the above flags can also be defined via an environment variable. Run `op-node --help` to see a list of all available flags and environment variables. -### Configuring Peer-to-Peer Networking +### Configuring peer-to-peer networking Unlike the previous system, the `op-node` participates in a peer-to-peer network. This network is used to distribute blocks that have not been submitted to L1 yet. The `op-node` will automatically discover and connect to peers using a hardcoded set of bootnodes. You can also manually specify peers to connect to via the `--p2p.static` flag. @@ -201,7 +201,7 @@ As mentioned above, don't forget to specify `--rollup.historicalrpc` on `op-geth Since Legacy Geth is read-only, it is safe to run multiple Legacy Geth nodes behind a load balancer. -### Historical Execution vs. Historical Data Routing +### Historical execution vs. historical data routing Only requests for historical execution will be routed to Legacy Geth. Everything else will be served by `op-geth` directly. @@ -216,7 +216,7 @@ The term *historical execution* refers to RPC methods that need to execute trans If you do not need these RPC methods for historical data, then you do not need to run Legacy Geth at all. -## Next Steps +## Next steps * See the [op-node configuration](/builders/node-operators/configuration/consensus-config) guide for additional configuration options for `op-node` and the Consensus-Layer. * Similarly, visit the [op-geth configuration](/builders/node-operators/configuration/execution-config) guide for additional configuration options for `op-geth` and Execution-Layer. * If you run into any problems, please reach out to our [developer support forum](https://github.com/ethereum-optimism/developers/discussions) for help. diff --git a/pages/builders/node-operators/configuration/consensus-config.mdx b/pages/builders/node-operators/configuration/consensus-config.mdx index 96b979584..8ece2b7a2 100644 --- a/pages/builders/node-operators/configuration/consensus-config.mdx +++ b/pages/builders/node-operators/configuration/consensus-config.mdx @@ -1,5 +1,5 @@ --- -title: Consensus Layer Configuration Options (op-node) +title: Consensus kayer configuration options (op-node) lang: en-US description: Learn additional configuration and command line options for op-node and the Consensus-Layer. --- @@ -7,7 +7,7 @@ description: Learn additional configuration and command line options for op-node import { Callout } from 'nextra/components' import { Tabs } from 'nextra/components' -# Consensus Layer Configuration Options (op-node) +# Consensus layer configuration options (op-node) You can configure your node using the command line options below (also called flags). @@ -17,7 +17,7 @@ import { Tabs } from 'nextra/components' This page list all configuration options for `op-node`. `op-node` implements most rollup-specific functionality as Consensus-Layer, similar to a L1 beacon-node. The following options are from the `--help` in [v1.7.5](https://github.com/ethereum-optimism/optimism/releases/tag/op-node/v1.7.5). -## Global Options +## Global options ### conductor.enabled @@ -239,7 +239,7 @@ The lowest log level that will be output. The default value is `info`. `OP_NODE_LOG_LEVEL=info` -### Node Log Levels +### Node log levels Node log levels determine the verbosity of log messages, allowing operators to filter messages based on importance and detail. The log levels for the `op-node` (used in Optimism) are as follows: diff --git a/pages/builders/node-operators/configuration/execution-config.mdx b/pages/builders/node-operators/configuration/execution-config.mdx index 59efab1db..d3d4bfc17 100644 --- a/pages/builders/node-operators/configuration/execution-config.mdx +++ b/pages/builders/node-operators/configuration/execution-config.mdx @@ -1,5 +1,5 @@ --- -title: Execution Layer Configuration Options (op-geth) +title: Execution layer configuration options (op-geth) lang: en-US description: Learn additional configuration and command line options for op-geth and the Execution-Layer. --- @@ -7,7 +7,7 @@ description: Learn additional configuration and command line options for op-geth import { Callout } from 'nextra/components' import { Tabs } from 'nextra/components' -# Execution Layer Configuration Options (op-geth) +# Execution layer configuration options (op-geth) You can configure your node using the command line options below (also called flags). @@ -19,7 +19,7 @@ The following are options from [v1.101308.0](https://github.com/ethereum-optimis Please note that the executable is still named `geth` to maintain a [minimal diff](https://op-geth.optimism.io/). -## Global Options +## Global options ### Account @@ -1783,7 +1783,7 @@ Time interval to regenerate the local transaction journal. The default value is `GETH_TXPOOL_REJOURNAL=1h0m0s` -### Virtual Machine +### Virtual machine #### vmdebug diff --git a/pages/builders/node-operators/management/blobs.mdx b/pages/builders/node-operators/management/blobs.mdx index 4f63e18db..5f738f79f 100644 --- a/pages/builders/node-operators/management/blobs.mdx +++ b/pages/builders/node-operators/management/blobs.mdx @@ -1,5 +1,5 @@ --- -title: Using Blobs +title: Using blobs lang: en-US description: Learn how to handle blobs for your node. --- @@ -7,7 +7,7 @@ description: Learn how to handle blobs for your node. import { Callout, Steps } from 'nextra/components' import { Tabs } from 'nextra/components' -# Using Blobs +# Using blobs The proposed Ecotone upgrade impacts node operators because of the new Beacon endpoint for `op-node`. Soon after the Ecotone activation, batch transactions @@ -15,7 +15,7 @@ will be sent as 4844 blobs, and blobs can only be retrieved from Beacon nodes. This means node operators will need access to a beacon node/consensus client (i.e. Lighthouse, Lodestar, Nimbus, Prysm, Teku, etc.). -## Preparing Your Node +## Preparing your node These steps are necessary for EVERY node operator: @@ -24,7 +24,7 @@ These steps are necessary for EVERY node operator: See the [Software Releases](/builders/node-operators/releases) page for the minimum release version. -### Configure the Ecotone Activation Date +### Configure the Ecotone activation date * If you are operating a node for an OP Chain that has an entry in the [`superchain-registry`](https://github.com/ethereum-optimism/superchain-registry/blob/main/chainList.json), the Ecotone activation date is part of the `op-node` and `op-geth` nodes. So, @@ -56,7 +56,7 @@ These will need to be set on `op-node` and `op-geth` for the sequencer and all o -### Prepare for Activation +### Prepare for activation * All node operators must set an L1 beacon value in your `op-node` as soon as you update to the latest release. @@ -69,7 +69,7 @@ These will need to be set on `op-node` and `op-geth` for the sequencer and all o -## Configure a Blob Archiver (Archive Nodes) +## Configure a blob archiver (archive nodes) There is a configurable `beacon-archiver` that will allow nodes to sync blob data that is older than 18 days - after blobs are 18 days old, normal beacon nodes will "prune" or remove them. If your node is already in sync with the head of the chain, you won't need to use a `beacon-archiver`. diff --git a/pages/builders/node-operators/management/metrics.mdx b/pages/builders/node-operators/management/metrics.mdx index 81a2fccc2..022f44f64 100644 --- a/pages/builders/node-operators/management/metrics.mdx +++ b/pages/builders/node-operators/management/metrics.mdx @@ -4,13 +4,13 @@ lang: en-US description: Learn about the different metrics you can use to monitor the health of your node. --- -# Node Metrics and Monitoring +# Node metrics and monitoring The Optimism `op-node` exposes a variety of metrics to help observe the health of the system and debug issues. Metrics are formatted for use with Prometheus and exposed via a metrics endpoint. The default metrics endpoint is `http://localhost:7300/metrics`. To enable metrics, pass the `--metrics.enabled` flag to the `op-node`. You can customize the metrics port and address via the `--metrics.port` and `--metrics.addr` flags, respectively. -## Important Metrics +## Important metrics To monitor the health of your node, you should monitor the following metrics: @@ -20,7 +20,7 @@ To monitor the health of your node, you should monitor the following metrics: * `engine_forkChoiceUpdatedV1`, `engine_getPayloadV1`, and `engine_newPayloadV1`: These methods are used to execute blocks on `op-geth`. If these methods are slow, it means that sync time is bottlenecked by either `op-geth` itself or your connection to it. * `eth_getBlockByHash`, `eth_getTransactionReceipt`, and `eth_getBlockByNumber`: These methods are used by the `op-node` to fetch transaction data from L1. If these methods are slow, it means that sync time is bottlenecked by your L1 RPC. -## Available Metrics +## Available metrics A complete list of available metrics is below: diff --git a/pages/builders/node-operators/management/snap-sync.mdx b/pages/builders/node-operators/management/snap-sync.mdx index dd86dac6c..68bf869c9 100644 --- a/pages/builders/node-operators/management/snap-sync.mdx +++ b/pages/builders/node-operators/management/snap-sync.mdx @@ -1,5 +1,5 @@ --- -title: Using Snap Sync for Node Operators +title: Using snap sync for node operators lang: en-US description: Learn how to use and enable snap sync on your node. --- @@ -7,7 +7,7 @@ description: Learn how to use and enable snap sync on your node. import { Callout, Steps } from 'nextra/components' import { Tabs } from 'nextra/components' -# Using Snap Sync for Node Operators +# Using snap sync for node operators This guide reviews the optional feature of Snap Sync for node operators, including benefits and how to enable the feature. @@ -19,7 +19,7 @@ This means that performing a Snap Sync is significantly faster than performing a * This also enables nodes to join the network after Ecotone activates without requiring a [blob archiver](blobs). * Archive nodes are also fully supported. -## Enable Snap Sync for Your Node +## Enable snap sync for your node For snap sync, all `op-geth` nodes should expose port `30303` TCP and `30303` UDP to easily find other op-geth nodes to sync from. @@ -81,7 +81,7 @@ Choose one of the following options to enable snap sync: -## Enabling Execution Layer Sync for Alternative Clients +## Enabling execution layer sync for alternative clients In addition to op-geth, you can enable execution-layer syncing with alternative execution clients such as `reth` and `op-erigon`. Unlike `op-geth`, `reth` and `op-erigon` are designed as archive nodes, which means they require the complete history of the chain. @@ -100,7 +100,7 @@ To enable execution layer sync for these clients, set the following flags on `op --l2.enginekind=erigon (not default) ``` -## Next Steps +## Next steps * See the [Node Configuration](/builders/node-operators/configuration/base-config#configuration) guide for additional explanation or customization. * To enable snap sync for your chain, see [Using Snap Sync for Chain Operators](/builders/chain-operators/management/snap-sync). diff --git a/pages/builders/node-operators/management/snapshots.mdx b/pages/builders/node-operators/management/snapshots.mdx index 897d404eb..96d3bd6c1 100644 --- a/pages/builders/node-operators/management/snapshots.mdx +++ b/pages/builders/node-operators/management/snapshots.mdx @@ -6,7 +6,7 @@ description: Find download links for data directories and database snapshots for import { Callout } from 'nextra/components' -# Node Snapshots +# Node snapshots This page contains download links for data directories and node snapshots that can be used to more easily run your own node. Data directories and node snapshots are not required but can significantly simplify the node operation process. @@ -15,7 +15,7 @@ Data directories and node snapshots are not required but can significantly simpl Data directories and node snapshots are **not required** for nodes using [snap sync](snap-sync) but are still required for archive nodes and in instances when you need to trace the entire chain. -## About the Bedrock Migration +## About the Bedrock migration OP Mainnet underwent a large [database migration](https://web.archive.org/web/20240110231645/https://blog.oplabs.co/reproduce-bedrock-migration/) as part of the [Bedrock Upgrade](https://web.archive.org/web/20230608050602/https://blog.oplabs.co/introducing-optimism-bedrock/) in 2023. Node operators must have a migrated OP Mainnet database to run a node. @@ -32,7 +32,7 @@ Migrated OP Mainnet databases can be generated manually or pre-migrated database Using [aria2](https://aria2.github.io/) to download snapshots can significantly speed up the download process. -### OP Mainnet (Full Node) +### OP Mainnet (full node) [Allnodes](https://www.allnodes.com) provides more recent full node snapshots for OP Mainnet and Testnet. You can find them [here](https://www.publicnode.com/snapshots#optimism). @@ -43,7 +43,7 @@ Migrated OP Mainnet databases can be generated manually or pre-migrated database | ------------- | ----- | ----------------------------------------------------------- | -------------------------------------------------------------------------------------------------- | | 2023-06-06 | 325GB | [Mirror 1](https://op.datadirs.xyz/mainnet-bedrock.tar.zst) | `ec4baf47e309a14ffbd586dc85376833de640c0f2a8d7355cb8a9e64c38bfcd1` | -### OP Mainnet (Archive Node) +### OP Mainnet (archive node) You can also download access the [Optimism Foundation datadir explorer](https://datadirs.optimism.io/) to find other snapshots. @@ -53,7 +53,7 @@ Migrated OP Mainnet databases can be generated manually or pre-migrated database | ----------------------------- | ---- | ------------------------------------------------------------------------------------------------------------------------ | ----------------------------------------------------------- | | Latest by Optimism Foundation | >4TB | [Mirror 1](https://datadirs.optimism.io/latest)
[Mirror 2 (torrent)](https://datadirs.optimism.io/latest.torrent) | [sha256sum](https://datadirs.optimism.io/latest.sha256sum/) | -### OP Mainnet (Legacy) +### OP Mainnet (legacy) | Snapshot Date | Size | Download Link | sha256sum | | ------------- | ----- | ------------------------------------------------------------------------ | -------------------------------------------------------------------------------------------------- | diff --git a/pages/builders/node-operators/network-upgrades.mdx b/pages/builders/node-operators/network-upgrades.mdx index f64069070..40f2c38f5 100644 --- a/pages/builders/node-operators/network-upgrades.mdx +++ b/pages/builders/node-operators/network-upgrades.mdx @@ -1,5 +1,5 @@ --- -title: Network Upgrades +title: Network upgrades lang: en-US description: Learn more about how network upgrades work and how to keep your nodes up to date. --- @@ -7,7 +7,7 @@ description: Learn more about how network upgrades work and how to keep your nod import Image from 'next/image' import { Steps, Callout } from 'nextra/components' -# Network Upgrade Overview +# Network upgrade overview This section has information on how to upgrade your Mainnet and Testnet nodes for new network upgrades. The network upgrade naming scheme after the Bedrock @@ -29,7 +29,7 @@ that are pending governance approval. | [Delta](https://specs.optimism.io/protocol/delta/overview.html) | [approved](https://gov.optimism.io/t/final-upgrade-proposal-3-delta-network-upgrade/7310) | Thu Feb 22 00:00:00 UTC 2024 (`1708560000`) around block `116480612` | Fri Dec 22 00:00:00 UTC 2023 (`1703203200`) around block `5700330` | | [Canyon](https://specs.optimism.io/protocol/canyon/overview.html) | [approved](https://gov.optimism.io/t/final-upgrade-proposal-2-canyon-network-upgrade/7088) | Thu Jan 11 17:00:01 UTC 2024 (`1704992401`) around block `114696812` | Tue Nov 14 17:00:00 UTC 2023 (`1699981200`) around block `4089330` | -## Summary of Changes +## Summary of changes These are the summaries of each network upgrade changes ordered by the most recent activation. These are a reflection of the [Superchain Upgrades Specifications](https://specs.optimism.io/protocol/superchain-upgrades.html) @@ -112,7 +112,7 @@ The Canyon upgrade uses a *L2 block-timestamp* activation-rule, and is specified rollup-node (`canyon_time`) and execution engine (`config.canyonTime`). Shanghai time in the execution engine should be set to the same time as the Canyon time. -## Upgrade Process +## Upgrade process Network upgrades follow this general process in which the features included in the upgrade are put into a release version cut from the `develop` branch and @@ -155,7 +155,7 @@ then the software is deployed on production networks. * `Upgrade Activated` -## More Information +## More information * To check for the latest node software, see the [Software Releases](/builders/node-operators/releases). * For more information on the governance process see the [governance documentation](https://community.optimism.io/docs/governance/). diff --git a/pages/builders/node-operators/releases.mdx b/pages/builders/node-operators/releases.mdx index f0966bf01..08a2e40d3 100644 --- a/pages/builders/node-operators/releases.mdx +++ b/pages/builders/node-operators/releases.mdx @@ -6,7 +6,7 @@ description: Off chain node software release information and how to stay up to d import { Callout } from 'nextra/components' -# Node Software Releases +# Node software releases This page gives information on the off chain node software release information. @@ -15,27 +15,27 @@ This page gives information on the off chain node software release information. and `op-geth` releases can be found [here](https://github.com/ethereum-optimism/op-geth/releases).
-## Production Releases +## Production releases Chain and node operators should always run the latest production releases of the OP Stack's off-chain components. Production releases are always tags, versioned as `/v`. For example, an `op-node` release might be versioned as `op-node/v1.7.5`. Tags of the form `v`, such as `v1.7.6`, indicate releases of all Go code only and DO NOT include smart contracts. This naming scheme is required by Golang. In the above list, these `v` releases contain all `op-*` components and exclude all `contracts-*` components. `op-geth` embeds upstream geth's version inside its own version as follows: `vMAJOR.GETH_MAJOR GETH_MINOR GETH_PATCH.PATCH`. Basically, geth's version is our minor version. For example, if geth is at `v1.12.0`, the corresponding `op-geth` version would be `v1.101200.0`. Note that we pad out to three characters for the geth minor version and two characters for the geth patch version. Since we cannot left-pad with zeroes, the geth major version is not padded. -### Docker Images +### Docker images To make it easier to find and use our Docker images, each release entry below provides links to the corresponding Docker images: * **op-node**: Docker images can be found [here](https://hub.docker.com/r/ethereumoptimism/op-node/tags). * **op-geth**: Docker images can be found [here](https://hub.docker.com/r/ethereumoptimism/op-geth/tags). -### Example Docker Image Tags +### Example Docker image tags We follow a consistent tagging convention to make it easier to find the right image. Here are some examples: * `optimism/op-node:` * `optimism/op-geth:` -## Release Entries +## Release entries | Network | op-node | op-geth | | ---------- | --------------------------------------------------------------------------- | ------------------------------------------------------------------------------------ | diff --git a/pages/builders/node-operators/rollup-node.mdx b/pages/builders/node-operators/rollup-node.mdx index dcffe980d..19c82347c 100644 --- a/pages/builders/node-operators/rollup-node.mdx +++ b/pages/builders/node-operators/rollup-node.mdx @@ -1,16 +1,16 @@ --- -title: How to Run a Node in the Superchain +title: How to run a node in the Superchain lang: en-US description: Learn how to run an OP Stack rollup node in the Superchain. --- import { Callout, Steps } from 'nextra/components' -# How to Run a Node in the Superchain +# How to run a node in the Superchain This guide provides an overview of how to run an OP Stack rollup node in the Superchain. It walks you through how to build, configure, run, and monitor your node on one of the OP Chains in the Superchain. To skip ahead to building and running a node, you can explore the [node operator tutorials](#node-operator-tutorials). -## Build Your Node +## Build your node Before building your node, you will learn fundamental aspects of OP Stack rollup nodes. @@ -34,7 +34,7 @@ Before building your node, you will learn fundamental aspects of OP Stack rollup * **Option 2:** Follow the [Building a Node from Source](/builders/node-operators/tutorials/node-from-source) tutorial, if you need to use a specific architecture or want to inspect the source code of your OP Stack rollup node. -## Configure Your Node +## Configure your node OP Stack rollup nodes can be configured for individual needs. The following steps will get you started with a working base configuration for OP Stack rollup nodes, along with recommended flags. @@ -55,7 +55,7 @@ OP Stack rollup nodes can be configured for individual needs. The following step
-## Run Your Node +## Run your node Now, you will run your node and set your node debugging log level for more granular feedback. @@ -78,7 +78,7 @@ Now, you will run your node and set your node debugging log level for more granu * Update node [log level](/builders/node-operators/configuration/consensus-config#loglevel) based on individual needs. For more details, see the guide on [Geth Logs](https://geth.ethereum.org/docs/fundamentals/logs). -## Monitor Your Node +## Monitor your node It is important to regularly monitor your node, and you can optionally configure prometheus and grafana dashboard to make this process easier for you. @@ -100,13 +100,13 @@ It is important to regularly monitor your node, and you can optionally configure -## Follow Node Updates +## Follow node updates * It's important to keep your node software up to date. Software updates can also include important bug fixes and patches that can help keep your node stable. * Refer to the [Software Releases](/builders/node-operators/releases) page for a detailed look at the latest releases of various rollup node and execution client implementations. * Notifications are also posted to the Optimism Upgrade Announcement Channels on [**Discord**](https://discord.com/channels/667044843901681675/754090866435424270) and [**Telegram**](https://t.me/+LtAJL1Mt1PYyNjBh). -## Node Operator Tutorials +## Node operator tutorials Got an idea for a new tutorial? @@ -121,7 +121,7 @@ It is important to regularly monitor your node, and you can optionally configure | [Running an OP Mainnet Node from Source](tutorials/mainnet) | Learn how to run an OP Mainnet node from source code. | 🟡 Medium | | [Running an OP Sepolia Node from Source](tutorials/testnet) | Learn how to run an OP Sepolia node from source code. | 🟡 Medium | -## Next Steps +## Next steps * If you've already got your node up and running, check out the [Node Metrics and Monitoring Guide](/builders/node-operators/management/metrics) to learn how to keep tabs on your node and make sure it keeps running smoothly. * If you run into any problems, please visit the [Node Troubleshooting Guide](/builders/node-operators/management/troubleshooting) for help. diff --git a/pages/builders/node-operators/tutorials/mainnet.mdx b/pages/builders/node-operators/tutorials/mainnet.mdx index 079171dab..b2906a723 100644 --- a/pages/builders/node-operators/tutorials/mainnet.mdx +++ b/pages/builders/node-operators/tutorials/mainnet.mdx @@ -1,22 +1,22 @@ --- -title: Running an OP Mainnet Node from Source +title: Running an OP Mainnet node from source lang: en-US description: Learn how to run an OP Mainnet node from source code for full nodes and archive nodes. --- import { Callout, Steps } from 'nextra/components' -# Running an OP Mainnet Node from Source +# Running an OP Mainnet node from source This tutorial explains how to run an OP Mainnet node from source code for full nodes and archive nodes. Running an OP Mainnet node from source code is a flexible alternative to using pre-built Docker images. -## Building the Source Code +## Building the source code You'll need to build `op-node` and `op-geth` from their respective source repositories before you can run a node. Make sure to follow the instructions on [Building a Node from Source](./node-from-source) before continuing. -## Hardware Requirements +## Hardware requirements Hardware requirements for OP Mainnet nodes can vary depending on the type of node you plan to run. Archive nodes generally require significantly more resources than full nodes. @@ -25,7 +25,7 @@ Below are suggested minimum hardware requirements for each type of node. * 16GB RAM * Reasonably modern CPU -### SSD Capacity Requirements +### SSD capacity requirements Given the growing size of the blockchain state, choosing the right SSD size is important. Below are the storage needs as of April 2024: @@ -39,14 +39,14 @@ Based on these trends, node operators should plan for future storage needs and c Geth supports a "freezer" feature to store older chain data on HDDs, saving SSD space. Configure this for OP Mainnet using the `--datadir.ancient` flag. See [Geth docs](https://geth.ethereum.org/docs/fundamentals/databases) and [OP docs](../configuration/execution-config#datadirancient) for details. -## Full Nodes +## Full nodes -### Assess Blob Archiver +### Assess blob archiver Assess if you need to configure a blob archiver service by reading the [Configure a Blob Archiver documentation](/builders/node-operators/management/blobs#configure-a-blob-archiver-archive-nodes). -### Create a JWT Secret +### Create a JWT secret `op-geth` and `op-node` communicate over the engine API authrpc. This communication is secured using a shared secret. @@ -169,12 +169,12 @@ Once you've started `op-geth`, you can start `op-node`.
-### Synchronization Verification +### Synchronization verification Once you've started `op-geth` and `op-node` you should see the two begin to communicate with each other and synchronize the OP Mainnet chain. -#### Snap Sync (Default) +#### Snap sync (default) Initial synchronization can take several hours to complete. You will see these `op-node` logs at the start of snap sync: @@ -223,7 +223,7 @@ There are two stages on `op-geth` for snap sync: -#### Full Sync +#### Full sync You will need access to the migrated OP Mainnet database to run a full node with full sync. @@ -256,13 +256,13 @@ INFO [06-26|14:02:12.976] Chain head was updated number=4,068, INFO [06-26|14:02:12.982] Starting work on payload id=0x5542117d680dbd4e ``` -## Archive Nodes +## Archive nodes You only need an archive node if you need the historical state. Most node operators should default to full nodes. -### Get the Migrated Data Directory +### Get the migrated data directory OP Mainnet underwent a large database migration as part of the [Bedrock Upgrade](https://web.archive.org/web/20230608050602/https://blog.oplabs.co/introducing-optimism-bedrock/) in 2023. You will need access to the migrated OP Mainnet database to run an archive node. @@ -322,7 +322,7 @@ In this section, you'll learn how to download and verify the pre-migrated databa Set `--syncmode=full` and `--gcmode=archive` on `op-geth`. -### Get the Legacy Geth Directory (Optional) +### Get the legacy Geth directory (optional) Blocks and transactions included in OP Mainnet before the Bedrock Upgrade cannot be executed by modern OP Mainnet nodes. OP Mainnet nodes will **serve** these blocks and transactions but cannot run certain queries against them (e.g. `eth_call`). @@ -367,7 +367,7 @@ If you want to run a full node then you can safely skip this section. ``` -### Start Legacy Geth (Optional) +### Start legacy Geth (optional) If you've chosen to run a Legacy Geth node alongside your OP Mainnet node, you'll need to start it before you start your OP Mainnet node. @@ -390,7 +390,7 @@ If you've chosen to run a Legacy Geth node alongside your OP Mainnet node, you'l ``` -## Next Steps +## Next steps * If you've already got your node up and running, check out the [Node Metrics and Monitoring Guide](../management/metrics) to learn how to keep tabs on your node and make sure it keeps running smoothly. * If you run into any problems, please visit the [Node Troubleshooting Guide](../management/troubleshooting) for help. diff --git a/pages/builders/node-operators/tutorials/node-from-docker.mdx b/pages/builders/node-operators/tutorials/node-from-docker.mdx index b2706a1b2..9f18059fb 100644 --- a/pages/builders/node-operators/tutorials/node-from-docker.mdx +++ b/pages/builders/node-operators/tutorials/node-from-docker.mdx @@ -6,14 +6,14 @@ description: Learn how to run a node using Docker. import { Callout, Steps } from 'nextra/components' -# Running a Node With Docker +# Running a node with Docker Using [Docker](https://docs.docker.com/engine/install/) is an easy way to run an OP Mainnet node. This tutorial will walk you through the process of using [`simple-optimism-node`](https://github.com/smartcontracts/simple-optimism-node) to run an OP Mainnet or OP Sepolia node using Docker. `simple-optimism-node` also provides useful tools like a monitoring dashboard and health checking software. Although less flexible than [running a node from source](./node-from-source) or building your own Docker setup, this is a great way to quickly get started with OP Mainnet. -## What's Included +## What's included `simple-optimism-node` includes all the basic components to run an OP Mainnet or OP Sepolia node. It also includes several additional services to monitor the health of your node and the health of the network you're connected to. @@ -81,7 +81,7 @@ Configuration for `simple-optimism-node` is handled through environment variable * **Base Sepolia** - [https://sepolia.base.org](https://sepolia.base.org) -## Run the Node +## Run the node Once you've configured your `.env` file, you can run the node using Docker Compose. The following command will start the node in the background. @@ -90,7 +90,7 @@ The following command will start the node in the background. docker compose up -d --build ``` -## Upgrade the Node +## Upgrade the node Pull the latest updates from GitHub, Docker Hub and rebuild the container. @@ -100,12 +100,12 @@ docker compose pull docker compose up -d --build --force-recreate ``` -## Operating the Node +## Operating the node You can use Docker Compose to interact with the node and manage the various containers that you started. Refer to the [Operating the Node](https://github.com/smartcontracts/simple-optimism-node#operating-the-node) section of the `simple-optimism-node` README for more information. -## Checking Node Status +## Checking node status `simple-optimism-node` includes a monitoring dashboard that you can use to check the status of your node. You can access the dashboard by visiting `http://localhost:3000` in your browser. diff --git a/pages/builders/node-operators/tutorials/node-from-source.mdx b/pages/builders/node-operators/tutorials/node-from-source.mdx index 326afa65c..97e01389e 100644 --- a/pages/builders/node-operators/tutorials/node-from-source.mdx +++ b/pages/builders/node-operators/tutorials/node-from-source.mdx @@ -1,20 +1,20 @@ --- -title: Building a Node from Source +title: Building a node from source lang: en-US description: Learn how to build your own node without relying on images from Optimism. --- import { Callout, Steps } from 'nextra/components' -# Building a Node from Source +# Building a node from source Docker images are the easiest way to run an OP Mainnet node, but you can always build your own node from source code. You might want to do this if you want to run a node on a specific architecture or if you want to inspect the source code of the node you're running. This guide will walk you through the full process of building a node from source. -## What You're Going to Build +## What you're going to build -### Rollup Node +### Rollup node The Rollup Node is responsible for deriving L2 block payloads from L1 data and passing those payloads to the Execution Client. The Rollup Node can also optionally participate in a peer-to-peer network to receive blocks directly from the Sequencer before those blocks are submitted to L1. @@ -22,7 +22,7 @@ The Rollup Node is largely analogous to a [consensus client](https://ethereum.or In this tutorial you will build the `op-node` implementation of the Rollup Node as found in the [Optimism Monorepo](https://github.com/ethereum-optimism/optimism). -### Execution Client +### Execution client The Execution Client is responsible for executing the block payloads it receives from the Rollup Node over JSON-RPC via the standard [Ethereum Engine API](https://github.com/ethereum/execution-apis/blob/main/src/engine/common.md#engine-api----common-definitions). The Execution Client exposes the standard JSON-RPC API that Ethereum developers are familiar with, and can be used to query blockchain data and submit transactions to the network. @@ -30,7 +30,7 @@ The Execution Client is largely analogous to an [execution client](https://ether In this tutorial you will build the `op-geth` implementation of the Execution Client as found in the [`op-geth` repository](https://github.com/ethereum-optimism/op-geth). -### Legacy Geth (Optional) +### Legacy Geth (optional) Legacy Geth is an optional component for OP Mainnet archive nodes. Legacy Geth allows you to execute stateful queries like `eth_call` against blocks and transactions that occurred before the OP Mainnet [Bedrock Upgrade](https://web.archive.org/web/20230608050602/https://blog.oplabs.co/introducing-optimism-bedrock/). @@ -39,7 +39,7 @@ Legacy Geth is only relevant to OP Mainnet archive nodes and is not required for Currently, `l2Geth` is the only available implementation of Legacy Geth. In this tutorial you will build the `l2geth` implementation of Legacy Geth as found in the [`optimism-legacy` repository](https://github.com/ethereum-optimism/optimism-legacy). -## Software Dependencies +## Software dependencies | Dependency | Version | Version Check Command | | ------------------------------------------------------------- | -------- | --------------------- | @@ -50,7 +50,7 @@ In this tutorial you will build the `l2geth` implementation of Legacy Geth as fo | [foundry](https://github.com/foundry-rs/foundry#installation) | `^0.2.0` | `forge --version` | | [make](https://linux.die.net/man/1/make) | `^4` | `make --version` | -## Build the Rollup Node +## Build the rollup node First you're going to build the `op-node` implementation of the Rollup Node as found in the [Optimism Monorepo](https://github.com/ethereum-optimism/optimism). @@ -106,7 +106,7 @@ make op-node -## Build the Execution Client +## Build the execution client Next you're going to build the `op-geth` implementation of the Execution Client as found in the [op-geth repository](https://github.com/ethereum-optimism/op-geth). @@ -146,7 +146,7 @@ make geth -## Build Legacy Geth (Optional) +## Build legacy Geth (optional) Legacy Geth is an optional component for OP Mainnet archive nodes. Legacy Geth allows you to execute stateful queries like `eth_call` against blocks and transactions that occurred before the OP Mainnet [Bedrock Upgrade](https://web.archive.org/web/20230608050602/https://blog.oplabs.co/introducing-optimism-bedrock/). @@ -172,7 +172,7 @@ make -## Next Steps +## Next steps * Click here to [Run an OP Mainnet Node from Source Code](mainnet) * Click here to [Run an OP Sepolia Node from Source Code](testnet) diff --git a/pages/builders/node-operators/tutorials/testnet.mdx b/pages/builders/node-operators/tutorials/testnet.mdx index 4d97bf849..bec9846dc 100644 --- a/pages/builders/node-operators/tutorials/testnet.mdx +++ b/pages/builders/node-operators/tutorials/testnet.mdx @@ -1,22 +1,22 @@ --- -title: Running an OP Sepolia Node from Source +title: Running an OP Sepolia node from source lang: en-US description: Learn how to run an OP Sepolia node from source code. --- import { Callout, Steps } from 'nextra/components' -# Running an OP Sepolia Node from Source +# Running an OP Sepolia node from source This tutorial explains how to run an OP Sepolia node from source code. Running an OP Sepolia node from source code is a flexible alternative to using pre-built Docker images. -## Building the Source Code +## Building the source code You'll need to build `op-node` and `op-geth` from their respective source repositories before you can run a node. Make sure to follow the instructions on [Building a Node from Source](./node-from-source) before continuing. -## Hardware Requirements +## Hardware requirements Hardware requirements for OP Sepolia nodes can vary depending on the type of node you plan to run. Archive nodes generally require significantly more resources than full nodes. @@ -26,12 +26,12 @@ Below are suggested minimum hardware requirements for each type of node. * 60 GB SSD (full node) or 200 GB SSD (archive node) * Reasonably modern CPU -## Assess Blob Archiver +## Assess blob archiver Assess if you need to configure a blob archiver service by reading the [Configure a Blob Archiver documentation](/builders/node-operators/management/blobs#configure-a-blob-archiver-archive-nodes). -## Create a JWT Secret +## Create a JWT secret `op-geth` and `op-node` communicate over the engine API authrpc. This communication is secured using a shared secret. @@ -162,12 +162,12 @@ Note that this flag will cause `op-node` to trust the L1 node to provide correct -### Synchronization Verification +### Synchronization verification Once you've started `op-geth` and `op-node` you should see the two begin to communicate with each other and synchronize the OP Mainnet chain. -#### Snap Sync (Default) +#### Snap sync (default) Initial synchronization can take several hours to complete. You will see these `op-node` logs at the start of snap sync: @@ -216,7 +216,7 @@ There are two stages on `op-geth` for snap sync: -#### Full Sync +#### Full sync Initial full synchronization can take several days to complete. @@ -246,7 +246,7 @@ INFO [06-26|14:02:12.976] Chain head was updated number=4,068, INFO [06-26|14:02:12.982] Starting work on payload id=0x5542117d680dbd4e ``` -## Next Steps +## Next steps * If you've already got your node up and running, check out the [Node Metrics and Monitoring Guide](../management/metrics) to learn how to keep tabs on your node and make sure it keeps running smoothly. * If you run into any problems, please visit the [Node Troubleshooting Guide](../management/troubleshooting) for help. diff --git a/pages/builders/notices/fp-changes.mdx b/pages/builders/notices/fp-changes.mdx index 4f7a34d81..2e4302906 100644 --- a/pages/builders/notices/fp-changes.mdx +++ b/pages/builders/notices/fp-changes.mdx @@ -1,12 +1,12 @@ --- -title: Preparing for Fault Proofs Breaking Changes +title: Preparing for fault proofs breaking changes lang: en-US description: Learn how to prepare for Fault Proofs changes. --- import { Steps, Callout } from 'nextra/components' -# Preparing for Fault Proofs Breaking Changes +# Preparing for fault proofs breaking changes OP Labs has submitted a [proposal to governance](https://gov.optimism.io/t/upgrade-proposal-fault-proofs/8161) to upgrade OP Mainnet to support Fault Proofs. If this proposal passes, fault proofs would launch on OP Mainnet approximately June 2024. This document details changes that apply to users, bridges, and centralized exchanges, as well as any custom solutions that use withdrawals. This page outlines changes for OP Mainnet and OP Sepolia only. Details for other OP Chains are forthcoming. @@ -33,7 +33,7 @@ If you experience difficulty at any stage of this process, please reach out to [ As of the Fault Proofs update to OP Sepolia in March 2024, **OP Sepolia withdrawals are no longer instant.** This is because the Fault Proof mechanism now applies to OP Sepolia transactions. -## Overview of Changes +## Overview of changes If you are operating a custom bridge, review this section for changes you need to make. If you are using Optimism SDK or Viem for your bridging, you can [skip to the next section](#for-bridges-and-centralized-exchanges). @@ -56,7 +56,7 @@ Now, developers must look at the `OptimismPortal` contract to determine the `res It is recommended that developers search for a reasonable number of recent games, say 100 games, and pick the first proposal with a sufficient block number. Developers should then verify this proposal locally as the default game type will allow for permissionless proposals and there is no longer a strong guarantee that proposals will be valid. -## For Bridges and Centralized Exchanges +## For bridges and centralized exchanges The proposed Fault Proof upgrade requires developers to enable Fault Proof changes before the Op Mainnet release. This impacts bridges, centralized exchanges, and custom solutions that use withdrawals. @@ -66,7 +66,7 @@ The proposed Fault Proof upgrade requires developers to enable Fault Proof chang
- ### Update Logic to Support Fault Proofs + ### Update logic to support fault proofs Most teams use the Optimism SDK or Viem to handle this logic under the hood and will simply need to update their software version ahead of the upgrade. However, any project performing withdrawals programmatically will need to update their client code (see [`OptimismPortal`](#optimismportal) for details). @@ -76,7 +76,7 @@ The proposed Fault Proof upgrade requires developers to enable Fault Proof chang The Optimism SDK changes do not break the API and require no changes other than updating to the correct software version to support the new `OptimismPortal` logic. The Optimism SDK will automatically begin to use the new logic once it detects that the FPM update has gone live. * **Option 2: Viem Update.** Update to the latest version of Viem (version of >=2.9.0). Viem will automatically begin to use the new logic once it detects that the FPM update has gone live. - ### Update Withdrawal Monitor + ### Update withdrawal monitor The Withdrawal Monitor service is an important part of the two-step withdrawal system that checks if anyone has been able to prove withdrawals that do not actually appear on L2. The Withdrawal Monitor is now slightly slower at startup time but is more reliable, simpler, and compatible with more infrastructure to more easily support any OP Stack chain. @@ -85,7 +85,7 @@ The proposed Fault Proof upgrade requires developers to enable Fault Proof chang * **Option 1: Withdrawal from source.** If building or using withdrawal-monitor from source, make sure that you are using the latest develop branch. All withdrawal monitor changes are fully backwards compatible. * **Option 2: Docker image.** If using docker, use the latest chain-mon docker image. - ### Update Dispute Monitor + ### Update dispute monitor The Dispute Monitor service detects when invalid outputs have been proposed. Given the large number of changes to the output proposal system, the current Fault Monitor is being replaced in favor of a new Dispute Monitor purposely built for the fault proof monitor system. @@ -94,7 +94,7 @@ The proposed Fault Proof upgrade requires developers to enable Fault Proof chang -## Next Steps +## Next steps * See the [Fault Proofs Explainer](/stack/protocol/fault-proofs/explainer) to learn more about the three main components of the Fault Proof System. * You can also read more about [Cannon FPVM](/stack/protocol/fault-proofs/cannon) and [Mips.sol](/stack/protocol/fault-proofs/mips), the onchain smart contract implementation of Cannon. diff --git a/pages/builders/notices/granite-changes.mdx b/pages/builders/notices/granite-changes.mdx index b0eaa9871..d302716b4 100644 --- a/pages/builders/notices/granite-changes.mdx +++ b/pages/builders/notices/granite-changes.mdx @@ -1,12 +1,12 @@ --- -title: Preparing for Granite Breaking Changes +title: Preparing for Granite breaking changes lang: en-US description: Learn how to prepare for Granite upgrade breaking changes. --- import { Steps, Callout } from 'nextra/components' -# Preparing for Granite Breaking Changes +# Preparing for Granite breaking changes This page outlines breaking changes related to the Granite network upgrade for chain operators and node operators. If you experience difficulty at any stage of this process, please reach out to [developer support](https://github.com/ethereum-optimism/developers/discussions). @@ -15,7 +15,7 @@ If you experience difficulty at any stage of this process, please reach out to [ The Granite upgrade for OP Sepolia was activated on **1723478400 - Mon Aug 12 16:00:00 UTC**. The Granite OP Mainnet upgrade will be activated at **1726070401 - Wed 11 Sep 2024 16:00:01 UTC**, here is the [governance vote](https://vote.optimism.io/proposals/46514799174839131952937755475635933411907395382311347042580299316635260952272).
-## What's Included in Granite +## What's included in Granite This upgrade is proposed in response to security vulnerabilities identified during a series of third-party security audits by Spearbit, Cantina, and Code4rena. None of the vulnerabilities have been exploited, and user assets are not and were never at risk. However, out of an abundance of caution, the permissioned fallback mechanism has been activated in order to avoid any potential instability while the vulnerabilities are patched. For more information on the permissioned fallback mechanism and the OP Stack's defense-in-depth approach to Fault Proof security, see the [fault proof documentation](https://docs.optimism.io/stack/protocol/fault-proofs/fp-security). @@ -23,13 +23,13 @@ The upgrade includes both a set of smart contract upgrades to fix the vulnerabil Please refer to the [governance proposal](https://gov.optimism.io/t/upgrade-proposal-10-granite-network-upgrade/8733) for the full details. -## For Chain Operators +## For chain operators The proposed Granite upgrade impacts OP chains and requires chain operators to upgrade their chain and configure the sequencer for Granite. - ### Prepare Sequencer Node + ### Prepare sequencer node If you are operating an OP Chain that has an entry in the [`superchain-registry`](https://github.com/ethereum-optimism/superchain-registry/blob/main/chainList.json), the Granite activation date is part of the `op-node` and `op-geth` nodes, and are using the [--network](/builders/node-operators/configuration/consensus-config#network) and [--op-network](/builders/node-operators/configuration/execution-config#op-network-betaop-network) flags. No action is needed for the sequencer after preparing the `SystemConfig` transaction. @@ -42,7 +42,7 @@ The proposed Granite upgrade impacts OP chains and requires chain operators to u * Set `override.granite` in both `op-node` and `op-geth` to the UNIX timestamp of the block you want to activate the Granite hardfork or corresponding env vars for this. * In general, run `op-node --help` or `op-geth --help` to see flags, their descriptions and environment variables. - ### Rollup Configuration Breaking Changes + ### Rollup configuration breaking changes Alt-DA mode has had a name change. What was formerly known as Plasma Mode has been renamed and you may need to [update your rollup configuration file](/builders/chain-operators/features/alt-da-mode#breaking-changes-renaming-plasma-mode-to-alt-da-mode). @@ -51,7 +51,7 @@ The proposed Granite upgrade impacts OP chains and requires chain operators to u To verify proper configuration, chain operators should confirm in the startup logs of their `op-node` and `op-geth` that the correct Granite activation timestamps are set. -## For Node Operators +## For node operators Node operators will need to upgrade to Granite before the activation date. The op-node release [v1.9.1](https://github.com/ethereum-optimism/optimism/releases/tag/v1.9.1) @@ -60,12 +60,12 @@ and op-geth release [v1.101408.0](https://github.com/ethereum-optimism/op-geth/r These following steps are necessary for every node operator: - ### Update to the Latest Release + ### Update to the latest release * [`op-node`](https://github.com/ethereum-optimism/optimism/releases/tag/v1.9.1) * [`op-geth`](https://github.com/ethereum-optimism/op-geth/releases/tag/v1.101408.0) - ### Configure the Granite Activation Date + ### Configure the Granite activation date If you are operating a node for an OP Chain that has an entry in the [`superchain-registry`](https://github.com/ethereum-optimism/superchain-registry/blob/main/chainList.json), the Granite activation date is part of the `op-node` and `op-geth` nodes. So, no action is needed for the sequencer after upgrading to the latest release. Please skip to [Step 3: Verify Your Configuration](#verify-your-configuration). @@ -76,7 +76,7 @@ These following steps are necessary for every node operator: * **Option 1:** Set the activation time in the `rollup.json` for `op-node`. You will still need to set the `override.granite` flag in `op-geth` if you use this option. * **Option 2:** Set the activation time via overrides (CLI) in both `op-node` and `op-geth`. These will need to be set on `op-node` and `op-geth` for the sequencer and all other nodes. - ### Verify Your Configuration + ### Verify your configuration Make the following checks to verify that your node is properly configured. diff --git a/pages/builders/notices/sdk-deprecation.mdx b/pages/builders/notices/sdk-deprecation.mdx index 302f4afba..d0cf8b6ba 100644 --- a/pages/builders/notices/sdk-deprecation.mdx +++ b/pages/builders/notices/sdk-deprecation.mdx @@ -92,7 +92,7 @@ Node operators should take the following steps: * Review configuration: Check and update any configuration files that may reference the Optimism SDK. * Test thoroughly: Perform comprehensive testing in a staging environment before updating production nodes. -### Need Help? +### Need help? For further assistance or questions about this migration, feel free to reach through the following channels: diff --git a/pages/builders/tools/build/account-abstraction.mdx b/pages/builders/tools/build/account-abstraction.mdx index 7cebf8eb5..1a9b68390 100644 --- a/pages/builders/tools/build/account-abstraction.mdx +++ b/pages/builders/tools/build/account-abstraction.mdx @@ -1,12 +1,12 @@ --- -title: Account Abstraction +title: Account abstraction lang: en-US description: This guide explains how to use account abstraction to remove friction from your app experience --- import { Callout } from 'nextra/components' -# Account Abstraction +# Account abstraction This page includes providers that meet specific [inclusion criteria](#inclusion-criteria), as outlined below. Please visit the [community account abstractions page](https://github.com/ethereum-optimism/developers/blob/main/community/tools/account-abstraction.md) for an additional listing of third-party account abstraction tools. @@ -29,11 +29,11 @@ If enabled by the chain operator, also see the supplemental [op-txproxy](/stack/ As of today, this endpoint is not enabled by default in the stack. The operator must explicitly configure this. -## Superchain Paymaster +## Superchain paymaster The Superchain paymaster is an ERC-4337 verifying paymaster that sponsors transactions for smart accounts on the Superchain. Use the Superchain Paymaster to get your transactions sponsored to remove friction from your app experience. [View the implementation guide and tutorials here.](https://github.com/ethereum-optimism/ecosystem/tree/main/docs/superchain-paymaster) -## Account Abstraction Tools +## Account abstraction tools Ready to enable account abstraction experiences in your app? Here's some helpful information on account abstraction infrastructure like ERC-4337 bundler and gas manager APIs that are available on OP Mainnet: @@ -55,12 +55,12 @@ Ready to enable account abstraction experiences in your app? Here's some helpful * [Thirdweb](https://portal.thirdweb.com/connect/account-abstraction/overview): offers the complete tool-kit to leverage account abstraction technology to enable seamless user experiences for your users. This includes Account Factory contracts that lets your users spin up Smart Accounts, Bundler for UserOps support, and Paymaster to enable gas sponsorships. -## Helpful Tips +## Helpful tips * [EIP-1271 Signature Validation](https://eip1271.io/) * [Making smart accounts work with WalletConnect v2](https://safe-global.notion.site/WalletConnect-v2-update-Issues-and-solutions-for-smart-wallets-3fc32fad6af4485fa5823eaebd486819) -## Inclusion Criteria +## Inclusion criteria Developer teams who want to feature products/tools on this page must meet the following criteria: diff --git a/pages/builders/tools/build/block-explorers.mdx b/pages/builders/tools/build/block-explorers.mdx index e72e8da6e..cd179fc87 100644 --- a/pages/builders/tools/build/block-explorers.mdx +++ b/pages/builders/tools/build/block-explorers.mdx @@ -1,12 +1,12 @@ --- -title: Block Explorers +title: Block explorers lang: en-US description: Learn about different block explorers you can use to interact with contracts and view transaction history for OP Mainnet and OP Sepolia. --- import { Callout } from 'nextra/components' -# Block Explorers +# Block explorers This reference guide lists different block explorers you can use to interact with contract source code and view transaction history for OP Mainnet and OP Sepolia. @@ -65,12 +65,12 @@ Once Upon currently supports: * Mainnet - Ethereum, OP Mainnet, Base, Zora, Public Goods Network * Sepolia - Ethereum, OP Sepolia, Base, Zora, Public Goods Network, Lyra, Mode -## Access to Pre-Regenesis History +## Access to pre-regenesis history Because of our final regenesis on 11 November 2021, older transactions are not part of the current blockchain and do not appear on [Etherscan](https://explorer.optimism.io/). However, you **can** access transaction history between 23 June 2021 and the final regenesis using a number of different tools. For detailed instructions, see [Regenesis History](/builders/tools/monitor/regenesis-history). -## Inclusion Criteria +## Inclusion criteria Developer teams who want to feature products/tools on this page must meet the following criteria: diff --git a/pages/builders/tools/build/faucets.mdx b/pages/builders/tools/build/faucets.mdx index 54467f03e..a21e53c08 100644 --- a/pages/builders/tools/build/faucets.mdx +++ b/pages/builders/tools/build/faucets.mdx @@ -1,12 +1,12 @@ --- -title: Testnet Faucets +title: Testnet faucets lang: en-US description: Learn how to get testnet ETH on test networks like Sepolia and OP Sepolia for development and testing purposes. --- import { Callout } from 'nextra/components' -# Testnet Faucets +# Testnet faucets Faucets are developers tools that allow you to get free ETH (and other tokens) on test networks like Sepolia and OP Sepolia so that you can send transactions and create smart contracts. Here you'll find a list of active faucets that you can try out. @@ -22,12 +22,12 @@ Faucets can occasionally also run out of ETH, so if you're having trouble gettin Optimists only take what they need so that others can use faucets too! -## Superchain Faucet +## Superchain faucet The [Superchain Faucet](https://console.optimism.io/faucet?utm_source=docs) is a developer tool hosted by Optimism that allows developers to get free testnet ETH to test apps on testnet OP Chains like Base Sepolia, OP Sepolia, PGN Sepolia, Zora Sepolia, and other OP Chains in the Superchain. The Superchain Faucet is a great place to start if you're looking for testnet ETH. -## Additional Faucets +## Additional faucets | Faucet Name | Supported Networks | | -------------------------------------------------------------------------------- | -------------------------------------------------------- | @@ -46,7 +46,7 @@ The Superchain Faucet is a great place to start if you're looking for testnet ET If you have testnet ETH on Sepolia, you can bridge it to OP Sepolia (and vice versa) using the [Superchain Bridges UI](https://app.optimism.io/bridge) or this collection of [Superchain Testnet Tools](https://www.superchain.tools/). -## Inclusion Criteria +## Inclusion criteria Developer teams who want to feature products/tools on this page must meet the following criteria: @@ -57,7 +57,7 @@ Developer teams who want to feature products/tools on this page must meet the fo For teams that are supporting but still establishing a user base, we encourage you to share your tool on the [community faucets page](https://github.com/ethereum-optimism/developers/blob/main/community/tools/faucets.md). You can also promote your tool in the [developer forum](https://github.com/ethereum-optimism/developers/discussions/categories/show-and-tell) and signup to share your tool at the next [demo day](https://community.optimism.io/docs/contribute/demo-day/). -## Next Steps +## Next steps * If you're new to onchain development, check out [Optimism Unleashed](https://cryptozombies.io/en/optimism) by CryptoZombies and [Superchain Builder NFT](https://web.archive.org/web/20231218203510/https://blog.thirdweb.com/guides/optimism-superchain-faucet-nft/) by ThirdWeb. * If you're familiar with onchain development, check out the [Optimism Ecosystem's Contributions Dashboard](https://github.com/ethereum-optimism/ecosystem-contributions) for project ideas that the Optimism Collective is looking for. diff --git a/pages/builders/tools/build/nft-tools.mdx b/pages/builders/tools/build/nft-tools.mdx index 270f3f636..c0d99dedd 100644 --- a/pages/builders/tools/build/nft-tools.mdx +++ b/pages/builders/tools/build/nft-tools.mdx @@ -1,12 +1,12 @@ --- -title: OP Mainnet NFT Tools +title: OP Mainnet NFT tools lang: en-US description: Learn the basics of creating an NFT on OP Mainnet. --- import { Callout } from 'nextra/components' -# OP Mainnet NFT Tools +# OP Mainnet NFT tools ## The OP Mainnet NFT ecosystem diff --git a/pages/builders/tools/build/oracles.mdx b/pages/builders/tools/build/oracles.mdx index 378ea8d16..f69f07fac 100644 --- a/pages/builders/tools/build/oracles.mdx +++ b/pages/builders/tools/build/oracles.mdx @@ -18,12 +18,12 @@ For example, a [stablecoin](https://ethereum.org/en/stablecoins/) that accepts E * How many stablecoins can we give a user for a given amount of ETH? * Do we need to liquidate any deposits because they are under collateralized? -## Security and Decentralization +## Security and decentralization Different oracles have different security assumptions and different levels of decentralization. Usually they are either run by the organization that produces the information, or have a mechanism to reward entities that provide accurate information and penalize those that provide incorrect information. -## Types of Oracles +## Types of oracles There are two types of oracles: @@ -37,13 +37,13 @@ There are two types of oracles: 2. Single-transaction oracles, which only require one transaction. The way this works is that the transaction that requests the information includes a callback (address and the call data to provide it). When the oracle is updated (which also happens through a transaction, but one that is not sent by the user), the oracle uses the callback to inform a contract of the result. -## Random Number Generation (RGN) +## Random number generation (RGN) Random number generation in blockchain applications ensures that smart contracts can access unbiased random values. This is essential for certain use cases like generative NFTs, gaming, commit & reveal schemes and more. Various approaches include using a trusted third party, blockhash-based methods, Verifiable Random Functions (VRF), quantum random numbers to name a few. Each method has trade-offs between simplicity, security, and trust assumptions, allowing developers to select the most suitable option for their use case. -## List of Oracles +## List of oracles -### Gas Oracle +### Gas oracle OP Mainnet provides a [Gas Price Oracle](https://github.com/ethereum-optimism/optimism/blob/233ede59d16cb01bdd8e7ff662a153a4c3178bdd/packages/contracts/contracts/L2/predeploys/OVM_GasPriceOracle.sol) that provides information about [gas prices and related parameters](/stack/transactions/fees). It can also calculate the total cost of a transaction for you before you send it. @@ -130,7 +130,7 @@ Builders can choose how they want to consume the data among 3 dedicated models: Interested in integration? [Get in contact](https://discord.com/invite/PVxBZKFr46) with the RedStone team! -## Inclusion Criteria +## Inclusion criteria Developer teams who want to feature products/tools on this page must meet the following criteria: @@ -141,7 +141,7 @@ Developer teams who want to feature products/tools on this page must meet the fo For teams that are supporting but still establishing a user base, we encourage you to share your tool on the [community oracles page](https://github.com/ethereum-optimism/developers/blob/main/community/tools/oracles.md). You can also promote your tool in the [developer forum](https://github.com/ethereum-optimism/developers/discussions/categories/show-and-tell) and signup to share your tool at the next [demo day](https://community.optimism.io/docs/contribute/demo-day/). -## Next Steps +## Next steps * Please visit the [community oracles page](https://github.com/ethereum-optimism/developers/blob/main/community/tools/oracles.md) for a listing of third-party Oracles used by the Optimism developer community. * Looking for other developer tools? See [developer tools overview](/builders/tools/overview) to explore more options! diff --git a/pages/builders/tools/connect/rpc-providers.mdx b/pages/builders/tools/connect/rpc-providers.mdx index 20010e015..e896b1a4e 100644 --- a/pages/builders/tools/connect/rpc-providers.mdx +++ b/pages/builders/tools/connect/rpc-providers.mdx @@ -1,12 +1,12 @@ --- -title: RPC & Node Providers +title: RPC & Node providers lang: en-US description: Learn about different RPC and node providers to help you connect to an Optimism node. --- import { Callout } from 'nextra/components' -# RPC & Node Providers +# RPC & Node providers This reference guide lists different RPC and node providers to help you connect to an Optimism node. @@ -16,42 +16,42 @@ This page includes providers that meet specific [inclusion criteria](#inclusion- ## Ankr -### Description and Pricing +### Description and pricing [Ankr](https://www.ankr.com/) provides a geo-distributed and decentralized (free) public and premium (Pay-as-you-go) [Optimism RPC](https://www.ankr.com/rpc/optimism/) comprised of many independent blockchain nodes running worldwide for low-latency and incredibly reliable connections. Moreover, Ankr offers access to developer tooling on OP Mainnet (and testnets) like SDKs and [Advanced APIs](https://www.ankr.com/advanced-api/) such as NFT, Token and Query API. -### Supported Networks +### Supported networks * OP Mainnet * OP Sepolia ## Alchemy -### Description and Pricing +### Description and pricing [Alchemy](https://docs.alchemy.com/reference/optimism-api-quickstart/?a=818c11a8da) is a popular API provider and developer platform. Its robust, free tier offers access to enhanced features like SDKs and enhanced APIs and hosted OP Mainnet and testnet nodes. -### Supported Networks +### Supported networks * OP Mainnet * OP Sepolia ## Chainstack -### Description and Pricing +### Description and pricing [Chainstack](https://chainstack.com/build-better-with-optimism/) provides global & regional load-balanced nodes that are full & archive with debug & trace APIs. For the free tier, the Developer plan is available and you can sign up with GitHub account or other social logins. Chainstack also has special discounts available. -### Supported Networks +### Supported networks * OP Mainnet * OP Sepolia ## dRPC -### Description and Pricing +### Description and pricing [dRPC](https://drpc.org) provides geo-distributed, auto-scalable OP Mainnet and OP Sepolia nodes. For more information, visit [dRPC's chainlist for Optimism](https://drpc.org/chainlist/optimism). dRPC supports Websocket and all methods, including debug and trace methods. For early-stage startups, dRPC and Optimism Collective provide OP Mainnet nodes from 3 geo clusters without method restrictions and are totally free! For commercial nodes, dRPC uses a pay-as-you-go model without hidden fees and rate limits. Feel free to try fast and reliable nodes. @@ -62,42 +62,42 @@ OP Sepolia ## Infura -### Description and Pricing +### Description and pricing [Infura](https://infura.io) is a Web3 infrastructure provider that offers free access to hosted [OP Mainnet and testnet nodes](https://docs.infura.io/infura/networks/optimism), with the option to upgrade to [paid plans](https://www.infura.io/pricing) for more features. With Infura's highly performant Optimism node infrastructure, developers can eliminate the need for syncing or complex setups and get reliable and consistent access to the Optimism blockchain. [Sign up for a free Infura account here](https://app.infura.io/register) -### Supported Networks +### Supported networks * OP Mainnet * OP Sepolia ## Moralis -### Description and Pricing +### Description and pricing [Moralis](https://moralis.io/?utm_source=op-docs&utm_medium=partner-docs) is a popular Node and API provider for both real-time and indexed blockchain data. Moralis is the only major infrastructure provider in blockchain with a SOC2 Type 2 certification. You can use Moralis for free, or upgrade to a [paid plan](https://moralis.io/pricing/?utm_source=op-docs&utm_medium=partner-docs) for more features and benefits. [Sign up for a free Moralis account here](https://admin.moralis.io/register/?utm_source=op-docs&utm_medium=partner-docs) -### Supported Networks +### Supported networks * OP Mainnet ## QuickNode -### Description and Pricing +### Description and pricing [QuickNode](https://www.quicknode.com/) offers access to hosted OP Mainnet (and testnet) nodes for free. With the option to upgrade to a premium plan for additional features, we allow you to focus solely on optimizing your application while we manage the complex infrastructure. -### Supported Networks +### Supported networks * OP Mainnet * OP Sepolia -## Inclusion Criteria +## Inclusion criteria Developer teams who want to feature products/tools on this page must meet the following criteria: @@ -108,7 +108,7 @@ Developer teams who want to feature products/tools on this page must meet the fo For teams that are supporting but still establishing a user base, we encourage you to share your tool on the [community node providers page](https://github.com/ethereum-optimism/developers/blob/main/community/tools/node-providers.md). You can also promote your tool in the [developer forum](https://github.com/ethereum-optimism/developers/discussions/categories/show-and-tell) and signup to share your tool at the next [demo day](https://community.optimism.io/docs/contribute/demo-day/). -## Next Steps +## Next steps * Please visit the [community node providers page](https://github.com/ethereum-optimism/developers/blob/main/community/tools/node-providers.md) for a listing of third-party node providers used by the Optimism developer community. * Looking for other developer tools? See [developer tools overview](/builders/tools/overview) to explore more options! diff --git a/pages/builders/tools/fee-calculator.mdx b/pages/builders/tools/fee-calculator.mdx index 543b71598..053cf3601 100644 --- a/pages/builders/tools/fee-calculator.mdx +++ b/pages/builders/tools/fee-calculator.mdx @@ -1,12 +1,12 @@ --- -title: Fjord Fee Parameter Calculator +title: Fjord fee parameter calculator lang: en-US description: Use the Fjord Fee Parameter Calculator to estimate and calculate fees for transactions. --- import { ChainParametersForm } from '@/components/calculator/ChainParametersForm' -# Fjord Fee Parameter Calculator +# Fjord fee parameter calculator The Fjord Fee Parameter Calculator helps you estimate transaction fees. Use this tool to: diff --git a/pages/builders/tools/monitor/analytics-tools.mdx b/pages/builders/tools/monitor/analytics-tools.mdx index aa3a39031..f7d39d0a7 100644 --- a/pages/builders/tools/monitor/analytics-tools.mdx +++ b/pages/builders/tools/monitor/analytics-tools.mdx @@ -1,12 +1,12 @@ --- -title: Analytics Tools +title: Analytics tools lang: en-US description: Learn about platforms you can use to gather analytics and setup customizations about OP Mainnet. --- import { Callout } from 'nextra/components' -# Analytics Tools +# Analytics tools The following guide lists platforms you can use to gather analytics and setup customizations about OP Mainnet. @@ -31,7 +31,7 @@ It helps you to inspect states at every instance of transaction and gives a plat * [setup real-time alerts for smart contracts](https://blog.tenderly.co/how-to-set-up-real-time-alerting-for-smart-contracts-with-tenderly/) * [automate your responses to alert triggers](https://blog.tenderly.co/tenderly-alert-webhooks/) with custom webhooks -## Dune Analytics +## Dune analytics [Dune Analytics](https://dune.com) allows anyone to create dashboards that present information about OP Chains (OP Mainnet, Base, and Zora are available). See [Dune Docs](https://dune.com/docs/) for more info. You can find a list of community created dashboards for OP Chains [here](https://dune.com/browse/dashboards?q=tags%3Aop%2Coptimism%2Csuperchain\&order=trending\&time_range=24h), or [create your own](https://docs.dune.com/#queries) dashboard. @@ -44,7 +44,7 @@ Here are some of our favorite dashboards so far: * [OP Token House Delegates](https://dune.com/optimismfnd/optimism-op-token-house) * [Superchain NFTs](https://dune.com/oplabspbc/superchain-nfts) -## Additional Tools and Resources +## Additional tools and resources Here are some additional tools and resources for OP Mainnet analytics and development: diff --git a/pages/builders/tools/monitor/regenesis-history.mdx b/pages/builders/tools/monitor/regenesis-history.mdx index 73a469f34..0938a0b58 100644 --- a/pages/builders/tools/monitor/regenesis-history.mdx +++ b/pages/builders/tools/monitor/regenesis-history.mdx @@ -1,12 +1,12 @@ --- -title: Accessing Pre-Regenesis History +title: Accessing pre-regenesis history lang: en-US description: Learn how to use access pre-regenesis history using the Etherscan CSV exporting tool. --- import { Callout, Steps } from 'nextra/components' -# Accessing Pre-Regenesis History +# Accessing pre-regenesis history This tutorial explains how to access transaction history between 23 June 2021 and the final regenesis. Because of our final regenesis on 11 November 2021, older transactions are not part of the current blockchain and do not appear on [Etherscan](https://explorer.optimism.io/). @@ -26,7 +26,7 @@ You have to log on with a Dune account, but their free tier is sufficient. Alternatively, to run custom queries in Dune, you can use the `optimism_legacy_ovm1` schema defined in [Dune Docs here](https://dune.com/docs/data-tables/?h=ovm#optimism). -## Lost Data Directories +## Lost data directories Three data directories that were used by legacy L2Geth Sequencer instances during the period of January 2021 to July 2021 had been errantly deleted during @@ -60,7 +60,7 @@ requests for this data came from individuals who needed access to this informati for the 2021 tax season though this is mostly no longer relevant today (many people who needed this data already retrieved it). -### Going Forward +### Going forward We recognize the inconvenience this has caused some of our community and their uses and we're sorry for the frustrations. In an effort to prevent similar diff --git a/pages/builders/tools/overview.mdx b/pages/builders/tools/overview.mdx index e315426b6..dac27f1e5 100644 --- a/pages/builders/tools/overview.mdx +++ b/pages/builders/tools/overview.mdx @@ -1,12 +1,12 @@ --- -title: Developer Tools +title: Developer tools lang: en-US description: Learn about different developer tools you can use to help you build on Optimism. --- import { Cards, Card } from 'nextra/components' -# Developer Tools +# Developer tools Welcome to the Optimism developer tools! @@ -43,7 +43,7 @@ If you are already familiar with [building on OP Mainnet](/chain/getting-started } /> -## OP Tools +## OP tools } /> diff --git a/pages/chain/addresses.mdx b/pages/chain/addresses.mdx index 4317dbf7d..eb1e0d7ef 100644 --- a/pages/chain/addresses.mdx +++ b/pages/chain/addresses.mdx @@ -1,5 +1,5 @@ --- -title: Contract Addresses +title: Contract addresses lang: en-US description: This reference guide lists all the contract addresses for Mainnet and Testnet. --- diff --git a/pages/chain/differences.mdx b/pages/chain/differences.mdx index 784911879..3e50bf180 100644 --- a/pages/chain/differences.mdx +++ b/pages/chain/differences.mdx @@ -20,7 +20,7 @@ However, there are some minor differences between the behavior of Ethereum and O | `ORIGIN` | `tx.origin` | If the transaction is an L1 ⇒ L2 transaction triggered by a smart contract on L1, then `tx.origin` is set to the [aliased address](#address-aliasing) of the address that triggered the L1 ⇒ L2 transaction. Otherwise, this opcode behaves normally. | | `CALLER` | `msg.sender` | If the transaction is an L1 ⇒ L2 transaction triggered by a smart contract on L1, and this is the first call frame (rather than an internal transaction from one contract to another), the same [address aliasing](#address-aliasing) behavior applies. | -### Address Aliasing +### Address aliasing Address aliasing is an important security feature that impacts the behavior of transactions sent from L1 to L2 by smart contracts. @@ -50,12 +50,12 @@ In all other cases, the transaction sender address is set according to the same ## Transactions -### Transaction Fees +### Transaction fees Transactions on OP Mainnet must pay for an [L1 data fee](/stack/transactions/fees#the-l1-data-fee) on top of the standard [execution gas fee](/stack/transactions/fees#execution-gas-fee) you would expect on Ethereum. Refer to the guide on [OP Mainnet Transaction Fees](/stack/transactions/fees) for more information. -### EIP-1559 Parameters +### EIP-1559 parameters The base fee on OP Mainnet is, like Ethereum, computed via the [EIP-1559](https://notes.ethereum.org/@vbuterin/eip-1559-faq) mechanism. The EIP-1559 parameters used by OP Mainnet differ from those used by Ethereum as follows. @@ -70,7 +70,7 @@ The EIP-1559 parameters used by OP Mainnet differ from those used by Ethereum as | Maximum base fee decrease (per block) | 0.4% | 12.5% | | Block time in seconds | 2 | 12 | -### Mempool Rules +### Mempool rules Unlike Ethereum, OP Mainnet does not have a large public mempool. The OP Mainnet Sequencer mempool is currently only visible to the Sequencer. diff --git a/pages/chain/getting-started.mdx b/pages/chain/getting-started.mdx index 6d4136cf5..cf9703d44 100644 --- a/pages/chain/getting-started.mdx +++ b/pages/chain/getting-started.mdx @@ -1,34 +1,34 @@ --- -title: Getting Started Developing for OP Mainnet +title: Getting started developing for OP Mainnet lang: en-US description: Learn the basics of OP Mainnet development. --- import { Steps } from 'nextra/components' -# Getting Started Developing for OP Mainnet +# Getting started developing for OP Mainnet This guide explains the basics of OP Mainnet development. OP Mainnet is [EVM equivalent](https://web.archive.org/web/20231127160757/https://medium.com/ethereum-optimism/introducing-evm-equivalence-5c2021deb306), meaning we run a slightly modified version of the same `geth` you run on mainnet. Therefore, the differences between OP Mainnet development and Ethereum development are minor. But a few differences [do exist](/chain/differences). -## OP Mainnet and OP Sepolia Endpoint URLs +## OP Mainnet and OP Sepolia endpoint URLs To access any Ethereum type network you need an endpoint. [These providers](/builders/tools/connect/rpc-providers) support our networks. -### Network Choice +### Network choice For development purposes we recommend you use either a local development node or [OP Sepolia](https://sepolia-optimism.etherscan.io). That way you don't need to spend real money. If you need ETH on OP Sepolia for testing purposes, [you can use this faucet](https://console.optimism.io/faucet?utm_source=docs). -## Interacting with Contracts on OP Mainnet or OP Sepolia +## Interacting with contracts on OP Mainnet or OP Sepolia We have Hardhat's Greeter contract on OP Sepolia at address [0x9d334aFBa83865E67a9219830ADA57aaA9406681](https://sepolia-optimism.etherscan.io/address/0x9d334aFBa83865E67a9219830ADA57aaA9406681#code). You can verify your development stack configuration by interacting with it. -## Development Stacks +## Development stacks As you can see in the different development stacks below, the way you deploy contracts and interact with them on OP Mainnet or OP Sepolia is almost identical to the way you do it with L1 Ethereum. The most visible difference is that you have to specify a different endpoint (of course). @@ -42,21 +42,21 @@ The list of other differences is [here](differences). * [Truffle](https://trufflesuite.com/) * [Waffle](https://getwaffle.io/) -## Best Practices +## Best practices -### Use Provided EVM +### Use provided EVM It is best to start development with the EVM provided by the development stack. Not only is it faster, but such EVMs often have extra features, such as the [ability to log messages from Solidity](https://hardhat.org/tutorial/debugging-with-hardhat-network.html) or a [graphical user interface](https://trufflesuite.com/ganache/). -### Debug Before Deploying +### Debug before deploying After you are done with that development, debug your decentralized application using either a [development node](/chain/testing/dev-node) or the [Sepolia test network](/chain/networks). This lets you debug parts that are OP Mainnet specific such as calls to bridges to transfer ETH or tokens between layers. Only when you have a version that works well on a test network should you deploy to the production network, where every transaction has a cost. -### Contract Source Verification +### Contract source verification You don't have to upload your source code to [block explorers](/builders/tools/build/block-explorers), but it is a good idea. On the test network, it lets you issue queries and transactions from the explorer's user interface. diff --git a/pages/chain/identity/about-attestations.mdx b/pages/chain/identity/about-attestations.mdx index 81f7133ca..4c2bdfbba 100644 --- a/pages/chain/identity/about-attestations.mdx +++ b/pages/chain/identity/about-attestations.mdx @@ -1,17 +1,17 @@ --- -title: About Attestations +title: About attestations lang: en-US description: Learn about building decentralized identity apps using Ethereum Attestation Service. --- import { Callout } from 'nextra/components' -# Build Decentralized Identity Apps with Attestations +# Build decentralized identity apps with attestations This guide explains how to build decentralized identity apps using attestations. It will define attestations and review the benefits of using Ethereum Attestation Service for Optimism developers. -## About Attestations +## About attestations Attestations are signed statements about a person, entity, or thing, made by an individual, company, or organization and are one of the building blocks of decentralized identity. @@ -20,7 +20,7 @@ You can think of Ethereum Attestation Service as a multiplayer database for stre ![attestation logo.](/img/op-mainnet/identity/atst-logo.png) -## Benefits of Using Ethereum Attestation Service +## Benefits of using Ethereum attestation service EAS makes it easy to sign any piece of data. In addition, here are a few key benefits: @@ -43,7 +43,7 @@ Here are some best practices to avoid violating users' privacy: Global data privacy laws are complex and multifaceted, and the violations of user privacy can have meaningful compliance as well as practical implications. -## Common Questions +## Common questions **Q: Are attestations replacements for verifiable credentials?** @@ -57,7 +57,7 @@ Here are some best practices to avoid violating users' privacy: **A:** Attestations have two key benefits over soulbound / non-transferable tokens: flexibility of whether the attestations is onchain or offchain and composability. While there is a canonical [decentralized schema registry for attestations](https://optimism.easscan.org/schemas), there is no central registry or specification for soulbound / non-transferable tokens which can lead to poor interoperability between systems and protocols. -## Next Steps +## Next steps Are you inspired and don't know what to build? We have a [project idea list](https://github.com/ethereum-optimism/ecosystem-contributions). Do you have a good idea, but you know you're not the right person to build it? Please open a PR on that list and suggest it. diff --git a/pages/chain/identity/applications.mdx b/pages/chain/identity/applications.mdx index 78cf5294e..7375f3a4b 100644 --- a/pages/chain/identity/applications.mdx +++ b/pages/chain/identity/applications.mdx @@ -4,11 +4,11 @@ lang: en-US description: Learn some of the applications that use attestations. --- -# Attestation Apps +# Attestation apps This guide lists some of the applications that use attestations. -## Ethereum Attestation Service +## Ethereum attestation service These are some of the applications that use the attestations: @@ -18,6 +18,6 @@ These are some of the applications that use the attestations: * [Optimist Profile](https://app.optimism.io/retropgf-signup): The Optimist Profile allows contributors to share the contributions and impact they've made to the Optimism Collective. * [Ethereum Ecosystem onchain reviews](https://www.ethereum-ecosystem.com/new-review): The goal of this Attestation-Based Dapp Rating web app is to allow anyone to review dApps and tools 100% onchain. -## Building with Attestations +## Building with attestations Are you building with attestations? Feel free to add your app to this page using the [attestation GitHub issue template](https://github.com/ethereum-optimism/docs/issues/new?assignees=\&labels=documentation%2Cattestation%2Ccommunity-request\&projects=\&template=suggest_attestation.yaml\&title=%5BATT%5D+Add+PR+title). diff --git a/pages/chain/identity/contracts-eas.mdx b/pages/chain/identity/contracts-eas.mdx index b501aa31a..9c6498d4d 100644 --- a/pages/chain/identity/contracts-eas.mdx +++ b/pages/chain/identity/contracts-eas.mdx @@ -4,12 +4,12 @@ lang: en-US description: Learn the basics of contracts for EAS, EAS contract addresses, and how to read and write attestations. --- -# EAS Contracts +# EAS contracts This guide covers [Ethereum Attestation Service ("EAS")](https://attest.sh/), an open-source public good that is included as a predeploy in the OP Stack. It also covers EAS contract addresses, how to read and write attestations, and indexing. -## EAS Contract Addresses +## EAS contract addresses The [Ethereum Attestation Service](https://docs.attest.sh/docs/welcome) is deployed on these addresses: @@ -18,7 +18,7 @@ The [Ethereum Attestation Service](https://docs.attest.sh/docs/welcome) is deplo | OP Sepolia | [0x4200000000000000000000000000000000000021](https://sepolia-optimism.etherscan.io/address/0x4200000000000000000000000000000000000021) | [0x4200000000000000000000000000000000000020](https://sepolia-optimism.etherscan.io/address/0x4200000000000000000000000000000000000020) | | OP Mainnet | [0x4200000000000000000000000000000000000021](https://optimistic.etherscan.io/address/0x4200000000000000000000000000000000000021) | [0x4200000000000000000000000000000000000020](https://optimistic.etherscan.io/address/0x4200000000000000000000000000000000000020) | -## How to Read and Write Attestations +## How to read and write attestations You can read and write attestations in several ways: @@ -35,6 +35,6 @@ Indexing is available via: * [Ponder graph](https://github.com/ethereum-attestation-service/eas-ponder-graph) * [Open source indexer](https://github.com/ethereum-attestation-service/eas-indexing-service) -## Next Steps +## Next steps For more information on working with attestations, see [Build Decentralized Identity Apps with Attestations](about-attestations). diff --git a/pages/chain/identity/individuals.mdx b/pages/chain/identity/individuals.mdx index 197cde2b5..4ed5e6965 100644 --- a/pages/chain/identity/individuals.mdx +++ b/pages/chain/identity/individuals.mdx @@ -4,11 +4,11 @@ lang: en-US description: Learn about how individual identity is represented in the Optimism Collective. --- -## Individual Identity +## Individual identity The Optimism Collective represents individuals using unique identifiers generated through the [Farcaster protocol id registry](https://docs.farcaster.xyz/reference/contracts/reference/id-registry). This system ensures a secure approach to identity management within the collective. -### Registering a User ID +### Registering a user ID To obtain a unique identifier: @@ -18,13 +18,13 @@ To obtain a unique identifier: * Creates a new custody address * Acts as a wallet -### Making Attestations +### Making attestations When you make attestations about individuals: * Leave the recipient address blank * Enter the users id into the attestation metadata -### Further Reading +### Further reading For more details on individual identity in the Optimism Collective, refer to the **[the governance docs](https://community.optimism.io/docs/identity/project-and-individual-identity-in-the-collective/#building-a-digital-identity)** on building a digital identity. diff --git a/pages/chain/identity/overview.mdx b/pages/chain/identity/overview.mdx index 236a11a9f..efa96fd28 100644 --- a/pages/chain/identity/overview.mdx +++ b/pages/chain/identity/overview.mdx @@ -1,5 +1,5 @@ --- -title: Identity Overview +title: Identity overview lang: en-US description: Learn about the basics of decentralized identity solutions. --- @@ -24,7 +24,7 @@ Decentralized identity expands the design space for innovation. It aims to give For more information about identity in the Optimism Collective, see [the governance docs post on the identity stack](https://community.optimism.io/docs/identity/project-and-individual-identity-in-the-collective/). -## Key Components of Identity +## Key components of identity There are three important components to identity within the Optimism Collective: @@ -38,7 +38,7 @@ Individuals and projects are the relevant entities in the Optimism Collective ab Decentralized identity not only supports democratic governance but also enhances innovation and individual financial control within the Optimism Collective ecosystem. -## Next Steps +## Next steps To learn more about identity in the Optimism Collective: diff --git a/pages/chain/identity/projects.mdx b/pages/chain/identity/projects.mdx index f3bca4d01..98ae2a849 100644 --- a/pages/chain/identity/projects.mdx +++ b/pages/chain/identity/projects.mdx @@ -11,15 +11,15 @@ Within the Optimism Collective, [the project entity](https://community.optimism. The project entity is represented onchain by an attestation from the [following schema](https://optimism.easscan.org/schema/view/0xff0b916851c1c5507406cfcaa60e5d549c91b7f642eb74e33b88143cae4b47d0). Projects are identified by the type "project". The attestation UID serves as the project's unique identifier throughout its lifecycle in the Collective. -## Project Metadata +## Project metadata All other project metadata is stored or referenced in the [Project Metadata Attestation](https://optimism.easscan.org/schema/view/0xe035e3fe27a64c8d7291ae54c6e85676addcbc2d179224fe7fc1f7f05a8c6eac). -### Updating Metadata +### Updating metadata * The Project Metadata Attestation is re-issued whenever there's a change in metadata. * Apps displaying project metadata should refer to the most recent attestation for up-to-date information. -## Further Reading +## Further reading For more information about identity in the Optimism Collective, see the [Identity Overview](/chain/identity/overview.mdx). diff --git a/pages/chain/identity/schemas.mdx b/pages/chain/identity/schemas.mdx index c11e46b87..e70a2b7e5 100644 --- a/pages/chain/identity/schemas.mdx +++ b/pages/chain/identity/schemas.mdx @@ -10,14 +10,14 @@ Schemas define the structure and type of data that can be included in an attesta Below you will find a list of relevant schemas that are being used on OP Mainnet. Schemas are built using the [Ethereum Attestation Service](https://docs.attest.sh/docs/welcome). -## General Schemas +## General schemas * **[Gitcoin Passport V1 scores schema UID](https://optimism.easscan.org/schema/view/0x6ab5d34260fca0cfcf0e76e96d439cace6aa7c3c019d7c4580ed52c6845e9c89):** `0x6ab5d34260fca0cfcf0e76e96d439cace6aa7c3c019d7c4580ed52c6845e9c89` * **[Superchain Faucet schema UID](https://optimism.easscan.org/schema/view/0x98ef220cd2f94de79fbc343ef982bfa8f5b315dec6a08f413680ecb7085624d7)**: `0x98ef220cd2f94de79fbc343ef982bfa8f5b315dec6a08f413680ecb7085624d7` ## Schemas related to project creation and Retro Funding application -### [Project and Organization identifier](https://optimism.easscan.org/schema/view/0xff0b916851c1c5507406cfcaa60e5d549c91b7f642eb74e33b88143cae4b47d0) +### [Project and organization identifier](https://optimism.easscan.org/schema/view/0xff0b916851c1c5507406cfcaa60e5d549c91b7f642eb74e33b88143cae4b47d0) Used as the unique identifier for projects and organizations created on or after 23 August 2024. For projects created earlier, please see the archived section at the bottom of this page. @@ -27,7 +27,7 @@ Used as the unique identifier for projects and organizations created on or after | farcasterID | The Farcaster id of the individual who created the project or organization | | type | "Project" or "Organization" | -### [Organization Metadata](https://optimism.easscan.org/schema/view/0xc2b376d1a140287b1fa1519747baae1317cf37e0d27289b86f85aa7cebfd649f) +### [Organization metadata](https://optimism.easscan.org/schema/view/0xc2b376d1a140287b1fa1519747baae1317cf37e0d27289b86f85aa7cebfd649f) Used to associate metadata to an organization. Re-issued each time there is a change to metadata @@ -43,7 +43,7 @@ Used to associate metadata to an organization. Re-issued each time there is a ch | metadataType | How the metadata can be accessed. 1 for ipfs, 2 for http | | metadataUrl | The storage location where the metadata can be retrieved | -### [Project Metadata](https://optimism.easscan.org/schema/view/0xe035e3fe27a64c8d7291ae54c6e85676addcbc2d179224fe7fc1f7f05a8c6eac) +### [Project metadata](https://optimism.easscan.org/schema/view/0xe035e3fe27a64c8d7291ae54c6e85676addcbc2d179224fe7fc1f7f05a8c6eac) Used to associate metadata to a project. Re-issued each time there is a change to metadata. @@ -59,7 +59,7 @@ Used to associate metadata to a project. Re-issued each time there is a change t | metadataType | How the metadata can be accessed. 1 for ipfs, 2 for http | | metadataUrl | The storage location where the metadata can be retrieved | -### [Retro Funding Application](https://optimism.easscan.org/schema/view/0x2169b74bfcb5d10a6616bbc8931dc1c56f8d1c305319a9eeca77623a991d4b80) +### [Retro funding application](https://optimism.easscan.org/schema/view/0x2169b74bfcb5d10a6616bbc8931dc1c56f8d1c305319a9eeca77623a991d4b80) Used to identify a project's application to a specific Retro Funding Round. This attestation is used for Retro Funding Round 6 and beyond. @@ -73,7 +73,7 @@ Used to identify a project's application to a specific Retro Funding Round. This | farcasterID | The individual that submitted this application on behalf of the project. | | metadataSnapshot RefUID | The project metadata at the time the application was submitted. | -### [Retro Funding Application Approval/Rejection](https://optimism.easscan.org/schema/view/0x683b1b399d47aabed79c9aa8f2674729021174b6e5cce1e20675eab404fc82d6) +### [Retro funding application approval/rejection](https://optimism.easscan.org/schema/view/0x683b1b399d47aabed79c9aa8f2674729021174b6e5cce1e20675eab404fc82d6) Used to identify which Retro Funding applications have been approved or rejected. @@ -85,7 +85,7 @@ Used to identify which Retro Funding applications have been approved or rejected | Status | The status of the Retro Funding application. | | Reason | Identifier for the reason an application was rejected. 1 = "Duplicate Application", 2 = "Deceiving Badgeholders", 3 = "Spam", 4 = "Not meeting eligibility criteria" | -### [Retro Funding Rewards](https://optimism.easscan.org/schema/view/0x670ad6e6ffb842d37e050ea6d3a5ab308195c6f584cf2121076067e0d8adde18) +### [Retro funding rewards](https://optimism.easscan.org/schema/view/0x670ad6e6ffb842d37e050ea6d3a5ab308195c6f584cf2121076067e0d8adde18) Used to identify the reward amount each approved project received in a Retro Funding round @@ -109,7 +109,7 @@ Citizen attestations were first issued in Season 6 and are used to represent Cit | FarcasterID | The Citizen's unique identifier | | SelectionMethod | A Code representing the method through which the Citizen was selected. Codes beginning with the number 1 refer to various flavours of Web of Trust selection. | -### [Retro Funding Voters](https://optimism.easscan.org/schema/view/0x41513aa7b99bfea09d389c74aacedaeb13c28fb748569e9e2400109cbe284ee5) +### [Retro funding voters](https://optimism.easscan.org/schema/view/0x41513aa7b99bfea09d389c74aacedaeb13c28fb748569e9e2400109cbe284ee5) These attestations are voting Badges issued for Retro Round 5 and beyond. They are different from the [previous schema](https://optimism.easscan.org/schema/view/0xfdcfdad2dbe7489e0ce56b260348b7f14e8365a8a325aef9834818c00d46b31b) to include new fields like votingGroup, used to assign voters to sub-categories in the round. @@ -121,7 +121,7 @@ These attestations are voting Badges issued for Retro Round 5 and beyond. They a | votingGroup | Used to assign voters to subcategories in case the Round has subcategories | | selectionMethod | The method in which this voter was selected | -### [Retro Funding Governance contribution](https://optimism.easscan.org/schema/view/0x3743be2afa818ee40304516c153427be55931f238d961af5d98653a93192cdb3) +### [Retro funding governance contribution](https://optimism.easscan.org/schema/view/0x3743be2afa818ee40304516c153427be55931f238d961af5d98653a93192cdb3) | Schema UID | `0x3743be2afa818ee40304516c153427be55931f238d961af5d98653a93192cdb3` | | ---------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | @@ -142,11 +142,11 @@ Issued to those who held governance roles in the Collective, such as Grants Coun | govSeason | The season the individual held the role | | govRole | The role held by the individual | -## Archived Schemas +## Archived schemas These schemas are no longer being actively issued, but capture valuable historical data. -### [Retro Funding Application](https://optimism.easscan.org/schema/view/0x88b62595c76fbcd261710d0930b5f1cc2e56758e155dea537f82bf0baadd9a32) +### [Retro funding application](https://optimism.easscan.org/schema/view/0x88b62595c76fbcd261710d0930b5f1cc2e56758e155dea537f82bf0baadd9a32) Used to identify a project's application to a specific Retro Funding Round. This attestation was used for Retro Funding Rounds 4 and 5. @@ -159,7 +159,7 @@ Used to identify a project's application to a specific Retro Funding Round. This | farcasterID | The individual that submitted this application on behalf of the project. | | metadataSnapshot RefUID | The project metadata at the time the application was submitted. | -### [Retro Funding Badgeholders](https://optimism.easscan.org/schema/view/0xfdcfdad2dbe7489e0ce56b260348b7f14e8365a8a325aef9834818c00d46b31b) +### [Retro funding badgeholders](https://optimism.easscan.org/schema/view/0xfdcfdad2dbe7489e0ce56b260348b7f14e8365a8a325aef9834818c00d46b31b) These attestations are considered "voting Badges" and allow an individual to vote in any given iteration of Retro Funding. They were used up to and including Retro Round 4. @@ -171,7 +171,7 @@ These attestations are considered "voting Badges" and allow an individual to vot | referredBy | In early rounds, new Badges were issued by referral. This field captures the address of the referrer, if there was one | | referredMethod | If this voting Badge was issued by referral, this field captures the referral method | -### [Project Identifier](https://optimism.easscan.org/schema/view/0x7ae9f4adabd9214049df72f58eceffc48c4a69e920882f5b06a6c69a3157e5bd) +### [Project identifier](https://optimism.easscan.org/schema/view/0x7ae9f4adabd9214049df72f58eceffc48c4a69e920882f5b06a6c69a3157e5bd) Used as the unique identifier for projects created in the Collective before 23 August 2024. Attestations issued from this schema prior to 23 August 2024 are still used as the unique identifier for projects. New projects created after 23 August 2024 use the new entity identifier (see above). @@ -187,7 +187,7 @@ Used as the unique identifier for projects created in the Collective before 23 A * **[Season 4 Co-grant participant schema UID](https://optimism.easscan.org/schema/view/0x401a80196f3805c57b00482ae2b575a9f270562b6b6de7711af9837f08fa0faf)**: `0x401a80196f3805c57b00482ae2b575a9f270562b6b6de7711af9837f08fa0faf`. Important: Remember to verify the attester address is `0x3C7820f2874b665AC7471f84f5cbd6E12871F4cC` or `0x2a0eB7cAE52B68e94FF6ab0bFcf0dF8EeEB624be` * **[Optimist Profile schema UID](https://optimism.easscan.org/schema/view/0xac4c92fc5c7babed88f78a917cdbcdc1c496a8f4ab2d5b2ec29402736b2cf929):** `​​0xac4c92fc5c7babed88f78a917cdbcdc1c496a8f4ab2d5b2ec29402736b2cf929` -## Next Steps +## Next steps * For more information on working with attestations, see [Build Decentralized Identity Apps with Attestations](/chain/identity/about-attestations). * To see a list of applications using EAS, see [Attestation Apps](/chain/identity/applications). diff --git a/pages/chain/networks.mdx b/pages/chain/networks.mdx index 3fc2c7369..a7e97799d 100644 --- a/pages/chain/networks.mdx +++ b/pages/chain/networks.mdx @@ -1,12 +1,12 @@ --- -title: OP Networks and Public RPC Endpoints +title: OP networks and public RPC endpoints lang: en-US description: Learn about the different OP networks and public RPC endpoints. --- import { Callout } from 'nextra/components' -# OP Networks and Public RPC Endpoints +# OP networks and public RPC endpoints This reference guide provides a listing of the different OP networks and public RPC endpoints. diff --git a/pages/chain/security/faq.mdx b/pages/chain/security/faq.mdx index b000bb446..78b95d2af 100644 --- a/pages/chain/security/faq.mdx +++ b/pages/chain/security/faq.mdx @@ -1,24 +1,24 @@ --- -title: OP Mainnet Security Model +title: OP Mainnet security model lang: en-US description: Learn about the OP Mainnet security model and answers to common questions. --- import { Callout } from 'nextra/components' -# OP Mainnet Security Model +# OP Mainnet security model OP Mainnet is a work in progress. Constant, iterative improvement of the security mechanisms that safeguard OP Mainnet users is a top priority for the entire [Optimism Collective](https://community.optimism.io/docs/governance/). The Optimism Collective strives to be clear and transparent about the security of OP Mainnet and the OP Stack as a whole. -## Bottom Line +## Bottom line The security model of any blockchain system is only as strong as its lowest common denominator. At the moment, **it's important to understand that the security of OP Mainnet is dependent on a [multisig](https://etherscan.io/address/0x5a0Aae59D09fccBdDb6C6CcEB07B7279367C3d2A)** managed jointly by the [Optimism Security Council](https://gov.optimism.io/t/intro-to-optimisms-security-council/6885) and the Optimism Foundation. OP Mainnet and the OP Stack in general **may also contain unknown bugs that could lead to the loss of some or all of the ETH or tokens held within the system**. -## OP Mainnet Multisig +## OP Mainnet multisig The security of OP Mainnet is currently dependent on a multisig managed jointly by the [Optimism Security Council](https://gov.optimism.io/t/intro-to-optimisms-security-council/6885) and the Optimism Foundation. This multisig is a [2-of-2 nested multisig](https://etherscan.io/address/0x5a0Aae59D09fccBdDb6C6CcEB07B7279367C3d2A) which is in turn governed by a [10-of-13 multisig](https://etherscan.io/address/0xc2819DC788505Aac350142A7A707BF9D03E3Bd03) managed by the Optimism Security Council and a [5-of-7 multisig](https://etherscan.io/address/0x847B5c174615B1B7fDF770882256e2D3E95b9D92) managed by the Optimism Foundation. @@ -26,7 +26,7 @@ This multisig is a [2-of-2 nested multisig](https://etherscan.io/address/0x5a0Aa This multisig can be used to upgrade core OP Mainnet smart contracts **without upgrade delays** to allow for quick responses to potential security concerns. All upgrades to the OP Mainnet system must be approved by both component multisigs and either can veto an upgrade. -## Fault Proofs +## Fault proofs It is important to understand that **fault proofs are not a silver bullet** and that **fault proofs provide limited improvements to the security of a system if the system still has a multisig or security council that can instantly upgrade the system**. @@ -44,21 +44,21 @@ Although the fault proof game is permissionless, the Optimism Security Council a Each proposal must wait for a delay period during which the Guardian can prevent invalid proposals from being used to withdraw ETH or tokens through a number of safety hatches. The Guardian can also choose to shift the system to use a `PermissionedDisputeGame` in which only specific `PROPOSER` and `CHALLENGER` roles can submit and challenge proposals. -## Bugs and Unknowns +## Bugs and unknowns Please also keep in mind that just like any other system, **the Optimism codebase may contain unknown bugs** that could lead to the loss of some or all of the ETH or tokens held within the system. The OP Stack has been audited [on many occasions](https://github.com/ethereum-optimism/optimism/tree/v1.1.4/technical-documents/security-reviews), but **audits are not a stamp of approval** and **a completed audit does not mean that the audited codebase is free of bugs.** It's important to understand that using OP Mainnet inherently exposes you to the risk of bugs within the Optimism codebase, and that you use OP Mainnet at your own risk. -## Work in Progress +## Work in progress -### Sequencer Decentralization +### Sequencer decentralization The Optimism Foundation currently operates the sole sequencer on OP Mainnet. Although users can always bypass the Sequencer by sending transactions directly to the [`OptimismPortal`](https://github.com/ethereum-optimism/optimism/blob/5877ee24cc9aaef5848c1372e0e196707fb336a0/packages/contracts-bedrock/src/L1/OptimismPortal.sol) contract, sequencer decentralization can still help mitigate the effect of short-term outages for users. -## Security Model FAQ +## Security model FAQ ### Does OP Mainnet have fault proofs? diff --git a/pages/chain/security/security-policy.mdx b/pages/chain/security/security-policy.mdx index 3434d8664..85a776ff4 100644 --- a/pages/chain/security/security-policy.mdx +++ b/pages/chain/security/security-policy.mdx @@ -1,12 +1,12 @@ --- -title: Security Policy and Bug Bounty Program +title: Security policy and bug bounty program lang: en-US description: Learn about the bug bounty program and best practices for reporting bugs in OP Stack and OP Mainnet codebase. --- import { Callout } from 'nextra/components' -# Security Policy and Bug Bounty Program +# Security policy and bug bounty program This page describes general best practices for reporting bugs and provides specific reporting guidelines for OP Stack and OP Mainnet code contained within the [ethereum-optimism](https://github.com/ethereum-optimism) GitHub organization. @@ -17,24 +17,24 @@ This page describes general best practices for reporting bugs and provides speci * **Do not** test the vulnerability on a publicly available network, either the testnet or the mainnet. -## Optimism Bug Bounty Program +## Optimism bug bounty program The Optimism Bug Bounty Program offers up to [$2,000,042](https://immunefi.com/bounty/optimism/) for critical vulnerabilities found in the OP Mainnet codebase. Below you can find information about the various available bug bounty programs and how to report bugs that are not covered by an existing bounty. -### Main Bounty Page +### Main bounty page Optimism has a very detailed [Bug Bounty Page on Immunefi](https://immunefi.com/bounty/optimism/). In the listing you can find all the information relating to components in scope, reporting, and the payout process. -### Unscoped Bugs +### Unscoped bugs If you think you have found a significant bug or vulnerabilities in OP Stack smart contracts, infrastructure, etc., even if that component is not covered by an existing bug bounty, please report it to via the [OP Mainnet Immunefi program](https://immunefi.com/bounty/optimism/). The impact of any and all reported issues will be considered and the program has previously rewarded security researchers for bugs not within its stated scope. -## Reporting Other Vulnerabilities +## Reporting other vulnerabilities For vulnerabilities in any websites, email servers, or other non-critical infrastructure within the OP Stack, please contact the Foundation's service provider at [security@oplabs.co](mailto:security@oplabs.co) and include detailed instructions for confirming and reproducing the vulnerability. -### Vulnerability Disclosure +### Vulnerability disclosure Each OP Stack component maintainer may determine its own process for vulnerability disclosure. However, the following describes a recommended process for disclosure. @@ -46,7 +46,7 @@ In such a scenario, the disclosure process used is as follows: 2. After 4-8 weeks, disclose that release X contained a security fix. 3. After an additional 4-8 weeks, publish details of the vulnerability, along with credit to the reporter (with express permission from the reporter). -### Rights of Maintainers +### Rights of maintainers Alongside this policy, maintainers also reserve the right to: diff --git a/pages/chain/testing/dev-node.mdx b/pages/chain/testing/dev-node.mdx index d6887e4b6..477176e7d 100644 --- a/pages/chain/testing/dev-node.mdx +++ b/pages/chain/testing/dev-node.mdx @@ -1,12 +1,12 @@ --- -title: Running a Local Development Environment +title: Running a local development environment lang: en-US description: Learn how to setup and run a local development environment of the entire OP Mainnet system. --- import { Steps, Callout, Tabs } from 'nextra/components' -# Running a Local Development Environment +# Running a local development environment This tutorial teaches you how to setup and run a local development environment of the entire OP Mainnet system. @@ -39,7 +39,7 @@ Before you begin, ensure you have the following components installed on your sys - ### Ubuntu Installation + ### Ubuntu installation These instructions were verified on Ubuntu 22.04 LTS. Other versions may require slight modifications. @@ -54,7 +54,7 @@ Before you begin, ensure you have the following components installed on your sys - ### Mac Installation + ### Mac installation * [Install Homebrew]( https://brew.sh/) (if not already installed): diff --git a/pages/chain/testing/testing-apps.mdx b/pages/chain/testing/testing-apps.mdx index 86e9cd3e0..2eac879a2 100644 --- a/pages/chain/testing/testing-apps.mdx +++ b/pages/chain/testing/testing-apps.mdx @@ -1,10 +1,10 @@ --- -title: Testing Apps for OP Mainnet +title: Testing apps for OP Mainnet lang: en-US description: Learn best practices for OP Mainnet testing. --- -# Testing Apps for OP Mainnet +# Testing apps for OP Mainnet For the most part, running applications on OP Mainnet is identical to running them on Ethereum, so the testing is identical too. In this guide, you learn the best practices for OP Mainnet testing where there are differences. diff --git a/pages/chain/tokenlist.mdx b/pages/chain/tokenlist.mdx index 4b590e43c..ac2301614 100644 --- a/pages/chain/tokenlist.mdx +++ b/pages/chain/tokenlist.mdx @@ -1,5 +1,5 @@ --- -title: Bridged Token Addresses +title: Bridged token addresses lang: en-US description: This reference guide lists the correct bridged token addresses for each token. --- @@ -7,7 +7,7 @@ description: This reference guide lists the correct bridged token addresses for import { Callout } from 'nextra/components' import { TokenListTable } from '@/components/TokenListTable' -# Bridged Token Addresses +# Bridged token addresses Various ERC-20 tokens originally deployed to Ethereum also have corresponding "bridged" representations on OP Mainnet. The [Superchain Token List](https://github.com/ethereum-optimism/ethereum-optimism.github.io) exists to help users discover the correct bridged token addresses for each token. diff --git a/pages/connect/contribute/docs-contribute.mdx b/pages/connect/contribute/docs-contribute.mdx index bfe48b94d..d29189de3 100644 --- a/pages/connect/contribute/docs-contribute.mdx +++ b/pages/connect/contribute/docs-contribute.mdx @@ -1,5 +1,5 @@ --- -title: Ways to Contribute to Optimism Docs +title: Ways to contribute to Optimism Docs lang: en-US description: Learn about the different ways you can contribute to Optimism Docs. --- @@ -89,6 +89,6 @@ We use GitPOAPs to recognize our contributors! GitPOAP automatically recognizes You should only use self-custody wallets to claim POAPs. Do not use exchange accounts or other accounts you do not hold the private keys to, as these will not allow you to access and manage your POAPs. -## Still Have Questions? +## Still have questions? You can reach us in our developer support [forum](https://github.com/ethereum-optimism/developers/discussions). We look forward to growing the Collective with you! diff --git a/pages/connect/contribute/stack-contribute.mdx b/pages/connect/contribute/stack-contribute.mdx index 159cdc5aa..22fec79f0 100644 --- a/pages/connect/contribute/stack-contribute.mdx +++ b/pages/connect/contribute/stack-contribute.mdx @@ -14,12 +14,12 @@ The Optimism Collective wins when it works together. ♥️✨ Whether you're a budding chain operator, app developer, node operator, bounty hunter, content creator, or anything in between, the OP Stack always has something for you to contribute to. Every contribution makes a difference — no contribution is too small. If you're ready to contribute, check out one of the following contributor pathways below. -## Component Contributions +## Component contributions The OP Stack is a decentralized development stack and is constantly evolving as new layers and modules are developed. Anyone can contribute components that can be considered part of the OP Stack as long as those components fit the stack's [design principles and goals](/stack/design-principles). To start contributing components to the stack, check out some of these [useful ideas](https://github.com/ethereum-optimism/ecosystem-contributions) and get to building! And don't forget that projects can also receive grants from the Collective via [RetroPGF](https://community.optimism.io/docs/citizen-house/how-retro-funding-works/). -## Codebase Contributions +## Codebase contributions The OP Stack codebase is not a product (in the traditional sense) but rather a collection of software components that power the Optimism ecosystem. If you'd like to contribute to the current release of OP Stack codebase, rather than creating new components, your contribution would be greatly appreciated. @@ -33,15 +33,15 @@ To make your first contribution to the codebase, check out the [open issues](htt Developer support for OP Stack Hacks is limited — when in doubt, stick to the capabilities of the current release! -## Bounty Hunting +## Bounty hunting The OP Stack needs YOU (yes you!) to help review the codebase for bugs and vulnerabilities. If you're interested in bounty hunting, check out our [Security Policy, Vulnerability Reporting, and Bug Bounties page](/chain/security/security-policy). -## Docs Contributions +## Docs contributions Want a new tutorial? See something that could be a little clearer? Check out the [Optimism Docs Contribution page](docs-contribute) for more information on how to help. No contribution is too small! -## Community Contributions +## Community contributions If you're looking for other ways to get involved, here are a few options: diff --git a/pages/connect/contribute/style-guide.mdx b/pages/connect/contribute/style-guide.mdx index ddeead204..cb77ffb88 100644 --- a/pages/connect/contribute/style-guide.mdx +++ b/pages/connect/contribute/style-guide.mdx @@ -1,5 +1,5 @@ --- -title: Optimism Docs Style Guide +title: Optimism Docs style guide lang: en-US description: This guide explains how to write technical content for Optimism Docs using a consistent voice, tone, and style. --- @@ -97,7 +97,7 @@ See below for when to use title or sentence case. When creating content, ensure it is accessible to screen-reader users, visually impaired individuals, and those using a mouse or keyboard. For more information regarding accessibility guidelines, see [W3C Web Content Accessibility Guidelines 2.0](http://www.w3.org/TR/UNDERSTANDING-WCAG20/Overview.html#contents). -### Alt-Text +### Alt-text * Provide alt text for all images so that the screen reader can interpret the purpose of the image and convey that to the user. The alt text should include any content shown in the image so that screen reader can read it to the user. * Provide alt text for videos by modifying the title attribute of any embedded video content or iframe. The title attribute serves as the alt text for screen readers to provide descriptive information. Video content with speaking or narration must include closed captions. @@ -175,7 +175,7 @@ We aim to use consistent organization that is also user-centered and accessible. * H4 headings are reserved (at this time) for glossary terms. This standardization will make it easier for us to extend glossary functionality across the docs in the future, such as tool tips. -### Listing prerequisites (Before you begin) +### Listing prerequisites (before you begin) * Add a "Before You Begin" section at the top of the document if there are tasks a user needs to complete before continuing with the current task, e.g. installing a module, downloading a software update, etc. * Use the title "Before You Begin"and format as H2. It should follow the page overview/intro section or table of contents. diff --git a/pages/connect/resources/glossary.mdx b/pages/connect/resources/glossary.mdx index 22a920398..9261933f2 100644 --- a/pages/connect/resources/glossary.mdx +++ b/pages/connect/resources/glossary.mdx @@ -10,16 +10,16 @@ import { Callout } from 'nextra/components' The glossary provides definitions of important terminology used throughout the Optimism Developer Documentation. To make revisions to this page, please [submit an issue](https://github.com/ethereum-optimism/docs/issues/new?assignees=\&labels=glossary%2Cdocumentation%2Ccommunity-request\&projects=\&template=suggest_glossary_term.yaml\&title=%5BGLOSSARY%5D+Add+PR+title). -## Table of Contents +## Table of contents * [General Terms](#general-terms) * [OP Profile & Identity](#op-profile--identity) * [OP Stack & OP Superchain](#op-stack--op-superchain) * [Protocol](#protocol) -## General Terms +## General terms -#### Address Aliasing +#### Address aliasing When a contract submits a [deposit](#deposit) from L1 to L2, it's address (as returned by `ORIGIN` and `CALLER`) will be aliased with a modified representation of the address of a contract. @@ -30,7 +30,7 @@ A sequential list of transactions, along with a couple of properties stored in t It is useful to distinguish between input block properties, which are known before executing the transactions in the block, and output block properties, which are derived after executing the block's transactions (e.g., [Merkle Patricia Trie roots](#merkle-patricia-trie)). -#### Block Time +#### Block time L2 block time is 2 seconds, meaning there is an L2 block at every 2s [time slot](#time-slot). *Post-merge*, it could be said the that L1 block time is 12s as that is the L1 [time slot](#time-slot). However, in @@ -43,11 +43,11 @@ Delegates are individuals who have volunteered to actively participate in the go By delegating your voting power, you enable these delegates to vote on governance matters on your behalf, while you retain full ownership of your tokens and the freedom to use them as you wish. You can also change your chosen delegate at any time, allowing for flexibility in how your voting power is represented in the governance process. -#### EOA or Externally Owned Account +#### EOA or externally owned account Ethereum term to designate addresses operated by users, as opposed to contract addresses. -#### Execution Engine +#### Execution engine Responsible for executing transactions in blocks and computing the resulting state roots, receipts roots, and block hash. Both L1 (*post-merge*) and L2 have an execution engine. On L1, the executed blocks can @@ -55,14 +55,14 @@ come from L1 block synchronization or from a block freshly minted by the executi at the request of the L1 consensus layer. On L2, the executed blocks are freshly minted by the execution engine at the request of the [rollup node](#rollup-node), using transactions [derived from L1 blocks](#l2-chain-derivation). -#### Optimism Collective +#### Optimism collective The Optimism Collective is a band of people, projects, and companies working together to build a better economy for everyone, united by a mutually beneficial pact to adhere to the axiom of impact=profit — the principle that positive impact to the collective should be rewarded with profit to the individual. New model of digital democratic governance optimized to drive rapid and sustained growth of a decentralized ecosystem. -#### OP Token +#### OP token A governance token, referred to as "OP." Content should not discuss the token price or speculate on the price, and content that refers to OP incorrectly will be removed from Optimism platforms and will not be eligible for promotion. @@ -74,19 +74,19 @@ Refers the Ethereum blockchain, used in contrast to [layer 2](#layer-2-l2), whic Refers to the Optimism blockchain and is used in contrast to [layer 1](#layer-1-l1), which refers to the Ethereum blockchain. -#### L2 Output Root +#### L2 output root 32 byte value which serves as a commitment to the current state of the L2 chain. -#### L2 Output Oracle Contract +#### L2 output oracle contract L1 contract to which [L2 output roots](#l2-output-root) are posted by the [sequencer](#sequencer). -#### Predeployed Contract +#### Predeployed contract A contract placed in the L2 genesis state (i.e. at the start of the chain). -#### PGA or Priority Gas Auction +#### PGA or priority gas auction Transactions in ethereum are ordered by the price that the transaction pays to the miner. Priority Gas Auctions (PGAs) occur when multiple parties are competing to be the first transaction in a block. Each party continuously @@ -113,7 +113,7 @@ The rollup node receives L2 transactions from users, which it uses to create L2 then submitted to a [data availability provider](#data-availability-provider) via [batch submission](#batch-submission). The L2 chain derivation then acts as a sanity check and a way to detect L1 chain re-orgs. -#### Time Slot +#### Time slot On L2, there is a block every 2 second (this duration is known as the [block time](#block-time)). We say that there is a "time slot" every multiple of 2s after the timestamp of the [L2 genesis block](#l2-genesis-block). @@ -140,7 +140,7 @@ behavior. A rollup node running in validator mode is sometimes called *a replica \[[return to top](#table-of-contents)] -## OP Profile & Identity +## OP profile & identity #### Attestations @@ -167,7 +167,7 @@ A system that enables individuals to have greater control and ownership over the In decentralized identity, personal information is stored on a blockchain or other decentralized system, and individuals have the ability to grant or revoke access to their data as they see fit. This allows for greater privacy, security, and control over personal information. -#### Ethereum Attestation Service (EAS) +#### Ethereum attestation service (EAS) An Ethereum infrastructure public good for making attestations on or off-chain about anything. @@ -183,19 +183,19 @@ A decentralized model used to establish trust among participants in a network. I ## OP Stack & OP Superchain -#### Attestation-Based Fault Proof +#### Attestation-based fault proof A fault proof where challenges can be successfully made by supplying an [attestation proof](#attestation-proof) which disagrees with the original withdrawal claim. -#### Attestation-Based Validity Proof +#### Attestation-based validity proof A validity proof which can be verified by supplying an [attestation proof](#attestation-proof) which agrees with the withdrawal claim. -#### Attestation Proof +#### Attestation proof A proof which consists of some number of signatures from a pre-agreed upon set of chain attestors. -#### Cannon Fault Proof +#### Cannon fault proof A fault proof where challenges are evaluated using an onchain game which is guaranteed to result in a truthful outcome, given economic rationality assumptions. @@ -203,33 +203,33 @@ A fault proof where challenges are evaluated using an onchain game which is guar A state [transition system](https://en.wikipedia.org/wiki/Transition_system) consisting of an initial state, a state transition function, and a list of inputs (transactions)—which is cryptographically committed to and can be independently replicated with commodity computer hardware and internet connection. -#### Chain Proof +#### Chain proof Difficult to forge evidence of the validity of a particular withdrawal claim. Proofs are commonly used to enable chains to communicate with each other. -#### Challenge Period +#### Challenge period The window of time in which a challenge can be made to disprove a fault proof. -#### Fault Proof +#### Fault proof A proof which relies on the absence of counter-evidence to prove correctness. -#### L1 Origin +#### L1 origin the L1 origin of an L2 block is the L1 block corresponding to its [sequencing epoch](#sequencing-epoch). -#### Merkle Patricia Trie +#### Merkle patricia trie sparse [trie](https://en.wikipedia.org/wiki/Trie), which is a tree-like structure that maps keys to values. The root hash of a MPT is a commitment to the contents of the tree, which allows a proof to be constructed for any key-value mapping encoded in the tree. Such a proof is called a Merkle proof, and can be verified against the Merkle root. -#### Modular Proof +#### Modular proof The ability to use multiple proof systems for the same OP Chain. For instance, it should be possible to prove an OP Chain using a fault proof or a validity proof. -#### Modular Sequencing +#### Modular sequencing The ability to configure the sequencer address during OP Chain deployment. This value can be configured by the OP Chain deployer. diff --git a/pages/stack/components.mdx b/pages/stack/components.mdx index a6228362e..fb3ad07f6 100644 --- a/pages/stack/components.mdx +++ b/pages/stack/components.mdx @@ -1,12 +1,12 @@ --- -title: OP Stack Components +title: OP Stack components lang: en-US description: Learn about OP Stack components including the different layers and modules available for development. --- import { Callout } from 'nextra/components' -# OP Stack Components +# OP Stack components **The OP Stack is a common development stack for building L2 blockchain ecosystems, built by the Optimism Collective to power Optimism.** @@ -22,7 +22,7 @@ This doesn't include all of the modules or layers that may exist in the future, ## Layers -### Data Availability +### Data availability The Data Availability Layer defines where the raw inputs to an OP Stack based chain are published. An OP Stack chain can use a single Data Availability module to source its input data. Because an OP Stack chain is derived from the Data Availability Layer, the Data Availability module used has a significant impact on the security model of a system. For example, if a certain piece of data can no longer be retrieved from the Data Availability Layer, it may not be possible to sync the chain. @@ -37,11 +37,11 @@ Ethereum DA is currently the most widely used Data Availability module for the O The Sequencing Layer determines how user transactions on an OP Stack chain are collected and published to the Data Availability Layer module(s) in use. In the default Rollup configuration of the OP Stack, Sequencing is typically handled by a single dedicated Sequencer. Rules defined in the Derivation Layer generally restrict the Sequencer's ability to withhold transactions for more than a specific period of time. In the future, Sequencing will be modular such that chains can easily select and change the mechanism that controls their current Sequencer. -#### Single Sequencer +#### Single sequencer The default Sequencer module for the OP Stack is the Single Sequencer module in which a dedicated actor is given the ability to act as the Sequencer. The Single Sequencer module allows a governance mechanism to determine who may act as the Sequencer at any given time. -#### Multiple Sequencer +#### Multiple sequencer A simple modification to the Single Sequencer module is the Multiple Sequencer module in which the Sequencer at any given time is selected from a pre-defined set of possible actors. Individual OP Stack based chains would be able to determine the exact mechanism that defines the set of possible Sequencers and the mechanism that selects a Sequencer from the set. @@ -71,7 +71,7 @@ The EVM is an Execution Layer module that uses the same state representation and * [Specifications](https://specs.optimism.io/protocol/exec-engine.html) (where it differs from [geth](https://geth.ethereum.org/)) * [Source code](https://github.com/ethereum-optimism/op-geth/tree/09ade3df6d1d3a4f8f308553825348be132bc960) -### Settlement Layer +### Settlement layer The Settlement Layer is a mechanism on external blockchains that establish a **view** of the state of an OP Stack chain (target) on those external, third-party chains (including other OP Stack chains). For each target chain, there may be one or more Settlement mechanisms on one or more external chains. Settlement Layer mechanisms are **read-only** and allow a third-party chain to make decisions, potentially impacting their own state, based on the state of the target OP Stack chain. @@ -79,7 +79,7 @@ The term "Settlement Layer" has its origins in the fact that Settlement Layer me Once a transaction is published and finalized on the corresponding Data Availability layer, the transaction is also finalized on the OP Stack chain. Short of breaking the underlying Data Availability layer, it can no longer be modified or removed. It may not be accepted by the Settlement Layer yet because the Settlement Layer needs to be able to verify transaction *results*, but the transaction itself is already immutable. -#### Attestation-based Fault Proof +#### Attestation-based fault proof An Attestation-based Fault Proof mechanism uses an optimistic protocol to establish a view of an OP Stack chain. In optimistic settlement mechanisms generally, **Proposer** entities can propose what they believe to be the current valid state of the OP Stack chain. If these proposals are not invalidated within a certain period of time (the "challenge period"), then the proposals are assumed by the mechanism to be correct. In the Attestation Proof mechanism in particular, a proposal can be invalidated if some threshold of pre-defined parties provide attestations to a valid state that is different than the state in the proposal. This places a trust assumption on the honesty of at least a threshold number of the pre-defined participants. @@ -98,10 +98,10 @@ A Validity Proof Settlement mechanism uses a mathematical proof to attest to the The Governance Layer refers to the general set of tools and processes used to manage system configuration, upgrades, and design decisions. This is a relatively abstract layer that can contain a wide range of mechanisms on a target OP Stack chain and on third-party chains that impact many of the other layers of the OP Stack. -#### MultiSig Contracts +#### MultiSig contracts MultiSig Contracts are smart contracts that carry out actions when they receive a threshold of signatures from some pre-defined set of participants. These are often used to manage upgrades of components of an OP Stack based system. Currently, this is the mechanism used to manage upgrades of the bridge contracts on OP Mainnet. The security of a MultiSig Contract system depends on many different factors, including the number of participants, the threshold, and the safety procedures of each individual participant. -#### Governance Tokens +#### Governance tokens Governance Tokens are widely used to decentralize decision making. Although the exact functionality of a Governance Token varies on a case-by-case basis, the most common mechanisms allow token holders to vote on some subset of decisions that a project must make. Voting can either be carried out directly or via delegation. diff --git a/pages/stack/design-principles.mdx b/pages/stack/design-principles.mdx index 3ad07f00c..d18a01b23 100644 --- a/pages/stack/design-principles.mdx +++ b/pages/stack/design-principles.mdx @@ -1,16 +1,16 @@ --- -title: Design Philosophy & Design Principles +title: Design philosophy & design principles lang: en-US description: Learn the design philosophy and design principles for contributing to the OP Stack. --- import { Callout } from 'nextra/components' -# Design Philosophy & Design Principles +# Design philosophy & design principles This guide covers design philosophy and design principles for contributing to the OP Stack. -## Design Philosophy +## Design philosophy OP Stack is built according to a strong design philosophy that stands on four main pillars: **simplicity**, **pragmatism**, **sustainability**, and, of course, **optimism**. It's important to understand these pillars as they heavily influence the design of Optimism as a whole. @@ -69,7 +69,7 @@ We keep this in mind whenever we're creating new features or trying to simplify Optimism is as close to Ethereum as possible not only for pragmatic reasons, but because Optimism exists so that Ethereum can succeed. We hope that you can see the influence of this philosophy when looking at Optimism's design. -## Design Principles for USEful Software +## Design principles for USEful software The OP Stack is USEful software. The OP Stack is a set of software components for building L2 blockchain ecosystems, built by the Optimism Collective to power Optimism. Components to be added to the OP Stack should be built according to three key design principles: **U**tility, **S**implicity, **E**xtensibility. diff --git a/pages/stack/differences.mdx b/pages/stack/differences.mdx index ec6ec411f..85e10a265 100644 --- a/pages/stack/differences.mdx +++ b/pages/stack/differences.mdx @@ -20,7 +20,7 @@ However, there are some minor differences between the behavior of Ethereum and O | `ORIGIN` | `tx.origin` | If the transaction is an L1 ⇒ L2 transaction triggered by a smart contract on L1, then `tx.origin` is set to the [aliased address](#address-aliasing) of the address that triggered the L1 ⇒ L2 transaction. Otherwise, this opcode behaves normally. | | `CALLER` | `msg.sender` | If the transaction is an L1 ⇒ L2 transaction triggered by a smart contract on L1, and this is the first call frame (rather than an internal transaction from one contract to another), the same [address aliasing](#address-aliasing) behavior applies. | -### Address Aliasing +### Address aliasing Address aliasing is an important security feature that impacts the behavior of transactions sent from L1 to L2 by smart contracts. @@ -50,7 +50,7 @@ In all other cases, the transaction sender address is set according to the same ## Transactions -### Transaction Fees +### Transaction fees Transactions on OP Stack chains must pay for an [L1 data fee](/stack/transactions/fees#the-l1-data-fee) on top of the standard [execution gas fee](/stack/transactions/fees#execution-gas-fee) you would expect on Ethereum. Refer to the guide on [OP Stack Transaction Fees](/stack/transactions/fees) for more information. @@ -60,7 +60,7 @@ Refer to the guide on [OP Stack Transaction Fees](/stack/transactions/fees) for The base fee on OP Stack is, like Ethereum, computed via the [EIP-1559](https://notes.ethereum.org/@vbuterin/eip-1559-faq) mechanism. The EIP-1559 parameters used by OP Stack differ per chain. -### Mempool Rules +### Mempool rules By default, OP Stack chains do not have a large public mempool like Ethereum. OP Stack mempools are typically only visible to the Sequencer of the given chain and transactions are generally executed in priority fee order (highest fee first). diff --git a/pages/stack/explainer.mdx b/pages/stack/explainer.mdx index 888807a9d..7390e26ee 100644 --- a/pages/stack/explainer.mdx +++ b/pages/stack/explainer.mdx @@ -1,12 +1,12 @@ --- -title: Superchain Explainer +title: Superchain explainer lang: en-US description: Learn about Optimism Superchain components, features, and roadmap. --- import { Callout } from 'nextra/components' -# Superchain Explainer +# Superchain explainer Stay up to date on the Superchain and the OP Stack by subscribing to the [Optimism Developer Blog](https://blog.oplabs.co/) @@ -22,7 +22,7 @@ This is the detailed explanation. [Click here for a less technical introduction] Today, the Superchain is a concept and in-flight project, not a concrete reality. This documentation represents our best current guess as to what the Superchain's components, features, and roadmap will be. Ultimately, its actualization will depend on (and change alongside) contributions from across the entire Optimism Collective. We cannot wait to see where it goes. -## The Scalability Vision +## The scalability vision ### Blockchain tech today is insufficient for the decentralized web @@ -54,7 +54,7 @@ This hypothetical isn't a dream, it's a tangible vision for the future which has With the support of the industry, we think a clear picture for how to architect a truly scalable blockchain is beginning to come into view. We call it the "Superchain". This document lays out the core technical principles underlying the Superchain architecture, as well as a set of tangible projects which, when complete, we believe will finally realize the blockchain scalability vision. It will be a multi-year (if not decade) journey. However, if we know roughly where we're going, we'll get there a little faster. -## Foundational Superchain Concepts +## Foundational Superchain concepts ### Horizontal scalability requires multiple chains… @@ -85,7 +85,7 @@ By using L2 chains to comprise the multi-chain ecosystem, it becomes possible to A decentralized blockchain platform which consists of many chains that share security and a technology stack (OP Stack). The interoperability and standardization enables individual chains to be treated identically by tools and wallets. -## Superchain Overview +## Superchain overview ### The Superchain at a glance @@ -113,7 +113,7 @@ In order for Optimism to upgrade to a Superchain, it must have the following pro Once Optimism has satisfied these properties, it may be considered a Superchain. -## Upgrading Optimism to Become a Superchain +## Upgrading Optimism to become a Superchain We believe the following changes (after the Bedrock release) are required to create an initial Superchain that makes it possible to deploy and upgrade many chains with the same bridge: @@ -217,9 +217,9 @@ If each one of these pain points were addressed, it could be possible to build d The following is an overview of potential future enhancements, which when combined, addresses each one of these pain points. -### Multi-Proof Security +### Multi-proof security -#### Pain Point: +#### Pain point: 1. Withdrawal claims rely on a trusted set of chain attestors. @@ -227,13 +227,13 @@ The following is an overview of potential future enhancements, which when combin It is possible to replace the trusted set of chain attestors by introducing permissionless proofs—such as Cannon—where dispute resolution is entirely onchain. However, the challenge with entirely onchain proofs is there is no fallback mechanism if they were to break. To ensure that they will never fail, it is possible to introduce a multi-proof system which provides safety through redundancy. For more information on the multi-proof design click [here](https://web.archive.org/web/20230331065342/https://medium.com/ethereum-optimism/our-pragmatic-path-to-decentralization-cb5805ca43c1). -### Low Latency L2 to L2 Message Passing +### Low latency L2 to L2 message passing -#### Pain Point: +#### Pain point: 2. Cross-chain transactions are slow because they require waiting a challenge period. -#### Proposed Solution: +#### Proposed solution: Fault proofs introduce a UX burden because they require waiting a challenge period in order to safely finalize. This means that, depending on the length of your challenge period, users may need to wait a long time before their ETH and tokens are migrated from one OP Chain to the next. @@ -250,13 +250,13 @@ This heterogeneous bridging system means that developers can build their applica Mixing multiple proof systems enables developers to provide low-latency bridging for low value state and high-latency for high value state. It is even possible to turn low-security state which was instantly bridged into high-security state by proving the state's validity using a high-security high-latency bridge. This building block enables developers to make interesting security tradeoffs such as using a high threshold attestation proof with a high-security, high-latency fault proof fallback. -### Synchronous Cross-Chain Transactions +### Synchronous cross-chain transactions -#### Pain Point: +#### Pain point: 3. Cross-chain transactions are asynchronous, breaking the ability to perform atomic cross-chain transactions (like flash loans). -#### Proposed Solution: +#### Proposed solution: Traditional cross-chain messaging is done asynchronously, which means that cross-chain transactions are *not* atomic. For example, if a user would like to execute a cross-chain arbitrage transaction—buying token A on chain A, and selling token B on chain B—there is no guarantee that their transaction executes in its entirety. The user might end up buying token A without having sold token B. @@ -264,13 +264,13 @@ It is possible to introduce synchronous cross-chain messaging and enable atomic With the combination of low-latency L2 to L2 message passing as well as shared sequencing, it is possible to perform complex transactions such as cross-chain flash loans. It is even possible to go further and create an EVM abstraction where individual smart contracts (or even individual storage slots) exist on different chains. -### Alt-Data Availability Layer — Plasma Protocol +### Alt-Data availability layer — Plasma Protocol -#### Pain Point: +#### Pain point: 4. Posting transactions to the Superchain is not-scalable because the transaction data must be submitted to L1 which has limited capacity. -#### Proposed Solution: +#### Proposed solution: Today L1 data availability (DA) does not scale nearly enough to be able to support internet-level scale. However, it is possible to extend the amount of data availability accessible to OP Chains by using a Plasma protocol which enables alternative DA providers to supplement the more limited L1 DA. @@ -294,15 +294,15 @@ A generic Plasma protocol is able to scale beyond what is possible on L1 because Because of the ability for hashes to reduce arbitrary size data into a constant size commitment, and the ability to parallelize transaction data hashing, it is possible to achieve near-perfect horizontal scalability of data commitments using Plasma DA. This means that it is possible to put massively scalable applications such as games or social media on Plasma chains. -### Multi-Chain App Frameworks +### Multi-chain app frameworks -#### Pain Points: +#### Pain points: 5. There are no easy-to-use frameworks for building scalable apps which utilize many OP Chains. 6. There is no easy-to-use wallet for managing ETH and tokens and apps across many OP Chains. -#### Proposed Solution (Sketch): +#### Proposed solution (Sketch): This is not a core protocol change, but instead tooling which can be built on top of the core Superchain protocols. The suggestions here are intended to give rough intuitions for how to build tools which improve the experience of deploying to the Superchain. @@ -320,7 +320,7 @@ These are some tools which could make developing on the Superchain a better expe With robust multi-chain app frameworks, it may become as easy to deploy cross-chain apps as it is to deploy apps which target a single chain. -## Get Involved +## Get involved We believe scaling blockchains will radically decentralize the internet and make it easy to create horizontally scalable, secure, and decentralized web applications. We think the Superchain release of the OP Stack could mark a major step towards realizing this vision. However, after the release, it will still take an enormous amount of work to realize the scalability vision. diff --git a/pages/stack/getting-started.mdx b/pages/stack/getting-started.mdx index 554a247c7..67096b0dc 100644 --- a/pages/stack/getting-started.mdx +++ b/pages/stack/getting-started.mdx @@ -1,12 +1,12 @@ --- -title: Getting Started with the OP Stack +title: Getting started with the OP Stack lang: en-US description: Learn the basics of OP Stack development. --- import { Callout } from 'nextra/components' -# Getting Started with the OP Stack +# Getting started with the OP Stack **The OP Stack is the standardized, shared, and open-source development stack that powers Optimism, maintained by the Optimism Collective.** @@ -61,7 +61,7 @@ As work on the stack continues, it should become easier to plug in and configure As the [Superchain](explainer) begins to take shape, the OP Stack can evolve alongside it, to include the message-passing infrastructure that allows different chains to interoperate seamlessly. At the end of the day, the OP Stack becomes what Optimism needs. -## Dive Deeper into the OP Stack +## Dive deeper into the OP Stack Ready to dive into the world of the OP Stack? diff --git a/pages/stack/operators/features/op-txproxy.mdx b/pages/stack/operators/features/op-txproxy.mdx index 525519dbe..d94668639 100644 --- a/pages/stack/operators/features/op-txproxy.mdx +++ b/pages/stack/operators/features/op-txproxy.mdx @@ -30,20 +30,20 @@ With the signature and signing address, the request is authenticated under the ` * Requests with a mismatch in recovered signer and supplied public key will have the http request failed with status code `400 - Bad Request`. Currently, no authorization policies are implemented on this endpoint. However, the authentication mechanism is in place to allow for future implementation of policies such as allowlists, localized rate limits, and other potential restrictions. -#### Runtime Shutoff +#### Runtime shutoff This service can be configured with a flag or environment variable to reject conditional transactions without needing to interrupt the execution engine. This feature is useful for diagnosing issues. `--sendRawTxConditional.enabled (default: true) ($OP_TXPROXY_SENDRAWTXCONDITIONAL_ENABLED)` When disabled, requests will fail with the `-32003` (transaction rejected) json rpc error code with a message stating that the method is disabled. -#### Rate Limits +#### Rate limits Even though the op-geth implementation of this endpoint includes rate limits, it is instead applied here to terminate these requests early. `--sendRawTxConditional.ratelimit (default: 5000) ($OP_TXPROXY_SENDRAWTXCONDITIONAL_RATELIMIT)` -#### Stateless Validation +#### Stateless validation * Conditional cost is below the max * Conditional values are valid (i.e min \< max) @@ -71,7 +71,7 @@ When the request passes validation, it is passed through to the configured backe To start using `op-txproxy`, follow these steps: - ### Build the Binary or Pull the Docker Image + ### Build the binary or pull the Docker image 1. Run the following command to build the binary ```bash diff --git a/pages/stack/operators/features/proxyd.mdx b/pages/stack/operators/features/proxyd.mdx index 51476b581..e2b7cf6ef 100644 --- a/pages/stack/operators/features/proxyd.mdx +++ b/pages/stack/operators/features/proxyd.mdx @@ -10,8 +10,7 @@ import { Steps } from 'nextra/components' `proxyd` is an important RPC request router and proxy used within the OP Stack infrastructure. It enables operators to efficiently route and manage RPC requests across multiple backend services, ensuring performance, fault tolerance, and security. -## Key Features - +## Key features * RPC method whitelisting * Backend request routing * Automatic retries for failed backend requests @@ -26,7 +25,7 @@ import { Steps } from 'nextra/components' To start using `proxyd`, follow these steps: - ### **Build the Binary**: + ### **Build the binary**: * Run the following command to build the `proxyd` binary: ```bash @@ -39,7 +38,7 @@ To start using `proxyd`, follow these steps: * Create a configuration file to define your proxy backends and routing rules. * Refer to [example.config.toml](https://github.com/ethereum-optimism/infra/blob/main/proxyd/example.config.toml) for a full list of options with commentary. - ### **Start the Service**: + ### **Start the service**: Once the configuration file is ready, start the `proxyd` service using the following command: @@ -48,7 +47,7 @@ To start using `proxyd`, follow these steps: ``` -## Consensus Awareness +## Consensus awareness Version 4.0.0 and later include consensus awareness to minimize chain reorganizations. @@ -58,9 +57,9 @@ Set `consensus_aware` to `true` in the configuration to enable: * Resolving consensus groups based on healthiest backends * Enforcing consensus state across client requests -## Caching and Metrics +## Caching and metrics -### Cacheable Methods +### Cacheable methods Certain immutable methods, such as `eth_chainId` and `eth_getBlockByHash`, can be cached using Redis to optimize performance. @@ -68,7 +67,7 @@ Certain immutable methods, such as `eth_chainId` and `eth_getBlockByHash`, can b Extensive metrics are available to monitor request latency, error rates, backend health, and more. These can be configured via `metrics.port` and `metrics.host` in the configuration file. -## Next Steps +## Next steps * Read about the [OP Stack chain architecture](/builders/chain-operators/architecture). * Find out how you can support [snap sync](/builders/chain-operators/management/snap-sync). diff --git a/pages/stack/protocol/derivation-pipeline.mdx b/pages/stack/protocol/derivation-pipeline.mdx index 4fbad5f31..2c2aad540 100644 --- a/pages/stack/protocol/derivation-pipeline.mdx +++ b/pages/stack/protocol/derivation-pipeline.mdx @@ -1,14 +1,14 @@ --- -title: Derivation Pipeline +title: Derivation pipeline lang: en-US description: Overview of the derivation pipeline in the OP Stack protocol. --- -# Derivation Pipeline +# Derivation pipeline The derivation pipeline is a fundamental component of the OP Stack protocol, responsible for processing and validating transactions in the Optimism network. It ensures the integrity and security of the blockchain by deriving a consistent state from the sequenced transactions and batches submitted by the sequencer. -## Key Functions of the Derivation Pipeline +## Key functions of the derivation pipeline The following are key functions of the derivation pipeline: @@ -16,7 +16,7 @@ The following are key functions of the derivation pipeline: * **Safe Head and Unsafe Blocks**: The derivation pipeline maintains two types of heads: the Safe Head and the Unsafe Head. The Safe Head represents the most recent confirmed state on L1, while Unsafe Blocks are those that have been sequenced but not yet confirmed on L1. * **Reorg and Recovery**: If the sequencing window (typically 12 hours) is exceeded without a valid batch being discovered on L1, the pipeline will revert all Unsafe Blocks from that period. The pipeline then progresses using a default block that is empty except for deposits, allowing the network to recover and continue processing new transactions. -## Sequencer Window +## Sequencer window The sequencer window defines the maximum time allowed for batches to be submitted and confirmed on L1. If this window is exceeded, the derivation pipeline takes corrective actions to ensure the network's integrity and continued operation. @@ -25,11 +25,11 @@ For example: * In a 12-hour sequencing window, if no valid batch is discovered on L1, the pipeline reverts to Unsafe Blocks and uses a default block to move forward. * Increasing the window to 24 hours allows nodes to wait longer before reorging out unsafe blocks, but it may introduce additional challenges such as increased resource constraints and difficulty in processing larger batches. -## Configuration and Adjustments +## Configuration and adjustments The `sequencerWindowSize` parameter is set during the deployment configurations and may be difficult to change once established. It is important for chain operators to carefully consider the appropriate window size to balance network performance and stability. -## Next Steps +## Next steps * For more detailed information, refer to the [derivation pipeline specification](https://specs.optimism.io/protocol/derivation.html). * Have questions? You can ask a question in the [developer support forum](https://github.com/ethereum-optimism/developers/discussions). diff --git a/pages/stack/protocol/fault-proofs/cannon.mdx b/pages/stack/protocol/fault-proofs/cannon.mdx index 4a86b4ce6..86424a342 100644 --- a/pages/stack/protocol/fault-proofs/cannon.mdx +++ b/pages/stack/protocol/fault-proofs/cannon.mdx @@ -1,5 +1,5 @@ --- -title: Fault Proof VM - Cannon +title: Fault proof VM - Cannon lang: en-US description: Learn about Cannon and its default operation as part of Optimism's Fault Proof Virtual Machine. --- @@ -7,7 +7,7 @@ description: Learn about Cannon and its default operation as part of Optimism's import Image from 'next/image' import { Callout } from 'nextra/components' -# Fault Proof VM: Cannon +# Fault proof VM: Cannon Cannon is an instance of a Fault Proof Virtual Machine (FPVM) that can be used as part of the Dispute Game for any OP Stack Blockchain. The Dispute Game itself is modular, allowing for any FPVM to be used in a dispute. @@ -23,7 +23,7 @@ Additionally, we will explore the differences between Cannon and the onchain `MI implementation, please refer to [MIPS reference](mips). Now for simplicity, when referring to Cannon in this documentation, we are referring to the offchain implementation. -## Control Flow +## Control flow ![Fault Proof Control Flow.](/img/op-stack/protocol/fault-proof-control-flow.svg) @@ -55,7 +55,7 @@ same inputs will produce not only the same outputs, but the same execution trace OP-Program such that, given the same L2 output root state transition, can generate the same execution traces. This in turn generates the same witness proof for the exact same MIPS instruction that will be run onchain. -## Overview of Offchain Cannon components +## Overview of offchain Cannon components Now, we will go over each major component that makes up Cannon. Components are grouped by what functionality is being performed for Cannon, and may be correlated to one or more Go files. For brevity, each Go file will be explained at a high level, with the @@ -63,7 +63,7 @@ most important features / considerations highlighted. ![Cannon Components Overview.](/img/op-stack/protocol/cannon-internal-overview.svg) -### `mipsevm` State and Memory +### `mipsevm` state and memory As mentioned previously, the `mipsevm` is 32-bit, which means the full addressable address range is `[0, 2^32-1]`. The memory layout uses the typical monolithic memory structure, and the VM operates as though it were interacting directly with physical memory. @@ -114,7 +114,7 @@ The information stored is largely identical to the [VM execution state](mips#pac * Instead of storing just the memory Merkle root, there is a `Memory` Struct pointer for the binary Merkle tree representation of the entire 32-bit memory space. * There is an optional `LastHint` bytes variable, which can be used to communicate a Pre-image hint to avoid having to load in multiple prior Pre-images. -#### Generating the Witness Proof +#### Generating the witness proof Cannon handles two major components in the dispute game: generating state witness hashes for OP-Challenger to post during the execution trace bisection game, and generating the witness proof once a single MIPS instruction is reached as the root of disagreement in the fault dispute game. @@ -164,7 +164,7 @@ unimplemented functionality, any function within the ELF file that would require Patching the binary of these functions involves identifying problematic functions, searching for their corresponding symbols within the ELF file, and effectively stubbing out the function by returning immediately, and adding a `nop` to the delay slot. -### Instruction Stepping +### Instruction stepping Once the MIPS binary is loaded into Cannon, we can then begin to run MIPS instructions one at a time. [`run.go`](https://github.com/ethereum-optimism/optimism/blob/develop/cannon/cmd/run.go) contains the top-level @@ -197,7 +197,7 @@ However, there are differences between the two: 2. The `mipsevm` contains the entire 32-bit monolithic memory space, is responsible for maintaining the memory state based on the results of MIPS instructions, and generates the memory binary Merkle tree, Merkle root, and memory Merkle proofs. `MIPS.sol` is mostly stateless, and does not maintain the full memory space. Instead, it only requires the memory Merkle root, and up to two memory Merkle proofs: 1 for the instruction and 1 for potential load, store, or certain syscall instructions. 3. Unlike `MIPS.sol`, `mips.go` is responsible for writing Pre-images to the PreimageOracle Server, and optionally writing hints to the Server. -### PreimageOracle Interaction +### PreimageOracle interaction As mentioned previously, Cannon is responsible for setting up all state that may be required to run an instruction in `MIPS.sol`. Cannon is also responsible for interacting with the PreimageOracle Server, and directing OP-Challenger to provide Pre-images to diff --git a/pages/stack/protocol/fault-proofs/challenger.mdx b/pages/stack/protocol/fault-proofs/challenger.mdx index 3f23d83f3..647829f48 100644 --- a/pages/stack/protocol/fault-proofs/challenger.mdx +++ b/pages/stack/protocol/fault-proofs/challenger.mdx @@ -1,5 +1,5 @@ --- -title: OP-Challenger Explainer +title: OP-Challenger explainer lang: en-US description: Learn about OP-Challenger and how it operates within the OP Stack's fault proof system. --- @@ -7,7 +7,7 @@ description: Learn about OP-Challenger and how it operates within the OP Stack's import { Callout } from 'nextra/components' import Image from 'next/image' -# OP-Challenger Explainer +# OP-Challenger explainer The `op-challenger` operates as the *honest actor* in the fault dispute system and defends the chain by securing the `OptimismPortal` and ensuring the game always resolves to the correct state of the chain. For verifying the legitimacy of claims, `op-challenger` relies on a synced, trusted rollup node as well as a trace provider (e.g., [Cannon](/stack/protocol/fault-proofs/cannon)). @@ -38,22 +38,22 @@ graph TD; The `cannon` and `op-program` executables are run in the `op-challenger` docker container as sub-processes when required to generate game trace data. -## Fault Detection Responses +## Fault detection responses `op-challenger` assesses each claim's validity, countering only those deemed invalid, following this logic: 1. If the trusted node agrees with the output, `op-challenger` takes no action. An honest challenger does nothing because there are no claims it disagrees with. It continues to monitor the game in case someone posts a counter-claim to the valid root claim, in which case the challenger will participate in the game to defend the proposal. 2. If the trusted node disagrees, `op-challenger` posts a counter-claim to challenge the proposed output. In contrast to the above, an honest challenger aims to delete any output roots that its trusted node disagrees with in order to claim the bond attached to it. The honest challenger assumes that their rollup node is synced to the canonical state and that the fault proof program is correct, so it is willing to put its money on the line to counter any faults. -## Fault Dispute Game Responses +## Fault dispute game responses `op-challenger` iterates through claims as stored in the contract, ensuring ancestors are processed before their descendants. For each claim, the honest challenger determines and tracks the set of honest responses to all claims, regardless of whether that response already exists in the full game state. -### Root Claim +### Root claim The root claim is considered to be an honest claim if and only if it has a [state witness Hash](https://specs.optimism.io/fault-proof/stage-one/fault-dispute-game.html#claims) that agrees with the honest challenger's state witness hash for the root claim. -### Counter Claims +### Counter claims When a new claim is made in a dispute game, the honest challenger processes it and performs a response. The honest challenger should counter a claim if and only if: @@ -64,7 +64,7 @@ When a new claim is made in a dispute game, the honest challenger processes it a This implies the honest challenger never counters its own claim, since there is at most one honest counter to each claim, so an honest claim never has an honest sibling. -### Possible Moves +### Possible moves The challenger monitors each game as new claims are added and reacts according to the [honest actor algorithm](https://specs.optimism.io/fault-proof/stage-one/honest-challenger-fdg.html) to defend valid proposals and invalidate invalid proposals. A **move** is a challenge against an existing claim and must include an alternate claim asserting a different trace (e.g., attack, defend, or step). @@ -82,7 +82,7 @@ When one side of a `FaultDisputeGame`'s chess clock runs out, the honest challen The `FaultDisputeGame` does not put a time cap on resolution - because of the liveness assumption on honest challengers and the bonds attached to the claims they've countered, challengers are economically motivated to resolve the game quickly, thereby liquidating their funds and securing rewards. -## Next Steps +## Next steps * Ready to get started? Read our guide on how to [configure `op-challenger` on your OP Stack chain](/builders/chain-operators/tools/op-challenger). * For more info about how `op-challenger` works under the hood, [check out the specs](https://specs.optimism.io/fault-proof/stage-one/honest-challenger-fdg.html). diff --git a/pages/stack/protocol/fault-proofs/explainer.mdx b/pages/stack/protocol/fault-proofs/explainer.mdx index 7b1299aa4..f612b65a1 100644 --- a/pages/stack/protocol/fault-proofs/explainer.mdx +++ b/pages/stack/protocol/fault-proofs/explainer.mdx @@ -1,5 +1,5 @@ --- -title: Fault Proofs Explainer +title: Fault proofs explainer lang: en-US description: Learn about the OP Stack's fault proof system. --- @@ -7,7 +7,7 @@ description: Learn about the OP Stack's fault proof system. import { Callout } from 'nextra/components' import Image from 'next/image' -# Fault Proofs Explainer +# Fault proofs explainer Fault Proofs are an important part of an Optimistic Rollup system like the OP Stack. Users withdraw ETH and tokens from OP Stack chains like OP Mainnet by submitting a withdrawal proof that shows the withdrawal was actually included in the OP Stack chain. @@ -25,7 +25,7 @@ Although the fault proof game is permissionless, the Optimism Security Council a Each proposal must wait for a delay period during which the Guardian can prevent invalid proposals from being used to withdraw ETH or tokens through a number of safety hatches. The Guardian can also choose to shift the system to use a PermissionedDisputeGame, in which only specific `PROPOSER` and `CHALLENGER` roles can submit and challenge proposals. -## Permissionless Proposals +## Permissionless proposals "Proposals" or "State Proposals" are claims about the state of an OP Stack chain that are submitted to Ethereum through the `DisputeGameFactory` contract. Proposals can be used for many things but are most commonly used by end-users to prove that they created a withdrawal on an OP Stack chain. @@ -36,14 +36,14 @@ See the permissionless fault proofs diagram below for more details:
Permissionless Fault Proofs flow -## Permissionless Challenges +## Permissionless challenges Because anyone can submit a proposal, it's important that invalid proposals can be challenged. In [Optimistic Rollups like OP Stack Chains](/stack/protocol/rollup/overview) there is a \~1 week challenge period during which users can challenge a proposal if they believe it to be incorrect. With the Fault Proofs upgrade to the OP Stack, challenges become permissionless and can be submitted by anyone. Any user can run a node for the OP Stack chain in question and use the `op-challenger` tool to participate in the dispute process. -## Modular Design and Multi-layer Security +## Modular design and multi-layer security The OP Stack Fault Proof system is [modular in design](/stack/protocol/fault-proofs/fp-components#system-design--modularity) and lays the groundwork for achieving a "multi-proof" system. This allows the OP Stack to support multiple proof systems alongside the initial [Cannon](/stack/protocol/fault-proofs/cannon) proof system. With multiple proof systems in place, the OP Stack can be more resilient to potential attacks and bugs in any one proof system. @@ -54,7 +54,7 @@ Additionally, the following [security safeguards](/stack/protocol/fault-proofs/f * After a root is finalized through a game, an additional delay called the "airgap window" has been added before withdrawals can occur. During this period, the `GUARDIAN` role can reject the root. * A contract called `DelayedWETH` has been set up to hold the bonds and only allow payouts after a delay, so that bonds can be redirected towards the correct recipient in the case that a game resolves incorrectly. -## Next Steps +## Next steps * Ready to get started? Review the [FP Components](fp-components) to learn how the different components work together to enhance decentralization in the Optimism ecosystem. * See the [Fault Proof Mainnet Security](/stack/protocol/fault-proofs/fp-security) to understand changes to `OptimismPortal` and `FaultDisputeGame` contracts. diff --git a/pages/stack/protocol/fault-proofs/fp-components.mdx b/pages/stack/protocol/fault-proofs/fp-components.mdx index 1027cb406..558ed7372 100644 --- a/pages/stack/protocol/fault-proofs/fp-components.mdx +++ b/pages/stack/protocol/fault-proofs/fp-components.mdx @@ -1,5 +1,5 @@ --- -title: FP System Components +title: FP System components lang: en-US description: Learn about fault proof system components and how they work together to enhance decentralization in the Optimism ecosystem. --- @@ -7,7 +7,7 @@ description: Learn about fault proof system components and how they work togethe import Image from 'next/image' import { Callout } from 'nextra/components' -# FP System Components +# FP system components This page explains the fault proof system components and how they work together to enhance decentralization in the Optimism ecosystem. @@ -19,7 +19,7 @@ The modular design of the fault proof system lays the foundation for a multi-pro Visit the [Immunefi bug bounty page](https://immunefi.com/bounty/optimism/) for details on testing and helping to build a robust fault proof system. -## System Design & Modularity +## System design & modularity The Fault Proof System is comprised of three main components: a Fault Proof Program (FPP), a Fault Proof Virtual Machine (FPVM), and a dispute game protocol. These components will work together to challenge malicious or faulty activity on the network to preserve trust and consistency within the system. @@ -33,7 +33,7 @@ The OP Stack's unique, modular design allows the decoupling of the FPP and FPVM, * custom-built fault proof systems comprised of any combination of these isolated components—including validity proofs, attestation proofs, or ZKVM. * dispute games in the dispute protocol backed by multiple security mechanisms. -## Fault Proof Program +## Fault proof program The default for this system component is `op-program`, which implements a fault proof program that runs through the rollup state-transition to verify an L2 output from L1 inputs. This verifiable output can then resolve a disputed output on L1. The FPP is a combination of `op-node` and `op-geth`, so it has both the consensus and execution "parts" of the protocol in a single process. This means Engine API calls that would normally be made over HTTP are instead made as direct method calls to the op-geth code. @@ -42,7 +42,7 @@ The FPP is designed so that it can be run in a deterministic way such that two i All data is retrieved via the [Preimage Oracle API](https://specs.optimism.io/experimental/fault-proof/index.html#pre-image-oracle). The preimages could be provided via the FPVM when onchain or by a native "host" implementation that can download the required data from nodes via JSON-RPC requests. The native host implementation is also provided by `op-program` but doesn't run as part of the onchain execution. Basically, `op-program` has two halves: the "client" Fault Proof Program part covered in this section and the "host" part used to fetch required preimages. -## Fault Proof Virtual Machine +## Fault proof virtual machine The Fault Proof Virtual Machine (FPVM) is one of the modules in the OP Stack's fault proof system. OP Stack's modularity decouples the Fault Proof Program (FPP) from the Fault Proof Virtual Machine (FPVM) to enable next-level composability and efficient parallelized upgrades to both components. The FPP (client-side) that runs within the FPVM is the part that expresses the L2 state-transition, and the interface between FPVM and FPP is standardized and documented in the [specs](https://github.com/ethereum-optimism/optimism/blob/546fb2c7a5796b7fe50b0b7edc7666d3bd281d6f/specs/cannon-fault-proof-vm.md). @@ -57,7 +57,7 @@ To do this, only one instruction is proven at a time. The bisection game will na [Cannon](cannon) is the default FPVM used in all disputes. [MIPS](mips) is the onchain smart contract implementation of Cannon that can be implemented due to the modularity of the dispute game. -## Dispute Game Protocol +## Dispute game protocol In the Dispute protocol, different types of dispute games can be created, managed, and upgraded through the [DisputeGameFactory](https://github.com/ethereum-optimism/optimism/blob/6a53c7a3294edf140d552962f81c0f742bf445f9/packages/contracts-bedrock/src/dispute/DisputeGameFactory.sol#L4). This opens the door to innovative features, like aggregate proof systems and the ability to expand the protocol to allow for disputing things apart from the state of L2, such as a `FaultDisputeGame` geared towards onchain binary verification. @@ -75,7 +75,7 @@ The VM's state transition function, which we'll call `T`, can be anything, so lo The first full implementation of the VM generic in the bisection game includes a single MIPS thread context on top of the EVM to execute a single instruction within an execution trace generated by `Cannon` and the `op-program`. -## Next Steps +## Next steps * For more detail on Cannon and its default operation as part of Optimism's Fault Proof Virtual Machine, see [Cannon FPVM](cannon). * For a detailed walk-thru of significant changes to Fault Proof Mainnet, see [FP Mainnet Security](fp-security). diff --git a/pages/stack/protocol/fault-proofs/fp-security.mdx b/pages/stack/protocol/fault-proofs/fp-security.mdx index fa7c696ee..453f8d93d 100644 --- a/pages/stack/protocol/fault-proofs/fp-security.mdx +++ b/pages/stack/protocol/fault-proofs/fp-security.mdx @@ -1,12 +1,12 @@ --- -title: Fault Proofs Mainnet Security +title: Fault proofs Mainnet security lang: en-US description: Learn about changes to the security model for the Fault Proofs Mainnet System. --- import { Callout } from 'nextra/components' -# Fault Proofs Mainnet Security +# Fault proofs Mainnet security Source code for Fault Proof Mainnet contracts approved by Optimism Governance can be found [here](https://github.com/ethereum-optimism/optimism/tree/op-contracts/v1.5.0). @@ -17,12 +17,12 @@ The most significant change introduced by the Fault Proof Mainnet upgrade is the * The `DisputeGameFactory` contract generates `FaultDisputeGame` contract instances that each act as a host to a proposal about the state of the OP Stack chain at a given block number. * Unlike the `L2OutputOracle`, the `DisputeGameFactory` contract offers users the ability to permissionlessly play "fault dispute games" in which the correctness of the proposal is determined programmatically. -## Security Model +## Security model Fault Proof Mainnet is a large contract upgrade that introduces a number of novel components. Given the relative complexity of these novel components, the approach to security for FPM has been to limit the blast radius of potential bugs to very specific contracts and fallback mechanisms that can be easily audited. -### Handling Invalid Game Results +### Handling invalid game results All of the security mechanisms put in place generally revolve around the possibility that a `FaultDisputeGame` contract may incorrectly finalize an invalid game result. There are two variations of this: @@ -32,7 +32,7 @@ There are two variations of this: Both cases would cause honest challengers to lose bonds (unless the `Guardian` stepped in). Potential impact is managed through the introduction of a number of safeguards within the `OptimismPortal` and `FaultDisputeGame` contracts. -### Safeguards Within `OptimismPortal` +### Safeguards within `OptimismPortal` The `OptimismPortal` contract includes various security mechanisms that allow the `Guardian` and `SystemOwner` roles to collaborate to prevent invalid proposals from impacting withdrawals. @@ -41,23 +41,23 @@ The `OptimismPortal` contract includes various security mechanisms that allow th * The `Guardian` can "blacklist" specific `FaultDisputeGame` contracts that resolve incorrectly. * The `Guardian` can change the respected type of `FaultDisputeGame` contract in the case that an entire class of `FaultDisputeGame` contracts is found to have critical bugs. If desired, the `Guardian` can also choose to revert to a `PermissionedDisputeGame` contract that only allows specific roles to submit and challenge proposals. -### Safeguards Within `FaultDisputeGame` +### Safeguards within `FaultDisputeGame` The `FaultDisputeGame` contracts store bonds within a `DelayedWETH` contract that is managed by the `SystemOwner`. Withdrawals from the `DelayedWETH` contract are delayed which gives the `SystemOwner` the ability to manually recover from situations in which bonds would be incorrectly distributed. This delay is set to 7 days on OP Mainnet to give the `SystemOwner` or `Guardian` sufficient time to respond to potential security concerns. -### Safeguards Within `DelayedWETH` +### Safeguards within `DelayedWETH` * The `SystemOwner` can replace the `Guardian` address. * The `SystemOwner` can hold funds from any specific `DisputeGame` contract. * The `SystemOwner` can remove funds from the `DelayedWETH` contract if the issue extends to so many `DisputeGame` contracts that holding funds from specific contracts is not viable. * The `Guardian` can trigger the global pause mechanism to halt WETH withdrawals. -### Cumulative Security Impact +### Cumulative security impact As with the original system, the cumulative effect of these security capabilities is that the `Guardian` role provides fast response capabilities while the `SystemOwner` can always step in to resolve all classes of bugs that could result in a loss of funds. The most significant change in security model with the introduction of Fault Proof Mainnet is that `SystemOwner` can take a more passive role as invalid proposals will generally be rejected by the Fault Proof system while the `Guardian` can act as a backstop only in case of a failure in the fault proof game. -## Next Steps +## Next steps * See the [FP Components](fp-components) for an overview of FP system components and how they work together to enhance decentralization in the Optimism ecosystem. * See the [specs](https://specs.optimism.io/fault-proof/index.html) for detailed information about the entire FP program, FP virtual machine, and dispute game. diff --git a/pages/stack/protocol/fault-proofs/mips.mdx b/pages/stack/protocol/fault-proofs/mips.mdx index e58cff53c..3623ae991 100644 --- a/pages/stack/protocol/fault-proofs/mips.mdx +++ b/pages/stack/protocol/fault-proofs/mips.mdx @@ -1,5 +1,5 @@ --- -title: Fault Proof VM - MIPS.sol +title: Fault proof VM - MIPS.sol lang: en-US description: Learn about the `MIPS.sol` smart contract that works as part of Optimism's Fault Proof Virtual Machine. --- @@ -7,14 +7,14 @@ description: Learn about the `MIPS.sol` smart contract that works as part of Opt import Image from 'next/image' import { Callout } from 'nextra/components' -# Fault Proof VM: MIPS.sol +# Fault proof VM: MIPS.sol The `MIPS.sol` smart contract is an onchain implementation of a virtual machine (VM) that encompasses the 32-bit, Big-Endian, MIPS III Instruction Set Architecture (ISA). This smart contract is the counterpart to the off-chain MIPSEVM golang implementation of the same ISA. Together, the onchain and off-chain VM implementations make up [Cannon](cannon), Optimism's Fault Proof Virtual Machine (FPVM). Cannon is a singular instance of a FPVM that can be used as part of the Dispute Game for Optimism's (and Base's) optimistic rollup L2 blockchain. The Dispute Game itself is modular, allowing for any FPVM to be used in a dispute; however, Cannon is currently the only FPVM implemented and thus will be used in all disputes. -## Control Flow +## Control flow The `FaultDisputeGame.sol` interacts with `MIPS.sol` and then `MIPS.sol` calls into `PreimageOracle.sol`. `MIPS.sol` is only called at the max depth of the game when someone needs to call `step`. `FaultDisputeGame.sol` is the deployed instance of a Fault Dispute Game for an active dispute, and `PreimageOracle.sol` stores Pre-images. @@ -27,7 +27,7 @@ A leaf node represents a single MIPS instruction (in the case that we're using C state to run in the `MIPS.sol` contract, the fault dispute game can determine the true post state (or Post-image). This true post state will then be used to determine the outcome of the fault dispute game by comparing the disputed post-state at the leaf node with the post-state proposed by the disputer. -## Contract State +## Contract state The `MIPS.sol` contract only contains a single immutable variable, which corresponds to the address of the `PreimageOracle.sol` contract. Otherwise, the contract is stateless, meaning that all state related to playing a MIPS instruction onchain comes from either the `FaultDisputeGame.sol` instance, or the `PreimageOracle.sol`. @@ -47,7 +47,7 @@ There is no requirement to read from the `PreimageOracle.sol` during instruction The Pre-image information that has been read in previous off-chain instructions leading up to the execution of a single instruction onchain may still reside in the constructed VM memory. Thus, even when the instruction run onchain does not explicitly read from `PreimageOracle.sol` , Pre-image data may still influence the merkle root that represents the VM's memory. -### Packed VM Execution State +### Packed VM execution state In order to execute a MIPS instruction onchain, the `MIPS.sol` contract needs to know important state information such as the instruction to run, the values in each of the general purpose registers, etc. More specifically, a tightly-packed `State` struct contains all the relevant information that the `MIPS.sol` contract needs to know. This struct is passed to the contract from the `FaultDisputeGame.sol` contract when it invokes the `step` function in `MIPS.sol` (which in-turn executes a single MIPS instruction onchain). @@ -66,7 +66,7 @@ The following information is stored in the `State` struct. See [doc reference](h 11. `step` - Counts the total number of instructions that have been executed. 12. `registers` - Array of 32, 32-bit values that represent the general purpose registers for the MIPS ISA. -### State Hash +### State hash The state hash is the `bytes32` value returned to the active Fault Dispute Game upon the completion of a single MIPS instruction in the `MIPS.sol` contract. The hash is derived by taking the `keccak256` of the above packed VM execution `State` struct, and then replacing the first byte of the hash with a value that represents the status of the VM. @@ -80,7 +80,7 @@ This value is derived from the `exitCode` and `exited` values, and can be: The reason for adding the VM status to the state hash is to communicate to the dispute game whether the VM determined the proposed output root was valid or not. This in turn prevents a user from disputing an output root during a dispute game, but provides the state hash from a cannon trace that actually proves the output root is valid. -### Memory Proofs +### Memory proofs Using a 32-bit ISA means that the total size of the address space (assuming no virtual address space) is `2^32 = 4GiB`. Additionally, the `MIPS.sol` contract is stateless, so it does not store the MIPS memory in contract storage. The primary reason for this is because having to load the entire memory into the `MIPS.sol` contract in order to execute a single instruction onchain is prohibitively expensive. Additionally, the entire memory would need to be loaded per fault proof game, requiring multiple instances of the `MIPS.sol` contract. Therefore, in order to optimize the amount of data that needs to be provided per onchain instruction execution while still maintaining integrity over the entire 32-bit address space, Optimism has converted the memory into a binary merkle tree. @@ -88,7 +88,7 @@ The binary merkle tree (or hash tree) used to store the memory of the MIPS VM ha Reading to memory and writing to memory work similarly, both involve calculating the merkle root. In the case of a memory write, `MIPS.sol` must take care to verify the provided proof for the memory location to write to is correct. Additionally, writing to memory will change the merkle root stored in the VM execution `State` struct. -### State Calculation +### State calculation While the `MIPS.sol` contract may only execute a single instruction onchain, the off-chain Cannon implementation executes all prerequisite MIPS instructions for all state transitions in the disputed L2 state required to reach the disputed instruction that will be executed onchain. This ensures that the MIPS instruction executed onchain has the correct VM state and necessary Pre-images stored in the `PreimageOracle.sol` contract to generate the true post-state that can be used to resolve the dispute game. @@ -177,7 +177,7 @@ The public [`step`](https://github.com/ethereum-optimism/optimism/blob/546fb2c7a The internal pure [`execute`](https://github.com/ethereum-optimism/optimism/blob/546fb2c7a5796b7fe50b0b7edc7666d3bd281d6f/packages/contracts-bedrock/src/cannon/MIPS.sol#L793) function handles the execution of MIPS instructions that are not handled by other functions. The `execute` function primarily handles R-type instructions according to the MIPS specification, however other instructions will pass through this function. Instructions handled by other functions will simply return. Invalid or unsupported instructions will cause the `execute` function to revert. -## Common Bitwise Operation Use Cases +## Common bitwise operation use cases 1. Isolating certain bits from a number can be done using the & operator (and(x,y) in Yul), this is also known as generating a bitmask. 2. Combining bits from two numbers together can be done using the | operator (or(x, y) in Yul). @@ -185,7 +185,7 @@ The internal pure [`execute`](https://github.com/ethereum-optimism/optimism/blob 4. Multiplication using a value with a base of 2 can be expressed using the following bitwise operation: `x * y = x << z, where y = 2^z` Ex. `x * 8 = x << 3, where 8 = 2^3` -## Table Of Supported MIPS Instructions +## Table of supported MIPS instructions | Instruction Name | Opcode Num. | Funct Num. | Other Num. | | ---------------------------------------------- | ----------- | ---------- | ---------- | @@ -253,7 +253,7 @@ The internal pure [`execute`](https://github.com/ethereum-optimism/optimism/blob | SC (Store Conditional Word) | 0x38 | - | - | | SYNC (Synchronize Shared Memory) | 0x00 | 0x0F | - | -## Further Reading +## Further reading * [Cannon Overview](https://github.com/ethereum-optimism/optimism/blob/546fb2c7a5796b7fe50b0b7edc7666d3bd281d6f/cannon/docs/README.md) * [Cannon FPVM Specification](https://specs.optimism.io/experimental/fault-proof/cannon-fault-proof-vm.html) diff --git a/pages/stack/protocol/features/alt-da-mode.mdx b/pages/stack/protocol/features/alt-da-mode.mdx index 122650d9d..446afe4d8 100644 --- a/pages/stack/protocol/features/alt-da-mode.mdx +++ b/pages/stack/protocol/features/alt-da-mode.mdx @@ -1,5 +1,5 @@ --- -title: Alt-DA Mode Explainer +title: Alt-DA Mode explainer lang: en-US description: Learn the basic process, benefits, and considerations for running an Alt-DA mode chain. --- @@ -14,19 +14,19 @@ import { AltCallout } from '@/components/WipCallout' Alt-DA Mode enables seamless integration of various Data Availability (DA) Layers, regardless of their commitment type, into the OP Stack. This allows any chain operator to launch an OP Stack chain using their favorite DA Layer for sustainably low costs. -## Sustainably Low Costs +## Sustainably low costs In order to function securely, OP Stack chains need to ensure that L2 transaction data is available to all node operators. EIP-4844 has massively reduced Ethereum L1 data costs for OP Stack rollups, but blobspace is on the path to congestion, which will lead to higher blob fees and increased chain operator costs. Over the past few years, alternative DA Layers have been built as an alternative place for L2s to post L2 data that is cheap, with more throughput, but remains stable and minimizes security and decentralization tradeoffs. -## How It Works +## How it works Alt-DA Mode introduces a standard interface for reading and writing data to Alt-DA Layers and allows any DA Layer team to build and maintain their own [DA Server](https://specs.optimism.io/experimental/alt-da.html#da-server) to enable the OP Stack to communicate with their DA Layer. The DA Server handles any of the custom DA Layer logic, such as key management, interfacing with a DA Layer node, etc. This abstraction ensures that new features and improvements to Alt-DA Mode will come to all chains using Alt-DA Mode, regardless of the DA Layer they choose to use. Although the Data Availability Challenge (DA Challenge) will be disabled at launch, this integration provides a solution compatible with upcoming OP Stack features. -## Future Improvements +## Future improvements Just like with the Rollup configuration of the OP Stack, core contributors are continuously improving the decentralization, security, and cost-effectiveness of Alt-DA Mode. Some of the future features that core contributors are looking to build are: @@ -39,7 +39,7 @@ Just like with the Rollup configuration of the OP Stack, core contributors are c Alt-DA Mode will always have more trust assumptions than simply posting data to L1 Ethereum. In its current initial iteration, Alt-DA Mode with generic commitments fully trusts the chain operator to make data available by both posting all data to the DA Layer and posting corresponding commitments to L1 Ethereum. If a chain operator posts incorrect commitments or does not post data to the DA Layer, it will not be accessible by node operators. The future improvements mentioned above are intended to address this trust assumption. After DA Bridges are integrated, then as long as the DA Layer and its DA Bridge are decentralized and functioning as intended, then once data is posted to the DA Layer, the L1 commitments would be bridged without relying on a single trusted party. It is important to remember that, even after integrating the DA Bridges and Fault Proofs, there will still be an added trust assumption that the DA Layer and DA Bridge are secure and functioning as intended. -## Next Steps +## Next steps * Ready to get started? Read our guide on how to [deploy your Alt-DA Mode chain](/builders/chain-operators/features/alt-da-mode). * For more info about how Alt-DA Mode works under the hood, [check out the specs](https://specs.optimism.io/experimental/alt-da.html). diff --git a/pages/stack/protocol/features/custom-gas-token.mdx b/pages/stack/protocol/features/custom-gas-token.mdx index b673f6dd0..f9f384e64 100644 --- a/pages/stack/protocol/features/custom-gas-token.mdx +++ b/pages/stack/protocol/features/custom-gas-token.mdx @@ -1,12 +1,12 @@ --- -title: Custom Gas Token Explainer +title: Custom Gas token explainer lang: en-US description: Learn the basic process, benefits, and considerations for running a custom gas token chain. --- import { Callout } from 'nextra/components' -# Custom Gas Token Explainer +# Custom gas token explainer The Custom Gas Token configuration lets OP Stack chain operators deploy their chain allowing a specific ERC-20 token to be deposited in as the native token to pay for gas fees. Chain operators can now customize their gas token to: @@ -15,7 +15,7 @@ The Custom Gas Token configuration lets OP Stack chain operators deploy their ch * facilitate in-game economies, allowing players to pay for gas with their in-game currency * build alignment with the community of any token. -## Native Gas Tokens +## Native gas tokens By default, L2 OP Stack chains allow users to deposit ETH from L1 into the L2 chain as native L2 token that can then be used to pay for gas fees. Chain operators wanted to configure the stack to use a custom token to pay for gas, other than ETH. @@ -32,7 +32,7 @@ When deposited, this L1 ERC-20 token will become the native gas token on the L2 * Understand the [constraints required for your chain to be able to join the Superchain](#considerations) when setting the custom gas token for your chain. -## How It Works +## How it works This is the general flow of how custom gas tokens work on the OP Stack: @@ -66,7 +66,7 @@ The custom token being used must adhere to the following constraints to be able -## Next Steps +## Next steps * Ready to get started? Read our guide on how to [deploy your custom gas token chain](/builders/chain-operators/features/custom-gas-token). * For more info about how the custom gas token feature works under the hood, [check out the specs](https://specs.optimism.io/experimental/custom-gas-token.html). diff --git a/pages/stack/protocol/features/send-raw-transaction-conditional.mdx b/pages/stack/protocol/features/send-raw-transaction-conditional.mdx index ae8b14175..5717ae5e8 100644 --- a/pages/stack/protocol/features/send-raw-transaction-conditional.mdx +++ b/pages/stack/protocol/features/send-raw-transaction-conditional.mdx @@ -1,12 +1,12 @@ --- -title: SendRawTransactionConditional Explainer +title: SendRawTransactionConditional explainer lang: en-US description: Learn about the eth_sendRawTransactionConditional RPC method for conditional transaction inclusion on the OP Stack. --- import { Callout } from 'nextra/components' -# SendRawTransactionConditional Explainer +# SendRawTransactionConditional explainer A sequencer rpc, `eth_sendRawTransactionConditional`, allowing callers to conditionally include a transaction based on a set of provided options. @@ -51,7 +51,7 @@ Successful submission does **NOT** guarantee inclusion! The caller must observe If you are running an active/passive setup with replicas that gossip txs to an active sequencer, this endpoint should be fronted by a proxy that can broadcast the request to all replicas. -## How To Enable +## How to enable This feature can be enabled with the addition of a flag to op-geth. diff --git a/pages/stack/protocol/interop/cross-chain-message.mdx b/pages/stack/protocol/interop/cross-chain-message.mdx index c00ef600a..ae15b27c1 100644 --- a/pages/stack/protocol/interop/cross-chain-message.mdx +++ b/pages/stack/protocol/interop/cross-chain-message.mdx @@ -1,5 +1,5 @@ --- -title: Anatomy of a Cross-Chain Message +title: Anatomy of a cross-chain message lang: en-US description: Learn how cross-chain messaging works with OP Stack interoperability. --- @@ -7,11 +7,11 @@ description: Learn how cross-chain messaging works with OP Stack interoperabilit import { Callout } from 'nextra/components' import Image from 'next/image' -# Anatomy of a Cross-Chain Message +# Anatomy of a cross-chain message A cross-chain message applies to any message sent across a chain. This applies to asset transfers using the [SuperchainERC20](https://specs.optimism.io/interop/token-bridging.html) token standard. -## How It Works +## How it works To send a cross-chain message on the Superchain using [Superchain interoperability](explainer), these two aspects must be in place: @@ -29,7 +29,7 @@ To send a cross-chain message on the Superchain using [Superchain interoperabili In the example above, `Ox123` sends 1 OP from OP Mainnet to Base, but this applies to any asset using the SuperchainERC20 token standard. -## Next Steps +## Next steps * More questions? Check out the FAQ section in the [Superchain Interop Explainer](explainer#faqs) or check out this [Superchain interop design video walk-thru](https://www.youtube.com/watch?v=FKc5RgjtGes). * Ready to get started? Use [Supersim](supersim), a local dev environment that simulates Superchain interop for testing applications against a local version of the Superchain. diff --git a/pages/stack/protocol/interop/explainer.mdx b/pages/stack/protocol/interop/explainer.mdx index 06758368e..6aa9dd2dc 100644 --- a/pages/stack/protocol/interop/explainer.mdx +++ b/pages/stack/protocol/interop/explainer.mdx @@ -1,5 +1,5 @@ --- -title: Interoperability Explainer +title: Interoperability explainer lang: en-US description: Learn the basics of interoperability on the OP Stack. --- @@ -11,7 +11,7 @@ import { InfoCallout } from '@/components/WipCallout' -# Interoperability Explainer +# Interoperability explainer Interoperability is the ability for a blockchain to securely read the state of another blockchain. Native OP Stack interoperability provides the ability to read messages and transfer assets across the Superchain (without having to go through L1) via secure message passing. This results in the following benefits: @@ -21,7 +21,7 @@ Native OP Stack interoperability provides the ability to read messages and trans * improved user experience for developers on the Superchain * secure transfer of ETH and ERC-20s across L2s -## Secure Message Passing +## Secure message passing Superchain interop includes both the protocol layer message passing and the Superchain ERC20 token specification. * **Message passing protocol:** the initial + finalizing/executing [message](https://specs.optimism.io/interop/messaging.html) that fire events to be consumed by the chains in the [dependency set](https://specs.optimism.io/interop/dependency-set.html) @@ -29,12 +29,12 @@ Superchain interop includes both the protocol layer message passing and the Supe This means ETH and ERC-20s can seamlessly and securely move across L2s, and intent-based protocols (i.e., bridges) can build better experiences on top of the message passing protocol. -## Low Latency +## Low latency Interoperability allows for horizontally scalable blockchains, a key feature of the Superchain. With Superchain interop, latency can be low (~2 seconds) by optimistically accepting cross-chain messages. The fork choice rule enforces eventual consistency, meaning that if an invalid cross-chain message is accepted, it will be reorganized out eventually. The fault proof guarantees that all of the cross-chain messages are accounted for from the perspective of handling withdrawals through the bridge to L1. -## Permissionless Chain Set +## Permissionless chain set It is permissionless to define a dependency on a chain, so chain operators will be able to choose which chains their chains depend on, and it is not a requirement that chains are in each other's dependency set. Chain operators can add or remove chains from the dependency set through the `SystemConfig`. For example, the dependency set for OP Mainnet is managed by Optimism Governance. diff --git a/pages/stack/protocol/interop/supersim.mdx b/pages/stack/protocol/interop/supersim.mdx index 10b88e8fe..c76863128 100644 --- a/pages/stack/protocol/interop/supersim.mdx +++ b/pages/stack/protocol/interop/supersim.mdx @@ -1,12 +1,12 @@ --- -title: Supersim Multichain Development Environment +title: Supersim multichain development environment lang: en-US description: Learn how to use the Supersim local dev environment tool designed to simulate the Optimism Superchain. --- import { Callout } from 'nextra/components' -# Supersim Multichain Development Environment +# Supersim multichain development environment Interop is currently in active development and not yet ready for production use. The information provided here may change. Check back regularly for the most up-to-date information. @@ -39,7 +39,7 @@ This diagram illustrates the typical workflow for developers using Supersim, fro * Easy to use with common Ethereum development tools * Supports chain forking -## Supersim CLI Interaction +## Supersim CLI interaction ```mermaid graph TD diff --git a/pages/stack/protocol/outages.mdx b/pages/stack/protocol/outages.mdx index 12ceed8cc..4f20970e9 100644 --- a/pages/stack/protocol/outages.mdx +++ b/pages/stack/protocol/outages.mdx @@ -1,10 +1,10 @@ --- -title: Sequencer Outages +title: Sequencer outages lang: en-US description: Learn what happens if the Sequencer goes down and how you can be prepared. --- -# Sequencer Outages +# Sequencer outages All OP Stack chains have a Sequencer that can receive, order, and publish L2 transactions to L1. Like any software systems, a Sequencer could potentially become unavailable for any number of different reasons. @@ -18,7 +18,7 @@ Sequencer outages can broadly be categorized into two different types: Both outage types can be circumvented by submitting transactions directly to the [`OptimismPortal`](https://github.com/ethereum-optimism/optimism/blob/111f3f3a3a2881899662e53e0f1b2f845b188a38/packages/contracts-bedrock/src/L1/OptimismPortal.sol#L209) contract on L1 with certain important caveats. Keep reading to learn more about these potential outages and how to handle them. -## Sequencer Downtime Outages +## Sequencer downtime outages ### Description @@ -37,7 +37,7 @@ Users may observe that the network appears to be "stuck" at a particular block h Users can always bypass the Sequencer by sending L2 transactions directly to the [`OptimismPortal`](https://github.com/ethereum-optimism/optimism/blob/111f3f3a3a2881899662e53e0f1b2f845b188a38/packages/contracts-bedrock/src/L1/OptimismPortal.sol#L209) contract on L1. Refer to the [Bypassing the Sequencer](#bypassing-the-sequencer) section below for more information about this functionality. -## Transaction Submission Outages +## Transaction submission outages ### Description @@ -60,7 +60,7 @@ This can appear to users as a large change in the expected state of the L2 chain Users can always bypass the Sequencer by sending L2 transactions directly to the [`OptimismPortal`](https://github.com/ethereum-optimism/optimism/blob/111f3f3a3a2881899662e53e0f1b2f845b188a38/packages/contracts-bedrock/src/L1/OptimismPortal.sol#L209) contract on L1. Refer to the [Bypassing the Sequencer](#bypassing-the-sequencer) section for more information about this functionality. -## Bypassing the Sequencer +## Bypassing the sequencer A core security goal of OP Stack chains is that the Sequencer should not be able to prevent users from submitting transactions to the L2 chain. Users of OP Stack chains can always bypass the sequencer and include transactions in the L2 chain by sending their L2 transactions directly to the [`OptimismPortal`](https://github.com/ethereum-optimism/optimism/blob/111f3f3a3a2881899662e53e0f1b2f845b188a38/packages/contracts-bedrock/src/L1/OptimismPortal.sol#L209) contract on L1. @@ -79,13 +79,13 @@ L2 transactions can be triggered on L1 by calling the `depositTransaction` funct Users can send any type of L2 transaction to the `OptimismPortal` contract including contract creations and transactions that carry ETH value. As a security measure, transactions sent via the `OptimismPortal` are indistinguishable from transactions sent via the Sequencer from the perspective of smart contracts on L2. -### Address Aliasing +### Address aliasing Transactions triggered via the `OptimismPortal` contract will appear to have been sent by the L1 address that triggered the transaction **unless** the transaction was sent by a smart contract. L2 transactions sent by smart contracts via the `OptimismPortal` contract will appear to have been sent by an "aliased" version of the smart contract's address. Refer to the [address aliasing](/chain/differences#address-aliasing) explainer for more information about address aliasing. -### Inclusion Rules +### Inclusion rules Transactions sent to the `OptimismPortal` contract are processed according to a set of rules designed to limit the impact of a failed Sequencer. It's important to understand these rules in detail to properly mitigate the effects of an outage. @@ -102,12 +102,12 @@ If the Sequencer is unavailable or transactions are not published to L1 within t Refer to the [L2 Chain Derivation Specification](https://specs.optimism.io/protocol/derivation.html) for a much more detailed explanation of how transactions sent to the `OptimismPortal` contract are processed. -### Inclusion Scenarios +### Inclusion scenarios It can be helpful to understand how transactions sent to the `OptimismPortal` contract are processed in different scenarios. The following scenarios make different assumptions about the state of the Sequencer and the L2 chain to illustrate how transactions sent to the `OptimismPortal` contract are processed. -#### Total Sequencer Outage +#### Total sequencer outage In this scenario we'll assume that the Sequencer is completely unavailable and unable to process any transactions. Users must send transactions directly to the `OptimismPortal` contract to have them included in the L2 chain. @@ -133,7 +133,7 @@ sequenceDiagram OP->>L2: Transaction 1 included in L2 automatically OP->>L2: Transaction 2 included in L2 automatically ``` -#### Partial Sequencer Outage +#### Partial sequencer outage In this scenario we'll assume that the Sequencer is down for some period of time but comes back online before the `sequencer_window` has elapsed. A user sends a transaction to the `OptimismPortal` during the downtime and but the Sequencer comes back online and includes the transaction in an L2 block before the full `sequencer_window` ends. @@ -152,7 +152,7 @@ sequenceDiagram S->>L2: Transaction included by Sequencer ``` -#### Partial Outage Ordering +#### Partial outage ordering Here we'll again assume that the Sequencer is down for some period of time but comes back online before the `sequencer_window` has elapsed. In this scenario, we'll observe the ability that the Sequencer has to include additional transactions in the L2 chain in between transactions sent to the `OptimismPortal` contract. diff --git a/pages/stack/protocol/rollup/deposit-flow.mdx b/pages/stack/protocol/rollup/deposit-flow.mdx index 3253e4032..54e80753b 100644 --- a/pages/stack/protocol/rollup/deposit-flow.mdx +++ b/pages/stack/protocol/rollup/deposit-flow.mdx @@ -1,5 +1,5 @@ --- -title: Deposit Flow +title: Deposit flow lang: en-US description: Learn the deposit flow process for L2 deposit transactions, triggered by events on L1. --- @@ -7,7 +7,7 @@ description: Learn the deposit flow process for L2 deposit transactions, trigger import Image from 'next/image' import { Callout } from 'nextra/components' -# Deposit Flow +# Deposit flow This guide explains the deposit flow process for L2 deposit transactions, triggered by transactions or events on L1. In Optimism terminology, "*deposit transaction*" refers to any L2 transaction that is triggered by a transaction or event on L1. @@ -16,7 +16,7 @@ Information is encapsulated in lower layer packets on the sending side and then ![Deposit Flow Diagram.](/img/op-stack/protocol/deposit-flow.svg) -## L1 Processing +## L1 processing 1. An L1 entity, either a smart contract or an externally owned account (EOA), sends a deposit transaction to [`L1CrossDomainMessenger`](https://github.com/ethereum-optimism/optimism/blob/62c7f3b05a70027b30054d4c8974f44000606fb7/packages/contracts-bedrock/contracts/L1/L1CrossDomainMessenger.sol), using [`sendMessage`](https://github.com/ethereum-optimism/optimism/blob/62c7f3b05a70027b30054d4c8974f44000606fb7/packages/contracts-bedrock/contracts/universal/CrossDomainMessenger.sol#L249-L289). This function accepts three parameters: @@ -44,7 +44,7 @@ Information is encapsulated in lower layer packets on the sending side and then 4. [The `depositTransaction` function](https://github.com/ethereum-optimism/optimism/blob/62c7f3b05a70027b30054d4c8974f44000606fb7/packages/contracts-bedrock/contracts/L1/OptimismPortal.sol#L422-L483) runs a few sanity checks, and then emits a [`TransactionDeposited`](https://github.com/ethereum-optimism/optimism/blob/62c7f3b05a70027b30054d4c8974f44000606fb7/packages/contracts-bedrock/contracts/L1/OptimismPortal.sol#L85-L99) event. -## L2 Processing +## L2 processing 1. The `op-node` component [looks for `TransactionDeposited` events on L1](https://github.com/ethereum-optimism/optimism/blob/62c7f3b05a70027b30054d4c8974f44000606fb7/op-node/rollup/derive/deposits.go#L13-L33). If it sees any such events, it [parses](https://github.com/ethereum-optimism/optimism/blob/62c7f3b05a70027b30054d4c8974f44000606fb7/op-node/rollup/derive/deposit_log.go) them. diff --git a/pages/stack/protocol/rollup/forced-transaction.mdx b/pages/stack/protocol/rollup/forced-transaction.mdx index a3b9694d9..bc293fd09 100644 --- a/pages/stack/protocol/rollup/forced-transaction.mdx +++ b/pages/stack/protocol/rollup/forced-transaction.mdx @@ -1,46 +1,46 @@ --- -title: Forced Transaction +title: Forced transaction lang: en-US description: Learn the forced transaction flow during sequencer downtime. --- import { Callout } from 'nextra/components' -## Forced Transaction Flow +## Forced transaction flow This guide explains the nuances of forced transactions during sequencer downtime. Users are able to force-include deposit transactions, which can initiate withdrawals, at any time. However, there are important nuances to understand about the chain derivation pipeline and sequencer behavior. -## Key Concepts +## Key concepts * **Sequencing Window**: A 12-hour rolling window to include L2 transactions, including native L2 transactions and deposit transactions. * **Max Time Drift**: 30 minutes, the maximum delay for including a deposit transaction, relative to the L2 chain. * **Sequencer Downtime**: Period when the sequencer is offline or not producing blocks. -## Normal Operation +## Normal operation Under normal circumstances: 1. Deposit transactions are included within 30 minutes. 2. The sequencer processes transactions and produces blocks regularly. -## Sequencer Downtime Scenarios +## Sequencer downtime scenarios -### Short Downtime (< 30 minutes) +### Short downtime (< 30 minutes) * Deposits are still included within the 30-minute max time drift. * Regular L2 transactions may be delayed. -### Extended Downtime (30 minutes to 12 hours) +### Extended downtime (30 minutes to 12 hours) 1. Deposits are force-included within 30 minutes. 2. The L2 chain state remains uncertain until: * The sequencer comes back online, or * The 12-hour sequencing window expires. -### Prolonged Downtime (> 12 hours) +### Prolonged downtime (> 12 hours) 1. After 12 hours, nodes start generating blocks deterministically. 2. These blocks only include deposit transactions. @@ -50,13 +50,13 @@ Under normal circumstances: -## Important Considerations +## Important considerations * Forced transactions, through deposits (no need for deposited value), ensure timely execution of actions, mitigating risks like DEX price divergence during sequencer downtime. * Actions remain speculative for up to 12 hours due to the sequencing window. * The 12-hour window is a balance between operational reliability and minimizing potential L2 reorganizations. -## Example Scenario +## Example scenario If a deposit is initiated after the 30-minute mark but before the sequencing window expires: diff --git a/pages/stack/protocol/rollup/overview.mdx b/pages/stack/protocol/rollup/overview.mdx index a275be581..b37d52bd0 100644 --- a/pages/stack/protocol/rollup/overview.mdx +++ b/pages/stack/protocol/rollup/overview.mdx @@ -1,24 +1,24 @@ --- -title: Rollup Protocol Overview +title: Rollup protocol overview lang: en-US description: Learn how Optimistic Rollups work at a high level. --- -# Rollup Protocol Overview +# Rollup protocol overview The big idea that makes Optimism possible is the Optimistic Rollup. We'll go through a brief explainer of *how* Optimistic Rollups work at a high level. Then we'll explain *why* Optimism is built as an Optimistic Rollup and why we believe it's the best option for a system that addresses all of our design goals. Check out the [protocol specs](https://specs.optimism.io/), if you want to more detail about the rollup protocol. -## Optimistic Rollups TL;DR +## Optimistic rollups TL;DR Optimism is an "Optimistic Rollup," which is basically just a fancy way of describing a blockchain that piggy-backs off of the security of another "parent" blockchain. Specifically, Optimistic Rollups leverage the consensus mechanism (like PoW or PoS) of their parent chain instead of providing their own. In OP Mainnet's case, this parent blockchain is Ethereum. ![Ethereum and Optimism Forever Doodle.](/img/op-stack/protocol/ethereum-optimism-forever.png) -## Block Storage +## Block storage In Bedrock, L2 blocks are saved to the Ethereum blockchain using a non-contract address ([`0xff00..0010` on Ethereum](https://etherscan.io/address/0xff00000000000000000000000000000000000010)) to minimize the L1 gas expense. As these blocks are submitted as transactions using EIP-4844 [blobs](/builders/chain-operators/management/blobs), there is no way to modify or censor them after the "transaction" is included in a block that has enough attestations. @@ -27,7 +27,7 @@ This is the way that OP Mainnet inherits the availability and integrity guarante Blocks are written to L1 in [a compressed format](https://specs.optimism.io/protocol/derivation.html#batch-submission-wire-format) to reduce costs. This is important because writing to L1 is [the major cost of OP Mainnet transactions](/stack/transactions/fees). -## Block Production +## Block production Optimism block production is primarily managed by a single party, called the "sequencer," which helps the network by providing the following services: @@ -52,7 +52,7 @@ Transactions get to the sequencer in two ways: For the moment, [The Optimism Foundation](https://www.optimism.io/) runs the only block producer on OP Mainnet. Refer to [Protocol specs](overview) section for more information about how we plan to decentralize the Sequencer role in the future. -## Block Execution +## Block execution The execution engine (implemented as the `op-geth` component) receive blocks using two mechanisms: @@ -64,7 +64,7 @@ The execution engine (implemented as the `op-geth` component) receive blocks usi This mechanism is slower, but censorship resistant. You can read more about it [in the specs](https://specs.optimism.io/protocol/exec-engine.html#worst-case-sync). -## Bridging ETH or Tokens Between Layers +## Bridging ETH or tokens between layers Optimism is designed so that users can send arbitrary messages between smart contracts on L2 (OP Mainnet, OP Sepolia, etc.) and the underlying L1 (Ethereum mainnet, Sepolia, etc.). This makes it possible to transfer ETH or tokens, including ERC20 tokens, between the two networks. @@ -96,7 +96,7 @@ Withdrawals (the term is used for any OP Mainnet to Ethereum message) have three [You can read the full withdrawal specifications here](https://specs.optimism.io/protocol/withdrawals.html) -## Fault Proofs +## Fault proofs In an Optimistic Rollup, state commitments are published to L1 (Ethereum in the case of OP Mainnet) without any direct proof of the validity of these commitments. Instead, these commitments are considered pending for a period of time (called the "challenge window"). @@ -110,7 +110,7 @@ The ordering of transactions and the state of OP Mainnet is unchanged by a fault The fault proof process is currently undergoing major redevelopment as a side-effect of the November 11th, 2021 [EVM Equivalence](https://web.archive.org/web/20231127160757/https://medium.com/ethereum-optimism/introducing-evm-equivalence-5c2021deb306) update. -## Next Steps +## Next steps * If you want to learn more about rollup protocol, check out the guides on [deposit flow](deposit-flow), [withdrawal flow](withdrawal-flow), or [transaction flow](transaction-flow). * To learn about operating your own L2 rollup, see the guide on [starting a self-hosted chain](/builders/chain-operators/self-hosted) or go directly to the tutorial on [creating your own L2 rollup](/builders/chain-operators/tutorials/create-l2-rollup). diff --git a/pages/stack/protocol/rollup/transaction-flow.mdx b/pages/stack/protocol/rollup/transaction-flow.mdx index 981a9e460..b076e5c4e 100644 --- a/pages/stack/protocol/rollup/transaction-flow.mdx +++ b/pages/stack/protocol/rollup/transaction-flow.mdx @@ -6,7 +6,7 @@ description: Learn the transaction flow process for rollup transactions. import { Callout } from 'nextra/components' -# Transaction Flow +# Transaction flow This guide explains the transaction flow process for rollup transactions. The process for a rollup transaction has two requirements. diff --git a/pages/stack/protocol/rollup/withdrawal-flow.mdx b/pages/stack/protocol/rollup/withdrawal-flow.mdx index dd2ae78b6..210bfe51f 100644 --- a/pages/stack/protocol/rollup/withdrawal-flow.mdx +++ b/pages/stack/protocol/rollup/withdrawal-flow.mdx @@ -1,12 +1,12 @@ --- -title: Withdrawal Flow +title: Withdrawal flow lang: en-US description: Learn the withdrawal flow process for transactions sent from L2 to L1. --- import { Callout } from 'nextra/components' -# Withdrawal Flow +# Withdrawal flow In Optimism terminology, a *withdrawal* is a transaction sent from L2 (OP Mainnet, OP Sepolia etc.) to L1 (Ethereum mainnet, Sepolia, etc.). @@ -79,17 +79,17 @@ The next step is to wait the fault challenge period, to ensure that the L2 outpu Finally, once the fault challenge period passes, the withdrawal can be finalized and executed on L1. -## Expected Internal Reverts in Withdrawal Transactions +## Expected internal reverts in withdrawal transactions During the withdrawal process, users may observe internal reverts when viewing the transaction on **Etherscan**. This is a common point of confusion but is expected behavior. These internal reverts often show up in yellow on the Etherscan UI and may cause concern that something went wrong with the transaction. However, these reverts occur due to the non-standard proxy used in Optimism, specifically the **Chugsplash Proxy**. The Chugsplash Proxy sometimes triggers internal calls that revert as part of the designed flow of the withdrawal process. -### Why Do These Reverts Happen? +### Why do these reverts happen? The Chugsplash Proxy operates differently than standard proxies. During a withdrawal transaction, it may trigger internal contract calls that result in reverts, but these reverts do not indicate that the withdrawal has failed. Instead, they are part of the internal logic of the system and are expected in certain scenarios. -### Key Takeaways: +### Key takeaways: * **Internal Reverts Are Expected**: These reverts are part of the normal operation of the Chugsplash Proxy during withdrawal transactions and do not represent an error. * **No Cause for Concern**: Although Etherscan highlights these reverts, they do not affect the final success of the transaction. diff --git a/pages/stack/security/faq.mdx b/pages/stack/security/faq.mdx index 2df0f86cd..31b892758 100644 --- a/pages/stack/security/faq.mdx +++ b/pages/stack/security/faq.mdx @@ -1,12 +1,12 @@ --- -title: OP Stack Security FAQs +title: OP Stack security FAQs lang: en-US description: Learn answers to common questions about OP Stack security. --- import { Callout } from 'nextra/components' -# OP Stack Security FAQs +# OP Stack security FAQs 🚧 The OP Stack is a work in progress. Constantly pushing to improve the overall security and decentralization of the OP Stack is a top priority. diff --git a/pages/stack/security/pause.mdx b/pages/stack/security/pause.mdx index 41fd67950..2491195e7 100644 --- a/pages/stack/security/pause.mdx +++ b/pages/stack/security/pause.mdx @@ -1,10 +1,10 @@ --- -title: Pausing the Bridge +title: Pausing the bridge lang: en-US description: Learn how the OP Stack bridge can be paused as backup safety mechanism. --- -# Pausing the Bridge +# Pausing the bridge The [`OptimismPortal`](https://github.com/ethereum-optimism/optimism/blob/v1.1.4/packages/contracts-bedrock/src/L1/OptimismPortal.sol) is the low-level L1 message passing contract present on all standard OP Stack chains. This contract handles the L1 side of the communication channel between an OP Stack chain and its L1 parent chain. @@ -15,7 +15,7 @@ This is a backup safety mechanism that can be used to help mitigate potential ac Pause functionality and [two-step withdrawals](https://web.archive.org/web/20230608050641/https://blog.oplabs.co/two-step-withdrawals/) were introduced to the OP Stack to mitigate the risk of withdrawal bugs that have led to exploits in other bridging systems. -## Pause Functionality +## Pause functionality The `OptimismPortal` can be configured to allow a `GUARDIAN` address to pause and unpause L2-to-L1 transactions from being executed. L2-to-L1 transactions allow users and smart contracts on the OP Stack chain to send messages to the L1 parent chain. @@ -25,12 +25,12 @@ L1-to-L2 transactions are not affected by pause functionality. Pauses by the `GUARDIAN` impact all L2-to-L1 transactions for the OP Stack chain in question and cannot be targeted to specific users, smart contracts, or transactions. Pauses are designed to be a backup safety mechanism and are expected to be used only in the event of an active pressing security concern. -## Pause and Unpause Functions +## Pause and unpause functions The `GUARDIAN` can pause and unpause L2-to-L1 transactions at any time by calling the [`pause`](https://github.com/ethereum-optimism/optimism/blob/v1.1.4/packages/contracts-bedrock/src/L1/OptimismPortal.sol#L151-L156) and [`unpause`](https://github.com/ethereum-optimism/optimism/blob/v1.1.4/packages/contracts-bedrock/src/L1/OptimismPortal.sol#L158-L163) functions on the `OptimismPortal` contract. Additional controls on the `GUARDIAN` address can be implemented by configuring the `GUARDIAN` as a smart contract. -## Guardian Address +## Guardian address The `GUARDIAN` address is initially configured when the OP Stack chain is deployed and can be modified by the network's administrative address or smart contract. A chain can choose to remove the `GUARDIAN` role by configuring the `GUARDIAN` to be an inaccessible address such as the [zero address](https://etherscan.io/address/0x0000000000000000000000000000000000000000). diff --git a/pages/stack/smart-contracts.mdx b/pages/stack/smart-contracts.mdx index cfb440e62..50ec26828 100644 --- a/pages/stack/smart-contracts.mdx +++ b/pages/stack/smart-contracts.mdx @@ -1,22 +1,22 @@ --- -title: Smart Contract Overview +title: Smart Contract overview lang: en-US description: Learn about the smart contracts that make up the OP Stack. --- import { Callout } from 'nextra/components' -# Smart Contract Overview +# Smart Contract overview This guide provides an overview of the functionality of the smart contract components. You can also find [contract addresses](/chain/addresses) on OP Mainnet. -## Layer 1 Contracts +## Layer 1 contracts The layer 1 contracts of the OP Stack are deployed on Ethereum. Their primary purpose is to facilitate the cross domain message passing and maintain the valid state root of the layer 2. -### Official Releases +### Official releases The full smart contract release process is documented in the [monorepo](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts-bedrock/VERSIONING.md). All production releases are always tagged, versioned as `/v`. @@ -33,7 +33,7 @@ Contract releases have a component name of `op-contracts` and therefore are tagg smart contracts—only deploy from `op-contracts/vX.Y.Z` -#### op-contracts/v1.6.0 - Fault Proof Fixes +#### op-contracts/v1.6.0 - Fault proof fixes The release fixes security vulnerabilities found in Fault Proof contracts. They were made in response to security vulnerabilities identified during a series of third-party security audits by Spearbit, Cantina, and Code4rena. None of the vulnerabilities have been exploited, and user assets are not and were never at risk. @@ -69,7 +69,7 @@ The upgrade was coupled with the [Granite network upgrade](/builders/node-operat

-#### op-contracts/v1.5.0 - Safe Extensions +#### op-contracts/v1.5.0 - Safe extensions The Safe Extensions protocol upgrade is intended to increase the security and decentralization of the Superchain by: @@ -119,7 +119,7 @@ vote for L2 predeploy upgrades and is a requirement for Stage 1.
-#### op-contracts/v1.4.0 - Fault Proofs +#### op-contracts/v1.4.0 - Fault proofs This protocol upgrade reduces the trust assumptions for users of the OP Stack by enabling permissionless output proposals and a permissionless fault proof diff --git a/pages/stack/transactions/fees.mdx b/pages/stack/transactions/fees.mdx index 1a6f3f47b..809137e54 100644 --- a/pages/stack/transactions/fees.mdx +++ b/pages/stack/transactions/fees.mdx @@ -1,12 +1,12 @@ --- -title: Transaction Fees on OP Mainnet +title: Transaction fees on OP Mainnet lang: en-US description: Learn how transaction fees work on OP Mainnet. --- import { Callout } from 'nextra/components' -# Transaction Fees on OP Mainnet +# Transaction fees on OP Mainnet OP Mainnet is designed to be [EVM equivalent](https://web.archive.org/web/20231127160757/https://medium.com/ethereum-optimism/introducing-evm-equivalence-5c2021deb306), which means it reuses the same Ethereum code you're already familiar with and behaves as much like Ethereum as possible. However, transaction fees on all Layer 2 systems need to diverge from Ethereum to some extent for a number of reasons. @@ -16,7 +16,7 @@ OP Mainnet transaction fees are composed of an [Execution Gas Fee](#execution-ga The total cost of a transaction is the sum of these two fees. Continue reading to learn more about exactly how each of these fee components are charged. -## Execution Gas Fee +## Execution gas fee A transaction's execution gas fee is exactly the same fee that you would pay for the same transaction on Ethereum. This fee is equal to the amount of gas used by the transaction multiplied by the gas price attached to the transaction. @@ -30,7 +30,7 @@ The only difference is that the gas price on OP Mainnet is much lower than the g For this component of the fee, you can estimate the total cost of a transaction using the same tools you would use to estimate the cost of a transaction on Ethereum. You can read more about how Ethereum's gas fees work over on [Ethereum.org](https://ethereum.org/en/developers/docs/gas/). -### Base Fee +### Base fee The [base fee](https://ethereum.org/en/developers/docs/gas/#base-fee) is the minimum price per unit of gas that a transaction must pay to be included in a block. Transactions must specify a maximum base fee higher than the block base fee to be included. @@ -40,7 +40,7 @@ The OP Mainnet base fee behaves exactly like the Ethereum base fee with a few sm None of these parameters should significantly impact your application, but you can read more about each of these parameters on the [OP Mainnet differences](/chain/differences#eip-1559) page. Read more about the base fee in the [Ethereum.org documentation](https://ethereum.org/en/developers/docs/gas/#base-fee). -### Priority Fee +### Priority fee Just like on Ethereum, OP Mainnet transactions can specify a **priority fee**. This priority fee is a price per unit of gas that is paid on top of the base fee. @@ -51,7 +51,7 @@ The priority fee is an optional component of the execution gas fee and can be se If transaction speed is important to your application, you may want to set a higher priority fee to ensure that your transaction is included more quickly. The [`eth_maxPriorityFeePerGas`](https://docs.alchemy.com/reference/eth-maxpriorityfeepergas) RPC method can be used to estimate a priority fee that will get your transaction included quickly. -## L1 Data Fee +## L1 data fee The L1 Data Fee is the only part of the OP Mainnet transaction fee that differs from the Ethereum transaction fee. This fee arises from the fact that the transaction data for all OP Mainnet transactions is published to Ethereum. @@ -210,7 +210,7 @@ The Sequencer Fee Vault collects and holds transaction fees paid to the sequence * **Vault Address**: The Sequencer Fee Vault is predeployed at the address `0x4200000000000000000000000000000000000011` on the OP Mainnet. * **Fee Usage**: Stored fees are eventually transferred to a designated recipient address (e.g., a treasury or distribution contract). -### How it Works +### How it works 1. **Fee Collection**: During the processing of transactions, the sequencer collects fees from users as part of their transaction costs. These fees are primarily used to cover the gas expenses of posting transaction data to Ethereum L1. 2. **Storage**: Collected fees are deposited into the Sequencer Fee Vault contract. @@ -218,7 +218,7 @@ The Sequencer Fee Vault collects and holds transaction fees paid to the sequence This system ensures effective fee management, maintaining the security and operation of the Optimism network. -## Next Steps +## Next steps * Read the [differences between Ethereum and OP Stack Chains](/stack/differences) guide. * Read the [L2 to L1 Transactions](/builders/app-developers/bridging/messaging#for-l1-to-l2-transactions) guide. From 7980202ae1135fa5bfee211e4cb114184b32297c Mon Sep 17 00:00:00 2001 From: krofax Date: Fri, 18 Oct 2024 10:41:39 +0100 Subject: [PATCH 195/565] fix breadcrumb --- pages/builders.mdx | 20 ++++++++++++++++++ pages/builders/app-developers.mdx | 19 +++++++++++++++++ pages/builders/app-developers/bridging.mdx | 21 +++++++++++++++++++ .../app-developers/bridging/custom-bridge.mdx | 4 ++-- pages/builders/cex-wallet-developers.mdx | 17 +++++++++++++++ pages/builders/notices.mdx | 19 +++++++++++++++++ 6 files changed, 98 insertions(+), 2 deletions(-) create mode 100644 pages/builders.mdx create mode 100644 pages/builders/app-developers.mdx create mode 100644 pages/builders/app-developers/bridging.mdx create mode 100644 pages/builders/cex-wallet-developers.mdx create mode 100644 pages/builders/notices.mdx diff --git a/pages/builders.mdx b/pages/builders.mdx new file mode 100644 index 000000000..320370a98 --- /dev/null +++ b/pages/builders.mdx @@ -0,0 +1,20 @@ +--- +title: Builders +lang: en-US +description: Learn about deploying contracts, cross-chain messaging, and tutorials to help you build applications on OP Mainnet. +--- + +import { Card, Cards } from 'nextra/components' + +# Builders + +The fixture is the main abstraction in React Cosmos. It represents a component example that can be rendered in isolation. A fixture file is generally colocated with its related component file. + + + + + + + + + diff --git a/pages/builders/app-developers.mdx b/pages/builders/app-developers.mdx new file mode 100644 index 000000000..386659d03 --- /dev/null +++ b/pages/builders/app-developers.mdx @@ -0,0 +1,19 @@ +--- +title: App Developers +lang: en-US +description: Learn about deploying contracts, cross-chain messaging, and tutorials to help you build applications on OP Mainnet. +--- + +import { Card, Cards } from 'nextra/components' + +# App Developers + +The fixture is the main abstraction in React Cosmos. It represents a component example that can be rendered in isolation. A fixture file is generally colocated with its related component file. + + + + + + + + diff --git a/pages/builders/app-developers/bridging.mdx b/pages/builders/app-developers/bridging.mdx new file mode 100644 index 000000000..7aa4b0af9 --- /dev/null +++ b/pages/builders/app-developers/bridging.mdx @@ -0,0 +1,21 @@ +--- +title: Bridging +lang: en-US +description: Learn about deploying contracts, cross-chain messaging, and tutorials to help you build applications on OP Mainnet. +--- + +import { Card, Cards } from 'nextra/components' + +# Bridging + +The fixture is the main abstraction in React Cosmos. It represents a component example that can be rendered in isolation. A fixture file is generally colocated with its related component file. + + + + + + + + + + diff --git a/pages/builders/app-developers/bridging/custom-bridge.mdx b/pages/builders/app-developers/bridging/custom-bridge.mdx index 23ea17319..d686bae85 100644 --- a/pages/builders/app-developers/bridging/custom-bridge.mdx +++ b/pages/builders/app-developers/bridging/custom-bridge.mdx @@ -15,7 +15,7 @@ This guide provides important information you should be aware of when building a Custom bridges can bring a significant amount of complexity and risk to any project. Before you commit to a custom bridge, be sure that the [Standard Bridge](./standard-bridge) definitely does not support your use case. - [Building a custom bridged token](/builders/app-developers/tutorials/standard-bridge-custom-token) is often sufficient for projects that need more flexibility. + [Building a custom bridged token](/builders/app-developers/tutorials/standard-bridge-custom-tokennnnyd) is often sufficient for projects that need more flexibility. ## Guidelines @@ -27,7 +27,7 @@ Doing so will provide you with an audited foundation upon which you can add extr If you choose not to extend the `StandardBridge` contract, you may still want to follow the interface that the `StandardBridge` provides. Bridges that extend this interface will be compatible with the [Superchain Bridges UI](https://app.optimism.io/bridge). -You can read more about the design of the Standard Bridge in the guide on [Using the Standard Bridge](./standard-bridge). +You can read more about the design of the Standard Bridge in the guide on [Using the Standard Bridge](./standard-bridgedgh). ## The Superchain Token List diff --git a/pages/builders/cex-wallet-developers.mdx b/pages/builders/cex-wallet-developers.mdx new file mode 100644 index 000000000..7c10a3564 --- /dev/null +++ b/pages/builders/cex-wallet-developers.mdx @@ -0,0 +1,17 @@ +--- +title: CEX Wallet For Developers +lang: en-US +description: Learn about deploying contracts, cross-chain messaging, and tutorials to help you build applications on OP Mainnet. +--- + +import { Card, Cards } from 'nextra/components' + +# CEX Wallet For Developers + +The fixture is the main abstraction in React Cosmos. It represents a component example that can be rendered in isolation. A fixture file is generally colocated with its related component file. + + + + + + diff --git a/pages/builders/notices.mdx b/pages/builders/notices.mdx new file mode 100644 index 000000000..a813d3f8b --- /dev/null +++ b/pages/builders/notices.mdx @@ -0,0 +1,19 @@ +--- +title: Notices +lang: en-US +description: Learn about deploying contracts, cross-chain messaging, and tutorials to help you build applications on OP Mainnet. +--- + +import { Card, Cards } from 'nextra/components' + +# Notices + +The fixture is the main abstraction in React Cosmos. It represents a component example that can be rendered in isolation. A fixture file is generally colocated with its related component file. + + + + + + + + From 1169966829e65e99a1b3eb5285ca21ae01663a5c Mon Sep 17 00:00:00 2001 From: krofax Date: Fri, 18 Oct 2024 11:41:17 +0100 Subject: [PATCH 196/565] Create an automation script --- package.json | 1 + pages/builders/app-developers.mdx | 16 ++++--- pages/builders/notices.mdx | 2 +- utils/create-breadcrumbs.ts | 80 +++++++++++++++++++++++++++++++ 4 files changed, 91 insertions(+), 8 deletions(-) create mode 100644 utils/create-breadcrumbs.ts diff --git a/package.json b/package.json index 7d4036e50..e2cb1242d 100644 --- a/package.json +++ b/package.json @@ -10,6 +10,7 @@ "linkcheck": "lychee --config ./lychee.toml --quiet \"./pages\"", "index:docs": "npx ts-node --skip-project utils/algolia-indexer.ts", "dev": "next dev", + "create-breadcrumbs":"npx ts-node --skip-project utils/create-breadcrumb.ts", "build": "next build", "start": "next start", "postbuild": "next-sitemap" diff --git a/pages/builders/app-developers.mdx b/pages/builders/app-developers.mdx index 386659d03..671d45bf2 100644 --- a/pages/builders/app-developers.mdx +++ b/pages/builders/app-developers.mdx @@ -1,19 +1,21 @@ --- title: App Developers lang: en-US -description: Learn about deploying contracts, cross-chain messaging, and tutorials to help you build applications on OP Mainnet. --- import { Card, Cards } from 'nextra/components' # App Developers -The fixture is the main abstraction in React Cosmos. It represents a component example that can be rendered in isolation. A fixture file is generally colocated with its related component file. +Welcome to the App Developers section, where you'll find essential resources for deploying contracts, handling transactions, cross-chain messaging, and more. +Access quick-start guides, tutorials, and tools to help you build applications on the OP Stack efficiently - - - - + + - + + + + + \ No newline at end of file diff --git a/pages/builders/notices.mdx b/pages/builders/notices.mdx index a813d3f8b..7d0f5b5c8 100644 --- a/pages/builders/notices.mdx +++ b/pages/builders/notices.mdx @@ -8,7 +8,7 @@ import { Card, Cards } from 'nextra/components' # Notices -The fixture is the main abstraction in React Cosmos. It represents a component example that can be rendered in isolation. A fixture file is generally colocated with its related component file. +Stay informed on important updates and announcements regarding the latest changes, improvements, and deprecations in OP Stack with our Notices page. diff --git a/utils/create-breadcrumbs.ts b/utils/create-breadcrumbs.ts new file mode 100644 index 000000000..0a4adb47a --- /dev/null +++ b/utils/create-breadcrumbs.ts @@ -0,0 +1,80 @@ +import * as fs from 'fs/promises'; +import * as path from 'path'; + +const targetFolders: string[] = ['builders', 'chain', 'stack', 'connect']; +const rootDir: string = path.join(__dirname, '..', 'pages'); + +interface FileInfo { + title: string; + url: string; +} + +const createIndexFile = async (folderPath: string, folderName: string): Promise => { + const files = await fs.readdir(folderPath); + const mdFiles = files.filter(file => file.endsWith('.md') && file !== 'index.md'); + + const title = folderName.charAt(0).toUpperCase() + folderName.slice(1); + + let content = `--- +title: ${title} +lang: en-US +--- + +import { Card, Cards } from 'nextra/components' + +# ${title} + +Welcome to the ${title} section. Here you'll find resources and information related to ${folderName}. + + +`; + + const filePromises: Promise[] = mdFiles.map(async (file) => { + const filePath = path.join(folderPath, file); + const fileContent = await fs.readFile(filePath, 'utf-8'); + const fileTitle = fileContent.match(/^#\s+(.+)/m)?.[1] || path.basename(file, '.md'); + const relativeUrl = `/${path.relative(rootDir, folderPath)}/${path.basename(file, '.md')}`.replace(/\\/g, '/'); + + return { title: fileTitle, url: relativeUrl }; + }); + + const fileInfos = await Promise.all(filePromises); + + fileInfos.forEach(({ title, url }) => { + content += ` \n`; + }); + + content += ''; + + await fs.writeFile(path.join(folderPath, 'index.md'), content); + console.log(`Created index.md in ${folderPath}`); +}; + +const processFolder = async (folderPath: string): Promise => { + try { + const files = await fs.readdir(folderPath); + + for (const file of files) { + const filePath = path.join(folderPath, file); + const stats = await fs.stat(filePath); + + if (stats.isDirectory()) { + await createIndexFile(filePath, file); + await processFolder(filePath); + } + } + } catch (error) { + console.error(`Error processing folder ${folderPath}:`, error); + } +}; + +const main = async (): Promise => { + for (const folder of targetFolders) { + const folderPath = path.join(rootDir, folder); + await processFolder(folderPath); + } +}; + +main().catch(console.error); + +console.log('Root directory:', rootDir); \ No newline at end of file From fbc2ca8863d54eb3424e7e4a0cc5b8b476c72a39 Mon Sep 17 00:00:00 2001 From: krofax Date: Fri, 18 Oct 2024 11:59:39 +0100 Subject: [PATCH 197/565] updated scripts --- package.json | 1 - 1 file changed, 1 deletion(-) diff --git a/package.json b/package.json index e2cb1242d..7d4036e50 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,6 @@ "linkcheck": "lychee --config ./lychee.toml --quiet \"./pages\"", "index:docs": "npx ts-node --skip-project utils/algolia-indexer.ts", "dev": "next dev", - "create-breadcrumbs":"npx ts-node --skip-project utils/create-breadcrumb.ts", "build": "next build", "start": "next start", "postbuild": "next-sitemap" From f7411ae40095fea2094471210f73df666bc2b360 Mon Sep 17 00:00:00 2001 From: krofax Date: Fri, 18 Oct 2024 11:59:50 +0100 Subject: [PATCH 198/565] update script commad --- package.json | 1 + utils/create-breadcrumbs.ts | 14 ++++++++------ 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index 7d4036e50..856bae818 100644 --- a/package.json +++ b/package.json @@ -8,6 +8,7 @@ "spellcheck:lint": "cspell lint \"**/*.mdx\"", "spellcheck:fix": "cspell --words-only --unique \"**/*.mdx\" | sort --ignore-case | uniq > words.txt", "linkcheck": "lychee --config ./lychee.toml --quiet \"./pages\"", + "create-breadcrumbs":"npx ts-node --skip-project utils/create-breadcrumbs.ts", "index:docs": "npx ts-node --skip-project utils/algolia-indexer.ts", "dev": "next dev", "build": "next build", diff --git a/utils/create-breadcrumbs.ts b/utils/create-breadcrumbs.ts index 0a4adb47a..50159fc91 100644 --- a/utils/create-breadcrumbs.ts +++ b/utils/create-breadcrumbs.ts @@ -9,9 +9,9 @@ interface FileInfo { url: string; } -const createIndexFile = async (folderPath: string, folderName: string): Promise => { +const createMdxFile = async (folderPath: string, folderName: string): Promise => { const files = await fs.readdir(folderPath); - const mdFiles = files.filter(file => file.endsWith('.md') && file !== 'index.md'); + const mdFiles = files.filter(file => file.endsWith('.md') || file.endsWith('.mdx')); const title = folderName.charAt(0).toUpperCase() + folderName.slice(1); @@ -33,7 +33,7 @@ Welcome to the ${title} section. Here you'll find resources and information rela const filePath = path.join(folderPath, file); const fileContent = await fs.readFile(filePath, 'utf-8'); const fileTitle = fileContent.match(/^#\s+(.+)/m)?.[1] || path.basename(file, '.md'); - const relativeUrl = `/${path.relative(rootDir, folderPath)}/${path.basename(file, '.md')}`.replace(/\\/g, '/'); + const relativeUrl = `/${path.relative(rootDir, folderPath)}/${path.basename(file, path.extname(file))}`.replace(/\\/g, '/'); return { title: fileTitle, url: relativeUrl }; }); @@ -46,8 +46,9 @@ Welcome to the ${title} section. Here you'll find resources and information rela content += ''; - await fs.writeFile(path.join(folderPath, 'index.md'), content); - console.log(`Created index.md in ${folderPath}`); + const mdxFileName = `${folderName}.mdx`; + await fs.writeFile(path.join(folderPath, mdxFileName), content); + console.log(`Created ${mdxFileName} in ${folderPath}`); }; const processFolder = async (folderPath: string): Promise => { @@ -59,7 +60,7 @@ const processFolder = async (folderPath: string): Promise => { const stats = await fs.stat(filePath); if (stats.isDirectory()) { - await createIndexFile(filePath, file); + await createMdxFile(filePath, file); await processFolder(filePath); } } @@ -77,4 +78,5 @@ const main = async (): Promise => { main().catch(console.error); +// Log the root directory for debugging console.log('Root directory:', rootDir); \ No newline at end of file From 0bead81fe9d768f186d0254c6a4c4b126ab9a013 Mon Sep 17 00:00:00 2001 From: krofax Date: Fri, 18 Oct 2024 12:21:57 +0100 Subject: [PATCH 199/565] create breadcrumbs --- pages/builders/app-developers/bridging.mdx | 14 +++---- pages/builders/app-developers/contracts.mdx | 16 ++++++++ pages/builders/app-developers/tools.mdx | 15 +++++++ .../builders/app-developers/transactions.mdx | 18 ++++++++ pages/builders/app-developers/tutorials.mdx | 23 +++++++++++ pages/builders/cex-wallet-developers.mdx | 14 +++---- pages/builders/chain-operators.mdx | 15 +++++++ .../chain-operators/configuration.mdx | 17 ++++++++ pages/builders/chain-operators/deploy.mdx | 16 ++++++++ pages/builders/chain-operators/features.mdx | 18 ++++++++ pages/builders/chain-operators/hacks.mdx | 19 +++++++++ pages/builders/chain-operators/management.mdx | 19 +++++++++ pages/builders/chain-operators/tools.mdx | 18 ++++++++ pages/builders/chain-operators/tutorials.mdx | 19 +++++++++ pages/builders/node-operators.mdx | 18 ++++++++ .../builders/node-operators/configuration.mdx | 16 ++++++++ pages/builders/node-operators/management.mdx | 18 ++++++++ pages/builders/node-operators/tutorials.mdx | 17 ++++++++ pages/builders/notices.mdx | 11 ++--- pages/builders/tools.mdx | 15 +++++++ pages/builders/tools/build.mdx | 18 ++++++++ pages/builders/tools/connect.mdx | 15 +++++++ pages/builders/tools/monitor.mdx | 15 +++++++ pages/builders/tools/op-tools.mdx | 13 ++++++ pages/chain/identity.mdx | 21 ++++++++++ pages/chain/security.mdx | 16 ++++++++ pages/chain/testing.mdx | 15 +++++++ pages/connect/contribute.mdx | 16 ++++++++ pages/connect/resources.mdx | 14 +++++++ pages/stack/operators.mdx | 13 ++++++ pages/stack/operators/features.mdx | 15 +++++++ pages/stack/protocol.mdx | 15 +++++++ pages/stack/protocol/fault-proofs.mdx | 19 +++++++++ pages/stack/protocol/features.mdx | 16 ++++++++ pages/stack/protocol/interop.mdx | 16 ++++++++ pages/stack/protocol/rollup.mdx | 18 ++++++++ pages/stack/security.mdx | 15 +++++++ pages/stack/transactions.mdx | 14 +++++++ utils/create-breadcrumbs.ts | 41 ++++++++++++++----- 39 files changed, 626 insertions(+), 35 deletions(-) create mode 100644 pages/builders/app-developers/contracts.mdx create mode 100644 pages/builders/app-developers/tools.mdx create mode 100644 pages/builders/app-developers/transactions.mdx create mode 100644 pages/builders/app-developers/tutorials.mdx create mode 100644 pages/builders/chain-operators.mdx create mode 100644 pages/builders/chain-operators/configuration.mdx create mode 100644 pages/builders/chain-operators/deploy.mdx create mode 100644 pages/builders/chain-operators/features.mdx create mode 100644 pages/builders/chain-operators/hacks.mdx create mode 100644 pages/builders/chain-operators/management.mdx create mode 100644 pages/builders/chain-operators/tools.mdx create mode 100644 pages/builders/chain-operators/tutorials.mdx create mode 100644 pages/builders/node-operators.mdx create mode 100644 pages/builders/node-operators/configuration.mdx create mode 100644 pages/builders/node-operators/management.mdx create mode 100644 pages/builders/node-operators/tutorials.mdx create mode 100644 pages/builders/tools.mdx create mode 100644 pages/builders/tools/build.mdx create mode 100644 pages/builders/tools/connect.mdx create mode 100644 pages/builders/tools/monitor.mdx create mode 100644 pages/builders/tools/op-tools.mdx create mode 100644 pages/chain/identity.mdx create mode 100644 pages/chain/security.mdx create mode 100644 pages/chain/testing.mdx create mode 100644 pages/connect/contribute.mdx create mode 100644 pages/connect/resources.mdx create mode 100644 pages/stack/operators.mdx create mode 100644 pages/stack/operators/features.mdx create mode 100644 pages/stack/protocol.mdx create mode 100644 pages/stack/protocol/fault-proofs.mdx create mode 100644 pages/stack/protocol/features.mdx create mode 100644 pages/stack/protocol/interop.mdx create mode 100644 pages/stack/protocol/rollup.mdx create mode 100644 pages/stack/security.mdx create mode 100644 pages/stack/transactions.mdx diff --git a/pages/builders/app-developers/bridging.mdx b/pages/builders/app-developers/bridging.mdx index 7aa4b0af9..96a048e64 100644 --- a/pages/builders/app-developers/bridging.mdx +++ b/pages/builders/app-developers/bridging.mdx @@ -1,21 +1,17 @@ --- title: Bridging lang: en-US -description: Learn about deploying contracts, cross-chain messaging, and tutorials to help you build applications on OP Mainnet. --- import { Card, Cards } from 'nextra/components' # Bridging -The fixture is the main abstraction in React Cosmos. It represents a component example that can be rendered in isolation. A fixture file is generally colocated with its related component file. +Welcome to the Bridging section. Here you'll find resources and information related to bridging. - - - - - - + + - + + \ No newline at end of file diff --git a/pages/builders/app-developers/contracts.mdx b/pages/builders/app-developers/contracts.mdx new file mode 100644 index 000000000..faff74bf3 --- /dev/null +++ b/pages/builders/app-developers/contracts.mdx @@ -0,0 +1,16 @@ +--- +title: Contracts +lang: en-US +--- + +import { Card, Cards } from 'nextra/components' + +# Contracts + +Welcome to the Contracts section. Here you'll find resources and information related to contracts. + + + + + + \ No newline at end of file diff --git a/pages/builders/app-developers/tools.mdx b/pages/builders/app-developers/tools.mdx new file mode 100644 index 000000000..4a7f25d80 --- /dev/null +++ b/pages/builders/app-developers/tools.mdx @@ -0,0 +1,15 @@ +--- +title: Tools +lang: en-US +--- + +import { Card, Cards } from 'nextra/components' + +# Tools + +Welcome to the Tools section. Here you'll find resources and information related to tools. + + + + + \ No newline at end of file diff --git a/pages/builders/app-developers/transactions.mdx b/pages/builders/app-developers/transactions.mdx new file mode 100644 index 000000000..6e7549ea0 --- /dev/null +++ b/pages/builders/app-developers/transactions.mdx @@ -0,0 +1,18 @@ +--- +title: Transactions +lang: en-US +--- + +import { Card, Cards } from 'nextra/components' + +# Transactions + +Welcome to the Transactions section. Here you'll find resources and information related to transactions. + + + + + + + + \ No newline at end of file diff --git a/pages/builders/app-developers/tutorials.mdx b/pages/builders/app-developers/tutorials.mdx new file mode 100644 index 000000000..011f2c5fb --- /dev/null +++ b/pages/builders/app-developers/tutorials.mdx @@ -0,0 +1,23 @@ +--- +title: Tutorials +lang: en-US +--- + +import { Card, Cards } from 'nextra/components' + +# Tutorials + +Welcome to the Tutorials section. Here you'll find resources and information related to tutorials. + + + + + + + + + + + + + \ No newline at end of file diff --git a/pages/builders/cex-wallet-developers.mdx b/pages/builders/cex-wallet-developers.mdx index 7c10a3564..25de150e6 100644 --- a/pages/builders/cex-wallet-developers.mdx +++ b/pages/builders/cex-wallet-developers.mdx @@ -1,17 +1,15 @@ --- -title: CEX Wallet For Developers +title: Cex-wallet-developers lang: en-US -description: Learn about deploying contracts, cross-chain messaging, and tutorials to help you build applications on OP Mainnet. --- import { Card, Cards } from 'nextra/components' -# CEX Wallet For Developers +# Cex-wallet-developers -The fixture is the main abstraction in React Cosmos. It represents a component example that can be rendered in isolation. A fixture file is generally colocated with its related component file. +Welcome to the Cex-wallet-developers section. Here you'll find resources and information related to cex-wallet-developers. - - - - + + + \ No newline at end of file diff --git a/pages/builders/chain-operators.mdx b/pages/builders/chain-operators.mdx new file mode 100644 index 000000000..172f83ea4 --- /dev/null +++ b/pages/builders/chain-operators.mdx @@ -0,0 +1,15 @@ +--- +title: Chain-operators +lang: en-US +--- + +import { Card, Cards } from 'nextra/components' + +# Chain-operators + +Welcome to the Chain-operators section. Here you'll find resources and information related to chain-operators. + + + + + \ No newline at end of file diff --git a/pages/builders/chain-operators/configuration.mdx b/pages/builders/chain-operators/configuration.mdx new file mode 100644 index 000000000..1d77a3cc0 --- /dev/null +++ b/pages/builders/chain-operators/configuration.mdx @@ -0,0 +1,17 @@ +--- +title: Configuration +lang: en-US +--- + +import { Card, Cards } from 'nextra/components' + +# Configuration + +Welcome to the Configuration section. Here you'll find resources and information related to configuration. + + + + + + + \ No newline at end of file diff --git a/pages/builders/chain-operators/deploy.mdx b/pages/builders/chain-operators/deploy.mdx new file mode 100644 index 000000000..e313903be --- /dev/null +++ b/pages/builders/chain-operators/deploy.mdx @@ -0,0 +1,16 @@ +--- +title: Deploy +lang: en-US +--- + +import { Card, Cards } from 'nextra/components' + +# Deploy + +Welcome to the Deploy section. Here you'll find resources and information related to deploy. + + + + + + \ No newline at end of file diff --git a/pages/builders/chain-operators/features.mdx b/pages/builders/chain-operators/features.mdx new file mode 100644 index 000000000..07f0ac010 --- /dev/null +++ b/pages/builders/chain-operators/features.mdx @@ -0,0 +1,18 @@ +--- +title: Features +lang: en-US +--- + +import { Card, Cards } from 'nextra/components' + +# Features + +Welcome to the Features section. Here you'll find resources and information related to features. + + + + + + + + \ No newline at end of file diff --git a/pages/builders/chain-operators/hacks.mdx b/pages/builders/chain-operators/hacks.mdx new file mode 100644 index 000000000..3e01c445b --- /dev/null +++ b/pages/builders/chain-operators/hacks.mdx @@ -0,0 +1,19 @@ +--- +title: Hacks +lang: en-US +--- + +import { Card, Cards } from 'nextra/components' + +# Hacks + +Welcome to the Hacks section. Here you'll find resources and information related to hacks. + + + + + + + + + \ No newline at end of file diff --git a/pages/builders/chain-operators/management.mdx b/pages/builders/chain-operators/management.mdx new file mode 100644 index 000000000..65121bfc4 --- /dev/null +++ b/pages/builders/chain-operators/management.mdx @@ -0,0 +1,19 @@ +--- +title: Management +lang: en-US +--- + +import { Card, Cards } from 'nextra/components' + +# Management + +Welcome to the Management section. Here you'll find resources and information related to management. + + + + + + + + + \ No newline at end of file diff --git a/pages/builders/chain-operators/tools.mdx b/pages/builders/chain-operators/tools.mdx new file mode 100644 index 000000000..a1899bf1a --- /dev/null +++ b/pages/builders/chain-operators/tools.mdx @@ -0,0 +1,18 @@ +--- +title: Tools +lang: en-US +--- + +import { Card, Cards } from 'nextra/components' + +# Tools + +Welcome to the Tools section. Here you'll find resources and information related to tools. + + + + + + + + \ No newline at end of file diff --git a/pages/builders/chain-operators/tutorials.mdx b/pages/builders/chain-operators/tutorials.mdx new file mode 100644 index 000000000..f993a94e9 --- /dev/null +++ b/pages/builders/chain-operators/tutorials.mdx @@ -0,0 +1,19 @@ +--- +title: Tutorials +lang: en-US +--- + +import { Card, Cards } from 'nextra/components' + +# Tutorials + +Welcome to the Tutorials section. Here you'll find resources and information related to tutorials. + + + + + + + + + \ No newline at end of file diff --git a/pages/builders/node-operators.mdx b/pages/builders/node-operators.mdx new file mode 100644 index 000000000..56d3a9bbc --- /dev/null +++ b/pages/builders/node-operators.mdx @@ -0,0 +1,18 @@ +--- +title: Node-operators +lang: en-US +--- + +import { Card, Cards } from 'nextra/components' + +# Node-operators + +Welcome to the Node-operators section. Here you'll find resources and information related to node-operators. + + + + + + + + \ No newline at end of file diff --git a/pages/builders/node-operators/configuration.mdx b/pages/builders/node-operators/configuration.mdx new file mode 100644 index 000000000..f7cbbb167 --- /dev/null +++ b/pages/builders/node-operators/configuration.mdx @@ -0,0 +1,16 @@ +--- +title: Configuration +lang: en-US +--- + +import { Card, Cards } from 'nextra/components' + +# Configuration + +Welcome to the Configuration section. Here you'll find resources and information related to configuration. + + + + + + \ No newline at end of file diff --git a/pages/builders/node-operators/management.mdx b/pages/builders/node-operators/management.mdx new file mode 100644 index 000000000..302c41771 --- /dev/null +++ b/pages/builders/node-operators/management.mdx @@ -0,0 +1,18 @@ +--- +title: Management +lang: en-US +--- + +import { Card, Cards } from 'nextra/components' + +# Management + +Welcome to the Management section. Here you'll find resources and information related to management. + + + + + + + + \ No newline at end of file diff --git a/pages/builders/node-operators/tutorials.mdx b/pages/builders/node-operators/tutorials.mdx new file mode 100644 index 000000000..1e8d23467 --- /dev/null +++ b/pages/builders/node-operators/tutorials.mdx @@ -0,0 +1,17 @@ +--- +title: Tutorials +lang: en-US +--- + +import { Card, Cards } from 'nextra/components' + +# Tutorials + +Welcome to the Tutorials section. Here you'll find resources and information related to tutorials. + + + + + + + \ No newline at end of file diff --git a/pages/builders/notices.mdx b/pages/builders/notices.mdx index 7d0f5b5c8..eeddcb0a8 100644 --- a/pages/builders/notices.mdx +++ b/pages/builders/notices.mdx @@ -1,19 +1,16 @@ --- title: Notices lang: en-US -description: Learn about deploying contracts, cross-chain messaging, and tutorials to help you build applications on OP Mainnet. --- import { Card, Cards } from 'nextra/components' # Notices -Stay informed on important updates and announcements regarding the latest changes, improvements, and deprecations in OP Stack with our Notices page. +Welcome to the Notices section. Here you'll find resources and information related to notices. - - - - - + + + \ No newline at end of file diff --git a/pages/builders/tools.mdx b/pages/builders/tools.mdx new file mode 100644 index 000000000..4e0d1a3bb --- /dev/null +++ b/pages/builders/tools.mdx @@ -0,0 +1,15 @@ +--- +title: Tools +lang: en-US +--- + +import { Card, Cards } from 'nextra/components' + +# Tools + +Welcome to the Tools section. Here you'll find resources and information related to tools. + + + + + \ No newline at end of file diff --git a/pages/builders/tools/build.mdx b/pages/builders/tools/build.mdx new file mode 100644 index 000000000..d1c345204 --- /dev/null +++ b/pages/builders/tools/build.mdx @@ -0,0 +1,18 @@ +--- +title: Build +lang: en-US +--- + +import { Card, Cards } from 'nextra/components' + +# Build + +Welcome to the Build section. Here you'll find resources and information related to build. + + + + + + + + \ No newline at end of file diff --git a/pages/builders/tools/connect.mdx b/pages/builders/tools/connect.mdx new file mode 100644 index 000000000..9401fe7e4 --- /dev/null +++ b/pages/builders/tools/connect.mdx @@ -0,0 +1,15 @@ +--- +title: Connect +lang: en-US +--- + +import { Card, Cards } from 'nextra/components' + +# Connect + +Welcome to the Connect section. Here you'll find resources and information related to connect. + + + + + \ No newline at end of file diff --git a/pages/builders/tools/monitor.mdx b/pages/builders/tools/monitor.mdx new file mode 100644 index 000000000..4205bce36 --- /dev/null +++ b/pages/builders/tools/monitor.mdx @@ -0,0 +1,15 @@ +--- +title: Monitor +lang: en-US +--- + +import { Card, Cards } from 'nextra/components' + +# Monitor + +Welcome to the Monitor section. Here you'll find resources and information related to monitor. + + + + + \ No newline at end of file diff --git a/pages/builders/tools/op-tools.mdx b/pages/builders/tools/op-tools.mdx new file mode 100644 index 000000000..56cd347b8 --- /dev/null +++ b/pages/builders/tools/op-tools.mdx @@ -0,0 +1,13 @@ +--- +title: Op-tools +lang: en-US +--- + +import { Card, Cards } from 'nextra/components' + +# Op-tools + +Welcome to the Op-tools section. Here you'll find resources and information related to op-tools. + + + \ No newline at end of file diff --git a/pages/chain/identity.mdx b/pages/chain/identity.mdx new file mode 100644 index 000000000..3e7c7cab5 --- /dev/null +++ b/pages/chain/identity.mdx @@ -0,0 +1,21 @@ +--- +title: Identity +lang: en-US +--- + +import { Card, Cards } from 'nextra/components' + +# Identity + +Welcome to the Identity section. Here you'll find resources and information related to identity. + + + + + + + + + + + \ No newline at end of file diff --git a/pages/chain/security.mdx b/pages/chain/security.mdx new file mode 100644 index 000000000..31e7523bc --- /dev/null +++ b/pages/chain/security.mdx @@ -0,0 +1,16 @@ +--- +title: Security +lang: en-US +--- + +import { Card, Cards } from 'nextra/components' + +# Security + +Welcome to the Security section. Here you'll find resources and information related to security. + + + + + + \ No newline at end of file diff --git a/pages/chain/testing.mdx b/pages/chain/testing.mdx new file mode 100644 index 000000000..1d55b3628 --- /dev/null +++ b/pages/chain/testing.mdx @@ -0,0 +1,15 @@ +--- +title: Testing +lang: en-US +--- + +import { Card, Cards } from 'nextra/components' + +# Testing + +Welcome to the Testing section. Here you'll find resources and information related to testing. + + + + + \ No newline at end of file diff --git a/pages/connect/contribute.mdx b/pages/connect/contribute.mdx new file mode 100644 index 000000000..689a1aa78 --- /dev/null +++ b/pages/connect/contribute.mdx @@ -0,0 +1,16 @@ +--- +title: Contribute +lang: en-US +--- + +import { Card, Cards } from 'nextra/components' + +# Contribute + +Welcome to the Contribute section. Here you'll find resources and information related to contribute. + + + + + + \ No newline at end of file diff --git a/pages/connect/resources.mdx b/pages/connect/resources.mdx new file mode 100644 index 000000000..11560af84 --- /dev/null +++ b/pages/connect/resources.mdx @@ -0,0 +1,14 @@ +--- +title: Resources +lang: en-US +--- + +import { Card, Cards } from 'nextra/components' + +# Resources + +Welcome to the Resources section. Here you'll find resources and information related to resources. + + + + \ No newline at end of file diff --git a/pages/stack/operators.mdx b/pages/stack/operators.mdx new file mode 100644 index 000000000..f95106122 --- /dev/null +++ b/pages/stack/operators.mdx @@ -0,0 +1,13 @@ +--- +title: Operators +lang: en-US +--- + +import { Card, Cards } from 'nextra/components' + +# Operators + +Welcome to the Operators section. Here you'll find resources and information related to operators. + + + \ No newline at end of file diff --git a/pages/stack/operators/features.mdx b/pages/stack/operators/features.mdx new file mode 100644 index 000000000..36224f885 --- /dev/null +++ b/pages/stack/operators/features.mdx @@ -0,0 +1,15 @@ +--- +title: Features +lang: en-US +--- + +import { Card, Cards } from 'nextra/components' + +# Features + +Welcome to the Features section. Here you'll find resources and information related to features. + + + + + \ No newline at end of file diff --git a/pages/stack/protocol.mdx b/pages/stack/protocol.mdx new file mode 100644 index 000000000..5e337a120 --- /dev/null +++ b/pages/stack/protocol.mdx @@ -0,0 +1,15 @@ +--- +title: Protocol +lang: en-US +--- + +import { Card, Cards } from 'nextra/components' + +# Protocol + +Welcome to the Protocol section. Here you'll find resources and information related to protocol. + + + + + \ No newline at end of file diff --git a/pages/stack/protocol/fault-proofs.mdx b/pages/stack/protocol/fault-proofs.mdx new file mode 100644 index 000000000..8e728944e --- /dev/null +++ b/pages/stack/protocol/fault-proofs.mdx @@ -0,0 +1,19 @@ +--- +title: Fault-proofs +lang: en-US +--- + +import { Card, Cards } from 'nextra/components' + +# Fault-proofs + +Welcome to the Fault-proofs section. Here you'll find resources and information related to fault-proofs. + + + + + + + + + \ No newline at end of file diff --git a/pages/stack/protocol/features.mdx b/pages/stack/protocol/features.mdx new file mode 100644 index 000000000..f5be9ad0d --- /dev/null +++ b/pages/stack/protocol/features.mdx @@ -0,0 +1,16 @@ +--- +title: Features +lang: en-US +--- + +import { Card, Cards } from 'nextra/components' + +# Features + +Welcome to the Features section. Here you'll find resources and information related to features. + + + + + + \ No newline at end of file diff --git a/pages/stack/protocol/interop.mdx b/pages/stack/protocol/interop.mdx new file mode 100644 index 000000000..c292b0b31 --- /dev/null +++ b/pages/stack/protocol/interop.mdx @@ -0,0 +1,16 @@ +--- +title: Interop +lang: en-US +--- + +import { Card, Cards } from 'nextra/components' + +# Interop + +Welcome to the Interop section. Here you'll find resources and information related to interop. + + + + + + \ No newline at end of file diff --git a/pages/stack/protocol/rollup.mdx b/pages/stack/protocol/rollup.mdx new file mode 100644 index 000000000..af30d9de7 --- /dev/null +++ b/pages/stack/protocol/rollup.mdx @@ -0,0 +1,18 @@ +--- +title: Rollup +lang: en-US +--- + +import { Card, Cards } from 'nextra/components' + +# Rollup + +Welcome to the Rollup section. Here you'll find resources and information related to rollup. + + + + + + + + \ No newline at end of file diff --git a/pages/stack/security.mdx b/pages/stack/security.mdx new file mode 100644 index 000000000..bee8a8e32 --- /dev/null +++ b/pages/stack/security.mdx @@ -0,0 +1,15 @@ +--- +title: Security +lang: en-US +--- + +import { Card, Cards } from 'nextra/components' + +# Security + +Welcome to the Security section. Here you'll find resources and information related to security. + + + + + \ No newline at end of file diff --git a/pages/stack/transactions.mdx b/pages/stack/transactions.mdx new file mode 100644 index 000000000..c66f69362 --- /dev/null +++ b/pages/stack/transactions.mdx @@ -0,0 +1,14 @@ +--- +title: Transactions +lang: en-US +--- + +import { Card, Cards } from 'nextra/components' + +# Transactions + +Welcome to the Transactions section. Here you'll find resources and information related to transactions. + + + + \ No newline at end of file diff --git a/utils/create-breadcrumbs.ts b/utils/create-breadcrumbs.ts index 50159fc91..07d832721 100644 --- a/utils/create-breadcrumbs.ts +++ b/utils/create-breadcrumbs.ts @@ -9,9 +9,13 @@ interface FileInfo { url: string; } -const createMdxFile = async (folderPath: string, folderName: string): Promise => { +const createMdxFile = async (parentFolderPath: string, folderName: string): Promise => { + const folderPath = path.join(parentFolderPath, folderName); const files = await fs.readdir(folderPath); - const mdFiles = files.filter(file => file.endsWith('.md') || file.endsWith('.mdx')); + const mdFiles = files.filter(file => + (file.endsWith('.md') || file.endsWith('.mdx')) && + !file.startsWith('_') + ); const title = folderName.charAt(0).toUpperCase() + folderName.slice(1); @@ -29,16 +33,18 @@ Welcome to the ${title} section. Here you'll find resources and information rela `; - const filePromises: Promise[] = mdFiles.map(async (file) => { + const fileInfos: FileInfo[] = []; + + for (const file of mdFiles) { const filePath = path.join(folderPath, file); const fileContent = await fs.readFile(filePath, 'utf-8'); - const fileTitle = fileContent.match(/^#\s+(.+)/m)?.[1] || path.basename(file, '.md'); + const fileTitle = fileContent.match(/^#\s+(.+)/m)?.[1] || path.basename(file, path.extname(file)); const relativeUrl = `/${path.relative(rootDir, folderPath)}/${path.basename(file, path.extname(file))}`.replace(/\\/g, '/'); - return { title: fileTitle, url: relativeUrl }; - }); - - const fileInfos = await Promise.all(filePromises); + if (!fileInfos.some(info => info.url === relativeUrl)) { + fileInfos.push({ title: fileTitle, url: relativeUrl }); + } + } fileInfos.forEach(({ title, url }) => { content += ` \n`; @@ -47,8 +53,21 @@ Welcome to the ${title} section. Here you'll find resources and information rela content += ''; const mdxFileName = `${folderName}.mdx`; - await fs.writeFile(path.join(folderPath, mdxFileName), content); - console.log(`Created ${mdxFileName} in ${folderPath}`); + const mdxFilePath = path.join(parentFolderPath, mdxFileName); + + // Check if the file already exists and has the same content + try { + const existingContent = await fs.readFile(mdxFilePath, 'utf-8'); + if (existingContent.trim() === content.trim()) { + console.log(`${mdxFileName} in ${parentFolderPath} is up to date. Skipping.`); + return; + } + } catch (error) { + // File doesn't exist, we'll create it + } + + await fs.writeFile(mdxFilePath, content); + console.log(`Created/Updated ${mdxFileName} in ${parentFolderPath}`); }; const processFolder = async (folderPath: string): Promise => { @@ -60,7 +79,7 @@ const processFolder = async (folderPath: string): Promise => { const stats = await fs.stat(filePath); if (stats.isDirectory()) { - await createMdxFile(filePath, file); + await createMdxFile(folderPath, file); await processFolder(filePath); } } From 598285df9a70de6de15188f9de64db198536269c Mon Sep 17 00:00:00 2001 From: krofax Date: Fri, 18 Oct 2024 12:25:19 +0100 Subject: [PATCH 200/565] update the breadcrumb result --- pages/builders/app-developers/bridging.mdx | 10 ++++----- pages/builders/app-developers/contracts.mdx | 8 +++---- pages/builders/app-developers/tools.mdx | 6 ++--- .../builders/app-developers/transactions.mdx | 12 +++++----- pages/builders/app-developers/tutorials.mdx | 22 +++++++++---------- pages/builders/cex-wallet-developers.mdx | 10 ++++----- pages/builders/chain-operators.mdx | 17 +++++++++----- .../chain-operators/configuration.mdx | 10 ++++----- pages/builders/chain-operators/deploy.mdx | 8 +++---- pages/builders/chain-operators/features.mdx | 12 +++++----- pages/builders/chain-operators/hacks.mdx | 14 ++++++------ pages/builders/chain-operators/management.mdx | 14 ++++++------ pages/builders/chain-operators/tools.mdx | 8 +++---- pages/builders/chain-operators/tutorials.mdx | 14 ++++++------ pages/builders/node-operators.mdx | 19 +++++++++------- .../builders/node-operators/configuration.mdx | 8 +++---- pages/builders/node-operators/management.mdx | 12 +++++----- pages/builders/node-operators/tutorials.mdx | 10 ++++----- pages/builders/notices.mdx | 8 +++---- pages/builders/tools.mdx | 10 ++++++--- pages/builders/tools/build.mdx | 10 ++++----- pages/builders/tools/connect.mdx | 6 ++--- pages/builders/tools/monitor.mdx | 6 ++--- pages/builders/tools/op-tools.mdx | 6 ++--- pages/chain/identity.mdx | 14 ++++++------ pages/chain/security.mdx | 8 +++---- pages/chain/testing.mdx | 6 ++--- pages/connect/contribute.mdx | 6 ++--- pages/connect/resources.mdx | 2 +- pages/stack/operators.mdx | 3 ++- pages/stack/operators/features.mdx | 6 ++--- pages/stack/protocol.mdx | 10 ++++++--- pages/stack/protocol/fault-proofs.mdx | 18 +++++++-------- pages/stack/protocol/features.mdx | 8 +++---- pages/stack/protocol/interop.mdx | 8 +++---- pages/stack/protocol/rollup.mdx | 12 +++++----- pages/stack/security.mdx | 6 ++--- pages/stack/transactions.mdx | 4 ++-- utils/create-breadcrumbs.ts | 13 ++++++++--- 39 files changed, 205 insertions(+), 179 deletions(-) diff --git a/pages/builders/app-developers/bridging.mdx b/pages/builders/app-developers/bridging.mdx index 96a048e64..75004ef03 100644 --- a/pages/builders/app-developers/bridging.mdx +++ b/pages/builders/app-developers/bridging.mdx @@ -7,11 +7,11 @@ import { Card, Cards } from 'nextra/components' # Bridging -Welcome to the Bridging section. Here you'll find resources and information related to bridging. +Welcome to the Bridging section. Here you'll find resources and information related to Bridging. - - - - + + + + \ No newline at end of file diff --git a/pages/builders/app-developers/contracts.mdx b/pages/builders/app-developers/contracts.mdx index faff74bf3..4fc916ac7 100644 --- a/pages/builders/app-developers/contracts.mdx +++ b/pages/builders/app-developers/contracts.mdx @@ -7,10 +7,10 @@ import { Card, Cards } from 'nextra/components' # Contracts -Welcome to the Contracts section. Here you'll find resources and information related to contracts. +Welcome to the Contracts section. Here you'll find resources and information related to Contracts. - - - + + + \ No newline at end of file diff --git a/pages/builders/app-developers/tools.mdx b/pages/builders/app-developers/tools.mdx index 4a7f25d80..efc7fff02 100644 --- a/pages/builders/app-developers/tools.mdx +++ b/pages/builders/app-developers/tools.mdx @@ -7,9 +7,9 @@ import { Card, Cards } from 'nextra/components' # Tools -Welcome to the Tools section. Here you'll find resources and information related to tools. +Welcome to the Tools section. Here you'll find resources and information related to Tools. - - + + \ No newline at end of file diff --git a/pages/builders/app-developers/transactions.mdx b/pages/builders/app-developers/transactions.mdx index 6e7549ea0..ca3fbba82 100644 --- a/pages/builders/app-developers/transactions.mdx +++ b/pages/builders/app-developers/transactions.mdx @@ -7,12 +7,12 @@ import { Card, Cards } from 'nextra/components' # Transactions -Welcome to the Transactions section. Here you'll find resources and information related to transactions. +Welcome to the Transactions section. Here you'll find resources and information related to Transactions. - - - - - + + + + + \ No newline at end of file diff --git a/pages/builders/app-developers/tutorials.mdx b/pages/builders/app-developers/tutorials.mdx index 011f2c5fb..25d837e7a 100644 --- a/pages/builders/app-developers/tutorials.mdx +++ b/pages/builders/app-developers/tutorials.mdx @@ -7,17 +7,17 @@ import { Card, Cards } from 'nextra/components' # Tutorials -Welcome to the Tutorials section. Here you'll find resources and information related to tutorials. +Welcome to the Tutorials section. Here you'll find resources and information related to Tutorials. - - - - - - - - - - + + + + + + + + + + \ No newline at end of file diff --git a/pages/builders/cex-wallet-developers.mdx b/pages/builders/cex-wallet-developers.mdx index 25de150e6..82d3e8b67 100644 --- a/pages/builders/cex-wallet-developers.mdx +++ b/pages/builders/cex-wallet-developers.mdx @@ -1,15 +1,15 @@ --- -title: Cex-wallet-developers +title: Cex Wallet Developers lang: en-US --- import { Card, Cards } from 'nextra/components' -# Cex-wallet-developers +# Cex Wallet Developers -Welcome to the Cex-wallet-developers section. Here you'll find resources and information related to cex-wallet-developers. +Welcome to the Cex Wallet Developers section. Here you'll find resources and information related to Cex Wallet Developers. - - + + \ No newline at end of file diff --git a/pages/builders/chain-operators.mdx b/pages/builders/chain-operators.mdx index 172f83ea4..813f1db8c 100644 --- a/pages/builders/chain-operators.mdx +++ b/pages/builders/chain-operators.mdx @@ -1,15 +1,22 @@ --- -title: Chain-operators +title: Chain Operators lang: en-US --- import { Card, Cards } from 'nextra/components' -# Chain-operators +# Chain Operators -Welcome to the Chain-operators section. Here you'll find resources and information related to chain-operators. +Welcome to the Chain Operators section. Here you'll find resources and information related to Chain Operators. - - + + + + + + + + + \ No newline at end of file diff --git a/pages/builders/chain-operators/configuration.mdx b/pages/builders/chain-operators/configuration.mdx index 1d77a3cc0..801a4e5c6 100644 --- a/pages/builders/chain-operators/configuration.mdx +++ b/pages/builders/chain-operators/configuration.mdx @@ -7,11 +7,11 @@ import { Card, Cards } from 'nextra/components' # Configuration -Welcome to the Configuration section. Here you'll find resources and information related to configuration. +Welcome to the Configuration section. Here you'll find resources and information related to Configuration. - - - - + + + + \ No newline at end of file diff --git a/pages/builders/chain-operators/deploy.mdx b/pages/builders/chain-operators/deploy.mdx index e313903be..15c11257e 100644 --- a/pages/builders/chain-operators/deploy.mdx +++ b/pages/builders/chain-operators/deploy.mdx @@ -7,10 +7,10 @@ import { Card, Cards } from 'nextra/components' # Deploy -Welcome to the Deploy section. Here you'll find resources and information related to deploy. +Welcome to the Deploy section. Here you'll find resources and information related to Deploy. - - - + + + \ No newline at end of file diff --git a/pages/builders/chain-operators/features.mdx b/pages/builders/chain-operators/features.mdx index 07f0ac010..399ae00af 100644 --- a/pages/builders/chain-operators/features.mdx +++ b/pages/builders/chain-operators/features.mdx @@ -7,12 +7,12 @@ import { Card, Cards } from 'nextra/components' # Features -Welcome to the Features section. Here you'll find resources and information related to features. +Welcome to the Features section. Here you'll find resources and information related to Features. - - - - - + + + + + \ No newline at end of file diff --git a/pages/builders/chain-operators/hacks.mdx b/pages/builders/chain-operators/hacks.mdx index 3e01c445b..2bcf974da 100644 --- a/pages/builders/chain-operators/hacks.mdx +++ b/pages/builders/chain-operators/hacks.mdx @@ -7,13 +7,13 @@ import { Card, Cards } from 'nextra/components' # Hacks -Welcome to the Hacks section. Here you'll find resources and information related to hacks. +Welcome to the Hacks section. Here you'll find resources and information related to Hacks. - - - - - - + + + + + + \ No newline at end of file diff --git a/pages/builders/chain-operators/management.mdx b/pages/builders/chain-operators/management.mdx index 65121bfc4..26d6dcc62 100644 --- a/pages/builders/chain-operators/management.mdx +++ b/pages/builders/chain-operators/management.mdx @@ -7,13 +7,13 @@ import { Card, Cards } from 'nextra/components' # Management -Welcome to the Management section. Here you'll find resources and information related to management. +Welcome to the Management section. Here you'll find resources and information related to Management. - - - - - - + + + + + + \ No newline at end of file diff --git a/pages/builders/chain-operators/tools.mdx b/pages/builders/chain-operators/tools.mdx index a1899bf1a..a688a5900 100644 --- a/pages/builders/chain-operators/tools.mdx +++ b/pages/builders/chain-operators/tools.mdx @@ -7,12 +7,12 @@ import { Card, Cards } from 'nextra/components' # Tools -Welcome to the Tools section. Here you'll find resources and information related to tools. +Welcome to the Tools section. Here you'll find resources and information related to Tools. - - - + + + \ No newline at end of file diff --git a/pages/builders/chain-operators/tutorials.mdx b/pages/builders/chain-operators/tutorials.mdx index f993a94e9..716917fb4 100644 --- a/pages/builders/chain-operators/tutorials.mdx +++ b/pages/builders/chain-operators/tutorials.mdx @@ -7,13 +7,13 @@ import { Card, Cards } from 'nextra/components' # Tutorials -Welcome to the Tutorials section. Here you'll find resources and information related to tutorials. +Welcome to the Tutorials section. Here you'll find resources and information related to Tutorials. - - - - - - + + + + + + \ No newline at end of file diff --git a/pages/builders/node-operators.mdx b/pages/builders/node-operators.mdx index 56d3a9bbc..21f812bf2 100644 --- a/pages/builders/node-operators.mdx +++ b/pages/builders/node-operators.mdx @@ -1,18 +1,21 @@ --- -title: Node-operators +title: Node Operators lang: en-US --- import { Card, Cards } from 'nextra/components' -# Node-operators +# Node Operators -Welcome to the Node-operators section. Here you'll find resources and information related to node-operators. +Welcome to the Node Operators section. Here you'll find resources and information related to Node Operators. - - - - - + + + + + + + + \ No newline at end of file diff --git a/pages/builders/node-operators/configuration.mdx b/pages/builders/node-operators/configuration.mdx index f7cbbb167..af4862bb8 100644 --- a/pages/builders/node-operators/configuration.mdx +++ b/pages/builders/node-operators/configuration.mdx @@ -7,10 +7,10 @@ import { Card, Cards } from 'nextra/components' # Configuration -Welcome to the Configuration section. Here you'll find resources and information related to configuration. +Welcome to the Configuration section. Here you'll find resources and information related to Configuration. - - - + + + \ No newline at end of file diff --git a/pages/builders/node-operators/management.mdx b/pages/builders/node-operators/management.mdx index 302c41771..5709df386 100644 --- a/pages/builders/node-operators/management.mdx +++ b/pages/builders/node-operators/management.mdx @@ -7,12 +7,12 @@ import { Card, Cards } from 'nextra/components' # Management -Welcome to the Management section. Here you'll find resources and information related to management. +Welcome to the Management section. Here you'll find resources and information related to Management. - - - - - + + + + + \ No newline at end of file diff --git a/pages/builders/node-operators/tutorials.mdx b/pages/builders/node-operators/tutorials.mdx index 1e8d23467..1d32f0985 100644 --- a/pages/builders/node-operators/tutorials.mdx +++ b/pages/builders/node-operators/tutorials.mdx @@ -7,11 +7,11 @@ import { Card, Cards } from 'nextra/components' # Tutorials -Welcome to the Tutorials section. Here you'll find resources and information related to tutorials. +Welcome to the Tutorials section. Here you'll find resources and information related to Tutorials. - - - - + + + + \ No newline at end of file diff --git a/pages/builders/notices.mdx b/pages/builders/notices.mdx index eeddcb0a8..e78cb48b0 100644 --- a/pages/builders/notices.mdx +++ b/pages/builders/notices.mdx @@ -7,10 +7,10 @@ import { Card, Cards } from 'nextra/components' # Notices -Welcome to the Notices section. Here you'll find resources and information related to notices. +Welcome to the Notices section. Here you'll find resources and information related to Notices. - - - + + + \ No newline at end of file diff --git a/pages/builders/tools.mdx b/pages/builders/tools.mdx index 4e0d1a3bb..6b85979c5 100644 --- a/pages/builders/tools.mdx +++ b/pages/builders/tools.mdx @@ -7,9 +7,13 @@ import { Card, Cards } from 'nextra/components' # Tools -Welcome to the Tools section. Here you'll find resources and information related to tools. +Welcome to the Tools section. Here you'll find resources and information related to Tools. - - + + + + + + \ No newline at end of file diff --git a/pages/builders/tools/build.mdx b/pages/builders/tools/build.mdx index d1c345204..75cad2a37 100644 --- a/pages/builders/tools/build.mdx +++ b/pages/builders/tools/build.mdx @@ -7,12 +7,12 @@ import { Card, Cards } from 'nextra/components' # Build -Welcome to the Build section. Here you'll find resources and information related to build. +Welcome to the Build section. Here you'll find resources and information related to Build. - - - - + + + + \ No newline at end of file diff --git a/pages/builders/tools/connect.mdx b/pages/builders/tools/connect.mdx index 9401fe7e4..d4d079032 100644 --- a/pages/builders/tools/connect.mdx +++ b/pages/builders/tools/connect.mdx @@ -7,9 +7,9 @@ import { Card, Cards } from 'nextra/components' # Connect -Welcome to the Connect section. Here you'll find resources and information related to connect. +Welcome to the Connect section. Here you'll find resources and information related to Connect. - - + + \ No newline at end of file diff --git a/pages/builders/tools/monitor.mdx b/pages/builders/tools/monitor.mdx index 4205bce36..d7a559d9e 100644 --- a/pages/builders/tools/monitor.mdx +++ b/pages/builders/tools/monitor.mdx @@ -7,9 +7,9 @@ import { Card, Cards } from 'nextra/components' # Monitor -Welcome to the Monitor section. Here you'll find resources and information related to monitor. +Welcome to the Monitor section. Here you'll find resources and information related to Monitor. - - + + \ No newline at end of file diff --git a/pages/builders/tools/op-tools.mdx b/pages/builders/tools/op-tools.mdx index 56cd347b8..9651722a5 100644 --- a/pages/builders/tools/op-tools.mdx +++ b/pages/builders/tools/op-tools.mdx @@ -1,13 +1,13 @@ --- -title: Op-tools +title: Op Tools lang: en-US --- import { Card, Cards } from 'nextra/components' -# Op-tools +# Op Tools -Welcome to the Op-tools section. Here you'll find resources and information related to op-tools. +Welcome to the Op Tools section. Here you'll find resources and information related to Op Tools. \ No newline at end of file diff --git a/pages/chain/identity.mdx b/pages/chain/identity.mdx index 3e7c7cab5..d527f33b9 100644 --- a/pages/chain/identity.mdx +++ b/pages/chain/identity.mdx @@ -7,15 +7,15 @@ import { Card, Cards } from 'nextra/components' # Identity -Welcome to the Identity section. Here you'll find resources and information related to identity. +Welcome to the Identity section. Here you'll find resources and information related to Identity. - - - - - + + + + + - + \ No newline at end of file diff --git a/pages/chain/security.mdx b/pages/chain/security.mdx index 31e7523bc..b792e5401 100644 --- a/pages/chain/security.mdx +++ b/pages/chain/security.mdx @@ -7,10 +7,10 @@ import { Card, Cards } from 'nextra/components' # Security -Welcome to the Security section. Here you'll find resources and information related to security. +Welcome to the Security section. Here you'll find resources and information related to Security. - - - + + + \ No newline at end of file diff --git a/pages/chain/testing.mdx b/pages/chain/testing.mdx index 1d55b3628..f71a3655b 100644 --- a/pages/chain/testing.mdx +++ b/pages/chain/testing.mdx @@ -7,9 +7,9 @@ import { Card, Cards } from 'nextra/components' # Testing -Welcome to the Testing section. Here you'll find resources and information related to testing. +Welcome to the Testing section. Here you'll find resources and information related to Testing. - - + + \ No newline at end of file diff --git a/pages/connect/contribute.mdx b/pages/connect/contribute.mdx index 689a1aa78..4572cb26c 100644 --- a/pages/connect/contribute.mdx +++ b/pages/connect/contribute.mdx @@ -7,10 +7,10 @@ import { Card, Cards } from 'nextra/components' # Contribute -Welcome to the Contribute section. Here you'll find resources and information related to contribute. +Welcome to the Contribute section. Here you'll find resources and information related to Contribute. - - + + \ No newline at end of file diff --git a/pages/connect/resources.mdx b/pages/connect/resources.mdx index 11560af84..afdf5a1e5 100644 --- a/pages/connect/resources.mdx +++ b/pages/connect/resources.mdx @@ -7,7 +7,7 @@ import { Card, Cards } from 'nextra/components' # Resources -Welcome to the Resources section. Here you'll find resources and information related to resources. +Welcome to the Resources section. Here you'll find resources and information related to Resources. diff --git a/pages/stack/operators.mdx b/pages/stack/operators.mdx index f95106122..df960b5ed 100644 --- a/pages/stack/operators.mdx +++ b/pages/stack/operators.mdx @@ -7,7 +7,8 @@ import { Card, Cards } from 'nextra/components' # Operators -Welcome to the Operators section. Here you'll find resources and information related to operators. +Welcome to the Operators section. Here you'll find resources and information related to Operators. + \ No newline at end of file diff --git a/pages/stack/operators/features.mdx b/pages/stack/operators/features.mdx index 36224f885..d59bf04c4 100644 --- a/pages/stack/operators/features.mdx +++ b/pages/stack/operators/features.mdx @@ -7,9 +7,9 @@ import { Card, Cards } from 'nextra/components' # Features -Welcome to the Features section. Here you'll find resources and information related to features. +Welcome to the Features section. Here you'll find resources and information related to Features. - - + + \ No newline at end of file diff --git a/pages/stack/protocol.mdx b/pages/stack/protocol.mdx index 5e337a120..4644266af 100644 --- a/pages/stack/protocol.mdx +++ b/pages/stack/protocol.mdx @@ -7,9 +7,13 @@ import { Card, Cards } from 'nextra/components' # Protocol -Welcome to the Protocol section. Here you'll find resources and information related to protocol. +Welcome to the Protocol section. Here you'll find resources and information related to Protocol. - - + + + + + + \ No newline at end of file diff --git a/pages/stack/protocol/fault-proofs.mdx b/pages/stack/protocol/fault-proofs.mdx index 8e728944e..4bd276ac1 100644 --- a/pages/stack/protocol/fault-proofs.mdx +++ b/pages/stack/protocol/fault-proofs.mdx @@ -1,19 +1,19 @@ --- -title: Fault-proofs +title: Fault Proofs lang: en-US --- import { Card, Cards } from 'nextra/components' -# Fault-proofs +# Fault Proofs -Welcome to the Fault-proofs section. Here you'll find resources and information related to fault-proofs. +Welcome to the Fault Proofs section. Here you'll find resources and information related to Fault Proofs. - - - - - - + + + + + + \ No newline at end of file diff --git a/pages/stack/protocol/features.mdx b/pages/stack/protocol/features.mdx index f5be9ad0d..5c119c1c9 100644 --- a/pages/stack/protocol/features.mdx +++ b/pages/stack/protocol/features.mdx @@ -7,10 +7,10 @@ import { Card, Cards } from 'nextra/components' # Features -Welcome to the Features section. Here you'll find resources and information related to features. +Welcome to the Features section. Here you'll find resources and information related to Features. - - - + + + \ No newline at end of file diff --git a/pages/stack/protocol/interop.mdx b/pages/stack/protocol/interop.mdx index c292b0b31..d0e44d848 100644 --- a/pages/stack/protocol/interop.mdx +++ b/pages/stack/protocol/interop.mdx @@ -7,10 +7,10 @@ import { Card, Cards } from 'nextra/components' # Interop -Welcome to the Interop section. Here you'll find resources and information related to interop. +Welcome to the Interop section. Here you'll find resources and information related to Interop. - - - + + + \ No newline at end of file diff --git a/pages/stack/protocol/rollup.mdx b/pages/stack/protocol/rollup.mdx index af30d9de7..708a0cb74 100644 --- a/pages/stack/protocol/rollup.mdx +++ b/pages/stack/protocol/rollup.mdx @@ -7,12 +7,12 @@ import { Card, Cards } from 'nextra/components' # Rollup -Welcome to the Rollup section. Here you'll find resources and information related to rollup. +Welcome to the Rollup section. Here you'll find resources and information related to Rollup. - - - - - + + + + + \ No newline at end of file diff --git a/pages/stack/security.mdx b/pages/stack/security.mdx index bee8a8e32..c591df29f 100644 --- a/pages/stack/security.mdx +++ b/pages/stack/security.mdx @@ -7,9 +7,9 @@ import { Card, Cards } from 'nextra/components' # Security -Welcome to the Security section. Here you'll find resources and information related to security. +Welcome to the Security section. Here you'll find resources and information related to Security. - - + + \ No newline at end of file diff --git a/pages/stack/transactions.mdx b/pages/stack/transactions.mdx index c66f69362..da08d899f 100644 --- a/pages/stack/transactions.mdx +++ b/pages/stack/transactions.mdx @@ -7,8 +7,8 @@ import { Card, Cards } from 'nextra/components' # Transactions -Welcome to the Transactions section. Here you'll find resources and information related to transactions. +Welcome to the Transactions section. Here you'll find resources and information related to Transactions. - + \ No newline at end of file diff --git a/utils/create-breadcrumbs.ts b/utils/create-breadcrumbs.ts index 07d832721..ca3c896d9 100644 --- a/utils/create-breadcrumbs.ts +++ b/utils/create-breadcrumbs.ts @@ -9,6 +9,12 @@ interface FileInfo { url: string; } +function toTitleCase(str: string): string { + return str.split('-').map(word => + word.charAt(0).toUpperCase() + word.slice(1).toLowerCase() + ).join(' '); +} + const createMdxFile = async (parentFolderPath: string, folderName: string): Promise => { const folderPath = path.join(parentFolderPath, folderName); const files = await fs.readdir(folderPath); @@ -17,7 +23,7 @@ const createMdxFile = async (parentFolderPath: string, folderName: string): Prom !file.startsWith('_') ); - const title = folderName.charAt(0).toUpperCase() + folderName.slice(1); + const title = toTitleCase(folderName); let content = `--- title: ${title} @@ -28,7 +34,7 @@ import { Card, Cards } from 'nextra/components' # ${title} -Welcome to the ${title} section. Here you'll find resources and information related to ${folderName}. +Welcome to the ${title} section. Here you'll find resources and information related to ${title}. `; @@ -38,7 +44,8 @@ Welcome to the ${title} section. Here you'll find resources and information rela for (const file of mdFiles) { const filePath = path.join(folderPath, file); const fileContent = await fs.readFile(filePath, 'utf-8'); - const fileTitle = fileContent.match(/^#\s+(.+)/m)?.[1] || path.basename(file, path.extname(file)); + let fileTitle = fileContent.match(/^#\s+(.+)/m)?.[1] || path.basename(file, path.extname(file)); + fileTitle = toTitleCase(fileTitle); const relativeUrl = `/${path.relative(rootDir, folderPath)}/${path.basename(file, path.extname(file))}`.replace(/\\/g, '/'); if (!fileInfos.some(info => info.url === relativeUrl)) { From d497a48e50e02911afabe5c0c7128dc1fa9b77d2 Mon Sep 17 00:00:00 2001 From: krofax Date: Fri, 18 Oct 2024 12:33:07 +0100 Subject: [PATCH 201/565] updated the breadcrumb contents --- pages/builders/app-developers/bridging.mdx | 2 +- pages/builders/app-developers/contracts.mdx | 2 +- pages/builders/app-developers/tools.mdx | 2 +- .../builders/app-developers/transactions.mdx | 2 +- pages/builders/app-developers/tutorials.mdx | 2 +- pages/builders/cex-wallet-developers.mdx | 2 +- pages/builders/chain-operators.mdx | 2 +- .../chain-operators/configuration.mdx | 2 +- pages/builders/chain-operators/deploy.mdx | 2 +- pages/builders/chain-operators/features.mdx | 2 +- pages/builders/chain-operators/hacks.mdx | 2 +- pages/builders/chain-operators/management.mdx | 2 +- pages/builders/chain-operators/tools.mdx | 2 +- pages/builders/chain-operators/tutorials.mdx | 2 +- pages/builders/node-operators.mdx | 2 +- .../builders/node-operators/configuration.mdx | 2 +- pages/builders/node-operators/management.mdx | 2 +- pages/builders/node-operators/tutorials.mdx | 2 +- pages/builders/notices.mdx | 2 +- pages/builders/tools.mdx | 4 +- pages/builders/tools/build.mdx | 2 +- pages/builders/tools/connect.mdx | 2 +- pages/builders/tools/monitor.mdx | 2 +- pages/builders/tools/op-tools.mdx | 2 +- pages/chain/identity.mdx | 2 +- pages/chain/security.mdx | 2 +- pages/chain/testing.mdx | 2 +- pages/connect/contribute.mdx | 2 +- pages/connect/resources.mdx | 2 +- pages/stack/operators.mdx | 2 +- pages/stack/operators/features.mdx | 2 +- pages/stack/protocol.mdx | 4 +- pages/stack/protocol/fault-proofs.mdx | 2 +- pages/stack/protocol/features.mdx | 2 +- pages/stack/protocol/interop.mdx | 2 +- pages/stack/protocol/rollup.mdx | 2 +- pages/stack/security.mdx | 2 +- pages/stack/transactions.mdx | 2 +- utils/create-breadcrumbs.ts | 62 ++++++++++++++----- 39 files changed, 87 insertions(+), 55 deletions(-) diff --git a/pages/builders/app-developers/bridging.mdx b/pages/builders/app-developers/bridging.mdx index 75004ef03..0505ec3c2 100644 --- a/pages/builders/app-developers/bridging.mdx +++ b/pages/builders/app-developers/bridging.mdx @@ -7,7 +7,7 @@ import { Card, Cards } from 'nextra/components' # Bridging -Welcome to the Bridging section. Here you'll find resources and information related to Bridging. +This section provides information on bridging basics, custom bridges, sending data between l1 and l2 and using the standard bridge. You'll find guide, overview to help you understand and work with these topics. diff --git a/pages/builders/app-developers/contracts.mdx b/pages/builders/app-developers/contracts.mdx index 4fc916ac7..a00fe97df 100644 --- a/pages/builders/app-developers/contracts.mdx +++ b/pages/builders/app-developers/contracts.mdx @@ -7,7 +7,7 @@ import { Card, Cards } from 'nextra/components' # Contracts -Welcome to the Contracts section. Here you'll find resources and information related to Contracts. +This section provides information on solidity compatibility, contract optimization on op mainnet and using op mainnet system contracts. You'll find guide, tutorial to help you understand and work with these topics. diff --git a/pages/builders/app-developers/tools.mdx b/pages/builders/app-developers/tools.mdx index efc7fff02..311e4c732 100644 --- a/pages/builders/app-developers/tools.mdx +++ b/pages/builders/app-developers/tools.mdx @@ -7,7 +7,7 @@ import { Card, Cards } from 'nextra/components' # Tools -Welcome to the Tools section. Here you'll find resources and information related to Tools. +This section provides information on open source code repo for op stack builders and supersim. You'll find reference to help you understand and work with these topics. diff --git a/pages/builders/app-developers/transactions.mdx b/pages/builders/app-developers/transactions.mdx index ca3fbba82..53c343741 100644 --- a/pages/builders/app-developers/transactions.mdx +++ b/pages/builders/app-developers/transactions.mdx @@ -7,7 +7,7 @@ import { Card, Cards } from 'nextra/components' # Transactions -Welcome to the Transactions section. Here you'll find resources and information related to Transactions. +This section provides information on estimating transaction fees on op mainnet, fees, setting transaction gas parameters on op mainnet, transaction statuses on op mainnet and troubleshooting transactions. You'll find guide to help you understand and work with these topics. diff --git a/pages/builders/app-developers/tutorials.mdx b/pages/builders/app-developers/tutorials.mdx index 25d837e7a..130cc9271 100644 --- a/pages/builders/app-developers/tutorials.mdx +++ b/pages/builders/app-developers/tutorials.mdx @@ -7,7 +7,7 @@ import { Card, Cards } from 'nextra/components' # Tutorials -Welcome to the Tutorials section. Here you'll find resources and information related to Tutorials. +This section provides information on bridging erc 20 tokens to op mainnet with the optimism sdk, bridging eth to op mainnet with the optimism sdk, communicating between op mainnet and ethereum in solidity, deploying your first contract on op mainnet, estimating transaction costs on op mainnet, tracing deposits and withdrawals, viewing deposits and withdrawals by address, triggering op mainnet transactions from ethereum, bridging your custom erc 20 token using the standard bridge and bridging your standard erc 20 token using the standard bridge. You'll find tutorial to help you understand and work with these topics. diff --git a/pages/builders/cex-wallet-developers.mdx b/pages/builders/cex-wallet-developers.mdx index 82d3e8b67..59a9f593c 100644 --- a/pages/builders/cex-wallet-developers.mdx +++ b/pages/builders/cex-wallet-developers.mdx @@ -7,7 +7,7 @@ import { Card, Cards } from 'nextra/components' # Cex Wallet Developers -Welcome to the Cex Wallet Developers section. Here you'll find resources and information related to Cex Wallet Developers. +This section provides information on supporting op mainnet in your exchange and supporting op mainnet in your wallet. You'll find guide to help you understand and work with these topics. diff --git a/pages/builders/chain-operators.mdx b/pages/builders/chain-operators.mdx index 813f1db8c..58f52f1fc 100644 --- a/pages/builders/chain-operators.mdx +++ b/pages/builders/chain-operators.mdx @@ -7,7 +7,7 @@ import { Card, Cards } from 'nextra/components' # Chain Operators -Welcome to the Chain Operators section. Here you'll find resources and information related to Chain Operators. +This section provides information on chain architecture, configuration, deploy, features, hacks, management, how to start a self hosted chain, tools and tutorials. You'll find tool, api, overview, guide, introduction to help you understand and work with these topics. diff --git a/pages/builders/chain-operators/configuration.mdx b/pages/builders/chain-operators/configuration.mdx index 801a4e5c6..eeb44b78f 100644 --- a/pages/builders/chain-operators/configuration.mdx +++ b/pages/builders/chain-operators/configuration.mdx @@ -7,7 +7,7 @@ import { Card, Cards } from 'nextra/components' # Configuration -Welcome to the Configuration section. Here you'll find resources and information related to Configuration. +This section provides information on batcher configuration, chain operator configurations, proposer configuration and rollup deployment configuration. You'll find api, overview to help you understand and work with these topics. diff --git a/pages/builders/chain-operators/deploy.mdx b/pages/builders/chain-operators/deploy.mdx index 15c11257e..5ce741ce6 100644 --- a/pages/builders/chain-operators/deploy.mdx +++ b/pages/builders/chain-operators/deploy.mdx @@ -7,7 +7,7 @@ import { Card, Cards } from 'nextra/components' # Deploy -Welcome to the Deploy section. Here you'll find resources and information related to Deploy. +This section provides information on op stack genesis creation, op stack deployment overview and op stack smart contract deployment. You'll find guide, overview to help you understand and work with these topics. diff --git a/pages/builders/chain-operators/features.mdx b/pages/builders/chain-operators/features.mdx index 399ae00af..8b629beeb 100644 --- a/pages/builders/chain-operators/features.mdx +++ b/pages/builders/chain-operators/features.mdx @@ -7,7 +7,7 @@ import { Card, Cards } from 'nextra/components' # Features -Welcome to the Features section. Here you'll find resources and information related to Features. +This section provides information on how to run an alt da mode chain, bridged usdc standard on the op stack, how to run a custom gas token chain, op stack preinstalls and span batches. You'll find guide, overview to help you understand and work with these topics. diff --git a/pages/builders/chain-operators/hacks.mdx b/pages/builders/chain-operators/hacks.mdx index 2bcf974da..2fcada575 100644 --- a/pages/builders/chain-operators/hacks.mdx +++ b/pages/builders/chain-operators/hacks.mdx @@ -7,7 +7,7 @@ import { Card, Cards } from 'nextra/components' # Hacks -Welcome to the Hacks section. Here you'll find resources and information related to Hacks. +This section provides information on data availability hacks, derivation hacks, execution hacks, featured hacks, introduction to op stack hacks and settlement hacks. You'll find overview, introduction to help you understand and work with these topics. diff --git a/pages/builders/chain-operators/management.mdx b/pages/builders/chain-operators/management.mdx index 26d6dcc62..cc1e0045a 100644 --- a/pages/builders/chain-operators/management.mdx +++ b/pages/builders/chain-operators/management.mdx @@ -7,7 +7,7 @@ import { Card, Cards } from 'nextra/components' # Management -Welcome to the Management section. Here you'll find resources and information related to Management. +This section provides information on chain operator best practices, using blobs, managing your keys, rollup operations, using snap sync for chain operators and troubleshooting: chain operations. You'll find guide, tutorial to help you understand and work with these topics. diff --git a/pages/builders/chain-operators/tools.mdx b/pages/builders/chain-operators/tools.mdx index a688a5900..7f1b4c16a 100644 --- a/pages/builders/chain-operators/tools.mdx +++ b/pages/builders/chain-operators/tools.mdx @@ -7,7 +7,7 @@ import { Card, Cards } from 'nextra/components' # Tools -Welcome to the Tools section. Here you'll find resources and information related to Tools. +This section provides information on chain monitoring options, deploying a block explorer, how to configure challenger for your chain, conductor and deployer. You'll find guide, overview, tool to help you understand and work with these topics. diff --git a/pages/builders/chain-operators/tutorials.mdx b/pages/builders/chain-operators/tutorials.mdx index 716917fb4..01726c074 100644 --- a/pages/builders/chain-operators/tutorials.mdx +++ b/pages/builders/chain-operators/tutorials.mdx @@ -7,7 +7,7 @@ import { Card, Cards } from 'nextra/components' # Tutorials -Welcome to the Tutorials section. Here you'll find resources and information related to Tutorials. +This section provides information on adding attributes to the derivation function, adding a precompile, creating your own l2 rollup testnet, integrating a new da layer with alt da, modifying predeployed contracts and using the optimism sdk. You'll find overview, tutorial, guide to help you understand and work with these topics. diff --git a/pages/builders/node-operators.mdx b/pages/builders/node-operators.mdx index 21f812bf2..bfc589137 100644 --- a/pages/builders/node-operators.mdx +++ b/pages/builders/node-operators.mdx @@ -7,7 +7,7 @@ import { Card, Cards } from 'nextra/components' # Node Operators -Welcome to the Node Operators section. Here you'll find resources and information related to Node Operators. +This section provides information on node architecture, configuration, json rpc api, management, network upgrade overview, node software releases, how to run a node in the superchain and tutorials. You'll find api, overview, guide, tutorial to help you understand and work with these topics. diff --git a/pages/builders/node-operators/configuration.mdx b/pages/builders/node-operators/configuration.mdx index af4862bb8..fc05dabfe 100644 --- a/pages/builders/node-operators/configuration.mdx +++ b/pages/builders/node-operators/configuration.mdx @@ -7,7 +7,7 @@ import { Card, Cards } from 'nextra/components' # Configuration -Welcome to the Configuration section. Here you'll find resources and information related to Configuration. +This section provides information on node base configuration, consensus layer configuration options (op node) and execution layer configuration options (op geth). You'll find api to help you understand and work with these topics. diff --git a/pages/builders/node-operators/management.mdx b/pages/builders/node-operators/management.mdx index 5709df386..1bdf97e7c 100644 --- a/pages/builders/node-operators/management.mdx +++ b/pages/builders/node-operators/management.mdx @@ -7,7 +7,7 @@ import { Card, Cards } from 'nextra/components' # Management -Welcome to the Management section. Here you'll find resources and information related to Management. +This section provides information on using blobs, node metrics and monitoring, using snap sync for node operators, node snapshots and node troubleshooting. You'll find api, reference, guide to help you understand and work with these topics. diff --git a/pages/builders/node-operators/tutorials.mdx b/pages/builders/node-operators/tutorials.mdx index 1d32f0985..5d32f7fe8 100644 --- a/pages/builders/node-operators/tutorials.mdx +++ b/pages/builders/node-operators/tutorials.mdx @@ -7,7 +7,7 @@ import { Card, Cards } from 'nextra/components' # Tutorials -Welcome to the Tutorials section. Here you'll find resources and information related to Tutorials. +This section provides information on running an op mainnet node from source, running a node with docker, building a node from source and running an op sepolia node from source. You'll find tutorial, guide to help you understand and work with these topics. diff --git a/pages/builders/notices.mdx b/pages/builders/notices.mdx index e78cb48b0..e1c7e5150 100644 --- a/pages/builders/notices.mdx +++ b/pages/builders/notices.mdx @@ -7,7 +7,7 @@ import { Card, Cards } from 'nextra/components' # Notices -Welcome to the Notices section. Here you'll find resources and information related to Notices. +This section provides information on preparing for fault proofs breaking changes, preparing for granite breaking changes and sdk deprecation. You'll find overview, tutorial to help you understand and work with these topics. diff --git a/pages/builders/tools.mdx b/pages/builders/tools.mdx index 6b85979c5..f9f600557 100644 --- a/pages/builders/tools.mdx +++ b/pages/builders/tools.mdx @@ -7,13 +7,13 @@ import { Card, Cards } from 'nextra/components' # Tools -Welcome to the Tools section. Here you'll find resources and information related to Tools. +This section provides information on build, connect, fjord fee parameter calculator, monitor, op tools and developer tools. You'll find guide, reference, tool, overview to help you understand and work with these topics. - + \ No newline at end of file diff --git a/pages/builders/tools/build.mdx b/pages/builders/tools/build.mdx index 75cad2a37..52c12a470 100644 --- a/pages/builders/tools/build.mdx +++ b/pages/builders/tools/build.mdx @@ -7,7 +7,7 @@ import { Card, Cards } from 'nextra/components' # Build -Welcome to the Build section. Here you'll find resources and information related to Build. +This section provides information on account abstraction, block explorers, testnet faucets, op mainnet nft tools and oracles. You'll find guide, reference, tool, api to help you understand and work with these topics. diff --git a/pages/builders/tools/connect.mdx b/pages/builders/tools/connect.mdx index d4d079032..2e461c553 100644 --- a/pages/builders/tools/connect.mdx +++ b/pages/builders/tools/connect.mdx @@ -7,7 +7,7 @@ import { Card, Cards } from 'nextra/components' # Connect -Welcome to the Connect section. Here you'll find resources and information related to Connect. +This section provides information on networks and rpc & node providers. You'll find reference to help you understand and work with these topics. diff --git a/pages/builders/tools/monitor.mdx b/pages/builders/tools/monitor.mdx index d7a559d9e..b7154ae3b 100644 --- a/pages/builders/tools/monitor.mdx +++ b/pages/builders/tools/monitor.mdx @@ -7,7 +7,7 @@ import { Card, Cards } from 'nextra/components' # Monitor -Welcome to the Monitor section. Here you'll find resources and information related to Monitor. +This section provides information on analytics tools and accessing pre regenesis history. You'll find guide, tool to help you understand and work with these topics. diff --git a/pages/builders/tools/op-tools.mdx b/pages/builders/tools/op-tools.mdx index 9651722a5..1ae5b07dc 100644 --- a/pages/builders/tools/op-tools.mdx +++ b/pages/builders/tools/op-tools.mdx @@ -7,7 +7,7 @@ import { Card, Cards } from 'nextra/components' # Op Tools -Welcome to the Op Tools section. Here you'll find resources and information related to Op Tools. +This section provides information on . \ No newline at end of file diff --git a/pages/chain/identity.mdx b/pages/chain/identity.mdx index d527f33b9..980a07dd9 100644 --- a/pages/chain/identity.mdx +++ b/pages/chain/identity.mdx @@ -7,7 +7,7 @@ import { Card, Cards } from 'nextra/components' # Identity -Welcome to the Identity section. Here you'll find resources and information related to Identity. +This section provides information on build decentralized identity apps with attestations, attestation apps, eas contracts, individuals, organizations, introduction, projects and schemas. You'll find guide, reference, overview to help you understand and work with these topics. diff --git a/pages/chain/security.mdx b/pages/chain/security.mdx index b792e5401..77d548773 100644 --- a/pages/chain/security.mdx +++ b/pages/chain/security.mdx @@ -7,7 +7,7 @@ import { Card, Cards } from 'nextra/components' # Security -Welcome to the Security section. Here you'll find resources and information related to Security. +This section provides information on op mainnet security model, privileged roles in op mainnet and security policy and bug bounty program. diff --git a/pages/chain/testing.mdx b/pages/chain/testing.mdx index f71a3655b..103f5b325 100644 --- a/pages/chain/testing.mdx +++ b/pages/chain/testing.mdx @@ -7,7 +7,7 @@ import { Card, Cards } from 'nextra/components' # Testing -Welcome to the Testing section. Here you'll find resources and information related to Testing. +This section provides information on running a local development environment and testing apps for op mainnet. You'll find tutorial, guide to help you understand and work with these topics. diff --git a/pages/connect/contribute.mdx b/pages/connect/contribute.mdx index 4572cb26c..549e138ff 100644 --- a/pages/connect/contribute.mdx +++ b/pages/connect/contribute.mdx @@ -7,7 +7,7 @@ import { Card, Cards } from 'nextra/components' # Contribute -Welcome to the Contribute section. Here you'll find resources and information related to Contribute. +This section provides information on contribute to optimism docs, contribute to the op stack and docs style guide. You'll find tutorial, overview, guide to help you understand and work with these topics. diff --git a/pages/connect/resources.mdx b/pages/connect/resources.mdx index afdf5a1e5..b689e047f 100644 --- a/pages/connect/resources.mdx +++ b/pages/connect/resources.mdx @@ -7,7 +7,7 @@ import { Card, Cards } from 'nextra/components' # Resources -Welcome to the Resources section. Here you'll find resources and information related to Resources. +This section provides information on . You'll find concept to help you understand and work with these topics. diff --git a/pages/stack/operators.mdx b/pages/stack/operators.mdx index df960b5ed..b387dc9d6 100644 --- a/pages/stack/operators.mdx +++ b/pages/stack/operators.mdx @@ -7,7 +7,7 @@ import { Card, Cards } from 'nextra/components' # Operators -Welcome to the Operators section. Here you'll find resources and information related to Operators. +This section provides information on . You'll find guide to help you understand and work with these topics. diff --git a/pages/stack/operators/features.mdx b/pages/stack/operators/features.mdx index d59bf04c4..bc015f4ab 100644 --- a/pages/stack/operators/features.mdx +++ b/pages/stack/operators/features.mdx @@ -7,7 +7,7 @@ import { Card, Cards } from 'nextra/components' # Features -Welcome to the Features section. Here you'll find resources and information related to Features. +This section provides information on op txproxy and proxyd. You'll find guide to help you understand and work with these topics. diff --git a/pages/stack/protocol.mdx b/pages/stack/protocol.mdx index 4644266af..adc2d3462 100644 --- a/pages/stack/protocol.mdx +++ b/pages/stack/protocol.mdx @@ -7,11 +7,11 @@ import { Card, Cards } from 'nextra/components' # Protocol -Welcome to the Protocol section. Here you'll find resources and information related to Protocol. +This section provides information on derivation pipeline, fault proofs, features, interop, sequencer outages and rollup. You'll find overview, reference, guide to help you understand and work with these topics. - + diff --git a/pages/stack/protocol/fault-proofs.mdx b/pages/stack/protocol/fault-proofs.mdx index 4bd276ac1..21ad9ad9a 100644 --- a/pages/stack/protocol/fault-proofs.mdx +++ b/pages/stack/protocol/fault-proofs.mdx @@ -7,7 +7,7 @@ import { Card, Cards } from 'nextra/components' # Fault Proofs -Welcome to the Fault Proofs section. Here you'll find resources and information related to Fault Proofs. +This section provides information on fault proof vm: cannon, op challenger explainer, fault proofs explainer, fp system components, fault proofs mainnet security and fault proof vm: mips.sol. You'll find reference, guide, overview, api, introduction to help you understand and work with these topics. diff --git a/pages/stack/protocol/features.mdx b/pages/stack/protocol/features.mdx index 5c119c1c9..bbf6dda79 100644 --- a/pages/stack/protocol/features.mdx +++ b/pages/stack/protocol/features.mdx @@ -7,7 +7,7 @@ import { Card, Cards } from 'nextra/components' # Features -Welcome to the Features section. Here you'll find resources and information related to Features. +This section provides information on alt da mode explainer, custom gas token explainer and sendrawtransactionconditional explainer. You'll find guide to help you understand and work with these topics. diff --git a/pages/stack/protocol/interop.mdx b/pages/stack/protocol/interop.mdx index d0e44d848..17cb34fcf 100644 --- a/pages/stack/protocol/interop.mdx +++ b/pages/stack/protocol/interop.mdx @@ -7,7 +7,7 @@ import { Card, Cards } from 'nextra/components' # Interop -Welcome to the Interop section. Here you'll find resources and information related to Interop. +This section provides information on anatomy of a cross chain message, interoperability explainer and supersim multichain development environment. You'll find overview, guide, tool to help you understand and work with these topics. diff --git a/pages/stack/protocol/rollup.mdx b/pages/stack/protocol/rollup.mdx index 708a0cb74..9fa2cd3ea 100644 --- a/pages/stack/protocol/rollup.mdx +++ b/pages/stack/protocol/rollup.mdx @@ -7,7 +7,7 @@ import { Card, Cards } from 'nextra/components' # Rollup -Welcome to the Rollup section. Here you'll find resources and information related to Rollup. +This section provides information on deposit flow, forced transaction, rollup protocol overview, transaction flow and withdrawal flow. You'll find guide, overview to help you understand and work with these topics. diff --git a/pages/stack/security.mdx b/pages/stack/security.mdx index c591df29f..5a32b09d2 100644 --- a/pages/stack/security.mdx +++ b/pages/stack/security.mdx @@ -7,7 +7,7 @@ import { Card, Cards } from 'nextra/components' # Security -Welcome to the Security section. Here you'll find resources and information related to Security. +This section provides information on op stack security faqs and pausing the bridge. diff --git a/pages/stack/transactions.mdx b/pages/stack/transactions.mdx index da08d899f..57d6495e0 100644 --- a/pages/stack/transactions.mdx +++ b/pages/stack/transactions.mdx @@ -7,7 +7,7 @@ import { Card, Cards } from 'nextra/components' # Transactions -Welcome to the Transactions section. Here you'll find resources and information related to Transactions. +This section provides information on . You'll find reference to help you understand and work with these topics. diff --git a/utils/create-breadcrumbs.ts b/utils/create-breadcrumbs.ts index ca3c896d9..00060b6a7 100644 --- a/utils/create-breadcrumbs.ts +++ b/utils/create-breadcrumbs.ts @@ -7,6 +7,7 @@ const rootDir: string = path.join(__dirname, '..', 'pages'); interface FileInfo { title: string; url: string; + content: string; } function toTitleCase(str: string): string { @@ -15,6 +16,35 @@ function toTitleCase(str: string): string { ).join(' '); } +function uniqueArray(arr: string[]): string[] { + return arr.filter((value, index, self) => self.indexOf(value) === index); +} + +function generateOverview(fileInfos: FileInfo[]): string { + const topics = fileInfos.map(file => file.title.toLowerCase()); + const uniqueTopics = uniqueArray(topics); + + let overview = `This section provides information on ${uniqueTopics.slice(0, -1).join(', ')}`; + if (uniqueTopics.length > 1) { + overview += ` and ${uniqueTopics[uniqueTopics.length - 1]}`; + } + overview += '. '; + + const keywordRegex = /\b(guide|tutorial|overview|introduction|tool|concept|api|reference)\b/i; + const keywords = uniqueArray( + fileInfos.flatMap(file => { + const matches = file.content.match(keywordRegex); + return matches ? matches.map(keyword => keyword.toLowerCase()) : []; + }) + ); + + if (keywords.length > 0) { + overview += `You'll find ${keywords.join(', ')} to help you understand and work with these topics.`; + } + + return overview; +} + const createMdxFile = async (parentFolderPath: string, folderName: string): Promise => { const folderPath = path.join(parentFolderPath, folderName); const files = await fs.readdir(folderPath); @@ -25,20 +55,6 @@ const createMdxFile = async (parentFolderPath: string, folderName: string): Prom const title = toTitleCase(folderName); - let content = `--- -title: ${title} -lang: en-US ---- - -import { Card, Cards } from 'nextra/components' - -# ${title} - -Welcome to the ${title} section. Here you'll find resources and information related to ${title}. - - -`; - const fileInfos: FileInfo[] = []; for (const file of mdFiles) { @@ -49,10 +65,26 @@ Welcome to the ${title} section. Here you'll find resources and information rela const relativeUrl = `/${path.relative(rootDir, folderPath)}/${path.basename(file, path.extname(file))}`.replace(/\\/g, '/'); if (!fileInfos.some(info => info.url === relativeUrl)) { - fileInfos.push({ title: fileTitle, url: relativeUrl }); + fileInfos.push({ title: fileTitle, url: relativeUrl, content: fileContent }); } } + const overview = generateOverview(fileInfos); + + let content = `--- +title: ${title} +lang: en-US +--- + +import { Card, Cards } from 'nextra/components' + +# ${title} + +${overview} + + +`; + fileInfos.forEach(({ title, url }) => { content += ` \n`; }); From 081c3293ef6f42a2e09c0fba90205619fc5062da Mon Sep 17 00:00:00 2001 From: krofax Date: Fri, 18 Oct 2024 13:02:07 +0100 Subject: [PATCH 202/565] remove comments --- utils/create-breadcrumbs.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/utils/create-breadcrumbs.ts b/utils/create-breadcrumbs.ts index 00060b6a7..fc123a605 100644 --- a/utils/create-breadcrumbs.ts +++ b/utils/create-breadcrumbs.ts @@ -102,7 +102,6 @@ ${overview} return; } } catch (error) { - // File doesn't exist, we'll create it } await fs.writeFile(mdxFilePath, content); @@ -136,5 +135,4 @@ const main = async (): Promise => { main().catch(console.error); -// Log the root directory for debugging console.log('Root directory:', rootDir); \ No newline at end of file From b832d2f6de4892ac33628ba81914da876491d137 Mon Sep 17 00:00:00 2001 From: krofax Date: Fri, 18 Oct 2024 13:02:40 +0100 Subject: [PATCH 203/565] fix lint issues --- pages/builders/app-developers.mdx | 10 ++++++++-- pages/builders/app-developers/bridging.mdx | 5 ++++- pages/builders/app-developers/contracts.mdx | 4 +++- pages/builders/app-developers/tools.mdx | 3 ++- pages/builders/app-developers/transactions.mdx | 6 +++++- pages/builders/app-developers/tutorials.mdx | 11 ++++++++++- pages/builders/cex-wallet-developers.mdx | 3 ++- pages/builders/chain-operators.mdx | 10 +++++++++- pages/builders/chain-operators/configuration.mdx | 5 ++++- pages/builders/chain-operators/deploy.mdx | 4 +++- pages/builders/chain-operators/features.mdx | 6 +++++- pages/builders/chain-operators/hacks.mdx | 7 ++++++- pages/builders/chain-operators/management.mdx | 7 ++++++- pages/builders/chain-operators/tools.mdx | 6 +++++- pages/builders/chain-operators/tutorials.mdx | 7 ++++++- pages/builders/node-operators.mdx | 9 ++++++++- pages/builders/node-operators/configuration.mdx | 4 +++- pages/builders/node-operators/management.mdx | 6 +++++- pages/builders/node-operators/tutorials.mdx | 5 ++++- pages/builders/notices.mdx | 4 +++- pages/builders/tools.mdx | 7 ++++++- pages/builders/tools/build.mdx | 6 +++++- pages/builders/tools/connect.mdx | 3 ++- pages/builders/tools/monitor.mdx | 3 ++- pages/builders/tools/op-tools.mdx | 5 ++--- pages/chain/identity.mdx | 9 ++++++++- pages/chain/security.mdx | 6 ++++-- pages/chain/testing.mdx | 3 ++- pages/connect/contribute.mdx | 4 +++- pages/connect/resources.mdx | 2 +- pages/stack/operators.mdx | 2 +- pages/stack/operators/features.mdx | 3 ++- pages/stack/protocol.mdx | 7 ++++++- pages/stack/protocol/fault-proofs.mdx | 7 ++++++- pages/stack/protocol/features.mdx | 4 +++- pages/stack/protocol/interop.mdx | 4 +++- pages/stack/protocol/rollup.mdx | 6 +++++- pages/stack/security.mdx | 5 +++-- pages/stack/transactions.mdx | 2 +- words.txt | 6 ++++++ 40 files changed, 172 insertions(+), 44 deletions(-) diff --git a/pages/builders/app-developers.mdx b/pages/builders/app-developers.mdx index 671d45bf2..2b1fb38e2 100644 --- a/pages/builders/app-developers.mdx +++ b/pages/builders/app-developers.mdx @@ -7,15 +7,21 @@ import { Card, Cards } from 'nextra/components' # App Developers -Welcome to the App Developers section, where you'll find essential resources for deploying contracts, handling transactions, cross-chain messaging, and more. +Welcome to the App Developers section, where you'll find essential resources for deploying contracts, handling transactions, cross-chain messaging, and more. Access quick-start guides, tutorials, and tools to help you build applications on the OP Stack efficiently + + + + + + - \ No newline at end of file + diff --git a/pages/builders/app-developers/bridging.mdx b/pages/builders/app-developers/bridging.mdx index 0505ec3c2..fffb0d890 100644 --- a/pages/builders/app-developers/bridging.mdx +++ b/pages/builders/app-developers/bridging.mdx @@ -11,7 +11,10 @@ This section provides information on bridging basics, custom bridges, sending da + + + - \ No newline at end of file + diff --git a/pages/builders/app-developers/contracts.mdx b/pages/builders/app-developers/contracts.mdx index a00fe97df..6aa071fe8 100644 --- a/pages/builders/app-developers/contracts.mdx +++ b/pages/builders/app-developers/contracts.mdx @@ -11,6 +11,8 @@ This section provides information on solidity compatibility, contract optimizati + + - \ No newline at end of file + diff --git a/pages/builders/app-developers/tools.mdx b/pages/builders/app-developers/tools.mdx index 311e4c732..be665e956 100644 --- a/pages/builders/app-developers/tools.mdx +++ b/pages/builders/app-developers/tools.mdx @@ -11,5 +11,6 @@ This section provides information on open source code repo for op stack builders + - \ No newline at end of file + diff --git a/pages/builders/app-developers/transactions.mdx b/pages/builders/app-developers/transactions.mdx index 53c343741..6350d183a 100644 --- a/pages/builders/app-developers/transactions.mdx +++ b/pages/builders/app-developers/transactions.mdx @@ -11,8 +11,12 @@ This section provides information on estimating transaction fees on op mainnet, + + + + - \ No newline at end of file + diff --git a/pages/builders/app-developers/tutorials.mdx b/pages/builders/app-developers/tutorials.mdx index 130cc9271..874941a77 100644 --- a/pages/builders/app-developers/tutorials.mdx +++ b/pages/builders/app-developers/tutorials.mdx @@ -11,13 +11,22 @@ This section provides information on bridging erc 20 tokens to op mainnet with t + + + + + + + + + - \ No newline at end of file + diff --git a/pages/builders/cex-wallet-developers.mdx b/pages/builders/cex-wallet-developers.mdx index 59a9f593c..57f632b38 100644 --- a/pages/builders/cex-wallet-developers.mdx +++ b/pages/builders/cex-wallet-developers.mdx @@ -11,5 +11,6 @@ This section provides information on supporting op mainnet in your exchange and + - \ No newline at end of file + diff --git a/pages/builders/chain-operators.mdx b/pages/builders/chain-operators.mdx index 58f52f1fc..3b54c31da 100644 --- a/pages/builders/chain-operators.mdx +++ b/pages/builders/chain-operators.mdx @@ -11,12 +11,20 @@ This section provides information on chain architecture, configuration, deploy, + + + + + + + + - \ No newline at end of file + diff --git a/pages/builders/chain-operators/configuration.mdx b/pages/builders/chain-operators/configuration.mdx index eeb44b78f..b4267cebb 100644 --- a/pages/builders/chain-operators/configuration.mdx +++ b/pages/builders/chain-operators/configuration.mdx @@ -11,7 +11,10 @@ This section provides information on batcher configuration, chain operator confi + + + - \ No newline at end of file + diff --git a/pages/builders/chain-operators/deploy.mdx b/pages/builders/chain-operators/deploy.mdx index 5ce741ce6..100f7bf78 100644 --- a/pages/builders/chain-operators/deploy.mdx +++ b/pages/builders/chain-operators/deploy.mdx @@ -11,6 +11,8 @@ This section provides information on op stack genesis creation, op stack deploym + + - \ No newline at end of file + diff --git a/pages/builders/chain-operators/features.mdx b/pages/builders/chain-operators/features.mdx index 8b629beeb..57da4c982 100644 --- a/pages/builders/chain-operators/features.mdx +++ b/pages/builders/chain-operators/features.mdx @@ -11,8 +11,12 @@ This section provides information on how to run an alt da mode chain, bridged us + + + + - \ No newline at end of file + diff --git a/pages/builders/chain-operators/hacks.mdx b/pages/builders/chain-operators/hacks.mdx index 2fcada575..2ec661074 100644 --- a/pages/builders/chain-operators/hacks.mdx +++ b/pages/builders/chain-operators/hacks.mdx @@ -11,9 +11,14 @@ This section provides information on data availability hacks, derivation hacks, + + + + + - \ No newline at end of file + diff --git a/pages/builders/chain-operators/management.mdx b/pages/builders/chain-operators/management.mdx index cc1e0045a..57c755c70 100644 --- a/pages/builders/chain-operators/management.mdx +++ b/pages/builders/chain-operators/management.mdx @@ -11,9 +11,14 @@ This section provides information on chain operator best practices, using blobs, + + + + + - \ No newline at end of file + diff --git a/pages/builders/chain-operators/tools.mdx b/pages/builders/chain-operators/tools.mdx index 7f1b4c16a..ee682af50 100644 --- a/pages/builders/chain-operators/tools.mdx +++ b/pages/builders/chain-operators/tools.mdx @@ -11,8 +11,12 @@ This section provides information on chain monitoring options, deploying a block + + + + - \ No newline at end of file + diff --git a/pages/builders/chain-operators/tutorials.mdx b/pages/builders/chain-operators/tutorials.mdx index 01726c074..23206d955 100644 --- a/pages/builders/chain-operators/tutorials.mdx +++ b/pages/builders/chain-operators/tutorials.mdx @@ -11,9 +11,14 @@ This section provides information on adding attributes to the derivation functio + + + + + - \ No newline at end of file + diff --git a/pages/builders/node-operators.mdx b/pages/builders/node-operators.mdx index bfc589137..3e1f573fc 100644 --- a/pages/builders/node-operators.mdx +++ b/pages/builders/node-operators.mdx @@ -11,11 +11,18 @@ This section provides information on node architecture, configuration, json rpc + + + + + + + - \ No newline at end of file + diff --git a/pages/builders/node-operators/configuration.mdx b/pages/builders/node-operators/configuration.mdx index fc05dabfe..97f7ef5d5 100644 --- a/pages/builders/node-operators/configuration.mdx +++ b/pages/builders/node-operators/configuration.mdx @@ -11,6 +11,8 @@ This section provides information on node base configuration, consensus layer co + + - \ No newline at end of file + diff --git a/pages/builders/node-operators/management.mdx b/pages/builders/node-operators/management.mdx index 1bdf97e7c..e2ca7e714 100644 --- a/pages/builders/node-operators/management.mdx +++ b/pages/builders/node-operators/management.mdx @@ -11,8 +11,12 @@ This section provides information on using blobs, node metrics and monitoring, u + + + + - \ No newline at end of file + diff --git a/pages/builders/node-operators/tutorials.mdx b/pages/builders/node-operators/tutorials.mdx index 5d32f7fe8..5ef234f07 100644 --- a/pages/builders/node-operators/tutorials.mdx +++ b/pages/builders/node-operators/tutorials.mdx @@ -11,7 +11,10 @@ This section provides information on running an op mainnet node from source, run + + + - \ No newline at end of file + diff --git a/pages/builders/notices.mdx b/pages/builders/notices.mdx index e1c7e5150..edcabfd6e 100644 --- a/pages/builders/notices.mdx +++ b/pages/builders/notices.mdx @@ -11,6 +11,8 @@ This section provides information on preparing for fault proofs breaking changes + + - \ No newline at end of file + diff --git a/pages/builders/tools.mdx b/pages/builders/tools.mdx index f9f600557..0117233b6 100644 --- a/pages/builders/tools.mdx +++ b/pages/builders/tools.mdx @@ -11,9 +11,14 @@ This section provides information on build, connect, fjord fee parameter calcula + + + + + - \ No newline at end of file + diff --git a/pages/builders/tools/build.mdx b/pages/builders/tools/build.mdx index 52c12a470..70bcb28fd 100644 --- a/pages/builders/tools/build.mdx +++ b/pages/builders/tools/build.mdx @@ -11,8 +11,12 @@ This section provides information on account abstraction, block explorers, testn + + + + - \ No newline at end of file + diff --git a/pages/builders/tools/connect.mdx b/pages/builders/tools/connect.mdx index 2e461c553..d0d8d2967 100644 --- a/pages/builders/tools/connect.mdx +++ b/pages/builders/tools/connect.mdx @@ -11,5 +11,6 @@ This section provides information on networks and rpc & node providers. You'll f + - \ No newline at end of file + diff --git a/pages/builders/tools/monitor.mdx b/pages/builders/tools/monitor.mdx index b7154ae3b..995ffb8bd 100644 --- a/pages/builders/tools/monitor.mdx +++ b/pages/builders/tools/monitor.mdx @@ -11,5 +11,6 @@ This section provides information on analytics tools and accessing pre regenesis + - \ No newline at end of file + diff --git a/pages/builders/tools/op-tools.mdx b/pages/builders/tools/op-tools.mdx index 1ae5b07dc..7d6a5c7af 100644 --- a/pages/builders/tools/op-tools.mdx +++ b/pages/builders/tools/op-tools.mdx @@ -7,7 +7,6 @@ import { Card, Cards } from 'nextra/components' # Op Tools -This section provides information on . +This section provides information on . - - \ No newline at end of file + diff --git a/pages/chain/identity.mdx b/pages/chain/identity.mdx index 980a07dd9..8e9494356 100644 --- a/pages/chain/identity.mdx +++ b/pages/chain/identity.mdx @@ -11,11 +11,18 @@ This section provides information on build decentralized identity apps with atte + + + + + + + - \ No newline at end of file + diff --git a/pages/chain/security.mdx b/pages/chain/security.mdx index 77d548773..aae3f716a 100644 --- a/pages/chain/security.mdx +++ b/pages/chain/security.mdx @@ -7,10 +7,12 @@ import { Card, Cards } from 'nextra/components' # Security -This section provides information on op mainnet security model, privileged roles in op mainnet and security policy and bug bounty program. +This section provides information on op mainnet security model, privileged roles in op mainnet and security policy and bug bounty program. + + - \ No newline at end of file + diff --git a/pages/chain/testing.mdx b/pages/chain/testing.mdx index 103f5b325..0e18191ba 100644 --- a/pages/chain/testing.mdx +++ b/pages/chain/testing.mdx @@ -11,5 +11,6 @@ This section provides information on running a local development environment and + - \ No newline at end of file + diff --git a/pages/connect/contribute.mdx b/pages/connect/contribute.mdx index 549e138ff..551889623 100644 --- a/pages/connect/contribute.mdx +++ b/pages/connect/contribute.mdx @@ -11,6 +11,8 @@ This section provides information on contribute to optimism docs, contribute to + + - \ No newline at end of file + diff --git a/pages/connect/resources.mdx b/pages/connect/resources.mdx index b689e047f..f922a7f4f 100644 --- a/pages/connect/resources.mdx +++ b/pages/connect/resources.mdx @@ -11,4 +11,4 @@ This section provides information on . You'll find concept to help you understan - \ No newline at end of file + diff --git a/pages/stack/operators.mdx b/pages/stack/operators.mdx index b387dc9d6..6fba143cd 100644 --- a/pages/stack/operators.mdx +++ b/pages/stack/operators.mdx @@ -11,4 +11,4 @@ This section provides information on . You'll find guide to help you understand - \ No newline at end of file + diff --git a/pages/stack/operators/features.mdx b/pages/stack/operators/features.mdx index bc015f4ab..0e3865182 100644 --- a/pages/stack/operators/features.mdx +++ b/pages/stack/operators/features.mdx @@ -11,5 +11,6 @@ This section provides information on op txproxy and proxyd. You'll find guide to + - \ No newline at end of file + diff --git a/pages/stack/protocol.mdx b/pages/stack/protocol.mdx index adc2d3462..ace2c58a4 100644 --- a/pages/stack/protocol.mdx +++ b/pages/stack/protocol.mdx @@ -11,9 +11,14 @@ This section provides information on derivation pipeline, fault proofs, features + + + + + - \ No newline at end of file + diff --git a/pages/stack/protocol/fault-proofs.mdx b/pages/stack/protocol/fault-proofs.mdx index 21ad9ad9a..2d21c4d0c 100644 --- a/pages/stack/protocol/fault-proofs.mdx +++ b/pages/stack/protocol/fault-proofs.mdx @@ -11,9 +11,14 @@ This section provides information on fault proof vm: cannon, op challenger expla + + + + + - \ No newline at end of file + diff --git a/pages/stack/protocol/features.mdx b/pages/stack/protocol/features.mdx index bbf6dda79..a96559d8e 100644 --- a/pages/stack/protocol/features.mdx +++ b/pages/stack/protocol/features.mdx @@ -11,6 +11,8 @@ This section provides information on alt da mode explainer, custom gas token exp + + - \ No newline at end of file + diff --git a/pages/stack/protocol/interop.mdx b/pages/stack/protocol/interop.mdx index 17cb34fcf..bcb1ecf0c 100644 --- a/pages/stack/protocol/interop.mdx +++ b/pages/stack/protocol/interop.mdx @@ -11,6 +11,8 @@ This section provides information on anatomy of a cross chain message, interoper + + - \ No newline at end of file + diff --git a/pages/stack/protocol/rollup.mdx b/pages/stack/protocol/rollup.mdx index 9fa2cd3ea..487f5882e 100644 --- a/pages/stack/protocol/rollup.mdx +++ b/pages/stack/protocol/rollup.mdx @@ -11,8 +11,12 @@ This section provides information on deposit flow, forced transaction, rollup pr + + + + - \ No newline at end of file + diff --git a/pages/stack/security.mdx b/pages/stack/security.mdx index 5a32b09d2..2ca1e092a 100644 --- a/pages/stack/security.mdx +++ b/pages/stack/security.mdx @@ -7,9 +7,10 @@ import { Card, Cards } from 'nextra/components' # Security -This section provides information on op stack security faqs and pausing the bridge. +This section provides information on op stack security faqs and pausing the bridge. + - \ No newline at end of file + diff --git a/pages/stack/transactions.mdx b/pages/stack/transactions.mdx index 57d6495e0..198b3838a 100644 --- a/pages/stack/transactions.mdx +++ b/pages/stack/transactions.mdx @@ -11,4 +11,4 @@ This section provides information on . You'll find reference to help you underst - \ No newline at end of file + diff --git a/words.txt b/words.txt index f325c6327..f0363cc63 100644 --- a/words.txt +++ b/words.txt @@ -205,6 +205,7 @@ MTLO MULT multiaddr Multichain +multichain multiclient multisigs MULTU @@ -284,6 +285,7 @@ productionize productionized Protip Proxied +Proxyd proxyd pseudorandomly QRNG @@ -317,6 +319,8 @@ safedb Schnorr secp SELFDESTRUCT +Sendrawtransactionconditional +sendrawtransactionconditional seqnr SEQUENCERHTTP sequencerhttp @@ -365,8 +369,10 @@ trustlessly trustrpc txfeecap txmgr +txns TXPOOL txpool +Txproxy txproxy uncountered Unprotect From 260d87213e40495a479344236eaa27694773d439 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Fri, 18 Oct 2024 14:44:15 +0100 Subject: [PATCH 204/565] updated the codebase --- .../tutorials/sdk-estimate-costs.mdx | 62 +++++-------------- public/tutorials/sdk-estimate-costs.js | 21 ++----- 2 files changed, 20 insertions(+), 63 deletions(-) diff --git a/pages/builders/app-developers/tutorials/sdk-estimate-costs.mdx b/pages/builders/app-developers/tutorials/sdk-estimate-costs.mdx index 3412fa209..677890ed1 100644 --- a/pages/builders/app-developers/tutorials/sdk-estimate-costs.mdx +++ b/pages/builders/app-developers/tutorials/sdk-estimate-costs.mdx @@ -36,8 +36,8 @@ Since Viem is a [Node.js](https://nodejs.org/en/) library, you'll need to create {

Make a Project Folder

} ```bash - mkdir op-sample-project - cd op-sample-project + mkdir op-est-cost-tutorial + cd op-est-cost-tutorial ``` {

Initialize the Project

} @@ -127,55 +127,23 @@ Let's set those up now. ## Estimate Transaction Costs -You're now going to estimate the cost of a transaction on OP Mainnet. +You're now going to use the Viem to estimate the cost of a transaction on OP Mainnet. +Here you'll estimate the cost of a simple transaction that sends a small amount of ETH from your address to the address `0x1000000000000000000000000000000000000000`. - {

Define the transaction

} + {

Create the unsigned transaction

} - Viem makes it easy to prepare a transactions so you can estimate the cost of a transaction before you sign it. - Here you'll define an object with the required transaction fields and send a small amount of ETH from your address to the address `0x1000000000000000000000000000000000000000`. + Viem makes it easy to create unsigned transactions so you can estimate the cost of a transaction before you a user to sign it. + Here you'll create an unsigned transaction that sends a small amount of ETH from your address to the address `0x1000000000000000000000000000000000000000`. -```js file=/public/tutorials/sdk-estimate-costs.js#L21-L26 hash=96e2f9bcece6c455f64c82e44bce1105 -``` - This transaction will send `0.005` ETH to the specified address with a gas price of 20 Gwei. - - {

Estimate the execution gas fee

} - - Now, let's estimate the gas limit for our transaction. - -```js file=/public/tutorials/sdk-estimate-costs.js#L28-L29 hash=014939607bf2444d5f2e5a7babb02a46 -``` - - - {

Retrieve the current gas price

} - - Retrieve the current gas price (effective gas price), Alternatively, given that you already set the gas price manually, you can use the `getGasPrice` method from viem. - -```js file=/public/tutorials/sdk-estimate-costs.js#L31-L32 hash=b43ae2cb1a7471de55858fbc7f7fe5a6 -``` - - {

Calculate the execution gas fee

} - - To calculate the execution gas fee simply multiply the gas limit by the effective gas price. - -```js file=/public/tutorials/sdk-estimate-costs.js#L34-L35 hash=3e536e97b83458d3d3c7545b2c74ffd6 -``` -
- - {

Estimate the L1 data fee

} - - You can estimate the L1 data fee with the [estimateL1GasCost](https://viem.sh/op-stack/actions/estimateL1Gas) function. - Under the hood, this function is estimating the amount of Ethereum gas required to publish this transaction on Ethereum and multiplying it by the current Ethereum gas price (as tracked by the L2). - This function returns the current cost estimate in wei. - -```js file=/public/tutorials/sdk-estimate-costs.js#L37-L38 hash=afbf520615c15f71a84eec2566c393aa +```js file=/public/tutorials/sdk-estimate-costs.js#L21-L26 hash=d2f3fc3df8298253bd45a226dd171dcf ``` {

Estimate the total cost

} - Once you've individually estimated the execution gas fee and the L1 data fee, you can sum these two values together to get the total cost of the transaction. + With Viem you can estimate the total cost of a transaction using the [estimateTotalFee](https://viem.sh/op-stack/actions/estimateTotalFee) method. -```js file=/public/tutorials/sdk-estimate-costs.js#L40-L41 hash=8685f586913b87a5881cc6f917d0de50 +```js file=/public/tutorials/sdk-estimate-costs.js#L28-L29 hash=db562f050d0affe866e2114779656d3a ``` {

Send the transaction

} @@ -183,7 +151,7 @@ You're now going to estimate the cost of a transaction on OP Mainnet. Now that you've estimated the total cost of the transaction, go ahead and send it to the network. This will make it possible to see the actual cost of the transaction to compare to your estimate. -```js file=/public/tutorials/sdk-estimate-costs.js#L43-L44 hash=a0a19fa7fc17165d934cc9f7af075464 +```js file=/public/tutorials/sdk-estimate-costs.js#L31-L35 hash=419162648c0c6c0d5e82ca8f6d4942d5 ``` {

Check the actual execution gas fee

} @@ -192,21 +160,21 @@ You're now going to estimate the cost of a transaction on OP Mainnet. You can do so by accessing the `gasUsed` and `effectiveGasPrice` from the transaction receipt. You can then multiply these values to get the actual L2 cost of the transaction -```js file=/public/tutorials/sdk-estimate-costs.js#L46-L49 hash=e128f21d2c994f42bdc7f5fb51eb127d +```js file=/public/tutorials/sdk-estimate-costs.js#L37-L38 hash=57dba68f78481bea90e7629270a1f58b ``` {

Check the actual L1 data fee

} You can also check the actual L1 data fee. -```js file=/public/tutorials/sdk-estimate-costs.js#L51-L52 hash=ea1801a7618fa2a21f02a97717380f42 +```js file=/public/tutorials/sdk-estimate-costs.js#L40-L41 hash=e728708954c71fe52c55912dbe778042 ``` {

Check the actual total cost

} Sum these two together to get the actual total cost of the transaction. -```js file=/public/tutorials/sdk-estimate-costs.js#L54-L56 hash=6f7943da9d70654dc040b5561b3b360d +```js file=/public/tutorials/sdk-estimate-costs.js#L43-L44 hash=38a1eadb48d89d476ea51658514d23c0 ``` {

Check the difference

} @@ -215,7 +183,7 @@ You're now going to estimate the cost of a transaction on OP Mainnet. This will give you a sense of how accurate your estimate was. Estimates will never be entirely accurate, but they should be close! -```js file=/public/tutorials/sdk-estimate-costs.js#L57-L58 hash=20c8c60af1cc39e842b207cfd2dfa2cb +```js file=/public/tutorials/sdk-estimate-costs.js#L46-L47 hash=20c8c60af1cc39e842b207cfd2dfa2cb ```
diff --git a/public/tutorials/sdk-estimate-costs.js b/public/tutorials/sdk-estimate-costs.js index fc3f7383b..72507f96f 100644 --- a/public/tutorials/sdk-estimate-costs.js +++ b/public/tutorials/sdk-estimate-costs.js @@ -21,34 +21,23 @@ const walletClientL2 = createWalletClient({ const transaction = { account, to: '0x1000000000000000000000000000000000000000', - value: parseEther('0.005'), - gasPrice: parseGwei('20') + value: parseEther('0.00069420'), + gasPrice: await publicClient.getGasPrice() } - const gasLimit = await publicClient.estimateGas(transaction) - console.log(`Estimated Gas Limit: ${gasLimit}`) - - const effectiveGasPrice = await publicClient.getGasPrice() - console.log(`Effective Gas Price: ${formatEther(effectiveGasPrice)} ETH`) - - const l2CostEstimate = gasLimit * effectiveGasPrice - console.log(`Estimated Execution Gas Fee: ${formatEther(l2CostEstimate)} ETH`) - - const l1CostEstimate = await publicClient.estimateL1Gas(transaction) - console.log(`Estimated L1 Data Fee: ${formatEther(l1CostEstimate)} ETH`) - - const totalEstimate = l2CostEstimate + l1CostEstimate + const totalEstimate = await publicClient.estimateTotalFee(transaction) console.log(`Estimated Total Cost: ${formatEther(totalEstimate)} ETH`) const txHash = await walletClientL2.sendTransaction(transaction) console.log(`Transaction Hash: ${txHash}`) const receipt = await publicClient.waitForTransactionReceipt({ hash: txHash }) + console.log('receipt', receipt); const l2CostActual = receipt.gasUsed * receipt.effectiveGasPrice console.log(`Actual Execution Gas Fee: ${formatEther(l2CostActual)} ETH`) - const l1CostActual = await publicClient.estimateL1Fee({ hash: txHash }) + const l1CostActual = receipt.l1Fee console.log(`Actual L1 Data Fee: ${formatEther(l1CostActual)} ETH`) const totalActual = l2CostActual + l1CostActual From c6d184020b53b6cb40cb1751b33ad17a95236557 Mon Sep 17 00:00:00 2001 From: Bradley Camacho <42678939+bradleycamacho@users.noreply.github.com> Date: Fri, 18 Oct 2024 07:47:34 -0700 Subject: [PATCH 205/565] Fix mispelling --- .../builders/node-operators/configuration/consensus-config.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/builders/node-operators/configuration/consensus-config.mdx b/pages/builders/node-operators/configuration/consensus-config.mdx index 8ece2b7a2..cac398c3f 100644 --- a/pages/builders/node-operators/configuration/consensus-config.mdx +++ b/pages/builders/node-operators/configuration/consensus-config.mdx @@ -1,5 +1,5 @@ --- -title: Consensus kayer configuration options (op-node) +title: Consensus layer configuration options (op-node) lang: en-US description: Learn additional configuration and command line options for op-node and the Consensus-Layer. --- From 54fc6fb5a393e13ab3d7842c9d04479a524c2313 Mon Sep 17 00:00:00 2001 From: cpengilly <29023967+cpengilly@users.noreply.github.com> Date: Fri, 18 Oct 2024 10:39:26 -0700 Subject: [PATCH 206/565] add mermaid diagram + fix Zain comment --- .../stack/protocol/interop/superchain-erc20.mdx | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/pages/stack/protocol/interop/superchain-erc20.mdx b/pages/stack/protocol/interop/superchain-erc20.mdx index 7293fe639..8e0c99513 100644 --- a/pages/stack/protocol/interop/superchain-erc20.mdx +++ b/pages/stack/protocol/interop/superchain-erc20.mdx @@ -27,12 +27,27 @@ Additional features: * Initiating message where token is **burned** on the source chain. A user initiates a transfer of token from one blockchain to another and specifies the recipient wallet address on the destination chain. A specified amount of token is burned on the source chain. * Executing message where token is **minted** on the destination chain. The specified amount of token is minted on the destination chain and sent to the recipient wallet address. +```mermaid +sequenceDiagram + participant User + participant SourceChain + participant SuperchainERC20Bridge + participant DestinationChain + + User->>SourceChain: Initiate token transfer + SourceChain->>SourceChain: Burn tokens + SourceChain-->>SuperchainERC20Bridge: Emit cross-chain event + SuperchainERC20Bridge-->>DestinationChain: Relay event + DestinationChain->>DestinationChain: Mint tokens + DestinationChain->>User: User receives tokens +``` +This diagram illustrates the process where tokens are burned on the source chain and minted on the destination chain, enabling seamless cross-chain transfers without the need for asset wrapping or liquidity pools. + ## Major components * **Token Contract**: implements the `SuperchainERC20` standard with bridging functionality. * **Factory Predeploy**: uses a `create2`-based factory for deploying `SuperchainERC20` tokens consistently across chains. * **Bridging Functions**: using methods like `sendERC20` and `relayERC20` for cross-chain transfers. -* **Minting Role**: modifies the definition to be minting role-based rather than interface-based. ## Comparison to other standards From 8287dd0fbf86bc5b1a30c634e694917f78e74291 Mon Sep 17 00:00:00 2001 From: cpengilly <29023967+cpengilly@users.noreply.github.com> Date: Fri, 18 Oct 2024 10:46:04 -0700 Subject: [PATCH 207/565] Apply suggestions from code review Co-authored-by: Skeletor Spaceman <92943766+skeletor-spaceman@users.noreply.github.com> --- pages/stack/protocol/interop/superchain-erc20.mdx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pages/stack/protocol/interop/superchain-erc20.mdx b/pages/stack/protocol/interop/superchain-erc20.mdx index 8e0c99513..7dc637103 100644 --- a/pages/stack/protocol/interop/superchain-erc20.mdx +++ b/pages/stack/protocol/interop/superchain-erc20.mdx @@ -17,7 +17,7 @@ Asset interoperability allows for tokens to securely move across chains without Additional features: * **Simplified deployments**: Provides a consistent, unified standard for tokens across all Superchain-compatible networks and a common crosschain interface for the EVM ecosystem at large. -* **Permissionless propagation**: Easily clone an existing token contract to a new OP Stack chain using `create2` without requiring the original owner, which enables movement of assets to the new chain once Interop goes live. Importantly, permissionless propagation retains the integrity of the original owner on the contract and preserves security but proliferates the contract's availability to new chains. +* **Permissionless propagation**: Easily clone an existing token contract to a new OP Stack chain using `create2` without requiring the original deployer, which enables movement of assets to the new chain once Interop goes live. Importantly, permissionless propagation retains the integrity of the original owner on the contract and preserves security but proliferates the contract's availability to new chains. * **Ethereum-aligned**: Intentionally designed to be generic and supported as an Ethereum-wide standard (RIP coming soon). ## How it works @@ -25,7 +25,7 @@ Additional features: `SuperchainERC20` token standard facilitates secure token transfers between chains in the Superchain networks via native burning and minting. * Initiating message where token is **burned** on the source chain. A user initiates a transfer of token from one blockchain to another and specifies the recipient wallet address on the destination chain. A specified amount of token is burned on the source chain. -* Executing message where token is **minted** on the destination chain. The specified amount of token is minted on the destination chain and sent to the recipient wallet address. +* Executing message where token is **minted** on the destination chain. The specified amount of token is minted on the destination chain directly to the recipient wallet address. ```mermaid sequenceDiagram @@ -67,7 +67,7 @@ Application developers must do two things to make their tokens `SuperchainERC20` 1. Permission only `SuperchainERC20Bridge` to call `crosschainMint` and `crosschainBurn`. 2. Deployment at same address on every chain in the Superchain using `create2` function. -For now, application developers should view `SuperchainERC20`as standard ERC20 tokens with additional built-in functions that allow cross-chain asset movement that will be enabled once Interop goes live. +For now, application developers should view `SuperchainERC20` as standard ERC20 tokens with additional built-in functions that allow cross-chain asset movement that will be enabled once Interop goes live. To enable asset interoperability, `SuperchainERC20` token must give access to the address where the future `SuperchainERC20Bridge` will live. From e01bb0ddf8733431fc6ef466cb0ed2770726b316 Mon Sep 17 00:00:00 2001 From: cpengilly <29023967+cpengilly@users.noreply.github.com> Date: Fri, 18 Oct 2024 11:12:39 -0700 Subject: [PATCH 208/565] remove discord link --- pages/stack/protocol/interop/superchain-erc20.mdx | 1 - 1 file changed, 1 deletion(-) diff --git a/pages/stack/protocol/interop/superchain-erc20.mdx b/pages/stack/protocol/interop/superchain-erc20.mdx index 7dc637103..f334098ff 100644 --- a/pages/stack/protocol/interop/superchain-erc20.mdx +++ b/pages/stack/protocol/interop/superchain-erc20.mdx @@ -75,6 +75,5 @@ For now, application developers should view `SuperchainERC20` as standard ERC20 ## Next steps -* Join the discussion! `SuperchainERC20` implementation is being developed in partnership with Wonderland, with discussions taking place in the [#interop-evm](https://discord.gg/3zvcEFj6Nu) Discord channel. * For more info about how `SuperchainERC20` works under the hood, [check out the specs](https://specs.optimism.io/interop/token-bridging.html). * Questions about Interop? Visit the [Superchain Interop Explainer](explainer) or check out this [Superchain interop design video walk-thru](https://www.youtube.com/watch?v=FKc5RgjtGes). From 5c5e674226df391a71011a9bd931031bb8e9251c Mon Sep 17 00:00:00 2001 From: cpengilly <29023967+cpengilly@users.noreply.github.com> Date: Fri, 18 Oct 2024 11:21:34 -0700 Subject: [PATCH 209/565] Update pages/stack/protocol/interop/superchain-erc20.mdx Co-authored-by: Skeletor Spaceman <92943766+skeletor-spaceman@users.noreply.github.com> --- .../protocol/interop/superchain-erc20.mdx | 32 ++++++++++++------- 1 file changed, 20 insertions(+), 12 deletions(-) diff --git a/pages/stack/protocol/interop/superchain-erc20.mdx b/pages/stack/protocol/interop/superchain-erc20.mdx index f334098ff..606baf95d 100644 --- a/pages/stack/protocol/interop/superchain-erc20.mdx +++ b/pages/stack/protocol/interop/superchain-erc20.mdx @@ -29,18 +29,26 @@ Additional features: ```mermaid sequenceDiagram - participant User - participant SourceChain - participant SuperchainERC20Bridge - participant DestinationChain - - User->>SourceChain: Initiate token transfer - SourceChain->>SourceChain: Burn tokens - SourceChain-->>SuperchainERC20Bridge: Emit cross-chain event - SuperchainERC20Bridge-->>DestinationChain: Relay event - DestinationChain->>DestinationChain: Mint tokens - DestinationChain->>User: User receives tokens -``` + box rgba(255, 4, 32, 0.1) Optimism + participant User-op + participant SuperchainERC20-op + participant SuperchainERC20Bridge-op + end + box rgba(248, 61, 213, 0.1) Unichain + participant SuperchainERC20Bridge-uni + participant SuperchainERC20-uni + participant User-uni + end + + + User-op->>SuperchainERC20-op: Initiate token transfer + SuperchainERC20-op->>SuperchainERC20Bridge-op: Bridge to Uni + SuperchainERC20Bridge-op->>SuperchainERC20-op: Burn tokens + SuperchainERC20Bridge-op-->>SuperchainERC20Bridge-op: Emit cross-chain event + + SuperchainERC20Bridge-uni-->>SuperchainERC20Bridge-uni: Validates message + SuperchainERC20Bridge-uni-->>SuperchainERC20-uni: Mint tokens + SuperchainERC20-uni->>User-uni: User receives tokens This diagram illustrates the process where tokens are burned on the source chain and minted on the destination chain, enabling seamless cross-chain transfers without the need for asset wrapping or liquidity pools. ## Major components From dbd4d20e567aa21bb0e890ab6728f824a3d8b85f Mon Sep 17 00:00:00 2001 From: cpengilly <29023967+cpengilly@users.noreply.github.com> Date: Fri, 18 Oct 2024 11:45:24 -0700 Subject: [PATCH 210/565] Update superchain-erc20.mdx --- .../protocol/interop/superchain-erc20.mdx | 21 +++++++++++-------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/pages/stack/protocol/interop/superchain-erc20.mdx b/pages/stack/protocol/interop/superchain-erc20.mdx index 606baf95d..aa6429baa 100644 --- a/pages/stack/protocol/interop/superchain-erc20.mdx +++ b/pages/stack/protocol/interop/superchain-erc20.mdx @@ -12,20 +12,21 @@ import { Callout } from 'nextra/components' Interop is currently in active development and not yet ready for production use. The information provided here may change. Check back regularly for the most up-to-date information. -`SuperchainERC20` is a token standard designed to enable asset interoperability in the Superchain. +`SuperchainERC20` is a token standard designed to enable asset interoperability in the Superchain. Asset interoperability allows for tokens to securely move across chains without asset wrapping or liquidity pools for maximal capital efficiency, thus unifying liquidity and simplifying the user experience. -Additional features: +Additional features: + * **Simplified deployments**: Provides a consistent, unified standard for tokens across all Superchain-compatible networks and a common crosschain interface for the EVM ecosystem at large. -* **Permissionless propagation**: Easily clone an existing token contract to a new OP Stack chain using `create2` without requiring the original deployer, which enables movement of assets to the new chain once Interop goes live. Importantly, permissionless propagation retains the integrity of the original owner on the contract and preserves security but proliferates the contract's availability to new chains. +* **Permissionless propagation**: Easily clone an existing token contract to a new OP Stack chain using `create2` without requiring the original owner, which enables movement of assets to the new chain once Interop goes live. Importantly, permissionless propagation retains the integrity of the original owner on the contract and preserves security but proliferates the contract's availability to new chains. * **Ethereum-aligned**: Intentionally designed to be generic and supported as an Ethereum-wide standard (RIP coming soon). ## How it works `SuperchainERC20` token standard facilitates secure token transfers between chains in the Superchain networks via native burning and minting. -* Initiating message where token is **burned** on the source chain. A user initiates a transfer of token from one blockchain to another and specifies the recipient wallet address on the destination chain. A specified amount of token is burned on the source chain. -* Executing message where token is **minted** on the destination chain. The specified amount of token is minted on the destination chain directly to the recipient wallet address. +* **Token Burning**: Initiating message where token is **burned** on the source chain. A user initiates a transfer of token from one blockchain to another and specifies the recipient wallet address on the destination chain. A specified amount of token is burned on the source chain. +* **Token Minting**: Executing message where token is **minted** on the destination chain. The specified amount of token is minted on the destination chain directly to the recipient wallet address. ```mermaid sequenceDiagram @@ -45,10 +46,11 @@ sequenceDiagram SuperchainERC20-op->>SuperchainERC20Bridge-op: Bridge to Uni SuperchainERC20Bridge-op->>SuperchainERC20-op: Burn tokens SuperchainERC20Bridge-op-->>SuperchainERC20Bridge-op: Emit cross-chain event - SuperchainERC20Bridge-uni-->>SuperchainERC20Bridge-uni: Validates message SuperchainERC20Bridge-uni-->>SuperchainERC20-uni: Mint tokens SuperchainERC20-uni->>User-uni: User receives tokens +``` + This diagram illustrates the process where tokens are burned on the source chain and minted on the destination chain, enabling seamless cross-chain transfers without the need for asset wrapping or liquidity pools. ## Major components @@ -75,7 +77,7 @@ Application developers must do two things to make their tokens `SuperchainERC20` 1. Permission only `SuperchainERC20Bridge` to call `crosschainMint` and `crosschainBurn`. 2. Deployment at same address on every chain in the Superchain using `create2` function. -For now, application developers should view `SuperchainERC20` as standard ERC20 tokens with additional built-in functions that allow cross-chain asset movement that will be enabled once Interop goes live. +For now, application developers should view `SuperchainERC20`as standard ERC20 tokens with additional built-in functions that allow cross-chain asset movement that will be enabled once Interop goes live. To enable asset interoperability, `SuperchainERC20` token must give access to the address where the future `SuperchainERC20Bridge` will live. @@ -83,5 +85,6 @@ For now, application developers should view `SuperchainERC20` as standard ERC20 ## Next steps -* For more info about how `SuperchainERC20` works under the hood, [check out the specs](https://specs.optimism.io/interop/token-bridging.html). -* Questions about Interop? Visit the [Superchain Interop Explainer](explainer) or check out this [Superchain interop design video walk-thru](https://www.youtube.com/watch?v=FKc5RgjtGes). +* [Explore the SuperchainERC20 specifications](https://specs.optimism.io/interop/token-bridging.html) for in-depth implementation details. +* Watch the [Superchain interop design video walkthrough](https://www.youtube.com/watch?v=FKc5RgjtGes) for a visual explanation of the concepts. +* Review the [Superchain Interop Explainer](explainer) for answers to common questions about interoperability. From be2f0af043874fbdea9a2d120ba6a72f4dcb7383 Mon Sep 17 00:00:00 2001 From: cpengilly <29023967+cpengilly@users.noreply.github.com> Date: Fri, 18 Oct 2024 11:52:52 -0700 Subject: [PATCH 211/565] Update superchain-erc20.mdx --- pages/stack/protocol/interop/superchain-erc20.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/stack/protocol/interop/superchain-erc20.mdx b/pages/stack/protocol/interop/superchain-erc20.mdx index aa6429baa..68d796c31 100644 --- a/pages/stack/protocol/interop/superchain-erc20.mdx +++ b/pages/stack/protocol/interop/superchain-erc20.mdx @@ -85,6 +85,6 @@ For now, application developers should view `SuperchainERC20`as standard ERC20 t ## Next steps -* [Explore the SuperchainERC20 specifications](https://specs.optimism.io/interop/token-bridging.html) for in-depth implementation details. +* Explore the [SuperchainERC20 specifications](https://specs.optimism.io/interop/token-bridging.html) for in-depth implementation details. * Watch the [Superchain interop design video walkthrough](https://www.youtube.com/watch?v=FKc5RgjtGes) for a visual explanation of the concepts. * Review the [Superchain Interop Explainer](explainer) for answers to common questions about interoperability. From 30252e5fffc7adaae80ddc36be4eeb8453c6638d Mon Sep 17 00:00:00 2001 From: cpengilly <29023967+cpengilly@users.noreply.github.com> Date: Fri, 18 Oct 2024 12:21:03 -0700 Subject: [PATCH 212/565] generalize chain names, per pierce --- pages/stack/protocol/interop/superchain-erc20.mdx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pages/stack/protocol/interop/superchain-erc20.mdx b/pages/stack/protocol/interop/superchain-erc20.mdx index 68d796c31..8abfb474e 100644 --- a/pages/stack/protocol/interop/superchain-erc20.mdx +++ b/pages/stack/protocol/interop/superchain-erc20.mdx @@ -30,12 +30,12 @@ Additional features: ```mermaid sequenceDiagram - box rgba(255, 4, 32, 0.1) Optimism + box rgba(255, 4, 32, 0.1) ChainA participant User-op participant SuperchainERC20-op participant SuperchainERC20Bridge-op end - box rgba(248, 61, 213, 0.1) Unichain + box rgba(248, 61, 213, 0.1) ChainB participant SuperchainERC20Bridge-uni participant SuperchainERC20-uni participant User-uni From 27d12e65925fff29de962d82131170ea0650baa9 Mon Sep 17 00:00:00 2001 From: cpengilly <29023967+cpengilly@users.noreply.github.com> Date: Fri, 18 Oct 2024 12:37:11 -0700 Subject: [PATCH 213/565] Update superchain-erc20.mdx --- .../protocol/interop/superchain-erc20.mdx | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/pages/stack/protocol/interop/superchain-erc20.mdx b/pages/stack/protocol/interop/superchain-erc20.mdx index 8abfb474e..092af2cb4 100644 --- a/pages/stack/protocol/interop/superchain-erc20.mdx +++ b/pages/stack/protocol/interop/superchain-erc20.mdx @@ -31,24 +31,24 @@ Additional features: ```mermaid sequenceDiagram box rgba(255, 4, 32, 0.1) ChainA - participant User-op - participant SuperchainERC20-op - participant SuperchainERC20Bridge-op + participant User-chainA + participant SuperchainERC20-chainA + participant SuperchainERC20Bridge-chainA end box rgba(248, 61, 213, 0.1) ChainB - participant SuperchainERC20Bridge-uni - participant SuperchainERC20-uni - participant User-uni + participant SuperchainERC20Bridge-chainB + participant SuperchainERC20-chainB + participant User-chainB end - User-op->>SuperchainERC20-op: Initiate token transfer - SuperchainERC20-op->>SuperchainERC20Bridge-op: Bridge to Uni - SuperchainERC20Bridge-op->>SuperchainERC20-op: Burn tokens - SuperchainERC20Bridge-op-->>SuperchainERC20Bridge-op: Emit cross-chain event - SuperchainERC20Bridge-uni-->>SuperchainERC20Bridge-uni: Validates message - SuperchainERC20Bridge-uni-->>SuperchainERC20-uni: Mint tokens - SuperchainERC20-uni->>User-uni: User receives tokens + User-chainA->>SuperchainERC20-chainA: Initiate token transfer + SuperchainERC20-chainA->>SuperchainERC20Bridge-chainA: Bridge to chainB + SuperchainERC20Bridge-chainA->>SuperchainERC20-chainA: Burn tokens + SuperchainERC20Bridge-chainA-->>SuperchainERC20Bridge-chainA: Emit cross-chain event + SuperchainERC20Bridge-chainB-->>SuperchainERC20Bridge-chainB: Validates message + SuperchainERC20Bridge-chainB-->>SuperchainERC20-chainB: Mint tokens + SuperchainERC20-chainB->>User-chainB: User receives tokens ``` This diagram illustrates the process where tokens are burned on the source chain and minted on the destination chain, enabling seamless cross-chain transfers without the need for asset wrapping or liquidity pools. From c923552bf52f36498281ed852646e0a48885c959 Mon Sep 17 00:00:00 2001 From: soyboy Date: Fri, 18 Oct 2024 17:28:25 -0600 Subject: [PATCH 214/565] taking the protocol section up a level --- components/WipCallout.tsx | 21 +++++++++++++++ next-env.d.ts | 2 +- .../builders/chain-operators/tools/_meta.json | 10 ++++--- .../chain-operators/tools}/op-txproxy.mdx | 0 .../chain-operators/tools}/proxyd.mdx | 0 pages/stack/_meta.json | 13 ++++++---- pages/stack/beta-features/_meta.json | 4 +++ .../alt-da-mode.mdx | 0 .../custom-gas-token.mdx | 3 +++ .../{protocol => }/fault-proofs/_meta.json | 0 .../{protocol => }/fault-proofs/cannon.mdx | 0 .../fault-proofs/challenger.mdx | 0 .../{protocol => }/fault-proofs/explainer.mdx | 0 .../fault-proofs/fp-components.mdx | 0 .../fault-proofs/fp-security.mdx | 0 .../{protocol => }/fault-proofs/mips.mdx | 0 pages/stack/features/_meta.json | 3 +++ .../send-raw-transaction-conditional.mdx | 0 pages/stack/{protocol => }/interop/_meta.json | 0 .../interop/cross-chain-message.mdx | 0 .../{protocol => }/interop/explainer.mdx | 0 .../interop/superchain-erc20.mdx | 0 .../stack/{protocol => }/interop/supersim.mdx | 0 pages/stack/operators/_meta.json | 3 --- pages/stack/operators/features/_meta.json | 4 --- pages/stack/protocol/_meta.json | 8 ------ pages/stack/protocol/features/_meta.json | 5 ---- pages/stack/protocol/rollup/_meta.json | 7 ----- pages/stack/rollup/_meta.json | 5 ++++ .../derivation-pipeline.mdx | 0 pages/stack/{protocol => rollup}/outages.mdx | 0 .../stack/{protocol => }/rollup/overview.mdx | 0 pages/stack/transactions/_meta.json | 6 ++++- .../rollup => transactions}/deposit-flow.mdx | 0 .../forced-transaction.mdx | 0 .../transaction-flow.mdx | 0 .../withdrawal-flow.mdx | 0 public/_redirects | 26 +++++++++++++++++-- 38 files changed, 80 insertions(+), 40 deletions(-) rename pages/{stack/operators/features => builders/chain-operators/tools}/op-txproxy.mdx (100%) rename pages/{stack/operators/features => builders/chain-operators/tools}/proxyd.mdx (100%) create mode 100644 pages/stack/beta-features/_meta.json rename pages/stack/{protocol/features => beta-features}/alt-da-mode.mdx (100%) rename pages/stack/{protocol/features => beta-features}/custom-gas-token.mdx (98%) rename pages/stack/{protocol => }/fault-proofs/_meta.json (100%) rename pages/stack/{protocol => }/fault-proofs/cannon.mdx (100%) rename pages/stack/{protocol => }/fault-proofs/challenger.mdx (100%) rename pages/stack/{protocol => }/fault-proofs/explainer.mdx (100%) rename pages/stack/{protocol => }/fault-proofs/fp-components.mdx (100%) rename pages/stack/{protocol => }/fault-proofs/fp-security.mdx (100%) rename pages/stack/{protocol => }/fault-proofs/mips.mdx (100%) create mode 100644 pages/stack/features/_meta.json rename pages/stack/{protocol => }/features/send-raw-transaction-conditional.mdx (100%) rename pages/stack/{protocol => }/interop/_meta.json (100%) rename pages/stack/{protocol => }/interop/cross-chain-message.mdx (100%) rename pages/stack/{protocol => }/interop/explainer.mdx (100%) rename pages/stack/{protocol => }/interop/superchain-erc20.mdx (100%) rename pages/stack/{protocol => }/interop/supersim.mdx (100%) delete mode 100644 pages/stack/operators/_meta.json delete mode 100644 pages/stack/operators/features/_meta.json delete mode 100644 pages/stack/protocol/_meta.json delete mode 100644 pages/stack/protocol/features/_meta.json delete mode 100644 pages/stack/protocol/rollup/_meta.json create mode 100644 pages/stack/rollup/_meta.json rename pages/stack/{protocol => rollup}/derivation-pipeline.mdx (100%) rename pages/stack/{protocol => rollup}/outages.mdx (100%) rename pages/stack/{protocol => }/rollup/overview.mdx (100%) rename pages/stack/{protocol/rollup => transactions}/deposit-flow.mdx (100%) rename pages/stack/{protocol/rollup => transactions}/forced-transaction.mdx (100%) rename pages/stack/{protocol/rollup => transactions}/transaction-flow.mdx (100%) rename pages/stack/{protocol/rollup => transactions}/withdrawal-flow.mdx (100%) diff --git a/components/WipCallout.tsx b/components/WipCallout.tsx index c64f397cb..85ae4a870 100644 --- a/components/WipCallout.tsx +++ b/components/WipCallout.tsx @@ -93,3 +93,24 @@ export function AltCallout({ context }: Props): ReactElement { ); } + +export function CGTCallout({ context }: Props): ReactElement { + return ( +
+
+ {context ? ( + context + ) : ( +
+ The Custom Gas Token feature is currently in Beta within + the MIT-licensed OP Stack. Beta features are built and reviewed by + the Optimism Collective’s core contributors, and provide developers + with early access to highly requested configurations. These features + may experience stability issues, and we encourage feedback from our + early users. +
+ )} +
+
+ ); +} diff --git a/next-env.d.ts b/next-env.d.ts index a4a7b3f5c..4f11a03dc 100644 --- a/next-env.d.ts +++ b/next-env.d.ts @@ -2,4 +2,4 @@ /// // NOTE: This file should not be edited -// see https://nextjs.org/docs/pages/building-your-application/configuring/typescript for more information. +// see https://nextjs.org/docs/basic-features/typescript for more information. diff --git a/pages/builders/chain-operators/tools/_meta.json b/pages/builders/chain-operators/tools/_meta.json index 4c5077834..0779e410c 100644 --- a/pages/builders/chain-operators/tools/_meta.json +++ b/pages/builders/chain-operators/tools/_meta.json @@ -1,7 +1,9 @@ { "chain-monitoring": "Chain Monitoring", - "op-challenger": "Configure Challenger For Your Chain", - "op-conductor": "Conductor", - "op-deployer": "Deployer", - "explorer": "Block Explorer" + "explorer": "Block Explorer", + "op-challenger": "op-challenger", + "op-conductor": "op-conductor", + "op-deployer": "op-deployer", + "op-txproxy": "op-txproxy", + "proxyd": "proxyd" } diff --git a/pages/stack/operators/features/op-txproxy.mdx b/pages/builders/chain-operators/tools/op-txproxy.mdx similarity index 100% rename from pages/stack/operators/features/op-txproxy.mdx rename to pages/builders/chain-operators/tools/op-txproxy.mdx diff --git a/pages/stack/operators/features/proxyd.mdx b/pages/builders/chain-operators/tools/proxyd.mdx similarity index 100% rename from pages/stack/operators/features/proxyd.mdx rename to pages/builders/chain-operators/tools/proxyd.mdx diff --git a/pages/stack/_meta.json b/pages/stack/_meta.json index e2e98fa27..47b2dd20d 100644 --- a/pages/stack/_meta.json +++ b/pages/stack/_meta.json @@ -1,17 +1,20 @@ { "getting-started": "Getting Started: OP Stack", "differences": "Differences Between Ethereum and OP Stack Chains", - "components": "OP Stack Components", - "smart-contracts": "Smart Contracts", "explainer": "Superchain Explainer", "design-principles": "Design Philosophy & Principles", - "protocol": "Protocol", + "components": "OP Stack Components", + "smart-contracts": "Smart Contracts", + "rollup": "Rollup", + "fault-proofs": "Fault Proofs", "transactions": "Transactions", + "features": "Features", "security": "Security", - "operators": "Operators", "--- Experimental": { "title": "Experimental", "type": "separator" }, - "opcm": "OP Contracts Manager" + "opcm": "OP Contracts Manager", + "interop": "Interoperability", + "beta-features": "Beta Features" } diff --git a/pages/stack/beta-features/_meta.json b/pages/stack/beta-features/_meta.json new file mode 100644 index 000000000..22af59364 --- /dev/null +++ b/pages/stack/beta-features/_meta.json @@ -0,0 +1,4 @@ +{ + "custom-gas-token": "Custom Gas Token", + "alt-da-mode": "Alt-DA Mode" +} diff --git a/pages/stack/protocol/features/alt-da-mode.mdx b/pages/stack/beta-features/alt-da-mode.mdx similarity index 100% rename from pages/stack/protocol/features/alt-da-mode.mdx rename to pages/stack/beta-features/alt-da-mode.mdx diff --git a/pages/stack/protocol/features/custom-gas-token.mdx b/pages/stack/beta-features/custom-gas-token.mdx similarity index 98% rename from pages/stack/protocol/features/custom-gas-token.mdx rename to pages/stack/beta-features/custom-gas-token.mdx index b673f6dd0..1b5ca9bd8 100644 --- a/pages/stack/protocol/features/custom-gas-token.mdx +++ b/pages/stack/beta-features/custom-gas-token.mdx @@ -5,6 +5,9 @@ description: Learn the basic process, benefits, and considerations for running a --- import { Callout } from 'nextra/components' +import { CGTCallout } from '@/components/WipCallout' + + # Custom Gas Token Explainer diff --git a/pages/stack/protocol/fault-proofs/_meta.json b/pages/stack/fault-proofs/_meta.json similarity index 100% rename from pages/stack/protocol/fault-proofs/_meta.json rename to pages/stack/fault-proofs/_meta.json diff --git a/pages/stack/protocol/fault-proofs/cannon.mdx b/pages/stack/fault-proofs/cannon.mdx similarity index 100% rename from pages/stack/protocol/fault-proofs/cannon.mdx rename to pages/stack/fault-proofs/cannon.mdx diff --git a/pages/stack/protocol/fault-proofs/challenger.mdx b/pages/stack/fault-proofs/challenger.mdx similarity index 100% rename from pages/stack/protocol/fault-proofs/challenger.mdx rename to pages/stack/fault-proofs/challenger.mdx diff --git a/pages/stack/protocol/fault-proofs/explainer.mdx b/pages/stack/fault-proofs/explainer.mdx similarity index 100% rename from pages/stack/protocol/fault-proofs/explainer.mdx rename to pages/stack/fault-proofs/explainer.mdx diff --git a/pages/stack/protocol/fault-proofs/fp-components.mdx b/pages/stack/fault-proofs/fp-components.mdx similarity index 100% rename from pages/stack/protocol/fault-proofs/fp-components.mdx rename to pages/stack/fault-proofs/fp-components.mdx diff --git a/pages/stack/protocol/fault-proofs/fp-security.mdx b/pages/stack/fault-proofs/fp-security.mdx similarity index 100% rename from pages/stack/protocol/fault-proofs/fp-security.mdx rename to pages/stack/fault-proofs/fp-security.mdx diff --git a/pages/stack/protocol/fault-proofs/mips.mdx b/pages/stack/fault-proofs/mips.mdx similarity index 100% rename from pages/stack/protocol/fault-proofs/mips.mdx rename to pages/stack/fault-proofs/mips.mdx diff --git a/pages/stack/features/_meta.json b/pages/stack/features/_meta.json new file mode 100644 index 000000000..1d8a795f7 --- /dev/null +++ b/pages/stack/features/_meta.json @@ -0,0 +1,3 @@ +{ + "send-raw-transaction-conditional": "SendRawTransactionConditional" +} diff --git a/pages/stack/protocol/features/send-raw-transaction-conditional.mdx b/pages/stack/features/send-raw-transaction-conditional.mdx similarity index 100% rename from pages/stack/protocol/features/send-raw-transaction-conditional.mdx rename to pages/stack/features/send-raw-transaction-conditional.mdx diff --git a/pages/stack/protocol/interop/_meta.json b/pages/stack/interop/_meta.json similarity index 100% rename from pages/stack/protocol/interop/_meta.json rename to pages/stack/interop/_meta.json diff --git a/pages/stack/protocol/interop/cross-chain-message.mdx b/pages/stack/interop/cross-chain-message.mdx similarity index 100% rename from pages/stack/protocol/interop/cross-chain-message.mdx rename to pages/stack/interop/cross-chain-message.mdx diff --git a/pages/stack/protocol/interop/explainer.mdx b/pages/stack/interop/explainer.mdx similarity index 100% rename from pages/stack/protocol/interop/explainer.mdx rename to pages/stack/interop/explainer.mdx diff --git a/pages/stack/protocol/interop/superchain-erc20.mdx b/pages/stack/interop/superchain-erc20.mdx similarity index 100% rename from pages/stack/protocol/interop/superchain-erc20.mdx rename to pages/stack/interop/superchain-erc20.mdx diff --git a/pages/stack/protocol/interop/supersim.mdx b/pages/stack/interop/supersim.mdx similarity index 100% rename from pages/stack/protocol/interop/supersim.mdx rename to pages/stack/interop/supersim.mdx diff --git a/pages/stack/operators/_meta.json b/pages/stack/operators/_meta.json deleted file mode 100644 index 274405469..000000000 --- a/pages/stack/operators/_meta.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "features": "Features" -} \ No newline at end of file diff --git a/pages/stack/operators/features/_meta.json b/pages/stack/operators/features/_meta.json deleted file mode 100644 index 754729f73..000000000 --- a/pages/stack/operators/features/_meta.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "proxyd": "proxyd", - "op-txproxy": "op-txproxy" -} diff --git a/pages/stack/protocol/_meta.json b/pages/stack/protocol/_meta.json deleted file mode 100644 index fb4113973..000000000 --- a/pages/stack/protocol/_meta.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "rollup": "Rollup", - "fault-proofs": "Fault Proofs", - "interop": "Interoperability", - "features": "Features", - "outages": "Sequencer Outages", - "derivation-pipeline":"Derivation Pipeline" -} \ No newline at end of file diff --git a/pages/stack/protocol/features/_meta.json b/pages/stack/protocol/features/_meta.json deleted file mode 100644 index b9221d748..000000000 --- a/pages/stack/protocol/features/_meta.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "custom-gas-token": "Custom Gas Token", - "alt-da-mode": "Alt-DA Mode", - "send-raw-transaction-conditional": "SendRawTransactionConditional" -} diff --git a/pages/stack/protocol/rollup/_meta.json b/pages/stack/protocol/rollup/_meta.json deleted file mode 100644 index bf5f987a5..000000000 --- a/pages/stack/protocol/rollup/_meta.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "overview": "Rollup Overview", - "deposit-flow": "Deposit Flow", - "transaction-flow": "Transaction Flow", - "withdrawal-flow": "Withdrawal Flow", - "forced-transaction": "Forced Transaction" -} \ No newline at end of file diff --git a/pages/stack/rollup/_meta.json b/pages/stack/rollup/_meta.json new file mode 100644 index 000000000..a0e4ff047 --- /dev/null +++ b/pages/stack/rollup/_meta.json @@ -0,0 +1,5 @@ +{ + "overview": "Rollup Overview", + "derivation-pipeline": "Derivation Pipeline", + "outages": "Sequencer Outages" +} \ No newline at end of file diff --git a/pages/stack/protocol/derivation-pipeline.mdx b/pages/stack/rollup/derivation-pipeline.mdx similarity index 100% rename from pages/stack/protocol/derivation-pipeline.mdx rename to pages/stack/rollup/derivation-pipeline.mdx diff --git a/pages/stack/protocol/outages.mdx b/pages/stack/rollup/outages.mdx similarity index 100% rename from pages/stack/protocol/outages.mdx rename to pages/stack/rollup/outages.mdx diff --git a/pages/stack/protocol/rollup/overview.mdx b/pages/stack/rollup/overview.mdx similarity index 100% rename from pages/stack/protocol/rollup/overview.mdx rename to pages/stack/rollup/overview.mdx diff --git a/pages/stack/transactions/_meta.json b/pages/stack/transactions/_meta.json index 8f79b3007..20f41a7f2 100644 --- a/pages/stack/transactions/_meta.json +++ b/pages/stack/transactions/_meta.json @@ -1,3 +1,7 @@ { - "fees": "Transaction Fees" + "fees": "Transaction Fees", + "transaction-flow": "Transaction Flow", + "deposit-flow": "Deposit Flow", + "withdrawal-flow": "Withdrawal Flow", + "forced-transaction": "Forced Transaction" } diff --git a/pages/stack/protocol/rollup/deposit-flow.mdx b/pages/stack/transactions/deposit-flow.mdx similarity index 100% rename from pages/stack/protocol/rollup/deposit-flow.mdx rename to pages/stack/transactions/deposit-flow.mdx diff --git a/pages/stack/protocol/rollup/forced-transaction.mdx b/pages/stack/transactions/forced-transaction.mdx similarity index 100% rename from pages/stack/protocol/rollup/forced-transaction.mdx rename to pages/stack/transactions/forced-transaction.mdx diff --git a/pages/stack/protocol/rollup/transaction-flow.mdx b/pages/stack/transactions/transaction-flow.mdx similarity index 100% rename from pages/stack/protocol/rollup/transaction-flow.mdx rename to pages/stack/transactions/transaction-flow.mdx diff --git a/pages/stack/protocol/rollup/withdrawal-flow.mdx b/pages/stack/transactions/withdrawal-flow.mdx similarity index 100% rename from pages/stack/protocol/rollup/withdrawal-flow.mdx rename to pages/stack/transactions/withdrawal-flow.mdx diff --git a/public/_redirects b/public/_redirects index 89f0ac83c..d5dd6e606 100644 --- a/public/_redirects +++ b/public/_redirects @@ -76,7 +76,29 @@ /stack/protocol/design-principles /stack/design-principles /builders/node-operators/overview /builders/node-operators/rollup-node /builders/notices/ecotone-changes /stack/transactions/fees#ecotone -/stack/protocol/fault-proofs/overview /stack/protocol/fault-proofs/explainer +/stack/protocol/fault-proofs/overview /stack/fault-proofs/explainer /builders/chain-operators/management/configuration /builders/chain-operators/configuration/overview /builders/chain-operators/management/custom-gas-token /builders/chain-operators/features/custom-gas-token -/stack/protocol/rollup/smart-contracts /stack/smart-contracts \ No newline at end of file +/stack/protocol/rollup/smart-contracts /stack/smart-contracts +/stack/protocol/fault-proofs/challenger /stack/fault-proofs/challenger +/stack/protocol/fault-proofs/fp-security /stack/fault-proofs/fp-security +/stack/protocol/fault-proofs/mips /stack/fault-proofs/mips +/stack/protocol/fault-proofs/fp-components /stack/fault-proofs/fp-components +/stack/protocol/fault-proofs/explainer /stack/fault-proofs/explainer +/stack/protocol/fault-proofs/cannon /stack/fault-proofs/cannon +/stack/protocol/interop/supersim /stack/interop/supersim +/stack/protocol/interop/superchain-erc20 /stack/interop/superchain-erc20 +/stack/protocol/interop/explainer /stack/interop/explainer +/stack/protocol/interop/cross-chain-message /stack/interop/cross-chain-message +/stack/protocol/features/alt-da-mode +/stack/protocol/features/custom-gas-token +/stack/protocol/features/send-raw-transaction-conditional /stack/features/send-raw-transaction-conditional +/stack/protocol/derivation-pipeline /stack/rollup/derivation-pipeline +/stack/protocol/rollup/overview /stack/rollup/overview +/stack/protocol/rollup/withdrawal-flow /stack/transactions/withdrawal-flow +/stack/protocol/rollup/forced-transaction /stack/transactions/forced-transaction +/stack/protocol/rollup/transaction-flow /stack/transactions/transaction-flow +/stack/protocol/rollup/deposit-flow /stack/transactions/deposit-flow +/stack/protocol/outages /stack/rollup/outages +/stack/operators/features/op-txproxy /builders/chain-operators/tools/op-txproxy +/stack/operators/features/proxyd /builders/chain-operators/tools/proxyd \ No newline at end of file From 68f23e543940c0614d01396547e6f34aa6167554 Mon Sep 17 00:00:00 2001 From: soyboy Date: Fri, 18 Oct 2024 17:34:35 -0600 Subject: [PATCH 215/565] fixing build issue? --- pages/builders/app-developers/contracts/superchain-erc20.mdx | 2 +- pages/builders/app-developers/tools/supersim.mdx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pages/builders/app-developers/contracts/superchain-erc20.mdx b/pages/builders/app-developers/contracts/superchain-erc20.mdx index e966aac46..dfaf8f84e 100644 --- a/pages/builders/app-developers/contracts/superchain-erc20.mdx +++ b/pages/builders/app-developers/contracts/superchain-erc20.mdx @@ -1,6 +1,6 @@ --- --- -import SuperchainERC20 from '@/pages/stack/protocol/interop/superchain-erc20.mdx' +import SuperchainERC20 from '@/pages/stack/interop/superchain-erc20.mdx' diff --git a/pages/builders/app-developers/tools/supersim.mdx b/pages/builders/app-developers/tools/supersim.mdx index f25adb1bc..dc60c54ac 100644 --- a/pages/builders/app-developers/tools/supersim.mdx +++ b/pages/builders/app-developers/tools/supersim.mdx @@ -1,6 +1,6 @@ --- --- -import Supersim from '@/pages/stack/protocol/interop/supersim.mdx' +import Supersim from '@/pages/stack/interop/supersim.mdx' From 9771f62a03644a63a648cbf76a0cb3d6f2a3a36d Mon Sep 17 00:00:00 2001 From: soyboy Date: Fri, 18 Oct 2024 19:05:30 -0600 Subject: [PATCH 216/565] fixing some internal links --- pages/builders/app-developers/bridging/messaging.mdx | 2 +- pages/builders/chain-operators/configuration/rollup.mdx | 4 ++-- pages/builders/chain-operators/features/alt-da-mode.mdx | 4 ++-- .../chain-operators/features/custom-gas-token.mdx | 4 ++-- pages/builders/chain-operators/tools/chain-monitoring.mdx | 2 +- pages/builders/chain-operators/tools/op-challenger.mdx | 4 ++-- pages/builders/chain-operators/tools/op-txproxy.mdx | 2 +- .../chain-operators/tutorials/integrating-da-layer.mdx | 2 +- pages/builders/notices/fp-changes.mdx | 6 +++--- pages/builders/notices/granite-changes.mdx | 2 +- pages/builders/tools/build/account-abstraction.mdx | 2 +- pages/chain/security/faq.mdx | 2 +- pages/stack/fault-proofs/cannon.mdx | 2 +- pages/stack/fault-proofs/challenger.mdx | 2 +- pages/stack/fault-proofs/explainer.mdx | 8 ++++---- pages/stack/interop/supersim.mdx | 2 +- pages/stack/transactions/withdrawal-flow.mdx | 4 ++-- 17 files changed, 27 insertions(+), 27 deletions(-) diff --git a/pages/builders/app-developers/bridging/messaging.mdx b/pages/builders/app-developers/bridging/messaging.mdx index 0d8cd9e6a..2b03591f4 100644 --- a/pages/builders/app-developers/bridging/messaging.mdx +++ b/pages/builders/app-developers/bridging/messaging.mdx @@ -215,7 +215,7 @@ The L1 proof and finalization transactions are typically significantly more expe One of the most important things to understand about L1 ⇔ L2 interaction is that **mainnet messages sent from Layer 2 to Layer 1 cannot be relayed for at least 7 days**. This means that any messages you send from Layer 2 will only be received on Layer 1 after this one week period has elapsed. -We call this period of time the "challenge period" because it is the time during which a transaction can be challenged with a [fault proof](/stack/protocol/rollup/overview#fault-proofs). +We call this period of time the "challenge period" because it is the time during which a transaction can be challenged with a [fault proof](/stack/rollup/overview#fault-proofs). Optimistic Rollups are "optimistic" because they're based around the idea of publishing the *result* of a transaction to Ethereum without actually executing the transaction on Ethereum. In the "optimistic" case, this transaction result is correct and one can completely avoid the need to perform complicated (and expensive) logic on Ethereum. diff --git a/pages/builders/chain-operators/configuration/rollup.mdx b/pages/builders/chain-operators/configuration/rollup.mdx index 6dd615624..2ba6cd795 100644 --- a/pages/builders/chain-operators/configuration/rollup.mdx +++ b/pages/builders/chain-operators/configuration/rollup.mdx @@ -973,7 +973,7 @@ instead of the older output oracle mechanism. The Custom Gas Token configuration lets OP Stack chain operators deploy their chain allowing a specific ERC-20 token to be deposited in as the native token -to pay for gas fees. Learn more [here](/stack/protocol/features/custom-gas-token). +to pay for gas fees. Learn more [here](/stack/features/custom-gas-token). *** @@ -1005,7 +1005,7 @@ gas on L2. Alt-DA Mode enables seamless integration of various Data Availability (DA) Layers, regardless of their commitment type, into the OP Stack. This allows any chain operator to launch an OP Stack chain using their favorite DA Layer -for sustainably low costs. Lean more [here](/stack/protocol/features/alt-da-mode). +for sustainably low costs. Lean more [here](/stack/features/alt-da-mode). *** diff --git a/pages/builders/chain-operators/features/alt-da-mode.mdx b/pages/builders/chain-operators/features/alt-da-mode.mdx index e6f6397c7..4ea569197 100644 --- a/pages/builders/chain-operators/features/alt-da-mode.mdx +++ b/pages/builders/chain-operators/features/alt-da-mode.mdx @@ -13,7 +13,7 @@ import { Callout, Steps } from 'nextra/components' These features may experience stability issues, and we encourage feedback from our early users.
-This guide provides a walkthrough for chain operators who want to run an Alt-DA Mode chain. See the [Alt-DA Mode Explainer](/stack/protocol/features/alt-da-mode) for a general overview of this OP Stack configuration. +This guide provides a walkthrough for chain operators who want to run an Alt-DA Mode chain. See the [Alt-DA Mode Explainer](/stack/features/alt-da-mode) for a general overview of this OP Stack configuration. An Alt-DA Mode OP Stack chain enables a chain operator to post and read data to any alternative data availability layer that has built a functioning OP Stack DA Server. @@ -224,6 +224,6 @@ After making these changes, your system should be properly configured to use the ## Next Steps -* Additional questions? See the FAQ section in the [Alt-DA Mode Explainer](/stack/protocol/features/alt-da-mode#faqs). +* Additional questions? See the FAQ section in the [Alt-DA Mode Explainer](/stack/features/alt-da-mode#faqs). * For more detailed info on Alt-DA Mode, see the [specs](https://specs.optimism.io/experimental/alt-da.html). * If you experience any problems, please reach out to [developer support](https://github.com/ethereum-optimism/developers/discussions). diff --git a/pages/builders/chain-operators/features/custom-gas-token.mdx b/pages/builders/chain-operators/features/custom-gas-token.mdx index f2a42c986..1a3869063 100644 --- a/pages/builders/chain-operators/features/custom-gas-token.mdx +++ b/pages/builders/chain-operators/features/custom-gas-token.mdx @@ -12,7 +12,7 @@ import { Callout, Steps } from 'nextra/components' The Custom Gas Token feature is a Beta feature of the MIT licensed OP Stack. While it has received initial review from core contributors, it is still undergoing testing, and may have bugs or other issues. -This guide provides a walkthrough for chain operators who want to run a custom gas token chain. See the [Custom Gas Token Explainer](/stack/protocol/features/custom-gas-token) for a general overview of this OP Stack feature. +This guide provides a walkthrough for chain operators who want to run a custom gas token chain. See the [Custom Gas Token Explainer](/stack/beta-features/custom-gas-token) for a general overview of this OP Stack feature. An OP Stack chain that uses the custom gas token feature enables an end user to deposit an L1 native ERC20 token into L2 where that asset is minted as the native L2 asset and can be used to pay for gas on L2. @@ -156,6 +156,6 @@ section of the docs. ## Next Steps -* Additional questions? See the FAQ section in the [Custom Gas Token Explainer](/stack/protocol/features/custom-gas-token#faqs). +* Additional questions? See the FAQ section in the [Custom Gas Token Explainer](/stack/beta-features/custom-gas-token#faqs). * For more detailed info on custom gas tokens, see the [specs](https://specs.optimism.io/experimental/custom-gas-token.html). * If you experience any problems, please reach out to [developer support](https://github.com/ethereum-optimism/developers/discussions). diff --git a/pages/builders/chain-operators/tools/chain-monitoring.mdx b/pages/builders/chain-operators/tools/chain-monitoring.mdx index c97183443..3efb4ceba 100644 --- a/pages/builders/chain-operators/tools/chain-monitoring.mdx +++ b/pages/builders/chain-operators/tools/chain-monitoring.mdx @@ -108,7 +108,7 @@ You can find more information about these flags in our [Batcher configuration do ### `op-challenger` The `op-challenger` operates as the *honest actor* in the fault dispute system and defends the chain by securing the `OptimismPortal` and ensuring the game always resolves to the correct state of the chain. -For verifying the legitimacy of claims, `op-challenger` relies on a synced, trusted rollup node as well as a trace provider (e.g., [Cannon](/stack/protocol/fault-proofs/cannon)). See the [OP-Challenger Explainer](/stack/protocol/fault-proofs/challenger) for more information on this service. +For verifying the legitimacy of claims, `op-challenger` relies on a synced, trusted rollup node as well as a trace provider (e.g., [Cannon](/stack/fault-proofs/cannon)). See the [OP-Challenger Explainer](/stack/fault-proofs/challenger) for more information on this service. To enable metrics, pass the `--metrics.enabled` flag to `op-challenger` and follow the steps above for customization options. diff --git a/pages/builders/chain-operators/tools/op-challenger.mdx b/pages/builders/chain-operators/tools/op-challenger.mdx index 760af2647..da1283b9c 100644 --- a/pages/builders/chain-operators/tools/op-challenger.mdx +++ b/pages/builders/chain-operators/tools/op-challenger.mdx @@ -8,7 +8,7 @@ import { Callout, Steps } from 'nextra/components' # How to Configure Challenger For Your Chain -This guide provides a walkthrough of setting up the configuration and monitoring options for `op-challenger`. See the [OP-Challenger Explainer](/stack/protocol/fault-proofs/challenger) for a general overview of this fault proofs feature. +This guide provides a walkthrough of setting up the configuration and monitoring options for `op-challenger`. See the [OP-Challenger Explainer](/stack/fault-proofs/challenger) for a general overview of this fault proofs feature. ### Build the Executable @@ -218,6 +218,6 @@ This guide provides a walkthrough of setting up the configuration and monitoring ## Next Steps -* Additional questions? See the FAQ section in the [OP Challenger Explainer](/stack/protocol/fault-proofs/challenger). +* Additional questions? See the FAQ section in the [OP Challenger Explainer](/stack/fault-proofs/challenger). * For more detailed info on `op-challenger`, see the [specs](https://specs.optimism.io/fault-proof/stage-one/honest-challenger-fdg.html). * If you experience any problems, please reach out to [developer support](https://github.com/ethereum-optimism/developers/discussions). diff --git a/pages/builders/chain-operators/tools/op-txproxy.mdx b/pages/builders/chain-operators/tools/op-txproxy.mdx index 525519dbe..c3e75653c 100644 --- a/pages/builders/chain-operators/tools/op-txproxy.mdx +++ b/pages/builders/chain-operators/tools/op-txproxy.mdx @@ -61,7 +61,7 @@ When the request passes validation, it is passed through to the configured backe - Per the [specification](/stack/protocol/features/send-raw-transaction-conditional), conditional transactions are not gossiped between peers. Thus, if you use replicas in an active/passive sequencer setup, this request must be broadcasted to all replicas. + Per the [specification](/stack/features/send-raw-transaction-conditional), conditional transactions are not gossiped between peers. Thus, if you use replicas in an active/passive sequencer setup, this request must be broadcasted to all replicas. [proxyd](./proxyd) as an egress router for this method supports this broadcasting functionality. diff --git a/pages/builders/chain-operators/tutorials/integrating-da-layer.mdx b/pages/builders/chain-operators/tutorials/integrating-da-layer.mdx index a1dbc7c99..51fb0300d 100644 --- a/pages/builders/chain-operators/tutorials/integrating-da-layer.mdx +++ b/pages/builders/chain-operators/tutorials/integrating-da-layer.mdx @@ -13,7 +13,7 @@ import { Callout, Steps } from 'nextra/components' These features may experience stability issues, and we encourage feedback from our early users. -[Alt-DA Mode](/stack/protocol/features/alt-da-mode) enables seamless integration of any DA Layer, regardless of their commitment type, into the OP Stack. After a DA Server is built for a DA Layer, any chain operator can launch an OP Stack chain using that DA Layer for sustainably low costs. +[Alt-DA Mode](/stack/beta-features/alt-da-mode) enables seamless integration of any DA Layer, regardless of their commitment type, into the OP Stack. After a DA Server is built for a DA Layer, any chain operator can launch an OP Stack chain using that DA Layer for sustainably low costs. ## Build Your DA Server diff --git a/pages/builders/notices/fp-changes.mdx b/pages/builders/notices/fp-changes.mdx index 4f7a34d81..c5a6c60af 100644 --- a/pages/builders/notices/fp-changes.mdx +++ b/pages/builders/notices/fp-changes.mdx @@ -17,7 +17,7 @@ If you experience difficulty at any stage of this process, please reach out to [ **ALL** withdrawals that are not finalized before the Fault Proofs upgrade executes will need to be reproven after the upgrade is complete. - * Reproving simply requires that you execute the [withdrawal proving flow](https://docs.optimism.io/stack/protocol/rollup/withdrawal-flow) again. + * Reproving simply requires that you execute the [withdrawal proving flow](https://docs.optimism.io/stack/rollup/withdrawal-flow) again. * Withdrawals prior to the Fault Proofs upgrade must wait a 7-day challenge period before finalization. As a result, any withdrawal initiated less than 7 days before the upgrade cannot be finalized before the upgrade is executed. You may want to consider waiting until after the upgrade is complete to begin a withdrawal during this 7-day window. @@ -96,5 +96,5 @@ The proposed Fault Proof upgrade requires developers to enable Fault Proof chang ## Next Steps -* See the [Fault Proofs Explainer](/stack/protocol/fault-proofs/explainer) to learn more about the three main components of the Fault Proof System. -* You can also read more about [Cannon FPVM](/stack/protocol/fault-proofs/cannon) and [Mips.sol](/stack/protocol/fault-proofs/mips), the onchain smart contract implementation of Cannon. +* See the [Fault Proofs Explainer](/stack/fault-proofs/explainer) to learn more about the three main components of the Fault Proof System. +* You can also read more about [Cannon FPVM](/stack/fault-proofs/cannon) and [Mips.sol](/stack/fault-proofs/mips), the onchain smart contract implementation of Cannon. diff --git a/pages/builders/notices/granite-changes.mdx b/pages/builders/notices/granite-changes.mdx index b0eaa9871..ccbb10ee8 100644 --- a/pages/builders/notices/granite-changes.mdx +++ b/pages/builders/notices/granite-changes.mdx @@ -17,7 +17,7 @@ If you experience difficulty at any stage of this process, please reach out to [ ## What's Included in Granite -This upgrade is proposed in response to security vulnerabilities identified during a series of third-party security audits by Spearbit, Cantina, and Code4rena. None of the vulnerabilities have been exploited, and user assets are not and were never at risk. However, out of an abundance of caution, the permissioned fallback mechanism has been activated in order to avoid any potential instability while the vulnerabilities are patched. For more information on the permissioned fallback mechanism and the OP Stack's defense-in-depth approach to Fault Proof security, see the [fault proof documentation](https://docs.optimism.io/stack/protocol/fault-proofs/fp-security). +This upgrade is proposed in response to security vulnerabilities identified during a series of third-party security audits by Spearbit, Cantina, and Code4rena. None of the vulnerabilities have been exploited, and user assets are not and were never at risk. However, out of an abundance of caution, the permissioned fallback mechanism has been activated in order to avoid any potential instability while the vulnerabilities are patched. For more information on the permissioned fallback mechanism and the OP Stack's defense-in-depth approach to Fault Proof security, see the [fault proof documentation](https://docs.optimism.io/stack/fault-proofs/fp-security). The upgrade includes both a set of smart contract upgrades to fix the vulnerabilities identified in the audit as well as an L2 hardfork to improve the stability and performance of the fault proof system. In addition, we propose extending the capabilities of the Guardian and DeputyGuardian to set the anchor state for the fault proof system in order to prevent referencing invalid anchor states. Aside from implementing these fixes, the primary impact of this upgrade would be to reset user withdrawals at the planned time, similar to the initial Fault Proof upgrade. diff --git a/pages/builders/tools/build/account-abstraction.mdx b/pages/builders/tools/build/account-abstraction.mdx index 7cebf8eb5..de6cffa86 100644 --- a/pages/builders/tools/build/account-abstraction.mdx +++ b/pages/builders/tools/build/account-abstraction.mdx @@ -21,7 +21,7 @@ import { Callout } from 'nextra/components' ## Bundlers -The OP Stack includes support for the `eth_sendRawTransactionConditional` RPC method to assist bundlers on shared 4337 mempools. See the [specification](/stack/protocol/features/send-raw-transaction-conditional) for how this method is implemented in op-geth. +The OP Stack includes support for the `eth_sendRawTransactionConditional` RPC method to assist bundlers on shared 4337 mempools. See the [specification](/stack/features/send-raw-transaction-conditional) for how this method is implemented in op-geth. If enabled by the chain operator, also see the supplemental [op-txproxy](/stack/operators/features/op-txproxy) service, if applied, as this enforces request authentication for this method. diff --git a/pages/chain/security/faq.mdx b/pages/chain/security/faq.mdx index b000bb446..fe0f37327 100644 --- a/pages/chain/security/faq.mdx +++ b/pages/chain/security/faq.mdx @@ -38,7 +38,7 @@ Withdrawals are proven against proposals about the state of OP Mainnet that are Proposals can be submitted to the `DisputeGameFactory` contract by any user and submissions do not require any special permissions. Each submitted proposal creates a [`FaultDisputeGame`](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts-bedrock/src/dispute/FaultDisputeGame.sol) contract that allows any other user to challenge the validity of a proposal by participating in a "fault proof" process. -A more detailed explanation of the fault proof game can be found in the [Fault Proofs Explainer](/stack/protocol/fault-proofs/explainer). +A more detailed explanation of the fault proof game can be found in the [Fault Proofs Explainer](/stack/fault-proofs/explainer). Although the fault proof game is permissionless, the Optimism Security Council acting as the [Guardian](/chain/security/privileged-roles#guardian) role provides a backstop in case of a failure in the fault proof game. Each proposal must wait for a delay period during which the Guardian can prevent invalid proposals from being used to withdraw ETH or tokens through a number of safety hatches. diff --git a/pages/stack/fault-proofs/cannon.mdx b/pages/stack/fault-proofs/cannon.mdx index 4a86b4ce6..e5685632c 100644 --- a/pages/stack/fault-proofs/cannon.mdx +++ b/pages/stack/fault-proofs/cannon.mdx @@ -35,7 +35,7 @@ single L2 block state transition that they disagree on. ### OP-Challenger \<> Cannon -Once an active fault dispute game reaches a depth below attacking / defending L2 block state transitions, [OP-Challenger](/stack/protocol/fault-proofs/challenger) will run +Once an active fault dispute game reaches a depth below attacking / defending L2 block state transitions, [OP-Challenger](/stack/fault-proofs/challenger) will run Cannon to begin processing MIPS instructions within the FPVM. As part of processing MIPS instructions, Cannon will generate state witness hashes, which are the commitment to the results of the MIPS instructions' computation within the FPVM. Now, in the bisection game, OP-Challenger will provide the generated hashes until a single MIPS instruction is identified as the root disagreement between participants in the active dispute. Cannon will then diff --git a/pages/stack/fault-proofs/challenger.mdx b/pages/stack/fault-proofs/challenger.mdx index 3f23d83f3..c7b715a14 100644 --- a/pages/stack/fault-proofs/challenger.mdx +++ b/pages/stack/fault-proofs/challenger.mdx @@ -9,7 +9,7 @@ import Image from 'next/image' # OP-Challenger Explainer -The `op-challenger` operates as the *honest actor* in the fault dispute system and defends the chain by securing the `OptimismPortal` and ensuring the game always resolves to the correct state of the chain. For verifying the legitimacy of claims, `op-challenger` relies on a synced, trusted rollup node as well as a trace provider (e.g., [Cannon](/stack/protocol/fault-proofs/cannon)). +The `op-challenger` operates as the *honest actor* in the fault dispute system and defends the chain by securing the `OptimismPortal` and ensuring the game always resolves to the correct state of the chain. For verifying the legitimacy of claims, `op-challenger` relies on a synced, trusted rollup node as well as a trace provider (e.g., [Cannon](/stack/fault-proofs/cannon)). Specifically, `op-challenger` performs the following actions: diff --git a/pages/stack/fault-proofs/explainer.mdx b/pages/stack/fault-proofs/explainer.mdx index 7b1299aa4..fd5665555 100644 --- a/pages/stack/fault-proofs/explainer.mdx +++ b/pages/stack/fault-proofs/explainer.mdx @@ -39,16 +39,16 @@ See the permissionless fault proofs diagram below for more details: ## Permissionless Challenges Because anyone can submit a proposal, it's important that invalid proposals can be challenged. -In [Optimistic Rollups like OP Stack Chains](/stack/protocol/rollup/overview) there is a \~1 week challenge period during which users can challenge a proposal if they believe it to be incorrect. +In [Optimistic Rollups like OP Stack Chains](/stack/rollup/overview) there is a \~1 week challenge period during which users can challenge a proposal if they believe it to be incorrect. With the Fault Proofs upgrade to the OP Stack, challenges become permissionless and can be submitted by anyone. Any user can run a node for the OP Stack chain in question and use the `op-challenger` tool to participate in the dispute process. ## Modular Design and Multi-layer Security -The OP Stack Fault Proof system is [modular in design](/stack/protocol/fault-proofs/fp-components#system-design--modularity) and lays the groundwork for achieving a "multi-proof" system. This allows the OP Stack to support multiple proof systems alongside the initial [Cannon](/stack/protocol/fault-proofs/cannon) proof system. +The OP Stack Fault Proof system is [modular in design](/stack/fault-proofs/fp-components#system-design--modularity) and lays the groundwork for achieving a "multi-proof" system. This allows the OP Stack to support multiple proof systems alongside the initial [Cannon](/stack/fault-proofs/cannon) proof system. With multiple proof systems in place, the OP Stack can be more resilient to potential attacks and bugs in any one proof system. -Additionally, the following [security safeguards](/stack/protocol/fault-proofs/fp-security) have been built around the game, as follows: +Additionally, the following [security safeguards](/stack/fault-proofs/fp-security) have been built around the game, as follows: * An off chain monitoring system has been set up to monitor all proposed roots and ensure they align with the correct state. See [`op-dispute-mon`](https://github.com/ethereum-optimism/optimism/blob/develop/op-dispute-mon/README.md?plain=1) for more details. * After a root is finalized through a game, an additional delay called the "airgap window" has been added before withdrawals can occur. During this period, the `GUARDIAN` role can reject the root. @@ -57,7 +57,7 @@ Additionally, the following [security safeguards](/stack/protocol/fault-proofs/f ## Next Steps * Ready to get started? Review the [FP Components](fp-components) to learn how the different components work together to enhance decentralization in the Optimism ecosystem. -* See the [Fault Proof Mainnet Security](/stack/protocol/fault-proofs/fp-security) to understand changes to `OptimismPortal` and `FaultDisputeGame` contracts. +* See the [Fault Proof Mainnet Security](/stack/fault-proofs/fp-security) to understand changes to `OptimismPortal` and `FaultDisputeGame` contracts. * For more info about how the FP system works under the hood, [check out the specs](https://specs.optimism.io/fault-proof/index.html). ## FAQs diff --git a/pages/stack/interop/supersim.mdx b/pages/stack/interop/supersim.mdx index 10b88e8fe..0d628e48b 100644 --- a/pages/stack/interop/supersim.mdx +++ b/pages/stack/interop/supersim.mdx @@ -57,5 +57,5 @@ This diagram illustrates how developers interact with Supersim through the CLI, ## Next steps * Check out the dedicated [Supersim docs](https://Supersim.pages.dev/) for tutorials and specific use cases. -* Questions about Interop? Check out the FAQ section in the [Superchain Interop Explainer](/stack/protocol/interop/explainer#faqs) or check out this [Superchain interop design video walk-thru](https://www.youtube.com/watch?v=FKc5RgjtGes). +* Questions about Interop? Check out the FAQ section in the [Superchain Interop Explainer](/stack/interop/explainer#faqs) or check out this [Superchain interop design video walk-thru](https://www.youtube.com/watch?v=FKc5RgjtGes). * For more info about how Superchain interoperability works under the hood, [check out the specs](https://specs.optimism.io/interop/overview.html). diff --git a/pages/stack/transactions/withdrawal-flow.mdx b/pages/stack/transactions/withdrawal-flow.mdx index dd2ae78b6..ef49eb6c6 100644 --- a/pages/stack/transactions/withdrawal-flow.mdx +++ b/pages/stack/transactions/withdrawal-flow.mdx @@ -97,8 +97,8 @@ The Chugsplash Proxy operates differently than standard proxies. During a withdr For more information about the withdrawal process and how it works on Optimism, refer to the following resources: -* [Smart Contracts Overview](https://docs.optimism.io/stack/protocol/rollup/smart-contracts) -* [Withdrawal Flow](https://docs.optimism.io/stack/protocol/rollup/withdrawal-flow#withdrawal-initiating-transaction) +* [Smart Contracts Overview](https://docs.optimism.io/stack/rollup/smart-contracts) +* [Withdrawal Flow](https://docs.optimism.io/stack/rollup/withdrawal-flow#withdrawal-initiating-transaction) ### Offchain processing From 17e723d4f5510eb5a8e4a496423da2243a2a2898 Mon Sep 17 00:00:00 2001 From: soyboy Date: Fri, 18 Oct 2024 19:17:11 -0600 Subject: [PATCH 217/565] fixing internal links and redirects --- .../chain-operators/configuration/rollup.mdx | 2 +- .../chain-operators/features/alt-da-mode.mdx | 4 +-- pages/builders/notices/sdk-deprecation.mdx | 29 ------------------- .../tools/build/account-abstraction.mdx | 2 +- public/_redirects | 4 +-- 5 files changed, 6 insertions(+), 35 deletions(-) diff --git a/pages/builders/chain-operators/configuration/rollup.mdx b/pages/builders/chain-operators/configuration/rollup.mdx index 2ba6cd795..a82ed3167 100644 --- a/pages/builders/chain-operators/configuration/rollup.mdx +++ b/pages/builders/chain-operators/configuration/rollup.mdx @@ -1005,7 +1005,7 @@ gas on L2. Alt-DA Mode enables seamless integration of various Data Availability (DA) Layers, regardless of their commitment type, into the OP Stack. This allows any chain operator to launch an OP Stack chain using their favorite DA Layer -for sustainably low costs. Lean more [here](/stack/features/alt-da-mode). +for sustainably low costs. Lean more [here](/stack/beta-features/alt-da-mode). *** diff --git a/pages/builders/chain-operators/features/alt-da-mode.mdx b/pages/builders/chain-operators/features/alt-da-mode.mdx index 4ea569197..c64ab3829 100644 --- a/pages/builders/chain-operators/features/alt-da-mode.mdx +++ b/pages/builders/chain-operators/features/alt-da-mode.mdx @@ -13,7 +13,7 @@ import { Callout, Steps } from 'nextra/components' These features may experience stability issues, and we encourage feedback from our early users. -This guide provides a walkthrough for chain operators who want to run an Alt-DA Mode chain. See the [Alt-DA Mode Explainer](/stack/features/alt-da-mode) for a general overview of this OP Stack configuration. +This guide provides a walkthrough for chain operators who want to run an Alt-DA Mode chain. See the [Alt-DA Mode Explainer](/stack/beta-features/alt-da-mode) for a general overview of this OP Stack configuration. An Alt-DA Mode OP Stack chain enables a chain operator to post and read data to any alternative data availability layer that has built a functioning OP Stack DA Server. @@ -224,6 +224,6 @@ After making these changes, your system should be properly configured to use the ## Next Steps -* Additional questions? See the FAQ section in the [Alt-DA Mode Explainer](/stack/features/alt-da-mode#faqs). +* Additional questions? See the FAQ section in the [Alt-DA Mode Explainer](/stack/beta-features/alt-da-mode#faqs). * For more detailed info on Alt-DA Mode, see the [specs](https://specs.optimism.io/experimental/alt-da.html). * If you experience any problems, please reach out to [developer support](https://github.com/ethereum-optimism/developers/discussions). diff --git a/pages/builders/notices/sdk-deprecation.mdx b/pages/builders/notices/sdk-deprecation.mdx index 302f4afba..4b509005e 100644 --- a/pages/builders/notices/sdk-deprecation.mdx +++ b/pages/builders/notices/sdk-deprecation.mdx @@ -23,35 +23,6 @@ Developers and users are strongly encouraged to transition to `viem` before the We are updating our tutorials to use the `viem` library. - {/* Below, you'll find links to the updated versions of popular tutorials: - -* [Estimating Transaction Costs on OP Mainnet](../tutorials/transaction-cost-estimation)\ - Estimation of transaction costs now uses the `viem` gas estimation utilities. - -* [Triggering OP Mainnet Transactions from Ethereum](../tutorials/trigger-op-transactions)\ - Learn how to trigger transactions using `viem` to interact with the OP Mainnet. - -* [Tracing Deposits and Withdrawals](../tutorials/tracing-deposits-withdrawals)\ - The tracing functionalities have been adapted to use `opstack` for efficient results. - -* [Viewing Deposits and Withdrawals by Address](../tutorials/view-deposits-withdrawals)\ - This tutorial outlines updated methods in `viem` for querying deposits and withdrawals by address. - -* [Bridging Your Standard ERC-20 Token Using the Standard Bridge](../tutorials/bridge-standard-erc20)\ - The standard bridge tutorial now uses `opstack` for token transfers between Ethereum and OP Mainnet. - -* [Bridging Your Custom ERC-20 Token Using the Standard Bridge](../tutorials/bridge-custom-erc20)\ - Custom ERC-20 tokens can now be bridged via `opstack`, making the process more streamlined. - -* [Bridging ERC-20 Tokens to OP Mainnet With the Optimism SDK](../tutorials/bridge-sdk-erc20)\ - **Deprecated** – please use [Bridging Your Custom ERC-20 Token Using the Standard Bridge](../tutorials/bridge-custom-erc20). - -* [Bridging ETH to OP Mainnet With the Optimism SDK](../tutorials/bridge-sdk-eth)\ - **Deprecated** – please use [Estimating Transaction Costs on OP Mainnet](../tutorials/transaction-cost-estimation). - -* [Communicating Between OP Mainnet and Ethereum in Solidity](../tutorials/cross-chain-solidity)\ - Cross-chain communication now leverages `opstack` for all messaging. */} - ### For app developers If your application currently depends on the Optimism SDK, you will need to migrate to using the `viem` library. diff --git a/pages/builders/tools/build/account-abstraction.mdx b/pages/builders/tools/build/account-abstraction.mdx index de6cffa86..efa52e673 100644 --- a/pages/builders/tools/build/account-abstraction.mdx +++ b/pages/builders/tools/build/account-abstraction.mdx @@ -23,7 +23,7 @@ import { Callout } from 'nextra/components' The OP Stack includes support for the `eth_sendRawTransactionConditional` RPC method to assist bundlers on shared 4337 mempools. See the [specification](/stack/features/send-raw-transaction-conditional) for how this method is implemented in op-geth. -If enabled by the chain operator, also see the supplemental [op-txproxy](/stack/operators/features/op-txproxy) service, if applied, as this enforces request authentication for this method. +If enabled by the chain operator, also see the supplemental [op-txproxy](/builders/chain-operators/tools/op-txproxy) service, if applied, as this enforces request authentication for this method. As of today, this endpoint is not enabled by default in the stack. The operator must explicitly configure this. diff --git a/public/_redirects b/public/_redirects index d5dd6e606..59f07d98b 100644 --- a/public/_redirects +++ b/public/_redirects @@ -90,8 +90,8 @@ /stack/protocol/interop/superchain-erc20 /stack/interop/superchain-erc20 /stack/protocol/interop/explainer /stack/interop/explainer /stack/protocol/interop/cross-chain-message /stack/interop/cross-chain-message -/stack/protocol/features/alt-da-mode -/stack/protocol/features/custom-gas-token +/stack/protocol/features/alt-da-mode /stack/beta-features/alt-da-mode +/stack/protocol/features/custom-gas-token /stack/beta-features/custom-gas-token /stack/protocol/features/send-raw-transaction-conditional /stack/features/send-raw-transaction-conditional /stack/protocol/derivation-pipeline /stack/rollup/derivation-pipeline /stack/protocol/rollup/overview /stack/rollup/overview From 6f3f1f85825c60fd83df75eb95cdad096d55d1e2 Mon Sep 17 00:00:00 2001 From: soyboy Date: Fri, 18 Oct 2024 19:21:19 -0600 Subject: [PATCH 218/565] refactoring component --- components/WipCallout.tsx | 39 +++++++++++++++------------------------ 1 file changed, 15 insertions(+), 24 deletions(-) diff --git a/components/WipCallout.tsx b/components/WipCallout.tsx index 85ae4a870..72dd73d5c 100644 --- a/components/WipCallout.tsx +++ b/components/WipCallout.tsx @@ -73,38 +73,21 @@ export function InfoCallout({ context }: Props): ReactElement { ); } -export function AltCallout({ context }: Props): ReactElement { - return ( -
-
- {context ? ( - context - ) : ( -
- The Alt-DA Mode feature is currently in Beta within - the MIT-licensed OP Stack. Beta features are built and reviewed by - the Optimism Collective’s core contributors, and provide developers - with early access to highly requested configurations. These features - may experience stability issues, and we encourage feedback from our - early users. -
- )} -
-
- ); +interface BetaCalloutProps extends Props { + featureName: string; } -export function CGTCallout({ context }: Props): ReactElement { +function BetaCallout({ context, featureName }: BetaCalloutProps): ReactElement { return (
-
+
{context ? ( context ) : ( -
- The Custom Gas Token feature is currently in Beta within +
+ The {featureName} feature is currently in Beta within the MIT-licensed OP Stack. Beta features are built and reviewed by - the Optimism Collective’s core contributors, and provide developers + the Optimism Collective's core contributors, and provide developers with early access to highly requested configurations. These features may experience stability issues, and we encourage feedback from our early users. @@ -114,3 +97,11 @@ export function CGTCallout({ context }: Props): ReactElement {
); } + +export function AltCallout(props: Props): ReactElement { + return ; +} + +export function CGTCallout(props: Props): ReactElement { + return ; +} \ No newline at end of file From fbbf7de98dfd30c82da79a52af62b4083aff6d79 Mon Sep 17 00:00:00 2001 From: soyboy Date: Fri, 18 Oct 2024 20:10:30 -0600 Subject: [PATCH 219/565] fixing more broken links --- pages/builders/chain-operators/configuration/rollup.mdx | 2 +- pages/builders/chain-operators/features/alt-da-mode.mdx | 2 +- pages/builders/chain-operators/tools/chain-monitoring.mdx | 2 +- pages/builders/chain-operators/tools/op-deployer.mdx | 2 +- pages/builders/notices/fp-changes.mdx | 2 +- pages/builders/notices/granite-changes.mdx | 2 +- pages/builders/tools/build/account-abstraction.mdx | 2 +- pages/builders/tools/build/nft-tools.mdx | 4 ---- pages/connect/contribute/style-guide.mdx | 2 +- pages/stack/transactions/withdrawal-flow.mdx | 2 +- words.txt | 1 - 11 files changed, 9 insertions(+), 14 deletions(-) diff --git a/pages/builders/chain-operators/configuration/rollup.mdx b/pages/builders/chain-operators/configuration/rollup.mdx index a82ed3167..b6e93b803 100644 --- a/pages/builders/chain-operators/configuration/rollup.mdx +++ b/pages/builders/chain-operators/configuration/rollup.mdx @@ -973,7 +973,7 @@ instead of the older output oracle mechanism. The Custom Gas Token configuration lets OP Stack chain operators deploy their chain allowing a specific ERC-20 token to be deposited in as the native token -to pay for gas fees. Learn more [here](/stack/features/custom-gas-token). +to pay for gas fees. Learn more [here](/stack/beta-features/custom-gas-token). *** diff --git a/pages/builders/chain-operators/features/alt-da-mode.mdx b/pages/builders/chain-operators/features/alt-da-mode.mdx index c64ab3829..39d8fd93c 100644 --- a/pages/builders/chain-operators/features/alt-da-mode.mdx +++ b/pages/builders/chain-operators/features/alt-da-mode.mdx @@ -224,6 +224,6 @@ After making these changes, your system should be properly configured to use the ## Next Steps -* Additional questions? See the FAQ section in the [Alt-DA Mode Explainer](/stack/beta-features/alt-da-mode#faqs). +* Additional questions? See the FAQ section in the [Alt-DA Mode Explainer](/stack/bet/alt-da-mode#faqs). * For more detailed info on Alt-DA Mode, see the [specs](https://specs.optimism.io/experimental/alt-da.html). * If you experience any problems, please reach out to [developer support](https://github.com/ethereum-optimism/developers/discussions). diff --git a/pages/builders/chain-operators/tools/chain-monitoring.mdx b/pages/builders/chain-operators/tools/chain-monitoring.mdx index 3efb4ceba..c5ea3410c 100644 --- a/pages/builders/chain-operators/tools/chain-monitoring.mdx +++ b/pages/builders/chain-operators/tools/chain-monitoring.mdx @@ -71,7 +71,7 @@ Additional flags: You can find more info on `op-dispute-mon` on [the repo](https://github.com/ethereum-optimism/optimism/tree/develop/op-dispute-mon). -Chain operators can easily create their grafana dashboard for Dispute Monitor using the following json file: [Download the Dispute Monitor JSON](/grafana/dispute-monitor-1718214549035.json). +Chain operators can easily create their grafana dashboard for Dispute Monitor using the following json file: [Download the Dispute Monitor JSON](/resources/grafana/dispute-monitor-1718214549035.json). ## Offchain Component Monitoring diff --git a/pages/builders/chain-operators/tools/op-deployer.mdx b/pages/builders/chain-operators/tools/op-deployer.mdx index 4d8edb21b..85794f497 100644 --- a/pages/builders/chain-operators/tools/op-deployer.mdx +++ b/pages/builders/chain-operators/tools/op-deployer.mdx @@ -123,5 +123,5 @@ else. You can run another member of the `inspect` family, `rollup`, to get the ` ## Next Steps -* For more details, check out the tool and documentation in the [op-deployer repository](https://github.com/ethereum-optimism/optimism/tree/develop/op-chain-ops/cmd/op-deployer). +* For more details, check out the tool and documentation in the [op-deployer repository](https://github.com/ethereum-optimism/optimism/tree/develop/op-deployer/cmd/op-deployer). * For more information on OP Contracts Manager, refer to the [OPCM documentation](/stack/opcm). diff --git a/pages/builders/notices/fp-changes.mdx b/pages/builders/notices/fp-changes.mdx index c5a6c60af..853263134 100644 --- a/pages/builders/notices/fp-changes.mdx +++ b/pages/builders/notices/fp-changes.mdx @@ -17,7 +17,7 @@ If you experience difficulty at any stage of this process, please reach out to [ **ALL** withdrawals that are not finalized before the Fault Proofs upgrade executes will need to be reproven after the upgrade is complete. - * Reproving simply requires that you execute the [withdrawal proving flow](https://docs.optimism.io/stack/rollup/withdrawal-flow) again. + * Reproving simply requires that you execute the [withdrawal proving flow](https://docs.optimism.io/stack/transactions/withdrawal-flow) again. * Withdrawals prior to the Fault Proofs upgrade must wait a 7-day challenge period before finalization. As a result, any withdrawal initiated less than 7 days before the upgrade cannot be finalized before the upgrade is executed. You may want to consider waiting until after the upgrade is complete to begin a withdrawal during this 7-day window. diff --git a/pages/builders/notices/granite-changes.mdx b/pages/builders/notices/granite-changes.mdx index ccbb10ee8..2b4605676 100644 --- a/pages/builders/notices/granite-changes.mdx +++ b/pages/builders/notices/granite-changes.mdx @@ -17,7 +17,7 @@ If you experience difficulty at any stage of this process, please reach out to [ ## What's Included in Granite -This upgrade is proposed in response to security vulnerabilities identified during a series of third-party security audits by Spearbit, Cantina, and Code4rena. None of the vulnerabilities have been exploited, and user assets are not and were never at risk. However, out of an abundance of caution, the permissioned fallback mechanism has been activated in order to avoid any potential instability while the vulnerabilities are patched. For more information on the permissioned fallback mechanism and the OP Stack's defense-in-depth approach to Fault Proof security, see the [fault proof documentation](https://docs.optimism.io/stack/fault-proofs/fp-security). +This upgrade is proposed in response to security vulnerabilities identified during a series of third-party security audits by Spearbit, Cantina, and Code4rena. None of the vulnerabilities have been exploited, and user assets are not and were never at risk. However, out of an abundance of caution, the permissioned fallback mechanism has been activated in order to avoid any potential instability while the vulnerabilities are patched. For more information on the permissioned fallback mechanism and the OP Stack's defense-in-depth approach to Fault Proof security, see the [fault proof documentation](/stack/fault-proofs/fp-security). The upgrade includes both a set of smart contract upgrades to fix the vulnerabilities identified in the audit as well as an L2 hardfork to improve the stability and performance of the fault proof system. In addition, we propose extending the capabilities of the Guardian and DeputyGuardian to set the anchor state for the fault proof system in order to prevent referencing invalid anchor states. Aside from implementing these fixes, the primary impact of this upgrade would be to reset user withdrawals at the planned time, similar to the initial Fault Proof upgrade. diff --git a/pages/builders/tools/build/account-abstraction.mdx b/pages/builders/tools/build/account-abstraction.mdx index efa52e673..4ca1d1cf9 100644 --- a/pages/builders/tools/build/account-abstraction.mdx +++ b/pages/builders/tools/build/account-abstraction.mdx @@ -31,7 +31,7 @@ If enabled by the chain operator, also see the supplemental [op-txproxy](/builde ## Superchain Paymaster -The Superchain paymaster is an ERC-4337 verifying paymaster that sponsors transactions for smart accounts on the Superchain. Use the Superchain Paymaster to get your transactions sponsored to remove friction from your app experience. [View the implementation guide and tutorials here.](https://github.com/ethereum-optimism/ecosystem/tree/main/docs/superchain-paymaster) +The Superchain paymaster is an ERC-4337 verifying paymaster that sponsors transactions for smart accounts on the Superchain. Use the Superchain Paymaster to get your transactions sponsored to remove friction from your app experience. ## Account Abstraction Tools diff --git a/pages/builders/tools/build/nft-tools.mdx b/pages/builders/tools/build/nft-tools.mdx index 270f3f636..9a9bd9bc2 100644 --- a/pages/builders/tools/build/nft-tools.mdx +++ b/pages/builders/tools/build/nft-tools.mdx @@ -59,7 +59,3 @@ These tools are available on OP Mainnet: * [Tofu](https://tofunft.com/optimism) * [OptiMarket](https://optimarket.io/) * [Circular Art](https://www.circularart.xyz/) - -## Marketplace aggregators - -* [Bluesweep](https://www.bluesweep.xyz/) diff --git a/pages/connect/contribute/style-guide.mdx b/pages/connect/contribute/style-guide.mdx index ddeead204..853aad9f8 100644 --- a/pages/connect/contribute/style-guide.mdx +++ b/pages/connect/contribute/style-guide.mdx @@ -298,7 +298,7 @@ Developers trust that we will lead them to sites or pages related to their readi * Use absolute or relative links when linking across pages in the site. Absolute links are cleaner and easier to work with when pages are nested, so they are the recommended option. - **Examples**: absolute link `(/protocol/deposit-flow)` versus relative link `(../../protocol/deposit-flow)` + **Examples**: absolute link `(/stack/transactions/deposit-flow)` versus relative link `(../../protocol/deposit-flow)` * Use the exact title of the page when linking to it in a sentence, whenever possible, and display it in title case. The link should use default styling with no other formatting (bold, italics, quotations). diff --git a/pages/stack/transactions/withdrawal-flow.mdx b/pages/stack/transactions/withdrawal-flow.mdx index ef49eb6c6..57cbf85f9 100644 --- a/pages/stack/transactions/withdrawal-flow.mdx +++ b/pages/stack/transactions/withdrawal-flow.mdx @@ -98,7 +98,7 @@ The Chugsplash Proxy operates differently than standard proxies. During a withdr For more information about the withdrawal process and how it works on Optimism, refer to the following resources: * [Smart Contracts Overview](https://docs.optimism.io/stack/rollup/smart-contracts) -* [Withdrawal Flow](https://docs.optimism.io/stack/rollup/withdrawal-flow#withdrawal-initiating-transaction) +* [Withdrawal Flow](https://docs.optimism.io/stack/transactions/withdrawal-flow#withdrawal-initiating-transaction) ### Offchain processing diff --git a/words.txt b/words.txt index 21cc95118..93c865012 100644 --- a/words.txt +++ b/words.txt @@ -38,7 +38,6 @@ blocktime BLOOMFILTER bloomfilter BLTZ -Bluesweep Bootcamp BOOTNODES Bootnodes From f489068926707b77bca0e4035490100905d2592a Mon Sep 17 00:00:00 2001 From: soyboy Date: Fri, 18 Oct 2024 22:18:48 -0600 Subject: [PATCH 220/565] fixing more broken links --- pages/builders/chain-operators/features/alt-da-mode.mdx | 4 ++-- pages/builders/notices/fp-changes.mdx | 2 +- pages/stack/transactions/withdrawal-flow.mdx | 5 ----- 3 files changed, 3 insertions(+), 8 deletions(-) diff --git a/pages/builders/chain-operators/features/alt-da-mode.mdx b/pages/builders/chain-operators/features/alt-da-mode.mdx index 39d8fd93c..8df26f52f 100644 --- a/pages/builders/chain-operators/features/alt-da-mode.mdx +++ b/pages/builders/chain-operators/features/alt-da-mode.mdx @@ -44,7 +44,7 @@ You should use at least the following compatible op\* versions when running your * Celestia's docs on how to run the [Celestia DA server](https://github.com/celestiaorg/op-plasma-celestia/blob/main/README.md) * EigenDA's docs on how to run the [EigenDA DA server](https://github.com/Layr-Labs/op-plasma-eigenda/blob/main/README.md) * Avail's docs on how to run the [AvailDA DA Server](https://docs.availproject.org/docs/build-with-avail/Optimium/op-stack/op-stack#setup-avail-da-server) - * 0gDA's docs on how to run the [0gDA DA Server](https://github.com/0glabs/0g-da-op-plasma/blob/op0g/README.md) + * 0gDA's docs on how to run the [0gDA DA Server](https://github.com/0glabs/0g-da-op-plasma) * Near DA's docs on how to run the [Near DA Server](https://github.com/Nuffle-Labs/data-availability/blob/84b484de98f58a91bf12c8abe8df27f5e753f63a/docs/OP-Alt-DA.md) ### Configure Your `op-node` @@ -224,6 +224,6 @@ After making these changes, your system should be properly configured to use the ## Next Steps -* Additional questions? See the FAQ section in the [Alt-DA Mode Explainer](/stack/bet/alt-da-mode#faqs). +* Additional questions? See the FAQ section in the [Alt-DA Mode Explainer](/stack/beta-features/alt-da-mode#faqs). * For more detailed info on Alt-DA Mode, see the [specs](https://specs.optimism.io/experimental/alt-da.html). * If you experience any problems, please reach out to [developer support](https://github.com/ethereum-optimism/developers/discussions). diff --git a/pages/builders/notices/fp-changes.mdx b/pages/builders/notices/fp-changes.mdx index 853263134..90502bf5f 100644 --- a/pages/builders/notices/fp-changes.mdx +++ b/pages/builders/notices/fp-changes.mdx @@ -17,7 +17,7 @@ If you experience difficulty at any stage of this process, please reach out to [ **ALL** withdrawals that are not finalized before the Fault Proofs upgrade executes will need to be reproven after the upgrade is complete. - * Reproving simply requires that you execute the [withdrawal proving flow](https://docs.optimism.io/stack/transactions/withdrawal-flow) again. + * Reproving simply requires that you execute the [withdrawal proving flow](/stack/transactions/withdrawal-flow) again. * Withdrawals prior to the Fault Proofs upgrade must wait a 7-day challenge period before finalization. As a result, any withdrawal initiated less than 7 days before the upgrade cannot be finalized before the upgrade is executed. You may want to consider waiting until after the upgrade is complete to begin a withdrawal during this 7-day window. diff --git a/pages/stack/transactions/withdrawal-flow.mdx b/pages/stack/transactions/withdrawal-flow.mdx index 57cbf85f9..7de98ea75 100644 --- a/pages/stack/transactions/withdrawal-flow.mdx +++ b/pages/stack/transactions/withdrawal-flow.mdx @@ -95,11 +95,6 @@ The Chugsplash Proxy operates differently than standard proxies. During a withdr * **No Cause for Concern**: Although Etherscan highlights these reverts, they do not affect the final success of the transaction. * **User Assurance**: If you encounter these reverts during a withdrawal transaction, rest assured that the withdrawal will still finalize as expected. -For more information about the withdrawal process and how it works on Optimism, refer to the following resources: - -* [Smart Contracts Overview](https://docs.optimism.io/stack/rollup/smart-contracts) -* [Withdrawal Flow](https://docs.optimism.io/stack/transactions/withdrawal-flow#withdrawal-initiating-transaction) - ### Offchain processing 1. A user calls the SDK's [`CrossDomainMessenger.finalizeMessage()`](https://github.com/ethereum-optimism/optimism/blob/62c7f3b05a70027b30054d4c8974f44000606fb7/packages/sdk/src/cross-chain-messenger.ts#L1473-L1493) with the hash of the L1 message. From 7214836d378713d48c4ca09f57f25eaaf397d842 Mon Sep 17 00:00:00 2001 From: soyboy Date: Fri, 18 Oct 2024 22:48:35 -0600 Subject: [PATCH 221/565] last broken links? --- pages/stack/rollup/overview.mdx | 4 ++-- public/_redirects | 12 ++++++------ 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/pages/stack/rollup/overview.mdx b/pages/stack/rollup/overview.mdx index a275be581..e71405711 100644 --- a/pages/stack/rollup/overview.mdx +++ b/pages/stack/rollup/overview.mdx @@ -50,7 +50,7 @@ Transactions get to the sequencer in two ways: This provides OP Mainnet with L1 Ethereum level censorship resistance. You can read more about this mechanism [in the protocol specifications](https://specs.optimism.io/protocol/derivation.html#deriving-the-transaction-list). -For the moment, [The Optimism Foundation](https://www.optimism.io/) runs the only block producer on OP Mainnet. Refer to [Protocol specs](overview) section for more information about how we plan to decentralize the Sequencer role in the future. +For the moment, [The Optimism Foundation](https://www.optimism.io/) runs the only block producer on OP Mainnet. ## Block Execution @@ -112,5 +112,5 @@ The fault proof process is currently undergoing major redevelopment as a side-ef ## Next Steps -* If you want to learn more about rollup protocol, check out the guides on [deposit flow](deposit-flow), [withdrawal flow](withdrawal-flow), or [transaction flow](transaction-flow). +* If you want to learn more about rollup protocol, check out the guides on [deposit flow](/stack/transactions/deposit-flow), [withdrawal flow](/stack/transactions/withdrawal-flow), or [transaction flow](/stack/transactions/transaction-flow). * To learn about operating your own L2 rollup, see the guide on [starting a self-hosted chain](/builders/chain-operators/self-hosted) or go directly to the tutorial on [creating your own L2 rollup](/builders/chain-operators/tutorials/create-l2-rollup). diff --git a/public/_redirects b/public/_redirects index 59f07d98b..d586cee18 100644 --- a/public/_redirects +++ b/public/_redirects @@ -62,17 +62,17 @@ /transaction-fees/overview /builders/app-developers/transactions/fees /dapp-developers/contracts/meta-tx /builders/app-developers/contracts/optimization /builders/tools/build/overview /builders/tools/overview -/protocol-specifications/optimistic-rollup/block-production /stack/protocol/rollup/overview#block-production +/protocol-specifications/optimistic-rollup/block-production /stack/rollup/overview#block-production /builders/node-operators/metrics /builders/node-operators/management/metrics /stack /stack/getting-started /chain/sec /chain/security/faq /builders/chain-operators/management/tools/explorer /builders/chain-operators/tools/explorer /builders/node-operators/management/configuration /builders/node-operators/configuration/base-config -/stack/protocol/deposit-flow /stack/protocol/rollup/deposit-flow -/stack/protocol/transaction-flow /stack/protocol/rollup/transaction-flow -/stack/protocol/withdrawal-flow /stack/protocol/rollup/withdrawal-flow -/stack/protocol/smart-contracts /stack/protocol/rollup/smart-contracts -/stack/protocol/overview /stack/protocol/rollup/overview +/stack/protocol/deposit-flow /stack/transactions/deposit-flow +/stack/protocol/transaction-flow /stack/transactions/transaction-flow +/stack/protocol/withdrawal-flow /stack/transactions/withdrawal-flow +/stack/protocol/smart-contracts /stack/smart-contracts +/stack/protocol/overview /stack/rollup/overview /stack/protocol/design-principles /stack/design-principles /builders/node-operators/overview /builders/node-operators/rollup-node /builders/notices/ecotone-changes /stack/transactions/fees#ecotone From c06952630952ef7aad1ab753929daaff6c0ee9d5 Mon Sep 17 00:00:00 2001 From: Charlie Date: Sat, 19 Oct 2024 15:52:13 +0300 Subject: [PATCH 222/565] Fixed ABI --- pages/builders/app-developers/contracts/system-contracts.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/builders/app-developers/contracts/system-contracts.mdx b/pages/builders/app-developers/contracts/system-contracts.mdx index 2e01eebe1..1b08374d7 100644 --- a/pages/builders/app-developers/contracts/system-contracts.mdx +++ b/pages/builders/app-developers/contracts/system-contracts.mdx @@ -90,7 +90,7 @@ import { } from '@eth-optimism/contracts-ts' // Note that the address is keyed by chain ID! -console.log(l2OutputOracleAddresses[10], abi) +console.log(l2OutputOracleAddresses[10], l2OutputOracleProxyABI) ``` ### Interacting with the Contract You can then feed this address and ABI into your favorite web3 library to interact with the contract. From f6951043fe76e713960164f5da52547856e3981c Mon Sep 17 00:00:00 2001 From: Bradley Camacho <42678939+bradleycamacho@users.noreply.github.com> Date: Sat, 19 Oct 2024 10:37:08 -0700 Subject: [PATCH 223/565] Add linked to SuperchainERC20 --- pages/stack/protocol/interop/explainer.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/stack/protocol/interop/explainer.mdx b/pages/stack/protocol/interop/explainer.mdx index 06758368e..53afe4cbd 100644 --- a/pages/stack/protocol/interop/explainer.mdx +++ b/pages/stack/protocol/interop/explainer.mdx @@ -25,7 +25,7 @@ Native OP Stack interoperability provides the ability to read messages and trans Superchain interop includes both the protocol layer message passing and the Superchain ERC20 token specification. * **Message passing protocol:** the initial + finalizing/executing [message](https://specs.optimism.io/interop/messaging.html) that fire events to be consumed by the chains in the [dependency set](https://specs.optimism.io/interop/dependency-set.html) -* **SuperchainERC20 token specification**: the [SuperchainERC20](https://specs.optimism.io/interop/token-bridging.html) turns message passing into asset transfer between chains in the interop set +* **SuperchainERC20 token specification**: the [SuperchainERC20](https://specs.optimism.io/interop/token-bridging.html) turns message passing into asset transfer between chains in the interop set. Learn more about how the SuperchainERC20 token standard enables asset interoperability in the Superchain [here](/stack/protocol/interop/superchain-erc20) This means ETH and ERC-20s can seamlessly and securely move across L2s, and intent-based protocols (i.e., bridges) can build better experiences on top of the message passing protocol. From 72ae27c8ae00f0d2a7d421f2a874c11f4f2157aa Mon Sep 17 00:00:00 2001 From: soyboy Date: Sat, 19 Oct 2024 15:57:53 -0600 Subject: [PATCH 224/565] fixing internal link --- pages/stack/interop/explainer.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/stack/interop/explainer.mdx b/pages/stack/interop/explainer.mdx index 53afe4cbd..f4d5c17bd 100644 --- a/pages/stack/interop/explainer.mdx +++ b/pages/stack/interop/explainer.mdx @@ -25,7 +25,7 @@ Native OP Stack interoperability provides the ability to read messages and trans Superchain interop includes both the protocol layer message passing and the Superchain ERC20 token specification. * **Message passing protocol:** the initial + finalizing/executing [message](https://specs.optimism.io/interop/messaging.html) that fire events to be consumed by the chains in the [dependency set](https://specs.optimism.io/interop/dependency-set.html) -* **SuperchainERC20 token specification**: the [SuperchainERC20](https://specs.optimism.io/interop/token-bridging.html) turns message passing into asset transfer between chains in the interop set. Learn more about how the SuperchainERC20 token standard enables asset interoperability in the Superchain [here](/stack/protocol/interop/superchain-erc20) +* **SuperchainERC20 token specification**: the [SuperchainERC20](https://specs.optimism.io/interop/token-bridging.html) turns message passing into asset transfer between chains in the interop set. Learn more about how the SuperchainERC20 token standard enables asset interoperability in the Superchain [here](/stack/interop/superchain-erc20) This means ETH and ERC-20s can seamlessly and securely move across L2s, and intent-based protocols (i.e., bridges) can build better experiences on top of the message passing protocol. From e9014152ca7f0cb9077c60c2f3c7d52e2b53f8b5 Mon Sep 17 00:00:00 2001 From: Paul Date: Sun, 20 Oct 2024 16:01:26 +0300 Subject: [PATCH 225/565] Fixed altda to plasma error --- pages/builders/chain-operators/configuration/batcher.mdx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pages/builders/chain-operators/configuration/batcher.mdx b/pages/builders/chain-operators/configuration/batcher.mdx index df5dfadea..795f7986c 100644 --- a/pages/builders/chain-operators/configuration/batcher.mdx +++ b/pages/builders/chain-operators/configuration/batcher.mdx @@ -288,8 +288,8 @@ default value is `false`. Enable plasma mode. The default value is `false`. - `--altda.enabled=` - `--altda.enabled=false` + `--plasma.enabled=` + `--plasma.enabled=false` `OP_BATCHER_PLASMA_ENABLED=false` @@ -299,8 +299,8 @@ Verify input data matches the commitments from the DA storage service. The default value is `true`. - `--altda.verify-on-read=` - `--altda.verify-on-read=true` + `--plasma.verify-on-read=` + `--plasma.verify-on-read=true` `OP_BATCHER_PLASMA_VERIFY_ON_READ=true` From 0b7332035170d5cdd42949ea6078f72a878d0103 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Mon, 21 Oct 2024 16:48:22 +0100 Subject: [PATCH 226/565] updated transaction page --- .../app-developers/transactions/estimates.mdx | 30 +++---------------- 1 file changed, 4 insertions(+), 26 deletions(-) diff --git a/pages/builders/app-developers/transactions/estimates.mdx b/pages/builders/app-developers/transactions/estimates.mdx index 6b7008b18..732de864c 100644 --- a/pages/builders/app-developers/transactions/estimates.mdx +++ b/pages/builders/app-developers/transactions/estimates.mdx @@ -41,38 +41,18 @@ This means you can feed your transaction to the [`eth_estimateGas`](https://ethe {

Estimate the max fee per gas

} -Like Ethereum, OP Mainnet uses an EIP-1559 style fee market to determine the current base fee per gas. +Like Ethereum, OP Mainnet uses an `EIP-1559` style fee market to determine the current base fee per gas. You can then additionally specify a priority fee (also known as a tip) to incentivize the Sequencer to include your transaction more quickly. Make sure to check out the guide on [Setting Transaction Gas Parameters on OP Mainnet](./parameters) to learn more about how to select an appropriate max fee per gas for your transaction. -{

Calculate the execution gas fee

} - -Once you've estimated the gas limit and the max fee per gas for your transaction, you can calculate the execution gas fee by multiplying these two values together. - -For instance, suppose that your transaction has a gas limit of `420000 gas`, a base fee of `0.05 gwei`, and a priority fee of `0.1 gwei`. -The execution gas fee for your transaction would be: - -```javascript -// Start with your parameters -gas_limit = 420000 -base_fee_per_gas = 0.05 gwei -priority_fee_per_gas = 0.1 gwei - -// Max fee per gas is the sum of the base fee and the priority fee -max_fee_per_gas = base_fee_per_gas + priority_fee_per_gas = 0.15 gwei - -// Execution gas fee is the product of the gas limit and the max fee per gas -execution_gas_fee = gas_limit * max_fee_per_gas = 420000 * 0.15 gwei = 0.000063 ETH -``` - ## L1 Data Fee -The Optimism SDK provides a convenient method for estimating the L1 data fee for a transaction. -Check out the tutorial on [Estimating Transaction Costs on OP Mainnet](/builders/app-developers/tutorials/sdk-estimate-costs) to learn how to use the Optimism SDK to estimate the L1 data fee for your transaction. -Keep reading if you'd like to learn how to estimate the L1 data fee without the Optimism SDK. +The Viem library provides a convenient method for estimating the L1 data fee for a transaction. +Check out the tutorial on [Estimating Transaction Costs on OP Mainnet](/builders/app-developers/tutorials/sdk-estimate-costs) to learn how to use the Viem library to estimate the L1 data fee for your transaction. +Keep reading if you'd like to learn how to estimate the L1 data fee without the Viem library. The L1 data fee is a fee paid to the Sequencer for the cost of publishing your transaction to Ethereum. @@ -116,8 +96,6 @@ Several tools are available to help you estimate the L1 Data Fee for your transa Selecting the right tool for your use case will depend on your specific needs. * [Viem](https://viem.sh/op-stack#getting-started-with-op-stack) provides first-class support for OP Stack chains, including OP Mainnet. You can use Viem to estimate gas costs and send cross-chain transactions (like transactions through the Standard Bridge system). It's strongly recommended to use Viem if you are able to do so as it will provide the best native support at the moment. -* If you are using Ethers v5, the [Optimism SDK](https://sdk.optimism.io/) provides methods for estimating the L1 Data Fee for your transactions and for sending cross-chain transactions. The Optimism SDK is designed to be used alongside Ethers v5 and does not yet support Ethers v6. -* If you are using Ethers v6, the [Optimistic Utilities Extension](https://github.com/ethers-io/ext-utils-optimism) provides methods for estimating the L1 Data Fee. The Ethers v6 extension does not yet support sending cross-chain transactions. Use Viem or the Optimism SDK if you need to send cross-chain transactions. ### Future Proofing From 58415093ef52e66bfc2527412bf722df22e6b0ba Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Mon, 21 Oct 2024 17:39:32 +0100 Subject: [PATCH 227/565] updated the codebase --- public/tutorials/cross-dom-bridge-eth.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/tutorials/cross-dom-bridge-eth.js b/public/tutorials/cross-dom-bridge-eth.js index cdde1697b..567d37bd4 100644 --- a/public/tutorials/cross-dom-bridge-eth.js +++ b/public/tutorials/cross-dom-bridge-eth.js @@ -67,7 +67,7 @@ async function withdrawETH() { //Add the same imports used in DepositETH function const withdrawalArgs = await publicClientL2.buildWithdrawalTransaction({ -withdrawalAmount: parseEther("0.0001"), +value: parseEther('0.0001'), to: account.address, }); From 9919df74448423fe4c9765a42c48710e7115a623 Mon Sep 17 00:00:00 2001 From: soyboy Date: Mon, 21 Oct 2024 12:56:47 -0600 Subject: [PATCH 228/565] adding todos for op-deployer docs --- .../chain-operators/tools/op-deployer.mdx | 90 +++++++++++-------- 1 file changed, 53 insertions(+), 37 deletions(-) diff --git a/pages/builders/chain-operators/tools/op-deployer.mdx b/pages/builders/chain-operators/tools/op-deployer.mdx index 85794f497..25d5be866 100644 --- a/pages/builders/chain-operators/tools/op-deployer.mdx +++ b/pages/builders/chain-operators/tools/op-deployer.mdx @@ -2,19 +2,19 @@ title: Deployer lang: en-US tags: ["op-deployer","eng-platforms"] -description: Learn how op-deployer can simplify deployment of the OP Stack. +description: Learn how op-deployer can simplify deployment of the standard OP Stack. --- import {Callout, Steps} from 'nextra/components' # Deployer -`op-deployer` simplifies the process of deploying the OP Stack. It works similarly to [Terraform](https://www.terraform.io). Like Terraform, you define a declarative config file called an "intent," then run a -command to apply the intent to your chain. `op-deployer` will compare the state of your chain against the intent, -and make whatever changes are necessary for them to match. +`op-deployer` simplifies the process of deploying the OP Stack. It works similarly to [Terraform](https://www.terraform.io). Like Terraform, you define a declarative config file called an "intent," then run a command to apply the intent to your chain. `op-deployer` will compare the state of your chain against the intent, and make whatever changes are necessary for them to match. In its current state, it is intended to deploy new standard chains. Upgrade funcionality and beta-feature support will likely come in the future. ## Installation +todo: we need to link a production ready release of op-deployer + `op-deployer` is currently under active development, and must be compiled from source. Assuming you have the Go toolchain installed, you can install `op-deployer` by following these steps: @@ -32,28 +32,19 @@ toolchain installed, you can install `op-deployer` by following these steps: Run the following commands to build the binary: ```bash - cd op-chain-ops - make op-deployer - ``` - - ### (Optional) Move `op-deployer` Into `$PATH` - - Run the following command to move the `op-deployer` binary into your `$PATH`. Note that the path for your system - may be different: - - ```bash - sudo mv ./bin/op-deployer /usr/local/bin/op-deployer + cd op-deployer + just build ``` ## Usage -### Configuring your Chain +### Configuring your chain To get started with `op-deployer`, you need to create an intent file that outlines your desired chain configuration. You can use the built-in `op-deployer` utility to generate this file. Just run the following command to create an example intent file for a development chain: ``` -op-deployer init --l1-chain-id 11155111 --l2-chain-ids 12345 --workdir .deployer +./bin/op-deployer init --l1-chain-id 11155111 --l2-chain-ids 12345 --workdir .deployer ``` This command will create a directory called `.deployer` in your current working directory containing the intent file @@ -62,37 +53,66 @@ be edited directly. Your intent file will look something like this: +todo: update the toml file for the latest output +todo: add annotations on each of the chains.roles + ```toml +deploymentStrategy = "live" # todo: add description l1ChainID = 11155111 # The chain ID of the L1 chain you'll be deploying to fundDevAccounts = true # Whether or not to fund dev accounts using the test... junk mnemonic on L2. -contractsRelease = "op-contracts/v1.6.0" # The version of the smart contracts to deploy. +l1ContractsLocator = "tag://op-contracts/v1.6.0" # The version of the L1 smart contracts to deploy. +l2ContractsLocator = "tag://op-contracts/v1.7.0-beta.1+l2-contracts" # The version of the L2 smart contracts to encode into genesis + +# todo: add comment on this section +[superchainRoles] + proxyAdminOwner = "0xb9cdf788704088a4c0191d045c151fcbe2db14a4" # todo: whose address is this? + protocolVersionsOwner = "0x85d646ed26c3f46400ede51236d8d7528196849b" # todo: add comment + guardian = "0x8c7e4a51acb17719d225bd17598b8a94b46c8767" # todo: is this the guardian on the superchain config contract? # List of L2s to deploy. op-deployer can deploy multiple L2s at once [[chains]] -# Your chain's ID, encoded as a 32-byte hex string -id = "0x0000000000000000000000000000000000000000000000000000000000003039" -# Various ownership roles for your chain. When you use op-deployer init, these roles are generated using the -# test... junk mnemonic. You should replace these with your own addresses for production chains. -[chains.roles] -proxyAdminOwner = "0x7759a8a43aa6a7ee9434ddb597beed64180c40fd" -systemConfigOwner = "0x8e35d9523a0c4c9ac537d254079c2398c6f3b35f" -governanceTokenOwner = "0x7759a8a43aa6a7ee9434ddb597beed64180c40fd" -unsafeBlockSigner = "0xbb19dce4ce51f353a98dbab31b5fa3bc80dc7769" -batcher = "0x0e9c62712ab826e06b16b2236ce542f711eaffaf" -proposer = "0x86dfafe0689e20685f7872e0cb264868454627bc" -challenger = "0xf1658da627dd0738c555f9572f658617511c49d5" + # Your chain's ID, encoded as a 32-byte hex string + id = "0x0000000000000000000000000000000000000000000000000000000000003039" + # todo: comments on these values + baseFeeVaultRecipient = "0x0000000000000000000000000000000000000000" + l1FeeVaultRecipient = "0x0000000000000000000000000000000000000000" + sequencerFeeVaultRecipient = "0x0000000000000000000000000000000000000000" + eip1559Denominator = 50 + eip1559Elasticity = 6 + # Various ownership roles for your chain. When you use op-deployer init, these roles are generated using the + # test... junk mnemonic. You should replace these with your own addresses for production chains. + [chains.roles] + proxyAdminOwner = "0x7759a8a43aa6a7ee9434ddb597beed64180c40fd" # todo: highlight the difference between this and the one in the [superchainRoles] + systemConfigOwner = "0x8e35d9523a0c4c9ac537d254079c2398c6f3b35f" # todo: mention that the chain operator should retain this role for system behavior modifications + governanceTokenOwner = "0x7759a8a43aa6a7ee9434ddb597beed64180c40fd" # todo: what guidance should we have on this + unsafeBlockSigner = "0xbb19dce4ce51f353a98dbab31b5fa3bc80dc7769" + batcher = "0x0e9c62712ab826e06b16b2236ce542f711eaffaf" + proposer = "0x86dfafe0689e20685f7872e0cb264868454627bc" + challenger = "0xf1658da627dd0738c555f9572f658617511c49d5" # todo: what address should this be? ``` See the code comments above for explanations of each field. By default, `op-deployer` will fill in all other configuration variables with those that match our standard config. You can override these defaults by adding them to your intent file, but that won't be covered here. -### Applying your Intent +### Overriding default values + +The default values that op-deployer utilizes are defined [here](todo: add link). If you'd like to override these values, you need to add the following stanza to your intent file like this: + +```toml +todo: add override examples +``` + +todo: reference the default values +todo: figure our if we should use the global overrides or the chain overrides +todo: give example of 1s blocktime override + +### Applying your intent Now that you've created your intent file, you can apply it to your chain: ``` -op-deployer apply --workdir .deployer --l1-rpc-url --private-key +./bin/op-deployer apply --workdir .deployer --l1-rpc-url --private-key ``` Hardware wallets are not supported, but you can use ephemeral hot wallets since this deployer key has no privileges. @@ -102,7 +122,7 @@ configuration will be set to the Superchain-wide defaults - i.e., your chain wil and will use the same [protocol versions](https://github.com/ethereum-optimism/specs/blob/main/specs/protocol/superchain-upgrades.md) address as other chains on the Superchain. -### Generating Genesis Files +### Generating genesis files With the contracts deployed, you can generate a genesis file for any of your L2s. Run the following command to do so: @@ -117,10 +137,6 @@ else. You can run another member of the `inspect` family, `rollup`, to get the ` ./bin/op-deployer inspect rollup --outfile rollup.json ``` -## More Information - -`op-deployer` uses the OP Contracts Manager (OPCM) under the hood to deploy contracts. - ## Next Steps * For more details, check out the tool and documentation in the [op-deployer repository](https://github.com/ethereum-optimism/optimism/tree/develop/op-deployer/cmd/op-deployer). From cc6f732cdd972ced823f4552fe9cee134c808b15 Mon Sep 17 00:00:00 2001 From: soyboy Date: Mon, 21 Oct 2024 13:17:14 -0600 Subject: [PATCH 229/565] adding a todo --- pages/builders/chain-operators/tools/op-deployer.mdx | 1 + 1 file changed, 1 insertion(+) diff --git a/pages/builders/chain-operators/tools/op-deployer.mdx b/pages/builders/chain-operators/tools/op-deployer.mdx index 25d5be866..3e6d25ae4 100644 --- a/pages/builders/chain-operators/tools/op-deployer.mdx +++ b/pages/builders/chain-operators/tools/op-deployer.mdx @@ -106,6 +106,7 @@ todo: add override examples todo: reference the default values todo: figure our if we should use the global overrides or the chain overrides todo: give example of 1s blocktime override +todo: how do you deploy your own superchain contracts? opt out of the shared ones ### Applying your intent From e10fafade87d040b3f86fe819ed57b8cec8c60aa Mon Sep 17 00:00:00 2001 From: soyboy <85043086+sbvegan@users.noreply.github.com> Date: Mon, 21 Oct 2024 20:55:06 -0600 Subject: [PATCH 230/565] Apply suggestions from code review Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> --- pages/builders.mdx | 2 +- pages/builders/app-developers.mdx | 1 + pages/builders/app-developers/bridging.mdx | 1 + .../app-developers/bridging/custom-bridge.mdx | 4 ++-- pages/builders/app-developers/contracts.mdx | 9 +++++---- pages/builders/app-developers/tools.mdx | 7 ++++--- pages/builders/app-developers/transactions.mdx | 13 +++++++------ pages/builders/app-developers/tutorials.mdx | 2 +- pages/builders/cex-wallet-developers.mdx | 4 ++-- pages/builders/chain-operators.mdx | 9 +++++---- pages/builders/chain-operators/configuration.mdx | 3 ++- pages/builders/chain-operators/deploy.mdx | 3 ++- pages/builders/chain-operators/features.mdx | 2 +- pages/builders/chain-operators/hacks.mdx | 2 +- pages/builders/chain-operators/management.mdx | 2 +- pages/builders/chain-operators/tools.mdx | 2 +- pages/builders/node-operators/management.mdx | 2 +- pages/builders/node-operators/tutorials.mdx | 2 +- pages/builders/notices.mdx | 2 +- pages/chain/identity.mdx | 6 +++--- pages/chain/testing.mdx | 2 +- pages/connect/contribute.mdx | 2 +- pages/connect/resources.mdx | 2 +- pages/stack/protocol/features.mdx | 2 +- 24 files changed, 47 insertions(+), 39 deletions(-) diff --git a/pages/builders.mdx b/pages/builders.mdx index 320370a98..810cb0fcd 100644 --- a/pages/builders.mdx +++ b/pages/builders.mdx @@ -12,7 +12,7 @@ The fixture is the main abstraction in React Cosmos. It represents a component e - + diff --git a/pages/builders/app-developers.mdx b/pages/builders/app-developers.mdx index 2b1fb38e2..4bf0f90ce 100644 --- a/pages/builders/app-developers.mdx +++ b/pages/builders/app-developers.mdx @@ -1,6 +1,7 @@ --- title: App Developers lang: en-US +description: Essential resources for app developers building on the OP Stack, including guides for deploying contracts, handling transactions, and cross-chain messaging. --- import { Card, Cards } from 'nextra/components' diff --git a/pages/builders/app-developers/bridging.mdx b/pages/builders/app-developers/bridging.mdx index fffb0d890..893cb6db6 100644 --- a/pages/builders/app-developers/bridging.mdx +++ b/pages/builders/app-developers/bridging.mdx @@ -1,6 +1,7 @@ --- title: Bridging lang: en-US +description: Learn about bridging basics, custom bridges, data transmission between L1 and L2, and using the standard bridge in OP Stack. --- import { Card, Cards } from 'nextra/components' diff --git a/pages/builders/app-developers/bridging/custom-bridge.mdx b/pages/builders/app-developers/bridging/custom-bridge.mdx index d686bae85..23ea17319 100644 --- a/pages/builders/app-developers/bridging/custom-bridge.mdx +++ b/pages/builders/app-developers/bridging/custom-bridge.mdx @@ -15,7 +15,7 @@ This guide provides important information you should be aware of when building a Custom bridges can bring a significant amount of complexity and risk to any project. Before you commit to a custom bridge, be sure that the [Standard Bridge](./standard-bridge) definitely does not support your use case. - [Building a custom bridged token](/builders/app-developers/tutorials/standard-bridge-custom-tokennnnyd) is often sufficient for projects that need more flexibility. + [Building a custom bridged token](/builders/app-developers/tutorials/standard-bridge-custom-token) is often sufficient for projects that need more flexibility. ## Guidelines @@ -27,7 +27,7 @@ Doing so will provide you with an audited foundation upon which you can add extr If you choose not to extend the `StandardBridge` contract, you may still want to follow the interface that the `StandardBridge` provides. Bridges that extend this interface will be compatible with the [Superchain Bridges UI](https://app.optimism.io/bridge). -You can read more about the design of the Standard Bridge in the guide on [Using the Standard Bridge](./standard-bridgedgh). +You can read more about the design of the Standard Bridge in the guide on [Using the Standard Bridge](./standard-bridge). ## The Superchain Token List diff --git a/pages/builders/app-developers/contracts.mdx b/pages/builders/app-developers/contracts.mdx index 6aa071fe8..06e1b874a 100644 --- a/pages/builders/app-developers/contracts.mdx +++ b/pages/builders/app-developers/contracts.mdx @@ -1,18 +1,19 @@ --- title: Contracts lang: en-US +description: Information on Solidity compatibility, contract optimization, and system contracts for OP Mainnet. --- import { Card, Cards } from 'nextra/components' # Contracts -This section provides information on solidity compatibility, contract optimization on op mainnet and using op mainnet system contracts. You'll find guide, tutorial to help you understand and work with these topics. +This section provides information on Solidity compatibility, contract optimization on OP Mainnet, and using OP Mainnet system contracts. You'll find guides and tutorials to help you understand and work with these topics. - + - + - + diff --git a/pages/builders/app-developers/tools.mdx b/pages/builders/app-developers/tools.mdx index be665e956..7aeb81f23 100644 --- a/pages/builders/app-developers/tools.mdx +++ b/pages/builders/app-developers/tools.mdx @@ -1,16 +1,17 @@ --- title: Tools lang: en-US +description: Information on open-source code repositories for OP Stack builders and SuperSim. --- import { Card, Cards } from 'nextra/components' # Tools -This section provides information on open source code repo for op stack builders and supersim. You'll find reference to help you understand and work with these topics. +This section provides information on open-source code repositories for OP Stack builders and SuperSim. Users will find references to help understand and work with these topics. - + - + diff --git a/pages/builders/app-developers/transactions.mdx b/pages/builders/app-developers/transactions.mdx index 6350d183a..847b05e02 100644 --- a/pages/builders/app-developers/transactions.mdx +++ b/pages/builders/app-developers/transactions.mdx @@ -1,22 +1,23 @@ --- title: Transactions lang: en-US +description: Guide to understanding and working with transactions on OP Mainnet, including fee estimation, gas parameters, and troubleshooting. --- import { Card, Cards } from 'nextra/components' # Transactions -This section provides information on estimating transaction fees on op mainnet, fees, setting transaction gas parameters on op mainnet, transaction statuses on op mainnet and troubleshooting transactions. You'll find guide to help you understand and work with these topics. +This section provides information on transactions in OP Mainnet, including fee estimation, gas parameters, transaction statuses, and troubleshooting. You'll find guides to help you understand and work with these topics. - + - + - + - + - + diff --git a/pages/builders/app-developers/tutorials.mdx b/pages/builders/app-developers/tutorials.mdx index 874941a77..2eca7c7ff 100644 --- a/pages/builders/app-developers/tutorials.mdx +++ b/pages/builders/app-developers/tutorials.mdx @@ -1,10 +1,10 @@ --- title: Tutorials lang: en-US +description: A collection of tutorials for app developers building on OP Stack, covering topics such as bridging tokens, deploying contracts, and estimating transaction costs. --- import { Card, Cards } from 'nextra/components' - # Tutorials This section provides information on bridging erc 20 tokens to op mainnet with the optimism sdk, bridging eth to op mainnet with the optimism sdk, communicating between op mainnet and ethereum in solidity, deploying your first contract on op mainnet, estimating transaction costs on op mainnet, tracing deposits and withdrawals, viewing deposits and withdrawals by address, triggering op mainnet transactions from ethereum, bridging your custom erc 20 token using the standard bridge and bridging your standard erc 20 token using the standard bridge. You'll find tutorial to help you understand and work with these topics. diff --git a/pages/builders/cex-wallet-developers.mdx b/pages/builders/cex-wallet-developers.mdx index 57f632b38..4c9207779 100644 --- a/pages/builders/cex-wallet-developers.mdx +++ b/pages/builders/cex-wallet-developers.mdx @@ -5,9 +5,9 @@ lang: en-US import { Card, Cards } from 'nextra/components' -# Cex Wallet Developers +# CEX Wallet Developers -This section provides information on supporting op mainnet in your exchange and supporting op mainnet in your wallet. You'll find guide to help you understand and work with these topics. +This section provides information on supporting OP Stack in your exchange and supporting OP Stack in your wallet. You'll find guides to help you understand and work with these topics. diff --git a/pages/builders/chain-operators.mdx b/pages/builders/chain-operators.mdx index 3b54c31da..872c69d26 100644 --- a/pages/builders/chain-operators.mdx +++ b/pages/builders/chain-operators.mdx @@ -1,20 +1,21 @@ --- title: Chain Operators lang: en-US +description: Information on chain architecture, configuration, deployment, and management for OP Stack chain operators. --- import { Card, Cards } from 'nextra/components' -# Chain Operators +# Chain operators -This section provides information on chain architecture, configuration, deploy, features, hacks, management, how to start a self hosted chain, tools and tutorials. You'll find tool, api, overview, guide, introduction to help you understand and work with these topics. +This section provides information on chain architecture, configuration, deployment, features, hacks, management, and how to start a self-hosted chain. You'll also find tools, APIs, overviews, guides, and introductions to help you understand and work with these topics. - + @@ -22,7 +23,7 @@ This section provides information on chain architecture, configuration, deploy, - + diff --git a/pages/builders/chain-operators/configuration.mdx b/pages/builders/chain-operators/configuration.mdx index b4267cebb..f8ea320f4 100644 --- a/pages/builders/chain-operators/configuration.mdx +++ b/pages/builders/chain-operators/configuration.mdx @@ -1,13 +1,14 @@ --- title: Configuration lang: en-US +description: Overview of configuration options for batchers, chain operators, proposers, and rollup deployments. --- import { Card, Cards } from 'nextra/components' # Configuration -This section provides information on batcher configuration, chain operator configurations, proposer configuration and rollup deployment configuration. You'll find api, overview to help you understand and work with these topics. +This section provides information on batcher configuration, chain operator configurations, proposer configuration, and rollup deployment configuration. Users will find API references and overviews to help understand and work with these topics. diff --git a/pages/builders/chain-operators/deploy.mdx b/pages/builders/chain-operators/deploy.mdx index 100f7bf78..87e4184f6 100644 --- a/pages/builders/chain-operators/deploy.mdx +++ b/pages/builders/chain-operators/deploy.mdx @@ -1,13 +1,14 @@ --- title: Deploy lang: en-US +description: Information on OP Stack genesis creation, deployment overview, and smart contract deployment. --- import { Card, Cards } from 'nextra/components' # Deploy -This section provides information on op stack genesis creation, op stack deployment overview and op stack smart contract deployment. You'll find guide, overview to help you understand and work with these topics. +This section provides information on OP Stack genesis creation, deployment overview, and smart contract deployment. You'll find guides and overviews to help you understand and work with these topics. diff --git a/pages/builders/chain-operators/features.mdx b/pages/builders/chain-operators/features.mdx index 57da4c982..00fc79e11 100644 --- a/pages/builders/chain-operators/features.mdx +++ b/pages/builders/chain-operators/features.mdx @@ -7,7 +7,7 @@ import { Card, Cards } from 'nextra/components' # Features -This section provides information on how to run an alt da mode chain, bridged usdc standard on the op stack, how to run a custom gas token chain, op stack preinstalls and span batches. You'll find guide, overview to help you understand and work with these topics. +This section provides information on various features for chain operators. You'll find guides and overviews to help you understand and work with topics such as running an alternative data availability mode chain, implementing the bridged USDC standard on the OP Stack, running a custom gas token chain, OP Stack preinstalls, and span batches. diff --git a/pages/builders/chain-operators/hacks.mdx b/pages/builders/chain-operators/hacks.mdx index 2ec661074..b64c3c47e 100644 --- a/pages/builders/chain-operators/hacks.mdx +++ b/pages/builders/chain-operators/hacks.mdx @@ -7,7 +7,7 @@ import { Card, Cards } from 'nextra/components' # Hacks -This section provides information on data availability hacks, derivation hacks, execution hacks, featured hacks, introduction to op stack hacks and settlement hacks. You'll find overview, introduction to help you understand and work with these topics. +This section provides information on various types of hacks related to OP Stack, including data availability, derivation, execution, and settlement. You'll find an overview and introduction to help you understand and work with these topics, as well as featured hacks for practical examples. diff --git a/pages/builders/chain-operators/management.mdx b/pages/builders/chain-operators/management.mdx index 57c755c70..6e3f29293 100644 --- a/pages/builders/chain-operators/management.mdx +++ b/pages/builders/chain-operators/management.mdx @@ -7,7 +7,7 @@ import { Card, Cards } from 'nextra/components' # Management -This section provides information on chain operator best practices, using blobs, managing your keys, rollup operations, using snap sync for chain operators and troubleshooting: chain operations. You'll find guide, tutorial to help you understand and work with these topics. +This section provides information on chain operator best practices, using blobs, managing keys, rollup operations, using snap sync for chain operators, and troubleshooting chain operations. You'll find guides and tutorials to help you understand and work with these topics. diff --git a/pages/builders/chain-operators/tools.mdx b/pages/builders/chain-operators/tools.mdx index ee682af50..b91e74678 100644 --- a/pages/builders/chain-operators/tools.mdx +++ b/pages/builders/chain-operators/tools.mdx @@ -7,7 +7,7 @@ import { Card, Cards } from 'nextra/components' # Tools -This section provides information on chain monitoring options, deploying a block explorer, how to configure challenger for your chain, conductor and deployer. You'll find guide, overview, tool to help you understand and work with these topics. +This section provides information on chain monitoring options, deploying a block explorer, configuring a challenger for your chain, conductor, and deployer. You'll find guides, overviews, and tools to help you understand and work with these topics. diff --git a/pages/builders/node-operators/management.mdx b/pages/builders/node-operators/management.mdx index e2ca7e714..76ac7721c 100644 --- a/pages/builders/node-operators/management.mdx +++ b/pages/builders/node-operators/management.mdx @@ -7,7 +7,7 @@ import { Card, Cards } from 'nextra/components' # Management -This section provides information on using blobs, node metrics and monitoring, using snap sync for node operators, node snapshots and node troubleshooting. You'll find api, reference, guide to help you understand and work with these topics. +This section provides information on using blobs, node metrics and monitoring, snap sync for node operators, node snapshots, and troubleshooting. Users will find APIs, references, and guides to help understand and work with these topics. diff --git a/pages/builders/node-operators/tutorials.mdx b/pages/builders/node-operators/tutorials.mdx index 5ef234f07..e9d9972f9 100644 --- a/pages/builders/node-operators/tutorials.mdx +++ b/pages/builders/node-operators/tutorials.mdx @@ -7,7 +7,7 @@ import { Card, Cards } from 'nextra/components' # Tutorials -This section provides information on running an op mainnet node from source, running a node with docker, building a node from source and running an op sepolia node from source. You'll find tutorial, guide to help you understand and work with these topics. +This section provides information on various node operations. It covers running an OP Mainnet node from source, running a node with Docker, building a node from source, and running an OP Sepolia node from source. You'll find tutorials and guides to help you understand and work with these topics. diff --git a/pages/builders/notices.mdx b/pages/builders/notices.mdx index edcabfd6e..fb6895d3e 100644 --- a/pages/builders/notices.mdx +++ b/pages/builders/notices.mdx @@ -7,7 +7,7 @@ import { Card, Cards } from 'nextra/components' # Notices -This section provides information on preparing for fault proofs breaking changes, preparing for granite breaking changes and sdk deprecation. You'll find overview, tutorial to help you understand and work with these topics. +This section provides information on preparing for fault proofs breaking changes, preparing for granite breaking changes, and SDK deprecation. You'll find an overview and tutorials to help you understand and work with these topics. diff --git a/pages/chain/identity.mdx b/pages/chain/identity.mdx index 8e9494356..fb4a663f6 100644 --- a/pages/chain/identity.mdx +++ b/pages/chain/identity.mdx @@ -10,11 +10,11 @@ import { Card, Cards } from 'nextra/components' This section provides information on build decentralized identity apps with attestations, attestation apps, eas contracts, individuals, organizations, introduction, projects and schemas. You'll find guide, reference, overview to help you understand and work with these topics. - + - + - + diff --git a/pages/chain/testing.mdx b/pages/chain/testing.mdx index 0e18191ba..d46f79c9d 100644 --- a/pages/chain/testing.mdx +++ b/pages/chain/testing.mdx @@ -7,7 +7,7 @@ import { Card, Cards } from 'nextra/components' # Testing -This section provides information on running a local development environment and testing apps for op mainnet. You'll find tutorial, guide to help you understand and work with these topics. +This section provides information on running a local development environment and testing apps for OP Mainnet. You'll find tutorials and guides to help you understand and work with these topics. diff --git a/pages/connect/contribute.mdx b/pages/connect/contribute.mdx index 551889623..b942d205e 100644 --- a/pages/connect/contribute.mdx +++ b/pages/connect/contribute.mdx @@ -7,7 +7,7 @@ import { Card, Cards } from 'nextra/components' # Contribute -This section provides information on contribute to optimism docs, contribute to the op stack and docs style guide. You'll find tutorial, overview, guide to help you understand and work with these topics. +This section provides information on contributing to Optimism docs, contributing to the OP Stack, and the docs style guide. Users will find tutorials, overviews, and guides to help them understand and work with these topics. diff --git a/pages/connect/resources.mdx b/pages/connect/resources.mdx index f922a7f4f..a8872f645 100644 --- a/pages/connect/resources.mdx +++ b/pages/connect/resources.mdx @@ -7,7 +7,7 @@ import { Card, Cards } from 'nextra/components' # Resources -This section provides information on . You'll find concept to help you understand and work with these topics. +This section provides information on various resources related to the OP Stack ecosystem. It includes concepts to help users understand and work with these topics. diff --git a/pages/stack/protocol/features.mdx b/pages/stack/protocol/features.mdx index a96559d8e..be264266a 100644 --- a/pages/stack/protocol/features.mdx +++ b/pages/stack/protocol/features.mdx @@ -7,7 +7,7 @@ import { Card, Cards } from 'nextra/components' # Features -This section provides information on alt da mode explainer, custom gas token explainer and sendrawtransactionconditional explainer. You'll find guide to help you understand and work with these topics. +This section provides information on Alt DA Mode Explainer, Custom Gas Token Explainer, and SendRawTransactionConditional Explainer. You'll find a guide to help you understand and work with these topics. From 306aa311646eea577ca18582b661b6bc9c32a9d1 Mon Sep 17 00:00:00 2001 From: Pavel Date: Tue, 22 Oct 2024 07:01:41 +0300 Subject: [PATCH 231/565] Fixed errors and typos in docs --- .../chain-operators/configuration/rollup.mdx | 14 +++++++------- pages/builders/chain-operators/deploy/genesis.mdx | 2 +- .../features/bridged-usdc-standard.mdx | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/pages/builders/chain-operators/configuration/rollup.mdx b/pages/builders/chain-operators/configuration/rollup.mdx index 6dd615624..8ef1c08cd 100644 --- a/pages/builders/chain-operators/configuration/rollup.mdx +++ b/pages/builders/chain-operators/configuration/rollup.mdx @@ -179,7 +179,7 @@ and is used as part of building the L2 genesis state. * **Default value:** None * **Recommended value:** * **Notes:** Must not be `address(0)` -* **Standard Config Requirement:** Implementation contract must the most +* **Standard Config Requirement:** Implementation contract must be the most up-to-date, governance-approved version of the OP Stack codebase, and, if the chain has been upgraded in the past, that the previous versions were a standard release of the codebase. @@ -196,7 +196,7 @@ genesis state. * **Default value:** None * **Recommended value:** * **Notes:** Must not be `address(0)` -* **Standard Config Requirement:** Implementation contract must the most +* **Standard Config Requirement:** Implementation contract must be the most up-to-date, governance-approved version of the OP Stack codebase, and, if the chain has been upgraded in the past, that the previous versions were a standard release of the codebase. @@ -212,7 +212,7 @@ used as part of building the L2 genesis state. * **Default value:** None * **Recommended value:** * **Notes:** Must not be `address(0)` -* **Standard Config Requirement:** Implementation contract must the most +* **Standard Config Requirement:** Implementation contract must be the most up-to-date, governance-approved version of the OP Stack codebase, and, if the chain has been upgraded in the past, that the previous versions were a standard release of the codebase. @@ -228,7 +228,7 @@ used as part of the derivation pipeline. * **Default value:** None * **Recommended value:** * **Notes:** Must not be `address(0)` -* **Standard Config Requirement:** Implementation contract must the most +* **Standard Config Requirement:** Implementation contract must be the most up-to-date, governance-approved version of the OP Stack codebase, and, if the chain has been upgraded in the past, that the previous versions were a standard release of the codebase. @@ -244,7 +244,7 @@ is used as part of the derivation pipeline. * **Default value:** None * **Recommended value:** * **Notes:** Must not be `address(0)` -* **Standard Config Requirement:** Implementation contract must the most +* **Standard Config Requirement:** Implementation contract must be the most up-to-date, governance-approved version of the OP Stack codebase, and, if the chain has been upgraded in the past, that the previous versions were a standard release of the codebase. @@ -572,7 +572,7 @@ addition of permissionless proposals. * **Type:** Number * **Default value:** None * **Recommended value:** -* **Notes:** his MUST be the timestamp corresponding to the block defined by +* **Notes:** this MUST be the timestamp corresponding to the block defined by the l1StartingBlockTag. * **Standard Config Requirement:** @@ -1005,7 +1005,7 @@ gas on L2. Alt-DA Mode enables seamless integration of various Data Availability (DA) Layers, regardless of their commitment type, into the OP Stack. This allows any chain operator to launch an OP Stack chain using their favorite DA Layer -for sustainably low costs. Lean more [here](/stack/protocol/features/alt-da-mode). +for sustainably low costs. Learn more [here](/stack/protocol/features/alt-da-mode). *** diff --git a/pages/builders/chain-operators/deploy/genesis.mdx b/pages/builders/chain-operators/deploy/genesis.mdx index a6bf9aa69..c9f546789 100644 --- a/pages/builders/chain-operators/deploy/genesis.mdx +++ b/pages/builders/chain-operators/deploy/genesis.mdx @@ -79,7 +79,7 @@ go run cmd/main.go genesis l2 \ --l2-allocs= \ --outfile.l2= \ --outfile.rollup= \ - --l1-rpc=> + --l1-rpc=> ``` ## Next Steps diff --git a/pages/builders/chain-operators/features/bridged-usdc-standard.mdx b/pages/builders/chain-operators/features/bridged-usdc-standard.mdx index f352c5e12..ceec7bf56 100644 --- a/pages/builders/chain-operators/features/bridged-usdc-standard.mdx +++ b/pages/builders/chain-operators/features/bridged-usdc-standard.mdx @@ -12,7 +12,7 @@ This explainer provides a high-level overview of the Bridged USDC Standard and h ## Bridged USDC Standard -USDC is one of the most bridged assets across the crypto ecosystem, and USDC is often bridged to new chains prior to any action from Circle. This can create a challenge when bridged USDC achieves substantial marketshare, but native USDC (issued by Circle) is preferred by the ecosystem, leading to fragmentation between multiple versions of USDC. Circle introduced the [Bridged USDC Standard](https://www.circle.com/en/bridged-usdc) to ensure that chain operators can easily deploy a form of bridged USDC that is capable of being upgraded in-place by Circle to native USDC, if and when appropriate, and prevent the fragmentation problem. +USDC is one of the most bridged assets across the crypto ecosystem, and USDC is often bridged to new chains prior to any action from Circle. This can create a challenge when bridged USDC achieves substantial market share, but native USDC (issued by Circle) is preferred by the ecosystem, leading to fragmentation between multiple versions of USDC. Circle introduced the [Bridged USDC Standard](https://www.circle.com/en/bridged-usdc) to ensure that chain operators can easily deploy a form of bridged USDC that is capable of being upgraded in-place by Circle to native USDC, if and when appropriate, and prevent the fragmentation problem. Bridged USDC Standard for the OP Stack allows for an efficient and modular solution for expanding the Bridged USDC Standard across the Superchain ecosystem. From bb8415912380a932c52a1d7e36582e37c85ce006 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alfonso=20Mu=C3=B1oz=20de=20Laborde?= Date: Tue, 22 Oct 2024 16:43:15 +0400 Subject: [PATCH 232/565] Update runbook URLs to actual public ones --- pages/builders/chain-operators/self-hosted.mdx | 2 +- pages/builders/node-operators/rollup-node.mdx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pages/builders/chain-operators/self-hosted.mdx b/pages/builders/chain-operators/self-hosted.mdx index 9342a2fb6..3a5edd689 100644 --- a/pages/builders/chain-operators/self-hosted.mdx +++ b/pages/builders/chain-operators/self-hosted.mdx @@ -105,7 +105,7 @@ They'll help you get a head start deploying your first OP Stack chain. You can also [suggest a new tutorial](https://github.com/ethereum-optimism/docs/issues/new?assignees=\&labels=tutorial%2Cdocumentation%2Ccommunity-request\&projects=\&template=suggest_tutorial.yaml\&title=%5BTUTORIAL%5D+Add+PR+title) if you have something specific in mind. We'd love to grow this list! -Lastly, for deeper insight into the day-to-day operations of OP Mainnet to see how these operational practices could apply to your chain, see the public [OP Mainnet Runbooks](https://www.notion.so/oplabs/Optimism-Runbooks-WIP-120f153ee1628045b230d5cd3df79f63?pvs=4). +Lastly, for deeper insight into the day-to-day operations of OP Mainnet to see how these operational practices could apply to your chain, see the public [OP Mainnet Runbooks](https://oplabs.notion.site/OP-Mainnet-Runbooks-120f153ee1628045b230d5cd3df79f63). ## Next Steps diff --git a/pages/builders/node-operators/rollup-node.mdx b/pages/builders/node-operators/rollup-node.mdx index 46acaef0a..ac84bdc47 100644 --- a/pages/builders/node-operators/rollup-node.mdx +++ b/pages/builders/node-operators/rollup-node.mdx @@ -121,7 +121,7 @@ It is important to regularly monitor your node, and you can optionally configure | [Running an OP Mainnet Node from Source](tutorials/mainnet) | Learn how to run an OP Mainnet node from source code. | 🟡 Medium | | [Running an OP Sepolia Node from Source](tutorials/testnet) | Learn how to run an OP Sepolia node from source code. | 🟡 Medium | -For deeper insight into the day-to-day operations of OP Mainnet to see how these practices could apply to your own node operations, see the public [OP Mainnet Runbooks](https://www.notion.so/oplabs/Optimism-Runbooks-WIP-120f153ee1628045b230d5cd3df79f63?pvs=4). +For deeper insight into the day-to-day operations of OP Mainnet to see how these practices could apply to your own node operations, see the public [OP Mainnet Runbooks](https://oplabs.notion.site/OP-Mainnet-Runbooks-120f153ee1628045b230d5cd3df79f63). ## Next Steps From db49ef5b21a379f6883c1a0f3e955a35105048c1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 22 Oct 2024 18:23:12 +0000 Subject: [PATCH 233/565] Bump mermaid from 10.9.0 to 10.9.3 Bumps [mermaid](https://github.com/mermaid-js/mermaid) from 10.9.0 to 10.9.3. - [Release notes](https://github.com/mermaid-js/mermaid/releases) - [Changelog](https://github.com/mermaid-js/mermaid/blob/develop/CHANGELOG.md) - [Commits](https://github.com/mermaid-js/mermaid/compare/v10.9.0...v10.9.3) --- updated-dependencies: - dependency-name: mermaid dependency-type: indirect ... Signed-off-by: dependabot[bot] --- pnpm-lock.yaml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8b2c4d3a5..92dd2f1bc 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1567,8 +1567,8 @@ packages: dom-accessibility-api@0.5.16: resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==} - dompurify@3.1.7: - resolution: {integrity: sha512-VaTstWtsneJY8xzy7DekmYWEOZcmzIe3Qb3zPd4STve1OBTa+e+WmS1ITQec1fZYXI3HCsOZZiSMpG6oxoWMWQ==} + dompurify@3.1.6: + resolution: {integrity: sha512-cTOAhc36AalkjtBpfG6O8JimdTMWNXjiePT2xQH/ppBGi/4uIpmj8eKyIkMJErXWARyINV/sB38yf8JCLF5pbQ==} dot-case@3.0.4: resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} @@ -2421,8 +2421,8 @@ packages: resolution: {integrity: sha512-LJKTl4iVNTndhL+3Uz/tfkjD0klIWsHlUzgtuNnNrsf7bAlXR30m+xYB7lHr5Z/l6e/yAIsr26Dabx6Buo4VGQ==} engines: {node: '>= 7.6.0'} - mermaid@10.9.0: - resolution: {integrity: sha512-swZju0hFox/B/qoLKK0rOxxgh8Cf7rJSfAUc1u8fezVihYMvrJAS45GzAxTVf4Q+xn9uMgitBcmWk7nWGXOs/g==} + mermaid@10.9.3: + resolution: {integrity: sha512-V80X1isSEvAewIL3xhmz/rVmc27CVljcsbWxkxlWJWY/1kQa4XOABqpDl2qQLGKzpKm6WbTfUEKImBlUfFYArw==} micro-ftch@0.3.1: resolution: {integrity: sha512-/0LLxhzP0tfiR5hcQebtudP56gUurs2CLkGarnCiB/OqEyUFQ6U3paQi/tgLv0hBJYt2rnr9MNpxz4fiiugstg==} @@ -4690,7 +4690,7 @@ snapshots: '@theguild/remark-mermaid@0.0.5(react@18.3.1)': dependencies: - mermaid: 10.9.0 + mermaid: 10.9.3 react: 18.3.1 unist-util-visit: 5.0.0 transitivePeerDependencies: @@ -5446,7 +5446,7 @@ snapshots: dom-accessibility-api@0.5.16: {} - dompurify@3.1.7: {} + dompurify@3.1.6: {} dot-case@3.0.4: dependencies: @@ -6584,7 +6584,7 @@ snapshots: treeify: 1.1.0 web3-utils: 1.10.4 - mermaid@10.9.0: + mermaid@10.9.3: dependencies: '@braintree/sanitize-url': 6.0.4 '@types/d3-scale': 4.0.8 @@ -6595,7 +6595,7 @@ snapshots: d3-sankey: 0.12.3 dagre-d3-es: 7.0.10 dayjs: 1.11.11 - dompurify: 3.1.7 + dompurify: 3.1.6 elkjs: 0.9.3 katex: 0.16.10 khroma: 2.1.0 From dbbe614773ae4e12741a7d8a99daa427adfba23a Mon Sep 17 00:00:00 2001 From: soyboy Date: Tue, 22 Oct 2024 14:31:22 -0600 Subject: [PATCH 234/565] adding op-deployer callouts --- pages/builders/chain-operators/deploy/genesis.mdx | 5 +++++ pages/builders/chain-operators/deploy/smart-contracts.mdx | 5 +++++ 2 files changed, 10 insertions(+) diff --git a/pages/builders/chain-operators/deploy/genesis.mdx b/pages/builders/chain-operators/deploy/genesis.mdx index 3df9223dc..7004e07d8 100644 --- a/pages/builders/chain-operators/deploy/genesis.mdx +++ b/pages/builders/chain-operators/deploy/genesis.mdx @@ -8,6 +8,11 @@ import { Callout } from 'nextra/components' # OP Stack genesis creation + +This page is out of date and shows the legacy method for genesis file creation. +For the latest recommended method, use [op-deployer](/builders/chain-operators/tools/op-deployer). + + The following guide shows you how to generate the L2 genesis file `genesis.json`. This is a JSON file that represents the L2 genesis. You will provide this file to the execution client (op-geth) to initialize your network. There is also the rollup configuration file, `rollup.json`, which will be diff --git a/pages/builders/chain-operators/deploy/smart-contracts.mdx b/pages/builders/chain-operators/deploy/smart-contracts.mdx index bcea8a6b4..598e8c1d0 100644 --- a/pages/builders/chain-operators/deploy/smart-contracts.mdx +++ b/pages/builders/chain-operators/deploy/smart-contracts.mdx @@ -8,6 +8,11 @@ import { Callout } from 'nextra/components' # OP Stack smart contract deployment + +This page is out of date and shows the legacy method for smart contract deployment. +For the latest recommended method, use [op-deployer](/builders/chain-operators/tools/op-deployer). + + The following guide shows you how to deploy the OP Stack L1 smart contracts. The primary development branch is `develop`, however **you should only deploy official contract releases**. You can visit the see the [smart contract overview](/stack/smart-contracts#official-releases) From df0ee418d0edb7e01a9916c7f06423e3b15611f5 Mon Sep 17 00:00:00 2001 From: soyboy Date: Tue, 22 Oct 2024 14:57:57 -0600 Subject: [PATCH 235/565] fix broken links --- pages/builders/chain-operators/configuration/rollup.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/builders/chain-operators/configuration/rollup.mdx b/pages/builders/chain-operators/configuration/rollup.mdx index 16140ad87..35c6c7bdc 100644 --- a/pages/builders/chain-operators/configuration/rollup.mdx +++ b/pages/builders/chain-operators/configuration/rollup.mdx @@ -1005,7 +1005,7 @@ gas on L2. Alt-DA Mode enables seamless integration of various Data Availability (DA) Layers, regardless of their commitment type, into the OP Stack. This allows any chain operator to launch an OP Stack chain using their favorite DA Layer -for sustainably low costs. Learn more [here](/stack/protocol/features/alt-da-mode). +for sustainably low costs. Learn more [here](/stack/beta-features/alt-da-mode). *** From 31c1f96d3c147700596174a5b0d68f2e13280fda Mon Sep 17 00:00:00 2001 From: soyboy <85043086+sbvegan@users.noreply.github.com> Date: Tue, 22 Oct 2024 16:48:49 -0600 Subject: [PATCH 236/565] Update smart-contracts.mdx --- pages/stack/smart-contracts.mdx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pages/stack/smart-contracts.mdx b/pages/stack/smart-contracts.mdx index 50ec26828..973821f2a 100644 --- a/pages/stack/smart-contracts.mdx +++ b/pages/stack/smart-contracts.mdx @@ -62,7 +62,7 @@ The upgrade was coupled with the [Granite network upgrade](/builders/node-operat * L1StandardBridge: [2.1.0](https://github.com/ethereum-optimism/optimism/blob/op-contracts/v1.3.0/packages/contracts-bedrock/src/L1/L1StandardBridge.sol#L73) * OptimismMintableERC20Factory: [1.9.0](https://github.com/ethereum-optimism/optimism/blob/op-contracts/v1.3.0/packages/contracts-bedrock/src/universal/OptimismMintableERC20Factory.sol#L46) * OptimismPortal: [3.10.0](https://github.com/ethereum-optimism/optimism/blob/op-contracts/v1.4.0/packages/contracts-bedrock/src/L1/OptimismPortal2.sol#L144) - * SystemConfig: [2.0.0](https://github.com/ethereum-optimism/optimism/blob/op-contracts/v1.4.0/packages/contracts-bedrock/src/L1/SystemConfig.sol#L111) + * SystemConfig: [2.2.0](https://github.com/ethereum-optimism/optimism/blob/op-contracts/v1.4.0/packages/contracts-bedrock/src/L1/SystemConfig.sol#L111) * DisputeGameFactory: [1.0.0](https://github.com/ethereum-optimism/optimism/blob/op-contracts/v1.4.0/packages/contracts-bedrock/src/dispute/DisputeGameFactory.sol#L25) * SuperchainConfig: [1.1.0](https://github.com/ethereum-optimism/optimism/blob/op-contracts/v1.2.0/packages/contracts-bedrock/src/L1/SuperchainConfig.sol#L38) * ProtocolVersions: [1.0.0](https://github.com/ethereum-optimism/optimism/blob/op-contracts/v1.2.0/packages/contracts-bedrock/src/L1/ProtocolVersions.sol#L39) @@ -106,7 +106,7 @@ vote for L2 predeploy upgrades and is a requirement for Stage 1. * L1StandardBridge: [2.1.0](https://github.com/ethereum-optimism/optimism/blob/op-contracts/v1.3.0/packages/contracts-bedrock/src/L1/L1StandardBridge.sol#L73) * OptimismMintableERC20Factory: [1.9.0](https://github.com/ethereum-optimism/optimism/blob/op-contracts/v1.3.0/packages/contracts-bedrock/src/universal/OptimismMintableERC20Factory.sol#L46) * OptimismPortal: [3.10.0](https://github.com/ethereum-optimism/optimism/blob/op-contracts/v1.4.0/packages/contracts-bedrock/src/L1/OptimismPortal2.sol#L144) - * SystemConfig: [2.0.0](https://github.com/ethereum-optimism/optimism/blob/op-contracts/v1.4.0/packages/contracts-bedrock/src/L1/SystemConfig.sol#L111) + * SystemConfig: [2.2.0](https://github.com/ethereum-optimism/optimism/blob/op-contracts/v1.4.0/packages/contracts-bedrock/src/L1/SystemConfig.sol#L111) * FaultDisputeGame: [1.2.0](https://github.com/ethereum-optimism/optimism/blob/op-contracts/v1.4.0/packages/contracts-bedrock/src/dispute/FaultDisputeGame.sol#L73) * PermissionedDisputeGame: [1.2.0](https://github.com/ethereum-optimism/optimism/blob/op-contracts/v1.4.0/packages/contracts-bedrock/src/dispute/PermissionedDisputeGame.sol) * DisputeGameFactory: [1.0.0](https://github.com/ethereum-optimism/optimism/blob/op-contracts/v1.4.0/packages/contracts-bedrock/src/dispute/DisputeGameFactory.sol#L25) From 5ff56173ff6b0288484a036d5a053cd6de666f7e Mon Sep 17 00:00:00 2001 From: soyboy <85043086+sbvegan@users.noreply.github.com> Date: Tue, 22 Oct 2024 17:11:47 -0600 Subject: [PATCH 237/565] Update rollup.mdx updated standard config to match the configurability spec --- pages/builders/chain-operators/configuration/rollup.mdx | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/pages/builders/chain-operators/configuration/rollup.mdx b/pages/builders/chain-operators/configuration/rollup.mdx index 35c6c7bdc..323b0f858 100644 --- a/pages/builders/chain-operators/configuration/rollup.mdx +++ b/pages/builders/chain-operators/configuration/rollup.mdx @@ -263,9 +263,7 @@ Number of seconds between each L2 block. Must be \< = L1 block time (12 on mainn * **Default value:** None * **Recommended value:** * **Notes:** Must not be `0`. Must be less than the L1 blocktime and a whole number. -* **Standard Config Requirement:** 2 seconds. High security and - interoperability compatibility requirement, until de-risked/solved at app - layer. +* **Standard Config Requirement:** 1 or 2 seconds *** From 75cef240e660f2597da49f97288bb49ac154e892 Mon Sep 17 00:00:00 2001 From: jsvisa Date: Wed, 23 Oct 2024 14:43:33 +0800 Subject: [PATCH 238/565] custom-gas-token: wrong Deploy.s.sol file path Signed-off-by: jsvisa --- pages/builders/chain-operators/features/custom-gas-token.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/builders/chain-operators/features/custom-gas-token.mdx b/pages/builders/chain-operators/features/custom-gas-token.mdx index a62d137e4..599e43a6b 100644 --- a/pages/builders/chain-operators/features/custom-gas-token.mdx +++ b/pages/builders/chain-operators/features/custom-gas-token.mdx @@ -56,7 +56,7 @@ section of the docs. ```bash DEPLOYMENT_OUTFILE=deployments/artifact.json \ DEPLOY_CONFIG_PATH= \ - forge script scripts/Deploy.s.sol:Deploy \ + forge script scripts/deploy/Deploy.s.sol:Deploy \ --broadcast --private-key $PRIVATE_KEY \ --rpc-url $ETH_RPC_URL ``` From b1afbc9b2a68df08026be43d8ffbaf5e31c5bb6d Mon Sep 17 00:00:00 2001 From: jsvisa Date: Wed, 23 Oct 2024 14:46:46 +0800 Subject: [PATCH 239/565] chain-operators: wrong Deploy.s.sol file path Signed-off-by: jsvisa --- pages/builders/chain-operators/deploy/smart-contracts.mdx | 4 ++-- pages/builders/chain-operators/tutorials/create-l2-rollup.mdx | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pages/builders/chain-operators/deploy/smart-contracts.mdx b/pages/builders/chain-operators/deploy/smart-contracts.mdx index 598e8c1d0..2a26e2f10 100644 --- a/pages/builders/chain-operators/deploy/smart-contracts.mdx +++ b/pages/builders/chain-operators/deploy/smart-contracts.mdx @@ -44,7 +44,7 @@ the outputs inside [`snapshots/state-diff/`](https://github.com/ethereum-optimis Run the deployment with state diffs by executing: ```bash -forge script -vvv scripts/Deploy.s.sol:Deploy --sig 'runWithStateDiff()' --rpc-url $ETH_RPC_URL --broadcast --private-key $PRIVATE_KEY +forge script -vvv scripts/deploy/Deploy.s.sol:Deploy --sig 'runWithStateDiff()' --rpc-url $ETH_RPC_URL --broadcast --private-key $PRIVATE_KEY ``` ### Execution @@ -71,7 +71,7 @@ shared SuperchainConfig contract. ``` DEPLOYMENT_OUTFILE=deployments/artifact.json \ DEPLOY_CONFIG_PATH= \ - forge script scripts/Deploy.s.sol:Deploy \ + forge script scripts/deploy/Deploy.s.sol:Deploy \ --broadcast --private-key $PRIVATE_KEY \ --rpc-url $ETH_RPC_URL ``` diff --git a/pages/builders/chain-operators/tutorials/create-l2-rollup.mdx b/pages/builders/chain-operators/tutorials/create-l2-rollup.mdx index b94ee8fd5..93b2e978f 100644 --- a/pages/builders/chain-operators/tutorials/create-l2-rollup.mdx +++ b/pages/builders/chain-operators/tutorials/create-l2-rollup.mdx @@ -418,7 +418,7 @@ Once you've configured your network, it's time to deploy the L1 contracts necess {

Deploy the L1 contracts

} ```bash -forge script scripts/Deploy.s.sol:Deploy --private-key $GS_ADMIN_PRIVATE_KEY --broadcast --rpc-url $L1_RPC_URL --slow +forge script scripts/deploy/Deploy.s.sol:Deploy --private-key $GS_ADMIN_PRIVATE_KEY --broadcast --rpc-url $L1_RPC_URL --slow ``` From 7cbd7152cf74c8773bcc83835ca1b7509b12d355 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Wed, 23 Oct 2024 17:13:46 +0100 Subject: [PATCH 240/565] updated finality docs --- pages/stack/protocol/rollup/finality.mdx | 144 +++++++++++++++-------- 1 file changed, 95 insertions(+), 49 deletions(-) diff --git a/pages/stack/protocol/rollup/finality.mdx b/pages/stack/protocol/rollup/finality.mdx index 1da3d0248..528581f33 100644 --- a/pages/stack/protocol/rollup/finality.mdx +++ b/pages/stack/protocol/rollup/finality.mdx @@ -1,89 +1,135 @@ --- -title: Transaction Finality +title: Transaction Finality lang: en-US -description: Learn about finality in blockchain systems and the steps to achieve transaction settlement. +description: Learn about finality in OP Stack and the steps to achieve transaction settlement. --- import Image from 'next/image' import { Callout } from 'nextra/components' -# Transaction Finality +# OP Stack rollups -Transaction finality refers to the point at which a transaction is considered irreversible and is permanently recorded on the blockchain. +OP Stack rollup is an extension of the consensus mechanism in Ethereum, where instead of running an entirely separate consensus protocol, we piggyback off Ethereum’s consensus. This way, OP Stack rollup can take advantage of Ethereum’s ordering mechanism and finalize its own blocks without needing to create a new consensus layer. -## Finality on Ethereum +## State Machines and Transaction Processing -Ethereum provides strong guarantees for transaction finality. Here's how it works: +State machines, such as the EVM, rely on input lists (transactions) to evolve from one state to another. The list and its order are vital because incorrect ordering can lead to an invalid state. -* Time Frame: Under normal network conditions, Ethereum transactions achieve finality in approximately 15 minutes. -* Consensus Cycles: Finality is reached after two [epochs](https://info.etherscan.com/epoch-in-ethereum/). -* Block Confirmations: During this time, multiple blocks are added to the chain, each providing additional confirmation of transactions in earlier blocks. +For example, if a user tries to send 1 ETH to two different parties at the same time, only one transaction can be valid. The order determines which transaction succeeds, making ordering an essential aspect of consensus. -This timeframe ensures sufficient block confirmations to protect against reorganizations (reorgs) and guarantees secure settlement. +## Commutative vs non-Commutative operations - - A reorg occurs when part of the blockchain is replaced, discarding previously confirmed blocks. - +Commutative operations allow input order to change without affecting the outcome. However, non-commutative operations (like sending funds) require strict ordering. Hence, the list's availability and ordering are fundamental to ensuring the integrity of the system. -## OP Stack Finality +## Consensus and Ordering -The OP Stack derives its security from Ethereum. Finality occurs when transaction data is posted to Ethereum's Layer 1 (L1) data availability layer. At this point, the rollup state becomes finalized, similar to L1 finality, preventing L2 reorgs. +Consensus determines the valid chain or list of transactions. In OP Stack, Ethereum’s consensus (via Proof of Stake) is used to achieve transaction ordering and finality. + +## Why piggybacking on Ethereum? + +By publishing rollup blocks on Ethereum, OP Stack effectively outsource it's consensus mechanism. Instead of running a separate consensus protocol, they rely on Ethereum's ordering and finality guarantees. + +Key benefits of this approach include: + +* OP Stack inherit Ethereum’s security and ordering properties. +* The OP Stack simplifies the design and development process by removing the need for a separate consensus protocol. +* Attack vectors such as double-spends are mitigated by Ethereum’s inherent mechanisms. + +### Transaction finality states In OP Stack, transaction finality involves three main stages: -* Unsafe: The L2 sequencer creates a block containing the transaction, but the transaction data has not yet been posted to L1. It is circulated within the L2 network for speed. +* Unsafe: The L2 sequencer creates a block containing the transaction, but the transaction data will not been posted to L1. It is circulated within the L2 network for speed. * Safe: The sequencer's batcher posts transaction data to L1. Any L2 node can now derive this transaction. -* Finalized: The state is considered finalized once more than (>65) L1 blocks have passed(approximately 10 minutes), ensuring the L1 data is secure and won't be reorganized. +* Finalized: Transactions is finalized once more than (>65) L1 blocks have passed(approximately 20 minutes), ensuring the L1 data is secure and won't be reorganized. Transaction Finality Diagram. - - Even if an L2 sequencer generates invalid transactions, OP Stack ensures that network nodes will reject them, maintaining consensus and security. - +## Sequencer Operations -## The Settlement Layer +The sequencer (block producer) handles transaction processing through the following steps: -Ethereum provides a view of the state on an OP Stack chain using the following mechanism: +1. **Pre-publishing Distribution:** + - Sequencer receives transactions from users + - Creates blocks containing these transactions + - Distributes blocks to network nodes before L1 publication + - Nodes mark these blocks as "unsafe" -* Rollup nodes post data to and monitor Ethereum. -* Ethereum processes transactions according to its consensus rules, without requiring knowledge of the L2. -* For L2 to L1 messages (e.g., withdrawals), L2 must prove the validity of its state. +2. **L1 Publication:** + - Sequencer publishes blocks to Ethereum + - Blocks become "safe" once included in L1 + - Blocks achieve "finalized" status after L1 finalization (approximately 20 minutes) -To ensure the finality of an OP Stack chain's state, wait for transaction finalization on L1. +### Sequencer Trust -## Sequencer Reliability +The sequencer's role involves certain trust assumptions: -While sequencers are centralized, the risk of equivocation (false reporting of block state) is mitigated as follows: +- Can temporarily withhold transactions. +- May attempt to reorder transactions before L1 publication. +- Cannot modify or censor transactions once published to L1. +- Cannot affect finalized transactions. -* Sequencers and all L2 nodes must follow consensus rules. -* Invalid transactions are rejected by all network nodes. -* This process mirrors how Ethereum and Bitcoin handle transactions. +## Block and transaction validity in the OP Stack -The L2 state is considered final once the batch is posted to L1 and enough blocks have passed to prevent a reorg. +When a block is submitted to Ethereum, it is either valid or invalid. If the block is valid, the state is updated; otherwise, it is discarded. Nodes execute valid blocks and update the rollup state accordingly. -## Challenge Period +### Reorgs and finality -OP Stack rollups use a 7-day withdrawal challenge period for specific reasons: +A block's inclusion in a finalized Ethereum block ensures its finality. If a rollup block is included in a finalized Ethereum block, it cannot be reorged. Therefore, rollup blocks enjoy the same finality guarantees as Ethereum blocks, and this finality is handled by the **OP Stack** architecture. -* L1 has no direct knowledge of L2. -* For L2 to L1 withdrawals, L1 must verify the withdrawal's validity. -* The 7-day period allows time to dispute withdrawal claims. -* The challenge process uses L2 transaction history to validate withdrawal claims. +### Reorg Handling -If a challenge is successful, meaning the withdrawal claim fails: +When L1 reorgs occur: -* The L2 state remains unaffected. -* There is no L2 reorganization. -* The challenge only affects the specific withdrawal claim. +1. Nodes detect the L1 reorg +2. Affected L2 blocks return to "unsafe" status +3. Sequencer typically republishes the same transactions +4. System returns to consistent state after reprocessing -## Conclusion +## The role of the proof system + +The proof system, is entirely separate from the core OP Stack protocol. It is an app-level validation system designed to ensure that certain claims about the rollup's state are correct. + +### What is a claim? + +A claim in the context of rollups built on the OP Stack is a statement that asserts the state of the system at a specific block height. For example, a claim might assert that at block 1,000,000, the state hash is `XYZ`. Other participants can challenge this claim if they believe it to be incorrect. + +### Fault proofs and challenges + +Challenges revolve around proving whether a given claim is valid. However, the outcome of a challenge does not affect the underlying chain. For example, if a claim about the state of the rollup at a certain block is proven wrong, it only affects the app-level functionality, not the OP Stack protocol. + +### Bridge Independence -It's important to understand transaction finality and the challenge period as distinct concepts: +Important points about bridge systems: + +- Bridges are application-level constructs +- They operate independently of the core rollup protocol +- Bridge security doesn't affect L2 transaction validity +- Bridge failures don't cause L2 reorgs or state changes + +### Example: Custom bridges in OP Stack + +A custom bridge might be developed by a user to allow ERC-20 tokens to move between layers. However, this bridge is app-level and not native to the OP Stack rollup. If there’s an issue with the bridge, such as incorrect proof validation, it doesn’t affect the rollup itself but impacts the subjective value of the bridged assets. + +## 7 days challenge period in OP Stack + +The 7 days challenge period exists to give time for challenges to be raised and resolved. While the rollup chain itself finalizes quickly (within 20 minutes), withdrawals from Layer 2 are delayed to allow for fault-proof validation. This ensures that malicious activity can be detected and challenged before it affects the system. + +### Why 7 days? + +The 7 day period is a reasonable time frame to allow participants to organize a response, potentially even organizing a hard fork on Layer 1 to address severe issues. In the context of the OP Stack, this challenge period also serves as a safeguard for app-level bridges and custom rollup designs that may be built on top of the core protocol. + +### Withdrawal Delays vs. Finality + +One common misconception is confusing withdrawal delays with transaction finality: + +- Transaction finality occurs in approximately 20 minutes +- Withdrawal delays (often 7 days) are separate from transaction finality +- Withdrawal delays are application-level security features +- These delays affect only L1 withdrawals, not L2 transaction finality + +## Conclusion -* The 7-day challenge window ensures the validity of L2 transactions during withdrawals to L1. It is not related to general L2 transaction finality. -* Users can dispute a withdrawal claim by submitting a fraud proof, ensuring invalid withdrawals are caught before finalizing the state on L1. -* A successful challenge impacts only the withdrawal claim and does not affect L2 transaction finality. -* L2 finality occurs within minutes after data is posted to L1 and confirmed by around 65 blocks (\~10 minutes). -* Even if a challenge is successful, it does not cause a reorg or delay L2 transaction finality. +Transaction finality on the OP Stack depends heavily on Ethereum’s consensus mechanism. The OP Stack ensures that rollups inherit Ethereum’s finality guarantees, while the proof system adds an additional layer of validation for app-level functionality. While finality occurs quickly for rollup blocks, the proof system introduces a delay for withdrawals to ensure the security of bridging mechanisms. From f35ba6c66e8f29f153ab295867c785a3266976c6 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Wed, 23 Oct 2024 17:15:23 +0100 Subject: [PATCH 241/565] fix linting errors --- pages/stack/protocol/rollup/finality.mdx | 62 ++++++++++++------------ words.txt | 1 - 2 files changed, 31 insertions(+), 32 deletions(-) diff --git a/pages/stack/protocol/rollup/finality.mdx b/pages/stack/protocol/rollup/finality.mdx index 528581f33..4f4a4ebf1 100644 --- a/pages/stack/protocol/rollup/finality.mdx +++ b/pages/stack/protocol/rollup/finality.mdx @@ -9,7 +9,7 @@ import { Callout } from 'nextra/components' # OP Stack rollups -OP Stack rollup is an extension of the consensus mechanism in Ethereum, where instead of running an entirely separate consensus protocol, we piggyback off Ethereum’s consensus. This way, OP Stack rollup can take advantage of Ethereum’s ordering mechanism and finalize its own blocks without needing to create a new consensus layer. +OP Stack rollup is an extension of the consensus mechanism in Ethereum, where instead of running an entirely separate consensus protocol, we piggyback off Ethereum's consensus. This way, OP Stack rollup can take advantage of Ethereum's ordering mechanism and finalize its own blocks without needing to create a new consensus layer. ## State Machines and Transaction Processing @@ -23,7 +23,7 @@ Commutative operations allow input order to change without affecting the outcome ## Consensus and Ordering -Consensus determines the valid chain or list of transactions. In OP Stack, Ethereum’s consensus (via Proof of Stake) is used to achieve transaction ordering and finality. +Consensus determines the valid chain or list of transactions. In OP Stack, Ethereum's consensus (via Proof of Stake) is used to achieve transaction ordering and finality. ## Why piggybacking on Ethereum? @@ -31,9 +31,9 @@ By publishing rollup blocks on Ethereum, OP Stack effectively outsource it's con Key benefits of this approach include: -* OP Stack inherit Ethereum’s security and ordering properties. +* OP Stack inherit Ethereum's security and ordering properties. * The OP Stack simplifies the design and development process by removing the need for a separate consensus protocol. -* Attack vectors such as double-spends are mitigated by Ethereum’s inherent mechanisms. +* Attack vectors such as double-spends are mitigated by Ethereum's inherent mechanisms. ### Transaction finality states @@ -51,25 +51,25 @@ In OP Stack, transaction finality involves three main stages: The sequencer (block producer) handles transaction processing through the following steps: -1. **Pre-publishing Distribution:** - - Sequencer receives transactions from users - - Creates blocks containing these transactions - - Distributes blocks to network nodes before L1 publication - - Nodes mark these blocks as "unsafe" +1. Pre-publishing Distribution: + * Sequencer receives transactions from users + * Creates blocks containing these transactions + * Distributes blocks to network nodes before L1 publication + * Nodes mark these blocks as "unsafe" -2. **L1 Publication:** - - Sequencer publishes blocks to Ethereum - - Blocks become "safe" once included in L1 - - Blocks achieve "finalized" status after L1 finalization (approximately 20 minutes) +2. L1 Publication: + * Sequencer publishes blocks to Ethereum + * Blocks become "safe" once included in L1 + * Blocks achieve "finalized" status after L1 finalization (approximately 20 minutes) ### Sequencer Trust The sequencer's role involves certain trust assumptions: -- Can temporarily withhold transactions. -- May attempt to reorder transactions before L1 publication. -- Cannot modify or censor transactions once published to L1. -- Cannot affect finalized transactions. +* Can temporarily withhold transactions. +* May attempt to reorder transactions before L1 publication. +* Cannot modify or censor transactions once published to L1. +* Cannot affect finalized transactions. ## Block and transaction validity in the OP Stack @@ -83,10 +83,10 @@ A block's inclusion in a finalized Ethereum block ensures its finality. If a rol When L1 reorgs occur: -1. Nodes detect the L1 reorg -2. Affected L2 blocks return to "unsafe" status -3. Sequencer typically republishes the same transactions -4. System returns to consistent state after reprocessing +1. Nodes detect the L1 reorg +2. Affected L2 blocks return to "unsafe" status +3. Sequencer typically republishes the same transactions +4. System returns to consistent state after reprocessing ## The role of the proof system @@ -104,14 +104,14 @@ Challenges revolve around proving whether a given claim is valid. However, the o Important points about bridge systems: -- Bridges are application-level constructs -- They operate independently of the core rollup protocol -- Bridge security doesn't affect L2 transaction validity -- Bridge failures don't cause L2 reorgs or state changes +* Bridges are application-level constructs +* They operate independently of the core rollup protocol +* Bridge security doesn't affect L2 transaction validity +* Bridge failures don't cause L2 reorgs or state changes ### Example: Custom bridges in OP Stack -A custom bridge might be developed by a user to allow ERC-20 tokens to move between layers. However, this bridge is app-level and not native to the OP Stack rollup. If there’s an issue with the bridge, such as incorrect proof validation, it doesn’t affect the rollup itself but impacts the subjective value of the bridged assets. +A custom bridge might be developed by a user to allow ERC-20 tokens to move between layers. However, this bridge is app-level and not native to the OP Stack rollup. If there's an issue with the bridge, such as incorrect proof validation, it doesn't affect the rollup itself but impacts the subjective value of the bridged assets. ## 7 days challenge period in OP Stack @@ -125,11 +125,11 @@ The 7 day period is a reasonable time frame to allow participants to organize a One common misconception is confusing withdrawal delays with transaction finality: -- Transaction finality occurs in approximately 20 minutes -- Withdrawal delays (often 7 days) are separate from transaction finality -- Withdrawal delays are application-level security features -- These delays affect only L1 withdrawals, not L2 transaction finality +* Transaction finality occurs in approximately 20 minutes +* Withdrawal delays (often 7 days) are separate from transaction finality +* Withdrawal delays are application-level security features +* These delays affect only L1 withdrawals, not L2 transaction finality ## Conclusion -Transaction finality on the OP Stack depends heavily on Ethereum’s consensus mechanism. The OP Stack ensures that rollups inherit Ethereum’s finality guarantees, while the proof system adds an additional layer of validation for app-level functionality. While finality occurs quickly for rollup blocks, the proof system introduces a delay for withdrawals to ensure the security of bridging mechanisms. +Transaction finality on the OP Stack depends heavily on Ethereum's consensus mechanism. The OP Stack ensures that rollups inherit Ethereum's finality guarantees, while the proof system adds an additional layer of validation for app-level functionality. While finality occurs quickly for rollup blocks, the proof system introduces a delay for withdrawals to ensure the security of bridging mechanisms. diff --git a/words.txt b/words.txt index 51f3a1857..33bb71948 100644 --- a/words.txt +++ b/words.txt @@ -355,7 +355,6 @@ therealbytes Thirdweb threadcreate tility -timeframe timeseries Tranfer trustlessly From e87c41b46c1f110a000a43593065f5141e72bc6f Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Wed, 23 Oct 2024 17:27:04 +0100 Subject: [PATCH 242/565] updated few grammar errors --- pages/stack/protocol/rollup/finality.mdx | 138 +++++++++++++++++++++++ 1 file changed, 138 insertions(+) create mode 100644 pages/stack/protocol/rollup/finality.mdx diff --git a/pages/stack/protocol/rollup/finality.mdx b/pages/stack/protocol/rollup/finality.mdx new file mode 100644 index 000000000..b4ef46306 --- /dev/null +++ b/pages/stack/protocol/rollup/finality.mdx @@ -0,0 +1,138 @@ +--- +title: Transaction Finality +lang: en-US +description: Learn about finality in OP Stack and the steps to achieve transaction settlement. +--- + +import Image from 'next/image' +import { Callout } from 'nextra/components' + +# OP Stack rollups + +OP Stack rollup is an extension of the consensus mechanism in Ethereum, where instead of running an entirely separate consensus protocol, we piggyback off Ethereum's consensus. This way, OP Stack rollup can take advantage of Ethereum's ordering mechanism and finalize its own blocks without needing to create a new consensus layer. + +## State Machines and Transaction Processing + +State machines, such as the EVM, rely on input lists (transactions) to evolve from one state to another. The list and its order are vital because incorrect ordering can lead to an invalid state. + +For example, if a user tries to send 1 ETH to two different parties at the same time, only one transaction can be valid. The order determines which transaction succeeds, making ordering an essential aspect of consensus. + +## Commutative vs non-Commutative operations + +Commutative operations allow input order to change without affecting the outcome. However, non-commutative operations (like sending funds) require strict ordering. Hence, the list's availability and ordering are fundamental to ensuring the integrity of the system. + +## Consensus and Ordering + +Consensus determines the valid chain or list of transactions. In OP Stack, Ethereum's consensus (via Proof of Stake) is used to achieve transaction ordering and finality. + +## Why piggybacking on Ethereum? + +By publishing rollup blocks on Ethereum, OP Stack effectively outsource it's consensus mechanism. Instead of running a separate consensus protocol, they rely on Ethereum's ordering and finality guarantees. + +Key benefits of this approach include: + +* OP Stack inherits Ethereum's security and ordering properties. +* The OP Stack simplifies the design and development process by removing the need for a separate consensus protocol. +* Attack vectors such as double-spends are mitigated by Ethereum's inherent mechanisms. + +### Transaction finality states + +In OP Stack, transaction finality involves three main stages: + +* Unsafe: The L2 sequencer creates a block containing the transaction, but the transaction data has not been posted to L1. It is circulated within the L2 network for speed. + +* Safe: The sequencer's batcher has posted transaction data to L1. Any L2 node can now derive this transaction. + +* Finalized: Transactions are finalized once more than 65 L1 blocks have passed (approximately 20 minutes), ensuring the L1 data is secure and won't be reorganized. + +Transaction Finality Diagram. + +## Sequencer Operations + +The sequencer (block producer) handles transaction processing through the following steps: + +1. Pre-publishing Distribution: + * Sequencer receives transactions from users + * Creates blocks containing these transactions + * Distributes blocks to network nodes before L1 publication + * Nodes mark these blocks as "unsafe" + +2. L1 Publication: + * Sequencer publishes blocks to Ethereum + * Blocks become "safe" once included in L1 + * Blocks achieve "finalized" status after L1 finalization (approximately 20 minutes) + +### Sequencer Trust + +The sequencer's role involves certain trust assumptions: + +* Can temporarily withhold transactions. +* May attempt to reorder transactions before L1 publication. +* Cannot modify or censor transactions once published to L1. +* Cannot affect finalized transactions. + +## Block and transaction validity in the OP Stack + +When a block is submitted to Ethereum, it is either valid or invalid. If the block is valid, the state is updated; otherwise, it is discarded. Nodes execute valid blocks and update the rollup state accordingly. + +### Reorgs and finality + +A block's inclusion in a finalized Ethereum block ensures its finality. If a rollup block is included in a finalized Ethereum block, it cannot be reorged. Therefore, rollup blocks enjoy the same finality guarantees as Ethereum blocks, and this finality is handled by the **OP Stack** architecture. + +### Reorg Handling + +When L1 reorgs occur: + +1. Nodes detect the L1 reorg +2. Affected L2 blocks return to "unsafe" status +3. Sequencer typically republishes the same transactions +4. System returns to a consistent state after reprocessing + +## The role of the proof system + +The proof system, is entirely separate from the core OP Stack protocol. It is an app-level validation system designed to ensure that certain claims about the rollup's state are correct. + +### What is a claim? + +A claim in the context of rollups built on the OP Stack is a statement that asserts the state of the system at a specific block height. For example, a claim might assert that at block 1,000,000, the state hash is `XYZ`. Other participants can challenge this claim if they believe it to be incorrect. + +### Fault proofs and challenges + +Challenges revolve around proving whether a given claim is valid. However, the outcome of a challenge does not affect the underlying chain. For example, if a claim about the state of the rollup at a certain block is proven wrong, it only affects the app-level functionality, not the OP Stack protocol. + +### Bridge Independence + +Important points about bridge systems: + +* Bridges are application-level constructs +* They operate independently of the core rollup protocol +* Bridge security doesn't affect L2 transaction validity +* Bridge failures don't cause L2 reorgs or state changes + +### Example: Custom bridges in OP Stack + +A custom bridge might be developed by a user to allow ERC-20 tokens to move between layers. +However, this bridge is app-level and not native to the OP Stack rollup. If there's an issue with the bridge, such as incorrect proof validation, it doesn't affect the rollup itself but impacts the subjective value of the bridged assets. + +## 7-Day Challenge Period in OP Stack + +The 7-day challenge period exists to give time for challenges to be raised and resolved. +While the rollup chain itself finalizes quickly (within 20 minutes), withdrawals from Layer 2 are delayed to allow for fault-proof validation. +This ensures that malicious activity can be detected and challenged before it affects the system. + +### Why 7 days? + +The 7 day period is a reasonable time frame to allow participants to organize a response, potentially even organizing a hard fork on Layer 1 to address severe issues. In the context of the OP Stack, this challenge period also serves as a safeguard for app-level bridges and custom rollup designs that may be built on top of the core protocol. + +### Withdrawal Delays vs. Finality + +One common misconception is confusing withdrawal delays with transaction finality: + +* Transaction finality occurs in approximately 20 minutes +* Withdrawal delays (often 7 days) are separate from transaction finality +* Withdrawal delays are application-level security features +* These delays affect only L1 withdrawals, not L2 transaction finality + +## Conclusion + +Transaction finality on the OP Stack depends heavily on Ethereum's consensus mechanism. The OP Stack ensures that rollups inherit Ethereum's finality guarantees, while the proof system adds an additional layer of validation for app-level functionality. While finality occurs quickly for rollup blocks, the proof system introduces a delay for withdrawals to ensure the security of bridging mechanisms. From d1003e68e0657889a0e5c08874f5418d18ff4526 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Wed, 23 Oct 2024 17:30:04 +0100 Subject: [PATCH 243/565] updated the tones --- pages/stack/protocol/rollup/finality.mdx | 135 +++++++++++------------ words.txt | 5 +- 2 files changed, 69 insertions(+), 71 deletions(-) diff --git a/pages/stack/protocol/rollup/finality.mdx b/pages/stack/protocol/rollup/finality.mdx index b4ef46306..6cc087542 100644 --- a/pages/stack/protocol/rollup/finality.mdx +++ b/pages/stack/protocol/rollup/finality.mdx @@ -7,132 +7,131 @@ description: Learn about finality in OP Stack and the steps to achieve transacti import Image from 'next/image' import { Callout } from 'nextra/components' -# OP Stack rollups +# OP Stack Rollups -OP Stack rollup is an extension of the consensus mechanism in Ethereum, where instead of running an entirely separate consensus protocol, we piggyback off Ethereum's consensus. This way, OP Stack rollup can take advantage of Ethereum's ordering mechanism and finalize its own blocks without needing to create a new consensus layer. +The **OP Stack** rollup is an extension of Ethereum's consensus mechanism. Instead of running an entirely separate consensus protocol, the OP Stack rollup leverages Ethereum's consensus. This enables the rollup to take advantage of Ethereum's transaction ordering mechanism and finalize its own blocks without requiring a new consensus layer. ## State Machines and Transaction Processing -State machines, such as the EVM, rely on input lists (transactions) to evolve from one state to another. The list and its order are vital because incorrect ordering can lead to an invalid state. +State machines, such as the Ethereum Virtual Machine (EVM), rely on input lists (transactions) to evolve from one state to another. The order of the transactions is critical because incorrect ordering can lead to an invalid state. -For example, if a user tries to send 1 ETH to two different parties at the same time, only one transaction can be valid. The order determines which transaction succeeds, making ordering an essential aspect of consensus. +For example, if a user attempts to send 1 ETH to two different parties at the same time, only one transaction can be valid. The order determines which transaction succeeds, making transaction ordering an essential aspect of consensus. -## Commutative vs non-Commutative operations +## Commutative vs. Non-Commutative Operations -Commutative operations allow input order to change without affecting the outcome. However, non-commutative operations (like sending funds) require strict ordering. Hence, the list's availability and ordering are fundamental to ensuring the integrity of the system. +Commutative operations allow the order of inputs to change without affecting the outcome. However, non-commutative operations (like sending funds) require strict ordering. Therefore, both the availability and the order of the transaction list are fundamental to ensuring the system's integrity. ## Consensus and Ordering -Consensus determines the valid chain or list of transactions. In OP Stack, Ethereum's consensus (via Proof of Stake) is used to achieve transaction ordering and finality. +Consensus determines the valid chain or list of transactions. In the OP Stack, Ethereum's Proof of Stake (PoS) consensus mechanism is used to achieve transaction ordering and finality. -## Why piggybacking on Ethereum? +## Why Use Ethereum's Consensus? -By publishing rollup blocks on Ethereum, OP Stack effectively outsource it's consensus mechanism. Instead of running a separate consensus protocol, they rely on Ethereum's ordering and finality guarantees. +By publishing rollup blocks on Ethereum, the OP Stack effectively outsources its consensus mechanism. Instead of creating a separate consensus protocol, the OP Stack relies on Ethereum's ordering and finality guarantees. -Key benefits of this approach include: +### Key benefits of this approach: -* OP Stack inherits Ethereum's security and ordering properties. -* The OP Stack simplifies the design and development process by removing the need for a separate consensus protocol. -* Attack vectors such as double-spends are mitigated by Ethereum's inherent mechanisms. +* OP Stack inherits Ethereum's security and transaction ordering properties. +* It simplifies the design and development process by eliminating the need for a separate consensus protocol. +* Attack vectors, such as double-spends, are mitigated by Ethereum's security mechanisms. -### Transaction finality states +## Transaction Finality States -In OP Stack, transaction finality involves three main stages: +In the OP Stack, transaction finality progresses through three key stages: -* Unsafe: The L2 sequencer creates a block containing the transaction, but the transaction data has not been posted to L1. It is circulated within the L2 network for speed. +1. **Unsafe:** The L2 sequencer creates a block containing the transaction, but the transaction data has not yet been posted to Ethereum (L1). The block is circulated within the L2 network for speed. -* Safe: The sequencer's batcher has posted transaction data to L1. Any L2 node can now derive this transaction. +2. **Safe:** The sequencer's batcher posts the transaction data to L1. At this point, any L2 node can derive the transaction. -* Finalized: Transactions are finalized once more than 65 L1 blocks have passed (approximately 20 minutes), ensuring the L1 data is secure and won't be reorganized. +3. **Finalized:** Transactions are finalized once more than 65 Ethereum blocks (approximately 20 minutes) have passed, ensuring that the L1 data is secure and cannot be reorganized. Transaction Finality Diagram. ## Sequencer Operations -The sequencer (block producer) handles transaction processing through the following steps: +The **sequencer** (block producer) processes transactions in the following steps: -1. Pre-publishing Distribution: - * Sequencer receives transactions from users - * Creates blocks containing these transactions - * Distributes blocks to network nodes before L1 publication - * Nodes mark these blocks as "unsafe" +1. **Pre-publishing Distribution:** + * The sequencer receives transactions from users. + * It creates blocks containing these transactions. + * It distributes these blocks to network nodes before L1 publication. + * Nodes mark these blocks as "unsafe." -2. L1 Publication: - * Sequencer publishes blocks to Ethereum - * Blocks become "safe" once included in L1 - * Blocks achieve "finalized" status after L1 finalization (approximately 20 minutes) +2. **L1 Publication:** + * The sequencer publishes the blocks to Ethereum (L1). + * Once included in L1, the blocks are marked as "safe." + * Blocks achieve "finalized" status after L1 finalization (approximately 20 minutes). -### Sequencer Trust +### Sequencer Trust Assumptions -The sequencer's role involves certain trust assumptions: +The sequencer operates with the following trust assumptions: -* Can temporarily withhold transactions. -* May attempt to reorder transactions before L1 publication. -* Cannot modify or censor transactions once published to L1. -* Cannot affect finalized transactions. +* It can temporarily withhold transactions. +* It may attempt to reorder transactions before L1 publication. +* Once transactions are published on L1, the sequencer cannot modify or censor them. +* The sequencer cannot affect finalized transactions. -## Block and transaction validity in the OP Stack +## Block and Transaction Validity in the OP Stack -When a block is submitted to Ethereum, it is either valid or invalid. If the block is valid, the state is updated; otherwise, it is discarded. Nodes execute valid blocks and update the rollup state accordingly. +When a block is submitted to Ethereum, it is either valid or invalid. If the block is valid, the state is updated accordingly. If it is invalid, the block is discarded. Nodes execute valid blocks and update the rollup state as required. -### Reorgs and finality +### Reorgs and Finality -A block's inclusion in a finalized Ethereum block ensures its finality. If a rollup block is included in a finalized Ethereum block, it cannot be reorged. Therefore, rollup blocks enjoy the same finality guarantees as Ethereum blocks, and this finality is handled by the **OP Stack** architecture. +Once a rollup block is included in a finalized Ethereum block, it cannot be reorganized. Therefore, rollup blocks enjoy the same finality guarantees as Ethereum blocks, and this finality is managed by the OP Stack architecture. -### Reorg Handling +### Handling Reorgs -When L1 reorgs occur: +If an Ethereum reorganization (reorg) occurs: -1. Nodes detect the L1 reorg -2. Affected L2 blocks return to "unsafe" status -3. Sequencer typically republishes the same transactions -4. System returns to a consistent state after reprocessing +1. L2 nodes detect the L1 reorg. +2. Affected L2 blocks revert to an "unsafe" status. +3. The sequencer typically republishes the same transactions. +4. The system returns to a consistent state after reprocessing. -## The role of the proof system +## The Role of the Proof System -The proof system, is entirely separate from the core OP Stack protocol. It is an app-level validation system designed to ensure that certain claims about the rollup's state are correct. +The proof system is entirely separate from the core OP Stack protocol. It is an application-level validation system designed to ensure the accuracy of certain claims about the rollup's state. -### What is a claim? +### What Is a Claim? -A claim in the context of rollups built on the OP Stack is a statement that asserts the state of the system at a specific block height. For example, a claim might assert that at block 1,000,000, the state hash is `XYZ`. Other participants can challenge this claim if they believe it to be incorrect. +A claim in the context of OP Stack rollups is a statement asserting the state of the system at a specific block height. For instance, a claim might assert that at block 1,000,000, the state hash is `XYZ`. If other participants believe this claim to be incorrect, they can challenge it. -### Fault proofs and challenges +### Fault Proofs and Challenges -Challenges revolve around proving whether a given claim is valid. However, the outcome of a challenge does not affect the underlying chain. For example, if a claim about the state of the rollup at a certain block is proven wrong, it only affects the app-level functionality, not the OP Stack protocol. +Challenges focus on proving whether a given claim is valid. The outcome of a challenge does not impact the underlying chain. For example, if a claim about the rollup's state at a specific block is proven wrong, it only affects the app-level functionality and does not alter the OP Stack protocol. ### Bridge Independence -Important points about bridge systems: +Key aspects of bridge systems include: -* Bridges are application-level constructs -* They operate independently of the core rollup protocol -* Bridge security doesn't affect L2 transaction validity -* Bridge failures don't cause L2 reorgs or state changes +* Bridges are application-level constructs. +* They operate independently from the core rollup protocol. +* Bridge security does not affect the validity of L2 transactions. +* Bridge failures do not cause L2 reorgs or state changes. -### Example: Custom bridges in OP Stack +### Example: Custom Bridges in OP Stack -A custom bridge might be developed by a user to allow ERC-20 tokens to move between layers. -However, this bridge is app-level and not native to the OP Stack rollup. If there's an issue with the bridge, such as incorrect proof validation, it doesn't affect the rollup itself but impacts the subjective value of the bridged assets. +A custom bridge might be developed by a user to allow ERC-20 tokens to move between layers. However, this bridge is application-level and not native to the OP Stack rollup. If there is an issue with the bridge, such as incorrect proof validation, it does not impact the rollup itself but affects the subjective value of the bridged assets. ## 7-Day Challenge Period in OP Stack -The 7-day challenge period exists to give time for challenges to be raised and resolved. -While the rollup chain itself finalizes quickly (within 20 minutes), withdrawals from Layer 2 are delayed to allow for fault-proof validation. -This ensures that malicious activity can be detected and challenged before it affects the system. +The 7-day challenge period provides time for challenges to be raised and resolved. +Although the rollup chain finalizes transactions quickly (within 20 minutes), withdrawals from L2 are delayed to allow for fault-proof validation. +This delay ensures that any malicious activity can be detected and addressed before it impacts the system. -### Why 7 days? +### Why Seven Days? -The 7 day period is a reasonable time frame to allow participants to organize a response, potentially even organizing a hard fork on Layer 1 to address severe issues. In the context of the OP Stack, this challenge period also serves as a safeguard for app-level bridges and custom rollup designs that may be built on top of the core protocol. +The 7-day challenge period is a reasonable time frame that allows participants to organize a response, potentially even initiating a L1 hard fork to address critical issues. In the OP Stack, this challenge period also serves as a safeguard for app-level bridges and custom rollup designs that may be built on top of the core protocol. ### Withdrawal Delays vs. Finality One common misconception is confusing withdrawal delays with transaction finality: -* Transaction finality occurs in approximately 20 minutes -* Withdrawal delays (often 7 days) are separate from transaction finality -* Withdrawal delays are application-level security features -* These delays affect only L1 withdrawals, not L2 transaction finality +* Transaction finality occurs in approximately 20 minutes. +* Withdrawal delays (often 7 days) are separate from transaction finality. +* Withdrawal delays are application-level security features. +* These delays affect only L1 withdrawals, not L2 transaction finality. ## Conclusion -Transaction finality on the OP Stack depends heavily on Ethereum's consensus mechanism. The OP Stack ensures that rollups inherit Ethereum's finality guarantees, while the proof system adds an additional layer of validation for app-level functionality. While finality occurs quickly for rollup blocks, the proof system introduces a delay for withdrawals to ensure the security of bridging mechanisms. +Transaction finality in the OP Stack relies on Ethereum's consensus mechanism. The OP Stack ensures that rollups inherit Ethereum's finality guarantees, while the proof system adds an additional layer of validation for app-level functionality. While rollup blocks finalize quickly, the proof system introduces a delay for withdrawals to ensure the security of bridging mechanisms. diff --git a/words.txt b/words.txt index 93c865012..b86d09017 100644 --- a/words.txt +++ b/words.txt @@ -16,6 +16,7 @@ Arweave authrpc Badgeholder's Badgeholders +badgeholders basefee BGEZ BGTZ @@ -169,7 +170,6 @@ leveldb lightkdf logfile logfmt -marketshare MAXAGE maxage MAXBACKUPS @@ -204,7 +204,6 @@ MTHI MTLO MULT multiaddr -Multichain multichain multiclient multisigs @@ -303,7 +302,7 @@ replayability reproven REQUIREDBLOCKS requiredblocks -Rollouts +rollouts Rollups rollups Routescan From 5d503820b49f59bf718df498afc619291236d07d Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Wed, 23 Oct 2024 17:36:28 +0100 Subject: [PATCH 244/565] updated some concepts --- pages/stack/protocol/rollup/finality.mdx | 27 ++++++++++++------------ 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/pages/stack/protocol/rollup/finality.mdx b/pages/stack/protocol/rollup/finality.mdx index 6cc087542..fbbe50540 100644 --- a/pages/stack/protocol/rollup/finality.mdx +++ b/pages/stack/protocol/rollup/finality.mdx @@ -7,9 +7,10 @@ description: Learn about finality in OP Stack and the steps to achieve transacti import Image from 'next/image' import { Callout } from 'nextra/components' -# OP Stack Rollups +# The OP Stack consensus mechanism -The **OP Stack** rollup is an extension of Ethereum's consensus mechanism. Instead of running an entirely separate consensus protocol, the OP Stack rollup leverages Ethereum's consensus. This enables the rollup to take advantage of Ethereum's transaction ordering mechanism and finalize its own blocks without requiring a new consensus layer. +The OP Stack is an extension of Ethereum's consensus mechanism. Instead of running an entirely separate consensus protocol, the OP Stack leverages Ethereum's consensus. +This enables it to take advantage of Ethereum's transaction ordering mechanism and finalize its own blocks without requiring a new consensus layer. ## State Machines and Transaction Processing @@ -27,7 +28,7 @@ Consensus determines the valid chain or list of transactions. In the OP Stack, E ## Why Use Ethereum's Consensus? -By publishing rollup blocks on Ethereum, the OP Stack effectively outsources its consensus mechanism. Instead of creating a separate consensus protocol, the OP Stack relies on Ethereum's ordering and finality guarantees. +By publishing blocks on Ethereum, the OP Stack effectively outsources its consensus mechanism. Instead of creating a separate consensus protocol, the OP Stack relies on Ethereum's ordering and finality guarantees. ### Key benefits of this approach: @@ -73,11 +74,11 @@ The sequencer operates with the following trust assumptions: ## Block and Transaction Validity in the OP Stack -When a block is submitted to Ethereum, it is either valid or invalid. If the block is valid, the state is updated accordingly. If it is invalid, the block is discarded. Nodes execute valid blocks and update the rollup state as required. +When a block is submitted to Ethereum, it is either valid or invalid. If the block is valid, the state is updated accordingly. If it is invalid, the block is discarded. Nodes execute valid blocks and update the state as required. ### Reorgs and Finality -Once a rollup block is included in a finalized Ethereum block, it cannot be reorganized. Therefore, rollup blocks enjoy the same finality guarantees as Ethereum blocks, and this finality is managed by the OP Stack architecture. +Once a block is included in a finalized Ethereum block, it cannot be reorganized. Therefore, blocks enjoy the same finality guarantees as Ethereum blocks, and this finality is managed by the OP Stack architecture. ### Handling Reorgs @@ -90,38 +91,38 @@ If an Ethereum reorganization (reorg) occurs: ## The Role of the Proof System -The proof system is entirely separate from the core OP Stack protocol. It is an application-level validation system designed to ensure the accuracy of certain claims about the rollup's state. +The proof system is entirely separate from the core OP Stack protocol. It is an application-level validation system designed to ensure the accuracy of certain claims about the transaction state. ### What Is a Claim? -A claim in the context of OP Stack rollups is a statement asserting the state of the system at a specific block height. For instance, a claim might assert that at block 1,000,000, the state hash is `XYZ`. If other participants believe this claim to be incorrect, they can challenge it. +A claim in the context of OP Stack is a statement asserting the state of the system at a specific block height. For instance, a claim might assert that at block 1,000,000, the state hash is `XYZ`. If other participants believe this claim to be incorrect, they can challenge it. ### Fault Proofs and Challenges -Challenges focus on proving whether a given claim is valid. The outcome of a challenge does not impact the underlying chain. For example, if a claim about the rollup's state at a specific block is proven wrong, it only affects the app-level functionality and does not alter the OP Stack protocol. +Challenges focus on proving whether a given claim is valid. The outcome of a challenge does not impact the underlying chain. For example, if a claim about the transaction state at a specific block is proven wrong, it only affects the app-level functionality and does not alter the OP Stack protocol. ### Bridge Independence Key aspects of bridge systems include: * Bridges are application-level constructs. -* They operate independently from the core rollup protocol. +* They operate independently from the core OP Stack protocol. * Bridge security does not affect the validity of L2 transactions. * Bridge failures do not cause L2 reorgs or state changes. ### Example: Custom Bridges in OP Stack -A custom bridge might be developed by a user to allow ERC-20 tokens to move between layers. However, this bridge is application-level and not native to the OP Stack rollup. If there is an issue with the bridge, such as incorrect proof validation, it does not impact the rollup itself but affects the subjective value of the bridged assets. +A custom bridge might be developed by a user to allow ERC-20 tokens to move between layers. However, this bridge is application-level and not native to the OP Stack. If there is an issue with the bridge, such as incorrect proof validation, it does not impact the protocol itself but affects the subjective value of the bridged assets. ## 7-Day Challenge Period in OP Stack The 7-day challenge period provides time for challenges to be raised and resolved. -Although the rollup chain finalizes transactions quickly (within 20 minutes), withdrawals from L2 are delayed to allow for fault-proof validation. +Although OP Stack finalizes transactions quickly (within 20 minutes), withdrawals from L2 are delayed to allow for fault-proof validation. This delay ensures that any malicious activity can be detected and addressed before it impacts the system. ### Why Seven Days? -The 7-day challenge period is a reasonable time frame that allows participants to organize a response, potentially even initiating a L1 hard fork to address critical issues. In the OP Stack, this challenge period also serves as a safeguard for app-level bridges and custom rollup designs that may be built on top of the core protocol. +The 7-day challenge period is a reasonable time frame that allows participants to organize a response, potentially even initiating a L1 hard fork to address critical issues. In the OP Stack, this challenge period also serves as a safeguard for app-level bridges and custom designs that may be built on top of the core protocol. ### Withdrawal Delays vs. Finality @@ -134,4 +135,4 @@ One common misconception is confusing withdrawal delays with transaction finalit ## Conclusion -Transaction finality in the OP Stack relies on Ethereum's consensus mechanism. The OP Stack ensures that rollups inherit Ethereum's finality guarantees, while the proof system adds an additional layer of validation for app-level functionality. While rollup blocks finalize quickly, the proof system introduces a delay for withdrawals to ensure the security of bridging mechanisms. +Transaction finality in the OP Stack relies on Ethereum's consensus mechanism. The OP Stack inherit Ethereum's finality guarantees, while the proof system adds an additional layer of validation for app-level functionality. While blocks finalize quickly, the proof system introduces a delay for withdrawals to ensure the security of bridging mechanisms. From 96d6722ee2dcdd423379ee69fb9f603607e43210 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Wed, 23 Oct 2024 17:49:16 +0100 Subject: [PATCH 245/565] removed duplications --- pages/stack/protocol/rollup/_meta.json | 8 -- pages/stack/transactions/finality.mdx | 135 ------------------ .../transaction-finality.mdx} | 36 ++--- 3 files changed, 19 insertions(+), 160 deletions(-) delete mode 100644 pages/stack/protocol/rollup/_meta.json delete mode 100644 pages/stack/transactions/finality.mdx rename pages/stack/{protocol/rollup/finality.mdx => transactions/transaction-finality.mdx} (94%) diff --git a/pages/stack/protocol/rollup/_meta.json b/pages/stack/protocol/rollup/_meta.json deleted file mode 100644 index c2aaa784f..000000000 --- a/pages/stack/protocol/rollup/_meta.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "overview": "Rollup Overview", - "deposit-flow": "Deposit Flow", - "transaction-flow": "Transaction Flow", - "withdrawal-flow": "Withdrawal Flow", - "transaction-finality": "Transaction Finality ", - "forced-transaction": "Forced Transaction" -} \ No newline at end of file diff --git a/pages/stack/transactions/finality.mdx b/pages/stack/transactions/finality.mdx deleted file mode 100644 index 4f4a4ebf1..000000000 --- a/pages/stack/transactions/finality.mdx +++ /dev/null @@ -1,135 +0,0 @@ ---- -title: Transaction Finality -lang: en-US -description: Learn about finality in OP Stack and the steps to achieve transaction settlement. ---- - -import Image from 'next/image' -import { Callout } from 'nextra/components' - -# OP Stack rollups - -OP Stack rollup is an extension of the consensus mechanism in Ethereum, where instead of running an entirely separate consensus protocol, we piggyback off Ethereum's consensus. This way, OP Stack rollup can take advantage of Ethereum's ordering mechanism and finalize its own blocks without needing to create a new consensus layer. - -## State Machines and Transaction Processing - -State machines, such as the EVM, rely on input lists (transactions) to evolve from one state to another. The list and its order are vital because incorrect ordering can lead to an invalid state. - -For example, if a user tries to send 1 ETH to two different parties at the same time, only one transaction can be valid. The order determines which transaction succeeds, making ordering an essential aspect of consensus. - -## Commutative vs non-Commutative operations - -Commutative operations allow input order to change without affecting the outcome. However, non-commutative operations (like sending funds) require strict ordering. Hence, the list's availability and ordering are fundamental to ensuring the integrity of the system. - -## Consensus and Ordering - -Consensus determines the valid chain or list of transactions. In OP Stack, Ethereum's consensus (via Proof of Stake) is used to achieve transaction ordering and finality. - -## Why piggybacking on Ethereum? - -By publishing rollup blocks on Ethereum, OP Stack effectively outsource it's consensus mechanism. Instead of running a separate consensus protocol, they rely on Ethereum's ordering and finality guarantees. - -Key benefits of this approach include: - -* OP Stack inherit Ethereum's security and ordering properties. -* The OP Stack simplifies the design and development process by removing the need for a separate consensus protocol. -* Attack vectors such as double-spends are mitigated by Ethereum's inherent mechanisms. - -### Transaction finality states - -In OP Stack, transaction finality involves three main stages: - -* Unsafe: The L2 sequencer creates a block containing the transaction, but the transaction data will not been posted to L1. It is circulated within the L2 network for speed. - -* Safe: The sequencer's batcher posts transaction data to L1. Any L2 node can now derive this transaction. - -* Finalized: Transactions is finalized once more than (>65) L1 blocks have passed(approximately 20 minutes), ensuring the L1 data is secure and won't be reorganized. - -Transaction Finality Diagram. - -## Sequencer Operations - -The sequencer (block producer) handles transaction processing through the following steps: - -1. Pre-publishing Distribution: - * Sequencer receives transactions from users - * Creates blocks containing these transactions - * Distributes blocks to network nodes before L1 publication - * Nodes mark these blocks as "unsafe" - -2. L1 Publication: - * Sequencer publishes blocks to Ethereum - * Blocks become "safe" once included in L1 - * Blocks achieve "finalized" status after L1 finalization (approximately 20 minutes) - -### Sequencer Trust - -The sequencer's role involves certain trust assumptions: - -* Can temporarily withhold transactions. -* May attempt to reorder transactions before L1 publication. -* Cannot modify or censor transactions once published to L1. -* Cannot affect finalized transactions. - -## Block and transaction validity in the OP Stack - -When a block is submitted to Ethereum, it is either valid or invalid. If the block is valid, the state is updated; otherwise, it is discarded. Nodes execute valid blocks and update the rollup state accordingly. - -### Reorgs and finality - -A block's inclusion in a finalized Ethereum block ensures its finality. If a rollup block is included in a finalized Ethereum block, it cannot be reorged. Therefore, rollup blocks enjoy the same finality guarantees as Ethereum blocks, and this finality is handled by the **OP Stack** architecture. - -### Reorg Handling - -When L1 reorgs occur: - -1. Nodes detect the L1 reorg -2. Affected L2 blocks return to "unsafe" status -3. Sequencer typically republishes the same transactions -4. System returns to consistent state after reprocessing - -## The role of the proof system - -The proof system, is entirely separate from the core OP Stack protocol. It is an app-level validation system designed to ensure that certain claims about the rollup's state are correct. - -### What is a claim? - -A claim in the context of rollups built on the OP Stack is a statement that asserts the state of the system at a specific block height. For example, a claim might assert that at block 1,000,000, the state hash is `XYZ`. Other participants can challenge this claim if they believe it to be incorrect. - -### Fault proofs and challenges - -Challenges revolve around proving whether a given claim is valid. However, the outcome of a challenge does not affect the underlying chain. For example, if a claim about the state of the rollup at a certain block is proven wrong, it only affects the app-level functionality, not the OP Stack protocol. - -### Bridge Independence - -Important points about bridge systems: - -* Bridges are application-level constructs -* They operate independently of the core rollup protocol -* Bridge security doesn't affect L2 transaction validity -* Bridge failures don't cause L2 reorgs or state changes - -### Example: Custom bridges in OP Stack - -A custom bridge might be developed by a user to allow ERC-20 tokens to move between layers. However, this bridge is app-level and not native to the OP Stack rollup. If there's an issue with the bridge, such as incorrect proof validation, it doesn't affect the rollup itself but impacts the subjective value of the bridged assets. - -## 7 days challenge period in OP Stack - -The 7 days challenge period exists to give time for challenges to be raised and resolved. While the rollup chain itself finalizes quickly (within 20 minutes), withdrawals from Layer 2 are delayed to allow for fault-proof validation. This ensures that malicious activity can be detected and challenged before it affects the system. - -### Why 7 days? - -The 7 day period is a reasonable time frame to allow participants to organize a response, potentially even organizing a hard fork on Layer 1 to address severe issues. In the context of the OP Stack, this challenge period also serves as a safeguard for app-level bridges and custom rollup designs that may be built on top of the core protocol. - -### Withdrawal Delays vs. Finality - -One common misconception is confusing withdrawal delays with transaction finality: - -* Transaction finality occurs in approximately 20 minutes -* Withdrawal delays (often 7 days) are separate from transaction finality -* Withdrawal delays are application-level security features -* These delays affect only L1 withdrawals, not L2 transaction finality - -## Conclusion - -Transaction finality on the OP Stack depends heavily on Ethereum's consensus mechanism. The OP Stack ensures that rollups inherit Ethereum's finality guarantees, while the proof system adds an additional layer of validation for app-level functionality. While finality occurs quickly for rollup blocks, the proof system introduces a delay for withdrawals to ensure the security of bridging mechanisms. diff --git a/pages/stack/protocol/rollup/finality.mdx b/pages/stack/transactions/transaction-finality.mdx similarity index 94% rename from pages/stack/protocol/rollup/finality.mdx rename to pages/stack/transactions/transaction-finality.mdx index fbbe50540..5c124d351 100644 --- a/pages/stack/protocol/rollup/finality.mdx +++ b/pages/stack/transactions/transaction-finality.mdx @@ -7,9 +7,11 @@ description: Learn about finality in OP Stack and the steps to achieve transacti import Image from 'next/image' import { Callout } from 'nextra/components' -# The OP Stack consensus mechanism +# Overview -The OP Stack is an extension of Ethereum's consensus mechanism. Instead of running an entirely separate consensus protocol, the OP Stack leverages Ethereum's consensus. +This guide explains how transaction finality works in OP Stack, covering the fundamental concepts of Fault Proofs and Challenges. + +OP Stack is an extension of Ethereum's consensus mechanism. Instead of running an entirely separate consensus protocol, the OP Stack leverages Ethereum's consensus. This enables it to take advantage of Ethereum's transaction ordering mechanism and finalize its own blocks without requiring a new consensus layer. ## State Machines and Transaction Processing @@ -36,29 +38,17 @@ By publishing blocks on Ethereum, the OP Stack effectively outsources its consen * It simplifies the design and development process by eliminating the need for a separate consensus protocol. * Attack vectors, such as double-spends, are mitigated by Ethereum's security mechanisms. -## Transaction Finality States - -In the OP Stack, transaction finality progresses through three key stages: - -1. **Unsafe:** The L2 sequencer creates a block containing the transaction, but the transaction data has not yet been posted to Ethereum (L1). The block is circulated within the L2 network for speed. - -2. **Safe:** The sequencer's batcher posts the transaction data to L1. At this point, any L2 node can derive the transaction. - -3. **Finalized:** Transactions are finalized once more than 65 Ethereum blocks (approximately 20 minutes) have passed, ensuring that the L1 data is secure and cannot be reorganized. - -Transaction Finality Diagram. - ## Sequencer Operations -The **sequencer** (block producer) processes transactions in the following steps: +The sequencer (block producer) processes transactions in the following steps: -1. **Pre-publishing Distribution:** +1. Pre-publishing Distribution: * The sequencer receives transactions from users. * It creates blocks containing these transactions. * It distributes these blocks to network nodes before L1 publication. * Nodes mark these blocks as "unsafe." -2. **L1 Publication:** +2. L1 Publication: * The sequencer publishes the blocks to Ethereum (L1). * Once included in L1, the blocks are marked as "safe." * Blocks achieve "finalized" status after L1 finalization (approximately 20 minutes). @@ -72,6 +62,18 @@ The sequencer operates with the following trust assumptions: * Once transactions are published on L1, the sequencer cannot modify or censor them. * The sequencer cannot affect finalized transactions. +## Transaction Finality States + +In the OP Stack, transaction finality progresses through three key stages: + +1. **Unsafe:** The L2 sequencer creates a block containing the transaction, but the transaction data has not yet been posted to Ethereum (L1). The block is circulated within the L2 network for speed. + +2. **Safe:** The sequencer's batcher posts the transaction data to L1. At this point, any L2 node can derive the transaction. + +3. **Finalized:** Transactions are finalized once more than 65 Ethereum blocks (approximately 20 minutes) have passed, ensuring that the L1 data is secure and cannot be reorganized. + +Transaction Finality Diagram. + ## Block and Transaction Validity in the OP Stack When a block is submitted to Ethereum, it is either valid or invalid. If the block is valid, the state is updated accordingly. If it is invalid, the block is discarded. Nodes execute valid blocks and update the state as required. From 565bc82917db402203b4a5bef0f556041ab2b7e3 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Wed, 23 Oct 2024 17:55:33 +0100 Subject: [PATCH 246/565] Updated structure --- .../transactions/transaction-finality.mdx | 30 +++++++++---------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/pages/stack/transactions/transaction-finality.mdx b/pages/stack/transactions/transaction-finality.mdx index 5c124d351..5af9272eb 100644 --- a/pages/stack/transactions/transaction-finality.mdx +++ b/pages/stack/transactions/transaction-finality.mdx @@ -14,21 +14,21 @@ This guide explains how transaction finality works in OP Stack, covering the fun OP Stack is an extension of Ethereum's consensus mechanism. Instead of running an entirely separate consensus protocol, the OP Stack leverages Ethereum's consensus. This enables it to take advantage of Ethereum's transaction ordering mechanism and finalize its own blocks without requiring a new consensus layer. -## State Machines and Transaction Processing +## Transaction Processing State machines, such as the Ethereum Virtual Machine (EVM), rely on input lists (transactions) to evolve from one state to another. The order of the transactions is critical because incorrect ordering can lead to an invalid state. For example, if a user attempts to send 1 ETH to two different parties at the same time, only one transaction can be valid. The order determines which transaction succeeds, making transaction ordering an essential aspect of consensus. -## Commutative vs. Non-Commutative Operations +### Commutative vs. Non-Commutative Operations Commutative operations allow the order of inputs to change without affecting the outcome. However, non-commutative operations (like sending funds) require strict ordering. Therefore, both the availability and the order of the transaction list are fundamental to ensuring the system's integrity. -## Consensus and Ordering +### Consensus and Ordering Consensus determines the valid chain or list of transactions. In the OP Stack, Ethereum's Proof of Stake (PoS) consensus mechanism is used to achieve transaction ordering and finality. -## Why Use Ethereum's Consensus? +### Why Use Ethereum's Consensus? By publishing blocks on Ethereum, the OP Stack effectively outsources its consensus mechanism. Instead of creating a separate consensus protocol, the OP Stack relies on Ethereum's ordering and finality guarantees. @@ -74,7 +74,7 @@ In the OP Stack, transaction finality progresses through three key stages: Transaction Finality Diagram. -## Block and Transaction Validity in the OP Stack +### Transaction Validity When a block is submitted to Ethereum, it is either valid or invalid. If the block is valid, the state is updated accordingly. If it is invalid, the block is discarded. Nodes execute valid blocks and update the state as required. @@ -103,6 +103,16 @@ A claim in the context of OP Stack is a statement asserting the state of the sys Challenges focus on proving whether a given claim is valid. The outcome of a challenge does not impact the underlying chain. For example, if a claim about the transaction state at a specific block is proven wrong, it only affects the app-level functionality and does not alter the OP Stack protocol. +## 7-Day Challenge Period in OP Stack + +The 7-day challenge period provides time for challenges to be raised and resolved. +Although OP Stack finalizes transactions quickly (within 20 minutes), withdrawals from L2 are delayed to allow for fault-proof validation. +This delay ensures that any malicious activity can be detected and addressed before it impacts the system. + +### Why Seven Days? + +The 7-day challenge period is a reasonable time frame that allows participants to organize a response, potentially even initiating a L1 hard fork to address critical issues. In the OP Stack, this challenge period also serves as a safeguard for app-level bridges and custom designs that may be built on top of the core protocol. + ### Bridge Independence Key aspects of bridge systems include: @@ -116,16 +126,6 @@ Key aspects of bridge systems include: A custom bridge might be developed by a user to allow ERC-20 tokens to move between layers. However, this bridge is application-level and not native to the OP Stack. If there is an issue with the bridge, such as incorrect proof validation, it does not impact the protocol itself but affects the subjective value of the bridged assets. -## 7-Day Challenge Period in OP Stack - -The 7-day challenge period provides time for challenges to be raised and resolved. -Although OP Stack finalizes transactions quickly (within 20 minutes), withdrawals from L2 are delayed to allow for fault-proof validation. -This delay ensures that any malicious activity can be detected and addressed before it impacts the system. - -### Why Seven Days? - -The 7-day challenge period is a reasonable time frame that allows participants to organize a response, potentially even initiating a L1 hard fork to address critical issues. In the OP Stack, this challenge period also serves as a safeguard for app-level bridges and custom designs that may be built on top of the core protocol. - ### Withdrawal Delays vs. Finality One common misconception is confusing withdrawal delays with transaction finality: From 1a136d6c7809abfe26eadde888d245f29c9733a6 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Wed, 23 Oct 2024 17:58:12 +0100 Subject: [PATCH 247/565] resolved suggestions --- pages/stack/transactions/transaction-finality.mdx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pages/stack/transactions/transaction-finality.mdx b/pages/stack/transactions/transaction-finality.mdx index 5af9272eb..26d48d661 100644 --- a/pages/stack/transactions/transaction-finality.mdx +++ b/pages/stack/transactions/transaction-finality.mdx @@ -118,7 +118,7 @@ The 7-day challenge period is a reasonable time frame that allows participants t Key aspects of bridge systems include: * Bridges are application-level constructs. -* They operate independently from the core OP Stack protocol. +* They operate independently of the core OP Stack protocol. * Bridge security does not affect the validity of L2 transactions. * Bridge failures do not cause L2 reorgs or state changes. @@ -137,4 +137,4 @@ One common misconception is confusing withdrawal delays with transaction finalit ## Conclusion -Transaction finality in the OP Stack relies on Ethereum's consensus mechanism. The OP Stack inherit Ethereum's finality guarantees, while the proof system adds an additional layer of validation for app-level functionality. While blocks finalize quickly, the proof system introduces a delay for withdrawals to ensure the security of bridging mechanisms. +Transaction finality in the OP Stack relies on Ethereum's consensus mechanism. The OP Stack inherits Ethereum's finality guarantees, while the proof system adds a layer of validation for app-level functionality. \ No newline at end of file From 16f6052cdb91956e655516cf0e72ecdf9ed25627 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Wed, 23 Oct 2024 18:01:59 +0100 Subject: [PATCH 248/565] fix lint errors --- pages/stack/transactions/transaction-finality.mdx | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/pages/stack/transactions/transaction-finality.mdx b/pages/stack/transactions/transaction-finality.mdx index 26d48d661..6d3fb3787 100644 --- a/pages/stack/transactions/transaction-finality.mdx +++ b/pages/stack/transactions/transaction-finality.mdx @@ -11,7 +11,7 @@ import { Callout } from 'nextra/components' This guide explains how transaction finality works in OP Stack, covering the fundamental concepts of Fault Proofs and Challenges. -OP Stack is an extension of Ethereum's consensus mechanism. Instead of running an entirely separate consensus protocol, the OP Stack leverages Ethereum's consensus. +OP Stack is an extension of Ethereum's consensus mechanism. Instead of running an entirely separate consensus protocol, the OP Stack leverages Ethereum's consensus. This enables it to take advantage of Ethereum's transaction ordering mechanism and finalize its own blocks without requiring a new consensus layer. ## Transaction Processing @@ -105,9 +105,11 @@ Challenges focus on proving whether a given claim is valid. The outcome of a cha ## 7-Day Challenge Period in OP Stack -The 7-day challenge period provides time for challenges to be raised and resolved. -Although OP Stack finalizes transactions quickly (within 20 minutes), withdrawals from L2 are delayed to allow for fault-proof validation. -This delay ensures that any malicious activity can be detected and addressed before it impacts the system. +The 7-day challenge period provides time for challenges to be raised and resolved. +Although OP Stack finalizes transactions quickly (within 20 minutes), the 7-day challenge window serves two critical purposes: + +1. It allows time to validate and dispute the correctness of batches posted to Ethereum by the op-batcher, particularly important in scenarios like 51% attacks. +2. It provides a security period for withdrawal processing, ensuring the integrity of cross-chain operations. ### Why Seven Days? @@ -137,4 +139,4 @@ One common misconception is confusing withdrawal delays with transaction finalit ## Conclusion -Transaction finality in the OP Stack relies on Ethereum's consensus mechanism. The OP Stack inherits Ethereum's finality guarantees, while the proof system adds a layer of validation for app-level functionality. \ No newline at end of file +Transaction finality in the OP Stack relies on Ethereum's consensus mechanism. The OP Stack inherits Ethereum's finality guarantees, while the proof system adds a layer of validation for app-level functionality. From 077cb882b56345015e1e96fd90bb354c37a62593 Mon Sep 17 00:00:00 2001 From: Bradley Camacho <42678939+bradleycamacho@users.noreply.github.com> Date: Wed, 23 Oct 2024 15:18:14 -0700 Subject: [PATCH 249/565] Sentence case all nav files --- pages/_meta.json | 6 +++--- pages/builders/_meta.json | 8 ++++---- pages/builders/app-developers/_meta.json | 6 +++--- .../app-developers/bridging/_meta.json | 6 +++--- .../app-developers/contracts/_meta.json | 8 ++++---- .../builders/app-developers/tools/_meta.json | 2 +- .../app-developers/transactions/_meta.json | 8 ++++---- .../app-developers/tutorials/_meta.json | 20 +++++++++---------- .../builders/cex-wallet-developers/_meta.json | 4 ++-- pages/builders/chain-operators/_meta.json | 12 +++++------ .../chain-operators/configuration/_meta.json | 6 +++--- .../chain-operators/deploy/_meta.json | 4 ++-- .../chain-operators/features/_meta.json | 6 +++--- .../builders/chain-operators/hacks/_meta.json | 12 +++++------ .../chain-operators/management/_meta.json | 8 ++++---- .../builders/chain-operators/tools/_meta.json | 4 ++-- .../chain-operators/tutorials/_meta.json | 10 +++++----- pages/builders/node-operators/_meta.json | 8 ++++---- .../node-operators/configuration/_meta.json | 6 +++--- .../node-operators/management/_meta.json | 4 ++-- .../node-operators/tutorials/_meta.json | 8 ++++---- pages/builders/notices/_meta.json | 4 ++-- pages/builders/tools/_meta.json | 4 ++-- pages/builders/tools/build/_meta.json | 6 +++--- pages/builders/tools/connect/_meta.json | 4 ++-- pages/builders/tools/monitor/_meta.json | 2 +- pages/builders/tools/op-tools/_meta.json | 10 +++++----- pages/chain/_meta.json | 8 ++++---- pages/chain/identity/_meta.json | 2 +- pages/chain/security/_meta.json | 6 +++--- pages/chain/testing/_meta.json | 4 ++-- pages/connect/contribute/_meta.json | 4 ++-- pages/stack/_meta.json | 16 +++++++-------- pages/stack/beta-features/_meta.json | 2 +- pages/stack/fault-proofs/_meta.json | 6 +++--- pages/stack/interop/_meta.json | 6 +++--- pages/stack/rollup/_meta.json | 6 +++--- pages/stack/security/_meta.json | 2 +- pages/stack/transactions/_meta.json | 10 +++++----- 39 files changed, 129 insertions(+), 129 deletions(-) diff --git a/pages/_meta.json b/pages/_meta.json index 918298637..48d92b504 100644 --- a/pages/_meta.json +++ b/pages/_meta.json @@ -1,6 +1,6 @@ { "index": { - "title": "Getting Started", + "title": "Getting started", "display": "hidden", "theme": { "breadcrumb": false, @@ -38,13 +38,13 @@ }, "faucet": { - "title": "Superchain Faucet", + "title": "Superchain faucet", "type": "page", "href": "https://console.optimism.io/faucet?utm_source=docs", "newWindow": true }, "gas": { - "title": "Gas Tracker", + "title": "Gas tracker", "type": "page", "href": "https://optimistic.grafana.net/public-dashboards/c84a5a9924fe4e14b270a42a8651ceb8?orgId=1&refresh=5m", "newWindow": true diff --git a/pages/builders/_meta.json b/pages/builders/_meta.json index 06f702862..b197dad8d 100644 --- a/pages/builders/_meta.json +++ b/pages/builders/_meta.json @@ -1,8 +1,8 @@ { "notices": "Notices (README)", - "app-developers": "App Developers", - "chain-operators": "Chain Operators", - "node-operators": "Node Operators", + "app-developers": "App developers", + "chain-operators": "Chain operators", + "node-operators": "Node operators", "cex-wallet-developers": "Wallets & CEXs", - "tools": "Developer Tools" + "tools": "Developer tools" } diff --git a/pages/builders/app-developers/_meta.json b/pages/builders/app-developers/_meta.json index 692b45575..70c7d2145 100644 --- a/pages/builders/app-developers/_meta.json +++ b/pages/builders/app-developers/_meta.json @@ -1,9 +1,9 @@ { "overview": "Overview", - "quick-start": "Superchain App Quick Start", + "quick-start": "Superchain app quick start", "tutorials": "Tutorials", - "contracts": "Smart Contracts", + "contracts": "Smart contracts", "transactions": "Transactions", "bridging": "Bridging", - "tools": "App Tools" + "tools": "App tools" } diff --git a/pages/builders/app-developers/bridging/_meta.json b/pages/builders/app-developers/bridging/_meta.json index 3c3ce0437..c6c56f200 100644 --- a/pages/builders/app-developers/bridging/_meta.json +++ b/pages/builders/app-developers/bridging/_meta.json @@ -1,6 +1,6 @@ { - "basics": "Basics of Bridging", + "basics": "Basics of bridging", "standard-bridge": "The Standard Bridge", - "custom-bridge": "Custom Token Bridges", - "messaging": "Sending Data Between L1 and L2" + "custom-bridge": "Custom token bridges", + "messaging": "Sending data between L1 and L2" } diff --git a/pages/builders/app-developers/contracts/_meta.json b/pages/builders/app-developers/contracts/_meta.json index 50aa18684..535326a4c 100644 --- a/pages/builders/app-developers/contracts/_meta.json +++ b/pages/builders/app-developers/contracts/_meta.json @@ -1,6 +1,6 @@ { - "compatibility": "Solidity Compatibility", - "system-contracts": "System Contracts", - "optimization": "Cost Optimization", - "superchain-erc20": "SuperchainERC20 Token Standard" + "compatibility": "Solidity compatibility", + "system-contracts": "System contracts", + "optimization": "Cost optimization", + "superchain-erc20": "SuperchainERC20 token standard" } diff --git a/pages/builders/app-developers/tools/_meta.json b/pages/builders/app-developers/tools/_meta.json index 6eabf1a34..f751e54e9 100644 --- a/pages/builders/app-developers/tools/_meta.json +++ b/pages/builders/app-developers/tools/_meta.json @@ -1,5 +1,5 @@ { - "ecosystem-overview": "Open Source Code Repo", + "ecosystem-overview": "Open source code repo", "supersim": "Supersim Multichain Development Environment", "console": { "title": "Superchain Dev Console", diff --git a/pages/builders/app-developers/transactions/_meta.json b/pages/builders/app-developers/transactions/_meta.json index 5a89efbd7..916fc5e3d 100644 --- a/pages/builders/app-developers/transactions/_meta.json +++ b/pages/builders/app-developers/transactions/_meta.json @@ -1,7 +1,7 @@ { - "fees": "Transaction Fees", - "estimates": "Estimating Fees", - "parameters": "Setting Gas Parameters", - "statuses": "Transaction Statuses", + "fees": "Transaction fees", + "estimates": "Estimating fees", + "parameters": "Setting gas parameters", + "statuses": "Transaction statuses", "troubleshooting": "Troubleshooting" } diff --git a/pages/builders/app-developers/tutorials/_meta.json b/pages/builders/app-developers/tutorials/_meta.json index 0f6a0b800..660055ae0 100644 --- a/pages/builders/app-developers/tutorials/_meta.json +++ b/pages/builders/app-developers/tutorials/_meta.json @@ -1,12 +1,12 @@ { - "first-contract": "Deploying Your First Contract on OP Mainnet", - "cross-dom-solidity": "Communicating Between Chains in Solidity", - "cross-dom-bridge-eth": "Bridging ETH With the Optimism SDK", - "cross-dom-bridge-erc20": "Bridging ERC-20 Tokens With the Optimism SDK", - "standard-bridge-custom-token": "Bridging Your Custom ERC-20 Token to OP Mainnet", - "standard-bridge-standard-token": "Bridging Your Standard ERC-20 Token to OP Mainnet", - "sdk-view-txns": "Viewing Deposits and Withdrawals by Address", - "sdk-trace-txns": "Tracing Deposits and Withdrawals", - "sdk-estimate-costs": "Estimating Transaction Costs", - "send-tx-from-eth": "Triggering OP Mainnet Transactions From Ethereum" + "first-contract": "Deploying your first contract on OP Mainnet", + "cross-dom-solidity": "Communicating between chains in Solidity", + "cross-dom-bridge-eth": "Bridging ETH with the Optimism SDK", + "cross-dom-bridge-erc20": "Bridging ERC-20 tokens with the Optimism SDK", + "standard-bridge-custom-token": "Bridging your custom ERC-20 token to OP Mainnet", + "standard-bridge-standard-token": "Bridging your standard ERC-20 token to OP Mainnet", + "sdk-view-txns": "Viewing deposits and withdrawals by address", + "sdk-trace-txns": "Tracing deposits and withdrawals", + "sdk-estimate-costs": "Estimating transaction costs", + "send-tx-from-eth": "Triggering OP Mainnet transactions From Ethereum" } diff --git a/pages/builders/cex-wallet-developers/_meta.json b/pages/builders/cex-wallet-developers/_meta.json index 2034019cc..f24a468fc 100644 --- a/pages/builders/cex-wallet-developers/_meta.json +++ b/pages/builders/cex-wallet-developers/_meta.json @@ -1,4 +1,4 @@ { - "cex-support": "Guide for Exchanges", - "wallet-support": "Guide for Wallets" + "cex-support": "Guide for exchanges", + "wallet-support": "Guide for wallets" } diff --git a/pages/builders/chain-operators/_meta.json b/pages/builders/chain-operators/_meta.json index 3481fe628..e26e786c5 100644 --- a/pages/builders/chain-operators/_meta.json +++ b/pages/builders/chain-operators/_meta.json @@ -1,11 +1,11 @@ { "architecture": "Architecture", - "self-hosted": "Start a Self-Hosted Chain", - "configuration": "Chain Configuration", - "management": "Chain Management", - "features": "Chain Features", + "self-hosted": "Start a self-hosted chain", + "configuration": "Chain configuration", + "management": "Chain management", + "features": "Chain features", "deploy": "Deployment", "tutorials": "Tutorials", - "tools": "Chain Tools", - "hacks": "OP Stack Hacks" + "tools": "Chain tools", + "hacks": "OP Stack hacks" } diff --git a/pages/builders/chain-operators/configuration/_meta.json b/pages/builders/chain-operators/configuration/_meta.json index 90116f74a..cfa1aaf62 100644 --- a/pages/builders/chain-operators/configuration/_meta.json +++ b/pages/builders/chain-operators/configuration/_meta.json @@ -1,6 +1,6 @@ { "overview": "Overview", - "rollup": "Rollup Deployment Configuration", - "batcher": "Batcher Configuration", - "proposer": "Proposer Configuration" + "rollup": "Rollup deployment configuration", + "batcher": "Batcher configuration", + "proposer": "Proposer configuration" } \ No newline at end of file diff --git a/pages/builders/chain-operators/deploy/_meta.json b/pages/builders/chain-operators/deploy/_meta.json index 288270a75..1cf642283 100644 --- a/pages/builders/chain-operators/deploy/_meta.json +++ b/pages/builders/chain-operators/deploy/_meta.json @@ -1,6 +1,6 @@ { "overview": "Overview", - "smart-contracts": "Contract Deployment", - "genesis": "Genesis Creation" + "smart-contracts": "Contract deployment", + "genesis": "Genesis creation" } \ No newline at end of file diff --git a/pages/builders/chain-operators/features/_meta.json b/pages/builders/chain-operators/features/_meta.json index 5bb139e4b..4e76c33b5 100644 --- a/pages/builders/chain-operators/features/_meta.json +++ b/pages/builders/chain-operators/features/_meta.json @@ -1,7 +1,7 @@ { "preinstalls": "Preinstalls", - "alt-da-mode": "Run an Alt-DA Mode Chain", - "custom-gas-token": "Run a Custom Gas Token Chain", - "span-batches": "Use and Enable Span Batches on your Chain", + "alt-da-mode": "Run an Alt-DA Mode chain", + "custom-gas-token": "Run a custom gas token chain", + "span-batches": "Use and enable span batches on your chain", "bridged-usdc-standard": "Bridged USDC Standard for the OP Stack" } \ No newline at end of file diff --git a/pages/builders/chain-operators/hacks/_meta.json b/pages/builders/chain-operators/hacks/_meta.json index eb1022312..d4650c2da 100644 --- a/pages/builders/chain-operators/hacks/_meta.json +++ b/pages/builders/chain-operators/hacks/_meta.json @@ -1,8 +1,8 @@ { - "overview": "Intro to OP Stack Hacks", - "featured-hacks": "Featured Hacks", - "data-availability": "Data Availability Hacks", - "derivation": "Derivation Hacks", - "execution": "Execution Hacks", - "settlement": "Settlement Hacks" + "overview": "Intro to OP Stack hacks", + "featured-hacks": "Featured hacks", + "data-availability": "Data availability hacks", + "derivation": "Derivation hacks", + "execution": "Execution hacks", + "settlement": "Settlement hacks" } \ No newline at end of file diff --git a/pages/builders/chain-operators/management/_meta.json b/pages/builders/chain-operators/management/_meta.json index 1b54b76aa..a33e1fbfb 100644 --- a/pages/builders/chain-operators/management/_meta.json +++ b/pages/builders/chain-operators/management/_meta.json @@ -1,8 +1,8 @@ { - "blobs": "Using Blobs", + "blobs": "Using blobs", "snap-sync": "Using Snap Sync", - "operations": "Node Operations", - "key-management": "Key Management", + "operations": "Node operations", + "key-management": "Key management", "troubleshooting": "Troubleshooting", - "best-practices": "Best Practices" + "best-practices": "Best practices" } diff --git a/pages/builders/chain-operators/tools/_meta.json b/pages/builders/chain-operators/tools/_meta.json index 0779e410c..990ea87a2 100644 --- a/pages/builders/chain-operators/tools/_meta.json +++ b/pages/builders/chain-operators/tools/_meta.json @@ -1,6 +1,6 @@ { - "chain-monitoring": "Chain Monitoring", - "explorer": "Block Explorer", + "chain-monitoring": "Chain monitoring", + "explorer": "Block explorer", "op-challenger": "op-challenger", "op-conductor": "op-conductor", "op-deployer": "op-deployer", diff --git a/pages/builders/chain-operators/tutorials/_meta.json b/pages/builders/chain-operators/tutorials/_meta.json index 465ec6d7b..1df47a60d 100644 --- a/pages/builders/chain-operators/tutorials/_meta.json +++ b/pages/builders/chain-operators/tutorials/_meta.json @@ -1,8 +1,8 @@ { - "create-l2-rollup": "Creating Your Own L2 Rollup Testnet", + "create-l2-rollup": "Creating your own L2 Rollup Testnet", "sdk": "Using the Optimism SDK", - "adding-derivation-attributes": "Adding Attributes to the Derivation Function", - "adding-precompiles": "Adding a Precompile", - "modifying-predeploys": "Modifying Predeployed Contracts", - "integrating-da-layer": "Integrating a New DA Layer" + "adding-derivation-attributes": "Adding attributes to the derivation function", + "adding-precompiles": "Adding a precompile", + "modifying-predeploys": "Modifying predeployed contracts", + "integrating-da-layer": "Integrating a new DA layer" } \ No newline at end of file diff --git a/pages/builders/node-operators/_meta.json b/pages/builders/node-operators/_meta.json index 07df62fb7..818311233 100644 --- a/pages/builders/node-operators/_meta.json +++ b/pages/builders/node-operators/_meta.json @@ -1,10 +1,10 @@ { "architecture": "Architecture", - "rollup-node": "Run a Node in the Superchain", + "rollup-node": "Run a node in the Superchain", "tutorials": "Tutorials", "configuration": "Configuration", - "management": "Node Management", - "network-upgrades": "Network Upgrades", + "management": "Node management", + "network-upgrades": "Network upgrades", "json-rpc": "JSON-RPC API", - "releases": "Software Releases" + "releases": "Software releases" } diff --git a/pages/builders/node-operators/configuration/_meta.json b/pages/builders/node-operators/configuration/_meta.json index f38d96dcd..8794a3782 100644 --- a/pages/builders/node-operators/configuration/_meta.json +++ b/pages/builders/node-operators/configuration/_meta.json @@ -1,5 +1,5 @@ { - "base-config": "Base Configuration", - "consensus-config": "Consensus Layer Configuration", - "execution-config": "Execution Layer Configuration" + "base-config": "Base configuration", + "consensus-config": "Consensus layer configuration", + "execution-config": "Execution layer configuration" } \ No newline at end of file diff --git a/pages/builders/node-operators/management/_meta.json b/pages/builders/node-operators/management/_meta.json index f6278a6d8..1f68207f3 100644 --- a/pages/builders/node-operators/management/_meta.json +++ b/pages/builders/node-operators/management/_meta.json @@ -1,7 +1,7 @@ { - "blobs": "Using Blobs", + "blobs": "Using blobs", "snap-sync": "Using Snap Sync", - "snapshots": "Snapshot Downloads", + "snapshots": "Snapshot downloads", "metrics": "Monitoring", "troubleshooting": "Troubleshooting" } diff --git a/pages/builders/node-operators/tutorials/_meta.json b/pages/builders/node-operators/tutorials/_meta.json index d391ba66f..cff8f7900 100644 --- a/pages/builders/node-operators/tutorials/_meta.json +++ b/pages/builders/node-operators/tutorials/_meta.json @@ -1,6 +1,6 @@ { - "node-from-docker": "Running a Node With Docker", - "node-from-source": "Building a Node from Source", - "mainnet": "Running OP Mainnet from Source", - "testnet": "Running OP Sepolia from Source" + "node-from-docker": "Running a node with Docker", + "node-from-source": "Building a node from source", + "mainnet": "Running OP Mainnet from source", + "testnet": "Running OP Sepolia from source" } diff --git a/pages/builders/notices/_meta.json b/pages/builders/notices/_meta.json index c52a90569..b85000edf 100644 --- a/pages/builders/notices/_meta.json +++ b/pages/builders/notices/_meta.json @@ -1,5 +1,5 @@ { - "granite-changes": "Preparing for Granite Breaking Changes", - "fp-changes": "Preparing for Fault Proofs Breaking Changes", + "granite-changes": "Preparing for Granite breaking changes", + "fp-changes": "Preparing for fault proofs breaking changes", "sdk-deprecation": "Preparing for Optimism SDK deprecation" } diff --git a/pages/builders/tools/_meta.json b/pages/builders/tools/_meta.json index 670f6209a..440d418b9 100644 --- a/pages/builders/tools/_meta.json +++ b/pages/builders/tools/_meta.json @@ -3,6 +3,6 @@ "connect": "Connecting", "build": "Building", "monitor": "Monitoring", - "op-tools": "OP Tools", - "fee-calculator": "Fee Calculator" + "op-tools": "OP tools", + "fee-calculator": "Fee calculator" } diff --git a/pages/builders/tools/build/_meta.json b/pages/builders/tools/build/_meta.json index 249678234..cbd6ef41d 100644 --- a/pages/builders/tools/build/_meta.json +++ b/pages/builders/tools/build/_meta.json @@ -1,7 +1,7 @@ { "faucets": "Faucets", "oracles": "Oracles", - "nft-tools": "NFT Tools", - "block-explorers": "Block Explorers", - "account-abstraction": "Account Abstraction" + "nft-tools": "NFT tools", + "block-explorers": "Block explorers", + "account-abstraction": "Account abstraction" } \ No newline at end of file diff --git a/pages/builders/tools/connect/_meta.json b/pages/builders/tools/connect/_meta.json index f0051842b..5c7bf46ce 100644 --- a/pages/builders/tools/connect/_meta.json +++ b/pages/builders/tools/connect/_meta.json @@ -1,4 +1,4 @@ { - "networks": "Networks and RPC Endpoints", - "rpc-providers": "RPC Providers" + "networks": "Networks and RPC endpoints", + "rpc-providers": "RPC providers" } \ No newline at end of file diff --git a/pages/builders/tools/monitor/_meta.json b/pages/builders/tools/monitor/_meta.json index c2459cfce..f37b60762 100644 --- a/pages/builders/tools/monitor/_meta.json +++ b/pages/builders/tools/monitor/_meta.json @@ -1,4 +1,4 @@ { "analytics-tools": "Analytics", - "regenesis-history": "Historical Data" + "regenesis-history": "Historical data" } \ No newline at end of file diff --git a/pages/builders/tools/op-tools/_meta.json b/pages/builders/tools/op-tools/_meta.json index fcc07acdc..4886952ac 100644 --- a/pages/builders/tools/op-tools/_meta.json +++ b/pages/builders/tools/op-tools/_meta.json @@ -1,11 +1,11 @@ { "block-explorer": { - "title": "OP Mainnet Explorer", + "title": "OP Mainnet explorer", "href": "https://optimistic.etherscan.io/", "newWindow": true }, "bridge": { - "title": "Superchain Bridges", + "title": "Superchain bridges", "href": "https://app.optimism.io/bridge", "newWindow": true }, @@ -15,18 +15,18 @@ "newWindow": true }, "faucet": { - "title": "Superchain Faucet", + "title": "Superchain faucet", "type": "page", "href": "https://console.optimism.io/faucet?utm_source=docs", "newWindow": true }, "console": { - "title": "Superchain Dev Console", + "title": "Superchain dev console", "href": "https://console.optimism.io/?utm_source=docs", "newWindow": true }, "gas": { - "title": "Gas Tracker", + "title": "Gas tracker", "type": "page", "href": "https://optimistic.grafana.net/public-dashboards/c84a5a9924fe4e14b270a42a8651ceb8?orgId=1&refresh=5m", "newWindow": true diff --git a/pages/chain/_meta.json b/pages/chain/_meta.json index 120d2dc16..204a812a7 100644 --- a/pages/chain/_meta.json +++ b/pages/chain/_meta.json @@ -1,9 +1,9 @@ { - "getting-started": "Getting Started: OP Mainnet", - "differences": "Differences Between Ethereum and OP Mainnet", + "getting-started": "Getting started: OP Mainnet", + "differences": "Differences detween Ethereum and OP Mainnet", "networks": "Networks and RPC Endpoints", - "addresses": "Contract Addresses", - "tokenlist": "Bridged Token Addresses", + "addresses": "Contract addresses", + "tokenlist": "Bridged token addresses", "identity": "Identity", "testing": "Testing", "security": "Security" diff --git a/pages/chain/identity/_meta.json b/pages/chain/identity/_meta.json index 734d61bbf..3e4e40939 100644 --- a/pages/chain/identity/_meta.json +++ b/pages/chain/identity/_meta.json @@ -1,6 +1,6 @@ { "overview": "Overview", - "about-attestations": "About Attestations", + "about-attestations": "About attestations", "contracts-eas": "Contracts (EAS)", "schemas": "Schemas", "applications": "Apps", diff --git a/pages/chain/security/_meta.json b/pages/chain/security/_meta.json index 7ffeab759..0c83dd2a3 100644 --- a/pages/chain/security/_meta.json +++ b/pages/chain/security/_meta.json @@ -1,7 +1,7 @@ { - "faq": "Security Model & FAQ", - "privileged-roles": "Privileged Roles", - "security-policy": "Security Policy", + "faq": "Security model & FAQ", + "privileged-roles": "Privileged roles", + "security-policy": "Security policy", "bug-bounty": { "title": "Bug Bounty Program", "href": "https://immunefi.com/bounty/optimism/", diff --git a/pages/chain/testing/_meta.json b/pages/chain/testing/_meta.json index 9402c85f8..f6228db4f 100644 --- a/pages/chain/testing/_meta.json +++ b/pages/chain/testing/_meta.json @@ -1,4 +1,4 @@ { - "dev-node": "Running a Local Development Environment", - "testing-apps": "Testing Apps on OP Mainnet" + "dev-node": "Running a local development environment", + "testing-apps": "Testing apps on OP Mainnet" } diff --git a/pages/connect/contribute/_meta.json b/pages/connect/contribute/_meta.json index 39ebe0e09..dbfae0745 100644 --- a/pages/connect/contribute/_meta.json +++ b/pages/connect/contribute/_meta.json @@ -1,5 +1,5 @@ { - "docs-contribute": "Contribute to Optimism Docs", + "docs-contribute": "Contribute to Optimism docs", "stack-contribute": "Contribute to OP Stack", - "style-guide": "Docs Style Guide" + "style-guide": "Docs style guide" } \ No newline at end of file diff --git a/pages/stack/_meta.json b/pages/stack/_meta.json index 47b2dd20d..962a4597b 100644 --- a/pages/stack/_meta.json +++ b/pages/stack/_meta.json @@ -1,12 +1,12 @@ { - "getting-started": "Getting Started: OP Stack", - "differences": "Differences Between Ethereum and OP Stack Chains", - "explainer": "Superchain Explainer", - "design-principles": "Design Philosophy & Principles", - "components": "OP Stack Components", - "smart-contracts": "Smart Contracts", + "getting-started": "Getting started: OP Stack", + "differences": "Differences between Ethereum and OP Stack chains", + "explainer": "Superchain explainer", + "design-principles": "Design philosophy & principles", + "components": "OP Stack components", + "smart-contracts": "Smart contracts", "rollup": "Rollup", - "fault-proofs": "Fault Proofs", + "fault-proofs": "Fault proofs", "transactions": "Transactions", "features": "Features", "security": "Security", @@ -16,5 +16,5 @@ }, "opcm": "OP Contracts Manager", "interop": "Interoperability", - "beta-features": "Beta Features" + "beta-features": "Beta features" } diff --git a/pages/stack/beta-features/_meta.json b/pages/stack/beta-features/_meta.json index 22af59364..032cb72c0 100644 --- a/pages/stack/beta-features/_meta.json +++ b/pages/stack/beta-features/_meta.json @@ -1,4 +1,4 @@ { - "custom-gas-token": "Custom Gas Token", + "custom-gas-token": "Custom gas token", "alt-da-mode": "Alt-DA Mode" } diff --git a/pages/stack/fault-proofs/_meta.json b/pages/stack/fault-proofs/_meta.json index 344cdb1d7..0bf43dd6e 100644 --- a/pages/stack/fault-proofs/_meta.json +++ b/pages/stack/fault-proofs/_meta.json @@ -1,8 +1,8 @@ { - "explainer": "Fault Proofs Explainer", - "fp-components": "FP System Components", + "explainer": "Fault proofs explainer", + "fp-components": "FP system components", "cannon": "FPVM: Cannon", "challenger": "OP-Challenger", "mips": "MIPS.sol", - "fp-security": "FP Mainnet Security" + "fp-security": "FP Mainnet security" } \ No newline at end of file diff --git a/pages/stack/interop/_meta.json b/pages/stack/interop/_meta.json index d59a68f5d..0fad31024 100644 --- a/pages/stack/interop/_meta.json +++ b/pages/stack/interop/_meta.json @@ -1,6 +1,6 @@ { - "explainer": "Interop Explainer", - "cross-chain-message": "Anatomy of Cross-Chain Message", + "explainer": "Interop explainer", + "cross-chain-message": "Anatomy of cross-chain message", "supersim": "Supersim Multichain Development Environment", - "superchain-erc20": "SuperchainERC20 Token Standard" + "superchain-erc20": "SuperchainERC20 token standard" } \ No newline at end of file diff --git a/pages/stack/rollup/_meta.json b/pages/stack/rollup/_meta.json index a0e4ff047..def933fd0 100644 --- a/pages/stack/rollup/_meta.json +++ b/pages/stack/rollup/_meta.json @@ -1,5 +1,5 @@ { - "overview": "Rollup Overview", - "derivation-pipeline": "Derivation Pipeline", - "outages": "Sequencer Outages" + "overview": "Rollup overview", + "derivation-pipeline": "Derivation pipeline", + "outages": "Sequencer outages" } \ No newline at end of file diff --git a/pages/stack/security/_meta.json b/pages/stack/security/_meta.json index 672af59c4..d84287eaa 100644 --- a/pages/stack/security/_meta.json +++ b/pages/stack/security/_meta.json @@ -1,4 +1,4 @@ { "faq": "Security FAQs", - "pause": "Pause and Unpause the Bridge" + "pause": "Pause and unpause the Bridge" } \ No newline at end of file diff --git a/pages/stack/transactions/_meta.json b/pages/stack/transactions/_meta.json index 20f41a7f2..ed7d8ae81 100644 --- a/pages/stack/transactions/_meta.json +++ b/pages/stack/transactions/_meta.json @@ -1,7 +1,7 @@ { - "fees": "Transaction Fees", - "transaction-flow": "Transaction Flow", - "deposit-flow": "Deposit Flow", - "withdrawal-flow": "Withdrawal Flow", - "forced-transaction": "Forced Transaction" + "fees": "Transaction fees", + "transaction-flow": "Transaction flow", + "deposit-flow": "Deposit flow", + "withdrawal-flow": "Withdrawal flow", + "forced-transaction": "Forced transaction" } From 4700db52e33f44d38081eea59bc17679e8945db4 Mon Sep 17 00:00:00 2001 From: ant <0xdevant@gmail.com> Date: Thu, 24 Oct 2024 17:08:07 +0800 Subject: [PATCH 250/565] docs: fix link on standard-bridge-standard-token.mdx --- .../tutorials/standard-bridge-standard-token.mdx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pages/builders/app-developers/tutorials/standard-bridge-standard-token.mdx b/pages/builders/app-developers/tutorials/standard-bridge-standard-token.mdx index f575395f4..6046bd1f7 100644 --- a/pages/builders/app-developers/tutorials/standard-bridge-standard-token.mdx +++ b/pages/builders/app-developers/tutorials/standard-bridge-standard-token.mdx @@ -13,7 +13,7 @@ import { WipCallout } from '@/components/WipCallout' In this tutorial you'll learn how to bridge a standard ERC-20 token from Ethereum to an OP Stack chain using the Standard Bridge system. This tutorial is meant for developers who already have an existing ERC-20 token on Ethereum and want to create a bridged representation of that token on layer 2. -This tutorial explains how to use the [`OptimismMintableERC20Factory`](https://github.com/ethereum-optimism/optimism/blob/186e46a47647a51a658e699e9ff047d39444c2de/packages/contracts-bedrock/contracts/universal/OptimismMintableERC20Factory.sol) to deploy a standardized ERC-20 token on layer 2. +This tutorial explains how to use the [`OptimismMintableERC20Factory`](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts-bedrock/src/universal/OptimismMintableERC20Factory.sol) to deploy a standardized ERC-20 token on layer 2. Tokens created by this factory contract are compatible with the Standard Bridge system and include basic logic for deposits, transfers, and withdrawals. If you want to include specialized logic within your L2 token, see the tutorial on [Bridging Your Custom ERC-20 Token Using the Standard Bridge](./standard-bridge-custom-token) instead. @@ -26,7 +26,7 @@ The Standard Bridge **does not** support [**fee on transfer tokens**](https://gi The Standard Bridge system requires that L2 representations of L1 tokens implement the [`IOptimismMintableERC20`](https://github.com/ethereum-optimism/optimism/blob/v1.1.4/packages/contracts-bedrock/src/universal/IOptimismMintableERC20.sol) interface. This interface is a superset of the standard ERC-20 interface and includes functions that allow the bridge to properly verify deposits/withdrawals and mint/burn tokens as needed. Your L2 token contract must implement this interface in order to be bridged using the Standard Bridge system. -This tutorial will show you how to use the [`OptimismMintableERC20Factory`](https://github.com/ethereum-optimism/optimism/blob/186e46a47647a51a658e699e9ff047d39444c2de/packages/contracts-bedrock/contracts/universal/OptimismMintableERC20Factory.sol) to create a basic standardized ERC-20 token on layer 2. +This tutorial will show you how to use the [`OptimismMintableERC20Factory`](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts-bedrock/src/universal/OptimismMintableERC20Factory.sol) to create a basic standardized ERC-20 token on layer 2. ## Dependencies @@ -50,7 +50,7 @@ Otherwise, you can use the testing token located at [`0x5589BB8228C07c4e15558875 ## Create an L2 ERC-20 Token -Once you have an L1 ERC-20 token, you can use the [`OptimismMintableERC20Factory`](https://github.com/ethereum-optimism/optimism/blob/186e46a47647a51a658e699e9ff047d39444c2de/packages/contracts-bedrock/contracts/universal/OptimismMintableERC20Factory.sol) to create a corresponding L2 ERC-20 token on OP Sepolia. +Once you have an L1 ERC-20 token, you can use the [`OptimismMintableERC20Factory`](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts-bedrock/src/universal/OptimismMintableERC20Factory.sol) to create a corresponding L2 ERC-20 token on OP Sepolia. All tokens created by the factory implement the `IOptimismMintableERC20` interface and are compatible with the Standard Bridge system. @@ -83,7 +83,7 @@ Set your L1 ERC-20 token address as an environment variable with the `export` co {

Deploy your L2 ERC-20 token

} -You can now deploy our L2 ERC-20 token using the [`OptimismMintableERC20Factory`](https://github.com/ethereum-optimism/optimism/blob/186e46a47647a51a658e699e9ff047d39444c2de/packages/contracts-bedrock/contracts/universal/OptimismMintableERC20Factory.sol). +You can now deploy our L2 ERC-20 token using the [`OptimismMintableERC20Factory`](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts-bedrock/src/universal/OptimismMintableERC20Factory.sol). Use the `cast` command to trigger the deployment function on the factory contract. This example command creates a token with the name "My Standard Demo Token" and the symbol "L2TKN". The resulting L2 ERC-20 token address is printed to the console. From 7db73ce2b72df938bc81b0280c619c06fcfb7592 Mon Sep 17 00:00:00 2001 From: Emily Furlong Date: Thu, 24 Oct 2024 11:24:51 +0200 Subject: [PATCH 251/565] Update schemas.mdx adding two new schemas: metagov contribution and foundation mission request completed --- pages/chain/identity/schemas.mdx | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/pages/chain/identity/schemas.mdx b/pages/chain/identity/schemas.mdx index e70a2b7e5..1d83092a1 100644 --- a/pages/chain/identity/schemas.mdx +++ b/pages/chain/identity/schemas.mdx @@ -121,6 +121,29 @@ These attestations are voting Badges issued for Retro Round 5 and beyond. They a | votingGroup | Used to assign voters to subcategories in case the Round has subcategories | | selectionMethod | The method in which this voter was selected | +### [MetaGov Contribution] (https://optimism.easscan.org/schema/view/0x84260b9102b41041692558a4e0cba6b7e5f9b813be56402c3db820c06dd4a5f1) + +| Schema UID | `0x84260b9102b41041692558a4e0cba6b7e5f9b813be56402c3db820c06dd4a5f1` | +| ---------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Issuer | Currently, the Optimism Foundation issues these from one of the following addresses: `0x621477dBA416E12df7FF0d48E14c4D20DC85D7D9` or `0xE4553b743E74dA3424Ac51f8C1E586fd43aE226F`. | +| Recipient | The address of the individual who made the contribution | +| refUID | The UID of the project, in case this contribution is represented as a project | +| FarcasterID | The id of the individual who made the contribution, if known | +| Impact | This field is not currently being used | +| Season | The season in which the contribution was made | +| Decision Module | The decision module to which the contribution relates | +| Contribution Type | The type of contribution | +| MetadataUrl | This field is not currently being used | + +### [Foundation Mission Request Completed] (https://optimism.easscan.org/schema/view/0x649cc6df5af7561b66384405a62682c44e2428584d2f17a202ac3ef4506e2457) + +| Schema UID | `0x649cc6df5af7561b66384405a62682c44e2428584d2f17a202ac3ef4506e2457` | +| ---------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Issuer | Currently, the Optimism Foundation issues these from one of the following addresses: `0x621477dBA416E12df7FF0d48E14c4D20DC85D7D9` or `0xE4553b743E74dA3424Ac51f8C1E586fd43aE226F`. | +| projectRefUID | The UID of the project that represents the work completed as part of the Foundation Mission Request | +| OP Amount | The OP Amount that was awarded for the completion of this Mission Request | +| Season | The season in which this Mission Request was completed | + ### [Retro funding governance contribution](https://optimism.easscan.org/schema/view/0x3743be2afa818ee40304516c153427be55931f238d961af5d98653a93192cdb3) | Schema UID | `0x3743be2afa818ee40304516c153427be55931f238d961af5d98653a93192cdb3` | From d5d6fc8ec4be372e8e28059373b6f69d465ba9a2 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Thu, 24 Oct 2024 11:01:38 +0100 Subject: [PATCH 252/565] Update pages/chain/identity/schemas.mdx Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> --- pages/chain/identity/schemas.mdx | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/pages/chain/identity/schemas.mdx b/pages/chain/identity/schemas.mdx index 1d83092a1..ad64ea877 100644 --- a/pages/chain/identity/schemas.mdx +++ b/pages/chain/identity/schemas.mdx @@ -121,8 +121,7 @@ These attestations are voting Badges issued for Retro Round 5 and beyond. They a | votingGroup | Used to assign voters to subcategories in case the Round has subcategories | | selectionMethod | The method in which this voter was selected | -### [MetaGov Contribution] (https://optimism.easscan.org/schema/view/0x84260b9102b41041692558a4e0cba6b7e5f9b813be56402c3db820c06dd4a5f1) - +### [MetaGov Contribution](https://optimism.easscan.org/schema/view/0x84260b9102b41041692558a4e0cba6b7e5f9b813be56402c3db820c06dd4a5f1) | Schema UID | `0x84260b9102b41041692558a4e0cba6b7e5f9b813be56402c3db820c06dd4a5f1` | | ---------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Issuer | Currently, the Optimism Foundation issues these from one of the following addresses: `0x621477dBA416E12df7FF0d48E14c4D20DC85D7D9` or `0xE4553b743E74dA3424Ac51f8C1E586fd43aE226F`. | From 63519734d9f824dd8344298f8d93d8961603e5b4 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Thu, 24 Oct 2024 11:01:50 +0100 Subject: [PATCH 253/565] Update pages/chain/identity/schemas.mdx Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> --- pages/chain/identity/schemas.mdx | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/pages/chain/identity/schemas.mdx b/pages/chain/identity/schemas.mdx index ad64ea877..936c48006 100644 --- a/pages/chain/identity/schemas.mdx +++ b/pages/chain/identity/schemas.mdx @@ -134,8 +134,7 @@ These attestations are voting Badges issued for Retro Round 5 and beyond. They a | Contribution Type | The type of contribution | | MetadataUrl | This field is not currently being used | -### [Foundation Mission Request Completed] (https://optimism.easscan.org/schema/view/0x649cc6df5af7561b66384405a62682c44e2428584d2f17a202ac3ef4506e2457) - +### [Foundation Mission Request Completed](https://optimism.easscan.org/schema/view/0x649cc6df5af7561b66384405a62682c44e2428584d2f17a202ac3ef4506e2457) | Schema UID | `0x649cc6df5af7561b66384405a62682c44e2428584d2f17a202ac3ef4506e2457` | | ---------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Issuer | Currently, the Optimism Foundation issues these from one of the following addresses: `0x621477dBA416E12df7FF0d48E14c4D20DC85D7D9` or `0xE4553b743E74dA3424Ac51f8C1E586fd43aE226F`. | From ae131ff091bcad1438a036a18c29a76de0b52a29 Mon Sep 17 00:00:00 2001 From: krofax Date: Thu, 24 Oct 2024 11:08:59 +0100 Subject: [PATCH 254/565] fix lint issues --- pages/chain/identity/schemas.mdx | 36 +++++++++++++++++--------------- words.txt | 5 ++--- 2 files changed, 21 insertions(+), 20 deletions(-) diff --git a/pages/chain/identity/schemas.mdx b/pages/chain/identity/schemas.mdx index 936c48006..1a562471a 100644 --- a/pages/chain/identity/schemas.mdx +++ b/pages/chain/identity/schemas.mdx @@ -122,25 +122,27 @@ These attestations are voting Badges issued for Retro Round 5 and beyond. They a | selectionMethod | The method in which this voter was selected | ### [MetaGov Contribution](https://optimism.easscan.org/schema/view/0x84260b9102b41041692558a4e0cba6b7e5f9b813be56402c3db820c06dd4a5f1) -| Schema UID | `0x84260b9102b41041692558a4e0cba6b7e5f9b813be56402c3db820c06dd4a5f1` | -| ---------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Issuer | Currently, the Optimism Foundation issues these from one of the following addresses: `0x621477dBA416E12df7FF0d48E14c4D20DC85D7D9` or `0xE4553b743E74dA3424Ac51f8C1E586fd43aE226F`. | -| Recipient | The address of the individual who made the contribution | -| refUID | The UID of the project, in case this contribution is represented as a project | -| FarcasterID | The id of the individual who made the contribution, if known | -| Impact | This field is not currently being used | -| Season | The season in which the contribution was made | -| Decision Module | The decision module to which the contribution relates | -| Contribution Type | The type of contribution | -| MetadataUrl | This field is not currently being used | + +| Schema UID | `0x84260b9102b41041692558a4e0cba6b7e5f9b813be56402c3db820c06dd4a5f1` | +| ----------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Issuer | Currently, the Optimism Foundation issues these from one of the following addresses: `0x621477dBA416E12df7FF0d48E14c4D20DC85D7D9` or `0xE4553b743E74dA3424Ac51f8C1E586fd43aE226F`. | +| Recipient | The address of the individual who made the contribution | +| refUID | The UID of the project, in case this contribution is represented as a project | +| FarcasterID | The id of the individual who made the contribution, if known | +| Impact | This field is not currently being used | +| Season | The season in which the contribution was made | +| Decision Module | The decision module to which the contribution relates | +| Contribution Type | The type of contribution | +| MetadataUrl | This field is not currently being used | ### [Foundation Mission Request Completed](https://optimism.easscan.org/schema/view/0x649cc6df5af7561b66384405a62682c44e2428584d2f17a202ac3ef4506e2457) -| Schema UID | `0x649cc6df5af7561b66384405a62682c44e2428584d2f17a202ac3ef4506e2457` | -| ---------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Issuer | Currently, the Optimism Foundation issues these from one of the following addresses: `0x621477dBA416E12df7FF0d48E14c4D20DC85D7D9` or `0xE4553b743E74dA3424Ac51f8C1E586fd43aE226F`. | -| projectRefUID | The UID of the project that represents the work completed as part of the Foundation Mission Request | -| OP Amount | The OP Amount that was awarded for the completion of this Mission Request | -| Season | The season in which this Mission Request was completed | + +| Schema UID | `0x649cc6df5af7561b66384405a62682c44e2428584d2f17a202ac3ef4506e2457` | +| ------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Issuer | Currently, the Optimism Foundation issues these from one of the following addresses: `0x621477dBA416E12df7FF0d48E14c4D20DC85D7D9` or `0xE4553b743E74dA3424Ac51f8C1E586fd43aE226F`. | +| projectRefUID | The UID of the project that represents the work completed as part of the Foundation Mission Request | +| OP Amount | The OP Amount that was awarded for the completion of this Mission Request | +| Season | The season in which this Mission Request was completed | ### [Retro funding governance contribution](https://optimism.easscan.org/schema/view/0x3743be2afa818ee40304516c153427be55931f238d961af5d98653a93192cdb3) diff --git a/words.txt b/words.txt index 93c865012..b86d09017 100644 --- a/words.txt +++ b/words.txt @@ -16,6 +16,7 @@ Arweave authrpc Badgeholder's Badgeholders +badgeholders basefee BGEZ BGTZ @@ -169,7 +170,6 @@ leveldb lightkdf logfile logfmt -marketshare MAXAGE maxage MAXBACKUPS @@ -204,7 +204,6 @@ MTHI MTLO MULT multiaddr -Multichain multichain multiclient multisigs @@ -303,7 +302,7 @@ replayability reproven REQUIREDBLOCKS requiredblocks -Rollouts +rollouts Rollups rollups Routescan From 0139df2425258f9dfd71699bf09421fa4f347240 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Thu, 24 Oct 2024 11:30:25 +0100 Subject: [PATCH 255/565] Update pages/stack/transactions/_meta.json Co-authored-by: soyboy <85043086+sbvegan@users.noreply.github.com> --- pages/stack/transactions/_meta.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/stack/transactions/_meta.json b/pages/stack/transactions/_meta.json index 4ba3f6caa..8f37c3067 100644 --- a/pages/stack/transactions/_meta.json +++ b/pages/stack/transactions/_meta.json @@ -1,6 +1,6 @@ { "fees": "Transaction Fees", - "transaction-flow": "Transaction Flow", + "transaction-flow": "Transaction flow", "deposit-flow": "Deposit Flow", "withdrawal-flow": "Withdrawal Flow", "transaction-finality":"Transaction finality", From 186d94179f74ab8d9a934aa46d600d9655f9148d Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Thu, 24 Oct 2024 11:31:10 +0100 Subject: [PATCH 256/565] Update pages/stack/transactions/_meta.json Co-authored-by: soyboy <85043086+sbvegan@users.noreply.github.com> --- pages/stack/transactions/_meta.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/stack/transactions/_meta.json b/pages/stack/transactions/_meta.json index 8f37c3067..03517047c 100644 --- a/pages/stack/transactions/_meta.json +++ b/pages/stack/transactions/_meta.json @@ -1,7 +1,7 @@ { "fees": "Transaction Fees", "transaction-flow": "Transaction flow", - "deposit-flow": "Deposit Flow", + "deposit-flow": "Deposit flow", "withdrawal-flow": "Withdrawal Flow", "transaction-finality":"Transaction finality", "forced-transaction": "Forced Transaction" From 4eced457d8eef0ad35382331315816c58017dc4d Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Thu, 24 Oct 2024 11:32:08 +0100 Subject: [PATCH 257/565] Update pages/stack/transactions/_meta.json Co-authored-by: soyboy <85043086+sbvegan@users.noreply.github.com> --- pages/stack/transactions/_meta.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/stack/transactions/_meta.json b/pages/stack/transactions/_meta.json index 03517047c..44d26221b 100644 --- a/pages/stack/transactions/_meta.json +++ b/pages/stack/transactions/_meta.json @@ -2,7 +2,7 @@ "fees": "Transaction Fees", "transaction-flow": "Transaction flow", "deposit-flow": "Deposit flow", - "withdrawal-flow": "Withdrawal Flow", + "withdrawal-flow": "Withdrawal flow", "transaction-finality":"Transaction finality", "forced-transaction": "Forced Transaction" } From 062aa1a30e44f407da6619f1c563ab2b8cc2f82a Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Thu, 24 Oct 2024 11:32:18 +0100 Subject: [PATCH 258/565] Update pages/stack/transactions/_meta.json Co-authored-by: soyboy <85043086+sbvegan@users.noreply.github.com> --- pages/stack/transactions/_meta.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/stack/transactions/_meta.json b/pages/stack/transactions/_meta.json index 44d26221b..e171d7612 100644 --- a/pages/stack/transactions/_meta.json +++ b/pages/stack/transactions/_meta.json @@ -4,5 +4,5 @@ "deposit-flow": "Deposit flow", "withdrawal-flow": "Withdrawal flow", "transaction-finality":"Transaction finality", - "forced-transaction": "Forced Transaction" + "forced-transaction": "Forced transaction" } From fc42888c9833ccfed51efda12fa58d73da23204c Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Thu, 24 Oct 2024 11:32:26 +0100 Subject: [PATCH 259/565] Update pages/stack/transactions/transaction-finality.mdx Co-authored-by: soyboy <85043086+sbvegan@users.noreply.github.com> --- pages/stack/transactions/transaction-finality.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/stack/transactions/transaction-finality.mdx b/pages/stack/transactions/transaction-finality.mdx index 6d3fb3787..30b0d77de 100644 --- a/pages/stack/transactions/transaction-finality.mdx +++ b/pages/stack/transactions/transaction-finality.mdx @@ -9,7 +9,7 @@ import { Callout } from 'nextra/components' # Overview -This guide explains how transaction finality works in OP Stack, covering the fundamental concepts of Fault Proofs and Challenges. +This guide explains how transaction finality works in the OP Stack and addresses common misconceptions around transaction finality and the Fault Proof System. OP Stack is an extension of Ethereum's consensus mechanism. Instead of running an entirely separate consensus protocol, the OP Stack leverages Ethereum's consensus. This enables it to take advantage of Ethereum's transaction ordering mechanism and finalize its own blocks without requiring a new consensus layer. From c1ebce7c5df6b5ce5449e6da226aae71fb1a557d Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Thu, 24 Oct 2024 11:32:51 +0100 Subject: [PATCH 260/565] Update pages/stack/transactions/transaction-finality.mdx Co-authored-by: soyboy <85043086+sbvegan@users.noreply.github.com> --- pages/stack/transactions/transaction-finality.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/stack/transactions/transaction-finality.mdx b/pages/stack/transactions/transaction-finality.mdx index 30b0d77de..47e470f28 100644 --- a/pages/stack/transactions/transaction-finality.mdx +++ b/pages/stack/transactions/transaction-finality.mdx @@ -11,7 +11,7 @@ import { Callout } from 'nextra/components' This guide explains how transaction finality works in the OP Stack and addresses common misconceptions around transaction finality and the Fault Proof System. -OP Stack is an extension of Ethereum's consensus mechanism. Instead of running an entirely separate consensus protocol, the OP Stack leverages Ethereum's consensus. +The OP Stack derives its security from Ethereum by utilizing Ethereum's consensus mechanism. Instead of running an entirely separate consensus protocol, the OP Stack derives a layer 2 blockchain by reading the finalized state on Ethereum. This enables it to take advantage of Ethereum's transaction ordering mechanism and finalize its own blocks without requiring a new consensus layer. ## Transaction Processing From 2b3e7ed6ac8d833941352d05c814419bf3c5f506 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Thu, 24 Oct 2024 11:33:13 +0100 Subject: [PATCH 261/565] Update pages/stack/transactions/transaction-finality.mdx Co-authored-by: soyboy <85043086+sbvegan@users.noreply.github.com> --- pages/stack/transactions/transaction-finality.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/stack/transactions/transaction-finality.mdx b/pages/stack/transactions/transaction-finality.mdx index 47e470f28..551645b65 100644 --- a/pages/stack/transactions/transaction-finality.mdx +++ b/pages/stack/transactions/transaction-finality.mdx @@ -7,7 +7,7 @@ description: Learn about finality in OP Stack and the steps to achieve transacti import Image from 'next/image' import { Callout } from 'nextra/components' -# Overview +# Transaction finality This guide explains how transaction finality works in the OP Stack and addresses common misconceptions around transaction finality and the Fault Proof System. From 965f8b93c9e6454075827dd729aa273f271e7637 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Thu, 24 Oct 2024 11:33:47 +0100 Subject: [PATCH 262/565] Update pages/stack/transactions/transaction-finality.mdx Co-authored-by: soyboy <85043086+sbvegan@users.noreply.github.com> --- pages/stack/transactions/transaction-finality.mdx | 1 - 1 file changed, 1 deletion(-) diff --git a/pages/stack/transactions/transaction-finality.mdx b/pages/stack/transactions/transaction-finality.mdx index 551645b65..77c017722 100644 --- a/pages/stack/transactions/transaction-finality.mdx +++ b/pages/stack/transactions/transaction-finality.mdx @@ -10,7 +10,6 @@ import { Callout } from 'nextra/components' # Transaction finality This guide explains how transaction finality works in the OP Stack and addresses common misconceptions around transaction finality and the Fault Proof System. - The OP Stack derives its security from Ethereum by utilizing Ethereum's consensus mechanism. Instead of running an entirely separate consensus protocol, the OP Stack derives a layer 2 blockchain by reading the finalized state on Ethereum. This enables it to take advantage of Ethereum's transaction ordering mechanism and finalize its own blocks without requiring a new consensus layer. From 8cf8f59d16b8d5a7cca741226c90ea8e61e240ec Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Thu, 24 Oct 2024 11:34:09 +0100 Subject: [PATCH 263/565] Update pages/stack/transactions/transaction-finality.mdx Co-authored-by: soyboy <85043086+sbvegan@users.noreply.github.com> --- .../transactions/transaction-finality.mdx | 23 ------------------- 1 file changed, 23 deletions(-) diff --git a/pages/stack/transactions/transaction-finality.mdx b/pages/stack/transactions/transaction-finality.mdx index 77c017722..ef13c81a9 100644 --- a/pages/stack/transactions/transaction-finality.mdx +++ b/pages/stack/transactions/transaction-finality.mdx @@ -13,29 +13,6 @@ This guide explains how transaction finality works in the OP Stack and addresses The OP Stack derives its security from Ethereum by utilizing Ethereum's consensus mechanism. Instead of running an entirely separate consensus protocol, the OP Stack derives a layer 2 blockchain by reading the finalized state on Ethereum. This enables it to take advantage of Ethereum's transaction ordering mechanism and finalize its own blocks without requiring a new consensus layer. -## Transaction Processing - -State machines, such as the Ethereum Virtual Machine (EVM), rely on input lists (transactions) to evolve from one state to another. The order of the transactions is critical because incorrect ordering can lead to an invalid state. - -For example, if a user attempts to send 1 ETH to two different parties at the same time, only one transaction can be valid. The order determines which transaction succeeds, making transaction ordering an essential aspect of consensus. - -### Commutative vs. Non-Commutative Operations - -Commutative operations allow the order of inputs to change without affecting the outcome. However, non-commutative operations (like sending funds) require strict ordering. Therefore, both the availability and the order of the transaction list are fundamental to ensuring the system's integrity. - -### Consensus and Ordering - -Consensus determines the valid chain or list of transactions. In the OP Stack, Ethereum's Proof of Stake (PoS) consensus mechanism is used to achieve transaction ordering and finality. - -### Why Use Ethereum's Consensus? - -By publishing blocks on Ethereum, the OP Stack effectively outsources its consensus mechanism. Instead of creating a separate consensus protocol, the OP Stack relies on Ethereum's ordering and finality guarantees. - -### Key benefits of this approach: - -* OP Stack inherits Ethereum's security and transaction ordering properties. -* It simplifies the design and development process by eliminating the need for a separate consensus protocol. -* Attack vectors, such as double-spends, are mitigated by Ethereum's security mechanisms. ## Sequencer Operations From 60e368833036e3d7dab4501064b4bc3a9b0b4c31 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Thu, 24 Oct 2024 11:36:33 +0100 Subject: [PATCH 264/565] Update pages/stack/transactions/transaction-finality.mdx Co-authored-by: soyboy <85043086+sbvegan@users.noreply.github.com> --- pages/stack/transactions/transaction-finality.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/stack/transactions/transaction-finality.mdx b/pages/stack/transactions/transaction-finality.mdx index ef13c81a9..e6c313153 100644 --- a/pages/stack/transactions/transaction-finality.mdx +++ b/pages/stack/transactions/transaction-finality.mdx @@ -42,7 +42,7 @@ The sequencer operates with the following trust assumptions: In the OP Stack, transaction finality progresses through three key stages: -1. **Unsafe:** The L2 sequencer creates a block containing the transaction, but the transaction data has not yet been posted to Ethereum (L1). The block is circulated within the L2 network for speed. +1. **Unsafe:** The sequencer creates a block containing the transaction, but the transaction data has not yet been posted to Ethereum (L1). The block is circulated within the L2 network for speed. 2. **Safe:** The sequencer's batcher posts the transaction data to L1. At this point, any L2 node can derive the transaction. From a19a6778ea07f8bdae0fc780aefb693a4c312ae3 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Thu, 24 Oct 2024 11:36:50 +0100 Subject: [PATCH 265/565] Update pages/stack/transactions/transaction-finality.mdx Co-authored-by: soyboy <85043086+sbvegan@users.noreply.github.com> --- pages/stack/transactions/transaction-finality.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/stack/transactions/transaction-finality.mdx b/pages/stack/transactions/transaction-finality.mdx index e6c313153..87d1715d6 100644 --- a/pages/stack/transactions/transaction-finality.mdx +++ b/pages/stack/transactions/transaction-finality.mdx @@ -44,7 +44,7 @@ In the OP Stack, transaction finality progresses through three key stages: 1. **Unsafe:** The sequencer creates a block containing the transaction, but the transaction data has not yet been posted to Ethereum (L1). The block is circulated within the L2 network for speed. -2. **Safe:** The sequencer's batcher posts the transaction data to L1. At this point, any L2 node can derive the transaction. +2. **Safe:** The batcher posts the transaction data to L1. At this point, any L2 node can derive the transaction. 3. **Finalized:** Transactions are finalized once more than 65 Ethereum blocks (approximately 20 minutes) have passed, ensuring that the L1 data is secure and cannot be reorganized. From 6340eddab979e9a03e801e13eb7879a5a9d98970 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Thu, 24 Oct 2024 11:37:25 +0100 Subject: [PATCH 266/565] Update pages/stack/transactions/transaction-finality.mdx Co-authored-by: soyboy <85043086+sbvegan@users.noreply.github.com> --- pages/stack/transactions/transaction-finality.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/stack/transactions/transaction-finality.mdx b/pages/stack/transactions/transaction-finality.mdx index 87d1715d6..22b30818a 100644 --- a/pages/stack/transactions/transaction-finality.mdx +++ b/pages/stack/transactions/transaction-finality.mdx @@ -46,7 +46,7 @@ In the OP Stack, transaction finality progresses through three key stages: 2. **Safe:** The batcher posts the transaction data to L1. At this point, any L2 node can derive the transaction. -3. **Finalized:** Transactions are finalized once more than 65 Ethereum blocks (approximately 20 minutes) have passed, ensuring that the L1 data is secure and cannot be reorganized. +3. **Finalized:** Transactions are finalized once more than 65 Ethereum blocks (approximately 10-15 minutes) have passed, ensuring that the L1 data is secure and cannot be reorganized. Transaction Finality Diagram. From ce345b5eca386f0414270e3c06c3eb42bb4a2f0b Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Thu, 24 Oct 2024 11:37:42 +0100 Subject: [PATCH 267/565] Update pages/stack/transactions/transaction-finality.mdx Co-authored-by: soyboy <85043086+sbvegan@users.noreply.github.com> --- pages/stack/transactions/transaction-finality.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/stack/transactions/transaction-finality.mdx b/pages/stack/transactions/transaction-finality.mdx index 22b30818a..84a6f830b 100644 --- a/pages/stack/transactions/transaction-finality.mdx +++ b/pages/stack/transactions/transaction-finality.mdx @@ -67,7 +67,7 @@ If an Ethereum reorganization (reorg) occurs: 3. The sequencer typically republishes the same transactions. 4. The system returns to a consistent state after reprocessing. -## The Role of the Proof System +## Common misconceptions The proof system is entirely separate from the core OP Stack protocol. It is an application-level validation system designed to ensure the accuracy of certain claims about the transaction state. From 1d70689374dce8256ad43e36cd03ae266aa56200 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Thu, 24 Oct 2024 11:38:42 +0100 Subject: [PATCH 268/565] Update pages/stack/transactions/transaction-finality.mdx Co-authored-by: soyboy <85043086+sbvegan@users.noreply.github.com> --- pages/stack/transactions/transaction-finality.mdx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pages/stack/transactions/transaction-finality.mdx b/pages/stack/transactions/transaction-finality.mdx index 84a6f830b..b2686f536 100644 --- a/pages/stack/transactions/transaction-finality.mdx +++ b/pages/stack/transactions/transaction-finality.mdx @@ -50,9 +50,9 @@ In the OP Stack, transaction finality progresses through three key stages: Transaction Finality Diagram. -### Transaction Validity +### Transaction validity -When a block is submitted to Ethereum, it is either valid or invalid. If the block is valid, the state is updated accordingly. If it is invalid, the block is discarded. Nodes execute valid blocks and update the state as required. +When a transaction is submitted to the network, it is either valid or invalid. If the transaction is valid, the sequencer puts it in a block. If it is invalid, the transaction is discarded. There is no way the sequencer can write an invalid transaction to a new block. ### Reorgs and Finality From b9acf97fc358176da86a384604192ec46c1bd5da Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Thu, 24 Oct 2024 11:46:11 +0100 Subject: [PATCH 269/565] Update pages/stack/transactions/transaction-finality.mdx Co-authored-by: soyboy <85043086+sbvegan@users.noreply.github.com> --- .../transactions/transaction-finality.mdx | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/pages/stack/transactions/transaction-finality.mdx b/pages/stack/transactions/transaction-finality.mdx index b2686f536..8c29e05fb 100644 --- a/pages/stack/transactions/transaction-finality.mdx +++ b/pages/stack/transactions/transaction-finality.mdx @@ -71,26 +71,20 @@ If an Ethereum reorganization (reorg) occurs: The proof system is entirely separate from the core OP Stack protocol. It is an application-level validation system designed to ensure the accuracy of certain claims about the transaction state. -### What Is a Claim? +### The role of proof system -A claim in the context of OP Stack is a statement asserting the state of the system at a specific block height. For instance, a claim might assert that at block 1,000,000, the state hash is `XYZ`. If other participants believe this claim to be incorrect, they can challenge it. - -### Fault Proofs and Challenges +The following is a quick refresher on the Fault Proof System. It is a system designed to ensure the accuracy of certain claims about the transaction state on the L2. -Challenges focus on proving whether a given claim is valid. The outcome of a challenge does not impact the underlying chain. For example, if a claim about the transaction state at a specific block is proven wrong, it only affects the app-level functionality and does not alter the OP Stack protocol. +A claim in the context of OP Stack is a statement asserting the state of the system at a specific block height. For instance, a claim might assert that at block 1,000,000, the state hash is `XYZ`. If other participants believe this claim to be incorrect, they can challenge it. -## 7-Day Challenge Period in OP Stack +Challenges focus on proving whether a given claim is valid. The outcome of a challenge does not impact the underlying chain. For example, if a claim about the transaction state at a specific block is proven wrong, it only affects the application level functionality and does not alter the OP Stack protocol. -The 7-day challenge period provides time for challenges to be raised and resolved. +The challenge period provides time for challenges to be raised and resolved. Although OP Stack finalizes transactions quickly (within 20 minutes), the 7-day challenge window serves two critical purposes: -1. It allows time to validate and dispute the correctness of batches posted to Ethereum by the op-batcher, particularly important in scenarios like 51% attacks. +1. It allows time to dispute the correctness of output state roots posted to Ethereum by the proposer. 2. It provides a security period for withdrawal processing, ensuring the integrity of cross-chain operations. -### Why Seven Days? - -The 7-day challenge period is a reasonable time frame that allows participants to organize a response, potentially even initiating a L1 hard fork to address critical issues. In the OP Stack, this challenge period also serves as a safeguard for app-level bridges and custom designs that may be built on top of the core protocol. - ### Bridge Independence Key aspects of bridge systems include: From f6f4a3850d725ee9ccd68807274cce532851c3b3 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Thu, 24 Oct 2024 11:46:48 +0100 Subject: [PATCH 270/565] resolved comments --- .../transactions/transaction-finality.mdx | 44 ++++++------------- 1 file changed, 13 insertions(+), 31 deletions(-) diff --git a/pages/stack/transactions/transaction-finality.mdx b/pages/stack/transactions/transaction-finality.mdx index ef13c81a9..f1c1c0144 100644 --- a/pages/stack/transactions/transaction-finality.mdx +++ b/pages/stack/transactions/transaction-finality.mdx @@ -7,29 +7,14 @@ description: Learn about finality in OP Stack and the steps to achieve transacti import Image from 'next/image' import { Callout } from 'nextra/components' -# Transaction finality +# Overview -This guide explains how transaction finality works in the OP Stack and addresses common misconceptions around transaction finality and the Fault Proof System. -The OP Stack derives its security from Ethereum by utilizing Ethereum's consensus mechanism. Instead of running an entirely separate consensus protocol, the OP Stack derives a layer 2 blockchain by reading the finalized state on Ethereum. -This enables it to take advantage of Ethereum's transaction ordering mechanism and finalize its own blocks without requiring a new consensus layer. - - -## Sequencer Operations - -The sequencer (block producer) processes transactions in the following steps: - -1. Pre-publishing Distribution: - * The sequencer receives transactions from users. - * It creates blocks containing these transactions. - * It distributes these blocks to network nodes before L1 publication. - * Nodes mark these blocks as "unsafe." +This guide explains how transaction finality works in OP Stack, covering the fundamental concepts of Fault Proofs and Challenges. -2. L1 Publication: - * The sequencer publishes the blocks to Ethereum (L1). - * Once included in L1, the blocks are marked as "safe." - * Blocks achieve "finalized" status after L1 finalization (approximately 20 minutes). +OP Stack is an extension of Ethereum's consensus mechanism. Instead of running an entirely separate consensus protocol, the OP Stack leverages Ethereum's consensus. +This enables it to take advantage of Ethereum's transaction ordering mechanism and finalize its own blocks without requiring a new consensus layer. -### Sequencer Trust Assumptions +## Sequencer trust assumptions The sequencer operates with the following trust assumptions: @@ -38,7 +23,7 @@ The sequencer operates with the following trust assumptions: * Once transactions are published on L1, the sequencer cannot modify or censor them. * The sequencer cannot affect finalized transactions. -## Transaction Finality States +## Transaction finality states In the OP Stack, transaction finality progresses through three key stages: @@ -50,15 +35,16 @@ In the OP Stack, transaction finality progresses through three key stages: Transaction Finality Diagram. -### Transaction Validity - -When a block is submitted to Ethereum, it is either valid or invalid. If the block is valid, the state is updated accordingly. If it is invalid, the block is discarded. Nodes execute valid blocks and update the state as required. +## Common misconceptions -### Reorgs and Finality +The biggest misconception about transaction finality is that a transaction needs to wait for the entire challenge window to become finalized. The reality is the OP Stack transaction finality takes minutes, not 7-days. +This section detangles the concept of transaction finality and the Fault Proof System's challenger mechanism -Once a block is included in a finalized Ethereum block, it cannot be reorganized. Therefore, blocks enjoy the same finality guarantees as Ethereum blocks, and this finality is managed by the OP Stack architecture. +### Transaction validity +When a transaction is submitted to the network, it is either valid or invalid. If the transaction is valid, the sequencer puts it in a block. If it is invalid, the transaction is discarded. There is no way the sequencer can write an invalid transaction to a new block. -### Handling Reorgs +### Reorgs and finality +Once a transaction is included in a finalized Ethereum block, it cannot be reorganized. If an Ethereum reorganization (reorg) occurs: @@ -67,10 +53,6 @@ If an Ethereum reorganization (reorg) occurs: 3. The sequencer typically republishes the same transactions. 4. The system returns to a consistent state after reprocessing. -## The Role of the Proof System - -The proof system is entirely separate from the core OP Stack protocol. It is an application-level validation system designed to ensure the accuracy of certain claims about the transaction state. - ### What Is a Claim? A claim in the context of OP Stack is a statement asserting the state of the system at a specific block height. For instance, a claim might assert that at block 1,000,000, the state hash is `XYZ`. If other participants believe this claim to be incorrect, they can challenge it. From 867fb4c3809c9c401a96f85c9a1a9aebd19c3d7c Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Thu, 24 Oct 2024 11:51:58 +0100 Subject: [PATCH 271/565] Update pages/stack/transactions/transaction-finality.mdx Co-authored-by: soyboy <85043086+sbvegan@users.noreply.github.com> --- pages/stack/transactions/transaction-finality.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/stack/transactions/transaction-finality.mdx b/pages/stack/transactions/transaction-finality.mdx index 8c29e05fb..23ce338ec 100644 --- a/pages/stack/transactions/transaction-finality.mdx +++ b/pages/stack/transactions/transaction-finality.mdx @@ -85,7 +85,7 @@ Although OP Stack finalizes transactions quickly (within 20 minutes), the 7-day 1. It allows time to dispute the correctness of output state roots posted to Ethereum by the proposer. 2. It provides a security period for withdrawal processing, ensuring the integrity of cross-chain operations. -### Bridge Independence +### Bridge independence Key aspects of bridge systems include: From 8a9ecd0853749b0fc4e008fbd46d2774a213d204 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Thu, 24 Oct 2024 11:52:49 +0100 Subject: [PATCH 272/565] Update pages/stack/transactions/transaction-finality.mdx Co-authored-by: soyboy <85043086+sbvegan@users.noreply.github.com> --- pages/stack/transactions/transaction-finality.mdx | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/pages/stack/transactions/transaction-finality.mdx b/pages/stack/transactions/transaction-finality.mdx index 23ce338ec..0dd679145 100644 --- a/pages/stack/transactions/transaction-finality.mdx +++ b/pages/stack/transactions/transaction-finality.mdx @@ -94,9 +94,7 @@ Key aspects of bridge systems include: * Bridge security does not affect the validity of L2 transactions. * Bridge failures do not cause L2 reorgs or state changes. -### Example: Custom Bridges in OP Stack - -A custom bridge might be developed by a user to allow ERC-20 tokens to move between layers. However, this bridge is application-level and not native to the OP Stack. If there is an issue with the bridge, such as incorrect proof validation, it does not impact the protocol itself but affects the subjective value of the bridged assets. +For example, a custom bridge might be developed to allow ERC-20 tokens to move between layers. However, this bridge is application-level and not native to the OP Stack. If there is an issue with the bridge, such as incorrect proof validation, it does not impact the protocol itself but affects the subjective value of the bridged assets. ### Withdrawal Delays vs. Finality From b2cac6a1b0341d129b48a5414335d6bd4e2e7942 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Thu, 24 Oct 2024 11:52:55 +0100 Subject: [PATCH 273/565] Update pages/stack/transactions/transaction-finality.mdx Co-authored-by: soyboy <85043086+sbvegan@users.noreply.github.com> --- pages/stack/transactions/transaction-finality.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/stack/transactions/transaction-finality.mdx b/pages/stack/transactions/transaction-finality.mdx index 0dd679145..39bc62fd0 100644 --- a/pages/stack/transactions/transaction-finality.mdx +++ b/pages/stack/transactions/transaction-finality.mdx @@ -96,7 +96,7 @@ Key aspects of bridge systems include: For example, a custom bridge might be developed to allow ERC-20 tokens to move between layers. However, this bridge is application-level and not native to the OP Stack. If there is an issue with the bridge, such as incorrect proof validation, it does not impact the protocol itself but affects the subjective value of the bridged assets. -### Withdrawal Delays vs. Finality +### Withdrawal delays vs. finality One common misconception is confusing withdrawal delays with transaction finality: From d27bae68e650301d166b09957b9141c28ab92038 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Thu, 24 Oct 2024 12:17:31 +0100 Subject: [PATCH 274/565] updated the docs --- .../transactions/transaction-finality.mdx | 36 +++++++++---------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/pages/stack/transactions/transaction-finality.mdx b/pages/stack/transactions/transaction-finality.mdx index f14ab7c3b..394239cbe 100644 --- a/pages/stack/transactions/transaction-finality.mdx +++ b/pages/stack/transactions/transaction-finality.mdx @@ -7,12 +7,11 @@ description: Learn about finality in OP Stack and the steps to achieve transacti import Image from 'next/image' import { Callout } from 'nextra/components' -# Overview +# Transaction finality -This guide explains how transaction finality works in OP Stack, covering the fundamental concepts of Fault Proofs and Challenges. +This guide explains how transaction finality works in the OP Stack and addresses common misconceptions around transaction finality and the Fault Proof System. -OP Stack is an extension of Ethereum's consensus mechanism. Instead of running an entirely separate consensus protocol, the OP Stack leverages Ethereum's consensus. -This enables it to take advantage of Ethereum's transaction ordering mechanism and finalize its own blocks without requiring a new consensus layer. +The OP Stack derives its security from Ethereum by utilizing Ethereum's consensus mechanism. Instead of running an entirely separate consensus protocol, the OP Stack derives a layer 2 blockchain by reading the finalized state on Ethereum. ## Sequencer trust assumptions @@ -39,6 +38,11 @@ In the OP Stack, transaction finality progresses through three key stages: When a transaction is submitted to the network, it is either valid or invalid. If the transaction is valid, the sequencer puts it in a block. If it is invalid, the transaction is discarded. There is no way the sequencer can write an invalid transaction to a new block. +## Common misconceptions + +The biggest misconception about transaction finality is that a transaction needs to wait for the entire challenge window to become finalized. +The reality is the OP Stack transaction finality takes minutes, not over a week. This section detangles the concept of transaction finality and the Fault Proof System's challenger mechanism. + ### Reorgs and finality Once a transaction is included in a finalized Ethereum block, it cannot be reorganized. @@ -49,13 +53,9 @@ If an Ethereum reorganization (reorg) occurs: 3. The sequencer typically republishes the same transactions. 4. The system returns to a consistent state after reprocessing. -## Common misconceptions - -The proof system is entirely separate from the core OP Stack protocol. It is an application-level validation system designed to ensure the accuracy of certain claims about the transaction state. - ### The role of proof system -The following is a quick refresher on the Fault Proof System. It is a system designed to ensure the accuracy of certain claims about the transaction state on the L2. +The Fault Proof System is designed to ensure the accuracy of certain claims about the transaction state on the L2. A claim in the context of OP Stack is a statement asserting the state of the system at a specific block height. For instance, a claim might assert that at block 1,000,000, the state hash is `XYZ`. If other participants believe this claim to be incorrect, they can challenge it. @@ -67,6 +67,15 @@ Although OP Stack finalizes transactions quickly (within 20 minutes), the 7-day 1. It allows time to dispute the correctness of output state roots posted to Ethereum by the proposer. 2. It provides a security period for withdrawal processing, ensuring the integrity of cross-chain operations. +### Withdrawal delays vs. finality + +One common misconception is confusing withdrawal delays with transaction finality: + +* Transaction finality occurs in approximately 20 minutes. +* Withdrawal delays (often 7 days) are separate from transaction finality. +* Withdrawal delays are application-level security features. +* These delays affect only L1 withdrawals, not L2 transaction finality. + ### Bridge independence Key aspects of bridge systems include: @@ -78,15 +87,6 @@ Key aspects of bridge systems include: For example, a custom bridge might be developed to allow ERC-20 tokens to move between layers. However, this bridge is application-level and not native to the OP Stack. If there is an issue with the bridge, such as incorrect proof validation, it does not impact the protocol itself but affects the subjective value of the bridged assets. -### Withdrawal delays vs. finality - -One common misconception is confusing withdrawal delays with transaction finality: - -* Transaction finality occurs in approximately 20 minutes. -* Withdrawal delays (often 7 days) are separate from transaction finality. -* Withdrawal delays are application-level security features. -* These delays affect only L1 withdrawals, not L2 transaction finality. - ## Conclusion Transaction finality in the OP Stack relies on Ethereum's consensus mechanism. The OP Stack inherits Ethereum's finality guarantees, while the proof system adds a layer of validation for app-level functionality. From b71df34824fbd4cd8b6e5ddeef31a7c54290d3a7 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Thu, 24 Oct 2024 12:21:21 +0100 Subject: [PATCH 275/565] removed wrong word --- pages/stack/transactions/transaction-finality.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/stack/transactions/transaction-finality.mdx b/pages/stack/transactions/transaction-finality.mdx index 394239cbe..5caa97d12 100644 --- a/pages/stack/transactions/transaction-finality.mdx +++ b/pages/stack/transactions/transaction-finality.mdx @@ -41,7 +41,7 @@ When a transaction is submitted to the network, it is either valid or invalid. I ## Common misconceptions The biggest misconception about transaction finality is that a transaction needs to wait for the entire challenge window to become finalized. -The reality is the OP Stack transaction finality takes minutes, not over a week. This section detangles the concept of transaction finality and the Fault Proof System's challenger mechanism. +The reality is the OP Stack transaction finality takes minutes, not over a week. This section explains transaction finality and the Fault Proof System's challenge mechanism. ### Reorgs and finality Once a transaction is included in a finalized Ethereum block, it cannot be reorganized. From 2b7cbea961fb91a4e1f342f91cf4c123fb676292 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Thu, 24 Oct 2024 12:49:02 +0100 Subject: [PATCH 276/565] Add descriptions --- .../app-developers/tools/supersim.mdx | 3 + .../app-developers/transactions/fees.mdx | 3 + pages/builders/cex-wallet-developers.mdx | 8 +- pages/builders/chain-operators/features.mdx | 3 + pages/builders/chain-operators/hacks.mdx | 3 + pages/builders/chain-operators/management.mdx | 3 + pages/builders/chain-operators/tools.mdx | 3 + pages/builders/chain-operators/tutorials.mdx | 3 + pages/builders/node-operators.mdx | 14 +-- .../builders/node-operators/configuration.mdx | 3 + pages/builders/node-operators/management.mdx | 3 + pages/builders/node-operators/tutorials.mdx | 3 + pages/builders/notices.mdx | 9 +- pages/builders/tools.mdx | 10 +- pages/builders/tools/build.mdx | 3 + pages/builders/tools/connect.mdx | 3 + pages/builders/tools/connect/networks.mdx | 3 + pages/builders/tools/monitor.mdx | 3 + pages/builders/tools/op-tools.mdx | 3 + pages/chain/identity.mdx | 22 ++-- pages/chain/security.mdx | 7 +- pages/chain/testing.mdx | 6 +- pages/connect/contribute.mdx | 11 +- pages/connect/resources.mdx | 5 +- pages/stack/operators.mdx | 3 +- pages/stack/operators/features.mdx | 3 + pages/stack/protocol.mdx | 10 +- pages/stack/protocol/fault-proofs.mdx | 3 + pages/stack/protocol/features.mdx | 3 + pages/stack/protocol/interop.mdx | 3 + pages/stack/protocol/rollup.mdx | 3 + pages/stack/security.mdx | 6 +- pages/stack/transactions.mdx | 3 +- utils/create-breadcrumbs.ts | 108 +++++++++++++++--- 34 files changed, 197 insertions(+), 85 deletions(-) diff --git a/pages/builders/app-developers/tools/supersim.mdx b/pages/builders/app-developers/tools/supersim.mdx index f25adb1bc..e76629fc2 100644 --- a/pages/builders/app-developers/tools/supersim.mdx +++ b/pages/builders/app-developers/tools/supersim.mdx @@ -1,4 +1,7 @@ --- +description: >- + Learn about supersim in the Optimism ecosystem. This guide provides detailed + information and resources about supersim. --- import Supersim from '@/pages/stack/protocol/interop/supersim.mdx' diff --git a/pages/builders/app-developers/transactions/fees.mdx b/pages/builders/app-developers/transactions/fees.mdx index 09af8f1c0..2808ca1f6 100644 --- a/pages/builders/app-developers/transactions/fees.mdx +++ b/pages/builders/app-developers/transactions/fees.mdx @@ -1,4 +1,7 @@ --- +description: >- + Learn about fees in the Optimism ecosystem. This guide provides detailed + information and resources about fees. --- import TransactionFees from '@/pages/stack/transactions/fees.mdx' diff --git a/pages/builders/cex-wallet-developers.mdx b/pages/builders/cex-wallet-developers.mdx index 4c9207779..a5b8c0a56 100644 --- a/pages/builders/cex-wallet-developers.mdx +++ b/pages/builders/cex-wallet-developers.mdx @@ -1,16 +1,16 @@ --- title: Cex Wallet Developers +description: This section provides information on supporting op mainnet in your exchange and supporting op mainnet in your wallet. You'll find guide to help you... lang: en-US --- import { Card, Cards } from 'nextra/components' -# CEX Wallet Developers +# Cex Wallet Developers -This section provides information on supporting OP Stack in your exchange and supporting OP Stack in your wallet. You'll find guides to help you understand and work with these topics. +This section provides information on supporting op mainnet in your exchange and supporting op mainnet in your wallet. You'll find guide to help you understand and work with these topics. - - +
\ No newline at end of file diff --git a/pages/builders/chain-operators/features.mdx b/pages/builders/chain-operators/features.mdx index 00fc79e11..e2a22d516 100644 --- a/pages/builders/chain-operators/features.mdx +++ b/pages/builders/chain-operators/features.mdx @@ -1,6 +1,9 @@ --- title: Features lang: en-US +description: >- + Learn about features in the Optimism ecosystem. This guide provides detailed + information and resources about features. --- import { Card, Cards } from 'nextra/components' diff --git a/pages/builders/chain-operators/hacks.mdx b/pages/builders/chain-operators/hacks.mdx index b64c3c47e..5a30e8912 100644 --- a/pages/builders/chain-operators/hacks.mdx +++ b/pages/builders/chain-operators/hacks.mdx @@ -1,6 +1,9 @@ --- title: Hacks lang: en-US +description: >- + Learn about hacks in the Optimism ecosystem. This guide provides detailed + information and resources about hacks. --- import { Card, Cards } from 'nextra/components' diff --git a/pages/builders/chain-operators/management.mdx b/pages/builders/chain-operators/management.mdx index 6e3f29293..df32978e5 100644 --- a/pages/builders/chain-operators/management.mdx +++ b/pages/builders/chain-operators/management.mdx @@ -1,6 +1,9 @@ --- title: Management lang: en-US +description: >- + Learn about management in the Optimism ecosystem. This guide provides detailed + information and resources about management. --- import { Card, Cards } from 'nextra/components' diff --git a/pages/builders/chain-operators/tools.mdx b/pages/builders/chain-operators/tools.mdx index b91e74678..1b8103c61 100644 --- a/pages/builders/chain-operators/tools.mdx +++ b/pages/builders/chain-operators/tools.mdx @@ -1,6 +1,9 @@ --- title: Tools lang: en-US +description: >- + Learn about tools in the Optimism ecosystem. This guide provides detailed + information and resources about tools. --- import { Card, Cards } from 'nextra/components' diff --git a/pages/builders/chain-operators/tutorials.mdx b/pages/builders/chain-operators/tutorials.mdx index 23206d955..6f99a4661 100644 --- a/pages/builders/chain-operators/tutorials.mdx +++ b/pages/builders/chain-operators/tutorials.mdx @@ -1,6 +1,9 @@ --- title: Tutorials lang: en-US +description: >- + Learn about tutorials in the Optimism ecosystem. This guide provides detailed + information and resources about tutorials. --- import { Card, Cards } from 'nextra/components' diff --git a/pages/builders/node-operators.mdx b/pages/builders/node-operators.mdx index 3e1f573fc..e9535def2 100644 --- a/pages/builders/node-operators.mdx +++ b/pages/builders/node-operators.mdx @@ -1,5 +1,6 @@ --- title: Node Operators +description: This section provides information on node architecture, configuration, json rpc api, management, network upgrades, node software releases, how to run... lang: en-US --- @@ -7,22 +8,15 @@ import { Card, Cards } from 'nextra/components' # Node Operators -This section provides information on node architecture, configuration, json rpc api, management, network upgrade overview, node software releases, how to run a node in the superchain and tutorials. You'll find api, overview, guide, tutorial to help you understand and work with these topics. +This section provides information on node architecture, configuration, json rpc api, management, network upgrades, node software releases, how to run a node in the superchain and tutorials. You'll find api, guide, overview to help you understand and work with these topics. - - - - - - + - - - +
\ No newline at end of file diff --git a/pages/builders/node-operators/configuration.mdx b/pages/builders/node-operators/configuration.mdx index 97f7ef5d5..de45fff09 100644 --- a/pages/builders/node-operators/configuration.mdx +++ b/pages/builders/node-operators/configuration.mdx @@ -1,6 +1,9 @@ --- title: Configuration lang: en-US +description: >- + Learn about configuration in the Optimism ecosystem. This guide provides + detailed information and resources about configuration. --- import { Card, Cards } from 'nextra/components' diff --git a/pages/builders/node-operators/management.mdx b/pages/builders/node-operators/management.mdx index 76ac7721c..428a4593d 100644 --- a/pages/builders/node-operators/management.mdx +++ b/pages/builders/node-operators/management.mdx @@ -1,6 +1,9 @@ --- title: Management lang: en-US +description: >- + Learn about management in the Optimism ecosystem. This guide provides detailed + information and resources about management. --- import { Card, Cards } from 'nextra/components' diff --git a/pages/builders/node-operators/tutorials.mdx b/pages/builders/node-operators/tutorials.mdx index e9d9972f9..de908fd0f 100644 --- a/pages/builders/node-operators/tutorials.mdx +++ b/pages/builders/node-operators/tutorials.mdx @@ -1,6 +1,9 @@ --- title: Tutorials lang: en-US +description: >- + Learn about tutorials in the Optimism ecosystem. This guide provides detailed + information and resources about tutorials. --- import { Card, Cards } from 'nextra/components' diff --git a/pages/builders/notices.mdx b/pages/builders/notices.mdx index fb6895d3e..2f9534e95 100644 --- a/pages/builders/notices.mdx +++ b/pages/builders/notices.mdx @@ -1,5 +1,6 @@ --- title: Notices +description: This section provides information on preparing for fault proofs breaking changes, preparing for granite breaking changes and deprecation of the... lang: en-US --- @@ -7,12 +8,10 @@ import { Card, Cards } from 'nextra/components' # Notices -This section provides information on preparing for fault proofs breaking changes, preparing for granite breaking changes, and SDK deprecation. You'll find an overview and tutorials to help you understand and work with these topics. +This section provides information on preparing for fault proofs breaking changes, preparing for granite breaking changes and deprecation of the optimism sdk. You'll find overview, tutorial to help you understand and work with these topics. - - - - + +
\ No newline at end of file diff --git a/pages/builders/tools.mdx b/pages/builders/tools.mdx index 0117233b6..3bebb9d3b 100644 --- a/pages/builders/tools.mdx +++ b/pages/builders/tools.mdx @@ -1,5 +1,6 @@ --- title: Tools +description: This section provides information on build, connect, fjord fee parameter calculator, monitor, op tools and developer tools. You'll find guide, tool,... lang: en-US --- @@ -7,18 +8,13 @@ import { Card, Cards } from 'nextra/components' # Tools -This section provides information on build, connect, fjord fee parameter calculator, monitor, op tools and developer tools. You'll find guide, reference, tool, overview to help you understand and work with these topics. +This section provides information on build, connect, fjord fee parameter calculator, monitor, op tools and developer tools. You'll find guide, tool, overview to help you understand and work with these topics. - - - - - - +
\ No newline at end of file diff --git a/pages/builders/tools/build.mdx b/pages/builders/tools/build.mdx index 70bcb28fd..0d039842e 100644 --- a/pages/builders/tools/build.mdx +++ b/pages/builders/tools/build.mdx @@ -1,6 +1,9 @@ --- title: Build lang: en-US +description: >- + Learn about build in the Optimism ecosystem. This guide provides detailed + information and resources about build. --- import { Card, Cards } from 'nextra/components' diff --git a/pages/builders/tools/connect.mdx b/pages/builders/tools/connect.mdx index d0d8d2967..50154b1f4 100644 --- a/pages/builders/tools/connect.mdx +++ b/pages/builders/tools/connect.mdx @@ -1,6 +1,9 @@ --- title: Connect lang: en-US +description: >- + Learn about connect in the Optimism ecosystem. This guide provides detailed + information and resources about connect. --- import { Card, Cards } from 'nextra/components' diff --git a/pages/builders/tools/connect/networks.mdx b/pages/builders/tools/connect/networks.mdx index f7a9e91cb..f43ede8e7 100644 --- a/pages/builders/tools/connect/networks.mdx +++ b/pages/builders/tools/connect/networks.mdx @@ -1,4 +1,7 @@ --- +description: >- + Learn about networks in the Optimism ecosystem. This guide provides detailed + information and resources about networks. --- import OPNetworks from '@/pages/chain/networks.mdx' diff --git a/pages/builders/tools/monitor.mdx b/pages/builders/tools/monitor.mdx index 995ffb8bd..848483480 100644 --- a/pages/builders/tools/monitor.mdx +++ b/pages/builders/tools/monitor.mdx @@ -1,6 +1,9 @@ --- title: Monitor lang: en-US +description: >- + Learn about monitor in the Optimism ecosystem. This guide provides detailed + information and resources about monitor. --- import { Card, Cards } from 'nextra/components' diff --git a/pages/builders/tools/op-tools.mdx b/pages/builders/tools/op-tools.mdx index 7d6a5c7af..4335cef41 100644 --- a/pages/builders/tools/op-tools.mdx +++ b/pages/builders/tools/op-tools.mdx @@ -1,6 +1,9 @@ --- title: Op Tools lang: en-US +description: >- + Learn about op tools in the Optimism ecosystem. This guide provides detailed + information and resources about op tools. --- import { Card, Cards } from 'nextra/components' diff --git a/pages/chain/identity.mdx b/pages/chain/identity.mdx index fb4a663f6..faff79b4b 100644 --- a/pages/chain/identity.mdx +++ b/pages/chain/identity.mdx @@ -1,5 +1,6 @@ --- title: Identity +description: This section provides information on about attestations, attestation apps, contracts (eas), individual identity, organizations, identity overview,... lang: en-US --- @@ -7,22 +8,15 @@ import { Card, Cards } from 'nextra/components' # Identity -This section provides information on build decentralized identity apps with attestations, attestation apps, eas contracts, individuals, organizations, introduction, projects and schemas. You'll find guide, reference, overview to help you understand and work with these topics. +This section provides information on about attestations, attestation apps, contracts (eas), individual identity, organizations, identity overview, projects and schemas. You'll find guide, reference, overview to help you understand and work with these topics. - - - - - - - - + + + + - - - + - - +
\ No newline at end of file diff --git a/pages/chain/security.mdx b/pages/chain/security.mdx index aae3f716a..7b4a79f04 100644 --- a/pages/chain/security.mdx +++ b/pages/chain/security.mdx @@ -1,5 +1,6 @@ --- title: Security +description: This section provides information on op mainnet security model, privileged roles in op mainnet and security policy and bug bounty program. lang: en-US --- @@ -7,12 +8,10 @@ import { Card, Cards } from 'nextra/components' # Security -This section provides information on op mainnet security model, privileged roles in op mainnet and security policy and bug bounty program. +This section provides information on op mainnet security model, privileged roles in op mainnet and security policy and bug bounty program. - - - +
\ No newline at end of file diff --git a/pages/chain/testing.mdx b/pages/chain/testing.mdx index d46f79c9d..ae36d1b20 100644 --- a/pages/chain/testing.mdx +++ b/pages/chain/testing.mdx @@ -1,5 +1,6 @@ --- title: Testing +description: This section provides information on running a local development environment and testing apps for op mainnet. You'll find tutorial, guide to help you... lang: en-US --- @@ -7,10 +8,9 @@ import { Card, Cards } from 'nextra/components' # Testing -This section provides information on running a local development environment and testing apps for OP Mainnet. You'll find tutorials and guides to help you understand and work with these topics. +This section provides information on running a local development environment and testing apps for op mainnet. You'll find tutorial, guide to help you understand and work with these topics. - - +
\ No newline at end of file diff --git a/pages/connect/contribute.mdx b/pages/connect/contribute.mdx index b942d205e..90261922e 100644 --- a/pages/connect/contribute.mdx +++ b/pages/connect/contribute.mdx @@ -1,5 +1,6 @@ --- title: Contribute +description: This section provides information on ways to contribute to optimism docs, contribute to the op stack and optimism docs style guide. You'll find... lang: en-US --- @@ -7,12 +8,10 @@ import { Card, Cards } from 'nextra/components' # Contribute -This section provides information on contributing to Optimism docs, contributing to the OP Stack, and the docs style guide. Users will find tutorials, overviews, and guides to help them understand and work with these topics. +This section provides information on ways to contribute to optimism docs, contribute to the op stack and optimism docs style guide. You'll find tutorial, overview, guide to help you understand and work with these topics. - - + - - - + +
\ No newline at end of file diff --git a/pages/connect/resources.mdx b/pages/connect/resources.mdx index a8872f645..8bd4daaa8 100644 --- a/pages/connect/resources.mdx +++ b/pages/connect/resources.mdx @@ -1,5 +1,6 @@ --- title: Resources +description: This section provides information on . You'll find concept to help you understand and work with these topics. lang: en-US --- @@ -7,8 +8,8 @@ import { Card, Cards } from 'nextra/components' # Resources -This section provides information on various resources related to the OP Stack ecosystem. It includes concepts to help users understand and work with these topics. +This section provides information on . You'll find concept to help you understand and work with these topics. - +
\ No newline at end of file diff --git a/pages/stack/operators.mdx b/pages/stack/operators.mdx index 6fba143cd..71031d603 100644 --- a/pages/stack/operators.mdx +++ b/pages/stack/operators.mdx @@ -1,5 +1,6 @@ --- title: Operators +description: This section provides information on . You'll find guide to help you understand and work with these topics. lang: en-US --- @@ -11,4 +12,4 @@ This section provides information on . You'll find guide to help you understand - +
\ No newline at end of file diff --git a/pages/stack/operators/features.mdx b/pages/stack/operators/features.mdx index 0e3865182..3e49e3376 100644 --- a/pages/stack/operators/features.mdx +++ b/pages/stack/operators/features.mdx @@ -1,6 +1,9 @@ --- title: Features lang: en-US +description: >- + Learn about features in the Optimism ecosystem. This guide provides detailed + information and resources about features. --- import { Card, Cards } from 'nextra/components' diff --git a/pages/stack/protocol.mdx b/pages/stack/protocol.mdx index ace2c58a4..789d00f3a 100644 --- a/pages/stack/protocol.mdx +++ b/pages/stack/protocol.mdx @@ -1,5 +1,6 @@ --- title: Protocol +description: This section provides information on derivation pipeline, fault proofs, features, interop, sequencer outages and rollup. You'll find overview, guide... lang: en-US --- @@ -7,18 +8,13 @@ import { Card, Cards } from 'nextra/components' # Protocol -This section provides information on derivation pipeline, fault proofs, features, interop, sequencer outages and rollup. You'll find overview, reference, guide to help you understand and work with these topics. +This section provides information on derivation pipeline, fault proofs, features, interop, sequencer outages and rollup. You'll find overview, guide to help you understand and work with these topics. - - - - - - +
\ No newline at end of file diff --git a/pages/stack/protocol/fault-proofs.mdx b/pages/stack/protocol/fault-proofs.mdx index 2d21c4d0c..7875d85aa 100644 --- a/pages/stack/protocol/fault-proofs.mdx +++ b/pages/stack/protocol/fault-proofs.mdx @@ -1,6 +1,9 @@ --- title: Fault Proofs lang: en-US +description: >- + Learn about fault proofs in the Optimism ecosystem. This guide provides + detailed information and resources about fault proofs. --- import { Card, Cards } from 'nextra/components' diff --git a/pages/stack/protocol/features.mdx b/pages/stack/protocol/features.mdx index be264266a..466ac4e35 100644 --- a/pages/stack/protocol/features.mdx +++ b/pages/stack/protocol/features.mdx @@ -1,6 +1,9 @@ --- title: Features lang: en-US +description: >- + Learn about features in the Optimism ecosystem. This guide provides detailed + information and resources about features. --- import { Card, Cards } from 'nextra/components' diff --git a/pages/stack/protocol/interop.mdx b/pages/stack/protocol/interop.mdx index bcb1ecf0c..83eb9e66e 100644 --- a/pages/stack/protocol/interop.mdx +++ b/pages/stack/protocol/interop.mdx @@ -1,6 +1,9 @@ --- title: Interop lang: en-US +description: >- + Learn about interop in the Optimism ecosystem. This guide provides detailed + information and resources about interop. --- import { Card, Cards } from 'nextra/components' diff --git a/pages/stack/protocol/rollup.mdx b/pages/stack/protocol/rollup.mdx index 487f5882e..4eadc3973 100644 --- a/pages/stack/protocol/rollup.mdx +++ b/pages/stack/protocol/rollup.mdx @@ -1,6 +1,9 @@ --- title: Rollup lang: en-US +description: >- + Learn about rollup in the Optimism ecosystem. This guide provides detailed + information and resources about rollup. --- import { Card, Cards } from 'nextra/components' diff --git a/pages/stack/security.mdx b/pages/stack/security.mdx index 2ca1e092a..f5ae91bc7 100644 --- a/pages/stack/security.mdx +++ b/pages/stack/security.mdx @@ -1,5 +1,6 @@ --- title: Security +description: This section provides information on op stack security faqs and pausing the bridge. lang: en-US --- @@ -7,10 +8,9 @@ import { Card, Cards } from 'nextra/components' # Security -This section provides information on op stack security faqs and pausing the bridge. +This section provides information on op stack security faqs and pausing the bridge. - - +
\ No newline at end of file diff --git a/pages/stack/transactions.mdx b/pages/stack/transactions.mdx index 198b3838a..1c00ec866 100644 --- a/pages/stack/transactions.mdx +++ b/pages/stack/transactions.mdx @@ -1,5 +1,6 @@ --- title: Transactions +description: This section provides information on . You'll find reference to help you understand and work with these topics. lang: en-US --- @@ -11,4 +12,4 @@ This section provides information on . You'll find reference to help you underst - +
\ No newline at end of file diff --git a/utils/create-breadcrumbs.ts b/utils/create-breadcrumbs.ts index fc123a605..d0fc6b12e 100644 --- a/utils/create-breadcrumbs.ts +++ b/utils/create-breadcrumbs.ts @@ -1,5 +1,6 @@ import * as fs from 'fs/promises'; import * as path from 'path'; +import matter from 'gray-matter'; const targetFolders: string[] = ['builders', 'chain', 'stack', 'connect']; const rootDir: string = path.join(__dirname, '..', 'pages'); @@ -8,6 +9,13 @@ interface FileInfo { title: string; url: string; content: string; + description?: string; +} + +interface FrontMatter { + title?: string; + description?: string; + lang?: string; } function toTitleCase(str: string): string { @@ -20,6 +28,38 @@ function uniqueArray(arr: string[]): string[] { return arr.filter((value, index, self) => self.indexOf(value) === index); } +function generateDescription(content: string, title: string): string { + // Remove HTML/MDX tags + const cleanContent = content.replace(/<[^>]+>/g, ' ') + .replace(/\[([^\]]+)\]\([^)]+\)/g, '$1') + .replace(/\n+/g, ' ') + .trim(); + + // Find the first paragraph that's not empty and not a title + const paragraphs = cleanContent.split(/\n\n+/); + let firstRelevantParagraph = paragraphs.find(p => + p.trim() && + !p.startsWith('#') && + p.length > 30 && + !p.includes('import') && + !p.includes('export') + ); + + if (!firstRelevantParagraph) { + return `Learn about ${title.toLowerCase()} in the Optimism ecosystem. This guide provides detailed information and resources about ${title.toLowerCase()}.`; + } + + firstRelevantParagraph = firstRelevantParagraph + .replace(/\s+/g, ' ') + .trim(); + + if (firstRelevantParagraph.length > 150) { + firstRelevantParagraph = firstRelevantParagraph.substr(0, 150).split(' ').slice(0, -1).join(' ') + '...'; + } + + return firstRelevantParagraph; +} + function generateOverview(fileInfos: FileInfo[]): string { const topics = fileInfos.map(file => file.title.toLowerCase()); const uniqueTopics = uniqueArray(topics); @@ -45,6 +85,24 @@ function generateOverview(fileInfos: FileInfo[]): string { return overview; } +const processMdxFile = async (filePath: string, fileContent: string): Promise => { + const { data: frontMatter, content } = matter(fileContent); + + // Only generate and add description if it's completely missing + if (!frontMatter.description) { + const title = frontMatter.title || path.basename(filePath, path.extname(filePath)); + frontMatter.description = generateDescription(content, title); + + // Reconstruct the file with the new frontmatter + const updatedContent = matter.stringify(content, frontMatter); + await fs.writeFile(filePath, updatedContent); + console.log(`Added description to ${filePath}`); + return updatedContent; + } + + return fileContent; +}; + const createMdxFile = async (parentFolderPath: string, folderName: string): Promise => { const folderPath = path.join(parentFolderPath, folderName); const files = await fs.readdir(folderPath); @@ -54,25 +112,47 @@ const createMdxFile = async (parentFolderPath: string, folderName: string): Prom ); const title = toTitleCase(folderName); - const fileInfos: FileInfo[] = []; for (const file of mdFiles) { const filePath = path.join(folderPath, file); - const fileContent = await fs.readFile(filePath, 'utf-8'); - let fileTitle = fileContent.match(/^#\s+(.+)/m)?.[1] || path.basename(file, path.extname(file)); + let fileContent = await fs.readFile(filePath, 'utf-8'); + + // Process individual files to add missing descriptions + fileContent = await processMdxFile(filePath, fileContent); + + const { data: frontMatter } = matter(fileContent); + let fileTitle = frontMatter.title || fileContent.match(/^#\s+(.+)/m)?.[1] || path.basename(file, path.extname(file)); fileTitle = toTitleCase(fileTitle); const relativeUrl = `/${path.relative(rootDir, folderPath)}/${path.basename(file, path.extname(file))}`.replace(/\\/g, '/'); if (!fileInfos.some(info => info.url === relativeUrl)) { - fileInfos.push({ title: fileTitle, url: relativeUrl, content: fileContent }); + fileInfos.push({ + title: fileTitle, + url: relativeUrl, + content: fileContent, + description: frontMatter.description + }); } } const overview = generateOverview(fileInfos); + const mdxFileName = `${folderName}.mdx`; + const mdxFilePath = path.join(parentFolderPath, mdxFileName); + + // Check if the overview file already exists and has a description + let existingDescription: string | undefined; + try { + const existingContent = await fs.readFile(mdxFilePath, 'utf-8'); + const { data: existingFrontMatter } = matter(existingContent); + existingDescription = existingFrontMatter.description; + } catch (error) { + // File doesn't exist yet + } let content = `--- title: ${title} +${existingDescription ? `description: ${existingDescription}` : `description: ${generateDescription(overview, title)}`} lang: en-US --- @@ -91,21 +171,13 @@ ${overview} content += '
'; - const mdxFileName = `${folderName}.mdx`; - const mdxFilePath = path.join(parentFolderPath, mdxFileName); - - // Check if the file already exists and has the same content - try { - const existingContent = await fs.readFile(mdxFilePath, 'utf-8'); - if (existingContent.trim() === content.trim()) { - console.log(`${mdxFileName} in ${parentFolderPath} is up to date. Skipping.`); - return; - } - } catch (error) { + // Only write if the file doesn't exist or if it exists but has no description + if (!existingDescription) { + await fs.writeFile(mdxFilePath, content); + console.log(`Created/Updated ${mdxFileName} in ${parentFolderPath}`); + } else { + console.log(`Skipping ${mdxFileName} in ${parentFolderPath} - existing description preserved`); } - - await fs.writeFile(mdxFilePath, content); - console.log(`Created/Updated ${mdxFileName} in ${parentFolderPath}`); }; const processFolder = async (folderPath: string): Promise => { From 5d10446b998d4138874741e92e6f1415c4972bcc Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Thu, 24 Oct 2024 12:54:07 +0100 Subject: [PATCH 277/565] fix lint issues --- pages/builders/app-developers/tools/supersim.mdx | 2 ++ pages/builders/app-developers/transactions/fees.mdx | 2 ++ pages/builders/app-developers/tutorials.mdx | 1 + pages/builders/cex-wallet-developers.mdx | 3 ++- pages/builders/node-operators.mdx | 9 ++++++++- pages/builders/notices.mdx | 4 +++- pages/builders/tools.mdx | 7 ++++++- pages/builders/tools/connect/networks.mdx | 2 ++ pages/chain/identity.mdx | 9 ++++++++- pages/chain/security.mdx | 6 ++++-- pages/chain/testing.mdx | 3 ++- pages/connect/contribute.mdx | 4 +++- pages/connect/resources.mdx | 2 +- pages/stack/operators.mdx | 2 +- pages/stack/protocol.mdx | 7 ++++++- pages/stack/security.mdx | 5 +++-- pages/stack/transactions.mdx | 2 +- words.txt | 1 - 18 files changed, 55 insertions(+), 16 deletions(-) diff --git a/pages/builders/app-developers/tools/supersim.mdx b/pages/builders/app-developers/tools/supersim.mdx index e76629fc2..afcfb204f 100644 --- a/pages/builders/app-developers/tools/supersim.mdx +++ b/pages/builders/app-developers/tools/supersim.mdx @@ -1,4 +1,6 @@ --- +title: Supersim +lang: en-US description: >- Learn about supersim in the Optimism ecosystem. This guide provides detailed information and resources about supersim. diff --git a/pages/builders/app-developers/transactions/fees.mdx b/pages/builders/app-developers/transactions/fees.mdx index 2808ca1f6..cc3b2e6f3 100644 --- a/pages/builders/app-developers/transactions/fees.mdx +++ b/pages/builders/app-developers/transactions/fees.mdx @@ -1,4 +1,6 @@ --- +title: TransactionFees +lang: en-US description: >- Learn about fees in the Optimism ecosystem. This guide provides detailed information and resources about fees. diff --git a/pages/builders/app-developers/tutorials.mdx b/pages/builders/app-developers/tutorials.mdx index 2eca7c7ff..807686a51 100644 --- a/pages/builders/app-developers/tutorials.mdx +++ b/pages/builders/app-developers/tutorials.mdx @@ -5,6 +5,7 @@ description: A collection of tutorials for app developers building on OP Stack, --- import { Card, Cards } from 'nextra/components' + # Tutorials This section provides information on bridging erc 20 tokens to op mainnet with the optimism sdk, bridging eth to op mainnet with the optimism sdk, communicating between op mainnet and ethereum in solidity, deploying your first contract on op mainnet, estimating transaction costs on op mainnet, tracing deposits and withdrawals, viewing deposits and withdrawals by address, triggering op mainnet transactions from ethereum, bridging your custom erc 20 token using the standard bridge and bridging your standard erc 20 token using the standard bridge. You'll find tutorial to help you understand and work with these topics. diff --git a/pages/builders/cex-wallet-developers.mdx b/pages/builders/cex-wallet-developers.mdx index a5b8c0a56..0debde339 100644 --- a/pages/builders/cex-wallet-developers.mdx +++ b/pages/builders/cex-wallet-developers.mdx @@ -12,5 +12,6 @@ This section provides information on supporting op mainnet in your exchange and + - \ No newline at end of file +
diff --git a/pages/builders/node-operators.mdx b/pages/builders/node-operators.mdx index e9535def2..bd2ffdeba 100644 --- a/pages/builders/node-operators.mdx +++ b/pages/builders/node-operators.mdx @@ -12,11 +12,18 @@ This section provides information on node architecture, configuration, json rpc + + + + + + + - \ No newline at end of file +
diff --git a/pages/builders/notices.mdx b/pages/builders/notices.mdx index 2f9534e95..81a3ecb0a 100644 --- a/pages/builders/notices.mdx +++ b/pages/builders/notices.mdx @@ -12,6 +12,8 @@ This section provides information on preparing for fault proofs breaking changes + + - \ No newline at end of file +
diff --git a/pages/builders/tools.mdx b/pages/builders/tools.mdx index 3bebb9d3b..4541d4cd8 100644 --- a/pages/builders/tools.mdx +++ b/pages/builders/tools.mdx @@ -12,9 +12,14 @@ This section provides information on build, connect, fjord fee parameter calcula + + + + + - \ No newline at end of file + diff --git a/pages/builders/tools/connect/networks.mdx b/pages/builders/tools/connect/networks.mdx index f43ede8e7..7440c93ec 100644 --- a/pages/builders/tools/connect/networks.mdx +++ b/pages/builders/tools/connect/networks.mdx @@ -1,4 +1,6 @@ --- +title: OPNetworks +lang: en-US description: >- Learn about networks in the Optimism ecosystem. This guide provides detailed information and resources about networks. diff --git a/pages/chain/identity.mdx b/pages/chain/identity.mdx index faff79b4b..2f9a23ac9 100644 --- a/pages/chain/identity.mdx +++ b/pages/chain/identity.mdx @@ -12,11 +12,18 @@ This section provides information on about attestations, attestation apps, contr + + + + + + + - \ No newline at end of file + diff --git a/pages/chain/security.mdx b/pages/chain/security.mdx index 7b4a79f04..2a18f2ac2 100644 --- a/pages/chain/security.mdx +++ b/pages/chain/security.mdx @@ -8,10 +8,12 @@ import { Card, Cards } from 'nextra/components' # Security -This section provides information on op mainnet security model, privileged roles in op mainnet and security policy and bug bounty program. +This section provides information on op mainnet security model, privileged roles in op mainnet and security policy and bug bounty program. + + - \ No newline at end of file + diff --git a/pages/chain/testing.mdx b/pages/chain/testing.mdx index ae36d1b20..6fa7d9361 100644 --- a/pages/chain/testing.mdx +++ b/pages/chain/testing.mdx @@ -12,5 +12,6 @@ This section provides information on running a local development environment and + - \ No newline at end of file + diff --git a/pages/connect/contribute.mdx b/pages/connect/contribute.mdx index 90261922e..8ef9eb298 100644 --- a/pages/connect/contribute.mdx +++ b/pages/connect/contribute.mdx @@ -12,6 +12,8 @@ This section provides information on ways to contribute to optimism docs, contri + + - \ No newline at end of file + diff --git a/pages/connect/resources.mdx b/pages/connect/resources.mdx index 8bd4daaa8..80b083fe7 100644 --- a/pages/connect/resources.mdx +++ b/pages/connect/resources.mdx @@ -12,4 +12,4 @@ This section provides information on . You'll find concept to help you understan - \ No newline at end of file + diff --git a/pages/stack/operators.mdx b/pages/stack/operators.mdx index 71031d603..01c05b33c 100644 --- a/pages/stack/operators.mdx +++ b/pages/stack/operators.mdx @@ -12,4 +12,4 @@ This section provides information on . You'll find guide to help you understand - \ No newline at end of file + diff --git a/pages/stack/protocol.mdx b/pages/stack/protocol.mdx index 789d00f3a..05bb23994 100644 --- a/pages/stack/protocol.mdx +++ b/pages/stack/protocol.mdx @@ -12,9 +12,14 @@ This section provides information on derivation pipeline, fault proofs, features + + + + + - \ No newline at end of file + diff --git a/pages/stack/security.mdx b/pages/stack/security.mdx index f5ae91bc7..11e8a0d7c 100644 --- a/pages/stack/security.mdx +++ b/pages/stack/security.mdx @@ -8,9 +8,10 @@ import { Card, Cards } from 'nextra/components' # Security -This section provides information on op stack security faqs and pausing the bridge. +This section provides information on op stack security faqs and pausing the bridge. + - \ No newline at end of file + diff --git a/pages/stack/transactions.mdx b/pages/stack/transactions.mdx index 1c00ec866..929eea7c7 100644 --- a/pages/stack/transactions.mdx +++ b/pages/stack/transactions.mdx @@ -12,4 +12,4 @@ This section provides information on . You'll find reference to help you underst - \ No newline at end of file + diff --git a/words.txt b/words.txt index f0363cc63..5d392acea 100644 --- a/words.txt +++ b/words.txt @@ -320,7 +320,6 @@ Schnorr secp SELFDESTRUCT Sendrawtransactionconditional -sendrawtransactionconditional seqnr SEQUENCERHTTP sequencerhttp From 1a635fa007814ba3627ee5637f87d09bfef410d6 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Thu, 24 Oct 2024 13:34:50 +0100 Subject: [PATCH 278/565] updated lyche --- lychee.toml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lychee.toml b/lychee.toml index b5131db61..60e8be5a2 100644 --- a/lychee.toml +++ b/lychee.toml @@ -36,7 +36,8 @@ exclude = [ 'https://archive.org', 'https://web.archive.org', 'https://mainnet.base.org', - 'https://sepolia.base.org' + 'https://sepolia.base.org', + 'https://optimism.easscan.org' ] # Accept these status codes From aacd64ff0dd514aaaf7f4273fa8aef2f9c843eb7 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Thu, 24 Oct 2024 13:38:52 +0100 Subject: [PATCH 279/565] resolved comments --- pages/stack/transactions/_meta.json | 2 +- .../transactions/transaction-finality.mdx | 24 +++++++++---------- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/pages/stack/transactions/_meta.json b/pages/stack/transactions/_meta.json index e171d7612..1e8b53eb9 100644 --- a/pages/stack/transactions/_meta.json +++ b/pages/stack/transactions/_meta.json @@ -1,8 +1,8 @@ { "fees": "Transaction Fees", "transaction-flow": "Transaction flow", + "transaction-finality":"Transaction finality", "deposit-flow": "Deposit flow", "withdrawal-flow": "Withdrawal flow", - "transaction-finality":"Transaction finality", "forced-transaction": "Forced transaction" } diff --git a/pages/stack/transactions/transaction-finality.mdx b/pages/stack/transactions/transaction-finality.mdx index 5caa97d12..834f7f8b7 100644 --- a/pages/stack/transactions/transaction-finality.mdx +++ b/pages/stack/transactions/transaction-finality.mdx @@ -13,15 +13,6 @@ This guide explains how transaction finality works in the OP Stack and addresses The OP Stack derives its security from Ethereum by utilizing Ethereum's consensus mechanism. Instead of running an entirely separate consensus protocol, the OP Stack derives a layer 2 blockchain by reading the finalized state on Ethereum. -## Sequencer trust assumptions - -The sequencer operates with the following trust assumptions: - -* It can temporarily withhold transactions. -* It may attempt to reorder transactions before L1 publication. -* Once transactions are published on L1, the sequencer cannot modify or censor them. -* The sequencer cannot affect finalized transactions. - ## Transaction finality states In the OP Stack, transaction finality progresses through three key stages: @@ -38,6 +29,15 @@ In the OP Stack, transaction finality progresses through three key stages: When a transaction is submitted to the network, it is either valid or invalid. If the transaction is valid, the sequencer puts it in a block. If it is invalid, the transaction is discarded. There is no way the sequencer can write an invalid transaction to a new block. +## Sequencer trust assumptions + +The sequencer operates with the following trust assumptions: + +* It can temporarily withhold transactions. +* It may attempt to reorder transactions before L1 publication. +* Once transactions are published on L1, the sequencer cannot modify or censor them. +* The sequencer cannot affect finalized transactions. + ## Common misconceptions The biggest misconception about transaction finality is that a transaction needs to wait for the entire challenge window to become finalized. @@ -55,11 +55,11 @@ If an Ethereum reorganization (reorg) occurs: ### The role of proof system -The Fault Proof System is designed to ensure the accuracy of certain claims about the transaction state on the L2. +The Fault Proof System is designed to ensure the accuracy of certain claims about the transaction state on the L2. It provides a way to prove messages from L2 to L1 are correct. It does not have to do with transaction finality. -A claim in the context of OP Stack is a statement asserting the state of the system at a specific block height. For instance, a claim might assert that at block 1,000,000, the state hash is `XYZ`. If other participants believe this claim to be incorrect, they can challenge it. +A claim in the context of OP Stack is a statement asserting the state of the system at a specific block height. For instance, a claim might assert that at block 1,000,000 a certain address has all of the ether on the entire L2. If other participants believe this claim to be incorrect, they can challenge it. -Challenges focus on proving whether a given claim is valid. The outcome of a challenge does not impact the underlying chain. For example, if a claim about the transaction state at a specific block is proven wrong, it only affects the application level functionality and does not alter the OP Stack protocol. +Challenges focus on proving whether a given claim is valid. The outcome of a challenge does not impact the underlying chain. For example, if a claim about a certain address owning all the ether on the L2 is proven wrong, that address would not be able to move the ether from L2 to their address on L1. The challenge period provides time for challenges to be raised and resolved. Although OP Stack finalizes transactions quickly (within 20 minutes), the 7-day challenge window serves two critical purposes: From 71ea8fc85c728dbc3b02c2c78a1ff675c982f856 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Thu, 24 Oct 2024 13:41:38 +0100 Subject: [PATCH 280/565] Used sentence case in meta json file --- pages/stack/transactions/_meta.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/stack/transactions/_meta.json b/pages/stack/transactions/_meta.json index 1e8b53eb9..9fee5861a 100644 --- a/pages/stack/transactions/_meta.json +++ b/pages/stack/transactions/_meta.json @@ -1,5 +1,5 @@ { - "fees": "Transaction Fees", + "fees": "Transaction fees", "transaction-flow": "Transaction flow", "transaction-finality":"Transaction finality", "deposit-flow": "Deposit flow", From d7bec268a0946dcffc99752490bce48c870bb40d Mon Sep 17 00:00:00 2001 From: soyboy <85043086+sbvegan@users.noreply.github.com> Date: Thu, 24 Oct 2024 05:41:59 -0700 Subject: [PATCH 281/565] Update pages/stack/transactions/transaction-finality.mdx --- pages/stack/transactions/transaction-finality.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/stack/transactions/transaction-finality.mdx b/pages/stack/transactions/transaction-finality.mdx index 834f7f8b7..19d3a686f 100644 --- a/pages/stack/transactions/transaction-finality.mdx +++ b/pages/stack/transactions/transaction-finality.mdx @@ -49,7 +49,7 @@ Once a transaction is included in a finalized Ethereum block, it cannot be reorg If an Ethereum reorganization (reorg) occurs: 1. L2 nodes detect the L1 reorg. -2. Affected L2 blocks revert to an "unsafe" status. +2. Affected `safe` L2 blocks revert to an `unsafe` status. 3. The sequencer typically republishes the same transactions. 4. The system returns to a consistent state after reprocessing. From 04bb7e9f157af1ca4cc1152ff2aef8d8a82b4056 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Thu, 24 Oct 2024 13:53:51 +0100 Subject: [PATCH 282/565] Update pages/stack/transactions/transaction-finality.mdx Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> --- pages/stack/transactions/transaction-finality.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/stack/transactions/transaction-finality.mdx b/pages/stack/transactions/transaction-finality.mdx index 19d3a686f..4f7a8ec8c 100644 --- a/pages/stack/transactions/transaction-finality.mdx +++ b/pages/stack/transactions/transaction-finality.mdx @@ -71,7 +71,7 @@ Although OP Stack finalizes transactions quickly (within 20 minutes), the 7-day One common misconception is confusing withdrawal delays with transaction finality: -* Transaction finality occurs in approximately 20 minutes. +* Transaction finality occurs in approximately 10–15 minutes. * Withdrawal delays (often 7 days) are separate from transaction finality. * Withdrawal delays are application-level security features. * These delays affect only L1 withdrawals, not L2 transaction finality. From 83d183b5ed7d6eb9c9119b797728a00358e92f45 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Thu, 24 Oct 2024 14:26:06 +0100 Subject: [PATCH 283/565] use OP stack instead of OP mainnet --- pages/builders/app-developers/contracts.mdx | 4 +- .../builders/app-developers/transactions.mdx | 4 +- pages/builders/cex-wallet-developers.mdx | 4 +- pages/chain/security.mdx | 4 +- pages/chain/testing.mdx | 4 +- utils/create-breadcrumbs.ts | 209 ++++-------------- 6 files changed, 60 insertions(+), 169 deletions(-) diff --git a/pages/builders/app-developers/contracts.mdx b/pages/builders/app-developers/contracts.mdx index 06e1b874a..7ddac908f 100644 --- a/pages/builders/app-developers/contracts.mdx +++ b/pages/builders/app-developers/contracts.mdx @@ -1,7 +1,9 @@ --- title: Contracts lang: en-US -description: Information on Solidity compatibility, contract optimization, and system contracts for OP Mainnet. +description: >- + Information on Solidity compatibility, contract optimization, and system + contracts for OP Stack. --- import { Card, Cards } from 'nextra/components' diff --git a/pages/builders/app-developers/transactions.mdx b/pages/builders/app-developers/transactions.mdx index 847b05e02..e845de2d1 100644 --- a/pages/builders/app-developers/transactions.mdx +++ b/pages/builders/app-developers/transactions.mdx @@ -1,7 +1,9 @@ --- title: Transactions lang: en-US -description: Guide to understanding and working with transactions on OP Mainnet, including fee estimation, gas parameters, and troubleshooting. +description: >- + Guide to understanding and working with transactions on OP Stack, including + fee estimation, gas parameters, and troubleshooting. --- import { Card, Cards } from 'nextra/components' diff --git a/pages/builders/cex-wallet-developers.mdx b/pages/builders/cex-wallet-developers.mdx index 0debde339..976d18070 100644 --- a/pages/builders/cex-wallet-developers.mdx +++ b/pages/builders/cex-wallet-developers.mdx @@ -1,6 +1,8 @@ --- title: Cex Wallet Developers -description: This section provides information on supporting op mainnet in your exchange and supporting op mainnet in your wallet. You'll find guide to help you... +description: >- + This section provides information on supporting OP Stack in your exchange and + supporting OP Stack in your wallet. You'll find guide to help you... lang: en-US --- diff --git a/pages/chain/security.mdx b/pages/chain/security.mdx index 2a18f2ac2..b1a09682c 100644 --- a/pages/chain/security.mdx +++ b/pages/chain/security.mdx @@ -1,6 +1,8 @@ --- title: Security -description: This section provides information on op mainnet security model, privileged roles in op mainnet and security policy and bug bounty program. +description: >- + This section provides information on OP Stack security model, privileged roles + in OP Stack and security policy and bug bounty program. lang: en-US --- diff --git a/pages/chain/testing.mdx b/pages/chain/testing.mdx index 6fa7d9361..923766e11 100644 --- a/pages/chain/testing.mdx +++ b/pages/chain/testing.mdx @@ -1,6 +1,8 @@ --- title: Testing -description: This section provides information on running a local development environment and testing apps for op mainnet. You'll find tutorial, guide to help you... +description: >- + This section provides information on running a local development environment + and testing apps for OP Stack. You'll find tutorial, guide to help you... lang: en-US --- diff --git a/utils/create-breadcrumbs.ts b/utils/create-breadcrumbs.ts index d0fc6b12e..45d73a33b 100644 --- a/utils/create-breadcrumbs.ts +++ b/utils/create-breadcrumbs.ts @@ -8,175 +8,41 @@ const rootDir: string = path.join(__dirname, '..', 'pages'); interface FileInfo { title: string; url: string; - content: string; - description?: string; } -interface FrontMatter { - title?: string; - description?: string; - lang?: string; -} - -function toTitleCase(str: string): string { - return str.split('-').map(word => - word.charAt(0).toUpperCase() + word.slice(1).toLowerCase() - ).join(' '); -} - -function uniqueArray(arr: string[]): string[] { - return arr.filter((value, index, self) => self.indexOf(value) === index); -} - -function generateDescription(content: string, title: string): string { - // Remove HTML/MDX tags - const cleanContent = content.replace(/<[^>]+>/g, ' ') - .replace(/\[([^\]]+)\]\([^)]+\)/g, '$1') - .replace(/\n+/g, ' ') - .trim(); - - // Find the first paragraph that's not empty and not a title - const paragraphs = cleanContent.split(/\n\n+/); - let firstRelevantParagraph = paragraphs.find(p => - p.trim() && - !p.startsWith('#') && - p.length > 30 && - !p.includes('import') && - !p.includes('export') - ); - - if (!firstRelevantParagraph) { - return `Learn about ${title.toLowerCase()} in the Optimism ecosystem. This guide provides detailed information and resources about ${title.toLowerCase()}.`; - } - - firstRelevantParagraph = firstRelevantParagraph - .replace(/\s+/g, ' ') - .trim(); - - if (firstRelevantParagraph.length > 150) { - firstRelevantParagraph = firstRelevantParagraph.substr(0, 150).split(' ').slice(0, -1).join(' ') + '...'; +function updateOPTerminology(description: string): string { + // Skip if already contains "OP Stack" + if (description.includes('OP Stack')) { + return description; } - - return firstRelevantParagraph; -} - -function generateOverview(fileInfos: FileInfo[]): string { - const topics = fileInfos.map(file => file.title.toLowerCase()); - const uniqueTopics = uniqueArray(topics); - let overview = `This section provides information on ${uniqueTopics.slice(0, -1).join(', ')}`; - if (uniqueTopics.length > 1) { - overview += ` and ${uniqueTopics[uniqueTopics.length - 1]}`; - } - overview += '. '; - - const keywordRegex = /\b(guide|tutorial|overview|introduction|tool|concept|api|reference)\b/i; - const keywords = uniqueArray( - fileInfos.flatMap(file => { - const matches = file.content.match(keywordRegex); - return matches ? matches.map(keyword => keyword.toLowerCase()) : []; - }) - ); - - if (keywords.length > 0) { - overview += `You'll find ${keywords.join(', ')} to help you understand and work with these topics.`; - } - - return overview; + // Replace variations of "OP Mainnet" with "OP Stack" + return description + .replace(/\bOP Mainnet\b/gi, 'OP Stack') + .replace(/\bOptimism Mainnet\b/gi, 'OP Stack') + .replace(/\bOptimism mainnet\b/gi, 'OP Stack'); } -const processMdxFile = async (filePath: string, fileContent: string): Promise => { - const { data: frontMatter, content } = matter(fileContent); - - // Only generate and add description if it's completely missing - if (!frontMatter.description) { - const title = frontMatter.title || path.basename(filePath, path.extname(filePath)); - frontMatter.description = generateDescription(content, title); - - // Reconstruct the file with the new frontmatter - const updatedContent = matter.stringify(content, frontMatter); - await fs.writeFile(filePath, updatedContent); - console.log(`Added description to ${filePath}`); - return updatedContent; - } - - return fileContent; -}; - -const createMdxFile = async (parentFolderPath: string, folderName: string): Promise => { - const folderPath = path.join(parentFolderPath, folderName); - const files = await fs.readdir(folderPath); - const mdFiles = files.filter(file => - (file.endsWith('.md') || file.endsWith('.mdx')) && - !file.startsWith('_') - ); - - const title = toTitleCase(folderName); - const fileInfos: FileInfo[] = []; +const updateBreadcrumbFile = async (filePath: string): Promise => { + try { + const content = await fs.readFile(filePath, 'utf-8'); + const { data: frontMatter, content: fileContent } = matter(content); - for (const file of mdFiles) { - const filePath = path.join(folderPath, file); - let fileContent = await fs.readFile(filePath, 'utf-8'); - - // Process individual files to add missing descriptions - fileContent = await processMdxFile(filePath, fileContent); - - const { data: frontMatter } = matter(fileContent); - let fileTitle = frontMatter.title || fileContent.match(/^#\s+(.+)/m)?.[1] || path.basename(file, path.extname(file)); - fileTitle = toTitleCase(fileTitle); - const relativeUrl = `/${path.relative(rootDir, folderPath)}/${path.basename(file, path.extname(file))}`.replace(/\\/g, '/'); - - if (!fileInfos.some(info => info.url === relativeUrl)) { - fileInfos.push({ - title: fileTitle, - url: relativeUrl, - content: fileContent, - description: frontMatter.description - }); + // Only process if there's a description that contains OP Mainnet but not OP Stack + if (frontMatter.description && + frontMatter.description.match(/\bOP Mainnet\b|\bOptimism Mainnet\b/gi) && + !frontMatter.description.includes('OP Stack')) { + + // Update the description + frontMatter.description = updateOPTerminology(frontMatter.description); + + // Write back to file + const updatedContent = matter.stringify(fileContent, frontMatter); + await fs.writeFile(filePath, updatedContent); + console.log(`Updated description in breadcrumb file: ${filePath}`); } - } - - const overview = generateOverview(fileInfos); - const mdxFileName = `${folderName}.mdx`; - const mdxFilePath = path.join(parentFolderPath, mdxFileName); - - // Check if the overview file already exists and has a description - let existingDescription: string | undefined; - try { - const existingContent = await fs.readFile(mdxFilePath, 'utf-8'); - const { data: existingFrontMatter } = matter(existingContent); - existingDescription = existingFrontMatter.description; } catch (error) { - // File doesn't exist yet - } - - let content = `--- -title: ${title} -${existingDescription ? `description: ${existingDescription}` : `description: ${generateDescription(overview, title)}`} -lang: en-US ---- - -import { Card, Cards } from 'nextra/components' - -# ${title} - -${overview} - - -`; - - fileInfos.forEach(({ title, url }) => { - content += ` \n`; - }); - - content += ''; - - // Only write if the file doesn't exist or if it exists but has no description - if (!existingDescription) { - await fs.writeFile(mdxFilePath, content); - console.log(`Created/Updated ${mdxFileName} in ${parentFolderPath}`); - } else { - console.log(`Skipping ${mdxFileName} in ${parentFolderPath} - existing description preserved`); + console.error(`Error processing file ${filePath}:`, error); } }; @@ -189,7 +55,16 @@ const processFolder = async (folderPath: string): Promise => { const stats = await fs.stat(filePath); if (stats.isDirectory()) { - await createMdxFile(folderPath, file); + // Process breadcrumb file for this directory if it exists + const breadcrumbFile = path.join(folderPath, `${file}.mdx`); + try { + await fs.access(breadcrumbFile); + await updateBreadcrumbFile(breadcrumbFile); + } catch (error) { + // Breadcrumb file doesn't exist, skip + } + + // Continue processing subdirectories await processFolder(filePath); } } @@ -199,12 +74,18 @@ const processFolder = async (folderPath: string): Promise => { }; const main = async (): Promise => { + console.log('Starting breadcrumb description update process...'); + console.log('Root directory:', rootDir); + for (const folder of targetFolders) { const folderPath = path.join(rootDir, folder); await processFolder(folderPath); } -}; -main().catch(console.error); + console.log('Finished updating breadcrumb descriptions.'); +}; -console.log('Root directory:', rootDir); \ No newline at end of file +main().catch(error => { + console.error('Error in main process:', error); + process.exit(1); +}); \ No newline at end of file From 0a42b3630f714f4527936a860a2b2a73d0a63320 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Thu, 24 Oct 2024 14:27:03 +0100 Subject: [PATCH 284/565] clean the code --- utils/create-breadcrumbs.ts | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/utils/create-breadcrumbs.ts b/utils/create-breadcrumbs.ts index 45d73a33b..7bfab9804 100644 --- a/utils/create-breadcrumbs.ts +++ b/utils/create-breadcrumbs.ts @@ -11,7 +11,7 @@ interface FileInfo { } function updateOPTerminology(description: string): string { - // Skip if already contains "OP Stack" + if (description.includes('OP Stack')) { return description; } @@ -28,15 +28,13 @@ const updateBreadcrumbFile = async (filePath: string): Promise => { const content = await fs.readFile(filePath, 'utf-8'); const { data: frontMatter, content: fileContent } = matter(content); - // Only process if there's a description that contains OP Mainnet but not OP Stack if (frontMatter.description && frontMatter.description.match(/\bOP Mainnet\b|\bOptimism Mainnet\b/gi) && !frontMatter.description.includes('OP Stack')) { - - // Update the description + frontMatter.description = updateOPTerminology(frontMatter.description); - // Write back to file + const updatedContent = matter.stringify(fileContent, frontMatter); await fs.writeFile(filePath, updatedContent); console.log(`Updated description in breadcrumb file: ${filePath}`); @@ -55,16 +53,16 @@ const processFolder = async (folderPath: string): Promise => { const stats = await fs.stat(filePath); if (stats.isDirectory()) { - // Process breadcrumb file for this directory if it exists + const breadcrumbFile = path.join(folderPath, `${file}.mdx`); try { await fs.access(breadcrumbFile); await updateBreadcrumbFile(breadcrumbFile); } catch (error) { - // Breadcrumb file doesn't exist, skip + } - // Continue processing subdirectories + await processFolder(filePath); } } From 91013c7c0c09e9cb31c93eea4b7990b1f7f1a5d5 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Thu, 24 Oct 2024 14:32:16 +0100 Subject: [PATCH 285/565] update text --- pages/builders/cex-wallet-developers.mdx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pages/builders/cex-wallet-developers.mdx b/pages/builders/cex-wallet-developers.mdx index 976d18070..0ac230932 100644 --- a/pages/builders/cex-wallet-developers.mdx +++ b/pages/builders/cex-wallet-developers.mdx @@ -1,5 +1,5 @@ --- -title: Cex Wallet Developers +title: CEX Wallet Developers description: >- This section provides information on supporting OP Stack in your exchange and supporting OP Stack in your wallet. You'll find guide to help you... @@ -8,7 +8,7 @@ lang: en-US import { Card, Cards } from 'nextra/components' -# Cex Wallet Developers +# CEX Wallet Developers This section provides information on supporting op mainnet in your exchange and supporting op mainnet in your wallet. You'll find guide to help you understand and work with these topics. From d766fbf010f67dfd8683d76be116fa1bc06ecaf0 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Thu, 24 Oct 2024 14:38:56 +0100 Subject: [PATCH 286/565] fix lint issues --- pages/builders.mdx | 2 +- pages/builders/node-operators/configuration.mdx | 2 +- pages/stack/protocol/interop.mdx | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pages/builders.mdx b/pages/builders.mdx index 810cb0fcd..ab69e59b6 100644 --- a/pages/builders.mdx +++ b/pages/builders.mdx @@ -8,7 +8,7 @@ import { Card, Cards } from 'nextra/components' # Builders -The fixture is the main abstraction in React Cosmos. It represents a component example that can be rendered in isolation. A fixture file is generally colocated with its related component file. +Welcome to the Builders section. Here you'll find resources and guides for developers, operators, and other stakeholders involved in building on OP Stack. Explore the categories below to find the information you need. diff --git a/pages/builders/node-operators/configuration.mdx b/pages/builders/node-operators/configuration.mdx index de45fff09..da2c8f8a8 100644 --- a/pages/builders/node-operators/configuration.mdx +++ b/pages/builders/node-operators/configuration.mdx @@ -10,7 +10,7 @@ import { Card, Cards } from 'nextra/components' # Configuration -This section provides information on node base configuration, consensus layer configuration options (op node) and execution layer configuration options (op geth). You'll find api to help you understand and work with these topics. +This section provides information on node base configuration, consensus layer configuration options (OP Node), and execution layer configuration options (OP Geth). You'll find information to help you understand and work with these topics. diff --git a/pages/stack/protocol/interop.mdx b/pages/stack/protocol/interop.mdx index 83eb9e66e..499809656 100644 --- a/pages/stack/protocol/interop.mdx +++ b/pages/stack/protocol/interop.mdx @@ -10,7 +10,7 @@ import { Card, Cards } from 'nextra/components' # Interop -This section provides information on anatomy of a cross chain message, interoperability explainer and supersim multichain development environment. You'll find overview, guide, tool to help you understand and work with these topics. +This section provides information on the anatomy of a cross-chain message, an interoperability explainer, and the Supersim multichain development environment. You'll find an overview, guide, and tools to help you understand and work with these topics. From 1f7af3295009e1e9bd83013d98406ab85f9dc6b4 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Thu, 24 Oct 2024 14:55:39 +0100 Subject: [PATCH 287/565] wrote docs for teh script --- notes/breadcrumbs.md | 36 ++++++++++++++++++++++++++++++++++++ words.txt | 2 -- 2 files changed, 36 insertions(+), 2 deletions(-) create mode 100644 notes/breadcrumbs.md diff --git a/notes/breadcrumbs.md b/notes/breadcrumbs.md new file mode 100644 index 000000000..e30512e7f --- /dev/null +++ b/notes/breadcrumbs.md @@ -0,0 +1,36 @@ +# Documentation Breadcrumbs Script + +Quick guide on using our breadcrumbs automation script for the OP Stack documentation. + +## What the Script Does + +* Creates `.mdx` files for each folder (breadcrumb pages) +* Populates Card components linking to contained files +* Preserves existing descriptions that already +* Maintains consistent navigation structure + +## Using the Script + +Breadcrumbs for the docs can be generated by running: + +```bash +pnpm create-breadcrumbs +``` + +### What to Watch For + +1. **Before Running** + * Commit your current changes + * Ensure you're in the docs root directory + * Target folders should exist: `builders`, `chain`, `stack`, `connect` + +2. **After Running** + * Review generated `.mdx` files in each folder + * Check updated descriptions + * Verify Card components and links + +## Common Issues + +* ***Script fails**: Ensure you're in the root directory +* **No files generated**: Check folder structure matches expected paths +* **Unexpected content**: Review git diff before committing \ No newline at end of file diff --git a/words.txt b/words.txt index 1399efb94..c4cf76483 100644 --- a/words.txt +++ b/words.txt @@ -204,8 +204,6 @@ MTHI MTLO MULT multiaddr -breadcrumbs -Multichain multichain multiclient multisigs From a7b085d345f67b1b254c9a42374fd23078b6f032 Mon Sep 17 00:00:00 2001 From: soyboy <85043086+sbvegan@users.noreply.github.com> Date: Thu, 24 Oct 2024 16:02:18 -0700 Subject: [PATCH 288/565] Update sdk-deprecation.mdx --- pages/builders/notices/sdk-deprecation.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/builders/notices/sdk-deprecation.mdx b/pages/builders/notices/sdk-deprecation.mdx index b67ba7eff..f7316efd2 100644 --- a/pages/builders/notices/sdk-deprecation.mdx +++ b/pages/builders/notices/sdk-deprecation.mdx @@ -67,6 +67,6 @@ Node operators should take the following steps: For further assistance or questions about this migration, feel free to reach through the following channels: -* Join our [community forum](https://community.optimism.io/) for discussions and support * Connect with us on [Discord](https://discord.gg/optimism) for community support +* Ask a question on our [developer forum](https://github.com/ethereum-optimism/developers/discussions) for discussions and support * Open an [issue on our GitHub repository](https://github.com/ethereum-optimism/docs/issues) for documentation-related concerns From 7519c7dcd32bad1ca9075effec902502bddffbfe Mon Sep 17 00:00:00 2001 From: soyboy <85043086+sbvegan@users.noreply.github.com> Date: Thu, 24 Oct 2024 17:08:48 -0600 Subject: [PATCH 289/565] linking to viem --- pages/builders/notices/sdk-deprecation.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/builders/notices/sdk-deprecation.mdx b/pages/builders/notices/sdk-deprecation.mdx index f7316efd2..9521d6092 100644 --- a/pages/builders/notices/sdk-deprecation.mdx +++ b/pages/builders/notices/sdk-deprecation.mdx @@ -10,7 +10,7 @@ The Optimism SDK will officially be deprecated in Q1 2025. The project is shifti ### Breaking changes to expect -The migration from the Optimism SDK to `viem` library brings several breaking changes: +The migration from the Optimism SDK to [viem](https://viem.sh/op-stack) library brings several breaking changes: * **Transaction estimation**: Methods for estimating gas fees will now leverage `viem` APIs. * **Bridging**: All token bridging actions must be updated to use the `viem` library bridging methods. From e9607554eaf5763578b4090f3bcb25f7763e75c6 Mon Sep 17 00:00:00 2001 From: soyboy <85043086+sbvegan@users.noreply.github.com> Date: Thu, 24 Oct 2024 17:18:23 -0600 Subject: [PATCH 290/565] Update pages/builders/notices/sdk-deprecation.mdx Co-authored-by: Bradley Camacho <42678939+bradleycamacho@users.noreply.github.com> --- pages/builders/notices/sdk-deprecation.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/builders/notices/sdk-deprecation.mdx b/pages/builders/notices/sdk-deprecation.mdx index 9521d6092..4ec4765e9 100644 --- a/pages/builders/notices/sdk-deprecation.mdx +++ b/pages/builders/notices/sdk-deprecation.mdx @@ -68,5 +68,5 @@ Node operators should take the following steps: For further assistance or questions about this migration, feel free to reach through the following channels: * Connect with us on [Discord](https://discord.gg/optimism) for community support -* Ask a question on our [developer forum](https://github.com/ethereum-optimism/developers/discussions) for discussions and support +* Join us on our [developer forum](https://github.com/ethereum-optimism/developers/discussions) for discussions, questions, and general support. * Open an [issue on our GitHub repository](https://github.com/ethereum-optimism/docs/issues) for documentation-related concerns From c502be93ed461a89f5dbe69ca3b864f9be80263e Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Fri, 25 Oct 2024 09:38:03 +0100 Subject: [PATCH 291/565] updated content --- pages/builders/app-developers/contracts.mdx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pages/builders/app-developers/contracts.mdx b/pages/builders/app-developers/contracts.mdx index 7ddac908f..6c01b91e2 100644 --- a/pages/builders/app-developers/contracts.mdx +++ b/pages/builders/app-developers/contracts.mdx @@ -10,12 +10,12 @@ import { Card, Cards } from 'nextra/components' # Contracts -This section provides information on Solidity compatibility, contract optimization on OP Mainnet, and using OP Mainnet system contracts. You'll find guides and tutorials to help you understand and work with these topics. +This section provides information on Solidity compatibility, contract optimization on OP Stack, and using OP Stack system contracts. You'll find guides and tutorials to help you understand and work with these topics. - + - + From 7c0e0846881a369370c2b17e991d7b7c4baa66cd Mon Sep 17 00:00:00 2001 From: Richard Gregory Date: Fri, 25 Oct 2024 11:55:54 +0100 Subject: [PATCH 292/565] Add cross-domain section --- pages/stack/transactions/_meta.json | 3 +- pages/stack/transactions/cross-domain.mdx | 62 ++++++++++++++++++ .../op-stack/protocol/op-cross-chain-txn.jpeg | Bin 0 -> 469891 bytes 3 files changed, 64 insertions(+), 1 deletion(-) create mode 100644 pages/stack/transactions/cross-domain.mdx create mode 100644 public/img/op-stack/protocol/op-cross-chain-txn.jpeg diff --git a/pages/stack/transactions/_meta.json b/pages/stack/transactions/_meta.json index 20f41a7f2..e4237e0ce 100644 --- a/pages/stack/transactions/_meta.json +++ b/pages/stack/transactions/_meta.json @@ -3,5 +3,6 @@ "transaction-flow": "Transaction Flow", "deposit-flow": "Deposit Flow", "withdrawal-flow": "Withdrawal Flow", - "forced-transaction": "Forced Transaction" + "forced-transaction": "Forced Transaction", + "cross-domain": "Cross Domain Transaction" } diff --git a/pages/stack/transactions/cross-domain.mdx b/pages/stack/transactions/cross-domain.mdx new file mode 100644 index 000000000..846141f22 --- /dev/null +++ b/pages/stack/transactions/cross-domain.mdx @@ -0,0 +1,62 @@ +--- +title: Cross-Domain +lang: en-US +description: An overview of the lifecycle of an OP Stack cross-chain transaction, detailing the flow of transactions between Layer 2 and Layer 1. +--- + +import { Callout, Steps } from 'nextra/components' + +# Cross-Domain Overview + +This overview provides a detailed walkthrough of the lifecycle of cross-chain transactions, covering deposits, withdrawals, and transaction flows between L1 and L2. The diagram below illustrates the main components and steps involved. + +![Lifecycle of an OP Stack Crosschain Transaction.](/img/op-stack/protocol/op-cross-chain-txn.jpeg) +_Figure 1: The Lifecycle of an OP Stack Crosschain Transaction_ + +Cross-domain communication in the OP Stack involves moving assets and messages between L1 and L2. Key components, such as bridges, messengers, and portals, ensure these transactions are executed securely and transparently. This page breaks down the lifecycle of a cross-chain transaction into three main flows: Deposit Flow, Transaction Flow (Tx Flow), and Withdrawal Flow. + +## Deposit Flow + +Depositing assets from L1 to L2 follows a structured process that ensures funds are securely transferred and credited to the user's L2 account. The steps are as follows: + +1. **User Initiation (L1 Standard Bridge):** + The user initiates a deposit by sending assets (e.g., ETH or tokens) to the L1 Standard Bridge contract. This contract receives the assets and prepares a message to relay to L2. + +2. **Message Relaying (L1 CrossDomain Messenger):** + The L1 Standard Bridge sends a message to the L1 CrossDomain Messenger, which is responsible for handling inter-layer communication. The messenger emits a `TransactionDeposited` event to signal the start of the deposit process. + +3. **Processing on L2 (OptimismPortal):** + The message is received by the OptimismPortal on L2. Here, the deposited assets are held securely until the transaction is finalized. The portal initiates the deposit transaction, updating the user's balance on L2. + +4. **Finalization (L2 CrossDomain Messenger):** + The L2 CrossDomain Messenger processes the deposit by updating the user's account balance, and making the assets available for use on L2. + +## Transaction (Tx) Flow + +The transaction flow covers the steps involved in cross-domain message passing and state updates between L1 and L2: + +1. **Message Queuing (L2ToL1MessagePasser):** +During cross-layer communication, certain messages are queued for processing. The `L2ToL1MessagePasser` prepares these messages for state updates or withdrawals, ensuring they are available for proving and relaying. + +2. **State Reading and Proving (L2OutputOracle):** +The `L2OutputOracle` plays a critical role in validating state changes between L1 and L2. It reads the current state and submits a proposal using `proposeL2Output()`. This proposal includes information about queued messages or state changes that need to be relayed to L1. + +3. **Message Relay (CrossDomain Messengers):** +Messages are relayed between the L1 and L2 CrossDomain Messengers as part of transaction execution. This includes updating state or finalizing transactions on the target layer. + + +## Withdrawal Flow + +Withdrawing assets from L2 back to L1 involves a multi-step process to ensure the transaction is validated and executed correctly: + +1. **User Initiation (L2 Standard Bridge):** +The withdrawal process starts when the user calls the `withdraw()` function on the L2 Standard Bridge, specifying the amount and asset to be withdrawn. + +2. **Message Relay (L2 CrossDomain Messenger):** +The L2 CrossDomain Messenger receives the withdrawal request and relays the message for processing. It may involve queuing the message in the `L2ToL1MessagePasser` for further steps. + +3. **Proving and Finalization (L2OutputOracle):** +The withdrawal message is proven using the `L2OutputOracle`, which submits a state output proving that the withdrawal is legitimate. This step involves reading the state and generating the required proofs during the proving time. + +4. **Finalization (L1 CrossDomain Messenger and L1 Standard Bridge):** +Once the withdrawal is proven, the message is finalized by the L1 CrossDomain Messenger. The L1 Standard Bridge completes the process by releasing the withdrawn assets to the user's L1 account. diff --git a/public/img/op-stack/protocol/op-cross-chain-txn.jpeg b/public/img/op-stack/protocol/op-cross-chain-txn.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..396668654df81cc5ef9b1d674904185d19faac53 GIT binary patch literal 469891 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

3}D( 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 z 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

;@Ec)k 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

    iGBWb%d9X#;MsZ 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 |yDs_x)Q!fc2&W7JaL_Zu` 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

    +NSGd{9u<;!Nn|$d*)ApE4_$^ZHn0(IG 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 Date: Fri, 25 Oct 2024 13:18:32 +0100 Subject: [PATCH 293/565] Update pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx Co-authored-by: Bradley Camacho <42678939+bradleycamacho@users.noreply.github.com> --- .../builders/app-developers/tutorials/cross-dom-bridge-eth.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx b/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx index 40f13af05..79db75bde 100644 --- a/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx +++ b/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx @@ -294,7 +294,7 @@ Now you're going to repeat the process in reverse to bridge some ETH from L2 to * Challenge Period: The 7-day withdrawal challenge Period is crucial for security. * Gas Costs: Withdrawals involve transactions on both L2 and L1, each incurring gas fees. * Private Key Handling: Use secure key management practices in real applications. - * RPC Endpoint Security: Keep your API key (or any RPC endpoint) secure. + * RPC endpoint security: Keep your API key (or any RPC endpoint) secure. ## Next Steps From 590d5282da4a3ed163a414b175ac1728b6fed080 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Fri, 25 Oct 2024 13:18:47 +0100 Subject: [PATCH 294/565] Update pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx Co-authored-by: Bradley Camacho <42678939+bradleycamacho@users.noreply.github.com> --- .../builders/app-developers/tutorials/cross-dom-bridge-eth.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx b/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx index 79db75bde..886722146 100644 --- a/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx +++ b/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx @@ -293,7 +293,7 @@ Now you're going to repeat the process in reverse to bridge some ETH from L2 to * Challenge Period: The 7-day withdrawal challenge Period is crucial for security. * Gas Costs: Withdrawals involve transactions on both L2 and L1, each incurring gas fees. - * Private Key Handling: Use secure key management practices in real applications. + * Private Key handling: Use secure key management practices in real applications. * RPC endpoint security: Keep your API key (or any RPC endpoint) secure. From d8b5d319e43d8390b88bca508a38284d331efad6 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Fri, 25 Oct 2024 13:19:00 +0100 Subject: [PATCH 295/565] Update pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx Co-authored-by: Bradley Camacho <42678939+bradleycamacho@users.noreply.github.com> --- .../builders/app-developers/tutorials/cross-dom-bridge-eth.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx b/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx index 886722146..ea15e2f10 100644 --- a/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx +++ b/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx @@ -292,7 +292,7 @@ Now you're going to repeat the process in reverse to bridge some ETH from L2 to * Challenge Period: The 7-day withdrawal challenge Period is crucial for security. - * Gas Costs: Withdrawals involve transactions on both L2 and L1, each incurring gas fees. + * Gas costs: Withdrawals involve transactions on both L2 and L1, each incurring gas fees. * Private Key handling: Use secure key management practices in real applications. * RPC endpoint security: Keep your API key (or any RPC endpoint) secure. From 4e4e6458a988e37327972a98aa5068c694efa94c Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Fri, 25 Oct 2024 13:19:11 +0100 Subject: [PATCH 296/565] Update pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx Co-authored-by: Bradley Camacho <42678939+bradleycamacho@users.noreply.github.com> --- .../builders/app-developers/tutorials/cross-dom-bridge-eth.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx b/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx index ea15e2f10..7aab4593d 100644 --- a/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx +++ b/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx @@ -291,7 +291,7 @@ Now you're going to repeat the process in reverse to bridge some ETH from L2 to ## Important Considerations - * Challenge Period: The 7-day withdrawal challenge Period is crucial for security. + * Challenge period: The 7-day withdrawal challenge Period is crucial for security. * Gas costs: Withdrawals involve transactions on both L2 and L1, each incurring gas fees. * Private Key handling: Use secure key management practices in real applications. * RPC endpoint security: Keep your API key (or any RPC endpoint) secure. From 19b6e6dc199135abbc283df9d33ed0d41b142486 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Fri, 25 Oct 2024 13:19:48 +0100 Subject: [PATCH 297/565] Update public/tutorials/cross-dom-bridge-eth.js Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> --- public/tutorials/cross-dom-bridge-eth.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/tutorials/cross-dom-bridge-eth.js b/public/tutorials/cross-dom-bridge-eth.js index 567d37bd4..82abb4d6e 100644 --- a/public/tutorials/cross-dom-bridge-eth.js +++ b/public/tutorials/cross-dom-bridge-eth.js @@ -74,7 +74,7 @@ to: account.address, const withdrawalHash = await walletClientL2.initiateWithdrawal(withdrawalArgs); console.log(`Withdrawal transaction hash on L2: ${withdrawalHash}`); -const withdrawalReceipt = await publicClientL2.waitForTransactionReceipt({ withdrawalHash }); +const withdrawalReceipt = await publicClientL2.waitForTransactionReceipt({ hash: withdrawalHash }); console.log('L2 transaction confirmed:', withdrawalReceipt); const { output, withdrawal } = await publicClientL1.waitToProve({ From 4d42decf4f3ee01057b93a8343c8f1e3b70e14ba Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Fri, 25 Oct 2024 13:20:36 +0100 Subject: [PATCH 298/565] Update pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx Co-authored-by: Bradley Camacho <42678939+bradleycamacho@users.noreply.github.com> --- .../builders/app-developers/tutorials/cross-dom-bridge-eth.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx b/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx index 7aab4593d..7cc945d1d 100644 --- a/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx +++ b/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx @@ -1,5 +1,5 @@ --- -title: Bridging ETH with Viem +title: Bridging ETH with viem lang: en-US description: Learn how to use Viem to transfer ETH between Layer 1 (Ethereum or Sepolia) and Layer 2 (OP Mainnet or OP Sepolia). --- From 5036478dfbc171f306f86bc1f11b6736904415a8 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Fri, 25 Oct 2024 13:21:01 +0100 Subject: [PATCH 299/565] Update pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx Co-authored-by: Bradley Camacho <42678939+bradleycamacho@users.noreply.github.com> --- .../builders/app-developers/tutorials/cross-dom-bridge-eth.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx b/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx index 7cc945d1d..cd7dadc20 100644 --- a/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx +++ b/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx @@ -6,7 +6,7 @@ description: Learn how to use Viem to transfer ETH between Layer 1 (Ethereum or import { Callout, Steps, Tabs } from 'nextra/components' -# Bridging ETH to OP Mainnet With Viem +# Bridging ETH to OP Mainnet with viem This tutorial explains how you can use [Viem](https://viem.sh) to bridge ETH from L1 (Ethereum or Sepolia) to L2 (OP Mainnet or OP Sepolia). Viem is a TypeScript interface for Ethereum that provides low-level stateless primitives for interacting with Ethereum. From f09a0185f54690914639c1a464103dab95acfd65 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Fri, 25 Oct 2024 13:33:04 +0100 Subject: [PATCH 300/565] updated the content --- .../tutorials/cross-dom-bridge-eth.mdx | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx b/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx index cd7dadc20..9e8825936 100644 --- a/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx +++ b/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx @@ -26,20 +26,20 @@ If you want to use a network that isn't included by default, you can add it to V * [node](https://nodejs.org/en/) * [pnpm](https://pnpm.io/installation) -## Create a Demo Project +## Create a demo project You're going to use Viem for this tutorial. Since Viem is a [Node.js](https://nodejs.org/en/) library, you'll need to create a Node.js project to use it. - {

    Make a Project Folder

    } + {

    Make a project folder

    } ```bash - mkdir op-sample-project - cd op-sample-project + mkdir bridge-eth + cd bridge-eth ``` - {

    Initialize the Project

    } + {

    Initialize the project

    } ```bash pnpm init @@ -66,7 +66,7 @@ You will need to get some ETH on Sepolia to follow along. You can use [this faucet](https://sepoliafaucet.com) to get ETH on Sepolia. -## Add a Private Key to Your Environment +## Add a private key to Your environment You need a private key in order to sign transactions. Set your private key as an environment variable with the export command. @@ -87,7 +87,7 @@ node This will bring up a Node REPL prompt that allows you to run JavaScript code. -## Import Dependencies +## Import dependencies You need to import some dependencies into your Node REPL session. @@ -206,7 +206,7 @@ You just bridged some ETH from L1 to L2. Nice! Now you're going to repeat the process in reverse to bridge some ETH from L2 to L1. - + {

    Create the withdrawal transaction

    } @@ -217,7 +217,7 @@ Now you're going to repeat the process in reverse to bridge some ETH from L2 to ```js file=/public/tutorials/cross-dom-bridge-eth.js#L68-L72 hash=02315a1703631987498c2ac2684d6968 ``` - {

    Executing the Withdrawal

    } + {

    Executing the withdrawal

    } This sends the withdrawal transaction on L2, which initiates the withdrawal process on L2 and logs a transaction hash for tracking the withdrawal. From 3473fec8d5d9e61bef9cce8a706f54dc78d35ecd Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Fri, 25 Oct 2024 13:46:51 +0100 Subject: [PATCH 301/565] fix merge conflixt --- pnpm-lock.yaml | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9aacb1ac7..82ccb3dcd 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -60,7 +60,7 @@ importers: version: 18.3.1(react@18.3.1) search-insights: specifier: ^2.15.0 - version: 2.15.0 + version: 2.17.2 viem: specifier: ^2.21.18 version: 2.21.18(typescript@5.4.5)(zod@3.23.8) @@ -868,6 +868,9 @@ packages: '@scure/bip39@1.4.0': resolution: {integrity: sha512-BEEm6p8IueV/ZTfQLp/0vhw4NPnT9oWf5+28nvmeUICjP99f4vr2d+qc7AVGDDtwRep6ifR43Yed9ERVmiITzw==} + '@swc/counter@0.1.3': + resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} + '@swc/helpers@0.5.2': resolution: {integrity: sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==} @@ -4645,6 +4648,11 @@ snapshots: '@noble/hashes': 1.3.3 '@scure/base': 1.1.6 + '@scure/bip39@1.4.0': + dependencies: + '@noble/hashes': 1.5.0 + '@scure/base': 1.1.9 + '@swc/counter@0.1.3': {} '@swc/helpers@0.5.2': From 4b208033118ed92c373836a7a49649265ed96e78 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Fri, 25 Oct 2024 14:52:11 +0100 Subject: [PATCH 302/565] updated file imports --- next-env.d.ts | 2 +- .../app-developers/tutorials/cross-dom-bridge-eth.mdx | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/next-env.d.ts b/next-env.d.ts index 4f11a03dc..a4a7b3f5c 100644 --- a/next-env.d.ts +++ b/next-env.d.ts @@ -2,4 +2,4 @@ /// // NOTE: This file should not be edited -// see https://nextjs.org/docs/basic-features/typescript for more information. +// see https://nextjs.org/docs/pages/building-your-application/configuring/typescript for more information. diff --git a/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx b/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx index 69b18e1d1..129d1f698 100644 --- a/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx +++ b/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx @@ -213,7 +213,7 @@ Now you're going to repeat the process in reverse to bridge some ETH from L2 to Uses `buildWithdrawalTransaction` to create the withdrawal parameters. Converts the withdrawal amount to `wei` and specifies the recipient on L1. - ```js file=/public/tutorials/cross-dom-bridge-eth.js#L68-L72 hash=02315a1703631987498c2ac2684d6968 + ```js file=/public/tutorials/cross-dom-bridge-eth.js#L68-L72 hash=cd22b075bb05dc05ac92c5502aa0568f ``` {

    Executing the withdrawal

    } @@ -227,7 +227,7 @@ Now you're going to repeat the process in reverse to bridge some ETH from L2 to Wait one hour (max) for the L2 Output containing the transaction to be proposed, and log the receipt, which contains important details like the block number etc. - ```js file=/public/tutorials/cross-dom-bridge-eth.js#L77-L78 hash=3851af1dc0c3dba9d9de818fb02364e3 + ```js file=/public/tutorials/cross-dom-bridge-eth.js#L77-L78 hash=37f83c57e384910a0e5bf7040c52aa7a ``` {

    Wait for withdrawal prove

    } @@ -281,7 +281,7 @@ Now you're going to repeat the process in reverse to bridge some ETH from L2 to - ```js file=/public/tutorials/cross-dom-bridge-eth.js#L68-L111 hash=cd8d5c4858141d43b519cd7267cd89a9 + ```js file=/public/tutorials/cross-dom-bridge-eth.js#L68-L111 hash=4a8d4d442b95aaf0853147420eb131af ``` From 421193ed8c46223b21c12dee5a854cf6794990f3 Mon Sep 17 00:00:00 2001 From: soyboy <85043086+sbvegan@users.noreply.github.com> Date: Fri, 25 Oct 2024 09:13:47 -0600 Subject: [PATCH 303/565] adding address details for opcm --- pages/stack/opcm.mdx | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/pages/stack/opcm.mdx b/pages/stack/opcm.mdx index 49687acfb..aa4bac0c5 100644 --- a/pages/stack/opcm.mdx +++ b/pages/stack/opcm.mdx @@ -11,7 +11,10 @@ import { Callout, Tabs, Steps } from 'nextra/components' The OP Contracts Manager is a contract that deploys the L1 contracts for an OP Stack chain in a single transaction. It provides a minimal set of user-configurable parameters to ensure that the resulting chain meets the standard configuration requirements. -The version deployed is always a governance-approved contract release. The set of governance approved contract releases can be found on the Optimism Monorepo releases page, and is the set of releases named `op-contracts/vX.Y.Z`. +The version deployed is always a governance-approved contract release. The set of governance approved contract releases can be found on the Optimism Monorepo releases page, and is the set of releases named `op-contracts/vX.Y.Z`. It deploys the [Fault Proof System](/stack/fault-proofs/explainer), using the [PermissionedDisputeGame](/stack/smart-contracts#permissioneddisputegame). + +* Ethereum address: [0x18cec91779995ad14c880e4095456b9147160790](https://etherscan.io/address/0x18cec91779995ad14c880e4095456b9147160790) +* Sepolia address: [0xf564eea7960ea244bfebcbbb17858748606147bf](https://sepolia.etherscan.io/address/0xf564eea7960ea244bfebcbbb17858748606147bf) ## Purpose From 4428558aa37da3ed79729d3d9ee30fc4cb8a8b39 Mon Sep 17 00:00:00 2001 From: soyboy <85043086+sbvegan@users.noreply.github.com> Date: Fri, 25 Oct 2024 14:59:39 -0600 Subject: [PATCH 304/565] Apply suggestions from code review --- pages/builders/app-developers/tutorials/_meta.json | 2 +- pages/builders/chain-operators/tutorials/_meta.json | 2 +- pages/chain/_meta.json | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pages/builders/app-developers/tutorials/_meta.json b/pages/builders/app-developers/tutorials/_meta.json index 660055ae0..f98a8dbd1 100644 --- a/pages/builders/app-developers/tutorials/_meta.json +++ b/pages/builders/app-developers/tutorials/_meta.json @@ -8,5 +8,5 @@ "sdk-view-txns": "Viewing deposits and withdrawals by address", "sdk-trace-txns": "Tracing deposits and withdrawals", "sdk-estimate-costs": "Estimating transaction costs", - "send-tx-from-eth": "Triggering OP Mainnet transactions From Ethereum" + "send-tx-from-eth": "Triggering OP Mainnet transactions from Ethereum" } diff --git a/pages/builders/chain-operators/tutorials/_meta.json b/pages/builders/chain-operators/tutorials/_meta.json index 1df47a60d..8643c85ac 100644 --- a/pages/builders/chain-operators/tutorials/_meta.json +++ b/pages/builders/chain-operators/tutorials/_meta.json @@ -1,5 +1,5 @@ { - "create-l2-rollup": "Creating your own L2 Rollup Testnet", + "create-l2-rollup": "Creating your own rollup testnet", "sdk": "Using the Optimism SDK", "adding-derivation-attributes": "Adding attributes to the derivation function", "adding-precompiles": "Adding a precompile", diff --git a/pages/chain/_meta.json b/pages/chain/_meta.json index 204a812a7..26c4d8459 100644 --- a/pages/chain/_meta.json +++ b/pages/chain/_meta.json @@ -1,6 +1,6 @@ { "getting-started": "Getting started: OP Mainnet", - "differences": "Differences detween Ethereum and OP Mainnet", + "differences": "Differences between Ethereum and OP Mainnet", "networks": "Networks and RPC Endpoints", "addresses": "Contract addresses", "tokenlist": "Bridged token addresses", From 35769eba60da059caa7785abff17e404c45d1c9d Mon Sep 17 00:00:00 2001 From: soyboy <85043086+sbvegan@users.noreply.github.com> Date: Sun, 27 Oct 2024 10:27:54 -0600 Subject: [PATCH 305/565] updating deployer docs --- .../chain-operators/tools/op-deployer.mdx | 96 +++++++++---------- 1 file changed, 47 insertions(+), 49 deletions(-) diff --git a/pages/builders/chain-operators/tools/op-deployer.mdx b/pages/builders/chain-operators/tools/op-deployer.mdx index f2c61d973..fff7b4d9b 100644 --- a/pages/builders/chain-operators/tools/op-deployer.mdx +++ b/pages/builders/chain-operators/tools/op-deployer.mdx @@ -9,14 +9,11 @@ import {Callout, Steps} from 'nextra/components' # Deployer -`op-deployer` simplifies the process of deploying the OP Stack. It works similarly to [Terraform](https://www.terraform.io). Like Terraform, you define a declarative config file called an "intent," then run a command to apply the intent to your chain. `op-deployer` will compare the state of your chain against the intent, and make whatever changes are necessary for them to match. In its current state, it is intended to deploy new standard chains. Upgrade funcionality and beta-feature support will likely come in the future. +`op-deployer` simplifies the process of deploying the OP Stack. It works similarly to [Terraform](https://www.terraform.io). Like Terraform, you define a declarative config file called an "intent," then run a command to apply the intent to your chain. `op-deployer` will compare the state of your chain against the intent, and make whatever changes are necessary for them to match. In its current state, it is intended to deploy new standard chains that utilize the Superchain wide contracts. ## Installation -todo: we need to link a production ready release of op-deployer - -`op-deployer` is currently under active development, and must be compiled from source. Assuming you have the Go -toolchain installed, you can install `op-deployer` by following these steps: +You can find the latest releases in the monorepo's [release page](https://github.com/ethereum-optimism/optimism/releases). The following guide is how to complie it from source. Assuming you have the Go toolchain installed, you can install `op-deployer` by following these steps: ### **Clone the monorepo**: @@ -39,41 +36,39 @@ toolchain installed, you can install `op-deployer` by following these steps: ## Usage -### Configuring your chain + + +### `init`: configuring your chain To get started with `op-deployer`, you need to create an intent file that outlines your desired chain configuration. You can use the built-in `op-deployer` utility to generate this file. Just run the following command to create an example intent file for a development chain: ``` -./bin/op-deployer init --l1-chain-id 11155111 --l2-chain-ids 12345 --workdir .deployer +./bin/op-deployer init --l1-chain-id 11155111 --l2-chain-ids --workdir .deployer ``` -This command will create a directory called `.deployer` in your current working directory containing the intent file -and an empty `state.json` file. `state.json` is populated with the results of your deployment, and never needs to -be edited directly. - -Your intent file will look something like this: +This command will create a directory called `.deployer` in your current working directory containing the intent file and an empty `state.json` file. `state.json` is populated with the results of your deployment, and never needs to be edited directly. -todo: update the toml file for the latest output -todo: add annotations on each of the chains.roles +Your intent file will need to be modified to your parameters, but it will initally look something like this: ```toml -deploymentStrategy = "live" # todo: add description +deploymentStrategy = "live" # Deploying a chain to a live network i.e. Sepolia l1ChainID = 11155111 # The chain ID of the L1 chain you'll be deploying to fundDevAccounts = true # Whether or not to fund dev accounts using the test... junk mnemonic on L2. -l1ContractsLocator = "tag://op-contracts/v1.6.0" # The version of the L1 smart contracts to deploy. -l2ContractsLocator = "tag://op-contracts/v1.7.0-beta.1+l2-contracts" # The version of the L2 smart contracts to encode into genesis +l1ContractsLocator = "tag://op-contracts/v1.6.0" # L1 smart contracts versions +l2ContractsLocator = "tag://op-contracts/v1.7.0-beta.1+l2-contracts" # L2 smart contracts versions -# todo: add comment on this section +# Delete this table if you are using the shared Superchain contracts on the L1 +# If you are deploying your own SuperchainConfig and ProtocolVersions contracts, fill in these details [superchainRoles] - proxyAdminOwner = "0xb9cdf788704088a4c0191d045c151fcbe2db14a4" # todo: whose address is this? - protocolVersionsOwner = "0x85d646ed26c3f46400ede51236d8d7528196849b" # todo: add comment - guardian = "0x8c7e4a51acb17719d225bd17598b8a94b46c8767" # todo: is this the guardian on the superchain config contract? + proxyAdminOwner = "0xb9cdf788704088a4c0191d045c151fcbe2db14a4" + protocolVersionsOwner = "0x85d646ed26c3f46400ede51236d8d7528196849b" + guardian = "0x8c7e4a51acb17719d225bd17598b8a94b46c8767" # List of L2s to deploy. op-deployer can deploy multiple L2s at once [[chains]] # Your chain's ID, encoded as a 32-byte hex string id = "0x0000000000000000000000000000000000000000000000000000000000003039" - # todo: comments on these values + # Update the fee receipiant contract baseFeeVaultRecipient = "0x0000000000000000000000000000000000000000" l1FeeVaultRecipient = "0x0000000000000000000000000000000000000000" sequencerFeeVaultRecipient = "0x0000000000000000000000000000000000000000" @@ -82,63 +77,66 @@ l2ContractsLocator = "tag://op-contracts/v1.7.0-beta.1+l2-contracts" # The versi # Various ownership roles for your chain. When you use op-deployer init, these roles are generated using the # test... junk mnemonic. You should replace these with your own addresses for production chains. [chains.roles] - proxyAdminOwner = "0x7759a8a43aa6a7ee9434ddb597beed64180c40fd" # todo: highlight the difference between this and the one in the [superchainRoles] - systemConfigOwner = "0x8e35d9523a0c4c9ac537d254079c2398c6f3b35f" # todo: mention that the chain operator should retain this role for system behavior modifications - governanceTokenOwner = "0x7759a8a43aa6a7ee9434ddb597beed64180c40fd" # todo: what guidance should we have on this + l1ProxyAdminOwner = "0x1a66b55a4f0139c32eddf4f8c60463afc3832e76" + l2ProxyAdminOwner = "0x7759a8a43aa6a7ee9434ddb597beed64180c40fd" + systemConfigOwner = "0x8e35d9523a0c4c9ac537d254079c2398c6f3b35f" unsafeBlockSigner = "0xbb19dce4ce51f353a98dbab31b5fa3bc80dc7769" batcher = "0x0e9c62712ab826e06b16b2236ce542f711eaffaf" proposer = "0x86dfafe0689e20685f7872e0cb264868454627bc" - challenger = "0xf1658da627dd0738c555f9572f658617511c49d5" # todo: what address should this be? -``` - -See the code comments above for explanations of each field. By default, `op-deployer` will fill in all other configuration variables -with those that match our standard config. You can override these defaults by adding them to your intent file, but -that won't be covered here. + challenger = "0xf1658da627dd0738c555f9572f658617511c49d5" -### Overriding default values +``` -The default values that op-deployer utilizes are defined [here](todo: add link). If you'd like to override these values, you need to add the following stanza to your intent file like this: +By default, `op-deployer` will fill in all other configuration variables with those that match the [standard configuration](https://specs.optimism.io/protocol/configurability.html). You can override these defaults by adding them to your intent file by adding the following table: ```toml -todo: add override examples +[globalDeployOverrides] + l2BlockTime = 1 # 1s L2blockTime is also standard, op-deployer defaults to 2s ``` -todo: reference the default values -todo: figure our if we should use the global overrides or the chain overrides -todo: give example of 1s blocktime override -todo: how do you deploy your own superchain contracts? opt out of the shared ones +You can also do chain by chain configurations in the `chains` table. -### Applying your intent +### `apply`: deploy your chain -Now that you've created your intent file, you can apply it to your chain: + + Hardware wallets are not supported, but you can use ephemeral hot wallets since this deployer key has no privileges. + + +Now that you've created your intent file, you can apply it to your chain to deploy the L1 smart contracts: ``` ./bin/op-deployer apply --workdir .deployer --l1-rpc-url --private-key ``` -Hardware wallets are not supported, but you can use ephemeral hot wallets since this deployer key has no privileges. - This command will deploy the OP Stack to L1. It will deploy all L2s specified in the intent file. Superchain configuration will be set to the Superchain-wide defaults - i.e., your chain will be opted into the [Superchain pause](https://specs.optimism.io/protocol/superchain-configuration.html#pausability) and will use the same [protocol versions](https://github.com/ethereum-optimism/specs/blob/main/specs/protocol/superchain-upgrades.md) address as other chains on the Superchain. -### Generating genesis files -### Generating genesis files +### `inspect`: generating genesis files and chain information -With the contracts deployed, you can generate a genesis file for any of your L2s. Run the following command to do so: +You'll be inspecting the `state.json` file, so you need to navigate into your working directory to inspect the file. With the contracts deployed, you can generate the genesis and rollup configuration files. Run the following commands to do so: ``` -./bin/op-deployer inspect genesis --outfile genesis.json +cd .deployer +../bin/op-deployer inspect genesis > genesis.json +../bin/op-deployer inspect rollup > rollup.json ``` -This will write the genesis file to `genesis.json`. You can change the `--outfile` parameter to write it somewhere -else. You can run another member of the `inspect` family, `rollup`, to get the `rollup.json` file: +Now that you have your `genesis.json` and `rollup.json` you can spin up a node on your network. You can also use the following inspect subcommands to get additional data: ``` -./bin/op-deployer inspect rollup --outfile rollup.json +../bin/op-deployer inspect l1 # outputs all L1 contract addresses for an L2 chain +../bin/op-deployer inspect deploy-config # outputs the deploy config for an L2 chain +../bin/op-deployer inspect l2-semvers # outputs the semvers for all L2 chains ``` + + +## `bootstrap` + +todo: how does this work? + ## Next steps * For more details, check out the tool and documentation in the [op-deployer repository](https://github.com/ethereum-optimism/optimism/tree/develop/op-deployer/cmd/op-deployer). From e5e774fd89d990d53de9dcab927b50e511c864c4 Mon Sep 17 00:00:00 2001 From: soyboy <85043086+sbvegan@users.noreply.github.com> Date: Sun, 27 Oct 2024 13:59:53 -0600 Subject: [PATCH 306/565] fixing linter --- words.txt | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/words.txt b/words.txt index c4cf76483..0c0ade27a 100644 --- a/words.txt +++ b/words.txt @@ -11,6 +11,7 @@ Allocs allocs altda ANDI +Ankr Apeworx Arweave authrpc @@ -59,12 +60,14 @@ Chugsplash Clabby codebases collateralized +complie compr COMPUTEPENDINGBLOCK computependingblock confs corsdomain counterfactually +Crosschain crosschain Crossmint daserver @@ -146,11 +149,13 @@ Holesky holesky IGNOREPRICE ignoreprice +Immunefi implicity Inator inator INFLUXDBV influxdbv +initally initcode IPCDISABLE ipcdisable @@ -194,6 +199,7 @@ minsuggestedpriorityfee Mintable Mintplex MIPSEVM +Mitigations Monitorism Moralis Mordor @@ -288,6 +294,8 @@ Proxied Proxyd proxyd pseudorandomly +Pyth +Pyth's QRNG Quicknode quicknode @@ -320,6 +328,9 @@ Schnorr secp SELFDESTRUCT Sendrawtransactionconditional +SEPOLIA +Sepolia +sepolia seqnr SEQUENCERHTTP sequencerhttp @@ -387,6 +398,7 @@ VMDEBUG vmdebug VMODULE vmodule +voxel wagmi Warpcast XORI From 262ceac55fe32f91402872c51a2cfed0b28159c8 Mon Sep 17 00:00:00 2001 From: Micaiah Reid Date: Mon, 28 Oct 2024 12:03:05 -0400 Subject: [PATCH 307/565] docs: remove duplicate word "the" --- pages/builders/chain-operators/architecture.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/builders/chain-operators/architecture.mdx b/pages/builders/chain-operators/architecture.mdx index 81464816c..36fe57400 100644 --- a/pages/builders/chain-operators/architecture.mdx +++ b/pages/builders/chain-operators/architecture.mdx @@ -83,7 +83,7 @@ handle the state changing RPC request `eth_sendRawTransaction`. It can be peered replica nodes to gossip new `unsafe` blocks to the rest of the network. -To run a rollup, you need a minimum of one archive node. This is required by the proposer as the the data that it needs can be older than the data available to a full node. Note that since the proposer doesn't care what archive node it points to, you can technically point it towards an archive node that isn't the sequencer. +To run a rollup, you need a minimum of one archive node. This is required by the proposer as the data that it needs can be older than the data available to a full node. Note that since the proposer doesn't care what archive node it points to, you can technically point it towards an archive node that isn't the sequencer. Sequencer Node Diagram From 4fc67636a6f0e1c899ebbf948bbdeafc2737002f Mon Sep 17 00:00:00 2001 From: soyboy <85043086+sbvegan@users.noreply.github.com> Date: Mon, 28 Oct 2024 10:05:01 -0600 Subject: [PATCH 308/565] removing out dated bread crumb section --- pages/stack/operators.mdx | 15 --------------- pages/stack/operators/features.mdx | 19 ------------------- pages/stack/protocol.mdx | 25 ------------------------- pages/stack/protocol/fault-proofs.mdx | 27 --------------------------- pages/stack/protocol/features.mdx | 21 --------------------- pages/stack/protocol/interop.mdx | 21 --------------------- pages/stack/protocol/rollup.mdx | 25 ------------------------- 7 files changed, 153 deletions(-) delete mode 100644 pages/stack/operators.mdx delete mode 100644 pages/stack/operators/features.mdx delete mode 100644 pages/stack/protocol.mdx delete mode 100644 pages/stack/protocol/fault-proofs.mdx delete mode 100644 pages/stack/protocol/features.mdx delete mode 100644 pages/stack/protocol/interop.mdx delete mode 100644 pages/stack/protocol/rollup.mdx diff --git a/pages/stack/operators.mdx b/pages/stack/operators.mdx deleted file mode 100644 index 01c05b33c..000000000 --- a/pages/stack/operators.mdx +++ /dev/null @@ -1,15 +0,0 @@ ---- -title: Operators -description: This section provides information on . You'll find guide to help you understand and work with these topics. -lang: en-US ---- - -import { Card, Cards } from 'nextra/components' - -# Operators - -This section provides information on . You'll find guide to help you understand and work with these topics. - - - - diff --git a/pages/stack/operators/features.mdx b/pages/stack/operators/features.mdx deleted file mode 100644 index 3e49e3376..000000000 --- a/pages/stack/operators/features.mdx +++ /dev/null @@ -1,19 +0,0 @@ ---- -title: Features -lang: en-US -description: >- - Learn about features in the Optimism ecosystem. This guide provides detailed - information and resources about features. ---- - -import { Card, Cards } from 'nextra/components' - -# Features - -This section provides information on op txproxy and proxyd. You'll find guide to help you understand and work with these topics. - - - - - - diff --git a/pages/stack/protocol.mdx b/pages/stack/protocol.mdx deleted file mode 100644 index 05bb23994..000000000 --- a/pages/stack/protocol.mdx +++ /dev/null @@ -1,25 +0,0 @@ ---- -title: Protocol -description: This section provides information on derivation pipeline, fault proofs, features, interop, sequencer outages and rollup. You'll find overview, guide... -lang: en-US ---- - -import { Card, Cards } from 'nextra/components' - -# Protocol - -This section provides information on derivation pipeline, fault proofs, features, interop, sequencer outages and rollup. You'll find overview, guide to help you understand and work with these topics. - - - - - - - - - - - - - - diff --git a/pages/stack/protocol/fault-proofs.mdx b/pages/stack/protocol/fault-proofs.mdx deleted file mode 100644 index 7875d85aa..000000000 --- a/pages/stack/protocol/fault-proofs.mdx +++ /dev/null @@ -1,27 +0,0 @@ ---- -title: Fault Proofs -lang: en-US -description: >- - Learn about fault proofs in the Optimism ecosystem. This guide provides - detailed information and resources about fault proofs. ---- - -import { Card, Cards } from 'nextra/components' - -# Fault Proofs - -This section provides information on fault proof vm: cannon, op challenger explainer, fault proofs explainer, fp system components, fault proofs mainnet security and fault proof vm: mips.sol. You'll find reference, guide, overview, api, introduction to help you understand and work with these topics. - - - - - - - - - - - - - - diff --git a/pages/stack/protocol/features.mdx b/pages/stack/protocol/features.mdx deleted file mode 100644 index 466ac4e35..000000000 --- a/pages/stack/protocol/features.mdx +++ /dev/null @@ -1,21 +0,0 @@ ---- -title: Features -lang: en-US -description: >- - Learn about features in the Optimism ecosystem. This guide provides detailed - information and resources about features. ---- - -import { Card, Cards } from 'nextra/components' - -# Features - -This section provides information on Alt DA Mode Explainer, Custom Gas Token Explainer, and SendRawTransactionConditional Explainer. You'll find a guide to help you understand and work with these topics. - - - - - - - - diff --git a/pages/stack/protocol/interop.mdx b/pages/stack/protocol/interop.mdx deleted file mode 100644 index 499809656..000000000 --- a/pages/stack/protocol/interop.mdx +++ /dev/null @@ -1,21 +0,0 @@ ---- -title: Interop -lang: en-US -description: >- - Learn about interop in the Optimism ecosystem. This guide provides detailed - information and resources about interop. ---- - -import { Card, Cards } from 'nextra/components' - -# Interop - -This section provides information on the anatomy of a cross-chain message, an interoperability explainer, and the Supersim multichain development environment. You'll find an overview, guide, and tools to help you understand and work with these topics. - - - - - - - - diff --git a/pages/stack/protocol/rollup.mdx b/pages/stack/protocol/rollup.mdx deleted file mode 100644 index 4eadc3973..000000000 --- a/pages/stack/protocol/rollup.mdx +++ /dev/null @@ -1,25 +0,0 @@ ---- -title: Rollup -lang: en-US -description: >- - Learn about rollup in the Optimism ecosystem. This guide provides detailed - information and resources about rollup. ---- - -import { Card, Cards } from 'nextra/components' - -# Rollup - -This section provides information on deposit flow, forced transaction, rollup protocol overview, transaction flow and withdrawal flow. You'll find guide, overview to help you understand and work with these topics. - - - - - - - - - - - - From 86b2b0fce9c308cb8ac4214ed678a8146bc9e3cc Mon Sep 17 00:00:00 2001 From: krofax Date: Mon, 28 Oct 2024 18:57:20 +0100 Subject: [PATCH 309/565] Added contents for general message passing on OP Stack --- pages/stack/interop/_meta.json | 3 +- pages/stack/interop/message-passing.mdx | 97 +++++++++++++++++++++++++ words.txt | 1 + 3 files changed, 100 insertions(+), 1 deletion(-) create mode 100644 pages/stack/interop/message-passing.mdx diff --git a/pages/stack/interop/_meta.json b/pages/stack/interop/_meta.json index 0fad31024..fc2575737 100644 --- a/pages/stack/interop/_meta.json +++ b/pages/stack/interop/_meta.json @@ -2,5 +2,6 @@ "explainer": "Interop explainer", "cross-chain-message": "Anatomy of cross-chain message", "supersim": "Supersim Multichain Development Environment", - "superchain-erc20": "SuperchainERC20 token standard" + "superchain-erc20": "SuperchainERC20 token standard", + "general-message-passing": "How to use general message passing on OP Stack" } \ No newline at end of file diff --git a/pages/stack/interop/message-passing.mdx b/pages/stack/interop/message-passing.mdx new file mode 100644 index 000000000..dcf42cd62 --- /dev/null +++ b/pages/stack/interop/message-passing.mdx @@ -0,0 +1,97 @@ +--- +title: How to use general message passing on OP Stack +lang: en-US +description: Learn how to use general message passing on OP Stack using OP Stack cross-chain messaging standards. +--- + +import { Steps } from 'nextra/components' + +# How to use general message passing on OP Stack + +Optimism supports cross-chain message passing, allowing communication between Ethereum and Optimism chains. This guide provides step-by-step instructions for general message passing without using Supersim, following Optimism's cross-chain messaging standards. + +## Overview of cross-chain messaging + +Cross-chain messaging on Optimism allows messages to be sent from one chain (e.g., Ethereum) to another (e.g., Optimism) using specific contracts: + +* **MessagePasser contract** on the source chain. +* **MessageReceiver contract** on the destination chain. + +For more information, refer to the [Optimism Messaging Specification](https://specs.optimism.io/interop/messaging.html) and the [Cross-Chain Message Documentation](https://docs.optimism.io/stack/protocol/interop/cross-chain-message). + +## Step 1: Prepare the cross-chain message + +To send a message from one chain to another, follow these steps to prepare and send a message. + +1. Define the Message Content + +Define the data you want to pass across the chains. This message may include function calls, values, or arbitrary data. + +```typescript +const messageData = "0xYourMessageData"; // Replace with your actual data +``` + +2. Specify the Target Contract and Function + Identify the target contract and function you want to call on the destination chain. Ensure this contract is deployed on both chains if you need bi-directional communication. + +## Step 2: Send the Message + +1. Call the MessagePasser Contract + On the source chain, call the MessagePasser contract with the message data. This contract serves as an entry point for cross-chain messages on Optimism. + +```typescript +import { viem } from 'viem'; + +const tx = await viem.writeContract({ + address: '0xYourMessagePasserAddress', // Replace with the MessagePasser contract address + abi: MessagePasserABI, // The ABI of the MessagePasser contract + functionName: 'sendMessage', + args: [targetAddress, messageData], +}); +``` + +2. Confirm the transaction + Once you send the message, wait for the transaction confirmation. This confirmation ensures that the message has been successfully sent and recorded on the source chain. + +```typescript +await tx.wait(); +console.log('Message sent successfully'); +``` + +## Step 3: Receive the message on the destination chain + +After the message is sent, it will need to be relayed and processed on the destination chain. + +1. Relay the message + Relay the message manually or use an automatic relay solution. To relay manually, use the MessageReceiver contract's function to receive and process the message. + +```typescript +const relayTx = await viem.writeContract({ + address: '0xYourMessageReceiverAddress', // Replace with the MessageReceiver contract address + abi: MessageReceiverABI, // The ABI of the MessageReceiver contract + functionName: 'receiveMessage', + args: [messageData], +}); +``` + +2. Confirm the message reception + Wait for the message reception transaction to confirm. + +```typescript +await relayTx.wait(); +console.log('Message received on destination chain'); +``` + +## Error Handling and troubleshooting + +* Ensure Contract Compatibility: Verify that both MessagePasser and MessageReceiver contracts are compatible and have matching function signatures on each chain. + +* Gas Fees: Check that you have enough funds to cover the gas fees for message passing on both chains. + +* Event Logs: Use event logs to debug and confirm message delivery at each stage. + +## Additional Resources + +For further guidance on interop messaging and cross-chain message handling, see: +* +* diff --git a/words.txt b/words.txt index c4cf76483..990249a5e 100644 --- a/words.txt +++ b/words.txt @@ -65,6 +65,7 @@ computependingblock confs corsdomain counterfactually +Crosschain crosschain Crossmint daserver From c33c19bea87df431b1c6b38c3be871450f470952 Mon Sep 17 00:00:00 2001 From: soyboy <85043086+sbvegan@users.noreply.github.com> Date: Mon, 28 Oct 2024 13:41:45 -0600 Subject: [PATCH 310/565] adding block time research --- next-env.d.ts | 2 +- pages/stack/_meta.json | 3 +- pages/stack/block-time-research.mdx | 82 ++++++++++++++++++ .../protocol/block-time-research-figure-1.png | Bin 0 -> 291357 bytes .../protocol/block-time-research-figure-2.png | Bin 0 -> 295107 bytes .../protocol/block-time-research-figure-3.png | Bin 0 -> 294358 bytes .../protocol/block-time-research-figure-4.png | Bin 0 -> 293454 bytes .../protocol/block-time-research-figure-5.png | Bin 0 -> 290794 bytes .../protocol/block-time-research-figure-6.png | Bin 0 -> 22182 bytes 9 files changed, 85 insertions(+), 2 deletions(-) create mode 100644 pages/stack/block-time-research.mdx create mode 100644 public/img/op-stack/protocol/block-time-research-figure-1.png create mode 100644 public/img/op-stack/protocol/block-time-research-figure-2.png create mode 100644 public/img/op-stack/protocol/block-time-research-figure-3.png create mode 100644 public/img/op-stack/protocol/block-time-research-figure-4.png create mode 100644 public/img/op-stack/protocol/block-time-research-figure-5.png create mode 100644 public/img/op-stack/protocol/block-time-research-figure-6.png diff --git a/next-env.d.ts b/next-env.d.ts index 4f11a03dc..a4a7b3f5c 100644 --- a/next-env.d.ts +++ b/next-env.d.ts @@ -2,4 +2,4 @@ /// // NOTE: This file should not be edited -// see https://nextjs.org/docs/basic-features/typescript for more information. +// see https://nextjs.org/docs/pages/building-your-application/configuring/typescript for more information. diff --git a/pages/stack/_meta.json b/pages/stack/_meta.json index 962a4597b..a0350048c 100644 --- a/pages/stack/_meta.json +++ b/pages/stack/_meta.json @@ -16,5 +16,6 @@ }, "opcm": "OP Contracts Manager", "interop": "Interoperability", - "beta-features": "Beta features" + "beta-features": "Beta features", + "block-time-research": "Block time research" } diff --git a/pages/stack/block-time-research.mdx b/pages/stack/block-time-research.mdx new file mode 100644 index 000000000..1aa95b94a --- /dev/null +++ b/pages/stack/block-time-research.mdx @@ -0,0 +1,82 @@ +--- +title: Block time research +lang: en-US +tags: ["op-geth", "op-reth", "eng-platforms"] +description: Sunnyside Labs' (formerly Test in Prod) and OP Labs 1 second block time research. +--- + +# Block time research + +Sunnyside Labs (formerly Test in Prod) and OP Labs have researched whether we can drop OP Chains’ block time to one second. + +To validate if dropping the block time is safe, we should check if nodes can build a block under a second when the block spends maximum gas in the production environment–i.e., block building time should take less than one second when the block spends maximum gas. We benchmarked the block-building time of every block at Base and grouped the data in various gas ranges using multiple clients–op-geth & op-reth. + +## Method and raw data + +This [GitHub repository](https://github.com/testinprod-io/block-building-stats/tree/main) contains the test methods, data sets, client versions, and raw data. + +The following benchmarks are available in this [notebook](https://github.com/testinprod-io/block-building-stats/blob/main/stats.ipynb). + +## Benchmarks + +![Figure 1: op-geth / archive node / block 5492540 ~ 9816497 +](/img/op-stack/protocol/block-time-research-figure-1.png) + +**Figure 1**: op-geth / archive node / block 5492540 ~ 9816497 + + +![Figure 2: op-geth / full node / block 5492540 ~ 9816497](/img/op-stack/protocol/block-time-research-figure-2.png) + +**Figure 2**: op-geth / full node / block 5492540 ~ 9816497 + +Figures 1 and 2 show the Base nodes’ block-building time distribution with op-geth archive node & full node from block 5492540 to 9816497. We can see that the average block building time takes 0.58 and 0.36 seconds each for blocks that spent 25M ~ 30M gas, which is less than one second. + +![Figure 3: op-reth / archive node / block 5492540 ~ 9816497](/img/op-stack/protocol/block-time-research-figure-3.png) + +**Figure 3**: op-reth / archive node / block 5492540 ~ 9816497 + +Figure 3 shows the Base nodes’ block-building time distribution using the op-reth archive node from block 5492540 to 9816497. Compared to op-geth’s archive node, we can see that op-reth shows a better performance in all ranges. + +![Figure 4: op-geth / archive node / block 13686867 ~ 15074141](/img/op-stack/protocol/block-time-research-figure-4.png) + +**Figure 4:** op-geth / archive node / block 13686867 ~ 15074141 + +![Figure 5: op-geth / full node / block 14567037 ~ 15074141](/img/op-stack/protocol/block-time-research-figure-5.png) + +**Figure 5:** op-geth / full node / block 14567037 ~ 15074141 + +Throughout the research, we found that the node meaningfully takes longer to build a block as the chain stores more states and transactions to access more historical data. Therefore, we benchmarked the latest blocks in Figures 4 and 5. On average, both the full node and archive node could build a congested block on time. It is worth noting that the average block-building time of high gas spending range is similar to the older blocks, but the average block-building time is higher on the newer blocks. + +![Figure 6: op-geth / archive node / block 13686867 ~ 15074141 / histogram of 25m~30m gas range](/img/op-stack/protocol/block-time-research-figure-6.png) + +**Figure 6**: op-geth / archive node / block 13686867 ~ 15074141 / histogram of 25m~30m gas range + +If we zoom in on the 25m~30m gas range of the archive node, the average could be potentially concerning–0.51 sec. It is worth noting that we can see the average is diverged from p50 (0.4 sec) because of outliers in the histogram (Figure 6), and p50 is a more important metric than the average for the block progression (Sequencer) because of its asynchronous nature. + +When the sequencer seals the block after the block time, it stops to include the transactions and yields the current processing transactions to the next block. Therefore, the sequencer can include most transactions that took less than one second in the block on time and include outliers in the next block. Therefore, we can expect the system to be able to build blocks in one second in most cases, even in the highest gas range (25m~30m gas). + +As a result, we can learn that nodes can build the latest blocks of Base Mainnet with the highest level of production loads in one second with an [i3en.3xlarge instance](https://aws.amazon.com/ec2/instance-types/i3en/) (or similar specs). + +## Expected impacts + +### Verifier + +* Sync from genesis: If OP Chains’ block time drops to one second, verifiers may need longer to sync the chain from the genesis with L1 derivation. However, we expect it won’t be a notable issue for verifiers as OP Stack supports the [engine sync](/builders/node-operators/management/snap-sync). +* Following the tip: The research suggests that verifiers are less likely to have a problem following the tip because nodes could build a block under one second at the highest gas range, especially since most verifiers are full nodes. + +### Sequencer + +* Block progression: As the previous paragraph mentioned, the data suggests we don’t expect problems on a shorter block time. + +## Limitation + +The data suggests we don’t expect a problem dropping the block time to one second for now, as the average block building time of the latest blocks takes 0.19 seconds for the Base Mainnet. One concerning point: the benchmark shows that it takes longer to build a block as the chain progresses. When the chain stores more states over time and usage surges to a peak like 2017 Ethereum, we might need performance patches then. + +However, it is also worth noting that the research assumes that the Base Mainnet handles 2x of their current traffic–dropping the block time to half but still spending gas as current (when it runs two seconds of block time). Plus, the Base Mainnet’s average block gas spending is 10M. To make all blocks reach the highest gas level that this research focuses on (25M), it’s another 2.5x. + +Therefore, this research assumes the chain processes approximately 5x traffic compared to the current Base Mainnet (2x in block time * 2.5x in gas spending). + +## Reference + +Base’s prior research for raising gas limit: [replayor](https://github.com/danyalprout/replayor) + diff --git a/public/img/op-stack/protocol/block-time-research-figure-1.png b/public/img/op-stack/protocol/block-time-research-figure-1.png new file mode 100644 index 0000000000000000000000000000000000000000..5bab0c5efb203b263f20548e5a49585f9752e173 GIT binary patch literal 291357 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 z zX7a)yj3^xt8Ogx30aK2+CSPIbOM3}|>UAl-MBYVU>BIhqG-BrL^fh$sUL0r{M1KEH zNG}JV6Apvn!jGrpMN!r+*I*&l0T&o zk`G-uU^UT!v4Z`q^uGQ3AKbfF*}|Kvklqnqra=)s%_)j87QNLr*~DN3$}M7u1>{VZ z)^N&Q*>g0@=yCSet^A2>!X$%YhqazvQ@^ldbM4x}QjuD#mb9+E@}=U*T3!n?H3&_W zKEgpd7#4l6AoI4DBh-6*%-O}|B@lc#9wZF~>jtDw{UM)^!Zao-ioLK+27B!*`#PrM;#oierCM(yk;soVBi52g(^pVe z7f@rP=hlag-o>L~Bc4K*c6YbzB=(kX}e#QDYIv_*e50Qh%hM zd7~voW2fzF1$HY09jXc(yRd9Fjs`(Z(*c)mP18$AW z-nGt7y~3qK;lMJ(C7QO4&FTjoj#Z$NHz;&S!u|WZo`|7Tesh_r<9@FhdJ%X@!DQ^N zZoJRmBx~5$OvkO!kZm4}1X}4ixZbGce$oRu}(k?(=Mk> zE+~-QdkaNNZ}%1GYGs?qlTh6+aT_$OCNjV)vR#tf-7%HfH5P^Q2Fn*DyE$&%27*9q z&V(%Wpzg~AXlvLqC^&&|bdiZ;s;Bf31c+>Ql9?_oh*6NYw6Ssa7hbeXoa}1&SU2qG z!}n{rkRjHsau-nwr9Jc$rIAP5e;ESvmY2$a45qKc%#exaJ?0Mj!j8w^DDRj~$k~>? z%O27CRSaF((y~0~U-A*%WcX6gGT*YR-A}dr?0P-xMdi5ks*k_tsKti&-FmVmv~OG2 z?&D{fH+iV%%k9FUt-AVq;mr`e2>H}%oc@fm+Xbndf?DCms%>8@d;bUUC`h@7#YF`L z2oL%WMYo(`N+O+i|HqN~HK6}*6tW!tPKT2eQfq_kJD@>Dl+fV#LiUs9}ncC3) zD-EEm$PSkS>Bny0UTJgc$Psp@T*O+-p+L8TqYD--TqDRphL6j>Oysw3St~q z0dNpKhST|lzkFVDyxvETsX@VlZ00SwfjwJk&JmbN{n)C<45D^mWj?WM)rTj&(~E11 zu6-d}s4M#bBvS509`Yoky?RAc4L3Yhqu;vh4!u`sj~&To3MGC>Zn5`aJ_Watd@2!k6_hi^^JV(y?sib!M%FD z6ZRcHY*unrODQqb*Qb9VA!sKpgynfvL85ph)2zy7`ND;fVphqV{_C&&SLZhru51C_ z8Kge}pc9gUzpk!YPv{&22R^Q-uqSMpi_?mj^S;9dwj!tPo{K_+Hz`$Jxt&BYyj?*p zBTwe8lwJGw?zOI2Sl1lLiQ`A%YH1M=HI@PDvD2r=h$gV8@Ye0>`jA6(BBJhQ7Heq` z#Zr#A{~4G97HG53p z7NGMiHuMd*yb*Uul@_J8 z5uCAe=Ncduh^3TBrMVh4*Qk@e9W|YJ(8VK!5n>Z%9`q|93ZLi|+FJo;rq7(YO{}J& z(VfkKU%z7EJfHm{6DMlgn96B<+x*uI7-lpL$V@;MZ%4hU5AgcQd~3#>IYF@9!Ge19 z*y4J0>@9MTz2{7=|_kRmwkpu;PbT>&qMq zuW$Iy)=)gO_oj~CQEg)`P}mE4FWELb3!4uh;>9b zC?aRAEb8@2fE2ZK$>+w^3n+(h0}Hb;Jfq4rbhrwJFIRMH&x$p>+3i+a`kwrbA4z832g%iBkIyO?H^Q6vrEX%nMv{0tu_3jGa2_u>8f z(8#8gf)Q;}q~XkO1?U(5B3fNex4m}D?_ilYtad$PY9L#`BYzh5EVaO(i0iBvt{79z z6hOpQ@J2h$0TJFyt%pQnK<G=UI=^z7>oz8p9RVlPzLzmnH;%c`lVF|`yhdOMxBgFFy|NoLh_GSOuis|AH07uEMfQLTvU8@GDJ9k0y~{`~kr5GM zskE+)du3j` zfvv9Ib3?AT^HB^AbvruVposh%Dgoc#u|W|@I42lLl5`-s_<%y8a2}xQSN8AlZy>b* zWJo-85?$zpgn7G`l-osT#m$zMC~DqLNK%xE`gUPyq@hlXz*b8>eN|&FLxDH zqrJqN!=0U0mD&5WV|dE6#e3`75*9oVgW`|e#vbAqzx=~FdRpRhj@k3L31 zKm{4%Ep3Y|DYjsnp|^JxlTW9aN2_g49Xd4G(^IY4Mj9MOqXjSn$3WZ89MMfhg=R*l z+T?o&T})}4-qqAlIEDR+X}>09l&E)~KJ>F8QvsxkeXX>lQtR%QGIAFK5&@*RnChep zpCasJLGJn!>FHswhGtcc2dt6nJKgVapxsJK?@-Ww9TdzRt0e;TO$uV1Ks;p$R503(BGH#lGA`Ck&6JuHdW&_ED ziwLKae}Mla@TE}2%YAHL(JqPQxje4<{O5vv#=GoAw;&78GbL@Hx|Q=B6~)?eU7!#U zj<(qb9yI=RG_)?vKJ_B=fs8Xz8e(-rj|hz)Doht_7dOAHoONwuqfn!=TV!tAFG$^; zY>SXfviIh|z=ax7E9!QQJnS@W+7Bu+w+HQfeSB7fB5Jlf_4WDr_7cJJnJF@>!cTO) zzk=G6$v-+!wK>6De`sTBjayr>j?i4P(nBcU9cCfNK7MZ4UhUQG2fZdQ!HcUrgZ*4752v)COKlkGDZU&2U+m9B}8!OawD_i0q_$1f|-$?B+ zUL?|pWFcPVS~trN7%_bQJmJZspfcT?7V7Cs;66ar4|DjNK^5pWY@IFn3WeMGTypJH zROi>uzNzSMB6H(N^xCexd8oQMreZAB(d@dk?NIQRrobCapK#$ryf#**-#W%{q*o*c z*Icil(BlS2x_O#JB;pR6B{u~+q|p>gK5%u%R7wyhK0qd zRSHWFQ8b4vEd?mC(&T}ts&pzd3DM9qG!!5?P|dQnw%tzyxiRVxV%mF!7r*lpKLqdj z_RHJf()lCLvYXE9BG!_zoYg4TuBB5{5^U-Hw1E3~r90I;8iMjtE(4pt4=F%tGMr&lUOpat_HOHeFyt?#uRb zP7?6otOKiY7ZsJ2r6qY3;~a42b-8+XZ_w290PTfVapBfa{3(wEk(w9%_8##(kpFSN;A?v*h8?o)&*OOajEoZ>@N~ znBl8`E#T$$4a5Bw5FlR=hMB^o)oxEkmj`OD^{TJi1HKus8z>f7?4KLQz9yt7S|3PG zNnzY-e&sHzqPU#$(o!!llq;%W0z;NPmwA`*dKxv)ktLf9I&3BoEI z0bmGb=5YBSgHf2kUxS*=;4&XdhP2-clz7hWT=Pli=Srm@2Yu}A+rGNryH#Be(^0%ugJIV5|KYcR4(k@Q|^jL$*(3>|D0v&pV-|=PFG!YE6iJA^F7_GE{VXxtoUaaVx24RkUPSxR?bJ49pl! z>N8~nSC~KlEeuVn*iCJ%o0-BnR{T_naxsP7BDZcWX5W5KjGpAKbU6B$k!&@WingU+ zzhW@o zO1D_SfFhDgdi2PzuBTm+#OirkP<#Br>6$gbI`s(BQt|RpeXA&XgsKS^9u=nJJ*7Zx zBat#xy08+EkFa9`H7nHOYJxifjA}-FP{IS~+_9s;v!Mued(QIWbHHRP zR;-w}vMugU*wIfMGy{!Zg9fn%Z~MPgb!g*%KY23iS^%fI({?w9f(Wtsl(}IKl$Z6T zL6`5?I&r|A-|z1Y%_^O{@I-62s;&)vjdNvN(e1+n97q6n?l^9^oscpNHjboGUn29? zt9@OXBPb%>8uUs*va)hHoyUxaD0g^0bI|mwS zw2+rBl@%5imXv&**m1(h+wk^$C?Ex6{at^d&x7XA6b-weaWiLb0>?DF$_O%U-_+jbfyDlVefRk5@)b)~CsHQOh?cQ6+d!XUmfdIE)oU=1Q zs$JM{Z%xR{3X2VdvTMMMaV?RG6$1|Irmw&56f!l;v-h}=YK^_SE?sKkdiK^G2jGu| z6TsdV#oA=`vllO}U%3+fW&F;aSOF%)#i8nj+d}_!GCW*~g`+cTw`r-XY0E~nsj2(B zY~AX;kE}-BF)?{qBlJMSp{tzudHGr3cyKV`ki#d}dL&=85)6{K&y04m*=`~nF|R(r zc383SJ(5y5c#>jOP2HvD6Jf4c3it#@7-l1 zy&tCR&$S=#@5_Bnb*$qK%G$%{+x+ zi>PL6brWp|hCEeMD2O3V4YIbrv9VEY?`fdmX(|Q{)N?eA%)m+T6tpmVDC-CV6h*TM z%X~Z3zW`fxVvv-Fz9TS69^bq^PaA1DMHsXTBZFQO_WL4D`{)1R?#$nEUca~B+}%L8 zB#G3WB!o~TG!dZ^LZ(!v%$Z3VZM2RR;&+ENE-_LjN z=O1`}cslm6kG-Yt_i$b7TI*crd9FdX=dPstMZy03vPhz{p2UQ#3p$6&*QN93WpK)& z{U$*Xn$hPZ7rL4D?Q2c9Ga(^?<(cpxjm9|_$Dke-%D8dc5-+vOme*450dIL*e7xS- zJy9_uk|%P@+^ufAc3xE563IgfFLnwdmoG0fX!9*6PiT#i>+d=aZ=1cidLm%~dt1I- z>>C=w&`rbENR{~@78vI?74SplQ%cH8*?b{0z?rFn8vY`!FhxD5hR3Ym_aDov&Ri4?2a8!EEmv#rp-?KedJWx0h?fL zL5b4nVo7MVl}S?F4e16blMTe%o8s;+%*iP!X`30{ye{)40cqr=3kd#PPdp}J0p-A% z1Z9@@75lHAOp$@9O~XxYYkBL7neFk+tE^l{Ok^VgiqVE4`3SOkb#_iTnTtVg;=1SY zKxtMn-J~>9={pc!n5V#=m^3Mx1TiMqS1R6Y4+95|o-pFj$H#ZY3fN%~Mtb$>!(CBR z4d~xr)>y?^gK86!?z=Bvs8OGyf#5+5(AiFZ3%r1QjU+{R;!wqC`ZDJLB0&YHSa6Ht zSh%3W5!m7=(t2*gA2Z;98O;Z%0JvVRW9!zxNN9*yQ1XVF_+Zua^ZR#(_X$){GL_ia zPFg=-qw)aRf!-bE*fQqn$JT`0@r|ciAI^4|ZE5~zykT>{>)z)xGB!c^Jw7cY=hJY^ zr43=q=(b1E*cVy_Q_u-NaPyOH$UisnD;Qreml+@w3QZ7NP+MX>gY8u3$KMXGn`h^m zEtn%7J2vWSM>qeX=Q2+~Z+JkIDVpC?sPVw2FgiT)kY_p-L;25ciFY0cM)vvjRl&kr zltgE-|F+RGDb$p^Z|~NNPV7=cCQmd_&yHgRu^5 zxeEEuq~D+Rf>w(Cq7bh5$5dL+jr>fQ+B^DA8QU3k7@MCj)dBr^+sHuX4uD2MCdp~z zsf3V{rRZ^WJ)Xa_F*@u&y&}ghT{+jEDyUE978N;v6KPcGn07{}dLa67a)4|7ZfcT! zPwsx~;>91lS$29-1_dH0dNPTK_mRt^XKBKsevlE@dSNPI(b$>rC>#A=OE=C zV=?ET^(hcTA3YK*3IUg8bFwHYc(goJSS{=oxq`v8o)~;LVZuXt?{tFgmK$5@>_j9bSD`Y_wS-P4plCxIxDCDLQ=frv1Fm z)Ku8(%NzT7IQ+G|bh+a1W0VrV*Ay zw@TdA8+vsoj0F^9x`iYtw8-T)Bu+dL)&1p@C*6%+Z#g}bZm#d%>yBg$1*amUyEwj@ zPncKQj4NGD-T>tq!Tx8W1q^VTThVF`JE`*kOvz^WkE^^dB1DpNO4KU-L1>dq?R}tE zur5NXrba1dG5;BL0_+!wq0z6;*xu(b_n|3P0Hy2I#2H!79F*s!RoQb(I?zUxYDSSp;)cXwiVg^FpPJ> z_Zo9D#BLqpMj$OdcOs6(qHo-vC{o!F6Fk!75u)@J7i0Bzz6Ck)URxmD4* zZwYp;dQ3#_tfz;4vz+Nekx8Idb^0 z+~zq{r`$+$db48f6L1a4YzRg(c!Zo-d6N@eO~4mICKp906|A6QfZGJo61p=vhyBjI z2B=yv{18ZY{2sD1brluag0n^I3Dv;EtaiNNE_8$g_6LVy7-F!lMW(68j?D*pAP1n) z3mci^sGDHOg4Fj@fqvljojU_KRY*|qDU2*&C1pYKijAGdQ`@!aNBI1kHoMpV?YK>B zgeeJei!YkTvLDoc-2=ze%&h|R1CNIz+4AQ%;L0*+rccG&Zk{}S8oPkUq`D;WTb>

    Y^gecmyC9hfysw(){gM74Vc;UUN4u(zEJn=8VW6lDRj@7gT=)6K`GWj> zdDWTQckG}&3n7BtOa2X~P4Pv~ga>%)J!b$M^w>_FUU1Bj)C#V0xKtqQ6us}46Y1N9 znz@PR0v(u3QMXpziwY-Rcz86o_yh5WiY{`VKQ) zl|F@Js@ZNnGc&6mU6)WTS8KOxlHJmF%z0>8A<2(j<=RXxqBfJd4Kz1@%^Xnrx))-> zoM&BH7N3%WBu63Wbk6ecN=^n+S3<< zo6mK#Tvt1;?X#jHaOZ*j`#)sh?!JA-uWyJXf?Px#vw^)FGRWxQeQTT~?0o>ii-uOL zQvW>p6bGqBVU@s70BIr-)-RCO3Y@7@WX zdvgcCCSgee*}Q)9hV(X1Z+zlLv)FsEYGh3QT(>qg(?m?BqaJ3W4-;LyP~7W_4Dc)q z4blmf45&!hveP2yFDx!hQiPIa&Kz0SE`d|;Fd=#``)?QrBHIW@ZhB07L6!g|=R}|V zC_u)opHgW5`8(eM*T8%%sBxEy`SrX^j+}2lf719bq#pu<`TTjBlr%^aqE_dcEg?RV z@1~tT&0JFUA|pVy3dno7vYWGg((uNcGAm{tU)Isyv@RZWywpkdXgch6yEAHIdY7(6 zf~VZA&7+S84jwG%vJkmD=|jwrm;^|(G{VZkBS|A*aSP_);bMmy>fk+0lbus*b)Q}W z7&ejE8GGOh*RC8t{t-c_hDa1+zEIOGPpn^r@RNYVhGbu$=+e8_M?D{Nh$t`xq8<*o zbZH?_H!dTWqUk?2S<|8rPf9uvH*UbK%j7-e=ZD^=QGHUgd_L(0!IMW7s5V))z7UIo zNU<<^4@&!}?_~!dz|;8Sf7X6^T~%JrsB@WidB{m)4DG%WN_g-TKjdL<;pz`$TzNKNXwe);MH&3?ab`txWT#8Y zw}u8i*m2+<&Qpf3QjoKw$&6T3JXa-5FVcQ%nJeQBUQdXw;?#M&}=)7gifoAR4A}7p}ZxZQKt)F zViIwzii#26W{IWcdIalH?FWFM&p17$wbG{b1$6=g2z?Gf^S4@6;RMA5Ug%Bl{!U@5 zH|nf7Jw;9JEbQOb5FItG{laQNU(LXQ-Md$!30aV^X)Qx*aKC?kenI5eWL~3Ok_TWs z-xwu&!8%L#$~P#HbC>|c#oI-E5%BH)V4y$sb-nz34k&3LwSdmc^zVe<%V0D694NtF zn12`xNy?c!$KdKt(&3opDiWp8Jc=>s^>5#{B3r^v+d``_TOg}vMk-SyP|6^o9Ju2B z$O!*OLwsk+b|^hs=GnCbb{?CA3L+#=*6kQ%+PbT3e9pOfI`eTV0oI``1V)sKMX7%l zymcLFl55{G`kkSU+<5nGZN5a=6@=%ox~xDSk1b4BG&`|7&yzMY#p^j3%$5gB{ogX2 z^ZAPx3_!pQe3#>QoElbMY45&Rm=sxPL8X>kky=?Cy$y?@3?xjxC>~d)~lS zVN%a%&mW1C-n@Ldh$h>I4|7W7Oz(z_>jt4L;?dHHrjjzyI^&o7|DFYh6SfyuF0b5H zYCACU!^5r$me2D)fK`2aGT!9SGcQr$()w8kjxlhL9mLyab(PlC+)EH>Faw!nKzES@ zo%qhlg2je?#LT|jY(Jm)+^?qKKd8Gf38xjt`B!@XyUOsup>**0A88cI6_>Li7iw#m z%*E3kYA(Ou(Wo>`dcHFt)7tD$3-`{04bnHvn(%hmXT9N#CGwHqF&U+LUzksI<28A@O0i zUUn@^mK@*r+$$OafI*7y?lfx1Ex-Tl*?#@_x?TBZPN>_MONgNh!mDr8Os!wy71YHM z7YjAYWh=wUuCN9sl??TlURec435J+NDv*l;TU(63O~lh%V#JwgX&F;H%)>~t4e`O$ zRNY9fbluFtDF9&kQAx{H*0$ZhGtV^sOlCXKs4;`mkeey>O9UVE1Ei&|#Bc zTLbNF;cYr=i^X-gqMtYIt+@pRimqsG$|3N@aTHAWOvpvrT-qsjk$+Ohd)0* z`+>y>#T4U8i%zbjH+9;jZ6B5Ofu=NK{a+lqU#{z@PY`5!NWRC%n7um^X)U*9SZhk2 zwXXC~b0otqUhe?rLQV&?k`A-s;-b=k;MubOv3drqVe6qDz_569ue||3->d_#8@%jw zY0cH#lwhhOwulhm&F*zxesx7o-Lb$PiT(Pk%da?N5O&4YgtP(fh*JCYW~xexPWB?5 zYE=cfGZewk6_k}xqkN&WPB}oySh4OMH3!82(0`~>8*rr8>sVO$m2l#KrEo}{Cfk1b z{CVTAUz+xE^776v^?zu1pM`s~=hfmnXSuZj*gk2)kR%0g)zqfQh31(8Pch5Grv+lsi=#hd*B#scyDxn_^F{H zTXt=fR9yGq{<)ezahAEZ<)%rt-Yavq9PGVs-n8edY#mG64jia1-?DewzRe8{0WQZ9 z-F14fy5tO3KfjsvQdeEcY+%*Vi&_rB>YGzfkD0;LbwHSH8x0wLje$&$RgN-imf7Ft z5aBQYjDOctK~AtZ=CQpC+4IWJew@90i25}w8J5U4a^oeLE9Cc818TR|TzG)Gi{jXF zWGcm%q;No3D(KSl8Lt+0i z(I?2Q?bFlY^@hs98$rJxFS4kKYxHirZyr8fvcGNUqiKeYF%Z*d*}b;UpMtX6p@&UA zzM`@MEb<&GZ*zcz2`%Y3i`hr-UIdkL5y=ke*t%Nwot}y$v3Fr>pKOmDDEIcaIq{u# z?jNtX^)P)Z#7BbF16f4y3~l=eTLTj$jr%8y`|Z8(U_xDumV;fyysd}tIUn`1GW;B{ z`NH%*OO#P)@YOVg!W3m2Ana(-7AC)k=WH0DvttyQy6XsFq_^zsOp!b`@9dW|XO?j~ zzuqmoNyf-ncZX6~*cOE@GB;=VepL#tgcV4cOwwHY`Sbm%-$8nYPL>F?0-V08T1gL^ zm>q!_jyy6a(MV(_wQ!|&ET!zG$ou=6{uFzo&{r<7k;dY zvJHoPG-ynl^j+bWxY_2{$8Po!=+G5%j+m%UIgXbCqJYAJbXOBJ1@bc_;*4VRHWw4< zB0DivRbA zqtmX|j}2e@LdzkqtJ0|`W^gbRa?jXu`c1IS7q7ICd%EYfr}U9d*pR>$f1q~uBh-zQ zA&NXYS0`Ku^!iRVaM(N*iV9;l4&g?y>~$u#AqmYs>JUx8T(&IOkl1GbfdhVU5`;{QEUJz0X@slULqIl2|z*W*_F{3;raoh zIjRGQ2-nVZ3JY#5ZBE|tyHCb+z0RGnFR3P_=50mlT5KJ#YJZ-Yx=9H$wKyfo?^^OB!)3 zIk}xZ=WFQ$yt__3sb*9osYc1jX|nTAD!)FXrVs*Y8S{_(WZVRz=4laLF{I|vYY)yl z@^C$^R^(IJ9<5}8-}*IQn7$NW9v@FZ;dK4uzFC{fZJiQL#u{lN5EhDNo-slz3 zJdh9YQR%AslqY^+_C=gVjN5c~6(Y^cESy8?sg%A)1h7Wp| z-QLC7+{t3mb7^xoRHkoqOyBD98Y|D1Y?bM zx83&SQv(#x1QO~*yHF){9lAIhn5?aHwjzU>(#S1!EEc)Znj~krh`Ng!<_rlV588!J z*XE8MF*wEW8T|aciv>0Tuh|1ph7O}gr=+Chw~IfvFv(Tae_5D%r$=eCZH`AyKON?) zVQ^KgO&e#VEsZ(gDc=y8U`M?EbB2KLpFelbvp{}Q83=R9hRS%(L}Mc(9*cT_+Sm^z z7S6@cs`&B@GSJ-O8FqQo??G`^wk`9_bvuPkNPR+={-Bwc+{jHK;iOI=_dMk8QfYX& z&2;C7J=E`>OMgXnreQj@2rI6djAtI*J_nq5mkt4BHL;C2a%LT)eyC=_)rqy#+U+gk zluzYC7yxmlD15xoQTLbJOvbhot zW{3@WVOrZ&0a+j+c>9+w;O`tJ?n&GviGjc0O*19yId~jx=JrA ztIJof&SY|{nwdIAEn4`?QJ-K{8xUc#mGfa1?JNM%dx~FVX1rm+&7C(7Hg_H)iMPam z^V;27VAEnJ61SlkN+Mj|c ztH;u1%fga$#bTMRi}W`P4V~4>CdV`9{7UM$-cv7Mxw2~9!0oz^u6@hmbR>@4J3H#g z3br~Y8#HqGjqiW<-7@mr!eV3l2(G~0bp9*(*v{%oV%bQY{@%jeo>5~^D@mgucT%$P zon_Iv=a#@w3ka~5+<5s?w`3O(JQxNsMQ8y3XgBI7_!Pt@Qgfki8GZqkU{HJwL6%%b zEA`nYHC5GI*&&&K`BfLsstkJGc29pm;)6J6oD3-%DfVjbLSw6?w06Udh;|$rCHSep zHVkaShI(_y$2e$$MTh1I=pauM%m_9IJS(1bY|pKiF_8EusXr3dUp*RFc3dTg(EW|a zJkn-g@M$M(EbSX_U#Bftut4zM`a69Xlib=B>ErTiP4k(rL=;nguqkdpznb!6;}hC; zbTPf#w$lIs8e%x9i=$&{Sfr!T<$ym{A2aeUj4!@0vv1DIa@EG`-9Cr*=WyaT7-Z|R z375Dyt$pm59l#&Z+s5N=7mObiBbYJ0~ZQ?&lr* zI4s&RJ^|tOz7au(3fZpBQ@yDjW$)QAy`6c`yTQtHA1es0f+|3J4tD|#wS-?bmKVBb zG8wqNkGG(vdes8!@`DG}est$Pv9`@FoBQ3|F!gDrr9S*Rk4A+ zwov zwkH(nz?y>waV_$*6}&dE#JkwDQ#=Bi=6$zoxe_$!-1O7d)DgTw}Jr*bl5<;0|yja=B5XN5e;p4J?-%_#0m36*_SAL`bTbkw88VhOvI*MjCbr%RAXk zAWTglu_4ZFwihIJ2n6U$2m*5|^8B7V?~V}(y$T#cz#r%<8*6TvIB62*O^(Iig*0}? zlt*0y7XdyAV&Ai8SFBrym>)*YNPaJ+MAih^A>?pBXb(Ob*RO-Nw%>*gTn1PVRC2;? zn~*Hu*o6lKEe_GZ-~Vc!XWfqTQ`RZ+==_Sxm$22?45QMcp@4|hc8Hg_)b?A>eYqHNL&aW z#7@sP9+qF&5hA6KXXk@rnSpRLNKAFk$4i3RHidendI}a{2 z8fNzW5=R4nM`$Sj`gOqE!ci7wt%s{?y7x`hfE2&ioW+QI0-3D`CRzGel~B|{Rnch@ zSs|totiaY^&vM`&Qchw$snj(u_sxTiwb_?wg^sswQh3>ASbfXyx2=#3dRWR=mrW~e z7GQV48|)H;XLL8yj~biIxr6!{_3e4?ZEW&bCnsrCHo0qHRr3C>vwL^iaSMJct+MP3 z7u=3K46=4Zi^_Y#D%4`(BO~{higI~ytQq9q#3VG!Aw$~eS?%fPr_^CLrOU6Truzvt z3H?f$=O1sIA!tf+QkL~^JKg^eQ`XaKak5Y8?@>4r4m2? zeJ4%t{(yXl93I9s13;fVp%eK9%?6Gnc(WpTBPH=Z8*}(LxH5`cq?E06Vh&iX>7~=! zR?q4?yedv`IGLpn+Df(H0C21o_n1zSEipFDqp9j0``;(9)?i?x3yyV~42)$Jq+1JS9Octj!#kNIa^U6i8{ zM2T@uPFGh|?j&U*xnN(cEW3?;^V|V1)cRdbUtKj36#T%kytDlS2k}!Kw~VA`1HT$* zxvQCHP?ktXSMbE4qjQjgY|bKu1IK9Ipfl%vLAxA?m>H)d%5R=7J&ndJpno9gcYYU% zj=Wkr@r%J^a~JP+HGx3{RMJ9kkt&(Ao@$LLb8lHNL@vSN2IvUx@8eGmKwPCGI^O6_ zXOZR!NDV3mnJo_>hJ%JJ^teP}%ChBx1o!#zR!0Z+WB9~HM5L?Dm?=TBGW%gO$fDYA-=bG&Rlmv)ah9WB&rw!u{kULzZ8@6ijZ}4DIc)<2J{{ z%w>%r%pwyZ>O5tevqtEluuNDSDhF$*N}OW{D2B=3J;yh3kc99__6#Ejmt>*I~md+%Q`X)>m7!dL<0)_CzbXaSNDVYzL?51SB1vt}M*VeZ@a zG-bR##Xfhzeqm^U6ZYFE5+d^@dRMOzZh&aInVYZ1fqa_VDbzTtriL+A@o?Tcn_i`d-_J&c3T7AHEVFx z$pRtZba3C7k)AHIsgA{!zj)U9`E5R?>+HD26PumwX8{F|{lIAj6v*eZC15OK8T5g{ z^KigbM`$`Fk;!mQ(9dZEeAnG^3rJk78&H3z2egff;K(ZmuN%f-$;3x7o&JX8KIk)L z6$B2K;_r*ovhnS8du~sIghn2g5aoCzK<6d&U@b`TGKb2@CX4TBp$$@OUB{1UoOZ~(-&?2I(=jHg(4N_}Ge^Yto9Kf~K{ zwsM#lKEWiAOv=*lc6mL4ENy1ixuZwRZg!k46xcNDa77XrDu4A(t9hA0#W!1dM;1Rq z^qw(o8Wk;Lm>Ddhqc#3YRL|%C0O!>IQ9`3cIhmMZBUJ+4$&lhVI>SzEWf zZEX?kPLMd~G}n)_jHH9F2f=!F>#vTIx$NNSr!itVcuVPcTT5IabRv;7GbVEfvMmn`@is6UL))DRukKqfhX!SBV%#mr_Hy4eayi z$vWEJ_P2SagGrizQNDkEwg1c5{vrDM_DMyL9u45Nfqc4Lqie+n@QxJE3X|cu)*&Cd z9(fqEYu5^>M*HS@{oWrNE9jj9!G6^9ufi8)D|n`vf!c6_qCThdEZD^}47R);*n%@$ zv{tUJ8lbq5$a3;YH3@W1!_yg_)n)YV#Uk>4y57PrUopt`KojLh!^ejL*S56E$v_M# z9V%jPHV>AuAhd)LCi7WY`C-iepK&NqM`mhq?qCkQYOzlXQYsVR6-JR1OJ&EgK-mLT@9h z=~~yp*Z$SpyvA_PX%}gje%45uctTZ8ZR#m^*$z6;cs@Sr7BAC360$o?4F?epvt%c2 z)zybF$zs%z;9-k0tN?Xrs*3C1Z|ir6L#Jm?V3`0vCg`e2`elD-_E+%wY}c2}X0jKp zShZ>fRjMF0^~hEo`&$}C?5z*H4D2iCf;jmTcSaPW;E>z)i8)WNudExNJkf6cj!~;% zpKLumbJncZKed5qx0!Gz*vBxnLmGu$vTQG=zA$8%>-3y7lx7Ar6)fyARBw%4a7ZG( zN^mEmop~0dEa%UU&JrWA6+V#F$0mJ~?iI=jh4L3P=*c3BsjuicWe)GkTjlhpZX>7u z!R=jN&k-i|p4@BilvE4d9qf3Hik;iHyP0UsZ0I_eS(`DK{}=5|T07#C0=a@ZraJ@dx4D!cvs!Z`fA)tW4Hov~TD+RmD!p6e@* zT$emCHa1q}vZFsIR|y9eRpgoR^$C}b9-T`@E{y`Z3+=qbns;Gg(c#!LfZ*T5tGcCR zWOP{433LGinH$RmTNu&p>w&k(F)-_a>7O^Eys|PMO2yHnBs;ve-A>ZO|9DGauQ?fi zx;n}3Xb&C1ny&fK%*m6X?)O?Xxs@o=fB5iO1f8e*9{QLgKhwu_{!SX{_K+Sul&eon zNyWO>&c8WNS>HCNd~DI83_&_6l>)Ses`)jr5mY2}X<4#A7wh|!aEu%ncLEX-j-B5! zhi)00jLYa37O-=`Cf+SSD|KPqCUU&o>Op2^=_gOBjyi+H&+og5({6vNlE9|&j<@qO zzL6=95OqT9z%~u|nRH?LXQ~YcQLy{7$XYs{^T_IvBRYTg;)K35r=acn6}*%aCsfq; z@if_ai7mQ2=Cdv1zV-}vG@737X-9i)dtzJJpA!>DLaKP`^^$qy~*COb!85s7kKs16U%gky0T^acBA=p?7mVc%*LQQ^8KT1c4NJZTl ziIIgWJh~sqKww>-U`^Hhgf%7fXrVY7$I^dg4($?VHu=tlyJH+1uHK2Ez5y-EWG|Pa zpqQ(fR&@97Vxls6WOD_>s7cN%-sJ+dLu4))Gy2a!pN#26F(0L59%$a{F3R_$M>+7> zZQ@SFnqwx5NCarJ&&q}AOB?SChNT(*S z=?t9>9M9ITEc?dUdeHPOzL|acEQM%Vv8j~9W7(1=WtVzL?eHV2s3=)pB~>Ku#%jUe zXcW{D$2|UMO*r93gIMsbV_L$7GDrj@L-iYVP5T4%oZJv99A*{D$rCq_N7OxV7WFhS zVX`DnOl>>A85(!B!*bafh`Sku1` z3hkOeW)JR#KiM+l$5pFIyE%*pKeM2>0_{ZKs#a-HhVH#t%#+xgknkYEv-JnBnNCya zz)995o)mHw{k*tOWJuBDt!2AUi5BcDk>heFW=3|Km(o`kUmthmArKXewcWJ~^hA)$ z$&y+dWqzOK+1>GKtpFdObcQC5Da?F2ViFT`8MDp|gC zPxs85Q$MHvlI+nM8goB*G#-9c$&9P;|9Z2dmcu4EeWhM)&wYNK^^My}GJ!7MM(*Bu z(~V@u9Je{}udS^GiestmNvKB1d<0S=5-x#UEa~8RUy#Lddj2UKS{t;pzcV2(;n3ja z9vov>TSx+Wpk2x+O z7@hyDezKTH<^RARF;sNcaATQ6IV9Yc4qcO6V-gau_qGIvj~>}vh9;$jaJ)CcWa! z75(<3j-2J-v9h988ft2~eR-4P1UF~rHqS?mG1AO@+8Hq+rACvkKBs2prr#GC)PuIf zQ;Q)9v#<+qKKfI;faYO%_0LLNLBHa=gOKLC|k$n%~3Sev!tV z*F{B;o1Oz8Ggjm9g?Vx@OFfu%&triypHd7zL0?}#)7nqY?@FSTLYOC$K{y3a_i^fQ zKE>?{nSL5VAeGk?+1udYNFNcFChK(Qdv|2@jyxbEAKPTGm= zA7$lm>ZajOM~PK8Q$v$SK|A81@;M+TBokDL$6jR@E;c{F?qTLKR?vmj&QubWl?&$1 zWu_xt4W2a8lfa#`N6`9{Z-L|Bp z#8_jQxh~or_MRZ~m^G_SuUiPRfvc7GDhF)Jt+ZXe+T2a$*5fG22!nmvISEDP(3boF z8z}y{;3E$yq2W>LFcRb4;|aKjckGC|-FTNH$q=Y}n1+5=ZS5a1#+_n1gB{dfdW(-Y z&jWuh&uQAGdnWgKV$IqPYg9jU)a#29$4^C)hzPSPsgz(IhoOt2_#*~ju3<{6An^p{Nx1^3pKaqz! zd2;fTMKB3a25Rc+F8Y$W)hmW~!6}4?7_gb`I!aDDd1V_u&hEJ$wjhdywXRa10Q`p>7)eb$4*eP|3dEqwnP% z$;8435AgblzFSW2O#6=SgajRuiVqy4x&;3V$QfvHS5O2I%N1@;K5*>aOWLMNMnCSwl9*cPuQZg6NI zvu)S4Ym3oo!$Vey#e&la`z1z0a`-Nt&dhB6{hgF*IRwBzk*>}i(8==7XDR^+uR%Q_fr}y0tc*Trn`Vf2(P#N`5Xk#I>xQod}sBPnoqlZ{p z=H5}feqFaUt&bb!8jur8K+%k0q|h^GhPBm$)4kYQ9#8}101S>j16uX+My&_LL5@&H zqw`P*HlDqyXGBMuet6HH2VLc!Q0LIEsI%X#k&<&>z&7Y1UbBP zKAxG@+NVeHXtgElI2|DG33wTE(g4X^PPkDKc2ICH9WV!<0|9g-)U{Asg|2dTe9LE3 z90H?UW`N*r=8#y=zZXL(L>D;`$>y!KBi^#8c+>wG1e=>{YnFj$J*P_v98nM$%bWHG zj=lB&cApjBL?5lWE?ZZKYH-X>BL^CcISP zuQRNLX+4ke&?%_;SRFe3lk!FIqXyw34so{ zz_{zryftmt@2NRz;+kcC@wZ>)qoJ414tStpGZk;2r%&fY2Lr;GaPR&>#XZ&KD>sk^ zNfeIFnzM2J)K!@i9-Lbeo+6h%Tq1q_U|Z`PxqxR^dpd4(4~6{5u}mZU%u*+pyXyHL z8~hr7Mh+KQuBtM#@mKieXBA&aUr9lE{Jo0l2IAvSstH0F(*-MRzZ&CLs~-i3Edt$L z+Q+=z7%?uWY#ve5WNTGv~aYby>Cwr|~1pKlxg|=^Mrz$TyzICLb zPDSJltJhh36`ozH9bE9}vvmxEr1Ct`x0nq%`0ACtO3thCnJao=;i9@3HPWTmF@yW< zZ-4X~$Oz_7`InS#0)H?f=u?9qlqdFc^!XRF71wKvAwo~&Pkg%eGB?mG`03p zYj7L0)l;L!Mzy}0<#njaH)UPUNeXCQ7PTfat*WY?rHUPze#=IldgwzogWV`5i}%-= zb}8CjIye6Bk@DJU%}U`Os;h=}>E1Z{S=;_SWv|H{G)bPgkj)PxDzeS!^#hy!m~D77 z(}EwzlZvjLPM@{UyIWowi-arf8FZbH2T{sZO7S&2S~~_EDlRHA*nby@513@AO`E*E z1MkJ@U29jEvF(nMX4{jPGkn?d&eA_;P`IlGkrF6`%#^iWw7m9b^%|>LjOl&uu;yAy zb+gIHV)L0dRW{p0fB%?Y;gI(scS%}t6@ieiu4`Xzu$6sUyv4q8?x6U<9@|G9A$JvY z`S%7s2+HpkJxTo0!glqlYm?^gn}^~FcVVoqg{*o(pB?TlrWR_d~AE!B0O!-)J7Ct4(Y3`H_YUx1wfLK0YVcJ9kU02>Q4L6=Yp$9{mTh zW_lNMr%j@Q*&#JEdL5?q7g27u4YmGLfm#G`}&0~?H(Hr{UPKPH=$HV3HPhO0ax&(9#3qoWo za<=kUaD10yQxm$nv7||#XKZHi*{E{Pbx*U1k%omuPyF8&H$|^~-ba5?OE|RKC7GG_ z<1?dkA7Eh>I!^R0pyZB)@r|SMk(y;KX|-Nc^Lu3Z*~dfiztOSQRcS@e;OlS9gL3x% zzCS^)T?|Lr#lF6G@7$6esWBdDmo8k8I@Xm{oo)#1dS;7lw=3VS{c^oK_`;aVHw_y1 z4#)R<8#u6ZSEn%9$lphcM~5lV^AXpkMSmVV^}2qHc4=?>q^Q*0O?w)Y*KT)hgMh-d ztm#bvegg?#G%~`QKkY0YEoWXIddgzvh!q1X{~YuFHnQ)k%D3guwjMSKSa*4LLfIlk zSihQ3wkFE_5a4Ie=Zs#e{*!Ixp``52ku;{ZU4wo^W z?zv_DGUw8dAD;_lCSZ#lm37dIslWnF5>HmRqftodN3uMm4`hY|Vqq<^q07o{*rc2_ zRa44F@FGAnr=c-pPslurk%sL$j(CGV8#c=|0%|lS<&_9j`lhe4Uh*pHL+~KD)JfLyOaIn}&5i9UG&^e=U9cIV8JWV`^2B z?&qWdHpe=gR2$S1T6eqPS?J)GA8t48FYQ0PvD@=%f`zMNNl^w%lG!&b0CWL5m|n_*c1_-_)_^C zcPg~xpnwdo0 z@=b3BICL@b58gZnaQNQh-eM8uM%c8J;^nw;hI~o z?$V$qK|n}t#fj5dAd3AYN5Lx%cildE5i<1mEVo`Ap8L{>LM^5yx9{NGu((9UQN^o4 zN~n}2(%O)n7s9ob-qg@fv8lP%#!js8KmSDa&`?cpu?~7LP;}f&PNBv~8q|uMBJbb{ zkF>!n2K$)lJe>LLZgYj>i^fn$=( z>GnxxgLhi!sFxPNG7P@F51boQ&UFPc)+1FUBv|68n~xr84jT~D`6K7NiR>ZKzpf@n z)g<@VLC?SAAn%AJ?QAXg(_LIyh^XSVcF6COI9Bc$l|OYf7ejT3L)Y+)_E(KuQ$jSI zwD$8DB;XXvr_{&~>~1o2=E2OH%v9dHe?MIKonkDje54dOu@T9+!>1q<1F^|8Q-Gy9 z>4clXw1Et(*dukSbgQog!TMxs)1oHX&vJAsQhB+GUvOQ|kcc61I*C7>? z7DYt0u{XzyjxOOUS?!1fr8c?>Lpp_ZGV`>>2FddB`$}*;?gwd$*&^Y>b zN86I!OT{ehy5w^7UWc*(8X9+=$-OLAV5Vlk$3pSHF4sO$=F@UHQ98%8iUdG4?u(`a zT>_Aai&wAu(*!mcb}l_VDEBg`|JdZ+{WPJ!F)zYsSiWtPFpU5ki2Bd1!5^2yq z(O7IMs%g}ZGz3E_FB@&{%-;y{o(ikQZas}UJk&8%<>q_r3weomeALIy$d~i=g98kFa2Sr+kMVR4-U+^70{F zoWcp}VGI<3v^1=R`Ye2w>pe}|TMp}?c=1YFbHvM=G;qoFXI@^tMNHAFI)s>kNwG)* zw1(|voJ=aTbUt1hMLGd4#Kfh2^8`Z?3D_(hq4x}TeFRdMM!~_L4=2ABLIr)z zZc^-(xSP0CmPiA0JLrIcFSbZ$xA|`*A*2LqYI*)~midejdZ`Kcm#8`!!Dy?}GEmILi5ftxRl0;Jine!cJ7wYYN|Na+JH z3O?!V*$GCPV~lo_moUs%UC(MYV81~R?`copz7>=V(kNImT0YcN-+??y{MPD9wJ~T0xkf+@2OZf+@1Oe~=aK}vVsw$xE zyg=JT(_Y~GB1S(qWZyja`_LSF?Q(=_EWjF?Ti_kgkSt8F884cawX*xk*^>Vav$tof zRVZtnaiieEm*a>eS4vm9Wk5 zmqSv6O*4N{8iipF_|?Jom*D*J-_WY{hWkDCG~-3=@rnW0qT7zoKK_AtR;pGr1&-`6 zhq(~k1vX;t$rD*lINr5DgXIJiZr#_{Of~&~ca69#O|hZi>NEm)`?q6mw+}shoI)^N zdl)D;jlr~MpWbylaE!|A5=2N$&03}kgRR=NlkNIC%U)e6ANq~J(Y>`P_prk@fesBm zaqvp84P&1m>@?l{0uDn@ru0+%xT6by@lD_a!;a)JzGV$167v;6IVouLD&|hRh$5ctaP3+NBXOxH;9{6NuZx+MJdqKa zmyREgnD>IUB}l!DG~cAT!+430pEY}SZB0!VEv+(I_7i7pJ&dS>G3Ni*J3J92cPeK{ zQKQ~9Yv1^`%TDL2`1KgIDyqH0sHm*yzOqB~uezVvJuAt5z3rDtj;OBTEX+V#%F>t+ zwE15TCPrDyGfCrAPOtde(<~=Emfy!bf!yH7wU4q^-?{o+`A*Y?t;~g?o0-WVD-VxD zZoM|udAIv-t{_&}a6M5*t!efRAM>%vj{t+irBZhMc3q3V3JNM0PF4Nqu!-7fC#zkb zBXXF)F@)zK??CMR_pyF&c;G)fSoElat-ky1RucqV-&NO}d>Hx9huL*i`6#buXO-_` zUfu93WtQ5%z7?SVi;e%!$Fbh6Yn4;|q;4)cP8>P_An;qz$aN^ef>BYl` z?T;@FyXq4{%t;=b(QAk>k`G5v!NN z$QmKq@agm=lGe%6B>f(AB1(R?`Nb2~nRPJ^(F=)XcFA-bFY5=W?x<3Uow|o#mut4)Mo3O&A+4qOU)H+Td-ssk7cc!8q!S!YE12Ba$)*hX7-2uE=ptR1MC~n;?r_ zW9}fycobX3oE_yUWp>6c!zL-%X5H)N;6a>(;TOM}1j4Tj0}5qXgmNOmAA8 zIDybofiss!6645FY(YOEDWm)Sxj02*{|35#C?^>&fB>rR{t@qazYMTlP>8C}sIuTM zQd)lh-$pit$Hp7(LNGxO1m0$lXIqhq3ij1KC3AsZW*#1C_yUrhqzsZr#nz0oXPe5R z$BQHg;orGE5J@mvLTb*f`muf<#u<-l-kv1;fu56FD(>`_kCw@J$u$7&%U+MKQ z^0d%?xePKZp|ik!K&*SRD5L2TAT2gRJzTn2`Woan2M%7qrV-fd66v>r4x(Lm%b|}< zI_3lcuC(I-U_k;{JA2D9(W8zazcG~FiyOk2pnZ3%K&9nQkwKiXE_GRqoreFrc9Jqd zUM59(&ew>s3`9P@IC#mnBXBJswi`%=w0^5cnsT5AOg72ex7zt;{tJ>MRSXEQu`7Agf0#%xl?_eSFRi&ffTp7HgOY*8@L8xTMAZNLtd6f z(MpM}WL{%;sbliQqSOJpI}!)t^|EYtv0(D`>Y!N8zPEjZOUgJG7vldVc$hXloQsjF zOQRU2ihyYg>+CE8shD`>YtrfaNf2JiQCP_pg)ebOR$(eaL)^xV|2lRr4=~BCe&jY~il)8o zup95n%WqD5utpRS2kjiEFDL8zuU{p?Lkz9og$eY*p;$IV$5AtLRQ-LSjt>`Q0CEse z{7?4{I#z|GpUPpys14vkq=v?a`+8DSQK-kw!<=Dr0f&n55WOy4Y?~DxnPg0#<>A3L z`u_bwdU|Ok|B~r6n>MnE7tCj|Jv9sZXy>h)f6$M|ilgGmzu!P=FmIrZqx-!z5mw3y z?pzbQ-B_PSWxSYC5E`nk5Q&_cY}4n3WMo)KjC%A47c)A*wt~U&bNX7hSKUl9YWP{( z|8HE8a=EWvH)+rWFD#^*Pq>=ksxvCG>(WEfy=BX$SjD&P>TIfg(D8~XM3dpeRV2LQ zL`9{2kue?Ar~NJTTo)cNCI?b% zttyHia`&7NK1D;4+_OEFzaLm~bgm%pv_Gt3oTE4>416MA)mAU@d7*xrl>^k}6+;f_ zObr!}4{Ak+n z;Nc4|O*WSub}qDa{efe4?M|ILH!-C+whW*J9Q5d{mx}vBfmP$;4HD2&*^7R<@@#3A zNBM-f^-`R7hIp!psaCs>OhU4VbualQ1yH>^&<~`8h15xl@bs%?dbvL<#fg(Z6=FAEyoR8DKrP)M1rx;lm-7w(30w7U zLfE?X*Ixq8kmNe-@g-aNRMgcMFFq|hf>ow{#QF0BQ~VVUxXwIkvy*l{T!=?!f*nM( zf;k`|7??jy1xo3%umMW+s>lxQ+A-yfft6d_RpnYY`1!58-pwUKsqmuH00b!rbK16C z!1iasH?~Ql-Yv+$z#}RWh}WLOM29cH0{4A$vq$gV+y3rgyWd;go-8xHTXT zeylDj0C`#toSHN^&br^r8f<@0wr6Bk+X_8bE>@|Zzq-PJqE zAUMFDF2N?S1>gY=VASn%O8|{9RTA~HO~Shfrx$ERu|Nqx#_zHj&}=PL*5C1_?zfAm z6AXD~#nD`5%M7Ps|D}>n_9$UvfB*3#OpAt=*mEhpWr2}d$f*r!!TvUxi$+g#XJJrp zA@Ix!L$lC4Uw*B?K~Pd!*~?QJ1u{Wnpr3`s8iI)UNR;?+ah1o$&lZ0h5bXJ()n7+l zbIZu&iJjDy!o2W#WB!i3Uj=GkapkXf8pXqev|LU9$Kmd#;&icp-RDP**A|~N7h2wNAm`} z_%o~+1nTQR`YC->H`}KaPtfYFrAmOl_ifnp#QMZPcnM**TUAr@dW*cZ^~$W7^nS@H zJ(zeSbT+XiyLPYBj!}s1aLCc_r@4ien^l!k5D)2Y`KTki=1qf2QSkXDo@=Mk)EIZt zITWw1eB_}>{#`%@XBXf*4jwaA@1CPBIH30HBAzjUZ7Ywsn$W?|EJ5Gbm|h~$*9HrJ zlj~`Q?3pq_dG-MA_FY!uMKhaq&o?ta+bL9cN0^rm>H%060lmKl|H^gek@EB+Guk!w zi}2E+hhAOnm(y`>{Y_dv1RmwMabBjj^W6)-TsoC|Quf2PV+%j>oqc-q0YHHut>V9| z8(OCy@Tj28OfT$TAY>IjTlUC$GVSnv^O6dzh75VLJo0pLm1ocJX>I2>{$4Ze^b~Ab zd7Vd&eE3r@6Bn)wgd8zjl;Tefyk{d# zv<9(*_e@D$x^Q9E+pwe2Cv<`=C_u6_q$Z^uq5yw@qVziYzYSXW9 zLG6N;=%7>EzAWGLb;-E!f z)O&mVIU2&;5X&z9r}yofvT>3~^7#34(WoPo3r8bll${O4qRrRIg7V(H{Ou3*+;jT2 zk%xEQ-05nfkhCKOLgb>2=i6=9&+K!1_=!Qj9c`OOV6V3xaeH83;Jq-W8uw*-wYBx3 zyX7r03mOM|<1HXcLdbYwo!rrmZFI~Gh7XTl-;DKvC<&kDY`n&2&eqjrv=# zX>E;}!Acl7q9m$>XHTBMKTL9MZ27a%Qm0+J;0HiO5bf)l@Zpu!hvTcVzArv;#CQJz zWpgFcA79@5F2CC`vl)^YWr>z*Idy6e>(8*~b60Kr^UGow1d(o0-XaO*wf{>1p>9$+ zIXP5-rKM2xnIN)5Y_-15lUWbeof`Ye%ZDOBV?l4d`5s5<(%W6SbP+x|au_2;aoRWHGKf2suyaM~H%L>$o6Dss2e&f=KNkC>nhp4y8Fd8u`yz+6ve2P=X<DA62yu=aR?4k*{lydt_-}?}q;u0^+l)(CAOuNTO zI_utzfDQ)K#3T{Bl`{R=14yUdRaFh47^f*T_E7GJuMFuxk!=napOHhddaeEBLh~}Q zc7P|B_*v*1Tw3x%Q(vF)31b%EU`uq{xM4$H9fQ`Ie*ezd@NLw}?;ltHqK1a>E4SbW z~t(jB9oQ(@iiH=Xt#!tg|QYF>6}_4-UWuw88ehH=%+y?Nx=PCR8v z8Fg%T@O}W$#`^V*XjsJdoVdioE32zCL-V4pBE-%|eP6f7Rs>lE#iXL#JtJSsxU#aj z{~5PRYtOk}3eOza;lqp_I{n`xMw(d30dSv~MXydWmPnwB(@E#fy@zB6`aOR7l*{N+ zYiloJYW&z)RsPmC!-wlNFAmDi{zFcPWWp`=kQ8AoO}qDtmD}j9{`}IS?!XvMaykR- zpE~lshK9Xy>Z`5(ur~2~ZCobEyIY#Gj?OU=iwFZ;L;oIge0&&G2HU`Bp*u1^Y`$SW zub`6tdp<4D#7sEsC(lp8-y9_xrKhNs`ADNjjx;hd^4B<7Ia=&a31T}+d}K3+n5`<} z*bo1Qr#FG8a&6!KO|e3eC`z$}RFX8QWLT+)ic(QXk|xcHb_$_LMI=c=DQToxgRzMU zl_m{{=E2lJDew1w-v9gW^ZPx|-p_7pt^2;Nb2!f9I8LjsC&pQ@&RmS^zQV_0af@RL zDC1e?WGPw9fkR=vBPOOAe8V;d#hU$<63%kXXDn*C&%b%Cv4@AVQ^!%Q_65@&S>@Zj z-P^Zsr;gj$!}0?rhIT4=Cyi^Z;NWlIOj7O_HZyoM8ZxB+tM$M}x~}vnocjPEB~@*D z6Wb}e>WbAEFk?d+?u2rJ84*8Cei|#Rlj7sYUmKiw7t*lY0Bx)xbaZ$|8)}3R?9Q7` znAZ~TB%IYrDZdALNRzx+EU0+}iv;+feUjrSwm%g_F{ZZE5ZaAERG5OmK!n&ml%#%L1=swOkj;TpVHKc1d z^lpGdrq!#laM-2uapfV_k~F=!DH4OMqC!AtUwFwAl^7k)?WZy$!bS+JrC(VR z`0L}N+w6ylnF&S!}px4o6MA2>9006eEFXy1o!3=36SyRP0a6r zxU)?;wwl=949#^sGM%d_6LyjF06jS@FV%dtH(QPm%0uqJsScYPQ99QEjRaI<&3zw` zzS>Qd-2u57bwjvnY@h1KzZi>eZR{*rOh$n`3!6boa;LgFKP}DrlYw^E_ki=16eBx& zQZ-T%#IA`hmgkls#$oC#N+;F}FL-NLu{!w28%5e1^UnM}IPpSvW~{BMs{8nN#~-hA z&s{GJ_PFBDcLO;Vr2}V^R@bdcx6}XK-ZreOL+hVEj21Z%TFQ@j=&Gm2r?uDIL;CFZ z;$oMzo>(Y^2CCiSZq`m?{!3Va9~D+Pl`j(a=Cc~qd*lO1ZZyTiiArx2U`&51NUd#Y z1DP!7AYMU@UjqWD+CpTKkGdDJSj%ZP)jVg+gCXXJ#V|X_ecc=GdFNm*RjY-SD6rOO zK*`pX%xa_VpF~`!q!gCFH9VY*g^R6@_&k+LoEkt8IZn5l@QY2&NY`XhIxo8;?BHB) zZ@qg8IOLM|FZMK&VFw3N`N9Q5+%KE*KJMw$c|Z@^y{A)r$qnfuY8$owp8Ra67)|vg zaYp)H8~$OM@YBeT?)QYe-yiCX*ne|o&kmsaq>8!xnB&s1dVAxL^phu*ukObagxNqB z^~!EfwSe6Ar7}IMA0~1wwW!WV@b3Lbb&Pp?428H5qw*$zl?| zz6@;TkEG_BEjuw3Vh-=R9);B2`bBIT@f!4iTFlt^9>??g*he3~^Dt`OZg_K}^TV}o zew%Wvs0KZ-0P^z`G}`t`x!0~~-xX%i@|`;EM7JasmTG4030?uZ<=265joSDJYILRc zUmWur!*E^Xjh(b*nax-jQGtk+^cHyaj@g?s;Q}~O1M3rpXL0OZx_iZ4L`!s z-n#V`VGbJ)^}c;AVGr`$;m(Isv%FLZ+!5R_t*VlZ@(AiP4u*73iQK*1n)3GGeNB$` zZuRjNeO30E>AfpYO+9$fWOOZt#Wq8`uZBKhZ+01X7sghNQA2&p4iztAfB0M?G53zh{L{qe+;ege3iXu@a6NGU8k2GmJDGR)v`~Sc8b)uc2C)+l zKSmDV<70gQmFo`83QCWHPx5kdY~iE% zBdica6vIS~XN!oaecW5Ah52Llt%+UOgMH4GDI7LYI?K**G^7o9ucXn&3fsMftuz8m_-p6+W(4-`^E&& z2JSmXzp5;M7>5BoJ^U^+)|`AR=cad#lTpTl#U#bi9X;vCIEB*Zl<%feFWarC!o&gO zhVci`%=C@4bz~NU*BdzV|F>`6(6Y4d8d|V=5?i4SDf`G2UTI6vpaCa+q z0>-9&Seh7epZ#YYJ-fMr$Y-Au%)t4rogNM1esZBiVwQO8#VB7eBe9W-CS*R+Ql2<} zzF2i8>D=`JttVHmUpV&%iKK1jBh+Ptt(s-XLNy%b7{{|2?ECkRGyb$oGWl?Y~=jru|~%r$HS_7YtTO`qrwI$8$^F@?(RF19?`k0^=~Ao zcau<}2z`>g{l=CVx~dkNeyjgp*asGHT3Se<7kvoT`Qn;_P&>V0vWg9KzX<5z4aH2& zOx&}FXdr(lnxUntY;PcaiD>kgF@l5?vK-eA0V74Hbu^uR->G#?fe7{*r$EBphy}*> z)&o4Enn9F9!(ky|ZejLWJS4$y*C)N$`3omc zvKV_Q(lJ4ic85o(`s^yUn3m_brUM5m`oASrKqQ4$?Wmv4A4iQg-!P;KIEU!QzJMKs zOG)IuI*N7KToJX#hK_%m@G=N1yi-yVS|BKPqkf~)?kk3JxC%&v@nEl=voILd(NS4_ z6z<}iVH+&^`V6HTz>0#Dex6d4^FgugRGfJ?vm&6s;F>Q0JLI;kEG>$4g951IfOAAP zA8+qNX=&LY@C|=8J3N^b3^FpZJ6bFiXyJ*vd&!b4pY6Jpvsm9F7@^`%*ifB64`J!+ z)7@D;HGO(B-;YDa^uSUqPRCJy+%UFk5}Vzr`~{UcE}oRR8&A7XtJv5SqBj#ZYw=hq z9JXM9Cwpi6cT2CaaV-BMgGK%tWG{@6Siy6%(__RP*cGrDt7F5=ZE7{zAS3 z^(u#>`!NI79BaTq1=GSVdnYcSnGtf{O1;@Py-cm8u*A81T?xj!k^c14lXfx_ij2E%ll^3c!^*yGYd$_Sz^4xF&b7ABl%T4Y zgtz`(+H}~ke%)NNS1zXhwe2%RT`@*`^dSu8>g&IIJc_mhD!#h*eOJk1^e_6KXdIOM zn)n{;v)38v>&uD1^B{KxAG>m;m*X?yzuJHhqD5h%p0BpPq2ZPn)>V;(zURaf1cqVo z*KuRJ;9Hyreb30!NG*zVTChjlNqJ~met!v}^aIz{`Vk*m6iDOl{%QSey@IpD&CICQ zixfJ^NNfHAAo#ZC7JjT+W+M3Ok@}rhJVeLarNqN4gyZCDlcAi#V7#!Xa6^RZx>f%E z`d<^n)sqEI>A&_Q|Fv|U@9y^wub^b5oLBkw_gBAcBtD^IUY=d3G)s%dh!A(HcF2)- zkO%w|L*u1ty8|tO)aZ&L*Y*uK1z%&{YQrTsU)D=^+ps*{DG)oeW5=D`+@5!8aI_}f z-OEAI=sofS52>aJV6y7<1&)c_$4RA8c+3<`vf9urw^uf`Tw!lL^`dQQTyd@S#i!h4 z(_dXGUt`B+KZag0I(G203roJB3-F!;Hgm(R)c4$cIU4_dBL*F~`&P2b8;+0u2GFgr zVJS_IWSl>+(fLqaVRdhim(?T4KN_$S6B7_qMo2eFeFD537H5Lo&D0TTjUQYjbg zrt(|mAGLOxagYA``qux{XI%i1*L9@@o^sv=`K`5^fE)$)Ja%v>IK}k(G0Lgza>L( zm4OB5#IwHvQ%XzcVE}XJfu6cz=pMmQ^r-SPzmeH4(u|#tRhxyxKfu9-H`^{#VjH5?odP7K_ z610$gr#bfkYl`L&6u?mxBS%d4mEYw^9zT11H8dfEiWJ+^$ASERjuwa4%w`YN6L;Pu zo)vjuTpX_`IRp{|zpT=0>tx(RsYo8yct}4ERlTev(q{|fr=q>@X)@;muMZCVu2KgF(5HAB!o6XhfmGQ+{O;FTQGcP?jV^ zbVHGxpPx@#1&R%tR5j?z(X6cJ`N6@YLWZc*aI`8bJAM6O88Ly3xea{;euHJ<6WAvTy%>+&FHPm#+jQ0qGhwe7N5k#}uG8xFpaH`4hKo zn?xkGTWFmA;S~hsynqQlde*4`k=-5cY4++RiJL&Q&3fEVSY%F~VAGp*$$YAB$#!#> zU$!C}l~T&VGjlJMu>&gX5(xre6kS9+*BLY^qwG9ZUQjdW>3E%LpHFW5??2#(%lLI+ z{jE_=1d;YwBk2pLYbFgn7KAZx!{lreCe_erln5lP@fCb;| zT_lYnICdR&H?m(m;-xw%b(72++^9S{N|esy?RIzFi>j(EL79&}x|{UuD(pmn3iY*% z+Y(I@HnJO`Y5%muBbvaOc1U-O9MXNEP}jLxy3q4Pe^fX$mpvW3BOz@BPJiq_)Zow=D7KkYoTky zPp#L)oU&$nO@;&GQ&nhGTa}fRpDo^-oIGfB8@D&@P;7pF2Ywkhyql^w+&?2zY9$V* z0gai-W=}_6P)Gy>1gFg0VU*q5jK3f$kQB~&)_Ire98endwbK3#ulxKw$6Dsv`ZtJ8 zIRbzZZ|XM$?&Gmb>bpmlnaHJ^d2+o`LWX=Zujn?!-mODkUiU}Om3?`r`C0DNonaAbMuh34w;W^9JbpY;*Zt~$Bwih zQHmpejZM2^7py6t-*4L}D{%vIVs6%FpQEOuVfR^~Ou3sbLv{dzAYPK-CE5q5b$V-R z;tLdG-h_M~zrsqe1STM%CbDh;Z*D}Z=JaFM|$;!kNNubYod(* zx^;g??N!72G}Uyz#NYq?sZ)cS5Je31d1LJs@O{ylmVS6plD-2lpDq9n(v5*QqL*f`Pjj)*mV4*ShTp!*hsj`L#*Cq7 zwkjy!#+b!A){p+-#_tbwVFYhR3?*e{TZc{(K^O6h^*?K`lm;o{q%L%gLxVv8Sj|`m zNX-XD57=VE;P;gGvSkim(hRtK4=*tHDy}UkB#yCK2nvaCcm9r0j5te~$P;1zx$8w1 zd5;~tksyVe#g|8!F)qPfb{s>>6FOBI2pV-tE@cO$#}Hw6C8hHchJKqi{Uwa8mhCQD$ow(ZPsP+9>UE10&lo;K{Sf0|p|mMulI|8%lG6F&9zEZ(lYeOCOXh=cP|uASnm9XjN_NL|I^RAmqS zv;qLtV4qRiy>^a7jO6;*R%&h&Lu*yJIDj&dii)tZtaY#^XJE_VeZ5$!GAdzmisdGz zZPzlc^?O4(8#{C(BL~uLR-O|iHp!jJ%02qYX`>7zqCdmfU`y{uPx3MCNUz8un$m|& zL}acHY`a7IJ6_kcwABdKuxsv+${y4Q*exIzD_I|79pvnzK`rO zyy=W}K_-aRSUZvk zZh4g8La&PpXz*JdK@y4$Z?js^Y)r=(^%}bauHxJM!|%xZwQB zHij~&J+fJMOp3{f8+xiD>%BM`Z&M#UgP`HoOG6`K$!}qLK}Cz`QGZNtV?TtlheTU? z7n!O#dwO=A7Cl~M(Kn{V=XYD%?p|x46BNqfa~s;(7-rq=_#HAu$^U8=E2af^{Nr^H z?V0ZEOZXtwD44XyT~x&k;n*?j;4vz(=VDax^pkd6IWjo~NBNUu&Yxu0V|aP`;ltf^ zbOcaEv#sk(0jOkd?J|2d^S|RKPB>^daai)!eclVHl#W0DL3c*VYytlDpxw`!uVv>I?nFNvA~R#=Ogz5?MODePi6R>p zM>>tq#-_&e$B$}aXT7`E0)v&!k3w$ONq0CL_uQgdG(~f@fr3RDizPAdl%0HR*k=!2 zRqNOo&047fJxQ={y*L~YDox}?N`JRoTK5C+P0mAwHs2*nI;W>lSit0HUCR3-GeU39 zw%~ja{Ir4N|D4M>Js|cLylLIlrO^C8G1z0J{82LsJO@$d)PwEhNWCuQX$2x0vw@g(zxPRx)E+toaUfW_e^9p||kIdEsYP8G4dvb(RdF-Dd z{rit%i!&_&#}(|tUU0DM9NrE#F<mgUPA^w8n)`tAGp=~L0Y+ghGd9JqI?QAa!ew0`S*m5YlO zg(L~nF53X2Bi8m>efpfjrRm8N`Q7h3bTv36M0#+L9nsOtVk%ozs&_D0tQenBncSdQ zF_D@wuDP4BihS4un>j-8wj25{)o9S5wf_FpaM<32S1E|n1z*s!QW;w&9<~u5XU0^h zYj@;|?$Jyxmc7iDp>k){#9;eafxH@e0zwG>V8Yfy4EQgzAMWm3;B>6;D8SNZ)T@N? z{lARvU`jT?1qfUDfkkCmcAC}L#D3unF$bt`Cy*y3%mjq;(lNg{5XtwmnK-!KP#+oY z#Q#|EjJqteSx!Cq$dQFKTIdE)fKt{YV9q#s(lOmhH@D_b=uL0zO~$7is1;l;+?Ztt zfR^w*Ckn4HFXsmzzhmRYrd99C`BKXkm_Ejc{$t0Za-RnMlh}^WqJpR1(4e!-#D3%Byo4z+Mlr3l8 z)Sdt@ypC@>#{UT@c;6CgokOjBeHWc!tP^!;ihj1HvbEOX#!(Lgd#Xa00rEA5gxTEyXraq=;^vCZ4x!h;AY)H2=K$Ai}{^0O7sC6KO z=}Z0t+xPOS0pS2U2Ljt+HO^5pu4xV`==wX|fK_n7Y40D~rmi@F?IVpb#kHV;(#=u2 zvyUl>dqflLp-JiIy8O>@CkfN`b#i+W5<)-SFD)$^-AQU>^3GRFj5Sy;a*g$bG9HF_ z|JKzJw3qw({=^AZ^_&O({H&T@52nUYb6`U0+cgx`bX@sN88K&R>TN5s6LcZNLm6y@ zcDq|%etW3=v-&|v-v;x&j~s#Ll=<^)dcMxYoxLU~I;~Ttm8S|2XeNpZj+eva->=E7 zQ5RO42MJ?G*l)3iH^Blq&=#p`W@@VYbM-P6h@=#?T**R)f00pr^{w3;EAtHhRx8|_ zdFbOzcXtakwen$2sJgwiCZs!A7sb1V!Kq}V0Jo*i-70I2>>DE?iVR<@x;wO!I7F4% zY~yGAFTm$X8@wxp-twmKVNglos#j1@03wD~3UV1?U~%TyjX(X2jGAUh2!FlI?Bqw{ zaz(?*>C2HWe&1q~Z@oyLJVe!r`fIw;9i^3R6b!LmsEn5&??Ms}v}_!M3B*ZKMymYDhExW>}|*7iUsQ9G+*@OBZ3_3Y&k zvQ#Df2aikDVy~iMeCKYFsMx^TrW>h4&Ev1hC^L-qkcm{gCsDA_kN_I<7mTY0s81%D z&=>)9K)NNm*-Y@k zj&9HjE>u?;W9t_CDSN{;)&IAI{A>LgnqAK3YJ8pHUWffQ4`G6fI5=kC@iti;4rNw6 z1Y<+~<@nMJkuWOm5gdQUJ3k+WJog)!d>S57v=By{@R|V(DXm+ zh%YAN61EwQ)`XCrMS^oC=7rXa3~Z(bp#Uv~b4 zl-N*UwCrX4_2lMFv|zKAu1Ik~2FXQ|x|z**(B32@k|qiD{(SBx=h?tSFVq?*U0v$o zXV3pWef>VUqN+-9;wbu5zs>m+04Z!OSB0HJ7$Qf+%sSF}BAYJ&FS4>CY5H^>KvjhI zpiMh z-752xqyn!ggt0<`kHK@kC!UO?M$I(WZ~#J@%<-K@ zasTL<+1im`cO)e#X#=1rqBsW1_h#8mz?IwYv9PpuK!mE8q9=g9pGz9j1L21oGH(`2 z+1bw&+KEx4spy(Zq{@4Izi};PEPP`Oh)B(YU9+t{JW@)02(CYY^XU_z-F$qu zw*X&rx$U-VdY`4lp}vc`9bb9SJ13A&Oe(5zJ9gp(q|uT3`t_5(ZEsz~o6}jf6voMw zSAX95{68)LoQadR+(up+ygZV*lY|KFq*VhhQ1GfI8KYt}cP|PG(ym;YbNuv;KYsd; z#MDUhU#~Yazg^d)>;9dA6pJ!gKF9dP+RZJOE^pkpP1t~OmT0b}@@4DS64nB~R{h|I z!eBu%eD}^BV&OO(Oc+RkIBSktq3!z^fIU24->2Z1X+u+42gzG-q^i@CZ&rvffJDF$y6+G0ID&HuPppo+#n4zGB~&c z0ADuK*UQT~-HGtZPB#El%2A$i)r%hx)`4PZxD(mH4Mpw&XRQ1^1}xRNYx|EG(`!yw zEltgurAqvpUlW2s!NTT+K46$Zodju1VB`R0=nfjh6b)eID*rRsEcTS+=N>!VXi+b}-$ETb;Hzd?u&|;K|APfG+hWV#QvwB3A@<4M=@fE~n-2M_Uyci{*F@3% zq+##37O3(ZM*vYV`{ zyk!O6;_lra=WMny?os?xIx9v2CG3Zg{KG(y`Y_2rW1xP6>Y}Q9{CSMg(>uQBgu?|f zA3TI{MwXeAt|~bmG{(chfkh2kHze=-DWupc^b4_a+IV6bv?x|T2|f>;B*rbe0a8`< z)EOWJ7iT+kQga4c;M6lOJC>E@hOh0_1yZ)B=JUeAR(lU)tPZEz!=q1olzFJZU73R2 z(1HTxEi?=g43`Z2H>9|33Bf4-L*}D zoVYF`5eu}?eB3sPHZ z-}IZY{3pgiEL*x&*MxQkUK0!04b-9{mkgou!jo$AQ(`?@I#|;rNE&0^GmTZY7wRT#!n)z_gpt@tOTx z24lZ^;@B~-99KwoT-v#IGvzyqgIhmJf7uL@gP-JpkupUS&NfHtgEaRvcCA6w`@SW8 z>wgUGdCtLqf6S(aEQ^fd!7;l64b#SU2kLC5La~+I^CGWOhxx@`6Uooz6+8Wm$#N7`T`hLN!jtC@m=|{5i-le!#~+He*7#dLIU7 zhf$=W`e5PM)=Rrk)R&_IV2l7Z1w2_DR`3aeeQc-8{SCWO96B1tyWG6k0vQc!;;*l+ z{$dUXNnLL3J&qyn1h?xt$;-3keW&*5hjieCd^fkGo8I3|1zMB-l3x3c@sR#3{h7+P`dJ##{q+`Vhvby`m>J~uXZ>PHqiI)uqi*LT zbJox->g~20cY?VG^m`PoS7)y+#ST&4K zLM;aaipI@yL$eP&uefF&cpGw|{EmND_wSz*7-*i8X5RE%a9Ddx3ZF~)3~>M%?OC{R z)F$iF3*^R}WG%_rS>s&ai_(8?F1v9<-^fU$Sc^uJ9(l&BS+roQ_}LD7jZ1jackaaQ zc)2eriAC|q!kAjpypWHWjSSJ%)wQtD9(i&6JIn8OG7(4MN7XfjSmQ^+28-t)q%JS? zr+Piy5;35Q;n?462d-~FYGpR|&kO4P+Pb=8A2WexAe~EJX1%ox+=n5PlZ%U7kkKBk z2pdtCE&}Qw@$%fFY1}?!Y)o#K&c@fQG&pnmbXTPr$Cu0AThM>d z3ofAbkp9HttWOJ(VE95!z8%G1yj? zmwg(#0Ug|>OPA=U1atD58k$>nKh2su_bS$3%*lBPuqQ*4T&N7Rv^IRI%p%>Nf+Kvq zncjkS^&iobhmC%u;oiaTWp&%sTzT^rk8qqSv*+lRCkHaD zq{o94e1EL2Pw(zsH1Nxfu3ft9jEefm-CN|H4j+pW83_HRv#!Nl02|B0~WovCS=x^nSiQJ1G!#lOA~cX|Q+>BfzJ@Pfl5 z9E|rPr+^EI`K~aYe$(v(@k$>iAp7(N^y@eN;dJ6Zc{~qM6akwTlm4K;B(l&e)@(b& z3%}1HZ`?kV2X)6$9Wx2<)XCwo7{ur22SZTcXe8hNR`uq-l<9wVGml9Vv(U614|t^o zX1g&k5dH75=3Oz&Bqdv&+36E~bIZvtrl&G`goO=1ZKBc|=IlCsx?a*+DtPYik*zlj zAOl~c8les)!kXynriHzSP>Jfyk=pj0?-Xlmsof@2DIC+K6DQu{sv#~(Kas;d!?2+> zRlDmXqLV;XzZ&miZ{PXn=LaACADUbLmY3YAs``DRPLR1lgJSu{QUaKMiBz5A;RhK% zn^^&J;o`+x+6wN2MtoE`)^d9AJR_!2&AC^u?031@`R@QJ7{(d?{m+E zn`g1XOnqO2TEPqZzt-M4=D-qXCytdzuz&6xJrMrMW_PBOlZaD@&%moL_IIG1jnwd@ zhfg?ou&;&&5zDAG4>F=t?Xu?zR8@e_$gOEexrstGPBMD7$L8<@JLQvLqnGaA zx+QOD`ZDwE**KT<9*ym7YY|G6wQlb)M+zp0GH{!xmjY~7j4)%D3R7BU2ZbgQulM-C zHhSytT`*qQ(8In>N==4b%K-dS+VIfC1)i;NRuu1klE|ChcXVj2fD@<@_+`~Si4wr> z%j-@f6xjTXOBDkX`=l?#Aqw~x`N8>#iL==pPUO0{`Cebrof`Ra2Y3`em=PvU0+DYXKx{$Y!0s7Dp@kkLn=Rp&Oidm+7+3`w?|=bO zQ#0Aew}u@foL|xkJVI9&$Ug*U2H$ZO(3aY9ka}|3;}0*AA3phU4V3~`EZiRWt#ATp zt+*lqYu0djDh0Gr+uW2QZQoClU_sayKCv)ZkBmNe@HG@PjEE;Pn)kjT`k&iQ;$5K# zVZ;)-My*%F)`*CqnmZU_mOb<0=Vw1N_;U=se%EbiYzMmaRr*`){eo6}x|0)CQ!$-| z{)ngLinMRR!NKgn1B3*=qA2DC!wBOg*?0^zo0Ayoo?S~J?($mp1vW5lZa@I*#DB13BDk)+6nEBix+z5BF;tx=5!MU;i zA5@(s5|vP3o)|XXEE~12!(8SwgbG{Q7qABDw*ap zQP6}r*c5?ADM%Kh^39m#9>V*!{O`Nn*^zQP*7DCAZ#;SQ2!Ds^osD(-WjqP!7%SCt z4^9zkHyY(#xmQ`APviH<`Z+P3cc*a~rl2lcm9@N=FQ=6JN|5Y6!N|YU80vdCzx=Ji zU9aey-d(r#Q&+UN(2bC2Sq5Fk!JgMj2DlnqaLCE%>n7b;j~gobKboPkQ!$`b^@b)4 zR+@c(Ao&SbRe)mGy?74nwu3xu8z;0=2kANJ1=3%oqZWi;s{9XxB=RuO;wUOR8XP#~ z%nwF!5pHyL9N4?Gc9oaRTsOD*QRC?C$>(;4vPH=-16uz4*!XqMK9FseMS=%|!84ZP z*R*L3e1XPNRgtrkQ;54VJ(m5Y?UM9;Y-irPcfIdZ{nYYl4h}SBuycfM$FPgV!S2RA zGBYyZ7~x_kxYpgOnC4`iIquQjii%aNZzbz9<^JB%(ofA5wL3y>yw~=bEu0Kkp0#9L zH!dxo?HYwGpPz7{zi_{`Zp|w5ij3qy_bF3^O=KYLfH-GPoZxjVIQQIXxgglqUsHYK zh7U9(P`Nb0wM6z(#NRfl2~T({V_BTU3JBns!-vDh$}H&59@J>I<}#E8%%Uj}JV(5R}(hJ}jc!(cNLCRR%unk2q>^2BiT^>zOKP4ZIST=k-k0ltziPq`Vq~wQ~zg6&HC7-Lni*cPsF}-R%lOW zu35u2&(VE7;pOihj+Ag$=aalew47)`HX};r9euN&`DpQZwn?+=Z3XZ(1N^v#BHwe2 zgl>8_p~zabZA1v?0e?*HnB)V|&%?n>98M-gt>Dk+B1(*pu`@68&PkJn0ND>ZC{eHH|npibq|doT_T;gxtw7L-?uU)88ZtO2`}|P zkSor{I^4aMn&S14-;Z~2d+Hkxnb)~H1&3isuGxGO0F-`W5E(bBMeP0FmJqa z^=ik9&dA(;5vjSUf=rbdsXw**JN@MQhNu67Do;qGwV@@OU~B7NAvt){8&Od^0uvJV zE81t5AN#3}!Qq%xF|&^^iuY=j?x`FjeIVMUo7^pY-R1&NO|$nJnsko?X&4We<@k{! z6VzwWsFE)yiE2;xBp^`%UFnQeywiwO)3{+q}OVAACDFfe|S7JBM<|ovfi7mGqEp?mnjGT;IPxq zxo+ftn0Lj$Y@hWS zrpx-Vu4XVmX$q%Io0d5}3sAsz{I0uii?knAR^Eu36KU#TFLgpz-Jiy)ep!I-dQ}NU znTOVD_26L2{=0yZ*l&P{vEx}Nq$~w77{Cs{5JXI!JefyeRb#)o7gdR{Wg7tx^MV_7 zek1=-&~QSm#L}Y1$*(^F(qJap3=-PX@`78)KYH=Uxkogp^9AIk2BGBwNdB7A z&P&Av0ERptbJeh7}&W2#k8+a6c0E@87QS z=JW~jPoV-DB@#ze2a9K4ym((Dy`RTK?<#h?T5r~uBR3S^PC@P z)jp3z1$arRunfG1&Y#*MJHXz!N7(9oNCR&a#%yTL0QJqwv;3~SS59*0-n}o}ht@j` zY~dnw6EOdbc=oV&3Vp-J+PqNisye4hBxXd3Jk0|4wz;i(H_Bb6Pmkm4EV>K5)8>Bc z)^TVw)Rr+N7HGuFS+Ewwv`aq7aNk%_I*WFKR4=|%(KM|=T6g2c8~f(JTahJIu@Fmq z-utFvkg8&I(X_g4&|E-o!{c7Zjp80!i*Vv^Yzs1f1`1CT5MBZCr16?s^i76FpW;r> zxuB@hPyZE#ZHoD7nbeZ^El*Fng{k%$>TOHW{4~$J@}sQ?4^Opx!>+rj!_6-s+q%3UwhjDwt0^iz`_3T@F&+-d7?05xOv zzrKBZ^;TL#vb0#>csDNMC_0_e67NY(jhQx;3&p~hSJH|a%vEO{f5sM^?6Zt98HB~e zjQ8vQZsf?$aG*4!AypPGB5J*Kh%T=6e;h3f3rD=^UU4zcP)0|P5Vz~Cwtt5{<@a${ z;}z5>J4Z8+GuV{)?w#+;!fiLbYggl9v&HB$b>mnkYjFPwqEl|?w)(e|N1dL%p`{9L zITeL!nPwwQCA_-pYZ=d4s{2-1;s(?tnclJt+;ko6n@yp6oi{V861gSQpw4=z1iu-h1Hf}A^JL<%a^7j~>u&%syCFaWTQ&c6v?M(_zRg_+Il*Myv z!Wc{I23>@^KfIQRhyhhM2?iJO>XZ2g++>Le?^*^sxGHpxqB8BDq{_vwFxdo7$={X( zW-ecD@Opds`~S(O5Z6zw4C|sE^%R^8^1=PQzB2=Kh21AQ4P$x<9_6 z4-eAs8B6I6l5}jX_X{4^SaN)vrt5liYRdkE1cM&Y0FmFVeqdMH>w4o{#tou$#uH@g z_5WUVOgMJxRHwnr=o~FPky(l-LX7kq%^11-!07H`f3($yTJdHJE!use}6GUZH5#{lM^Bc8z>dZ*|3ml%_Y{G9Xg) zaI=5X?-nqCfrg-U^s1t?X8{7cHafAPEK0@Dz`!PD%ERwGimK0?T6C^ zb=J!wEN_icEL<~e*g2S$yZb^Ll3>*Q_69YTAJ)%q`*P1E=talKVd+1+4gkqb%> z-Vm4hDsNM7WpzEK;|Bfg=p7S&*YW`LS8jwLXg|J@8)zZ%Huj(2b z*6;uRI{M*>>(O1D{fu(bZ}m!bHMNX#UJ#@<;+E%vlg~tohtiA&>TdCn+o?EN;p3*n zt}lN5y1ijo!{&f)_FJ~(}Q6H1LJDD*kHx_vvaw-rTP*a4~<8WY~CBczz2 zBM8A=8F5d%+&k^`TFM~M^yaxg+TN#jmjHuIOBuu164`KCftFZkFcrJqJN*L_&+Zan zLl$)R55*r-gm}Jo;VaTs`c7tDdlV(?r`%Q4tE!6^_IscHaAUfg6aXwXPU$S>CMC}6 zY$3|Md|7aMGVTGWMWE0*-K(@`r3pHU&fP*8Veq9&ea=#|X@2discE-qirqNf@Gq~f z_S}npV0y#?2Jd@ueCJO8Nv02&UY<(5(kNvw!VfHb&D~wW8C=e=Z8Ps&Xt%C;D;E0@ zNhRq{0}~{l@XuySTsdjH-QD8iI-W>nHJ}_I36tJZg-mt48(MqNQiMy5Q(qWj&}`E^ z$x%K=jt&S@vMr$&l*U`XOSkoJF|my>CdJKga~lv}a!fm(dZSn^$?+#NEz#u}F}7R*xAe+lal9qe?Oid zO!UAT$!yMUOPXU;RrSQ-_y%Ew?4TdVytW_?end&bX*3FvPx-joTb7}iTk)G=tG>?T z-wx+{7wpGR`+&0QW>MQG_x7Q*ecV7LKPd{Lu61|F73avDdNw_K{Bd-(|Kj#*3W$Tqa2P`-3 zAG5Tv*H%?CNRnVu5NY5VupN5F+ShljOgmcG7-aMB4h;JAX+Sz50o&?3@(gj1zSWH@%m?yxc_XY0-Dcs8PQ#JIkH})ICrlIG#k_1_q4SwhcQahEkPR z2@}?iA(84%gALR=*Kf*x{sr7nAfa;U8D}r~l}J@N9J3$Eony|2r?Odrz`*&&Em^Z{ z-KR}vkvn%9gfm*${IBgj)F5WU&o8g;x5tB~Gl$w=35! z%=fTDjw3KNT3cK3lNplNDkJ}$AwbC`PEX_Eua7dzp%l^Ys;j93UIrp8FcKrAlbc-sxU79_io|NXe zNbbPmf#7(|*X549-q`F$db-B48HLoAS&KZ-3m_ucGvgQZu+u?{p*O;g(|BhS_ITj? zYyP7@?TrR!Az(Oe`b;o5u8P!en#P*tNF-oHVNAHXZfnr~>BtGG3idc`yONs=uXEtZ z@bdS6{`?tq9`cC*Wo`TOrgGWP4LrPra_#hkQusH@HAMpS?i#ehWbQ@fygnIg1FS8p zP8b^)bn-r|^L^c7N_uG23Bl>4@`P#K)3)B9J|wU$$nyIqr{QU`)M$+9on3>evfox~ z%#h(j-`WMge8}93CzbNgTBJMC-=8?}nY7Z{{MO;P8zc$iYF_JwMuvD4k);MLKp&{u z92Oof&_3MffIMR%vdQ6Df@+Sw>#Z*}-sahA)v0?D6ElNCV5z(s0)?#Uh^(`&)>fG05xm;n^{m^sk2wIO=O<@&AM8L>b?$l1a{)B1A zVL8kgtz?$_G`^wv`J&Xq3pJGfieXzc?#x@o>E*Bpp?@l`(L_b}4qbd+ySu#9(V#*b$mwXw8Mc-$W0o z@7LR@e|USf>#!el><)&877815Pb)m+sUu!yDlkAU8+0=7@6Wk!H(q2|H7Mp}>HYg2 z7yXjfY`EP?sfSTUO;cMtJ7*^6I?3Wmi<3ddJSS{7P6plXnpv?e@Tpz=x+PNr1@r|# z4!E~rf3X9LQkE>apE7oK+oG`gnX_iG(%XyaC)F;_YR=F%*RTHx38cPZ4)swB!$`o4 z@s~4YDVRAVie0*RF!q7!rQ2MEP#$aq00=AOlb+Z2A6MwsyZ6}5?SW|IX)Xl`e-Y^H zpVn4aH#cFCTcc&HDm;gaq;zU&oB#}l4_BYK6~MOd*!9YuAq=YuB~iAxe~w-K23vOG zbJp~+M4QGyp?Xqc+R_by@ij~x0 z6I`H%PCF+mcn!GJgj?Ln?J=%Z9(d*Foo@9lE;iJ9`rOgz1;pI6FTeBvjA5CDB!F z{r!7-(uh*Z2&{y#B)I|sE#SV~Qv*S@R9A;Z8fS1o!eq+vSFc_%(J%_0Oe#NUzPhNg z(w~R2DmotP@t!?-4=mO5dpmbkCva=P9QI42+eJS-V(3t63FmL?MPh=6kVgq5)D$}> z($Thj|IV!M-L_A*|Cs%ia`xO znO~p=ynEgTweL%|@O`?5_KqijfOYY&L;d1QC=d-D_vy~-R7Y{mLuFMGI2c?L08l81 z!an=WhrSI2@P|M_AP$p->r-D>cUbi?EOB@hU!R^y4YDv9GNgflEholh9_{8BYRvU# zEVwO7sS!JJXD zfbwtCTGMeG^yU@!n$X1` z%ieeHHF6H-3#NG*kVd(7`6rge+3ADX#J)+yOBrm5V;SHv0?qXN;oXh7Gq|nYDJy%o zCYNd%jzY!YOB+8r(z64$eUl7Kz`gn7hY$X%5?fVdE<`M!R9TOdmp&W0GK`pZ&VG>@GG6~yIZVk{$Lf8Os%-C+S zDaqu9OP5Cdm_E;wht4}CWY>OY;?A!bm)HE=$kL_^P9KB&++3DayeKO2X7>HH%u<+; zaLH+CXeLG`vjOfyZS7Fvf7_w$Ao=(b&;K74EiQj9#p)QaS$ZCI@cXlMYbn9-Wr@?cKYhFNmzGXWcS4f# z8Q$;v_nF$h1X$uaZ)5AW5u`aVM67KBg4_af#^rNI!3U&I?4v$Y&fNqeX+JXV;hh%3w&J^Y9iS?t zSxix&gaK2$dNFvfoj!R%XSs@zgt zPt}Rrx0lj)G1%#J#^6PY#vxj|^XJul8#sF0cS3yI%n(;&7-NRvz?75zE!U^5Ja;ac zaWibS_LC3Er59Ko)Y#~BXR13@9IZp;sgM8>VVl$fuV{86%0H-F+js8V)bg%N{il|; zpnc<)!sl&1bDXci9ovim2NQz8hAE=Z(zom-bF#ZcZI}kUjic;{zfOWL+RWj^-nJ|q zVi{Q!#gNp36ieTuGjH#6e3zOufq3@0u6%bT6CslWZU-1xwE3?I-g@+?ufijbfF1n3 z#jYKP($gQ53|P}y%*jYOuq)%PbAqB3YQnmyQ#}V*U3hXEe#VRYQSrYX7!LlcM4-Jm zw%UF6d{a$MYr_Zk-OYdcw*rs+jVcvaH;dTy)atQm z$@_qw_l7-7+MAMZD|z>&dehR2W%I&BVwRukG$wSY>3lD3^@NC=Qttj|RLlxonnF5P zjj2=V=&|{!4x+@VBfmLTzu1t!Y^KidD;)uaK4xRBmK}tRb-Uk|v0mQZ4`-I!_>H{U z@`4)wbz76RcGt|7_id9t^c@=Vr{E4l71=gIU`X6^@$@9z-SW=yN+IKv&bGNc3V%jST_U8gVcUeVc+c&) z+ZggaR+Tu1tLC@{y)Wwntt`TJnPy*!sN~+gj4l37f6H(PY5REd=~Kb^ID2<^EH{Mw zA&FeGVE}BA*00V(EyGpWo-O>x-@#sNB(L)rF{9q5s*;A88FVn1$I>=(I^~4@!U<^q z+uMUAk*H6%74M!Wo6t2LI`;b(kW$C1Mw%R9L?*Gmx%s|Aua`j1fScqm5+zYyXfHJ^aBwpXng&LmciBuF zjxA8yLAU{SAp?z!bi+|r51PF!Z0LW~Nv2EB;6kY9_SH9=A`K56>l#NEUD^p;y0??p zAq1be+^JZTr-eqiYVh{X#X-D?K#RWO@Y{7H^w{bx%bH0?y7CIu|Mxix4>P#uzR(}# zVpWmuKy;(m@DHu{=-+GSJN6+VBLat~1X}t0Y^Q-InaSUIA2;B>4P~i#1v5kWh(lgG z(p`;@Hm9pEUcA^^eaB628@uRU6}0tTSXnenX~KMsIg(T6&2vMPxwQn+_4y;thdY`G zBJ!bcC9`2QjI0Tp`YPi8z1eh=ZCb7!oXtgGH6#W=Vm7om%}$tjm{d+xngy4f@t&$I zlwi|t#{Y-6GmoorZQp*SVU>neNHWyYAcSN}MYWJ5Bq4JtAyeiMO)Cm%5*d?3<}wq~ zU@K$hObv*TN*OAt_j~XC?&taa{(nF3{^R*Pdn0Sz_jR4aaUADy-qkkD(n*}dj^Md- zRbmaz2Hbo1?b7s9Io+g*1&DSxepqVNsXiK0jPiR#u{-zfv8dcEw&#iw0h$-eB8#Ep9mbB;lwfM4=yr-d3`eDt)p{{nW#~|O`q-wZ|9nb2)=4zE?w}c6YIP zim4B4-I(7pmbGo)zUMhQl>d3^wpj%KcmQZwgChc{pZyxeBzwb{aVy*=P7F^c&rDsg z;CSF2k}G(Wj+DHG4X}D1-VN+tbN5(;!SXp-qPAo>3RybeOP4&nXaV#+1B`q&XiK4u zjvVP0eG8BN9R?%Jbhk);K4FmLnC%WGFeHc4)5TKX+LE4@mQ+}000z?Y3Jb*t=VvuH z9?yA3(#lS1+0(6^WlBaQLFMTFbQKp-nh!uojnu>7>y@=XdPwpf zKGYt%T?|g=WnKp6$$?1QLDLHFN3jC6-&FnL=)d1d-1x;y?n_ec-Mi{J!*Br!`u0}o z&?FjMUWTEmsVM?Iq{S8*1`?i44Fr>sjDl6xW6BQ*Lu4Ioq*SSMeSC(WT!Vm976bUp zsH|U3Ht;Aj%7_N}u+nS2q!D3Zt<--BzynhP=6CUXijEFqR0{N9#`Ni)$uL`B%4h{K zEKW#F6y>&pe5Bc2No9=*FXZsB)HTwG@bH_=fm8Be7(#`j)S502X%UWFY_?gw`pAV< zKe5%*VLhYQ1Hkgydi`b&I-@wF?@wf~KI-?RH(Z)yIWwYFoSfi?p$@$v8Q z11;~bEu1r9L}RM4?iTDd=^|I7TLc0_r4opa$z5(V1>Ue>DKMVa)>C^V3>+|k>jWLp z8x|UW1&9loTZKKnV_x2SPz)*st`oH}3iC~xovFWnvt>zeI-B^0MR)iX(AHxdl6LBp zu1Jx(4}GIuOH)6Iao4Unyqc+x=Jls3hWdk1qCmy`7v_|E4~^7D3Qs>2jruWVT?&`; z=hwq!FI;%Sy$2HsOmAB;B!*1`^}Lo{lVR3*i~4UIN$Ou_AY`f-;+r~t%xDp>f zfhv~LE7?C&A;cbgl5ZSsCNcrQDO{<)6OX39xrb#kH9RaAvGhzv#zT~=tIr1x&EjU$ z*HRDiGRek(oVD#PnXz&7*1Kz%M5Ez1jR)~ykqFba=l2XW5sRqM_3*fC&8Y zglYIt8bPhUdS%n2$FVoPhW~q23um<^jN^=YBEEZI@VkF~0leRq_OEd9{w(_x`0muA z29-&#mcFBH#2AJq)=RGSzmMkg{>17fq0JYpXFdEh>|EuCL@q= zlgburwEEva>HpauO$@4hz{7Plt9&`e;lH1*r3X`{*`8OkUKljXWq2@3)LfHf^xqE@ z#3c8#T@~%JC9?nip^82a8=jc`fBNA6FCW*RA%(2X+&7kQ`B~$?Poc3WG3bZ#fnRK4 zoZfrqopMs_=ZcDaAIr~4>~jdqHWXGLA9Y7TJVPx?J}jHzX0YEJpRX5UXAO>WjCV2y zl{AeXWvtV1GH%JJBae?h%}H8ub!z?fnr?1K&%Jqidr2>ejFoQ7&euFGK7al{PxAAA zi{Phk9?t7OG|8Y-r|ILzXZRH8Fdz^)T%je;(*mB{&+iyk5-3In4ccU=8RbZsM8S2t zuQ>#!k0pyWkNySoXhQQ?UJgWIy^j&17tAmLu+_I|7=V7g_s-w=Gcc0_>H(tW(K}Q0@YwfWk_Jt5>HR>tuLf!Eue6;OvXa)k;_YJ?D}q zZ#?CWXY#yB42aZTTwkAw8C<(nW&T#=3C8hPAl-t#rhH}=CM^q8;K#3DECzJTA4p>h zATHe5bLS3CVrv8(CtPs3Os41|4A{JT*QRaT_ix{J&Fbr7+7EDPJSNxbRPJDH;)RuhTpE6+ZFA$afY!5_A>Yk{jl0PhSoZcb(J z9$5(z&0~bvMLl>Mk;6%OFhG}AebqNdCW^HmYY)ER|M@=4eBW3wR`Maa)_KgB@Ni%` z79-TNJ}iY{y1tC;{1X-`mdLmAc%v^1(KYw5U;tJyubMv}m5KE}6x=YROlb*YZZvSQ zPQx|+v;xVL#h`p7Xq(ox*xjaSp-_SpSNjef%%lyow(J~dxWNZ|3D6bRjP>vTootHm zl3KSgksSp)cd{?*Pff0tEN02|hQIFJ`$}O(mAIa@4twrF02E?z_?O$!@1#?Bzrhk8 zM#C5-Azt!g>=0~VpM;LzX+)vn-E+JSkVqYA^RKKHv|7dR(HJ3dR5`sYnzC@!UghNH z_ZfMoF9OGK%rduc=ZM~V^Ja#*?u5+6tn}cib(P_2^Vgj_*k&|Pa{`_v zIHw|b@wVJ$wL|=G%>3NU4LXSu8Z?hoh}0HNmW#+@0lZbfgc%Igkut@`v{%~Q?#?S$ z4v_f3z4MTK&%RJ=QJZ*NBw1m7?cBNVe75PmSEH&GcK*0;)rawgsiHTO`bWA-oXD__vm$wqx|=;x1W0pTMrIWi71`b-Fvax8ei;xHH*ei)Bb{_=`lq*V z6;dCwbrD^HDN`XLjt3Ak!#!NJu3ecT;M_WdDMMh67DC5suz5xe+DPeNpk_R0-UNn# zQ-QaHEZJ&c*X2wBpNR802+l>CPnbzgY#-$aay=NCp2UX{YW_qGRrd-*R~D*n1jDfY z(_(Y{;-Xi|C3o;U5O+;*h7Jo=YR#j@3yQx9bDFW05&uT2l|gzpK3`|q2A2=C9qb!y zS~6>tX*_$l$L_Ke25C7<8w28NOQdpG?GAGRZPD;mKNM=SovVgIM%&1d^CF(4ba^Z| z8eoHr$#&cNo}ION3g!~^M!zuqa=k%oqbrsa6d&M3Nha}JZCvKWNW9$4_ol4J3oXUQpUHR433 zSU~{A!$}`c7KTB4&@H3)JF>AS8=F}+%dQ@&h)(k8(d_?L98dmu$sPaAn?_k76BCMi zC>kX=1I!ccUNVf1Z|Uj;f0miZ3MXQJ&nt3qxeIy+J`bE)e#8_LS9)q$%=i??f^lWt z5}X0#dCsa55ayU3c&lu{!h`0J-{faPEqTv(Phz52ip*T1Fe2q4QyS1^m_?fLzg zCGIG6jhIP~+i+edQgJGwp)SDof7CB;44(b-mYKVf42SBZDS11fz!a z7wK+@S3nd5d|@JOM<4872qaipx~gBlaDnZh+ENU4-g|rD{xo62Swg8ShG8uIDAV`? z#IJ0%=3;JNki=>-5PQxB)9L(Tf-~n1bz0i+UYn^=nXnc1xP)oUv77?ian}}8q4KbK z=^AjSvKS~$zCGo;hli60&?>f1rINfkuSS{=@q&Dd6pvG-R79YE2(MDljJf0ci-!8j zfC2xM9m!Q%{nD@W(UUrf5Z+CmFd=@N)!ORUYak02VJQOv153l96b!oPyxukCZ{w12%EHJeWB^LIN1s+8+w<1@@%?+z!V68x;M}hA z=E<)3urXMnDoIxkKmAvkzeoZt13uKb+VS5EDq5+M81nR_!(FF|6MtOO?kOx^Gm!^Bb#;s`|{>0+Hf7i6X|E^@SeA#E)T`oJIl@b##t@z{y@<)e5 zWMCKBr%$RA>T&KG_BMfbiBBLA%v2@C3`iO7yUk%F*zR(n&7LBPF1~ZBx$d23&vuA&%9pjffT6j) zq?eO8-Z>S}_wUL;@3>is-saoTV1D!FHJ$3bg84EMbOE2u)X+_Moz$3>A3_iq(;82!Cvd-kOdOWmDFivoENRX>naEoSWZ4rz80w zpdYX$qv2H7qgSs*IB(7ymGTg)ObS#6%jBmqr|IqGH6G&=Ben9nvoKN;l`#Dion@2F;)}<_l!|W53t=&Ty;$0$pTzNMJ0@E-}T>Dk=C&>K>oxk zmF-^j2fW2ID4H5(1i^*#&)`nmFeD5-X_nacZ`BAA$K;=b-TlUm8IxdVPr|2T=0S?z zmX;bOI42iA*NUQ18UqN2Ke%u<`crEv@QR_-h^_#FLFk;5TlWW7Wj^$Q* zj<&8#uKu$ssI;^>eCNsD-@9d=w@W{t_2v2VT?1N*TS;0ro_RN5^)!Rz$(ycy|2X+o zcAqcRmp-;^E%`m|%gf%U>U!A?pIcwNvbn7IN6EXCHyJG^7w^poP^pbw@^q-19NbB3 zMZg3@4s|ySH;50Ers1RY58Ag|E{(7^tZ3>D{)3tWleOHk;f{{zP9}AYwO3Yk)3mW?08lz4zmvWw}Sq3hRDUGcey zv-3PXx69 zjPg@g4!h@j=RvO1`R&fB6cczP8SCKj!Dw-rKi_-1UASY)DC0Q9O8ou_Ze$bAzV4RP zt8KW4C~?W{??g(?B~RVVb#n*uhjsb8GPVbONY7cFFqw4E^)z_v;o3RYy~o7KlW~bq zYjN&uq<4maaq9^on)j2Cs?>3+!EJ)=@$;hHs{uj`+fv+bB=d3{sfo+92Dc6}QAb^7!$e?nbJpAcSdW?NXruKu-OzY>;TZ&C~Na*D+dit#6Cr_s-x| zcHeSWCaR?^Px#!$=DJsSmxD_8!Obi|0%Hv?LSO9d>l?0rZp zhn0(~zpA(E-RQr^VaSx+T}CC@6o!}fUvJH}xZ9UwN~+eR^=$vWSK;KQuN#ida55CT zs%*0ka$1+6XJwG4BLCU!;wumNA2DWa)s8NhlQ~4W;j7cPhCux&HgD$mSe8F;wNGpM z^wQX1$S&tLAX+cXQ*{t3s))9;4dUw4z#hnA&=sO8bz3)|wjSaVjugYCHl{AF6DKahcaxD95LR{?kpK~+c$lN- zaCINe<`wBwgSYdLHoV5}kG{>-{4U-Kv`4~@n7JVidA)#1n1AInAs<*c(8j{TpOIjC zXCR*)K?_t`4aNsR-Da2g?dQ)|uySC8^~ijYbMNI z@k3s{dbPS{Q~DtE9&FcUMvG0pPNELDOS9REW)lMD{h&RBhnsKdIGN#K2#XcOs~D84 zjegr-|0E6wKrK+Nf49X*9pQ**nqXan3Wvz;Jjt2CTF5Q-8E5x5|9$GzRh=@EAI{_V zq`zSIa#z{i-2;wO(laC`TehLL7Z#sLw*;M@Pp0&t9f^S_0k1zl5;daTv0zxPZ5*F}<)w`FxzZPIyOnV_#0 zxz+yudN!+0;F8HTE$f`nbc7XSR2J`n)DS!~M=zjBgc1f`cwW7$1lp3;LogC3wDYV<4AzP6^0O}n2ssq~Bs2d+b$jq09# z?^|nUY<4k4&!ncMg$KwW^H0xDmoU=8CfjybtgQFVoHZ*cF76D&_yHl#BEf(fohm() z+^*U;26>6(OXP@*oxVW~NzfC{7x(9GVqfT^IIZNI`!xJlxu@`E}$k%tgwo0|F(r|6YsVw!3=D~15k^X9&K%$o)K z%sy0iyC(sNEkB4G{k@g#o+3XGxM{dCR9s#9b6^;@eX-cR${?C1h}|-`ZXrju64314 z41|)^EMAY?ki_C+peBehDo92Mr4jhsp(;ZOOABUmeg5_WAKEH_A87gD&qLU7-ECZB zV)U4o-1f3xH8;q+V64^Jh6{Frr{;SOLDu~*!+h2M*-2MAwWywh&ehXq5R|uI>k_3t&I0ZiIn+vZ#m%qD|%8 zr1ieu-ou7;;fspGbC`zj5`82&87o3qOcWM^dr$8fjRoD3a9Ly1bbNdrR?IjW97DB( zOXG|U<2QAwfz9Sf(7N$F3@kkDS$V--{N8`T!Tx2iz(gmzY_mP*7Wakj(H8Tm0lmzRwxP#xQN+r3mJQ1PO{C z;9R~A(Zhe)vV&dXd0ymdzArvVUQ3pcRGNg8J#wUAFG8v;F5Z8;O~_e+y2cI?WeS8! z&9`qTg{eQ_x0kJ6EigOR^|#!736jb;0cwDP29Lb6ftBt@PoJ)?t}Y3WPVxV^bI+cR zj9)SeP1{*7v6tK4wBw>+TF=EqlgSp$6&Ng{WFh=3gxn}7P_@*3MMc90I`2~uhlT*3 zcD@g;*nCb~mVg2IxmIaRrIG{)6tX3QYZO+S%xVxvcDP9eF|5iTLpJ6n?28g1Qw}3#q!1pYsibNF~G!ba+HHTUo z88K=|@DhC$b^UQHACV^RF+(>%)t{2EYzV-3Q8=byBZQ%vI< z7|O+rhtbh1SOszTFdU_n<;`5SE%{Oa3Y5kM0~fMqcf#bAZ%8jp!gCS8*7333L!C+0!?@wWl$15L z``IPhv_MD6zqXOcbm!UTEg*79u)1Q&Z*%Z&S@7KTop~dq3EG;nzU&r=fAXcso z8$r=zanvDIk-_B8`i2J|5f1-I58B`vGkTSH>9%c4Nd~JFSlExAa@pnASk17_(UKp} znnR8&D8K9B2_0VF#_7->c@b=C&5s{naR%WO2L#k}D(Fw>h>(N~?5 z#aY!?{q*=w$lQc3JrkUXf*>l47&gEGjM;Dd0y8bDrk%4k;9$F{Xn6aoQAHOB8$>0H z@z#^8i;Ii9#+upMvSs}SNeO|`jEt#HlQdLSr=U%S2>*T;=$s$Qr{Y1bSiO45>IImT zvsRDti{#+wxRF;xt%bNUZI4N;Q(IQF&Az#rB7i`!t>d8kw{Ht#Zsd>Fz8{P7?lwYqEs6_ zK6YO{j9xrFy#~!I^V2J*OnH&m*PC`Ie&4?JNXG~Wfc^+_CX5_o8jn@Pt6R4|QaYd< z5-LZgH)v2eL^PsU6dc{Bn*A946Xn7jUtgif!$b-KfCqeuYKq&>M?dP`{ir*uKrqY9 zAkfkJ6GS*tze(A=Y;pyq5)fM)&$j+&RwNvavDjk4BE0`#U}tPaneMP+D3(1O*IkG6!njZ1Ww{_|Xk$+Qga?%Qdd z&!1oU{HH9aHNtygNQ;xoN-QfzfB4!hK zz}mIfktufV`j#jmuBa&0O+|)AkSJOIYac(Kx{PPL-!6y%v=X|bdVE?JI0L>h%ZL0a z<9`IITxL=4x` zil)lo=U>O-r)uK7ER8=%LZ)CHf|>BnJ4CZ1RrWOH-~$wgwBQhAbk}@;hUjt{p5ZGG zNeSBkn}K!juj1pNy5UY!GKU5T0z4dpSs8E^T|Wga-wKvsjqOY~H=XxM!bGNx%`5!j zN@@m{u8wt1rCk6m61|z{qQULpC*+|l3>3g< zKDUeUFz1^JzknZZ*6%8t&l80$3q0zF6des;`wkdD%X!_s#~YLeG%RUBFEQTY{|LAK z9s(Vf!jggno59Jm){i*9*J|lot~J9wM>S%cQ#ltcf2xC2B?RRo#SgWmmv}-}CLI%Pe>0tAG0xc>4(r zI|)9h^neEz`uhI$v2K$_$Da&Na~cO*SqUuBTK|fPWn-RDq2QWJX-nJA!CS(fc^w@9 zaHl_aIZ12QTn5a?yFIY1AKdNB^ADl9wU+1+w@S;(97JodoO)`P^Yu6FN9hXdpysQa zHmPj6S^MqV3l0PABN`%p>hr|~K><(KQ0)WBwV){hRH{Ut=VYwUGpFhZVxk)JM8pZe zxi)p29B}^_U6np^m!~hDKK(VGB#fsbEP~&WOF2h_`G-0fErzm^QbS`SOc5gqgz}Rf z8E;YjKE`&I8Q{rZyDGVu*3sn=uJCJ|nlbw(f*&*nD002tals8bba=6Nx16FIQ@HFz z&IEbFqg?RTGmgWYZRM9|nEFu=4x6gRHZT;3d=`#fLtr!6Ku1T1N!&n3_P2cD>ZnR6 zB6bg4q+i*B${`87i=e@ABh&t|Ul;6{Vq$EpsG`zFO6ABkqf=p~mn^}*!a{*3)SMc^ zQZK=oRw@{J@LHW0{p1+}O=9XWYGr=RcI;4+=?i(iya88;@E&?(g#Ck;GfLu3$i@Ms zYb>5WSOs{K!#SN4U=-~JW!ceVkF;;w7C4osCUlzQaFP`gG5=Mo*i~OmqN8J?{I{tZ zSSDem%Q|K~Ixr7Ts@U57aPvg7wzT#eWipm>Y`^DAd2{&CAy*9uLr@fYm&55(b+-so z=sp2JNSU9#)GvHQ!GZn$xwB_qotr;_d<;K^3g)k^9qQ1SSlQSJDdbH}->_`6-o2Zd zF6Yd)Qc!5FOKQ1sA4xPw!!teyy08sR-$q7wk`e`I0eBsWJ|1GGMKf5@f@YjkE0}wb z-4-r%`T7be6_cS1g->dp(bMzni)#HDMH7D;+t_p*YbVX;l7JAs4?21KtCE5PqnMQI zz-0hd2aX)MH9G@75BMmPk>UA|4>N*V@#RauU3d8^-Aqk;`1CBCcMh0@g7-#1C#fhb zo2l+kqy};t-Z+D3in-`)3B%7KCME{E60}UhCoyZA)4dl)Yb5VHWYR z=KND){5Uvbi(s3!x^>L^mAqy~e-)LK#_Y3ZZ0ssG{U4#x5S)V&659DFta^GM5uf1r z$r1&A8L_gbw|A>+J&ot#P0L?VU^n>=6bPvXeUh+)?980jhekl$AY3Zr&hb|gGQyZ< z&Uu#8&L7N&=Zc^OI-gTiR>Vw8U~NG+^j;JipaM+cuv9H+{m&P;S%rp$q2ogXq`JDh ze?i@^Uvo1&Fe_12S4WYY;AG7GrnMGkj!~59b?T(Pb8@T`wZ;m>-qL&yJr5i(ffWCz zsficJ$$bC$^Gjm?{j058T05Ku2ft23#X)BmcZXANfRQmK2GU?j0i)L;^KjB2wq87U zPO$DdeR>H`g597;k~XZR;{lFjB6LE*1@IhtcRG7KO=bmtyGdXn)KTe!N`g1@#x8QA zu~v>Nndyo1qF{ALtoT(|7na8Y({&iSAb^opJO)u)cA|9uDmn^4>52DO)8f|Ovh&X# z_Zzowb^P)1Eg|s{K$KLs61)Ttc?w}-4@!8it#fIE`OBa>M~gZP@N?&=s-&1FZ(+s5 z2bu*{30Xq6`Xkk{kTrN{^Sr&;Ik=)Cvp%pH!8*_hXqylK%ga-dgcjDc6s@biWOk~0 zeN)wa-Oo90J5zgiK4c_via!{k7O}a=)nRs}>5jCAimm+)KJ<7vT%+$p{@bAlvx8|7 zZi)_KkC@^wZmZ{R2-=%e_p&snW z1$0|NKc-VXG~J$F_y~q7koo~C^cM8i-@!Xnl$5Yf;r_7c6TX0;0+Vz0#X_<)0Z(^} zFgP9i4qIQU#qzoaAEVQhhr;g~F`|RMKJ$h4(4hrBt5&WY!dJ%_hxcgSyZ6Rt9xW!y zOS5snCqS@M5g3F#e9y-+Gc%K`EWDGqd8%f%q4vu>Jw53qkXrBxk^*a0eU1TfU`;^x zgT2X@FJE3P{F&A+4~UDpi;sb``m`%6y4%hP3Tgq*OA2a!@%nWj5Nt)~XuXwnOFvPrzmws1nT+mZ^K&}UMPvn-=Ckqnj7zFU#Tk+-H3LU~`x>IVN@=i5C1VUv)aBK%f>-rWDM5^X}R8 z4jz%}h9CjqKhPsQ0aj)^&8Kul)6iCput!zTiKd39c%{i{GN>Nc63XhXF?$BmehRI! zrslR2-f;;DZ}1YJET)gJ3K8d8(1x<(hzo-93xh}|2MGU^>mXa-{%AOe5q?puQdh61 zwne-YU(lbxYhfXmWY)Yz(LqmNUvPS+lqdX5g4$%sM#F9Z&@ z7t&$X1lR&~L~87CHKVgCqVj+`Armw4hzJ$1fEa3AG|Fn*Sr2oJ9vA`zA)@kE&*kVN z70E7her>=|3E&1(@T}WKLV%kugaJF1F+^LY&KN3%H(0E}hlHj9n8fpR0NC)joRwAl z>QzUpx__(!NlGrx&ddD$Ed~uTP<>Hqg?S4|CYA;rbafB2llra;Pz(qLO_k8;uqkos z)U{}lxz0c-oGnf!X)P>ur!={fl|Sr5pWeL}gQsFTC>4!A>K(uC=R1c{7Lb*Fq;nJ((hVdqw1 zr$VH1SbQNfv*W;?6vu`kcCwhbxJTeITrYXcjZYPht>;<+yh^4pkekXt1c3-iSlbTWc44TlBH7y!D-SqO?U zX)(F+u|L{=z8XlurL(FnQD^}33@k^T?03d*1(j2YgeQ=yW6YNV)&C06! z_z_E#4`_UstLLWE?g?L%I$YQ$q^1_yFIbD`wu)s2EGG*M(~^5erL<8z z^?D%aq2z?CMNj&nb6lb#y&HZ-)Jv|e>BLOpn*51p%=h67DJ$fY!vQ(<9l)AsAPB)( z2%RyG6=4qun84Ur#Z-R$2s@`Z7xxPuG>hCYsLBAS7@pBIYoMqjy|d>+Qg6-ckkD8N zVgM4@A*O?)8;O`D7^6yL48?b$j@fOB2xr_l+!4AnYlyNNft1dyLytdkc3>7^O}0ct zh{p{HEwkFcZ(o#{ov%~;{nGq%8_2fk9BvH-CUWnVQS$tU83pD zRQ4yQp1+OjtYHM1l=he2mKz+lwUs){(K4}C+0y4ao^R*RoY5aPaeK56j~xKP)YO#i zZAfj6eof~4fFnM*eVc_G@)nMqqZ4yLZYiLQqaWe&lbQLOnv+0Jg{AaY9tZh}URN2_ z+)>_-PNdv*SUx7>99XwSp_p8CiPcn?kr2b^-*;JfDeMYitrXNFp#z$sn`9#jBw_Jv z2KGcwE$Zd%gC1Y|y-EGqTfPnZihw-np*p$^<=M@c@rS<~){vYq?TnAAScd1ZveGE- zGau-{hMJ*am9>&UZ~V{nHnL5-g0D1#rX}fJWMb0Zyk%tQ-4L%YN%H)7@RDa&~Ut9#JRX@-9l6 zjI|niL8@2^pthSwg~%TOnwdFs!>30kFrrD$#tW zbxZ^gN$Z%v3#KbDl;HwLrOFnfC^7cXJtv)rh>T=2D(|#ayk20tp$IWlX+NG9{>;b2{NB_-KeS^Yib^cnUO)lHaKuo-hwurZSfwF*rv znuBhs*KcfMTZqlz!BMg@QE2cu&KnBNyhWU70$r%8EqzSi*T(}_$Q{S;j-od!Yu4n+ z?RPj{O6Gy_{tE}6f^3~-+p2EdE+!*M;@h_M?%o|WJ=H^;Tx6olVeEJHGYsXOw1Q)S zj%sQw(z3M``&w4!EuH?ipQ(O~cF`P#EYBw+FndQ=1wcn|blsTZcGPIr=ukuUxRA#w zP2|5RMb(U-<;mpJks~-(%~`TUYqqS~rdR$FicrwZ>}&_M@UEEf**qMtstv&g;tXm? zdF7ZA^3!5X8?&~~csO!O+}+!j8+~tMC_0##Y16YO%*q{H@!sn`oCoG~82v(TU~OJ@ z(5&qAty}K`F4K++V?u`?@*HS#SaU(-QEv6u(oR2JI50THY^u;4JA3hBT9*yLhs*?k zDFQ{Rg)3xEq*CVp`nywRh|qrEvpJgDZwJG5jJLN#bbW@8W3xZv1k( z?7D`QR+!l^hRAOmtwEz*&actvsM)%iiNBzr(ATFJWh0aL_Le;Q`nB5*wjj zC@1X#YUH-b-t>6AD!(M>wChp#fIWyUUOs#%uYVD+nuLnN^`GT^?^BLE{uG=CvW*+f z){cX!yyZMx=LL(=AfVt2nT3@8-Ic?gPckj+3P@se7$HxkU)XQ|QFfe69n;OYRFFrLIFnsWN9NycLCYWuf9j~oj zCMyJlb6VSa-`FGzuN?3b2FSrU$N_cZvov$5dAkf=sH7AQi$%0L@Je`xy1F`wOTj9+ zm1(zCp2KwR-M+oQt*v@RBtvPiDfn07FNtte-r`S@@~96$Mn*y^&|KU}GF&X9jzh?S z7=m&Juh=bGdlmg65MwN-0->ztS|JLLyncn_3%7}4haMSj)9A|)$Fa*G&zV0Oi~YkK zZzqRPxAR;`Xwru_Zz@?W6-m^>5s(Q>0f5ZtDx?j2@)GzGq3`onm#kN@k>0ies%A+X z`Z;&D|BPcyKrH1>@_YL0Yuq>0iDd8EP?|}2dz3QR9yrLorr6Sq@1)h3KVzg*t492Z z=Gfccpr{?(Nz-bR)*dHg_<2q;Pf+26lHkpL4Ai;fYf|sBZ*ld#^Wp(7F}XsbCQOq} zmNQ-`Q1uB3qtx53Z9|Y_vYetk_^tf5cPLI7VOYI%DKaMiTkLpxvcgCPdy5@X{8g3Xq5Y*Msa7)K0&%>^6LGtUbT=0>l z+%oaox&|Z^7E2^iA>!Rb)?MJ&JgfY#hJ_6S=vvrh_~`iQ)6r2;@Cuq*TAPZEYL@eP zSeD5w;Q?1O@8S(!cQxK#gi}T?HO0dtrg|v42f=&o2=t4;zgScGN>`~9)fx1}-ZZ_9 z9F4J~Mv+-RB7Y1XkNGe4s6>XY<`Bx!(Y?Z@0`?8@NF^?6%~MW z&STx3hA@Kw+Fw~bkOyw^s&mtjs<*R*2YdA;?;Jwb-p5fCIlL=ld~~JA*Q^H( zYHtz2fD&~CL5)$A$@mo-tC@Sn{7_6SrPi|y7VOOY{V_pgdE{vzlZg{Yh#c%z(-{)H zbhjuiG26y|3_(8#T})U4>S;gj_?B5C=)-`!afWHet{=n+#RA|F^`D`P7um|Bvs|H( z43iHuIXJJ&rKtssja)ukZxyu_-xXa4NaT&4<~ot!&Hz9TcO&-Bpl+dV7qKtP`o`&& z(Z1RV&f!mAQ{3FYuQ}61Cf@drZ-VV0`Wym#ZB0%3*|RixR57R}Su};z=Y3%CiLR>RmmxI`6X?FEC-4Dh2j}_L^M~90+-y4huTnxG$tgp5p8Q_2Rc8{4(Q8wU~PQ|$?y+~H!ReV0;2Z9U*Pz0W@i#=$HoYS-&%*z z(<*%i6Hfut214?#Tq!SqG9|?}YH7f~T7Z<(r^n$A)Biq?gF>WFT-2+-Zi_+-A3mf| zT)tw(_P99mx&E3B0WK7w^2L2#^bfx0n|b-Nkj(hn)ITXb%pUCO*A2Z^u0`al-a3)| zfjm3;Yw2{f+@#vca%00|9GTh3_GBZeQxe+^MaB8?a;?}m#803=d;WZo-|v$xTjaOs z%^m?MxHKU4o^P1j!lg^UrFB=~eSZDQ9&RnCjQaJ;ccpyXOX`GOp4qgsz8dVai1B@Y zRG@G!FaFk=3JNTOR0+@fR=>%6p4>d?_TFQoWUns~a-lqQf_X4{Y4BWgm%bJq0_v+%`s(0)`mBz9%}YwZ91u5Ctj;3-!D9{ zkG;yvyLTa-Gl(*+BwSe%lj|UwS~ujMmXBH)iBO1_lM_MZ%yp0B4z~JZzxuB42)Rg=`zkj#apYS%5!(rd?`?qiM`6(octSo#c zUAa8;+y^>cvbUG;{7}8#oT1_%CiIJv>BaD6$tlL0Y&nuF{u>T>t1_@2WkjvOXWQl6 z?G~YiK*V4K3t0-p&c|NU?V8%fI{7SIsBWK7|2jCT1SCT&4c3inJn?CTwYv&@Z1B%c z&8I#|q-iXZnrYB9!}}TX0V)=m*nfm-Xz8-cu3o)*pK0CtHQEQU^zG*vHJXAbu4m6J zqkGy*{6VoQ-`vUzP6#Z^Q3^H8D=#b42a?g2QbbhOeWog+3n7r%dskOh$_#hqmf2@q z$U7BjK9*z1$nNgJ%YE?~${Sp^NzN^(?gK+ldrqC|t@ZD1^wO*iZ1X;))qODxRpQ;8RM}{tm?Jj-=AvkYhxefq_@gg}Q_=;FcJT)p` z>}7+Bg!Pwd^EX7!%Cs^?NbaM+8E3CiPvfp)|G&%V9Bj)Tdo=ehEbO2hE$hdn* z`!!o*qq!R&ei&{zZwScBWkG3cz4@)x zsne%txw=C7uxdcbEA*0Tcn;8_KzbOhjszGJN#H^vs!Mff$>#UhpE7Smva5yqm#<&L z)!Kkw`JvLz|Rp$Qc-g)HSB?k_D0`O>Rr?KZqmvJOy>ZrU@l zb-7dNA<|_co+8O*WnS}a^2?W*1k^G#OG_qkM^i=s>!FGTmNR(f*dxQ1PjKprmDs5% zXO$)Az#FX4Xv%MFEjR4#k**>I@i|_hld_JY{OLpW0rUF51bd_%)|OIEsW9mVDz(|yN{)ACu0-)QjWCPdzVwY*&Z7xe4F(BG_T_qsdf zHbAiJp?=Gb$vxIEn|ih7;>50(`UJN?GCAJsC{`3!+4zSA?43k3h>s5w!_6w$YKop< z9;You{D%r#<>YY$I`DAxT4-2@Lw8Q9~E8s$?)RJZMGZDVt5Z>Czh(ra<# zz7B!V0|IwEewKCZ;)pvta}J8y%0b7`i0ed>f`Md3zgD>$i9!o}C?KT6W+gWD*N30^ zing6r3^dT7s7nq2MWsrlUnUdF8za_ z=0Mbmk3W@c_tUI%+O~J( zCQc6WMPVqWZm-@(K4)jxRy1A2Y1dAYjMF(wUn5&8E^dy#xGv@4JZz4`rXE9svGuEl zq`AZ=xW1r!TeVe?jfD?)FHhvaiT^?DYkFmA|yr6q3i_RWxFqntIEnk z#Gi5Ys9vR2rG0fV1`1ZoJ&xcGK+fRpbMA+b=ZQ_%uHmZAJaJv$Nxi>yJb2(h>8DSS zvQ4*oMjx0qFn@Vr$qT|WL>40vgBjRAvv+!q{kuT2VJFR7;8*S*xl3*FLU(rlOdADs z%{a1Rvq2Xkt;Uf(7cb@^e5Y#YvEl|_Av=2GQ%Gd4z#ZX{z80$rC}U-;|r zPS;tc$)aoi1Mnhn@aGR71Z^o%IZo>lvHZqC)E9uykbZmj?PKbt3ZoJ_wy!S-$W=D? zQg^c?Jn3!B-a6ZI7X^Fa;&t%eKJCuBnjvx=E(#I(f=RJ%R!@&v<45##&mTU74wIjl zA(Ducw511z4cD&^3>fKjTI9_{+WQkIS-@ry$l8lgiEpu`bC5s0oZ)tGGCnc*1g{lH zK-fy@6!&M}>S}|&p@zXLA8|UKJ~i1;a6l(mOzNoq^hqKLy*V3?vX<-%7B!X%i#qi; z$P3zzzu?RZsMKe6@JxXb$`kE-qB9tpdV z`nPMRbWHR8ZZn-o!>$#Tl}+e^@DUSq&Q(<`T?pV)j*nmSejLvMbo|M)XI-pUI33LX z)AD9$@8IyfdA?8`kbCq=&!0cn($r*!8)UnHwVyoMdE)dBLCTI|#lN?%OAd8y`Bc_4 zvV()Tzy3WI!~qW&935%?{iCCZVQE#LP1&CIhxa}B7_H`+y!y1(Mlalp*`kPtE1oXw zDLhQIAeDv!YL+_F*>A3)-_cMCc73nzQVZ&dtQxs6fe1 zd&l9Ye*=CQ>ge?I`o~u#CF5oumRStkH+EB7!CkKS`Ra*peHDga7w`_6bcBf2QmXs4 z9mJ#`CNG+BQl@G^bK12}AFQfCq}fe*nbX;8+Jzg++YLqFvl#ACZE(RrG(X!66J<}u zrRjHLW8Qh$UxoZ>CRs3-F{#q?^rt!G+f;}3axB&W8|m2bHy(^|G)gKeqfZnX1boWR zLT?N0g0>4SE#pDnlHkgsK;REm7tn6)NB_N1>*vGLkcvS|HS zjsq-2TD4MTElCY(THtKpjDjvrs?eI*Ia~@q^Z@n&nJyu*AaRk4da1XQ6*|_Q7f#L>8TbkE(Wkd>LmrlVRcR>JQfP^wl9sJl0fKB8eTz9^vKU1}bw!00O&Q{g z9u7XOrlCaxRArR*;lqZi%<3KHQ)>VGDv9s4$7>YqL)%-gM=^SBeQ0O%lkk>U8>5Wj zFu|O@OR1kAZU+8x$D5A6lYeCbj> z={RO^KuLgAr?DJbM1wf0tG%oNw1IAc{HMu5=xo@}gUrT101SfcBWuGoW`?LnuV3Fl zNja|=&%E4)L{EjhlZOuZAY4W`!=I)UBAAd@YYOsXnrA%|h03Mwp+38E`7$ci>Cknm~X;g5mXs4||Z1ZD|uoaO~Lw9a&e@Nw@;}&7RHF3UiNG6yfw_*EHs0 zr2%Rq#Ze0L_Ka=xaB6n=r6pcum{nV*p*sJ@+E(wiuN>W+=hY-n9zX84%x;)?IKC!qZ3g53+_f z0ajK4fIO)2xf8$EJjeVXE%54!PjQOZI`=lX^^MN3W*3DBkDdi3FA%+ReVTja$9d1O z+7=dA#03+Uh5mS1Q%c=|-d$nb8j!Q59^2jlG1*WQlV=dF<9keh$f5&(fL!QjjDoak zp6j$}Gr#}tfL*QU$K2hhu%>8iOYEYv^_sYo?L%|dyEh~P1+SwtRL)5lMkC&lh{4y9 z&et<@nwyj3I!X%4H zIQ})%@W7``?25PC^jo;F(+`EC?tZxAa57jOL+MWoS+EqfiTtm2S2jil?JMw+W^`LK z)hh1h?5LL*->_Ycb_mfN)&t668N{@-D5dp}XKiRO89ew!Nr@c}?M4opjTQw2=v}SL ze=?|kwXBeM*ph#Ij@$>{~K6K!K#fQ~$p=uGChS5E|-rwC6 z_ejfSe5YGn7T$$t5mK;^-vR(zVm5Xyo*0DuF$Li_GG6FO5;Uu()V%{^Tv{|aYVAh&Iq{;9{d>G~&K`C(gSa5skF2hU z@?N)`5b!brNNITN04lKTC#0^Whk~2B+7^QT0f6^H#Yg!77zrjt(Voe0I7GKFHvuo0 z*7`z5221O&tozm5rCVVKZIL1;RIV}J+C2D0Nb8q`VTACY>SzyAR!ES?X(gR_lF*0%#onK|M5Ub(XT_ci^pRRBXwUh7i63-d7`XcPZpz;umTY`+y9Lo#76O|Bg&6A|3{-EG zoW?>jcH}V4`5G~X^B5D&u&Yi%0?SXE(}#W8lYpwr%Tuu`0`o)U$G2yiYURowtXs-I zudb=-J7cpUd^ij1IDWv#cpgZAakL+4pzZnn|O-j~|tcT?SiWXV+K zEWV8$@_8H~*3cr|SmqE@bT|XRYbfR)^u}ms)LXayjbK*jXh$3XnPIe{4~;Ah+^A&x zN5Nl3L$(vD^Xf`U%h_rwvigM7>hD#}Jl0DbNUp-b#jgX{6-Gf2t8^2c#MQtC#;59# zvpN3gXSI!@R!6a{wA6L-WPxhMYF;cN**RX&{{3KJhYq`#NXsX3W(BbBUOw{DcZM*n7QDa0#lluiM_ z;0p`30u@IwLA`c3HI+kUEdNd}NW8nPaQF+M1s|F@LXyLgD zb0KgNAVYs9U(*YEcHmo{-H^>K_C}5q&KnGag?6<9Sm`#lEabf64tvc_{T?lk?06{7 zu%U#VD8LuHcdIEBA+ESl2Lxl|UwVU&fD_ttYVoIk{l!L^^A|3FQu@9;HyzT|+U1wZZL8!|S68bnYF+E;F&uiV z%u+QJ=OJNi%r7GYZ6uY~hk}(1X347IE6Six;E!s@Ft9y;m!2_l6(z4*8@~6l5=_kyz7DnnKdz|VbmubZ6-uowr5lC7hS3t=gOvHrC7bl zlCZ#r+N__aSa(O9ZWSW{xSZ&_{6(nDD3Dst_H3-y|66|OdO{`fgbb_DFjLL=f~K0L z_x@HCX7AJS)22Qlj)51AGFc*vL3|R zWaZY+)4H)ho+%HZ2ge+FtfHaOI7s|?TOrx@ zPHvl_j7bb21en2a>1?Dz=Ln%DiS)t>6Po&%<2ZCKAi-1g3D z+qAy}B4!=z%WdI&ARZ4B7K15SRTBm!Ys{M;MYilQjG(M>l^{e!y|jZDvV1}7og2aLEO--o66c@ z{FkxL&T$^kn=e5(gnc1`hSyALGA`|DFSo@|M5>0_C21gd>@)S8NTQenTZ*8ARgKi( zx?4Sw#(})>2V$w!wsmXPEGoYGg6?a>n^&*)K#flDvpT3i$ zAJ037Aqmk$MdHJXi1nK%ot{Zn-nVn70IAPpP;LH?&rcB&31cy$>7IJe82C;|Kvd2M z{VL=a&fmR^?yfC39l7rZA*oi}jzR$HO%V~QXFL?4mOe4A6PUl+A(&_9FVrDvh z0?T0U=jSIfMeX5HM1+!99&|g(xp{>XdH>H!Axu>Dq<{=HWX8Rx;l$u`N%g1Ux%UlT z{uf3rH*b<9{O;D>Gw6IHv{YB3Sf9!W@1i!O_H6~fNpOr~&J^@P{}SqL z^4uw+5r-_3%?j|M>-C~(<<;mM(Iz0GqG6 zsBVbCU(C-EZlGjNB%ZFK2cpm-x@2A&HCw@|5u_Tf#!w`>08`0H+LuEZ-H&6=az#Z< zSXdan!;PS}Y9{99TUpEO?v5Di>9c1P0<^i8GBb14*pL1@_U9i!AIdOe`ThOV{=hQ1 zj~_38uk_bG`NHEQbb?hQO*aBI4~#^ryACxP7h0Tc=Cj8Swhtdc6z|Y+^P-1*2$!iV zw~B~zbvC^|DD`Umtz}D>HoWm-hTxl5bjLx0)C^RF8-V^=wy&!cA42pwp$l)RCeduu zl#}!sJYg2yXJMZjEs_Yy^M(;68pC|;vb1Ur!@0J40iCJ05m0y*KEH^gz%_7jd%f4; zJyZXRy^I`xc4`VPvm%f-GxyELDM12%_wxK0Ta|)1`YA%CjwHOhMuf8a-l(-tMakSC z+WWBU-3uPkhJb)GfBcQs14)%b*L$o;T2qU61XLeyejwtct2S8oq=FJRiDp)D| zbpXQk^39QT6V0X_8yds_GnkmGv>EYL0J z&|WPZ28^i50{~f|0Oc5vA?O6};Fd*{;fUzJ+Rp!K0T@bvi0fn2*p8#nSO2QkGZ7W9Oh!B zdyV?^(Nap}RmokH$k-cjVP2#sDx59Yeo}INJtSHX)q+EQV|sm z{9otwyZ3Kj|F!Oi_k+8&*Iw7&SNJ;5&u|>?=@3VRBG(5lgUp7Ww4932aaOu7>74ym zRs=g7p@}IKE=8A_awfJAH)SmW{dj0!H)g{-(eq6zi71T%*nkX?yn5IUE%r z3#c3i4e}%Pn#muu-wz)y=fbajEhCei39zeDFOv^@QEgYnMvvg$a0 zflk-VqezF!ZwA#z=X;_LmS~tuF%NJK5(w&OZ-0cs{pL;NM-2h`$J)v&7G}2Sw~gBv zzub!HOTHesDR30Maqm=L(Aj}?bgV~bnkLF~E5$>b?o}cDqpiWc4Ku{)r}APjJvDqX z)f;CqcL@uP7#hU8B-4ebpw+wkTwCr82q%Vka)JC%T62q!bByK0+B$Xy<)Y#4ofkuB z0Oa(vBeuD#=dWh!XN=>5YAeN#ubGaRGswyLNY9cNTlaMm+I>pdp!n6o@siyUorI#U zE94bp+Uxd|8yHY&tsv7AOk&g;-sD}=^}2vcM7@9 zNe{x)?e9MUOl6YHn~7GtrRoN3{?lwbbg7s4=RGT6>ufED?fIS@@hBQ1>MV>n3!W}U z{oi`Z_i*xttpnae!Zx&8O*KZM1l@Ho-*as3jjitLYMPqH6vX6<9X#0KR)LZOkx>Yn z^_6)hd=!cYB7r(BnI9$dn6COf@^>BujoZGI3pyie+rIt?Q38_r`1!MH(b>+@5+3U) zmX3|J0>oRo)Mff~LXGvW&&B2-6;#6#C5%%rk=cqbo1vIupi@~{dkNc!yscl@Co*r= ztR);M-*ZQsVWg+TmZ->azr8vhO~U}e18%spE;y1pfxaBjS#;f@pxSZKNW8SQhh1lU zIVxDlx4RkbhIDt{m4R1+l->Pmq(y=hLd0nml=I6+2^=A%ekp zxsmS=?@h_L)N&5(JDcvpg$WK_w&}_x-9;msb`}x2lB*c_bFXdq{ld)5MBYWkQ6ufh zW>O_#^t@D(ErvTda6wXNfd&F{vB{Y0COqTw>u(-$#2H?X;pasRxklZRq?VquMRMl1 z_ko(7%0plIXR7Nj1jaKnH;=biG9Ado-TeruFHp3O`di-h_WU%{R4Y&KUhuoHuaA#V z3A%Nl6eDchxid9q<$QNl^impSr{DQ?{4?03n2JhyUhji`-58TqZeb1u%EF*&=3-=H zkqk?TG-u8Rux`!Yq9p0YPheBnFZ2U_t*lDnmXDrO&o+ftU>Fq-ChS?M=dhp=6^MZ+ zQxm>+1?jO)waups0DN~$5R<7tegrRFMfp^^uJxySh(ngC(~KF!)e$6`j=mhjq$X*tGB*VB{%y-v~i_@2dVA8Q-&%sF{nqR`_O@kKq$b zuKZJZa8#?j&<9%JiyAe)ZxJY%~~(Ek9iU~ znRU<$JNnL5H{9AkWbh|UH;xi2ge;@KQCV$9ztaS@P!vF)q%=eC(JRpO9^ zl7mih_?E|e=7S`6+NG8_FVUd&i?_QVWNmc2EQELYI`&nsQ7_T$&YCsmnfELZ<#^v;&os|^@S^KNMX~l46x}{GqM zbh|zdZ86l{JzHk-B;xhf`uT0GJOMtsuI25(9z}$pfd*#$`goQGY6aL6US{QGepTm# z{u-|StJ@|W=95+qSW^02GKg`zTkpyk9dBn81pd$R=3v(hw|sZFOP){dwQ!}e6DKB6 z@Rj{cW>Nh!2qtRZnx=jlavJ`=k>E#^9$a&CGd2%9-qdC?#7XHcpjr%BV*ibzG&4Q?_-p%Be!4vgzV0+6Yi9s5Gug3zy)578DtA(p7=kAaa*-@Q-qqGETlAeb ze|w(ai5hImc&miUyg;nho`z853GP8OG zJ9EL$o0kBaiiHc>WaZwRt^+b->~-W1cix$^rOtKSxDHO88Z10mx`8ijbF%*Y?zkld zIS@&BxyWwm$0ZNS$it=y+ltG}6=(17*|@6Kb;$!tjM8c&L&Lzy8yp<&(6Tz-UJGHy zOyz{4P6`UaO`dqR@zjF_0So6w==3kSEa8H=MmYTe@hSHiTkqlFVF%+MIiCBiO+xv- zM%&WBtFxv}6DdCqdeSCFY?!$-sKb2B+>j-*gL*4>(DIxU(Ax5z1-$3D-h6e@XNZJ5 zSZQisJ8ko!L+6m8c<?$EMSP9%!#M6-}ahmST>5<;IK6>~zMZI9eFnsr(W)7g= zFk8HOiWIJNUx^TNL4Oy67W@+)<3!=?73Y>R!^mvlz;0!^7jSa*>J^e#T^K)j%FQ0q zE|I}Se^!{vhde@8`BWr2T>5o&7+jh%FJp6eJx}H^D$55B(+k!wUoXnzi+9X+88Y4D zvE10tY*cO|`m(p7ml*bj2!V|gU^&ATBQtrpY;&N=6-a87!@p%_L$e0Hi3XgoYE#TM zjh&Qyc(UO>T1I#^Bp4`ckb&$OH_%>bt&0|c$?zB30ZM)XUj4?9}o%@zTieBanoZ19R=jEVEBqx46OQyM`v z%meoFLL?a#9sM1D#Ol>rvj!`iYo=Kt{knMey9R$=+EUAdt2Mas=!j)hgghT`Xx`!O zbVoh?G7K%a@V~ykkyqmz^k_?UGd2W}81h${(9OVbCn=_Q zhMNehXgQo0OQd#?wx{n~i!%so7?B%HgEy1TN2-X_2H*x!F@FFKR?g5+$fY7=q@t+O zhrrgO@AbCdI}kA;T?8GF5T+gi}PYFn;S7 z7&S&Y=V$h(9$!jLWdau-#FbWW1&Rkyw6k;~Sd%8vg#5ACn=j@v^UFhoQ-6&1UDvbY z$yz>Ez@LUZIFB`S|H*CInwq??bW(L490{zRZUADjV+WM6Q6vM^SX5%LES)7-AQ8Qj z5bjE^>+B%h^H5*t;jsr1609e)52;`hKp9zzXu*P&?xkjK!2xppma6P4g| zptdc&6E;ekDXjB-6EUf~ecLx~6Vc7hmVPA>`-d_tut)xb2LTGt+WSjUnsLALx()R8 zBjx-zZ*HYi?d%ZvF3{^jQj&0bXyzNjfuK4#fuQsI+tgtoCdhD)mgVkhP*$*MxBx5W zOHyTm)&<)|ZVI`Y2Q(A#a;L7lv_0uurL$iX2nFN<7Hu~i1AKZwo6YWOUO{iO16&Z0 zXLKmVE3g%5d>F?H08HWk2I!Y)*FPXxLFsB`V4Vs4XTjc%Z*28p`70|UiLGmE-4qx> zu>PS5888Q&e<+`4y&Y<8Eoyk#n!-5*L_8=U)t}W7w!Hc+mF>>CP`Xf*4VN1{bZGXM zWQ@-kIFK@Of^6%yQwh$B+JylONbiA}_=N%if{?7ads$ibZ#?p? z)RxEatD79+1+o}Ll9CD-J7&pH<0%{fpnHK)@)jI>i}f3Jm^(U{%)U&0xde0(HEd>P zpst);0ULlTyVuR>aG$huN)G&O=gu5};tM)_c=OltVdy^)k=M^w4}}rHY0S6@u!*eM zT)I@^V~;|7!fIjdL7X<2%L?Ljk3y~0E?|HnI0)?zm|6=!h-4q&&5Np%xEPC z;x8j5pMViZN7IL(gNS0-##;lJ*FzIM}`I#>NZ7M zez}}DOc}?XZSz$Rb=Ji#j#iR5IbizDzU+82-$(<^MLywXv=oGd5J0-;hz5fQ8(R{u ziRIenKER=RdO_J$^wnF{BMtXs;_ST`HblHEe zthjyg^vz&cBZ5E3`@oM*1x23>|HQe*PyseW6hYaRmgK7;HvSawed{sJ;2|_>q9y~> z5s*etW;5~usym~-60!`zVoz|R+i=Jc77z6*g207^^m^?+xA&R335?LjW-~xIbo)4T zS^NPk=G^C;8R0Lq+=3;A2^Onkz8F~)Z30J6&w*9kkDR8j$*)=`s(qNjMRAW9(5DlV zq-guaAaU?^+AV$^aZ({qK5?;xp)h#%5obyQ`9h1z%fx3D78PyNoFC>Z6=avpPU4I= z($kX|C63bs#x#5%nvI=+?{~z=3G?)h9rvLmlXQ+~4BncB6XiNtBlG}VI=p*^{Q=V< z=umQi+g*)AKm9Rp?(?hkOUI9opd8MwLb}g~#g7BcNG)?m@id(!g$hTdaIYG~-Fd%B z&z?A)TY2ydl!7Zz+=l*+z-Eq>4eQsF$DqLoi7rBRGW8=ZKM$BBn#{7YbP6?^q0d9v z2wqHTzsO(|J6-?gdUtR)(0yd86h-}9uS;*Prb^r9+pTH$^^NR9+C5-;I-Op^)|KfV%+t6)g zF6k*JDYI5g2rfE|n7Q;A%1}4VjJ$PrYlzwgn9tcSe z%yhzoRk+Y^^=g8ZzmV=m_Xr((%rZ)&3)6E{(LK-`R1nh; zH5Q*8Wa++(z_k?ckJG+789=3XKM>DZ)IESUlf0=XzYCo*?emXpsBQw zXy35>mWGlAY{IBi3yY`a<=S_};@!QJV+f@?r>CwG$4fo1|X*lV?S# zIb+To76Om!741{xbf^HJTfqNb>hh4>Z{KnpLgO%eVDpnTdv)cwd{Fojs#j?RlYZvH zg;t1poq#`PHa2q&RpzFxlvq5CN6SsJ>Ejb4#~B{#lzArx-a!mbv}aEhc@_vZ7Z{c1 zC5mS!Q-)GFqk&>)G@ty;@g{T#4GAI8YxB)o()NAQU%>=m4g64BtFECzpappN^($A8Hi$eQ_a7A?RovBZ0TBt zK$42<=XVVc-P93m`v9OPYI_Pp{(sL!>1<%SLufK^_;i;G2!sG4xpAGG6qG^;6vTIB z+Dk#{C2fL1@7|=H<`DAMj4As(&@%GQnEm^&Ub@sX7h95fMTD5u8rmaB|8&#`sucW0&GS?}xGT8r!_zM>jA4n1-EpN`M!rhQ^({?U31!y~bvS=N8vVb{6qJvUvKL?tlsqHMu(&@^*ulT*rdd;1}9{+ zkqkMmPp@9=&^|00E+R2&6cKmwF{bp@swD9^am(}id*c! z3)vL3Idi5=S;Y?oyMJYm*!6tzFQ$Rf@W9eNXMP`603?2HUU*dLMASNWj*5$$HE$kC zJJdegzHEcqJjJO1l_kR$N?s9gU!PErQzcEP5&Dlijy{XsVAAEdyN+>^KEm z0*{4=EBatWHxdHJlxN*D5TYMnD-v*b%%07R(eUZ2oNx5xdFR~;61`JB0HEbDO-z?A z+}-?To)$m!@uNq46-ud*++rBo$%AdX8rV+Y#A1Pw4%V-K|3S>9O-+5{n~voPnHVSS zN$wuXu47AI_K0}^X2cOmAndbS8~ivJ;|KMdmHHN8Ol_gYr?p^h$V*_=wY0RbFAR)w z6z74klOX?5s-+?7wpzQ&inx$Mz##T=)yYX5DfA75*tj6NblUaQsHOLe5Bt4(_h)Fv@=J1Z0OB+a#+#{E(!CsmjA^TzsW$N|CvjpQs+~7 zJ}%m&Uj$b|Lh@6a;~)sRFc`#5ix#<8V=ciuOWZ34*g5rf_C4wEh) z8nEEL_<)>Zi)j{8X2w4_iX-;5V&$C{_6FiL`fSjGm9KkXYM?J7Z51t`70!wao~zPb z5Ox6wbC9qpNefd~SNB}F5GiLf1FUn)BN{Biz8BKI2pC{(yo(bvOh1w7U%R|)n}`f2G^D1wnvMAZdemfQ zvJjp4_4e-zw{L5&iYR)|W{uFakQWHI6h}f+>ztc=OY^xH4I4K4vs*mhCoQFeK>jh~ zcAoOuzkjXJ5$N{#{n|-NbV;S_>UKCiy@e|Vu2mfU<8lS<0E3xd8(H?wcO?Shpoih_KiEfDis{hSmce`jIV0V+wfPtmP4$(lHcxBn`Lgyiwe-T- zefGA9V%b2jaD+c*Um3<(^5*0uZp2cHkJXQ0dgjc5!>cg1Wp7##u$zaSa~SO(o*SyB1>S`h$~j2}=!Zo|K~g%Dqdz>~u&x63N)S^&opj0_ zm>GitV$|~=h#Y{BjFsf-ZytvEfAgK+$74DvC7k--Kfj#OQqJ844zlCJDxld|`|&|~ z!$T8$Wb3!L4cF|r6m-ON`cz6_W91m~=nltlqhER@#ag zm2BUFrP8aEHQIoH_0;AF|BE!+Zs z(hlt+5HUP_WJEg9W%z7!rl=fCOtjNgGJW_>t)EM5eEhCWunDRM1{jfX8uspGh@Gxo zpYss9DW{}MzleG}@5^YafXCIkq}{$fS6|s;NU@Y1Mi#D~xSPbRf&`OQ?|LkVptan? z`>u+%e&mhy{<7_OAtEoz6rv~ZfBjl-z4XE)38Wuw`eptwPL=TL1p!`F4^_>> zrX_N+Lu1yN6P@yA(D4Br)kF{{Sa)cXXx_M)+x}Rbo4Y%ucZv5W(wuU>c%uce+E4RZ zS?PAu2mYx!Kl^TuLaN3~iwdbL_8*@Cuv9X*rA%lyudNjzJ>rMygAn10P2p2W&?r zR8n%2RU*!F^1kQ&`RP9e1C8O}F<2aZ{#GKN;UhHebZPMb9sE zZ_IjF@RAx?^Ls&Nbpx$b@YBOZ@5O_{^=hA0AZaIUv$DDly4hzH13%(_4QL6xy1Bf( zoZ5T*(`)atri?BhvvcQZa&VEqpnS7>jdS|k>C?m)WH+X>6m0+jqa2$`W|XvbOH_|I zb@>km6RRZY5K>L{>=%N=9cc+CO!)HRN}t(ABHn+?QESNRdnAVRh*DsV7R?ioU>nvt zxVPOG=3sy$k>o{dAz?z)dTGlCW2D0COrpLm|PTej|i?RJ; zBDxP%d)`J_Pg!v5=FQ?=@%*aXUAGT)Qh5Lr(&S*PIM zoS(%q)OM|ug9|ok*Slxii}4(N37I%;fP#c**SF2sVmxYxhl`mSSL#ty6JU6z%tqsL&btvFlG z)wR3!urD7z3|{=i@M_NB zB*T2)GS_+<=G)s0Rw)F%wW&=D@8r4+a@Z zP!hH)rvMBfTjE6j@a4tj_ezz6#KYrp zDLEOMYXW8aOcQ2G5S>eeyhQat$)A((1>K~PzPr71Yyu@QmJElyG56Dh9){M8?Qj@i znrAlrt7E|$@^k2FNphsDqCN$VD_DjZ5wvEgl~wYleVbj9?Zu$p++14h#kniegrgoA@lV{MUv06(-`_h%^w7~s;6|QD&)R93=N`QO@pRS6d;6;G6z%YD z--@sgPRFJJJ7ry&6JUA$hQuXa_RdWvZV&X-cES~K6>p+(BS6k3fnGx_;68nNNyT>Z zIw$g%(v+U)z(H{fo0qWq$kb;l_xP4hxx)qaLE_5w1lu6?eVu5(bv+%dmg@@#9L$_N z%y3|gK*bF|V8^jIn(#T*mdxiTArfp}4dUmX9ZFF@bJi?wqnN=5yowX;k?pgUM`b(| zU?bnx)mhKa-382KX7qlg6=yGlCx)!9RXU&{i3m$P)K~&9FSrg}8^Q0JvcYy`rQJVG z>fngHftHqFPOTr$UZfVYi8BiUc?LI$n}0{b&Nvz~DJ6EuMw<#onNI99qNn7meTSl= zDC7GohtcMYmc){n1xH@~5 z6i>#Li)A1~=*nAGGy9S827K|tueNiaKYP}S_Y-Ixu@Edge}A3zVa^@shf}A#P^hbf zer5I-!eJ)1b-7`MCV|C4bH%ujphMTZlTwjc(A9I3{ZXbE9bjn*Dz+X_r!3#Q5K5xy zT{qV%Q-VJtS-IQjZ`^KH)?uBdIrdsOG>J2 zY=OQ6e&t})<_LYz@z8nsIHz}n8X~#pIe{O}m^!u6YPZ)C(f}=@JMq`+`b{v{OVQpI z(E2_A>~$bh$Urs<7W2_4`VdLjtow%Tg@|@SdRZ@Tmafh8;{2R9bs*u`N3kAj|KL#SZr5t@mUCvyP@ zVP$znpmGa-58C&j2K)*Hrkk0^2+r;~PcmBOS>GMqFQ!kt#gE;2NlA&1(*SS5a)E5D zeWn}iy;AGcRH3LT{ib9v@Z}|#;Ab*Tj#&1dQAvPR04Cq}Or_bSizmmzo4wBq%WE&o z$492kU*f^W^qunquy~xlvf{QbM6kSjM-V!3=%KxJ6K4X)n6aA#5^3?S-Z^xElL=O` z6$^T@cS(;?PbC96A=qp{OTQ>xG8VU%rX%-(6MW*KDzkW?#-zUTURnM9za1ujeW|}O_?aROC;v^m}k0Y;e>m2VP zA&R@e27S7+Y@*ZC2miY2btiGy;9u7#r|s_cuEg>w;;l|rQ@%VY?!Fn&mC7pS!Ik7> zyT=|Oku-aS=5x96l?LyA12WdHZ{M6%dG*_e)!cNr^pa}>M4xh+Lmnkr^>Voy*&}h@ zz+%t`oNKUe>x&kZxGQ&`?6GXdk4w4L4G5m;ssOnwMCDCeMZfgaV;*pi%mbLN%GQ?mosNrZB)w0 zs(&5#$~$+GL#$Bc2rIpcFhRi3@*RZM7T6?0tGP}2riu8dv z961ZTyrcqo_L?SrPHFAD&5FhawZ;zhR*m+-_PZ2YVJd(!h-F3IY&(9Ao85}h^5<2@ zq1iHuAAHZhZRF10Xtu2!yr8gfFEbFv(fru2HzwJ~*kJ2x+r^!D7=-zoZ=<+v{-Q-;-G1&Hr-A+1`yO0eQW95WDhZ^te64r#TGH!=DGth>kzF;s zM^xq6phtFF=P{kb$^Fk_V~2h*b7<+NOqtKnpTl1d44(DLw$r;Y>{GN87#u=tUbnT?C_7W8#`JnCoHB-JG zwU+Yw)y29zi^(>pZNmSG3K$R6(Tf(9dB65=lYgbc4*Pm(*7q*UycV2%!5S~UXVn9n z-h1^bep5j>L$at{C}m8PVtAokL_BTbi3I^}f_UTbM<`kdwolVzpa+H^2F!e#7`& zTdaP~)$kK1tuv{A_I3AJxp-k~P~288)v76_9Zo6eyl66=z51xc_<)UfUjF1~H2!LP+)NQX&Zp4qM*a&K41THl!ldo5;<$~>cA zTPQ6Ra9?T;zZ^Y|bLH|U(^F1g|J7Cd$;Mu+Zu|C$ac_Rtn$OnRw<@tjqe`|{w`w9! zvW*)auGp2aKR-a$IuebC#D)nqDz`I2A8l-~c-nsBfY&=D#_f0gb$@)PVL`^d)xV+% z`&xFXck(OWK3kuEZ)z%bUp!@)Wf%3na)1^;CXPRvT&p@ZVN96s`OHs+5uH@6Bmhdukf| ztzMby^q%g@vCy>lkyEd{tJyWaDN-$o($|b*Q?qBeG>*(acj-;%X@x)CJW^uws@HsZ zrBSYUrLfa>A+W6VVT(e{gPir>`WH54bowEMbb_|IUOT&wx#b;?g-7pQP)c_;^xSWF zU`0Fsqf;p$V%;y7D6@G^#HY4$H|1sDijfygh>*lm)})+tVgZLcPxT%Rbd7rJs8WiBvO7i@tbQ zl;Z0JLatUb1qS3g5|Xc7n^Ag7H+pPI`#y&&$lMIs_Krc=RrZ#<)|_zZC!*^`fp6b> zjvBE6o(4*Y+9$4hzJ%a6N}$crw3Jd+jehcEs$gniu|OvwNb@Sma+FABQD_3unfd?d zz5J}_d;O1P5E(>f)HZynR(d`FQa_~gk;h(K%hZg*-I`;f?r!(PSHJU4?WzXq% zrSFp^e{ZB-TQ~d7dE3jb8D5&Lze^Isjro-ZLZ*Ig>AFYPQOUAU0@_;lHOY&$5d&QEUJ6pR7>na{*n_Bz|*)G3HMQ1d3z3#g**|KkCF4 z@-4jJ$MD3IKM+t&MTqhI zd7li;FDuPyP0Yh{Rd?cYD!$_D%Mjwl8d#O;h1`fp$~Z=upTr8C@VvVbRO0eeX}kK?RhD*v9VS zOs8L52Yk?f&cIk1;IB7tCbM2$T?>~^xZ5+oBy1W-c74eJ#`%?W7SJlv@n+wfY0U#1$|Ki$;Hc~_i zkZgmYGDeuqXr=We%yR&huZE`1=h75p&(&-A=;)2f#1YiZJf!FU4c?|q|30WspK%6z z#s0ng7H}tfK0c*q7rDGIB(=5AemQ1cDAOe&M+lz`yk^Fsv& z1SKZw3M>B^g_Re{h1a|o9vKUL_LDd1;V@P}+GrjVF4X_`Y}(SSF1}*je*M1CF%~_1 z2;8uXDdjXgP;7Kn;-4Km*gMW|A$##~6LAk-v>26$qdp-)6r!k=s^IH{Oc?II5vKL9 z(^3L=4xG7zo(YNtcCQe~?Ly%@FbH{3M*+kO>AE}UW<;KtI1eOJP_P>PiI0!{oW5~R z&rVP24Phx*`M#C=l_D94_l@ooc?Z65Gs*p+J-|MwLU1)QPxs;bMof-ejld;LUV)9_ z@9$bWjm5!92Fd|%LIcDD^i7Y?t|H$6sIa?0%|cf_!@L?<0La9ewQDznaxqVuO>KGw z@d@b?(t(Tzh-y*&@458nM&TH|@jH^*W{t12z9EW%nGvoZIBYA$X#IzlBwm@k4o~Z~GC(y^O;Cb!llcONSTEvB9sy z>IE_y?OIS-0z#(X!{2TUB01{w@FaUKo}aNcF_&H{em&6$A`a7*faw`F4_?!=*^ zsEA@74GG>Bz%O0^AUr~9mXSEY;_>78J8&I_6uq}4kr7iHu6?sE{{#ZT zS1>%+-&*^|a+IB-SsZ#>J_32t$gJ&$-obo{)I z{k}z~&59HAZ2kOxvQ`iU3`vaqPkpdO*G7YPv~>91le!XTr)`~3$n!p^+>@6?Ox3UD zqcK|H`2!jQTmZJ`Wg?-aqQjtj=a!b@Xk8@^)RU)9Rrk9?9e{Ye1UA?HmILpBi9?u( zIGZVA36aMW=}!MR{bJ?$#}}Y}|M8SMou2xF+XnLwb9+Y}JAdHQ6s4{znV&pWpqBPO$X3Ho}W;wV29JIAo=@+sU9y*a-INgPNlQzmMv0py74D zC`TbMulh*H)G0wc6BLs9o?43A@~SOV`<}Gt6X`1h;G8+LV@*m)X6)=;KMtL4C!C&o zf5e08h6BFdAwkq|Q%={cv}#V{OnVqNPy}N2-8%p8;=9}X-LQ7&{I=<~&N{GX?*R#m z?zurz2bxu8IOk<06k1v3ImSM2e{iDu{ZX-@exVzSyc>oLeUY*E1wt7fG(-$z3y(NE zUjNrAad|eyOVKy`9RHe6Ee-(OO4Mo;2j z-&Agk_tXFDE|s>wyx1|b$N&CR{$aMozn?Qd<-Df268`nc0vHS3dRT8-xowgp$=(-V zJO1ZH_~%CpnLLqrzn3%quKB-zwyurD<&b}Eq5p3_&Ge4{zj!GBZy)2_^zkeU+?GxT zzfW~>_}5cvh&b|VV(&ojJ=_^0lY08}va-~WbiAL7!Fi1Eh&Vx$0}8~FH<40rw;kRGrNnFoi)nZ?!9z#Rr+ zm@axR1^0E8Mhhk4F}-e@nk3F~QBt^a`W`-vp5QMB-;@@+|Ng2YmTZ+iH+{!c<6DTn z8D6sa)3d(sjyf6a+_g(on&I3aDnufav9D;`QT+}NRX{T3nHL!o45KL)dgP_cmFBY^y8 zDI=9Tdgl^K8;E?tB=PPoNM26TmK{rNwrq8foHI%k$sdT(ym277$KOpt|NW z&Ovb!yf5EVoTb?f!Qw?$AeF1?3Pv!Cp!3id+(Oh)RRP@C8_>N_mQ+u)wY8=7P}EXY z{f-PlDv)4WUJ7*4Rz03U{DA}a6^)d`82q%W&6P>-Vi(na?k-!u&o59IwT^1}?~;&i z_`s!Ufqp4@*-J~I6ocHV28v>86A7_)qyAz3NeZo?%T3>!u~S37H8#d&vXcbL6-H&d zve?yjGNKTBiQsl8xIJD4r+f6okkvva#3aIOzJ5dx=1ev~4GV76h;_lk)_s$1mq?{q z-?9Z@}LFYKA&)mFTg6 zbrh|yu!HO={;-R^r>&-5XAGEu>1|E56dDXBoiUL7G-IbN^1S=qR>d-+dkZ(eK;psDHeA8b^NXa-MpX)zh@>I4x)9M6T zrN>X7P6GoV0kpPuSNEZ$$y-oOf=;76lwuxhdjU}>@_uh3kGa2HmP55pGGWhxh2=!j zvr`yTzoG~FMa9PavX}=VRZx-97Bg>idx5WXn+$**yx#?alvLK78R#uZ%rh32zDi3; zO4{Cj*Si^_Tagok6^eab3S4Zr|zkHe5xo= zLaMX`XlDXcsX&f*gM32K#4%$e0#TPER8MFhc0)x%7oP@$Ui#nmZ;%uSv49PI@K2E_ z83+T2qwXfr?RZlpS9~`JrI#d1Sy@0u9X!KxfX3|?#5O;rMl;Zl$oqst7GEQMS&oO< zs@D}2jPF@V%}U)+SI4kwYXQf5)vABh3}PGq^dq_YX@i$@4ANE?5W|#*q*Y7>kw4YU zBV)WY@Hu$_H@9pqrmUkEQR$Hv9>o6Hby{V|EZj%(dI*207z2B`g^f5$%|n@b^_+~r zx=K=ltJyiC$4zx@?T1w>IT}@{JAxf90sBRgf(S+!8X4IaCZSc~lL*ddJ(w)I^L-Pd zg*U1QdZD!tP`4W|FHnIJ_=bsmM31aKfS=$jlxz1FL6z*@x%2FW3k&B;RK#?yR7YIF zF}X8BM!=cG^gjV#K<&7l_B3Cl1PJ^jW*`WaYD7p5he-yZ`K6cq^ZqEA+)pK)z z86*N-`i)M{V}OvowWI)2^7gHMl%un?L*oUG`cyy70laf5fn&Jd3(%e1vAI)4F2Ta; z$$38Ffvs1Ty_|0UnG@7>&>-2sf&!<@w;WU>!h*u-J_LeiOndwrmOHOOU)G(Rt!vLM z&a@_{`_}Bhu|ld15!^%9e7x&2T6Ij>1bKm;M--?W%{Ga13bmZ#?<(;s(@;syRR4gz zh30t&1@%4IRp!Q-M}FwXJZR{BGWhe^ok0(3JQR|~`c{JViN9{ju78@EzZmAku|@sZ4XVXw0fQW!K6FLfJcsLh^ydEVS zf2z*6Qv;E*CN+yt)0#tm-XEWW>Ev3V$)CtiuCCo7(f1V6ef0=e*183OXMs3#LNYn| z`8LQOn?V!1d_Dsvq$17yyVq8~&;Rp(vUW_#F#a$#5NTFxeO$x54qk!UtBYFPl z-we=@2m~$EZnr%EE?zPd;JQqYQvC1R{4Ro+vt7RfY;*l$aZ)CDT9?WFV!ReCpmA4d zz1aUe`il?{MxJ zQwJ`1GPR#kMf3A{b${&={G3MqT~hw0^t-*@w~RQczMpR?>P($CFJju?O)nNTM$gj= z{kfu~(7NX9?YA3l?q=qmoU}(u^VR`ct0o$%Ahh?p9fjgOYy_&?OTP}4pm9)W$+uSb za5sxS(vn%X`|_lHHwrtg?|(A;&(MySdifWHmN~s#@o{cJ(L#^qHp07QjXBSqs+Vnk z^=JFdRsNga-}*W$#OCsCivzI>jn_>v@{)hkW%azi9dFz*w-{o2qQ(C2)8D&%V@P= zr|C`G7}G&~TFYKF+UHt)+75l5Y8-9ZW$?kD3G>YK%wD|fqxVed-QM?ydX@hfXEe1{ z?Tl@B+Lz^%Sc-^1h@J|)&vdeUfI{!yUAqDAU7mpX)o0bJ`9sGC04@RcBTYkpO1XNX zGBiG~+H7d^GkPR6G}Lc?pPv0=_n>IUvms=@etio}w7?Zq75Fp1uu#mKChdKz8H^r^ zUmbx#9y!f>umWikbRg!7E_-3_en*BRpW;M9UZe{Cko=oH~>k#@lH<8U56s!!=(YIEhEr(i;|yC+QHY>ckys@Go^TjdW4_% z=hyLeh)zhz5R2=XY>^xN`Vuo?Xjn^|Fl>Dj`HyfGQ4eYYT3ftO+TXghiH@jbdWYWA zV6ZVkkG$o<{8c`VXh`XH34=TXtibX@PYttN^_GD9(R%5iiwjE z>3{A5{)qx6D*U?%REfyNzvDeBUzCboSIndQ@_GZ)hHnn=ycdZq3yTY+Ym1Xv{@WHdi!=O?-GJwWS0pbqGE(17xh=` z>03~`DYkDv*zb#0%mXwRVmf^CVbk&5mg$$dDKgm-UzI<C@K|w9WFNwd57z zd}N1u&F4o_D3GZmT1ujELlANN4ADr*Rs(gKa%$r9OII2HLv&suDR|!pi9`eql%&vK z^a4i?L3J_!&OJNS;`=_j(BCaBBr8$U@O;e^j%PSQ55UC{0RFA%!<3u86v(t_mQOdB z@{_q4_{kS<|B}DB@kg1L=p<@tx}1`d^=(1q*c0eA=xj2I^t8v`)DF z+PKkR;^BgGGJkt+A90j=lf#&Cz2b~3dZqCp44M_!x1C)e=$%6${vSYR^??f&Zp=Zs zi0>B@)w-5%)WGktB&y!*wLRwzz%r3xluu$BI^xl~Hh^PxAd88(o=z7TgXf7DnQLdk z#ItCN$QXvuVdS#PWO`hdA;CjIht+29rn5j^K*c7m#k@QW2OD|$_=M`%B2)6-nF9Wb zp&G%#Xn_R*dz`p^sISS;GoEpWHApfgs~j(ZqQG5547nvx_K%|m!%1vp36jhp+fmb; zL*+-EH&27E33=DxJou5TxMO}`PgLsO{T3E;K0#$PR1Y8Y8jG&2d1l*lTmx2qUtDMa zk^UlpUs)InP}K_S22aUKO(MPh)2E#wkN&7Q=qkk%>5EXGrr13-*zv@prluyoo!Nt1 z#HN&&my4b%?TNJ9NDjXd*lTw79`Z*1hwr!<@18NL>>>7XD9F)&%6N=oG6@+8(Aw+# z$2vKYNK0y>6Z?n0eE`f#NIv(4puI$?|~B(`LW#7R;a_C#Yx{TIeOa8%BNH~Lqry86+&Pm!THOcxdX5+Y3il4vm}q|$W@3AGGMMi$R(}sG z8J(_#AU43jrnFJ#UDA~Wa8Qv?+`YeuQ_ogM7!{%2T}6d{nlS1o*sX<`#7yJ%km3G0 zV7+dDfIsBJ#jY=J_>;bJQoM(#wRag`!(d6jwQxDZU%Hb=@b37Bwsyh=Lb8I-;S&r` z<;{6N&s9uc@IY;?L<+Ig+5OG`Xm4hihlAKLzuU0+Nzx?X%!Ss+Kzf7@C`U2kO9VRf zK>x@L)08hfjEHq*1ZeC!!rrE1Y;0<}8_^{oAYg4+zUUf*#d;bIKAM-zg5U|Y&2 z+(Lb0MuHP04Uh_C@E}s(l}8&Ji)@jR+zhZr7{R%m?GGuwvh%2ZF&(70kS}}kWBY~Q z(MY2*9cl>zU2|X6e}m+QiJ0xpD&j^GzXs(lWai{7;Hgn?p`om6D}53;>f*|eAFmVCTDL7FV)F7M z|4^QcvS(q2e0&XDvvf3=xl*S@;MyE8;1N;wf=oxv%jmn~y*OR*vP?v5smG`mXn6_l z7P})2l9@QT;R|giFSnS$8o%(gs?M9m!%=W20liY)apOQ=nTLHCTMMFXw(grJ4|u5o zXWN2_x;4HnT*y9yA7he3K%vFmXu}gam6#aVo&HtN(vlQm4Jjfs|6nrecPIGK%vY6+hKC5|5eo>JaS9$vm#n+y_dsQV(x8TD4OfpLB zFljCfgi(cecQwlXxk=*9#XAMgEN^B4--v4c`x}Y)wplr161YQq`H(wU3I+PIGEN{A zcs|n~b4;Fm7u2?l%Xji*Wi>#cI8<=_>y)1}uP&Vhd_UCmVU2T2cZxht-`HGV$`0gL z3$;<)JXjruEg}8dH9v05hW9Knl`rQ{pHAn1!D5lkG#gf0+cNAY*Ut?z%+v*K48^&d?HHKzHM@=nP5hAzbl2WT5Yy_V+??47=9%vs7j~_XDRC3!m zPV}C2ZBRc8=f3~=5oY5q#YJ@yEJZ+*(Wl<3$-tD-0vr*G9bC$)cu(L7CvR^<%`qvX ze*zPF?}yW%uXlHgbHaU))wDzbLtwWrPM%Yk7J%t8B$C^oXcT!>*M2cDG=!(j)T_tw z7cINc+}v%Wt6tAhyHJ@N`PK)mMf?XZ4Z5j|e+pf=1}VaqUQ@u#^_#;eI>Qv)&)H}G zC665WAMfo6D!Q7o|I;y+ypQcdWD*x$()S!b-1_lppM{YfX!IBE(d^zmeBf7lpI3h~ zq-A7MAH!W=rzRGxxXeI(OZ7erh|>Et0zU?gJr;{e>CbfRfBUZ7_4EQ(*g4jEKjo5IAhR8I6VIi z(5Tb*lWioDW2aKUT_%ZO-1yC<%C4GULtyQgfj>RkPM$yim!nw>r!q5ZV5v~BWcE71 zLiR|;I?bhK`1TPWn!+_qO&S_%a#AOxV>6}EnGg@8!_bBf?PpFtEeSlLHweqThEBn)osR<@QOxqAlIqQI%kR|X&>nbvIM7@ogvht&XThJWG6JK5Zj}|~S z5RX3TR4EmoC@j(4)J1h`XTtH!$7v@k+vn|Ygeu1x8e9HwN4O6i>66h*+9YKr!UF{X zSQZQJ1R`fiuToIBdw4OOS>aSJ(WBVCBt)bg<;9`+_&=ci$fHzVtM#3Iw{_+Hf`Sp9 z7qe^-ez5OxIwvXNwjD$cL3^X0K8=Emx0m+l15(BP`*Wp7RXZzgYa~#BM1(x7Eu%++cXgaG zgi@<8*u>a)$c7&#vsF8443O^aPn1&KXxbG*yC~G>tvlHORAvzCWN>5s_cK?nSWEzY z^Z@FlqdaLj7&(VfVo!Ob_ovvyOI~k zYov8eEPea#-Lt6${tA=mbtkO>T*=rH$fpfm=1zZ(7K#!A%@oc*tMnmA&o(@j4S!85 zCPwj5FC92QkGu?-Ufmp<^;a)%j#VTTk<#lRp(A`5^0eFu&2U!k?=AaX{P^L6xDU7< z$1{p|_wL+>8T9(hgz2Vb2S6+uwY9YmM@9zb4o&-!d-xR_Wxgv@+p_!L<}wKRAcbmW z=~9#3_Tv2;*J(pEc5Z83T_L7DhgCt1FWt<8=~|ux%0M&)H_m90UnRwj7e#q3md=+S zEnfWDrAJi30gG{S=Fl&d1DSAEEZ_Y3hb>_R@ZQ#fx~AqAB>fcU_)y5f8}wH}-Bg!} z!^2^!9M*Y&$ov&&qEm1P^|d8EYnoXl_1X0VSaE3ayvPo#*z~h|Kbholja)KBQC#zG z`t%%8>u~lK_Z=*-7>X`l?}yK)pE`cr?c$r78dWW=KOAqo8%P_Ec`0zS2FL%IMm_3N z4hsn+pZQaSdBy)7!g2+NFM0kPr=1r(Jov1q=UWIn=V;87&D%%zY}+SESo{aNUa$rx z00aBHI6I@i%NSjWadDiC9KMpmhA)$6&;G>+FE*e-7AL80$Qlop&U_7`ub90xqx zn*c7lG%KSqjI_>~J!8@bKYn$}K)74_ypX`#;RRX;{ts-~Qd) zlCT<(47Cy(ND?wNtU?(pAyX=mArv8$rqygH8IqwQnaP}~L1m`QWokk)mLVC^|MlJ1 zaUH*XUHAVu?kD$y+k<^x*yioqm z#3j41QUpq?2yGEeyM%AD^0UW8(-CAvX6US~LpguIK@ysdjvb#I2$AtkZrviH2`hcj z41f~blTS)Js;a19!?^?YRdD}M2kHxd13`J}%@{Y#UVbbR^5@{u zOySpdH$Kwya{om+QWn=;5SyGMZ`!~AG6wE)>Gc6u$_^O?dflvyctz^jet(qxb7A#* z&1s+mKu!grT6t;Htk==aR4#0hq0yGn!VyrkFfloFaE;5~>AAs!FHXQ!^dET<0SC(a zrQ5#!BL-?H6VQq^vMwI@_02eHRWPb0&(0oYJ(7&HD8ng~9)P(~z=m7Hz{9%P^aPK5 z>^8=?dxr#7C2CXLqL;K~pZ^>*b7E@_TuFDHG>PrQo=5gHEqW|fm`uyJ^)Dm; z?Jq&Gbe|Q2;-#Lj`}*UDY8XlB(pO_pKDlg6XR}t%p5tRNH8AirmN1-8qGOnJ!WfY| zeT|NwYtyOoB-lvT^g=6dA2d$rMY+Q`kK6+ zlE~{*l!G@%OzhuLOH*_8x3{=M0D^X1ahjN5bq#9rFQd=L>W3T{rD#i4v~0MIO(@-6 zX-bI0SK<)`rMF*M2a4OOqxbp^HEdijERS~92J~UA!K$N68rK%vb_1bhg!lX;_?M+)jiBwPlmn5DHdD`tvk<- zt8iJ;Hcr*GcS&H}I>N=?F2DNg&!8936RYCf9})12zwI+f67|~2 ztME|D+Fwjhm-C%W9vEBFf5iuPIk3Llpe%6UJ1WZ`MiAoYCMe9h2w#N!3OpNztett1 zoIjr2JAF((o`pRO zfMMLNgWQ-BLP^|ZLEe7Pg!-_HHa@e+epebzh73u4`;y_d%B)H*aQ!noi!UktW>d*D z^ruIp!<3Y&r@@6V;T)+>bmrC)DIgR%U9|B(jqbE;-Yz@~3e!dE>L2!I{8h5<8XlE! zma?*zN)w@g%B@M7?$u(oD9?%|aF6Fo)X}#ws8``(6I zS1hur8~=Vd(b9#AK|=}+EOSmJ?NVio_5_`R0QLky+bPR8zTC%%)6lR8=gAhO$-ch5 zUIhYAo;%qE znYel5hqoU-2xhYyQfe}WLQ1}WJ;m-kRnI%(LL+l^i1~7B2b!6UuWpAUTYj%q>|42R zRZ1vE^Z+eq{&(17=$ZNp-VmjW&WtqDzOv#6y<$#ydo3+NtnI^xvCreYbb4yWg`EeE zs0_O_RD%VP^xH!8uAYIZHQt|MDc7udW7(Wj<@rm@rk_>+ag&S;8ux{-n)!w@%1(6t z!Ue&2$wr}VpN7RHb5D`0chIWq&0Xaw-@{u!Nw3h{vB&!z`Ky0?g6~)X24AeDZm+>LIM1v@fp&eo@S1wYdJ81lrK8LW>jeJ=vIqEDygAF z5?Cjmg3TZB@DQ3H{D!U5P_%3lpwN0UX+A5&a=(tdC$Bc(P(pzxgQkuhIy7pm{X4;) zeTeG|si&2{EM|P@6sY;o7+l$;?i>L=d(CE@8?Eo|AU;tlQc=e*Ny*Smf<;BS=hWxw z+*7DAk!wcuF%tF?-OD_7DO>B~s} zj=!`@%b8Aww=_P;RjARjJcvJeuiY=y>*6UhZO0%s>UaP~Lg%`%ZDSNQ5`x4X48wWS z1?!N{!O&`?VYXG5yNrf%7;H3bv4n{IWOO&%U;~XGu;JO~K`_JA^e}=EV~w;mZM#i0#y==hIBySn3{ax&OO4ulKI;pIaUfBpdsL zZonz8G0UcpHnJT(rPr@r8|CeEEw8QFwr6E!vEna{jXejX?%w^92~H@KO6zEQYBDU# zi^7=kt3-z1`jgBAkw-+StA8r%{Q2$0-rqAG8fmN1!<}37>34cP^b5MI)_Mjpn7q5j~E*1H@Udcrm76)KTAK3=372 zc%9ZtW-n#-5D$OV10Vzq+np2N>ypN+QOSRmY<$dhvctC--TVz|!4zqTl@&#}I4Yj0 zCw-X!p@Rj%9^0RlwbW{7-ml%4Ap?R3Q6Fz>%FvKf;sBoJQ1Y^(0k<~CxrYW|49bl_ z(did2u35U&V&k>nZ$qM_g6uJY61_AlK_x~9>O#@4U&P!*DJOc!N|U z{{t>BVH}x@)u5cDAI)oZVd+%S5+zAmQ4O4Bjuh)0@>;WI_*}+dWL_@0@yh8Lvt|*3 zz~K?`)*mg3aWpjP-J3?`67mNDMtHN(aspJKxJ`hu>qWY9b9TnAi_W&!Sy!&OxKpIW z>+alBEPrW85weoJoBp6KaN$BhkrJ%rTZ<{a8P&>8B)F<{-Z#00?tXrIQz&ers@49Y z3?71hhk~+V^CP*r2>t4I?o6{#vs9L*Lm@}YMImMGvdn7d#s!`Ez`SnO;!~=z*+QAw zs4$c1XQ|*k0cXIN3+I@ua#&?AR zWd1e5G`GKwIw%0S7<*W=-eZ)$)g~s2(WV%(3$!#{9VwJJn(JeeRf1anUUoEu5fxLa z-UU#DB`4y)+^vs!iVQU}ESVY_j+@9sroXcnHKQG@-)q#~d%5VFG17^fGEh#Dps?NW z*hYIsTNqO7L?^AiRr}S;`y8EpuRoObcc3CMMDUKX!rT{NDQMLy=0B(0d*5%xfE^A8 zV;{Wl5c3cfW3X3zysxS08nA2fSMqHe{?hky|EOyee+5(EXo}O4nINqf zum19?RgofM%(e>#A8-{*5b)S_3HEnM?XBzA*%atuXo$v~+T`E{*EmQU015Dmsy9O% zT=;-eHT*UlOP zB*RJBzXTzz8w;|D@G$z3&jIRmFoajaN8^6yLM&^9W zX|S(pul3(4DI8g?D036&3OQZ+?zp3JU%YOb0ZcG9PU*IZ!$tca79axJp|?)<${zAr zy~Axw(Lwq9D!XbvnoqQ2AAe;J(5y(rX(FO`HF+~`%2o3tIXOWb6d3Vrn@w_c)qR-y zNjy1DjBH1bK37Q;+!av<`V<+?Wvb!yZYv2yL=TiFA-R3~8jg%fjuJ|KPQh=5@iXH~ z-;!?Gaw;41H7TXNp=BrCl)G2=jsKau>TA}ZyAgNh7Own^+!)&J=u^ZL3R)H1HTbN_ z$yzUW(<}Ln8n~mGQ$gmZ0%ytuIF1q%Dm<}MjNu?o%kj^E^n32yIkHLStTs*W3r~f+ zTB+Mtr;&bcCvvCQT7GVe)G}8CTUVD!lR{7tV<5@=d(}TuTx@jE={B5_wgz5`|17RN zP0_nyLtFi9#+JJ*+; zm5YxDkU0ed+mw{1JA*1%;;kHRN0)WUsD!VSJ|mhB=ZAnl(k|ImK-PIU?vOdrzIQad z|M)Rxx6_%^R=7^SO_slMrF!pxFR?Tla6i+};H!XJC^RZwH^@=*pFgpg6gjuTUu`OT z1e*jJhJ5!C)vbDWX#IFbKx+>>y8=XIAS9=yIvBW&9(@ze1G5|udqvk7Y+rO55_kZN z{Mhkfj_D8TtoFx6-tdX&{ev7XhP z&1KHi|89Q%m~2EjO`Tf);K8XS9hJrI+G_iE?#-*d z)M^8xTJ_EYS)hK;3Mi9p4BGcQ8xbmDuZT6&HRBzIt!Y&Mi)x_9kX_b6Zyx6jwjF>lo%giIMk44+Ku|f(1{n#ZTDhTHMFpI!#YYOYzrH&sXjA zt(C)o{XxwDm{u@rYI^FM_ZCDof#)1m1RfRRy0M0J=IXzh z6jWgPvG9pmN{=<2w`i-)q0*uj!%Hi5@Ukps<5AM8h9G#sFJHa{BhVl5UfjR}I-9$Q z!hz4#w5I>=^P#c0*@g!WqFMI&;Mg=BB7Sxi9@kG#%vL=yhO7@Gf}{{|euig-BfJns z9znF)Z~@Pq8+1>K#P=u>1_AWxvBx8XAa|d<#vF&Fs=4Ipix+L)%_ahM{Scxp_`XU{ zak~>I8$a)D3bnBC2XaqLuSV~4Ra8*;D{j%z(qav`2_D?0`2Lyu_Q6and-iM%GnmM( zNxihyBvm7Vb?(oz)Hed4GQ3(5VAbXAedvG69`}{A=_4q?F16K&_R6kczLd}Ris;$aCJ2?R`WbSIWWpvc837~?$zWZ~wD_p(;?~KPt8nSh% zavVDra+0BSi*0EPg*2P6RH`#MjV0wurMMFp$M&YML1p&sM6a3P0+D#7mL@6-6fwWE;cOUg+8a*Tm8y zBewu3y8*kmi3aYVNbb`h;q6tLQksgp3;Po*07bGt2f#A&2G7)=X<0UJ@#0)K>I`M6 zRbT~DtKdzG)L-A+(bW)@MD5xQ8ZcmeY-|vm70S^lX?V_lPH-T}=q*^>HC<{le=FLvEJw2Px8H)#63ffddu0?cRsZluxWy`Yl<) zZar$rtXe-m<=d{G=h-EVtZX$VY2Qx^;4IVmfLNa4u{uAwS{nlrz;r=&`X*{UkbLy} z_WjKKBBXZGpOxl5*Tt-FL47;Uk^sAmO=h4g)y0eG;(i8O-)PGXhM5MyAfU_kSN)eQ z`$`K2WNd+i?ejGaF&|8w$6|cZPEE~VUnLWwkr1(PGS79T!_zs<4-CMvDd$7Po=enD zIJ?h2(qd{I?ZpU-S*p(ocTyu@li$Fh0|qPytZrTs^VidPX;$okNJ%wfFF_MuY%mS=Yt|^>|>P!HSr&s+<|E2h`f=fk+54l${oNmf z;+fHEXvvtgq4@K9Dd34{pc&#Qb z^fmUZ^D9 zr%n|d6KKh}#!MaAI;9c>V6{~*nCZDP+^cLQ!??ze)7@(_>QIW%?%H)+rij`knGO=P zTG;sX5M@`irWH0#9wJAa>oCvHZ*$71R?mw_K&0|$DG)rB}R-+2s}zz4a05F#%>o)>L`ht*9Hpj5wFQ zxxEU53?%+pL?*s4&u68WD(lN}(fpVroerj^h=V8}W(Z*9no8P5?k!T+Y@ z^-_2&D7#Y((YUm>yJ!!3&P;6}ydyg#oeRKG7PJp_KJxy1z-m}M#JLu^l z$C?0l`M(P<{FgA2qcMe3&n$SvK?#!;q@l$(hu|q}DWh4-I+5Qh2JA%5)Z}DTS`4(+es@=t zN?ly;aWDBlJ5p1rr3dpRJWRbh@p7iw8fBUYxj2>vQ`=3@eyR}{a zBw);3FuUE2Fo#OB(cn&T7bnt&W@VklkrRzm3bjHzRs0}Yw?;3B!RFCvXBN;}P=^+p zhuaEU7CcM=^1iK&?;vy@egJkCsz3#~*b)1t=!+Sed$5}8&?f(YVW(#Nq8P{X_GmKZ zxw&m-0*}}XH$y0ZsT&y5vq>7)V8_t~UF$M@wdLE;8q&3#R`%t~GiNMN8unH1^+T0b z;1F%vwPWjPoTDS+DV<5Su^nlvj!ZviCXoP?W(_iZ1&uo zu&@TMRmCaajSh7(811wP$Y5wLclGe-rlC=Vjye;=8Lw4aEJKRcx6Bv3x%ZX9ML+gP z`QZ-K9haOV%jT~6ag3n|yt?`)o6Gh(%ANVZ#&x37&~$@WOoTJsOFSc`8NfI&H{)vI z?@7xv@x>eSEtNWN=+KMIWEMX?-D>3tVe9s92s*eQKKK#TVh7NYPCY$OPz~cbRwaM~ zetvo;L7IWC9;>qql$ML*?>~R8KF}F2mVPOFY>xh_mAl$zvxdHh-tWs}?UwWjv)P2n z4(~%U%bw;331_MqCX5rtjYHT{ex;s+JZcIjfNUINK3)J}Si6mI3B|91H-K!bVMdJa4`Q+h4UW4rZ6F6In z^=~3oO1JGo#Q-5NZ0+)0yyngoP9%jKw;B#1^tvG1z@)c<7w87G19~>c-FmJ0`kh!x zy6@flHnIflC79o2fs-@MTnHh701huQ=&}1l+E}rw%N^~8DQuNLy&3f#zg>&{Fnq{P z5u=Iz=RdkLocOmdK#OSqjn1D0F zbx&&*0>uh7qke-1%{n!=P4CwrCH$7gZYmpdd<+kdmq>@}J1SWhP`Y;nJhZ{s=hW%b zo0F3{t`$HLsvD!b8NnY0U9+22T70QyT2Nj;CSf~i;p=E0ta1w$Xk z?I;@8)Csf}E*TqLLW|OHvU-ZjZ^&26_$$H)`?mUN)K={u`SDGcYrKSd&I8w93LMbU@``T z2{^p}5TMtsY5p}JHnfEycjh&%&#zj#+IlYmV;06o<9Ef2d2I?e{@_s!D+BQXdYw%@ z^5>pH=o&oy43n!pi)|}}R80fz;2=v*e!v(p?oi**>$#h@Y#F}dLrO%%6{R2Xqi<=t$!Yk>Cu2<{M6fKIa?EPT5CC!XYM+&t_nDRZhfy?ur{;r_ z-*QpX?L$`{1J!rG3;m7aZe4u*g^=F^-v+hSR@s(+v!rCg=+T?DZ6j6c4OoDZtyWWl z?QI=vCmh5P3n(pZ`u6Iywrj8gU6tL8xS+opF@*)oOM85Z(r;J+T9}ifXUoRkqesiB zx9H*k`?-4b#vJ zLHeTBcwz7-KV+b~Jd=Q2<`X*s|qUf^!p5UK2D|GYg}sJKeNp-`eNJCL_TlPtDa=MCXdXS;c;;{ zSa3F*k(0P-lLb93q(guZPH00Ad>;!>4#ve59~qwj)>)#Os}=>T;^y`1BJ{7Adw!GG zUEfnI^4tm2p9VBntIgket@B4>UAK?z{ds3>9W-Z!_& zfOd)mOzX)Z%WmbjcyWi4t5KfInI!!&Ba}FY-?aM-}FJFkN}N3r)^` zERCm6e_vH)m#Sk!`v^iwynsK`T-d6&$rh|EzQN(864X@Hh>`|izrnR-Bw2R zPiifhB2zT&aUI&WLjw0DMr<)~V033{I8KPv&My4n3HWW?k4BCTf3V#Lx9%F83I`Rv z_@012UxA-#DypY1v`$L{vnCRM{><{}Nbj7f{|I@!1B#;3qfadwb4@%`fo1tG-@glM zr!ox!0pxMA^8kDkcGq}@E$m%M5}0B{}vzH z<{UEkI#k`yZPPcgGt}fIm)&(f=oW74PhChEiG&|9K0<6QXW0cF18Z3s!3*HN9%y2C zG7jaFEZt#aca+p3k48I};#0q|soXa$=}3Wa^lxor=FK==V?%y#iOXBHA$h=^6$U$h z42l@JS7=hm5_qcfNXRwhYi=Yrnh^!hN}6}v+kxRBcDz(R2q67ws@cc@<5Nr5jCiB; z^XJRi+<_dxoP00Tu>HofgxkVlt9Fs7@nNZQ8uA(mk2Nd-D7$UWAKWFxA z#j7gcd}ZRI%0IsQ{P0|%aF1@=6&068=rYXW=;?^#>$?obPhLwR*r818N)@hO&W*}U zyBlP-?KcQ86^+1urB-=$=i~km;p>hU(bG~>u(5stkfm?m3Ho9To!1CkB>1MPcK@~C z_fG1FeXdl&(9V+HS zy!cSGDg?(PKjLI7VD9*d?-rrr_z(VT_9P8_+HZ0a;NEF!Ft)y4cAf#^kF z&(xGC+`G5TrTpPTrR}Xj^NEs3vh%!xt@Ge4@%(8t4BtO4D)J$Q!_wvp(OYHidPL3R zwe(u^F{}EM(S`*YGUwT|yJxnJJDeFhnw?Ad^|Wh;E?@2%coR^cGXo*aYw_ao7J6|Y zm9w%v?Z~~LWC_J={#o?v$B^VY!zr=koBB0Q1+*vM+bJY?JIl7H1yMCD@%6ptW0AaR zQb`g3sXU`?x04T?a0bbU^ zK>N_SF7Ow`LDtXTDg!uM4IP?1xq{NjQ|Ha6Pu6p8YF9S^`_#UEjnm@hVsBypdw0zE z{q{qk2RQlp9l;2jo2fcl8Z~~uVo0Hng;zpEORJ7C@5ZIZjNZp1ck=7hRLwv$sOdD1 znX{YIN8}4WregK{=FQRbknDT}Bc-hGy?Lj}``1qk!Vz$f@Md+g`Y=Ip$^xnm3Qvc_ z%7y0QJ{T7zzFn~AK^?{gOogfy7I4neYY?$C6pMW3%xUm**d*4J3L+d5SP@DqL8kmG z!ouWS7eTO$LDH3F)O1eP`SYthf6V4_W&f0oZgdzuLSGyfJ*8sEI8g?X1mqofhiOIZ zXZM^L#~cl*F?tNx787#~xgE%;Zb&oI?VivyudUQ{v9h%kOO&*K+H?`?^sx4XE9e<_ zx7SpU-E-u~2k3O%{uYO|H}^Zx8zND8 z7#2^JKL^Zi#`e+sfap21oEelKcxlhU9Pi&3>Z2p6G!|Orrm{pTKN^4N{!GnTIA)Ln zBM-}_BYOo0*akMS8STE?BXE#1XaiHKs17|>j1V~mPW93m$TWz9RdeHoxeF|?Skr+D z;ooPq&QmCzXDOJ^cicuT&qE^cQuX6{1h~pCBny&m`-R&kCM5+B#8Et=P(cCU)!uWk z`Pdbwy0sjFavI-@+q#U54uwd)KEX)=RPp#T9$DOn_5!7+r@nqA)jGHeNCnjweOP)u zOhjgSvEqnv@=Z^$t>VMcUi2KlvuRe%aCu@Cl=-6!c8?y#{f>}HTAN|kar7dBlg6k{ z8?OnQ36%5HnZN5cB0mAylTp^Pz(9mkzxt+yjGVUd*Zf%;`=24OYS- z%1pMIt@At5Zi2*b;X+1Ymb$_QMUL`uaK_0Uca1*|nKCZME=1EfQ$K@7BP&Z~)(OTY zs&SSDlV-CLP6IVM(>(ukxY(6BrPUp1j`SdK@GY=f z(yX0`nR59(U|(2AY_ntTe(SXdMHGEi(Zc_->I*n%$dY$Y9;t-P_1w z*a|Kna0jQ)G`CKg_iO^M+fea6>_{2_zG&K!_`$6hqJ8}Mk=7C}ZPBaNJ(H(G6`D1x z1^d_Uje^Irbdm;N+Tg~cvN8lBCZPfC>eQQu38`LIN@{X6HmSc18lh_7?ZE2=vax@C zMp(Vp504U4#&1hbPFTPG1(T!zE6YKH?3GS(?Hp3G;Mlk&7eCUf98#apbJo{%r*?I= z7-nUa^3baE{ma}C({4+t< zN8T_yeJBt$`a3x+fOlWe8y6^W~{o&K6xu?p>?gU};i}7PlBdn9XOJzb~Ksw+JN~}|-O=DzB zXX)?#-fn9fsiWp7ur>*b(cKPKkf7w@a9>Cw5^rt~T^#e6nkf@4F%=C!0hNAtg>!*L4 z>^-RqiJjMS_Vj7(G~J@&)yc>^_%1x_7f$XUxkafxMcf6r7Lq!)ddc5@6G|%+>zjR zG9Lyy>xNlbZ@AY%lKw#*odNo5#24Xvg#kuX;=L`sc$Bubm$~8Ye1xlgLI?Zxb8dGKEC~zKd zQP9ZXtzmb^%E)Tq%GuK>?^*^ZB;1)xqZT$?ZnxhbM2=R0Z-8`V7I;7qX1|5)B_eHu zMUG|zpR zPT_O$_GDs@Hb3_onVQ~0g|4m+HHlU?+@h`2ACB?(ns&8P)17w!fo)i~jX8s3+&A)y zi1Y(@3`gI9mVd29aLXKXopop~sYKp;@L(^Z7jQo3-qyLVeWS`BCcxk>8>~7Th(#0; zMg32a^+62k$3=i+ly#}*o`m0jA|5Xwh^Y;6>>{Aw&DcmM8s$HP%Wx1FZ!n6i^k2^3 zB{dD6sc`7WF0n2nr$IL+`nw!-;~BwB^R8~Mq3`4lt*-X#e9KhyB7nIYy2z^+a)O}i z9LvbC+j|dFT+D}=gsK_~PGc{gKK;dSDA%}2(HFDJKTx$^UfVnbPhsC9{nVKwb2k*P zKtVD_eV(IO;342#>Z4;HHV7A8~%U^8SHT=D$g+;_Dc!S8lLN^r|Gi4TCGRPIJ zAIUMg#M(xb6vSsYd#J|SEx9rS22A22?%b!=wryj5z5amKyT)&fi$j{`xv&F{v1CJ+ zt$7N3_A*0<5hGY(w4Y`sbwuaGIz(5ZG^YJd^#L^_H*{%L!QALQcr5vbyW+6#B@i>a zO5J5>D0?QO^@)fPKsNhNOJJ;i=q0{w0}xX-0c4ameTU`ti3cB2rGm!+cG3QT%bq`1 z_p8Ki(xl~xtMK=zk58OFUDWF~q)8Z zVEh3&2oYEQ^O$|ER8(-mKM@Buz;b)CnyGQzx^=R{^7lyPZ5P^M`p#G-&dDR#+J=jp zks;J)X>+|>GT;K4-U2+}qtq+qqe__Q$29Ru$5{h+%>2g4gKl zp5zp3ugBBNb;gs$-qWhsG7Kg3OX7e)T8lIq4Bem5=pbbzQ z-yT^LN*ssTm(i7T@WNG6<+#!z&^*9mu%Gqo);W4jw(X>Kr-rd@w~eZ%)>}ry6ccuA z$BqpQ2#~mH&M+G!k;qG4AzZm^I-kqQ(Gg{;d`54vra+sfJD<1YpCe?T4I}ivWW#Z# z6rH>cd;@IzyBcY;83qUekN-D9BoLp9N+_dH)tbL>Awm{iK0LpjC*p>H<|bcnZL(z= z8(+)}p=|m$=9}UHqIBUVFlk&TA5jJfho~mX+aHF?f5|o&eo4Ak!!dzE5Ck5ouhXs< z9Gzp+&wXNP1)deKKvC6KasYxC_?1`Qb)mK*?B@UKhG6CarM499xZU`AP`j zx${c+>=0lKj(Ia2uN;M=wZR2>s+^TvL>3%BLZab=d>9vVk#dh9PMKJ0U*^|{5^1E^ zV5$O|G7#hWyKg7Ab`5n&y8qEm|_E{;m->X81qJu%K?pu^d7 z7&%h&cPLscM_M;eIZDqVEIN{k7-~3OIm74RsfaS<+m6du(SnykXa2ecibD-inU2o0 z=}m1dB*MrAN3<_|q2!FOEW=@Ta^dRehPs??`X0LCQZm8_;O z1~`lMf)43bDs2sfwk}%{QQc{*WK`84A6eyPSEl0FVUM=#BmX2a13K@q8$w*45A&tsabwu zZdqc}f>?jV-17X~Tw8s)%l&1gfN)in+)s&8Gcljq#b2PanIzR?3}M&wF+*O?goyJ{8vp@jS(Z#xl8X!rxf9S2{J^` z$_(cww#@%&SU{-dv@jZbz&j||JS?DE=}(vH6HauvfUcfhY@M7F59=6VumWFOUk1ju zDfS4pi`#+%unJ(aw-gDn4@oEQ&(GU&Fa<6m=roc;bC2( z70lC6+6c@{*^%;?P~hnR#bC?k&6U0$xxt+zRALta$%)KtNA^rcm1HGmDX~4u>8<3> z%58vfZ-4hXn{`#I2;}u*^=gw&-MW4H_!0Z#se3vpHW#40a?V4o@j0*`tQOA33j!L_ z$j;7k2fF|@pqq4c0#v0lr%oj&B_U5;!u~)*(Ab`+)ByR2rx@t18~N5oe_t~hrYVV& zNYy-U$G|qxko-yD;5var0H8mXX7YADbG!e;(r;LvcC9A-#~el{{Hp%(v968*n5tCJ zbSkRh>2oAvUQ+07^m3=JXZ}$6wP24TW8KK*z9c5b1KEvqpHSrWB(FYyZs%PespR+z zmK>H@Ra|W#OC;ezu&AdBVglJmv+9o*2tgikKjC!$5kId3`-S&L9ZC~Ro4VxXrE+Ga zO#_KbG40s9VxJg-h>M$B(cDuEhj9Q-x5Dz~88h@^z0a)g+ldw-fvsXJ_eH3EsIkWV z+2CojuFK$)uo~{7duvS(YpV#Hg}>>3GPAQWpH`TDj&!C!NjOKo(hHsHZnA>&^bfTim4W9H!Ouu6YCdTomeMpAu2j{DW)W7tQI~*1NAyzx2rciXj; zQA)b@^bjN@>U9_>BmkaILu2De5$a8>3MB4cf9v%X3&y-rpOs_f2CtBnvWVRy_XRJj zYJS|rxBMwwk!-ghVW|J>iAhBQHME%m43J5}d7E z(UT`X$gSBb(2Mh3z30sN&JC{q2~LnbRHdr5fs#VO-{#-2M}%c%PxDGoR*3u#Q~k1O zzj?=wF(2krlQxz7UNY-MxgVmfx3{AzYyJnq7=m$LO;qDm+d|Ona_&dXcl5{+LSA7N zHJ6Uc7*9{nC4Fk%y*reZ)kyBuYIkMY2fWu=-$yhZMvSL93z!L?pR1m2-Nr2ZQRlF- z$QMH$+(zG1rH#~IF`IIf)RwpOwVFqwnSnvXJa;g0x&7uC)5Nvt0UR05H5o9VeOW2; zim3m!=`c)IO2gySp|gOPDSYSvPfEGFyyP_EVAYzfOXM<-qgup?Cl$pmJCUghVXJ6w zJVih!h{hL3$x30(*aj=9Hf^tZwDwoser#9F!)V(Ov~%jCGDakw$8a4%i1(y|$~@j@ z&KX0&2ycU}KASHXB6^Ntn8tSI4=ps2Bjw{i50bOB&!01D zolaFvjh2p%6-2k#wt^0>qv0F+w@RO~f!|b`(mC@CXOy=uc)Olc`PnzQt)}OBsfZBA zSME+*w=%PG28`TZK_A7^^bZ?^j5Zy=BI$MXtDZd@YH9fpwY;7E1seTFbJn`l#_Lo+ zX)$6Pi*dVJ{Fg`>t-E6~%T>`E)Xt7)Lt%WFw@&oo?Nog~0?v?DDH8!1Hywcx@h|k@i><`GRCW1S)E|oLr*H6PyMoGY*q|A!Y`+IwP|E85O z!xrn*&|*bKLVQ=syAB+)`l40u;X%s~#c2BdyC&of$hhIecCjM_1bPi_K!CFgR?a8K=Lslh9m%29vwhyW-?%Jb3UbxoP_+ z>+R( z6Qe2%gT826eK}U{&}x`KpnrM`D_f?*2MRC7=ehRtXKJ0XGqS&P6%4=DFdTFcjc{;q z%rvf=0zFsOXCRxueIjXuH=C^JkAUn>I(Av zut3MaQt8>q8P-vjAGPFX*V0NAMY4uaIS5ty6xjBxP1Bls`3{1BAV0|M??8oH_wQ>q z%C#sxd!MEbByOiVE986oSX0IPoy!9P2(_)&B9V3P#*O)a1$vkLz@?63|Q@@enF zMT?Yor1<;_(;Xy@bu=lwJ#W#XaZi`XJ*$56Ci+=Fb(PsZqk5iu^6f@B#(YELb2 zG42WUztODB+&lsHNl;4j`56B3PB(k(~{X6*X+(n~NBP*(@C z*_4z-y@G}=1gJhiJAaK7)_H6lGcPczgnT)M{&o29%M$x&c7lin9v1@RimU-aY*o?t z`7;|21^KJS;kQSaV62QAr6?PO$1 zub*ZWppa(RPaSO;UWqVs?DLXBgzP{|#XcR61udTs}uHV*ssx-52KXvB7orkVCf<);JWq#tb2qaRu zQuKpNcI~=rL_&w8#vnOX$zLnm{d5Ftf>kb_X|RDu2IY|-kv~n1NI)V70Rk+l^q6Mh zIYfDRE4~0!5NJ<{*Wa>NZnEVUjO5Bu>Dzb-q2GQH>zOW|Ja_KN{reGveJOtkzng=W z0?HXCgg2$*?a5}5Ue7oCi$GPN$DlXU@y~S%wfs-L7Omy9aUURX9B@0t+@C*kmR*3{ zSpk)ja3~o?{bD1Fy~8_?_15k2qsXJlrz)?dpJV8;o@hgolq_IfV4E*pM-oxJCwV}uinY;~L4gJ<(L9#zwaJ++9LZ(jU z95FQJJ;e1}Y)CgO8mzstT7i*1n*&GS9PEFIYa{>jw{AAaJbvQ^o%IxKtmkJ(+Q%Wexj}m4>)mKV}tG z*n2wN3ni86Pc81Q8U9u>Z7{iJK>z+bXo*Ml6-?@z2KRf8l0=PmUzw4jev0$+HFCRu z0?brjd;ngVXlbz8n+xaYDA&@?daY;jI2cD;^0;6>(FYIb!_@9OF0Wp^_|_OOE8 zKJnB`y#I*8@aqd$0Z<}gA+y=z!M-GY)r+L_F~d%Hsb z9yDlWe&kwEd{!J(OTRH&;(}7@->F=5y`>90Ng6)7?4P}I-Cz%1f1rN#Nb`J7c_NWF zDM_;X$=6x=;5ul>uzKI)QyX*j_lqtt2czqy0GSxb2Peo*2Fc%Q`C8c!#0O)xM&0;( zjaC|6RzdvMojZFc`S!{{dt#l3x5bwz7Iuber`w>7OYFg874vGdz zMb}qd-~009oYv7^21&7Z=8oBUR7pWz+z9U`^ZRkWijr~cRGCP^t>lO$9#h;thv;`T zPEewge=$<`B}I_9HuT*?V=Fi<%7YB%{?trcgp6O)JB5O;YghEe^D20Y2sv2{N9uno(lGcRm*TfFgxPu9MD z+f!1+w~}o8*)i;{FDbfu6>HNY@HYiX5zVUoEF8uz7gp9hTH5Nf=M*qWpngxoQcLm= zL%wyPou(hyJ|dM}SX@J@{z}5KD(s#j(rT8r3$||Ir3nvTZJecU8=puhER~O&j+6Y0 z4vzy3$vbgE!((TYc}|XETh_tFmdG(W{6BttNpYU4tHS#VHPKn!p(}cyu+ZOeXQT+W z8!f|x6mtpOZUkW|zaS!16k|< z>j2y4bS8o6&luxyBgInvR7WL`DxEJE_9aTyj5GiJkND8mnM#lIG!Z>6XMuIko@y#) ze6^QdH$nYf$<*Q?nI_8vtVdUYyxtlQ9k7!oA;R+`YTvl>Ea3pXY`E zvraS!S3X_=0Ak3!?yTf4e}1G4FxKB6`lIGkxBvCC^V_EV5ncWm6x-+#m^h(8U(5=w zEX*;GDJj@75)t6}SAe0!0!l76wrJ@XfD7(>Sy^)f11)#1^U{&Vj{dl%Ak*2XIk?-0 zm4km;Z}_I-?LE7qr1ZxCiDYZjM)_3({^wH@evs-kx%oUfbr27FSYfW$rp?T}wZmNs z;z#bKlox0>0<#fL9W$@>BQb=V}u*^5y2u?=jmkywp6@}WI@Q0~~a4MM?)%Q7o`lOI2P$Ubg&8Py06Ns2R9+Y&89 z4`EAwx7G$IdEl^!vBb{mV9_PRwzt&L-d-{Aq<&IjEC6S$c7I+$>B;}gdA4aUoM#zx zBQ$A|x`zq&jUim-tD$O9)l4_pmN*u;m}+3*!UVC2nb}BT<#?LAyS|KY6_62##S`qI zQ6e}Uk;Aq!YLfzGkK36a;X@i6KJ216rT3nf9X7DXHgLyB=722}42a&X0yc}Yvlq3B zx6_wA{z@C5A>PP-xe)2qJe)3t747&kHI8yL1 z>ZtIvJIdgs!D^uhuU@rETTR*ZUHY^%*jkBJ1a0LPE4y@QyB|#s;prAlPQPkmc4q%o!@4Doq7n=1&XGc3!x&-w6YfR*`>87qFh!huhUd$I z0(l8OK7IeH!>qm!y{TGVf=8gL(qwoGb+?%q3mRxn6*K=YC%TvYXwT-M&NF9*Q1vp2 zV;8lWmJc3EbuA^-5o#o8UH$qcecR8Z$$3#su&wTTVr7(g2+P%UTx(Ndc^Vs^U)y}) z;6dZvxiMnAUncX>si~4|u9){WFi?jB%;+MW$862t zfgkmLE1uribsxRWbs#|i*u)&}6zFCmVo}Zs+z3lGxp6wxlrp(~hqP@Y7?N{y! zpXkIsq7-FfUr6&wNo?I++kFR`P{%&g97N^km-RaA1=i&E^3ry(1-eMiIbi^UT2cY_ zBRfXi${5>I@Fu!(gGgLgk!M3EzFClV?tEB)bZ2O^l5oV)U(RE#gX~QySha`d63=*v zu4A z-cV$0TK@D8>U#6_7l?bD{B`1!Yny)!YFh9g$2+B;tt*4S-00Qv(L(=4hMP&=?@t$r z*>S#hc-&)uVxO*2qH<=Zp1qKXHi3wO=|NNki6M$Q@)`Tei{7fr@yuQry z^Oxh4qDPcFIAeeFk5Cq~P?~r)l}xqOz~zVR=onXAO;rt^4J?qF1+vL=$^(Mb9?_)-u9j$~{#A@DMVf-G|U@L`OFu-ghC z^IBNE+v(af*={#Qt$HE!5!+5>g=&-No7kZQd*omGBXR=r03S5iy1V2R>tlqPZkF>( z8D)4(D*2Z;<)4mr^6x{pqF{5-?NCO>y?wg-@GFjTcj0p`__Tb1xjGgJOcAg_t(`4? z#4JcWvbo)@{JG5E+_vPjm`|6+;`Dm!HNNf;&?bEfhbALztvNc1)ZG8`jqdlayAr7U zv%=Qie(#us{dXZY*|#qas+e9jvZ_KRCyp)1bH5*MGu&pmfp?FQ;6#wg&& z4%gDoP7E~|z3*gtx+iP?AKK$4{5baC-^EV8_0L|?2SNge-&*huv-oLKr)IS1|L4nm z8*8r8;Xl9C7v0}$m#ps>n_Szi zwlwmT{O2c&&>ya=o&B${Vwc#h&A%T|gudfO73JRlFF!`r-!<@faV*Iz-}CQpuis*X zrQx`i6CscCj6F4^nXbkoTv{4S{$m=iWS1Cfp=htz!yTO}aZXYs$o%7se`PpG=izRQg+~7X~J$WX(^_y4d&7g0nJl zv{z*>;lCYSFh8R}{l<^~<^rgPrhL@fD*vAklGu&wFkCx+50ihCz|n{x^nv=cdNR1n zcshP=E8WScQG!GZ!~?P(Vc<~2US}ifS-TvU$gKI`t?bj9RQsQQ4&$DVdi&UsE|_U; zMR3nn|E+6BXx)SaXF0wcUF}Dg*ZRs?(3x# z+Gw%o%=mOzsqeqe?rL2l&+pFsXJV|tS@gM~$@)S^J}dK7pk0<+lD2MD=}2*;)4u%x zY;@p-MM>>M8AhXfcMy6i$fe`5Tuipm5d(&_Zr9Ftl3|YEv2+1B&>XZ{hp{0*I3tZ6 z`n$8Rii`)2TnAGXUQ~3#lFQ#8?mo zL4n<*!fJmjasoMLEDBjSZiFWgFJa?$>gTP*Uh9C~;^N)F`Yf`p{qbU@|Gk$l*RoxJ zIz_V5wGZ>>0#u)TsRd^Cs!Xcp7WJxqe_g|spPoMuPCSLX}aI0P4LFH#l zsUS``!25W(P2z2Zy2wPx}9*x6K?C#xxG?!=2DBJgm-vc&F zh12e{W6xwK!%Z9*URRvMm6`^e>8379xK=}36#`nvQTx`|2#RzbH&ea{95y_{^YZd& zXQm&bsAdSwi(-`{xavw27&r*FFo0z$j+mzec4ii{{zIy)EG65#-}R$pBFoI4c$E|3W5;;!Lq@btqr=SAy^y0e|zdJi=cXT9ar%KQA;o+1#iVNsg7LD4EOd->*qGqC&_(qgZUgNqM|maI_vie3$qO3?{k&v{49Q za9$8qiiwIEzV=TJjrA*?_&r3sRuUi#m^@ca*suVcUO0cg-PtZ}Yk|`#9ec`H@-Mq` z1t#05DN_a^*h&j0OT-S6^+em-O^j%uVi6RfaUg<&lQB>xlpMa4qGBZDZp2UyoH?^) zj}e45A|if@d{t(-tPnE{;wZAa22PLNBaI=|qpf};KM!*XQNeL6$ zo#LhNmqd>3w$AB1&`)3HSC);2UWb#!I#B*Wl2<71AHiAs&KYQVBShN=E=o;HOG9Ib z&-dgB`+87K;fe|L>Wdb%r(eM+Q$xx$dfbB##^GV_It6QwVEV&~F3lKB-5Wj@j_4TC zXaT^E647YN?GuC~yLXQipG3Y1z#&R1AIIgB+~n_Vb?+TLv4w77gs2mHz!YjbHhHDM zmePPuZ^?znc3IcqAZ8J#-~qIkDa1jjIsxZ?P7fKt4U1P1R>f)zf)AiC2(JjNn^eb( zKD24Q>p=#5J!E53%)=+$6iE;?t4VkH>OD_a97-S-& z)z{cqBEwlGd&14F5+kEn@s)0wM#(os5=JJRvIVvMIkUDmK`z$SME|E68Lp?Dy}FBf zp`)Ru6a&qjhc4}LGuh`lpCaI$Qz+9S)HNukHzp)d&ig!IE^jq-s10lB$WYQFgV()7 zLI}1#cL}Y`s95^Z2J!!s0jAV zaIJd#77kzqh9hYU=gm{NG-2AbD@(h<2~m+S3$4rKyvf7}=Cku)mcM!Va=#cxS?S}) z_9e*WyGa}k#UH5yof0cd!vg zj5J}-pqm8+(O&Zy6VtMRFd(bUCUipZ{quVDqyH&;8IaH7aE7&qZwy$B4akB8r8|w_ z8_2(ccuYwoO(nJ)$?$ObH_Rs6|9@+};nHLZgjb1-=mW7LefD?}>PRXK&J9br)klGl z1J};$*DZFSr6t1%Sps>p*m6Lkv&3?DR@T7eN0TRD1gvtl6z4|@>9im1OrROF%bhYI4n>L1_)nQI!CNNC?TixlRNqi1`v1qPM+&Byc7qi@$gmy%%gGc z7`MZSF+*l_r$P%7;t}J!OgPHQH2p7<0su7^yvz|?txQ>EykLRim)@yvV}*d`dG5D| zNn*-Ec6Sa|E3E!ODQeiKK_z3?6tg5ur_`l(PSG~}hRc>A_-OQ%aW10z9;O6^2Bf%l z^1TabX->V>yGZe{PxCYZQk1>tf^NSPkTHBJ*<I_|MR&lUieOY7)mS8 zrLh~&W@SAtD_iT;vDg3C{5)A|r(Iy6?Bt$On;vU0dELGDKmuzT-zO1xSVs8-U8bq2 zspo@jA_?S1z)OrPfINavCwm+}GMB8kSL}fi(e&vq?mOL#WrqJ$9zHfT7GF1u6$&bw z4jB`dq+@}b<`nk1G`$thBTK!oX6|xaBmtTyi_N>N~RDsyK{`zWw%Xtcu_~mh904012Z&v>xZGqnsL8mTTS=S9;JFA8-1Jwr4eR6~{iHfpp zr?1aw5#ko^P{Jw3`+%vR0@~lI3g%T%+M+&AT|mY&T#ocHdb!R%wwE+X4mFd<@O?#ikMR_*hu(`_40WQ_eafl>pB z&5)Ep$8oLSPkg%H48b2 zbDeYefnC_7`gp0R71~X9ao3RjUadKAfU>iKyEqz;7$7t6z z&5C;7z2e}Jd$v`-`d9gw*t}@G7ci({BfCB$W?OiC{q4hCGV!QZmHp;Lqw6A$caAu) zW#W)I*^=)=`t}{UC*t_Zw(<2n%Qon{^uB!ZM8qdeabjrMd!M%T?x#FLFDY(r^D>WL z9^E+kn11b;pX&#|Gka6;F2r*-sw)5v5;q&i*wu zDLwQ<#)I7lHZN-ooq24|$M6vObhCk%Ym+W_bE%l(V^xydwtv)&Jo-;q@^4shdArZN zh;`bT=r2)i<^J;hebiTHG!8~F?nrt9!#w?URZ+?R#C;$tXym8y? z)(xY5)xS9#HjHCw8D;F7)!(nd2;#rod-VO1m9&rS>rs&)`1hTRn-K@G?eUl%Ujgr} zt;?C;?CL>aLj&7a#@220Q_<&Rz$ z7hAB9kI(I<26Q2Xx}+K8L7JWPOLaQrhn@ZY;hHr4{;FqS(CGpGkV|RuvB~CRgPrei zPE#wq9Wdx)qVN5%7;}x-L!iM6v0mxBxp@+20{@P2M`m3?lg!Wp2Ms@jT9k%$!cVYw?(sk#8ENzigCNj`yqox6 zu6TUNDR}QYpUzJ1+;mE0%;>vK??#J0=3&&jl1>ARKJCbnyqh$=6ZZ{$P*U>GuL{<7GxTyC@k$yl^V5Q*VGS!17tkcL?RgV+WBX&#Np(Eth% zGV7$09f#Ad%ePZXXzSmz#BzZ825@%42RO%n@nQn+8`wwJez6ew@8`$lg$@@P z=zl*l#k$ea(a{i)T1#~W@B~uhT2`y(G$8tCkMD|=nJ1qwo;?UTM-kk!%8f8jnU%2{ z8vo)`zXxF0!O*);-@b*vW9SwC=Ru_0MXh4M9&#Auh83-1k%UCtW9`pvF)@XD$)oa$ zc0&r-x$``oO-_#g&5dvlr%ao+qU5-G;-fV%(1Q)kBmwYG;mJkIZxQq1vCd?7g}Zgx zk)@sdv%>J@V_0X=^4Rhfd74SB*NI8?d)Ye;Y6RoyXbB;4@V= z+rYEHJhx>#NL%$Mej|Kgao4Vgq2>(L>8G&~s{<9tx4yO-BBdFyRmc&8z>=?ctQL z-qYmkpfqV}4%IsvqWjf9l-SeAtSL0-m~jR@3s*h2t#x(H(#6b`xH&!0q_p8z3SWb^ z=fLdQm!^NKs>;IoEA&%)O`w#*A@iRKtA@@{{6u4<$~621bD;d z%@1Jp$9B~Fz_yvEmkobF8-*LU1PG0Y)ZEn6sR!P_HZNIKIH@3G15gvqB?osOOW8Ty zTuRKbgm*#PlHKp$u&YcV@gzEYFDtM(#U3S^M}G&#m2lW-sR&dE0v}&1ZXDIlvYE00 zeDOCQG&lqvo}j)7ys@3!VPy`qG_Z4R#k;)GAiV)Bh#?YZF?^XH8g$sfpcEQ8d!3DzgoXVnu@okU}O&1oir`TISqt) z9^}m8ebh9irOO!6(hB9R=)z(?b@f4<7K?T6YdvE9fZPQ6BF{AMCf^L#gKj%z&rbb( zCTqOtW|GL+TX-hQ)8rK{))HA!b-sLPhFv!xX34g(Gy7hQP@tD4*ed>WnAe)+{gUcX zD;^NRt}mp?hRT@E7$2USwvPM8O#LW!SD1s`e9OqQ;H5tw4FjYWNT+_CFB$ikuli2yBYkCCf>zFz&kiZ2heDCdCL{9%M@mcnET<~11$ipfvy|HC4`B2b; z;mjck;2bhIhi1{5iE5bjpfWH{;pe)lEP<+-iA2VQ%{IV64yFTj)Sq{&0iNWb7K1$UPV^Jx6RSBjHlE1O;-b*nb-Cl?|%K zY!)qLLykxSkjYQ+CE+;zx>y{!RezYmF=hTzxN?+L>Qeq~T)dNLy~_0R?Pz=WgECz^ z4D&(7-z;!~=1IF6UYD;d6GOeGP9V1E8_eSn7hk;kc|8MhNnXrxQR)_Q` z!jZ!TZiC=phii!}hYP|AKR77Y#zS2|DM(yYk4?@@bGsYqt?c>Xs3so1H$;T_4Lugpy& z4UP5GxfZwnj;mkKM&s$GmaM8-l}`-0*K7$CBvOsn=5&yDb?E)3Ag{8*MfiP z2zMSTOX|<0r$yM zM3nksDJp1I29`f;;gb-hB1VrY>BDj7iGR;+vweBs-uu_AnA>MXbqC}@Df?z+P502C zNyZvy?%MS2yMDs1gaq`FdDn07O8Kh0Uo9W@z8oiGSlu_4T++`-zqgaw5X^^+J}s!B z%OCbOGwbwPa1w?u@H*)4U(L9i{;adb^0GV>=Ik>(Co7IW1i)^2d$U7XDC~hS;)wVS zkm34{dP*}?CB6IggBm$$NY=chk0?^v%rogb_O07L??p4eoI>Y}?tJ9nC#P2OUK0dM~I)nNFaSQjfHJ)S8Wn3NllYqs2?sIRQ||i;-C`#YiiA zSj+t1lX;w^Bf?NG8MAF9bEDZ(((9JN^TO{2L(xzdS_irIE{)21@C20jWd_t zwe@JHwH-Z5hvumq(o|(27;83VT-DvD-+%V_sC1T(}HCO%tp*9pPDeXH+uYN`Ke#O@xa7S ziV6zwcv3&hO3Ij#EDy;yHpBoP$Yf;_`I`5(#`>ybj6pgM|}6z zuW!*blW~yvMRm4ZB~K^oG!NWJQUbd~`stvfB1OZR&iT*nLtUd78AZcJ@`v}jnTZVj zcn8sEraL;`KwC`DaN_cES5Y_K6(+o-BJV06qa73WT0*rsMU_rhA~5#9P^$2j=M+tq z#z|9|4DBAd`htrQC8os)eRU~GpBKG&?%X>~KOb9;WK73NCHM;~#uhk7LR`xU>(nY=irP1bf59N(s%9h z)4^SXslZqv%RBPYE@B@6=-icL7=bT9{_5{#U>V^ zL~uG`Hy*6)5vK&@2E1hLJNjNjIxi@n4pV5cE>JZ zsulY4-8dk2>xR7<8s+d(TLaD`nNgm8CKXO7p}!o#AP~V3zk>c6MsH0= z#l1)AbMfg#Bb80lTU1oUGG;doY(oSN0mTEdedJT(?(dc~k`>u;SBxt#s%Q3t!rBM8 z6B=AWS{B_NsQ|N$1s{q{YwqvCxFuyOo(7CLf!1^LKRCO40!4fK|NdMyA7@_LM{W@% z#7qitst!iVkj-Ac5AEpWE?%}(e3s=u*}IJB8yNe}$LZ@Oy$iEePC#>GBmA$)xJ)tE z=+no31X}LEYuYPn%R?&jqUacDt?4kvr9Giy(6j&+;qJ+rT#h}=;z@QW%@u}UVp`uS=>6sh;O$-ZTVwiWK;=nSAN2LS_)YL$yFv(c65S>Sb?C;H zaBw)LfV^BQy5uHyKVfe08ZR2NQ-*W*hQrNZm?!MT@Xe2AbWWACZ7d$?Sdg?(Sa;LW zx%%trw0R>g))mriK?z`tN4JqZGC(Jj4V;1%EFqI4ffq>Ba++z5`r7|=k=8pk6yi+VX75l{d)EX^$h{k zp@80i=urA>3|vpO0m(25CB7gsvaqt6{N*}F-?IaU@AHQbti|A~of(>DHE59knPSVo zmHF*5&j{OU*#tp@0ke_^gURn4J~=)fY{hHaylF(x-iLSZHvKGd1$t&5S+Gn(W2O+t%6@(e(zhFV_e_P<5R}_4U(A;>4v#*U9?btDPMV-gbl88-SqfsO31tN@5 zh%z)XiaoFxI|6u3DvHs7Ig}9l_UxgIr^51y_`96EZ?WO)g4d#_@xU1RL+0)DG(k{1 zchMrH2MQQxUbyg^cO*2Q0HUm-Vvw;wNes{PCdz-`?QlhS&fWkNhG%A6`OU&U zdVs)yfV_~pGjDwC@3IL4r0CD55|Z06dgBlEjaVC4GlJ!K0DAoQYSPl?HgPLysYjt9 z#Q20wvw3yrs7c|R@;s|q_yXWD>OrRtP456+*iOlC)^zH5cI_73zkl-TReiOy*Bd|R zfi}PoGfBK_AEU&K?8L8f{Z4&HjA$m?QNR<17JMD3Hj6@*hlcPh{a2wySa$|;*aru0 zKxV)fqsw509hItzNQ8`v8!a$&!GD1HurMzFW&IAbBP&)f4f!$y23ww0tRK&lD>gD` z-RF9?d17?68oD*lEO^CnPsrNI!dgojpRH8Q)>3kppcp^D+10jD@vY;idVx+ z=rn2_J9bc2g%FPg)2OD8hbaa^tHXXSt~=JjyH4}Y`z6Ocb-Q;TNq3)pT<+tLkE3og z_9iFf8G_REM=aQWvfysj*|x#1=eA{^!uY44Pd*MYd>#RBp;=7=V#0iznr?5mpRs00~7s*#>V3l zj=*vb-#bpSQ0DQ5HbNh4-)>G_lgrr zIM}}WKZrt#N=gO$R7E028d#E19R{Kfa2#W(`34AlcMCiAnZx+<*?LA5g!2{Jt_a@R^ zN77p&Nv%JvrWYo~%+%KQdi^8X%9K{TF!B_vs4D1)nH~ORDF(H1YA1+Xn5n!3J;qCn z3WL*=Ykyq3bO+TB$owW!?tvArqq=K&UuOugkli~J?@+rA%#Zw^Tg-(k!rCsrR**_N zB{g=0oPaaNTSIe(?Ywizd8k1<1sIbmDZgz#cSV|NF<=1W%GETb!bG^t#g{wf9>9*LinQVwh1x zC#g;-p;A-dK)d;grW7^EhhS@5DozfI{QQdeI##rYZGo_u3N5hjV)wXWktoX zRjWd;A9gW9J|@`1;Ws7ha$cY3rlF~$6Xfd~O!B6%AUdS?yJ|Usd`RXONck1I zu9HucQ=Gx!hh9RZW^HQfVwO~5`3g27%_etE06v)#NseIgor7HhL1@z?-yf+A%(AAU0a=W$Lc2iSE@2AqwjM2 zebPp6OS&G&1e!7y$I`~8FJ~%VA08iOGZQx$UKAgpwz~Qpckba_JQOi>N=njpH27%q z-uF$m$8p#UYAi|gr;Glp{`xV+uC5uuRzukwy`o`3-L89lL_K#K`Sc`b8$27?s$v0kw#izZIg z+Th3sBo%(5Gx}-aJ8~6uJ@`0OqqO?pno0LyDO%s&)_>B;l)0;DI(^4G&HVPIg$oDs zukO#EWEf#Q8_C9j`%=INjvVQY9-ToBK0qM%?1iKX$jZ*9mlry&apMI0UeltP=W-e7 zQW(Y9-J*17ND~zbi1{7i$J3|6_u++Z?KXI{(GGVFFE$q}=cuST1@0{suHO=j(?F2g{}!xVF~|mh7OALwT9RAEwS!A& ztif`@hqqoR?sBhIobo8=AwxgWSbVKbEF^ zUmhGB7au>XSNp8YS2-vU9i?tpR)>TP+;kNXTmHmh+Cb!HeXOl@rW^W&z*VLe<>but z^b|ITlFPs&cHH6E`~_cP$DXhyV)*drm8uOlk%m9oXJyX9)Q;bj{yJ%SdmP_cR1M>I zF^AvcPxSG2y&L{HoY49;QgaLCEkh!vIvqZYhsUO;H^#|n`SF=qqXOouTb{&=0c3z; z5%gRDVm^IdB99H01?f)^WnCEBY5lCAAW?sZ>^};J&tNA(<%hvCr9G&sNKt@F9f1^B zRzc4S-4?nI+jYevAYPxeXH3vDIfwK)gZ8-4`9j7j=oo5t%FTFFT$~O~CX)ascZ!e9 z)=xIuqBSuU9isfX`tPO>-X{TzA6c$mPq=F@u`f&1QVk^C%Z10Bh`PS*SdO>c7W>f`XpZ8C)*v z2wJ_2YBMMIC6`)oKjfml&Ivip4qIdA8PbwvY$q`ep-$^z6Bb-!3DY7$19+zR)9$1n z^Yh{dgXZ!#J$SJBP&x%4D#+UtuxN;Z&;-Cnht8plL3FnAg zBud~F$by`SOe z*EBdJKrFfP-!DlG<3Lfgi~tAs@OXlW|IA;Tu>oNuiEjP4dd9UQ=LUP7IqeieD`T3Kca%h9Iyb4T@XRSy1iDRi(LZ)mfkX#eM5!!Vd%Q? z5EUX}25y0e;D3)v#uq*DS}q?`tuA_c9acZSe=jeIda#vV4|f;^gA|$gxF;CZM51h_ z&g^LgkURj$LCXx)HY3e;?N$@SEO{-h`-5iICbL0 zv@HMj3)(UVn!{y>&SJi8?CaWFMuKGaE3m`Cg9qs+;WX7n>%?NgTYhE5V$>EiHeOaH z<^RSz9s=Hyj)gb1XHPdh(Ig&wZ7s}|_Sbi0~(t^8p=(@juZx6J@;nGl2!Ny+$dhPow19~eV1ZoK2&CtcKSx&kWbB}8)k9(S2 z<0f#6IXcu(t8jd=9)D~wvgq{mAbfHt3b;O`%^61jm?R=)V7*?;S{@U8F47 z1G~JkXMf&(d4&Yp?g}_uXW1S>edc{OU>s{lxtAp4R^7FAoALI=ngISPOop1;+WVpR zIDcGS#H^5R1Q0aB&QuFZMVxq0P_bdE+wJfUy!OmvLPX|~poipXmSt3?e~S=h)*~qAVhi4Im6drD zhroz`y|U&26MmZk0~WHKjE2NHZ4gQWI7wo`4;-26$3RWhb>MfhRdOTLyh=9Gx z$*!*7e>L~tdla!JKay6%ed?jML>^F^i&XYhE249+__`31_4GhJ@0uMAvpGoqM*c$A z2S-%4rm5?jDV^Je9$+U4C!P(h1;2eEi@$uihED+tLGY;x3JRiz9NW0@@=q z{`5XKrU$k)W#oJiI9uRiY#>9IS!jVU5p;-Zma>~vLyE9yk9jozD%(jFYp%p(l~I4wqN|MlvBoy}P&&T^5R36B^qS05V^iHCtLJgj!7j?@ z(ah)1Y$fRFckf>1H+S!EMxeN?J$Nt@KtAWw)qa=HxrYC9o@s8H2OVX(2Mxo0W-F{d zGVf~^k(Bzy+~K$7SlM zr>&Ewo;mY|UlMkHk)@lpysC{Yzrb^RhiN^qQ4s@YAJ;1WF-kFTu}n<$5Uk_Z!JGx@ z<%&U94n%Z#<1}T;9@6Xn6S%PYxVy{yeelwLlsU>(bo}&bYP;HvU8IhMQU#kVulkxF zVNAT`FDbgHTsBo&`N<}X{uF%@50R~;tzHv5R!;T7kl4RZ3vyLyHx$3+edzo;?Dk~U zU&h8Cnf-9NBewtww$*LgWTjvn$)%Dd&^#PJ-3}Tqr?DYTn1he69uw=w&8^aT!1D^z z)^LKhL__Z#c5afaE)#NHDKw5#qsMk`7A)fD)ZBpb1dhO9nYaMx$E3?FsXpwg)y%O8+R-Rul=_IdL#VwhKxns<6RzePBea6-^? z`+pIui3ty@{(O7zda{`?YeCvZy97qF{JVesV#6JGNE@J0*Z^0o3e-_@Tq+%lkeIie zRAS8ro&zd2Ql{`+iU}nLt}QQ(oZUt!! zQ@bCg5oqBUM@KXnC(KN#{8PF`Zd*_@24PS*?zTdEn@{!hw6og`J~Z*4VNK|hX25=MPFJiirN&9d#XMn1Qj~BsTF4S zcNI0HPpa2&${%EBk|?aAwO!96BP4Mo4Yod`C;>?H`o4Ndn2k_0P)7EJ^CT9_UHJl_ zW3iJmLpSyV^d@Sb-33j}%?u=$58cz~>Z_x4`39IXW8bpQ`K6^AZ;wz7F29s`x28US zQ5J8)<t=PWJT%>G>y|A>GEYxWY#myU-y0hGJ`-gT zw~--oW_-U=tmSx1m4Nxn@?1>+TBg2MR zb#?QgIH!zNk&qcUbsA2~zkS3X=09Hbf}O^~K##a8H>Z*5Pi|6kd;Lr&(Vd46x!eot zl}t3%`iCutmj8<5Yut&sZsuESaN=31&6 zhN+09hJ&`zoHOe?b!xWGE!H0y8>iRrv01Q4&~t)|!acV;>N!5IDmc8MYP~>?Gc>d# zK7B2T^_z_(lYrdAI@qvz`^?J5|fiV zx2+3>)^~5HXHXeg&!Q=PS5*&%xG}N>Qewu+;s0o~zr2)+g(f5E*!#NyXBnLc6&Ikr z9!uE1Ec?VLAB7&Z&x=gIb_=%V7uyLG9T_WQ*^~`2!`K)B1D>_Zf`fG|gA!PApWa{m zL?%9j=tbc6&!!lob(sH93i9I{KhoBArm;r!nh&2oH3BjbH$Hv&a_;Nq85KM*`(b`c zq8043@XJ*|C*DGUk8%$;~ABnrvfY9F^v zxm_~10|{CxW$2e+PcV>uA)nPQ%YGjCPcLSC<5-I??`nEV&xU91mC~^W%A(1n|2Dj zx=8s)p0D2M#6HHBFF4px#vT>{ZM-zCll*RmUR0PEonJ#mZJW&SoJXOwCEPHM9WHRO zcF#C|eZ|m4mvN`xvoFzy(L|nG^nk4dI>-#)e!bQuN~_a%X0QuyAO;w zXLR!Ry~}oGOS%Lm5ywzmK6}O)-tvMk{z_l7sQL%EJSXF*Yq9}Owb!npNLaYWTR-FI zoL}_K7szIH|E}&eggO&PA{7Z`YlgY*UU}K5$ZGS_lU?%XsjRZ;(IXkT1eq0tfv=A& zo#Wzmqx>ZqvH9nx!mF|e?`RdMREUNdHCAO$pGI$50;JBdz`_dDn}1(?vvrg2N}5=T zs+6D;lWZrHRBqjc@%wCxov`#W_jOQHLpo$jlgH&_Te6*Dq|<63rkQD1qWo^MjF;L| zsgu4a>NFPX>|P(S8S(3V2*sS%MCU%93-IH~*?%>^X#K~&GBMPMhsT(FuPLp<>zfuCmt?p?4vTtBl!v9D>_0HkaG zV(y)}G-{ktvnCVVXp~njWy2J_(i3-lq`ep$7tBMrjU06R4{btu8vycuGs`?ta<0P7;hNK z=|=jx)|m=gk|U7Pc`KNsyu|Ybz#BLa0`7Ol&~=shK!@mXb($8&`jKUnJL;atMi@XF z%Vx^O`!8P#j4Vd97Oyw6Hub!wj($bCm*M#QhkZ=@@#YWfE;>Y-Vae3n8ylE}(+2CO zPqujKIA%gYm205x#4U7D0{aXw5OKBf{7kGbI9y5r?f9k?{s({ z4b}MZ_ZU6cEvIB+wa1@-|7DQjyMEZlLwQ5v{B+`~uxWEBVNL6CkS)l@oZp$*kLUwJ zh<=RhfKXrEyt%HZ+TIz-`tI6%b)~&e=^G?B5J(=w@>Ma)uW;PCs!SfBqCylvW7y@Z z_N~+9;}02I5yupzMlr^QZT@#H2l_P^H0Utf$FLO$D!&EN%X+%AmxqCq`i&wO;#{xc~=Vm2;_PmGxdomW~ z9b6WKwiy0Us!ZjmLxjrmUIQsG$}SUt6{PyaZzHtju*pD8Y3|sa@@hc_b_W=A;Yq-L zdcjJGHaD!SlfeRy{3$mXr3=e249|MOu@-6uMkkE3q|feHY+~3=IfkJRT7uDA4F+r* zn{rtvR=#--V!8``BUrwLF<_MWeaws{*RAzR&(Zo18G?{9lLt=cckfxiqD2R()aK0j zgGPXMDu2s-Oxl1SY5gw%hWze5wPVN4DqUN9tbW$*spp046%*B0eV4sXi;pu7P3spE zxxDu6a?``!w;q-kz3$#^xua9jMom30aldGdw6Wivqy32bkOuALK@=n66^Q+&4L732I6X#V00tdNQPIe`rvryuw1beBGg# z=^N{5jWv%8gH515$eoc|^p&#&iHjE}C#=~i_p`UDsW2~oxm%7DOU6`iU7wI0-7r_J zP;lLqxnT&dGo&p?FK2Nf4}TS?I(`DKOsL?x?D%*#v+z&2F5=X z)3yJ>OPH(9{;#)7H8m4KS{Nfw9(z*~uD$UoTi_96cWIuATVd=-LbAnKpLm?pl*@MS@Q#v)eD(0Am% z-Md9IrUvW7za~LZZ;S7k|8&CK`l+xYiNxnH+(aH8JeO*#?vRW(zZ}v$7PD2C`g-|i z&){Q+ZO?_TUVQ~;rm(6 zDe8n+O3tj+XFqDIJS^FoEpH@5X;`Kpyf_;FJ4<~(J4~j0rWwFB^0bSb?q(d@pEE6X z*stw9cc7ZUF@jwb8K9hU@?;B;7E(e74-fU81-`Q=z2h>vaT1{wV8GF4`e0X4HQY!T z;#K&z!}VJGw`s^bcbu`wysJ2z3`z`5>V0*F3M7Y|9H#Z%*`x)IKrm#f5^k)xfy42F zi`G-O&@+0iMbDmx2qlLP$4opn3LP`dDbVTl(*sLuOrv&wg(#!2x?N<#kV@U&JMOd_ z-?g!`Lh>W!*|prul*{7%y=k!==StH@wKEY*gXlL#{r%b1B2bLk+UmB}k>Yb3I~nPy zj=I)y)W{BpuILnI@?iPKwA*d*sLs{!o8$z@ST1lW->D ze0IAS={Hd0lVMSmkEGxT4ZVO?pY`%3f(Ih|=)OWskQ}P1uKqhpq*j_3raalpL|-D@sq#fwj5byZjoZuspetRxYez29z^p z>50@-Kc;X%Ymc8jYuhc~L87>;pP^Ql(hmSTgjpoR_MZ>ey1TjQ{BKzXS2p7N>ycph zyZ0g-=6`9=j6GevgT+!(21f=SL{!Ed#zU_VGqOr&gCn+nKDoW`Ms%udu@}J!Skvfr^MhZ#cqm=3={Y%E8+r6Y z0LLGxIHE?M@|pG|St;pWdrdUQ4snxI)Ms>&qG<3f==ygN?e>Zle`uvC9NDE|i9C%Y zPpb_r@YanR6l}bu-}BEX&!J8}hk-QDj0(~@vyZ|j7uw0`(~*?DfH;h%U>~pm>#kTI z0j&d;*M!{`esbq##qIYer??LaS6zpfQo_N55B;+or}PFy0-uBFz(mc5C8ba}2tD(I zg5>f`7^uLYgt0A2^axUfWSFu$g*FY$F6#ok=ajnNlz!BG!oz``K6GDqEv-;e4$%l5 z2XrsB(l5Pa!TQQ`j)Nq-J!Ax)*_<+VO>RNFG}SKd8oANkQ%|DkIViz*tj#GpF&H+Y zR6#?fS*Ed0I?mMRx@>Uws3wDHBN{UJnpD9A?Cuw|qNRr21|mN_1Q@N3w+=fa90LIujO-(t>$> z2K>g@71sO$Xxy;$PyMJT&1^JtZC&3SmCeIt=7fu)))vT zRjR54U{XwMa9>$5u`Bh)1kj9q543c<)p17SDF z`QCG|`$mWa3*pj1H{+_lxw=vqC^CZQAcLgJ_0rtn811qJ_yBgpy7lYXBN#a|1Qr*U z%X!?m?)dGO?!8r0FS#I4tKG83cwY3gAbQmr+A{Fssd>7)OMX`21x4tjEPw2WF~{b6CiE`?9{q zj+#hA&5Yh&Rv6Ge*PD9NNr`PTk-y_Hd*8K-6(&rCRuJ9b%(S=SBBEz=1z>P-Q7fNq zXvku=ni_gwS^#Am!*5-&xpRnBy97Iiy+#L-SFmGXY(0zOcW&P@j#=G4F23cT!sHYhKS5aK`s|h@uR@{r%!()ep1s3zA&lVk7hoJj*02qeK-pR&as1wq;;rRKH(@_ zfnW2h)){J>B$`Mh10#o;nk1^W_)q{GYS$rIl(<7%agU1u+eBEUN)wSMNsk)jC(-W_DO1k%}zMilubi)Xf+}sk_Vi1$hT4x%xX^^_P zQW%M*_iUbwASGR!DE{|fF;cSo_ig>|-3o!GDs&J8{5msqa6ACmjPPTiGiAPC7tY*j z1p+z<)eQKjU0apS#aW|$KN{*i84+ z*8bsU^Kl|5x6$-tc>qWEHRFG8Z!Y&o7P4`N1#YGa7GHwmm(++{j3B%5Y(Ti_PogrB z6C!U5WdRRy6#Tgm>xe3|*m~uu3d53$7gt$#`mIfsp7Oi-u6v73Sgq6L?^K?`yl5^-{%<9Lu7f0zV3JMav4CKA**c@!7im$h^lFtJkf zv6nkw9dZa@f)Oe@hMeiAIcr37mRm#dCQ8+}{)Jeuy6%KT#>;Rtf1%%Ly{-%He?9`4=+yK}|56S?N7M`WVkk4#xJ#X2KPNH~7bXtO zTz~(w+&Y9(j88kC3~K1BQ1k;r1=#}?xB1lbB8erQjMUUUWr8G}xwVD{SajbU1-emm zJYk5)d|i}PSlBJdNhs>SRh%1heo%9s!pS@65{dZGiJ?mhKy;i>OGZ74U4P2cWyAl{ zV37rRj8qzxpG6{(-040RsoTf)Hp~~4z2H0eI;(mdMR&--;HWd$hLY(qd2-w2Q^szN z6a|=P33y5QZ3bh$l}lHwIQBS*SprKh#cIFWUl{{`mY{Fg{d>tA^UwG0#d=3^Dm!eG zMz*odxeC<>ZVqy94*o}Ps^*MyUlR@-SU6{nvU7)|d)-kZV}O|w*lBA~2_W>cWk((d z@gXP^kZ|(Zqqlb{v`~u4f`-(mPul;?oZ>!*TW=`|IuGlO^|K^8+Ap3T>q+S{Am>V_ z557?w(`&k@GRooaY|j==wbSw)9==7RC3sRuQ|STN+Ftj3!hzx0IXPj_$T2N}H@R&1 z0b>L6Se>?Zc_I3r9WG{P57bdhjql&(qh#-lIC0M%!jfab5rK+&)9V6@`xtDpB~wtQ z-_u+tMeRBL!h${P*4^Ydpg3yxV^8HH&@EOg+^2&?1e1D{{OO8^=s-0{C{8O@ShZN% zA9v7bj9zA7yi%|>%wOK2HEdX&GVpQe*+Gn9yT~VEo`w^jrGiVT?%valss&VaL$&smzO$$UA^5qxE zeLuqZEu6EG($Y0;t!t6qGl}48VK8kpaeq1IhQ)5QFvVkdVC+@qcQ9X2F`we zD-=wJ)ESd6E)B<+juya5NgBi@CbsuHVzi~2KG50O*=~UOk@Rg%AF~wid{9=TpY>hV zT2~e0c1=Q^`cQ|yFx<-ebwW&DDYx1WhZenFvMr4v=+@90}ln=wvE={+0hmA*pI+IipJBQ?Keld^)+LzdFU5oXtswBSIg;UMy7Q!DOb1h^YB^TMV3Hi z_px8cwDBCKW+ESy!;*)rP#yVdLW?4JMF&r@7wXBTf?7c&(BqkraOajm`h6o$NErDO*M@z z)rR>JBTo;HCEz#A*Cu;-^t?Mc|MsK(!|Dm>0`8p?(n}h5?>*rZPC%C}LH?-bl2C9D*;7z^t?FdTm@hb6&pB5HN!D$&)w>wg zlZpvSudc2fTzZQV_@L!nbv1MQKK4dC7~$a~g0V3>-KtnU4vHB2WnPYL_E_us#}db(4F5?aYPN=BP;*abn!_no1br@->>-Pmxv z`$;1lm7w9XdM1A_8zF#I;06FoUCznbT~v+BNg=xe5%t4rpv4kv7X}QP12=&lQ?5{C~# zM1>BSfi=ov@;pIvsc$ESA^4 z0w@q-hSe*f07pjwOQX|YcXRH-g$I(7`Zh&FR}r6QLkwoA z=itq6@V`cdo@b?aeu|~;gQriCyM)jdh$Iw|I8W%%@GEXmqVeNdaxRI!)DOHFDqdzX z{8l=4#~x#QKLLqK-nK0S0wMVXduNL&fVH(qBQcM?e0eV>-N%ndO#|UzdA#A5?s=aY zEDe(c_n3-`OZ+Pc`1x3DWPAD2hA)iG_3PI&Js%lu8_Nf_NTjmqX0>R)@A3hRqp$|Z0)e`Ebw92GCr&s#m}Rj81itI&p8ThAx777j8M*v+Bqm_m<@PVD zPo5Bc4Em2<*4|kyeHE*=|7Mt{ECrELnG%|(#?JdM!%^eWg4XC2BRrM^4iZ*gA;?o*}z(CNEpDB1W^bsrKLS8I+#9liM$7 zfCx+tkDrbGez>? z8m#nJ#V&u6%neJZl&?y=7yGV z7?optg?Rk;6*VeczC=~1{1Ar?qke?hfUlwDf`wo z&&$fPSswua$uNu$Mh;I10G4_D{P|vHDY?=#4=Q5X|GWpJ1)cKz( z-*9(m-}CYLId-*gaeXeoDcBfJ3(@akwP?Cj8Xe@=Zfnu3Ec$?nF*_@jMqdNI2mj<< z!OFJ#&})O^p^{Iu69I#U^`c$$mD|xY`BUG#%z z7aPyuP$N#`Y-Y7JZGHpYRl9B?=~$^$;ckt}snI+yI0l9?1;4)i`VpAAb?@Hsk6*r* z;)|CR6^%Ut@)X{v1U%zB@*Txb14yZi`-!>~c@EPx*B25_(DU@5iYD~1gfQ-!VXt0; zDJcP%USD5(<@D)?@W5^>=1ey$?Pa9qs^6&yw+yI1WOaq`aTJM2X9rF>jPIm!7&8Nk z3ajo1a{FK|mXYz9cU1wij16Yu=l{zu0J$11<{ zIha>dKi5+Cb_zZpq8<82PQSH2xNDbSWQC3hfPu<$ENZx~MdqW<} z7aewPiH_)bKAV}9_}gfz8h)a`b(Ayn<2<9(CW%No`x7IX=uxW!8FnnYsMxGD@VlYe zhB+)C=Djf1Jvd?om#fp=OX(RIfPl2abhxVjUX#kS$IfITEFWOneR?|QSICd~P^25PMD3!e;MB9lvy4-nYp=PE+LbfW z!Byn?smLI{>GoCIW^XhSVG-jNZ+P+8=hH$mfJTtr+D&Th=1a*a8$&glV#mZ{>Z}Id@+MnQEEd&7_;<4M(2Y% zi5P`-Q<3?QI2k<zuTVOG~7?07Tlc1CQr4|!49lU zrw*}OTlU66O;{;|X+I6*k|pW^a_f#b$;64yf4zsDJJWudW>^I*da8;I{rhjJCXI0m z|MRs4X*#2_UTFa!HG@6Z*GGW`4->Y7e6r^$gdAMSE z2W`{SLQ83r4-|vwn8+rL14zfgrQz3cc|@N&>crA7u>+f6npw&+My5tNm!N+4?9*pR zrlmK7P@PzMDaO?fHoBi@-0cOwy6pF9MTbXhI?8sNWj>W?dIK2elusIIz$( z@$^lx`SasPmmyXBTXvf96n?5xJq#s#9|X?Q8Cto>&m@r(%{PXDMpLQyXuWpSHle4q z{C9g(*f;#${d`dHcX)LlZTGnfx6}4@t^tF(eY-}}m$21v*;*DY$*%Pqp2;^8dz3DA zd6}#f>u2$cnjMmNw3mXnsn&i^!Y!ScquA`K?dSdhD)Y`)4$j{%zdD1pcA*^;*1=RK z1FVkT%x46*WI_f6dx_pdJ@$p;u|FZ9`03Np#pVUkQEIyM z)(IKC)uD%)AzGyb$@dixoXv-9I(q8V-ziEvMky!UUNCgugTOX?9dg@RuT=UFF#2hz zikG$WC)Din8ypnvBeZU-^kJc*`^=g6Mtyzz zwr9D)_DHuLsTMgAR1P1PUFNL;9{bwQGwvNN*3FA6jj*IA0pz3@XSx)mktt++SVU=O z&YU@VRB22U)f4WiEQ~rZQG5S%x{c@0Rc%$?x^x}>vvs&#PVU-ft-DidUtH|0|Kw1W zg-;kGiqXePx~cI>NzT-S^ukVSt9tRa`kR|yJbzws@joneuN`CI*FkqL&H;wCUuaF* zF6j45Xdp~-Zb|Y&MqcEr2IUzb0&32w^mJqIen3TjjF4zJX>HVp_i36jRQ!M$!H?v& zmZI0M4;E+1W6%ksj5}W{lKYtgG3!;#7$y(&=R96?kS-sC11)p_a-_$5>%`Ixb(L7o zD^2G{tDdqNw5J6G9lafn1bBwzEC1WL=Fr_a?B8UH#vpm@3)1cCu&_ue{8WZ_(2Zz4 z;2+v%u78qpOw7JLnr_yy8_H5{Q3?3Dx;_G(Wl_br-X6di%%}}NUDJ`ujaWqqM@cqk zPTw16p?eD4g@1G5+vNm@E?-VlOMchg%ua;%`-7tg_}z3^qMF{Fz)2@g32?|jDQAIT zr9O0M^sH{y8L8X%y3JBi*+4#IQQ_^rSY!%BMttA=A>FyrFme<>V@d{3>(%6 zmc+kH3xLxIj+y`hhc4;SHc>;Z2nne`GRV8}Jfg651tA-VWyg-L_I9k1p$yEQ3Z$*@ z=QXDo9y{B(7IA*)RE^YHXsHFvG(22jb8jlNdvJ3O_vSkKCvI$AP1pHnjvP_U*tb>B zs?)N62JM;7e!#RGMThZ3b5^>jRJ2Q*iGi2>ul4FnNEVb?;iN@IbwoA4@4~CR#UcQ^ zE@r#C>lXnM*#KoQC1lym_H@HSUyBrv4Y+H`eb|9EkQxBjJt7!uT1pBF+nKB^Tsvgg zFcyJt&djZ}Mvtl}IbWv=f5Qe03Iv8hDGua$H(sL5@b(t1(iF!PeC2w5hZ2KEV-&Fv z3430fiofRfcI4f8yGu(;!9FoqRQ`T%$=bR~dz89(7u$;lxkak5d+#+T_EiE572%31JDHZe72 zHBoPMYgg((#Y^aMqUG-~Yjbky!xlKE4rJdOhX$CKtb)rUymSL}hKQi(_EE_0`pX zI(^oWo094#EZ!qnak2K5(*&+rI1kjeR+Q0-(Jse z?|=8}wf*s|XRT%BzOU=^Ifvssj^k`sn&~wG2<95oc2EnEF-NtuKra@XG^V?t{3Cf7 z{7RZ~bI#e+E}I!;p~mtOnO46iLdOifX$kJyLXGFL`w{pPW!w6){|Jt0MejS7=f=2C zj$S>Y32p3NOYdly^?1RX8^aJh{uGN}MJHNd5;2|u?7P0ErnB()0u!NX zH>t%wA9IAOTs;$auilXzKf+Iia)AS@)r5re{Nrd{^c_lF)LP0T>q2NKn6tAhx@{MI z19xi2^bYpH-g-(;FEOKIDuXMHotwg)nX_h@Hp!##tnBBN;YLuZ|N0fT)O36y+YYo! zHZU~YAQtvm-%wGF0Rz+0)2pUlhdX0GjUb{X_q3>JRM;Wp=z_mqj07)-W_Y)D8hMsr zsKf6)VlYl!=`D)|FS=h=6*1Dk^WecI7aw+n`TKXb{Dr7UXYXx}mwuwPORPjYo+Gpb zUIDj*m&j0s^eI_UvVGrFPTTRyMVFoLx-}Gl2`BFcQZDY)g45x zrxl^NCd}`TX8j90sqX;8*8i-{XvmJEkVB3`4iU^YKoi8nK>4QiY%f;$)zl<9Bxj3F zHP|h)Lm`E1bn*JkxD;}~(SA0rBg2`_axIW204*%8T-?&wZONS_pHYo78(}c-)gfu7|?J(Iy*d zUCF78e&>)JaKf(cOm*n;)`g~U;S-7xuPtn6HVIJ)iGBXu-R}e5jilI0{d7QO@J}`c zJ2*&*=E!Z}Lty2aPyjYPg}xMd86GAZHf-?9I;uY_7Z!H3kzD8KCCWqtDaaY5@0oscAp)2n+dN3GEJD3|cVtf7cZYT}7eS_u=xJ;I(%;yJtUJkI#4=+gG8$hu zew*^zD>6%l*c2h8lUa6_f(dkt(y~q5*@)Ivg^G~SSVt$QPwScmHyjF~jEs6twwKwi zfs4)BzQ|kj99}=pFO((tC)%tpFDsLsaF4nM$^c^u%uu>??W%lhmF%Lga8utfy+U1m z@bF=445~m_pa55wbG|f#caA=UU1~R5+c4&5eDvbSk7J5EN{i{XxY|s{j_%+8;L#(P z90-)B!_CE(toX_zgFXFBH#aECZ5nysA(8qU5c3#E$?cH;@V*IqA1dwGl z6%}Jwxn$?qQKSQbYC<)(BqU^q^E=LYAX|EwVtVJrmOXo>?Y)D9LY;q^U`{rPYHP^1exd;X963U6LAMbOGlJJX9*P`tZuy1RIdcu9CT!RcrE?&|!o!(D0qz+U z^fxjh-N-l^A;-0`f#P}}sYzK`vV#e(QZ@8vLcK%wLfMT1B&CexXH@m@=~LZ>1wlQS zc!y9u5@ne8V7*^CIx@&fJ05oC`&X~D3=G1siA1vmMn~_<2msQbovebFf}!0X*_(@& zFaHU?iF^ou8LY#5Pe120Y0}xOtY)$xCA^NAv!FR#{)`bXW%8gsLuoi^&t<-4V%i0^ zS6pFZV^dgE#2ugusmP8nG;XV>=cMhlpLLm0U3rTOb5+9~<{q6~L&3%k?7;6dFtBB1 z9tJYZ(s>e8RngTUix+pyxeA{Zt|-V;%6hMC=h$t zH=G2dGiAyP=KVZU{QE0dL4GC$o^W)%_bt}#sUPdh7Z88j23r%$EUq@Dp+EmB+b+I3 zTUN^-EI6f65n%BQphf_Up6|$+KzHfP~7mKcjeXpe(ddP$ys#r>zP?@u8 z0KZ1~*8<7=YGv+_-raK{hx+E^iYfA=3>m20Kw`jY@>qNKNLt6%li-?QlF)5C=;|(`eW2}vwMXrBrmU9XCufK?et%U98*Z9zE@EQF z=oG;kU?j0NM~-Ohj=c<{LPm=;hN8Nv`cTHZb|S8Z=e4jhA}c+WD4P2~z0VGB$d6W5 z(Vx6fc+HG#^o==30I35!Vt!BmYh0{pcW7c%j;wKG%=>ox?!z8ut6L*;HO?TzSmpv? z9#CqS#K^9fk|iVew7qpuioP!^B!2Xv^&JP?D=tpD{gyR{SHpg4`~H9nqHKNdhoLMy zTx1+L1FGB^UwMht#HOHCK|$$!MJnaoibQWWN_$EOVZGIgPZCj~>$U zd%4>=jyX(SXS09)W6vcr=EbBMltOYRuMl*`CtHn}9K#5d*)(D_WJXj@B;2^}Q#i+v zO4lSNK7RO+D-g3rXWFzf@+j`3eOM3!hzbt@kW21I7rk^|gOcl}HiMMguYY3~Zuobz z#j+otXBL_xxZT3uDbQpU6$;np?Ta;5si#~739n-A&#B@gat%Kb&)LStFUsnK0_0q# zl5cwIHy8@zI}#&)#ufySoZ#TEy!XBAmNVIiEu2%eY8P#b!Grk$FL-K{^LRy3Btvt0 zNZy0t{G+x^zPHh%k#37WKObnmF`YV#kVvrj4G@ODg31skj=~R(WM@v8pm9V+9u;Me zC7x884=bZGU%gG6&O^g&uIOLv05Q9@;r=jFDYm7)vu5FjN`~0IaihJ-#+(zQ^mY-d z`8SR5w78X2t4T#w6v&v+;p-~|nL%T01v_O%ERG`dU_tOJ5&1&NW$*9;U>jsP`4?#X zq0%RgK1AP0Jk@aYCo+nUh46CWNsx_c+>xfPcBp54#MG&nElln%^oZFl%{?TAv zsM~MR?lKvh1Fej7$QSj}M2?oYb}f#nvMaP~405eCmtEmH6A*c?1T_u>d}YYb)bqn< z0pU-tSKhDW<$Unap;xX-hr3SrI$b@lQUy0bzUB1k`r7}XrD3>Cp2K=Z02Ah7WQC(( zO!aM@ZsVL`4}81S7Mi6%x8uO^N04c0Cm(!hq+X+XL63|nYCxTz)rhD!7jgaL@~}-I z10EVkkVt~)vv7+dNvj`iL%|YG}4TAa~XH0~D zCngu%H5B@hlk5PENYFXC6)#_QHZ;UTz7$J--T;j;Ey`>bmpeF_#zHOru`$+Oa|5%epH_1};mWxF2X6hkcW>Izj#67-EP3ERJw%gZ(5793@py&DQP+jNgV^*0S2 zpqUSn4m?m1JRxkTu%Z`{Q7OL@2_d%0#6)NS5PEZsBhbkiqeku^+kNXG@P7PknYzD+ z?g2(iH3ud{@-$#W1_>-D7Y7uwgUUZt?lzQ?ZQ>3bI)tOa0$6yAP#xe1vhR4 zUwTdkDqdx@yar_kSGu2mFDz${9(Af4Q5tZbvWGG_)v19S2H*h|osLzMSwo`o$X+!Q z=^Wqy)Xp}sEnW*2T&0b~{_hpl9MCNHFX>9GcslGg%6@}Q0QQwh#U&*jaBQWH=J{et zgZ~Vg2;vKjo$jWl6d+rf6u=;3)=2Ej8E>~@9_fHq;s%F-leel*1CyXfj~amuzW?~q zifEFP&0P|nRB&)g==^cx+C1v0e{@+~or0Azk<=3q9@ zY_rO43`#%giztZej+HO6bPoqw{EG1>{?ZDis5X2CzoTB zEyqR&4kR|?Fw{>UN!1@>Agb2rsUg<8uF~aAJ3Gg|@+XCg>uHZaI5%|y>XFQ(`QQt` z`~10u6Jyb%hfYQ*6#<+{u=UGKMnRO;JmWwaNzqgR9xC4#N4^QomM~P;59@5?Yh1XW zvW~n(lmUt(ti76RIL>VIh{bp8pC1^iGEOQO@8j@BC|ppQo(k`{YgY;YMv4S%vu@pf z{rc6%EnVjI0xb!niGfg|*r&l}nPdX%ffDesRjY>X9z(s|Ep|KlcnFV{=l}RE0$7u!CwG!fN6rsfx_X*rHlAGnnrX6EFqWGSx)PZK^4#ipN-x{HCOjP z+6vgpf|8jf&%}6)%3i*B0W)Sh`$Ma%nNTkYk_)fxb?w8^KR+mcIlo*HGAp-{vK$tj z!pQa#KW0Ayr!VXfM~N{YxFV-qaIpH*oXG$de;7I(Y{G-S58u&ob#CN*wJqX5i)Z&! zT&=>%hjmEAJbC)`{kOpsT|KKeDbHKU2Clkm5wDgjzIy}r0t6RHCFborlauKwDW{n3 z07lY0np>|GgBp>VpHVu}&f@!D33KAW0cesG1MCvv31Tc^Hg;#Drs_5Wair-@DgyBG ze*LzLJAx{r@Yb#K=guL{(=cu;7F(`p^t;}vD@c$2#_ijm5^{&- zd+8*eWM=%EgjFE5wFK-w-Sh1oF@(Xgt3c2XELcG2N(rr$ts9p&aQRoHj6Iw&5QeRa zDzFez1r;B)2c_S%o~{IEL@Qt+6g2UbeXNpqZ{92~l}U3wi6ux48l$w9z(SHNDJz0-mjNOBtgHf+9 z^1Ut-Y_l7}xBdCw{DU3NC}Lo!o4T>0B9BJ91?I;8+sr7?Tw{$lax_V(vzL%z>$pg|~~{ zPTs7tfTc*Lb`+7^ZuY2@TmG(I=Zj)NBr@|v zVLtVJ_7^q(E$qI^bI}!KO~vwT-!Qf@UENoX zhmA;9`}YL+9^87-dYNJsV<~G|;?HJriG~gH^t&aN0H;Wg%E>my&yEy7V~H~-+&GNUYvBX&P|^T zBLgMlM)D3w+J?IpVT>EPG}^(mBW2i6SK$=kiDGnF1(qtD3 z$q6IcY1f=YbK>J;lA%6S31VB=DDeqZL+zXQx&?i$8nr)s*)ry3eZ~E?>%M+n(eN&@ z_*EG{m%>g<%h(}WDB*}`_S0wXlSwFue(fqsg@a%-BPSf1=LYehMXwd=cSb_JlgNNi zkGI|Jbq3oAYT|Zbmw7Env@Y&Yc^zlCN<3(R-9T{5RF^Rb*C~lpwV+dl44UawML!Mp z|Jv~QZ$8Tfq@fkrp4H#>?A}c&rm(Ea-th;^Qk?(3{?{C?Co=@iemH;h`Uq= zMMezQP_S=mYQn&#@v`4QgErN_UFw!uj;sz;C?1s3Ww#M`YS+%4QYBS|Q+}>r@F?a8 zsR*hurNLV2s?iNVt@6ER{AI~if5m$?W`7p=c={A#Afz11+LCVePI-`$Dxa$K9h*~H zY6BO~??>*CKm5C#QIecHchr0PwdS83WF#|CbiSLt&;&)Fz3-E;reh-%GsUg4p-v-5 za%u;QC9szxGfSWpecQuJrXm>H3vk`vVS7F0X3SxwcUm<^Mb}G8Ho8e<5d6!!i&Dpn zX1fJ)wj?2&N#t-{M?G!LF3WH`!Kr{|Ao{by*SAY*|8SL@`QN7fE|OXp+>9Dqr&cb% zSb4)uT*ehVp?9Ccb5we-B`qM!QxSXuL{xB4MZdtnv|DXOTUGFa8}#z!~?TL0_~FtY5nQcC?d|usnsJMfC?Pma|8;_j(k{)bJ!@Qo!{G&Z#ccYl4$I00SRrzUBV1 zsL<2&?v$}24j}zi(d@-nx4%Os2b87PRxYg65JTws}%~a?Otd zvIjvLV_Dua)jg(d+5ademY0`DHAB&DUwvnU;b51@Uie`!&8CI~tuhW9A9M=gt5=bt zk2vznVL}MTxge^e!&Oe{_%*2H8fTsIn$Ioa*TiF!87fsSG<@`1)hNsN_0$ zUetE#GLeZUTw!V^EJ+l)t1i`R-%-8t$TD+V@y&Yr1JG)66b(+XyYdo+NQVvMj_9^) zw`AEe2tjn^Y6TZ`8iz|vS9|Mi9W79|diL}^Th`p%>@s6gP|2#LUF}k2OFGA@saNx{ zDQ(G(=>wF%T#OuNrMC`vjY%-Gc0S*lZMrM8tatU=a$ilp(94q9F}wyoEEZujiZO$n zcVGRpx1D5YkwH17deH^HMRpp-(=Q%rk>8JG?EV8HD-)cP{{?;aRjHG1Vpd&Xf2(s-|7~l z62abqkIxC&uiU9*$LK@CNG{{C@OHe__qOdAAnN^v%~!Cz_~uEXKcmBT6!V*zzEC)c zz4y6R!Ka{>qhYd(Z#Se`>YGSWk!l}aYlrbwkY8(>Xh!84B^~^isf3S{L?F**U+(Bg zEpmbJV^$U{WZs;rk7mqL6L&XcCb&Tyq->Wk(n@7wjHI6O=yf+OTI z-+s!+Wh1=xo`Bv?p3JyIae2bNtz%moB4^US5aF@6JWbk_-6XlJ?W$k%&_mi;Zm!w$ zWAXJ}+UL!ktzl~*H5>KHPJ6T)*^%QaRf))ta%80+q6l0N=0Gh2$}W4k4Ba>2fozyl!LrzG#pE?y#hT|9~O}9`3Cz7WD5j zEm|fA)A6x{{0>(E*hKcSo^&TfsTTa|LAcB$GqBE0`X*GYAXAtLUbn2}PecKA`|jP@ zmU_`KBd8+jcUKYV02hXT);y?+L4kSSz8lTQ%Uf?jT!Ywe0SGm~+h)izvEFq5RFR(< zuh37}Sss`4>oa-0unZT!R9L*b?t*nyg68B#J3e~9DJcnQPdUAZ!R!3WFnRg*c0q3= z7MxNJ`=NG0{b*C`i@S>NUu<{l;3QXI(rTtG*LRZS$GJYTCq_NeEo=U;&9mjT!<)c4 zFMib;g+=#j)7EU2Vd_`UFY4=R_U+v=Oe5F6>DjWM$A|pN-1GChX%=h2$5D43M%2^HHuYznP8l?|}+#+=%tEGirWUUA;z3dgcfU9&}Z8 z_yiz=;9gtr8f)8Lb(^u2KHp0-$YwWV11=*K`t=OWPLbD_Li%#ZwODiK(c{O8-A!I+ z;2pbG!#;6F-9NA|O{LP%EuprZ6CGh>-MN1sVqLd@r4{NCv)@KMUe?;?*T>t5AraSi z4=8Qw@z1xnUt7{VewS}}Fjx7N&gp@Ak0!TnRjV6NeztY1a+~iP+Bn9w_PANF{de`v z^Lbt&P5*i5zn_k8>SK7Sb;Z=yp-o@yJFeT-YNWo`pq1rF5rJOH1`&%BKaQ`Qzy0C% zKAR%)KSr$l-6?itk(C{lELO-FG) z(zmyzp88R-^0)9c-70NPkxUOCjulh-GjAlUQZb8+kJ_7-P6WneVrb0L@DJp@loXt8 zR*UH}qn+mD-pIKCX@)gys;<_B2baLWo&FX!BVhIMR>_z)acr4kcx9~L=wPxDD2Yv& zD(#mWscr-ln0PF@Hr8gnyrR(R!J}jLzIgFJdg;>9o^NbU!3gcYmk36gk#FLu-Zx)7 z{NMl6Vj=FB-qP2+d-t78o?(jV`OzkzD*9AamG6@wmOxA@@>-XB{)HcvN%a0GvY_i zX(=iA_zQj?D3xtJ;O9!5F#bK-Mr-|>$=x6S_3e&!lDQJmdX2O>A#Y5227Uq(s2ImG zGq*Y($b>G^ub+{W7Cq+90%A95qR!u;lllMo4fDlszG!C1e%vPu=4@&z>|UUl1)ybg zboBlqprxuR1@}m=xcw84?f2~VbsvSZf?d=CQK`Rll}Ni?e08@_n_PR-wbb^jJYTpr zjm$1eb2IE?QFEY6?FIShaHAHr`?bQ@L2aE+oo476Kf^Wldh2$6^jTvZtM_03bEDEe zAg6h*Oz_+9pI@js+#>>((_~T=0(p~}jbD!<=R&~h)objU2`mj{l*}(9DfXTazA1jJ ztsMn!J~SoO=?P3;NSI;?f5m6#{`-!4dPY);0%+(k0~A&&ZZqQifkPVH1VrcOYe|y! znM)~_@yTRR!_I?L7fgG^5^A()i>RabeU-*XR`xWwiR%I+6}rKgy`xMv(j{m~xcZzT zjwBqE!t>O1f{bF3%&Jqg*wyJfcDVfeRQ)|j?@mruX>U%bfPW?xZ@8(W>I!c?DU|8{_4f_XUpeYx31tA^BRUapm&kdy zq14~4aUJ&MgR zReeX4yABf&*w0qw$2n+>=MVp@fMZ@gbe}-#z2gpkCaz&qa}Qq|rX2Aq>Ho)_;Y1lK zaH0Y=)blvlDMm&$w@c)~op1~sj#~W*h#~>6Fky2 zB*)`5pFVX}AJRqp*o6zaPN%W&jZ*iZ!Zk*l*3CEPx~2M>b3{xSY^kIZFQZQ0o z=clrPNtQ%3ZTfV{nC@HI9_Q-jWV)(q%KYyF>)lD zrlMQ7Bx88ZDQOs1=mx}lyAdPYo--UQQ0n>rxH3)3!a<#Zcn||NXkt*JoRSn&^DH}W zV2@jTv*cWmLF=&Z_XeLhR<*K8M_Y7t8KQC7Ln77q~bXFkn5 zaW!RrUgmx;c?E~INhTt=L0yuPq>Vo|G}MNF{$gfydB5kfil4u4&JO`!3$=6;f)bT9r_fh7y`6;V%t$qdU1(^y9u$Lowezco3pK;H? zLu3}u6ObOUu(7#_q)e2`@C&_yea*7o+kesF|Fu^Dmwn{lf455M$r%Hr#RM=crYp~L zvMBt3)~_(z#4(fcccrlX8lVs>#L%B#XV05w(NxP?7Q9%*5*QGS{PWXdVqeA9Cd?ScP+VS}im2bcGxV&@$Lmp8oGuCqpU+9mf|0cT3%X|j;m^l@0?#Cw| z=l?ScGnERc`1e|sORuyfP}&jKQkt*CLWdJZIb~;LLv_o~r+ecl8o+z+@HTV$Nd*1O z{HdTp8<^zN`cVMF)T#$^gNfK{+8Jq>%K_fds#Pt}PY9~)S(#8VD&hY=mOSfg3L%58 z_Px>6I`Gt~dcVx+$0o1sdhaa>eN!YY=dU~dRaf&@dM+bf3E>NZOkiT%& zs;+}(3sb^7SH2hWy%!uG(Q%Vg5j-9-Ul*|9xBv35z67<`SB(;$ zKuE+ej16v%Tllcg0m_J*e7i+62JI0%w1lB7pQWn&9_~_RlbW4_miY4* zW^W^pJgk?E`S&vk>(ABG-&~_SIK4%Yw@#^xtNcbM)D_;4J8NqES>EyGOQ5&6{ix`B zUY39{FS8>&-Q9a`biy`!#yP(da1@%HTMN8(J%H`NpuIi!GRMiz&W4SN1JLY!dtB4r zvN{qaNY9>aRRu0LYJC<{{b0wHLPOQFq4(@w5cW!8h0GmhG!Q(=!=zkXbqfXee6YrqtfjT|tV z6u3T8m+(v$ma?)Z)rD~_c*p?v8MqH9>m%w!=QF@%MxvuB3$V}sg>_el&EU@vv@|!k z)HpLS+}Ewm`FD(c*W;m+a{Hm{KUJWfkbR#3C?i>;y<~*_N!N!TLY!O`=Qcdve%_!( zfF0+|QCh!C>GO#aKUnHKX8px8GN(gX2M|KOy;TR?+ zu3N{som4UQU!i?IZ@}k`O>t4^+^RWCNLlRaS8yYBkC8^@* z0{w`&|9;Sxo*I0M->qxNHF#t*4fF~;;CO)f+5Uq!|NZTh8WJNHdwI7EE6B--yi!Dd zns}yU*1tc-&j*zTZhFqcVaCTu>a$NN{yU)V7(c5n`;^ST{}Cttp|~_E=06GQf90vw zKM&{r_ffFayE8yzsTW>k|Nh+9=B3N4{m*~%zf#=T)t%h_>o-~M2-N@Ycf_9`_RveY z{eORsce|7Zr~miQw``R^H+_NW7^{~0f2dko>jUwX`LF*;?pTr+a{*Mo4>1lW+ zM*RQfC#&f9|J#T5|N7Cqf1mDAcY5Tp$)me4rP49m{4@KM+Pgp*!}X2_a`&k#<=wec z8!@Bne?8q5KUcKr8SlV~D&y_9+o>w9&c%wqFMjY#mi+N=*Q9OUb}g9*b@g1FD!|3f zS`#qw{uy>?;-~{91W$B*u;N(}Y50=+M}d$4I>`|Zd6 zne+*C%@FLPqFVe0ciwRGeFJ}_q_DKK^e=bPF>utOiA6pcG$xPz`}0v?@qPVz{L6Wk zT%0*WSRp)`ZN~Pa!fpZDbV8OS)ypawY>Swv9^10lLM)=^oH=t(RFv%M+@O$K1Ep0Gaj$Et)r7v z7|eQBBo@93qEV;C`m01R{^_Zoc$lFC@MWq?@rMw89_a!SY4gHEu4y#5>JzUj66nZH z7GK<^PK9+$`LKHR@LAU^!eC4s=~LCOb+^Z@IcH-e-r-lbtaCwd6hpswXd=%53=`gN zb*Cm?B&ag~IPEe2qj!7Xx7dA>p6#hUZ~5XPISU{OQSa;54+<;JxSgOGVwD9=Ke_Vt z>xrJ*w>fo@i;|h11MUG+6KLv7IxCb6+9*rA@cjGsUBsrP0Rvj!2R2z8oM>UIWu^t< zgdeG6%eK5%Jf|25^bKccXV|Jk2mY|wdJ80&pv|8!e}3A9D+pyp3Pv+He8TV9v!`QO zuU6UVC(j>0zV`lmET#U&4;)>d6^^>Xxxn1bY;*2GCDWtVMrjP{Snok8$3On2v4H8* zi%7=<9XfWLF>Tu80iFX?jEYGab_-@%B~vpewjIooGZIIJ#(iN&*<2r=2X&`u@PJQT z(-ghaE~u;b6Lz@SzHO#?7@#X8O3IKv&|_ed`&wo|oKDO+2>4`7j{D=FJbcyI#Oi1NRMF-Z=oA z)0d~@uJWzh80Y(1EveW7l%*s+Kk=AC_~W9Y`2E&0^flPlk8%m*=zRMgv2}F8oU;W! zeedY={U9P_z0sc|Tm3z20L6M#pHsg)`29NuF~O{vcciuL7Bh&>8au50Gp7?TSls8n zUM#oZpzQ5v^&NAH3+q0eK>L2;gn7l$SAo!ZaqAj!$;q0pb{K|5_*WMeDg6wKcX*&T zBCCG7a`Tw(95aeR7OD0bP`+yL(Z|BmoH-Mfl$NB<9uV?d`)#8Sp;S&^=5_D*>AoE! zZ@!5yV7L#7jAt5tTyDZe>{HSnQ;6fxx9)czF2Aem;U81=6K??4Uzp0&M^zzuy#IXt zM5UdILd_1j=gIq=32BeL9_6LTlpHC~+a>d9YAQ?PPrmv1kzFYZuYSXinMR=_4nm8{AzK5G zI~|(%;yPmu{%@CMXF<_vdOob0KXhLNXgY0{cGqt3ZrC`#(aFK$ScxBHs~~0kYFT<_ z_890XFWU=SScD#F6C+naXy$h#=mJy@%xU?g7{!@L>9`I|JXZ5lZtQTR-LxeL$cy&9 z1LD_?uiBh_x3JLdVvuot9@J5o5OjN5r`aN21~)mkSr4~&N?w{2`*Ssn9hpuH0KOPq zgpQL%pc6XZ^~s>M0u#VTY`oMZG_(m5FI;G;axJFttiUc} z5mZZIku?~fGzpdvvW$p7-<~o@&wg>HwQZtf108U?9)HMzogt6p0~Pp+6@z|yg6r`5 zAN+Bq%bStzm8zh&x4hZ^?49o(5!FWzJ0*&JlfU` za5QKF;i-;=dD{z{&>*&p@Q1Jd{pHcIhY<3?1&%F~YYy8odNxmPxwgQ8$Afm3*`m%H zmazw(7p;@M2U;^DXuA(x&~)Me6AC?X%^K1EI!+!=SNqH7KJx!29G>1YN8d3*5x`}; z$uMbWZDuQktXl36vLE9bJpKk>UGgyI?woy)lWFk4AVjGQ!#F^@!5D77>0j4_cZ&1h zj(B)Bhc4U!EGe3zs;NoO9Ev=8VG+p*rW&|}b`0;J6~ltM*-6L#q6Ykkp%c!4jlh_E zu(JHLBQK9j#0B_=dVowbe%ss(H_-DxpD%x5tGl3*ylAc+PdhIxO&Q!lql1+%^LwED z;xwqpCBlC^c@0+;R3K??6bB6B_SJqFFeC&gg{&x0Gn%k=gytfl2+meOZ6(W0BF<0Unr^T@$_Q(G#^xd(=&Fq35qnI=jSJS zmU*fz90dM_00#98fFC)2m-Q#^NR|XEoX-%xI5S=KyV=-;LV*B4-m;!j0Me8-ns6yy8L6&M&wO2Nt~QW4jNOW{CX=K;C%y z2xj6`K|%9>D^t;MV|}|ar(Ma76+YH=d>)#SpLI*S1&}ce*;Kd8PA}qa87I*7{hub zg0metbO^v?M7XH12-^F9&5C{ z(}`KbZP#NF$P>?&bh@Sxd?}2eDN2O{zPk1oG|>JRYiRPX@#@KAk?DXNv8NV2(7U&H z$j3KtR*P#`!U7h;rc<@vFQep@8CP!_Gy2d2I#D|{HZ^}?zp(zm;4Y2lrBa2pt>zfi zP{xZ=5%JvwKEH9}x+Z#ci$p8^Wz}87)pydDZr0gsC2=!(Pi7fm&eQl#4tW0TtzB*#nI0_ zdyUr*pvg)QRpUoQ3gDJJ?P=lEqmeOev(eVoy}%k6ms@NjP-@=qcwqUrnsyTN$#J9$ z{NJR-fIuomqFx`~zkhmoY{%eNP+aX-D{VA{N_~a@(C;c9swd&{)LCx|r0T%0a#?Mu zY%5MY?BMKKGK%9*^;dWSdrzo|ajmRW3P6}4SSvL5D(Lh(MlfI|r2)j)E+ex0=4xE) zReUK>(`q&*YRIb3s^?v)HDMC7cPTE zZ6e71|LNItUD$w#h*mycc)Y8&Y78eU;PuB7nsV{8~M z6?uB5J^mVch0mN5=Yjt`9-`)9}>FS_3|9KT>D3)+S`H&x>vx+tV+->y8i%cOdK=QAP;yzp;V8JIf zk`iSgh;>@4?e5{x89%a$A#7#fG82`el!+f3to+Gba;-JbGCxvPVErzy_LbCm$o%lw zXi4hDWnVh$jX*m1EMt~(MzpXrEjBTko{i%^{1vqy`gV0B4lQg@m?7VCnz0E!jOHjH z50#e@``fgBVtq0AJGG&DVmbxoTAf$qGHItXf-bE5JQUtGHRx`K_lAAJNK2%X%MwKv z5Ui&-&D8`2{grK14oyIHPww;QS6Jjkgj;Yi3^N<&uHw(6=5`l7kaMD%!XbBNff0+~ z+Xe@Hv<+`=`(ctX2A}fHH^^UWo?MJ*9onyiCDg*2YeDIqbRD+7g<4eArB#G$h<-8~ zUy|L?A+35avMw2Qf36rK#}T3rr@~;!M5)xge~*9oRo^1*9X>0**Dgod75t5vsGYJO z8d~;GQ!6@(9M@iBMW@P=70^U@ee%XKo03l0l1cpX z&gnQxjo!>yee*7m%KV!*SHFBfG-0>^Wq$a05~>&Dd-*h1pA4I!Lpwk5#02*o<)ZKm zcD3RzK#baQPd?b=M|tMFheB4a8q8)Kbw_uGg*2sri@b(c<$~DH{R}pY#aU=4FJaT1 zo+_5$#9-08x0x;!Of!eqqy_v!axQW4FHxYcU3>3U5Tl=Gl+cw=ajOa3X3k#J0^fG*ceT9}J-S!e` zDE4Wb5PjLAs=1R|=WRBB9P<+dezvx|O>SsO+G>2~fEul}c=n8kWwGiz>D_pEtdSH! ze+C{F)YJ-!ic!_3uA^nPjvis&9SKo6pOFw$`(YZ_>7`5T{Z|Qt)A^{F4@*SX2mJo? z2be>c9)O?+25P=KvBEU|TKL+81T6`bUdo9Yb^U%Ad^6dBS`uZ4$dn~^$|eE>GvbE@ z6+fFJmE(k}bjy|?R^Wse9u`nQ=pg4a?@j;Vl|v zm$Ye<+{ZD3uwpyCiSmMPM7nf~l!FJW$fnUnZ;;FhxV*e-E<1l|9D0gH3Uc-&u3A59fjccyvXz^sjww@lA=@!-H(YA zWkJ4jwb!p%Lzyh!c$7jodZr+_(JJ7njcMt_j0h=VT<=8;-Xtx;-Whs&Y#c_y+3cvYf^vlQH*-B>+0mW3?nS{bS1-n?osMxQr=daw1tTWxV_e7JA|jERTD}FbBsB zvaJ$>JRn3hS&ZQ)=*FiRbZ1lIqE(rPOd#M~cf4=>eU%X@OtBrJK#bcNhIc|Yu zs-)EyK^VwB>oKD2=u>1~X*RsOYl_+;mys1+HH=j-eMUDqeFveuGK&ab^IYn&2v=^5 zuHUo`>p-qu=*9BqZP$C?2buw3WZssi-j56`8$Sw$i{Z;aC$yAa06H%8}BXI#9e;jG@I4@{Hi%z=Ckc& z)_3?v(3oQ}ihOwccK*F)RmA3%!393`94Rdc6j-5%7>HM8)Hb0HRJsz1yhq{4eN*yUj*%S#4e|X_Q_VO}-XHC_&Z-0=i#$TtlU_<*qeftg! zse@E?pwmPo6nbV`n+qV^m@GPdcIgqhEAc=YCblQojVlR$xpY3u+6F8Dg@$gvn@ky_X@@4T{RHfVP0A0mvI_c;% z>|5r=s)`(CK$;pzS8xs?1Y!2u^*5FjNg7hn1rsU$R0O(d9v*GJk0X=zGxOdaz6nqt zQXi)yDo!AzXxOBqTm;QizN&Vx{h=Jd0{o2-HKg@u06{J4TPal;|Kte~U;SHl@LSc? zlUPv_FtlQaa~rVPR}6rqVWcT|NSD*Hnc>=z>xH5~ievE4FqhT#n_IzmI+pcJtRhho zS%fB}(4Qf)NtB&Y`-HCAMf)OJM)ef+oN>N(%+xny1pSIQtm@FP^Z^(`6Jf^mR+oIj zujfG1rC}<18F(HXTBDi1l;t498#}XR{n~ZD&Bg zE=8XSX<*NLm++a+>{1B}A`N!?n9oAi$SOr&dr#GCj59dSfOenx)G zfs&ky^MkvM2#0Q)ew6NJ_%>^LhZv6)e5U5;^v<@SGMf#`*730`pL7Z6a?%w=)gZ4N z8L7DIibfuW$XHWT^Ll~%v}y6;nkOeac5SYttq>LpX=)yE2w62Wz`CP#fy<-*qCf{x zfARONNl7vZzkR3Wzo}0-5>6_YzI4ZpOU-9X{{}`X;=QCnlPfdDSHzt6B7KGE@?~oa>~vqDk$-_QbAyL;A|;Y!}o!-WI+F^L3(#P*^^hijoqLHpU({_?UNHg)ac~Iwl_u~|IaAr2Y9Zu)t?C;yB z^NxOhc~hH*osy)=r2VZf&D7S!e=IqmJi=1Dq-;y%+xreDT|KixRE!_d&wM?@_%BYk zjKzB4-<>H+oHKoooP_^?m2NR@=Hbh`CiZMk)1qhGZ|*$NjCm!JtUXt1 zVCYyWt`d%eXJ+ zFZQ{~|JgYpuuWE1zoCp1xz5x;-rc8R>*ZqZAX>h1rB0g@%}03vOUpB6jm+zsd&IC^ zyAjf?)rM#3tEx8kZl91_E9}r)L=7Of*NT^WX8%{Rx8F-)ZRn*(8hp;my%zz?YvodH z($~CIU2FIW=)Q8QiH{qm8lt&t+eRzGy?)9Wd~LELmx9T3`y;=8;#NuiSYBM@iV9W@ zt_^U;1fbvwzezIk*8Tf&<*Tf^izn|SB1~%kl=Nc!yms@8H=b*qx}GR62jruw4JRdJ$vE8fZ1a=svlj$*WGe&_|c_RGDj)Jq{ZB_C1($~MBeR9 z@I4Ulogtt2(+H{knu6E7byF$s3icE37#$U$Kk31@!Ix5^wHNxmHlyHFnm62eK+1Z; zbpzilD6RF1{21nE`$u3sZQiib-d?t!sBif26+N5UxBaCyXEQ?i)V?!*_1D+9_!XJ- zl3(8!JW7#IBac7&0BqH1$co9Qo0WH2V^7dhH1f#7gLc2g(}I}RggQ{?tEBw~;t{2S z4or02E0q{Gi3`W9pz>j?%O~wNW(kG%;T1>|hfd4LF3`Q7+Qd_WXe@Q1#K&?2;uPgJ zV z-&NN51XO6Ncn7(u1e$~biRcd{yTkMzQWxG|uHn9F5l<*F)G7 zuck<9OT+OZfnq_FN}dX-c@)2UnvSHis+yYdMSWuy{n!{Vwx5>0YRCzDS>}duQ7Z83rp34^F1IhImmMxQVJ2=GxjhE?Aj~Kihn&h zGTzXw(+Cm1!H`dxct%+LVn4Sx*^N;Z`x~9_4Z)FBb%i&Andv7TMfR_A=#G9hH*fmY zxw*%+4+z(w*#(VAd(3_{Qz`ds+^BgU7(rsLw#ZQ9>8F2Q1=)yF=_zo!tMTx6*aYk+`{f@m zg}y^EvReEs-CKTOrvQq2?@Py`JZ|}9cw7sM7e^1dEz>wLN$SuCNflnK)lW|wcHMO* zF>$Peg9F%rZ?6#|imcS^rOruXloS=q%FBm`et3Vap>;&>?W>ys7@fXW`;lxy1K#0Yx0ffXjpNGE6>l!^q&&mVKJ=&?vE7iMe{~7{9nQArmQ8O z)tMPd^L_f3&IHTq_RbX6A>>X`K5OSzw}04@*=rH1BQHZa_Ht1Kic-n`J9=KzH`#a; zlL{yUc)=u&3hS|TG-h?|oXlGE#xbcpYqisMT7h)uoU@Y*M<3FDK5?~@hCi>=U7<*z ztoY2;krc9OiOCiANdVps6&TaYJ;dMRQ&oIVBO@c6VvHM^O&%3AtKb?)ArcE=_U3aZQjg-L2> zEx7$1+}FI|f4BgvQ%4u}5Z!kWVcWJg_{PQ!8#K>-5<0}`PyG6&&!I9MJ0T-P_H90j zEGOg^Wa_`;B9Io)|Hpc^(U_oBKJX~+3&ez$UV1}^#f~gy8uQC}0cIl$9qKGs? zMP81d46{xW;#B6P`ts(5`AKGO-2!0EanFOY-&OzYFGWDVns1SABG5r%N;5c z*%ul+_NmBNG}%$~4No=qP2-M0lfB?qA}9AtOJbFL0y_@lM+Zh~-YT)CIkA)jAn}&YwSKf(X`%cXv)8;ynqC-UGD_7xp?$B)dt>L<^;1fAX6`;4uIj5-_DiSi zNKVdOrBm4Z*pCZAHi{X;l5>#M{*F&Es_Dvjm=zW{$y9a8MeSk6q&^w#PoeJ_;x7F- zRL_|Qu45oW(GG@mWR0+{c1#%@X``jN6;<>uTK&==*_xrcw2`DE_lY88q6y{~0 zUS1u%@vw_7gAC}~^v^E(Se5JiUe;E(VebACKO?ywc%lU7Z(z|GfSYg^N9>Ds?|uKy zoqkqU+-;-r{$^%omeKU5DhZ-(6WJDul&7sKJ$n%$fFUWvGq_baC?U9xeZ_oO7=r&g z%voZj#t0|inW=@!h4tiyxAP@t$C|TbB^Wf$V<<}tm2%WkE~=7zFG^*k<8tl*WFxN4 zZQnCstt&!9A9bt95p@|nHnOtPORSh*W3+oIu`b|N>KHKO^sDB>h8Yf(x~7F=Xeb}3 zI-{!b$$K>|7B#k2wXYNpa+41Y4aI(gnPLBy#xyVqEI^N7yTUX`!|>Ni1n^{kcoZA& zE6Q!?JkVlrF-eI4ffxF!raIYExEB#rp4_>!ZvT+!1YyS*_HE59c+&t|hjiBR=SKyU zkTRI()XrBIo?&=$nuW>G7q%!KBzZAdGnKB%oWkD7ldijV?{@B~AQ$u?0XweL_d9m( zyhoxg**{{-0U)%#jpJX3iVsaxSzX8$%i!0k{H7Dxg5b4Sxw0*s6WpVythmaQEu0|u z&)Yn?XSTnWC5;QaFi+|A>5+8xYxFkx$hfR56n zy@~Yph`bIdE5%`t?ea|qK`s!@rkP!9ZCSbBll4c}_nzkYm{`elmbD)aPeQ8ug(pHv zHuag_(Z9Y`l~(eE9*F!}BT}AXUIVpVip+3BD4&lrCl!8g^YcJ81~>{zOt5aU?e*iN zld?8R4!yTmTwIjL8lr0(j` z=2~LSY!Z8)iBV?6r!o_GkBAB#cMKa_uziV_ib6DaEphpz>&JKRzE>6LFurFRi!k74 zb2GIT^M>k7}g^J7S=dwwy-D-B4)~xiBv8Sm2AVo58w?;#3xJp4fN>mz=})Q3xwY0#rH6#lTpFt6Xc*RLh@h8^)8|AGr)Z2zux7e5Sn-|pp}yjNmv z_nz$`pna9IkbShabRC>02;hQ#@3NKBm?VXROtz~gvcsb)0;?D@0_LV^U>HH zS?b?iELwBFACCAO9A@=n_YM66qJo*le>VLvyn!;c?N)2?v` zAy^%*U+7Z0?jNj{*!6|xL#($&R zc=qXUX^9vdQOLrJ+iRL90l0e=_ph8YLR9oN*k^o5-tCd24_T39($kA8Dm<6DgtZB3 z>?6#Qx0uqqgC91TyZw!) zpR{HHE6sG)P%UW0@7|#}O1;q0MVwGjcNH@w_(qsPXZsYW@|Ul+6yR9U38qz4b*tmX zowgMQ8GSB&zOxV)z?Q+q{+0PFq)7zp5trdWD{VeN`d^c?f~bHW)yn}3o}4HnEp}`; zJl2WHv_-v<#(}gL>vgVackwFy`F@|gygXyB6XjD?s)7dw>|(~PY+N3{eD~{!ks|sa z^ovlqeUe>!Z`W<#ev_t|8PYXa)afc2^;-kGq}x0~p1`yjT5`mLk%uRDSNSx^*w`D_ zL$UR*QTvP(T+};QIsDK;;~}}iPdGI_vj*oYGEq0}tl{Ssq%JJEI1~%lJKu4RpW$_t zue2c~A=t&>r6m-w3Wg<8o^g_|o>wJ7;4SCvf(G zgh)|JhB^lF&&Xvk72#@VFI)iaM37lFRH za?L-!2>Vfip(W1_aBWC*g25(GG1sy!@>GwN_ zo#l(rw%1>3sm5qH8>q&-rnzRc!hpJxdRBj16tFI^J+_e37|7+DJi3rB>l#0~JAc4o zhDNkGXu*)Oka6riVmFRHlvwg4M<(vi3^s2qo1vb+3(v3EnM=Sq6~_;92x0? zY2EO{aWcW|*(r}>Wk%Q=w zy&>!D&Ee|U39Oq}n=dP@0^YEjYw!ecptfAAmerwb1L_BC%lkgGU zPR~z4Vs5*)>QmC+F5XSN_pn+(Y3F`^;(~pUGD&|+y_>Ca)cs%ybxUrD6Y8*J44D_lTbFDv~CL8T)CP|YfckjAi z6Q6H7EPYh5d$?VU!^(7G_h^&^dQ@R7A9fb3?~oyj-_3?v~?#VHgF~`H_rHS;UK{7UC<-MrNytABn}q z2YLk=5Ka?k>uj6aP7y($(gD@x;=Vue=&~kYt0Ukr`)g18BK>< z7!Z&jM+%qvprhk#O*zpGCm^JJ+HPvoGufcx-#N$}SQ#jR@AC8+9&xa-m>^(4Q=q3V z1R2;n{5R(nd`Mgf4?WO8`>LUFWAlcrENjJ+>HJ&Q}@dMh+bhtdVzu zsh>4VT~J>(HVU3ydk5}}TKW_Wj>4gTNC3HMF~kOoqPW?mnwoG&J(_LD<>?+^AxTNFj8q3E9UKx2Bm5d?_7tdG(YCWw z@BFS!!?N;RtgNbGexirR`f<`11-zw9!?zw{uePr48mgayt+}umft%%&b#HneU(5RE zbAx2gD=M3)!>3Dwt^$uSe2#qf9$tGtSy^(L5yiN{&t$R=o;Fb-fZnj@^gaJ0M|@6y zP4UTKIt# zcZ01PZ;V+EkSBsJB(d}zfHu>mRYpD3qnkN0h=1&JPvX->;#(#djndE{bSMG3muV}m zMNIeOo;*S5t*4gSdaz6I|K+*_0U>@M-1AkpM8a(e40efkLlt4CV%r&t)nzp{KK4mfFYNx)bH_3gi zv*I?p^4{uEhZt>>kMW9IAFfn|T)0rV_O{ga(@Fz*^N49&&-NY*W1%G5F>a_~-=`Wk z@88#cE^gR%tH(1(c@ca4X@5IH#h(VQ>#r94+T_5;suIcTmODk~(B!OCsRksrkHoRP zm(hEolRg6EF||V~V`+(b=>fbTxw^1(teU=q$u(^=1Oc+9#-5tTLbts))@iTualt{2 zlLa0hB3$Z5?(V1$KY7=j;6ku$;DS)&Q3~9GqQ#8j5o|jJiAa@G=8}K85s23D~@Ty;WHGi*m=N<{l%&6H5lEDaLYYROG|G+-CQ@_wl)V zu&s}d#&r>RPe)5@*REaZnVGVE`{ss-YW5IAl&zvHQ#@zHsfwRBxai9cx&>XVk=C3% z86)3TL>NrsNd_cWh|n)a^|1b#Ti~dM8`Q4CcBh&z6+3qdX|r%N;?#UVD*~QrU`}r5a__n7$geL^b}79nSkyG zxpDqBKan&$eAle9Emhcaq(&MitgL<)5B9Z%P6h6Zp?jH|7{8A59UCjPg&0$jTr(SVSle#v(3T5 ztkD+14%jIdfk2;RUHTSkGKt^`Y>EAZ%cAt=yiK}+e>Ok_f}Q~t@HpU-iJF-8phiMnNg3QRw<5`>KU(o#fp(6u&ldTx9G|0}&&&7Z*aj2@eX zP0xrHMg_3vf1>|B7_z?j*QDDY+B8K%HouW7I{^e48!ZmUjSqwxg}d5cZwa0k<(%pH znC)I(G+fI@Y*d?&Lk5=>Vyel|ACZF*Gq6h_NkhriGpthgF&)u==uUz3%ts|QLZKGXFZ&>dB7^xWFr{PM z8a4Tj#@xj)+g8We3Gdl>9zUmVzycm!*|mJaprF)Rntgpe+^ptCsE>E)<17BrAVhDg zl;*GwQ$}H?BVJupxp|0rW}Ovu^(%G#hZG9=Gqj^)jU#hyBP@~X+%;QFe1)Bc_K^KB zoeT{At`&{7sH2#-kre!KR$AiSoi=HUja_j;ATqovHid6Dhueh)&pdi z03vT0OXl8K$dnG8#?QSTmvacco2jw6%^{>uyno(++z@U&Bri;(lSC{wK zx)77%;o+eX1WTJL8fQ@*FdI}Hx7WqDc_^LjeQT(xf4JDz!N=$8r<4m8IT4m)IU8E# zTnkZhFqMJNWV$kvvmXy3LHtAK3X~AS(6r|IQz@0~1x?C^Tq^wR@4^QnmBWXQ&AmvfA9jU0ktO>0KG1EG&hwx_Jt{2d?-As0WI5k ztfQMwnvUr4?!*q~i*&Dea7*=5zP9`pEqGfTEcwkF!^`4P&K?9Ysd>C-`*|Ql+5<~=0^77KJT={Fq zvM?RHEnAdH{;-NldWzTbiQ~r!@0kq&d%%rs=HTcSs9~Q@($rV)sa{r5adZ4-3<8d+ z5e6{B>x}tmpX-6E7l&J-_#;*2M0!U1qRp;l%<;LP0$+gl-*1Vc*B;eKnmc{k!#GVRBztlk>(5g3<$#J+FOh z270-v&Ca|&QF7?M0?-2p7oJ+On{_W1Et>PSygU|xDEES|s7J;pJ|JzUiY%6^m7|_G zw}5<^9%?7t+T%YLU9kAh91or+&lKR4rfw>K+oQXS_Q1GifsZ8=IL0WXQS4!V^Mu-3 zTa(8P;nMis(BN(8q}GF~l%`V{=cA5RP!ON|jbzC21-oADv9}*BT|$-%W;D>E@n&!lTNz0u9kR;J-kg4{&O9p>kw}She{PN{X*gKPgaaN>I-^jD99rfMx%i5xcg@ zw$9?(R^0xU=_NNEg*a7T1DFP%?o!QxE%l4SW(^xW_y_xN|CFAiVtw46P-Irze7ua?jj?eOZ~d85rTC9_QRD5Rp{wy!`KPC5-=K`1$$dgrWN5~$nbd2+ z2NWTG!_O#6_k0><5gviDyuv{5+68u7#$YJ(WK9k5#Mi~=MTeIv+A*|)Ljfg5Ta$7n z@Y1E*``?LIyYS*YRRH#8n^Aa1Dy5Q};pJSVD?4Zx^OkX_kKQKx;aTSF=dz~; zo;7AWPJeJ$qVLtYutqo=ZmFCate`+G^Ug+V?2!%his&Bb!pPLR5i-K_dFRs$d++@Z z7vK(*VIC<|#zJ^th`5rrVUIb~(7BEah~XZx9)^~vvw*Bsm6iLv%%w9BEf&BgRM-7Q za3qCj?%v~u^C!Q4Ra5Lk)Bg#YQK4>!b-!JeT!isUrtqo=mHSxecy$4;==x^@b`(3q zWTm_0;Itp~FgjWZERSOlPe(55qD?P7q#AR;8soq3M>jp@Kvd2BL$p_y4!Oopgxmq- zC!BrM78x_F#(|E5%COxa?%6ZbNA1;87BI0}3^R&dRY51ujL;OzxrY|X^{fKLM)Xif zN$9OimP2#tw4ppMxHfCHvz%Ukxk8r5w!Ss zgY^Y*5Rd|_Fr4EKsQ zFF$-o6aq{&f=ov2sUOJ$aFNteQ^Qw}&!`i?WnonkC&O$v*$Me}TS(P>tfFh^1;$4y zW}#{_RMvrN@=Q2xP=*9ZaHC*|eShVIR|y+lt#fBe5^m{C*$o7zy2yI7g0Uqw-9PtM z(TTI9r*4!v9rR6LS!CEPBJz($kwkivZ=@_3Mdt=NW;4Sz_yynAbHX6Zkg z4KF>7ZVz74Jjc{hK6&8MHS%XC>Mi)I{bH`prk{`PHTUTL_25$Wg)K2UdJD!()6B{E zGVs)#sr}_8Cyhwgj7gQODW5c9f8w8xu9gnhbq<+vR|hFIbw2MtU0UK;vnSK#+`9*r zPSIk%#%ibw{?yeS^72cpKD_FV-^+oa#uVm}A#DeaWeX<9E2^sAU4ARvo1mUvp(LDgI@|Bqk?G=L zt8Lj<3Kv69`Rxj8H$B?g{GS)^+_7n$m($lZX6$;WZJ@2oyu2B}zbQEZzC) zJ(g*HV00=No$)SzDDWuWN$s-Y-j(btmQeKK1O*MCikM^eF2kT5Qx&?*9&tbE+F2f0o?YN$&gY?0o z_LT7I!twtN=a^B;S8wv-@W25;1n)#nzMZSaDyk8MLD`SsQ}XL=ZSTWhNBy&8$tjo< z@89cEanSbDX(nG4hA$d@PY{xjf4aqY@H!I3 z!{grQZ#ZSxzaG?*z)gef?~;~n%9MA8rPbBXsRK~|x-Y?h6oSKJ+f*rXp-A0%UzTzu zab34mG!905QM%I@FrLwmJ7lb8qx6EDXJv!Ldt!s^_F-!hksbY7q+CagGyv(p4ih4i?Z)6+3dq-N$5MM?;*7uau~(*T0@bVyzw#|_D>B+f)kU~hdk&} z2PfaW{qWJF`W3ZTkA`O5CY~~zz>?;$?}s!s3jLCDavb@j5Uq8bmwl*8VykiS_?xTK z%N=n>axn-u^KDj<88-dQqw5B%RT*6+eT|t_{Itrmr+5#G2!dC=CNG%bW5D}R>#VE~ zIs@r0FiuA@KkRM zg^I#~kD!~FU-A4Y;1fmIr9YZ*?M?z>lAG;JRL^wQ(Du9uo%y-A*obj4?&8yAY?#qF zm-q_JO2}_ZIaQ*(B!0~Nke6qTsw^SFosFAlvu&!(8odjZsh=kXWx!$?E)~tqZ(BDd z@qUlRI0;?J2p!aRrha4|PAYY0>QisScm>jDjAn-pik155^{zvoK7FDr3Dw{IZFqOf z%h!_=JC3%CxjJC@_BbHX1@{-^y*RATO ztb4d&2{el6u?L9ex^*w%m8=b>JZzGKb;-T9#7?KPF*JPsZp_;r^E?SISybk=$V*9k zy-!BgFTu4{32@+L#yX)su&gL8m53X@LS#=ETxMt17Z6lWz)JZo;?`z$Wb1s?w8{u%fUNc!p+ zh52X4aKh=@f3>*zkK-c0c?)q}E;G_vZ+$PXVVXbr+^&>OXc|y@X8ZS`{eOV?H(B$D zM&e|6DJmO zj!+VJ|M2K?fOQVFP-lqynM=zTU9s~YHbz<7tikrL_h8o7nsZ7QBkb0NK9MfO{KughFdLMl zZp_9l+3~JAT-q0Xsmg^6)ao~n2sP#^(TW-~b?UjWUrGPYzxnXN$-X_k=&cb4q&}Ri z{Ml=VH<`EuG@}PuxoVX#wfOjv0QPIdIZ+Nje6Z%$hl>{DH_fDbO&M^@a;(}t_iq7X z^gDw&-51Ynde4I-po_19-?2std<3*a{PK51J`?eFW4>x7wAKBc1Wra(NEn7i8Ast?nWWC6p0 z0-K%Y(RC1B1h+Xp{iM8UGqN}Fqr-IU=5f%h zSP{%!aiBJynV6NOB|tqEIj1Rp$B*CKA7qmb?;vm%Z%h_r6&^fqes08)dwC&iN>c~| zQ_jRtDmrDHT{g|i^vfr53#DWApaizr+m^P#_@IT_z&t9e2ZMVtxn)F%C2kasRTvsz zkknp=yR?(7Z+l1xElXBD=5qMo<2rF==5@!o=OEJ@arg3sY1E&y8B%KLwfJzOXkB3( zt{^vL^s~47kiXMaTFWQ7HWxT_c6P3~y)rp$Qcq8-w&xI1MS?3>!k?l8jk;Ltty=Yu z$qLIKxVEXyV4PTUMrG-;Cf|%I@2Dw+!ZBhX{cx*$6$Se!o zaPz?2?Ckzs!&Fp+L_SxI32D8i1l3N9jPFLX3>?WdPnRsbq=Yw!-PP4Szc>_Hi#6;* zlg=b0?Swb!bmTqCi}V}DL8invk9!%rm7O~2j*$5Ic^LB#hAX5fZxjt^Km_T*lBT*Z zcKI=^%j~{c*^uKez(E)AI-2FJ)HkGNq$u;fMHz72gRsgb(jckX%ptMQit5wZ4Hw@VLHcblOr7Mer< zl=7GPEmMYuwxL#xfGM^10n=5JWij5{O-28~A6PHcSK@CELGoQ!?}1wo6c^@|!UuJa zUpn&Fp*+p)D3Q?ux91~r)O8#_-wq47hm%t>i8@P`<%(2{j-}adB@E*$} zB60`87ZciK5Z#2voCTL$r|355D))tIYnE{Ty2h)n(}uy2ui1!R zz{1>InbD5N9xJ+|&f$s9_VZ`4@st|RfXKqm+^4>d+nJTZK5mcSFYajra*5)VFORN< zu+6Qb&zgsuB|~%6sAQ%~%R@Fgov^|7wa&@Ih7SEYfIA7ZWt`+2(Lgl3T-fN+M_$Ay z{`F|_bC*4ww$=B=1kHiE9Z9Nx`c|=2cF-+xzF>>;H8C&iaj$;!#+ty+snpCnLrNy^ z_sj05k-ZF^DOdqf?Yo=)JH_Wohu@l+;4ebOxB z-kmFU4kQyakM;jy`Q<5`u_~z8xIR4^*m+WESgD|(|A?nv2J^E-THg@F5QZP2o z6o$E_OLy9sDy3@GWp2^E2)SjYkvqSox)%WlgX&+52|K9ZwVV=|@(-C3hh6Dy#ope% z;-5divW7@brzNYp%CqmQB)SZ|WyAo8H-r5m33I!_d8$VtdGY>bEex;S%Pe->ve#8s z4+rF4csKh-UX^;gPMqa5#bT#Y{9*62Qt?(qF`lXspcub@*L;q0%iO6h%K{hYDD<3U zF-qZgmBjSRvLn_97VF4J48OVjR_$Xsxk~>J74Bv>yOVh7IM1L_iXLM~Zb6c20bNex zalf@107o)Yrd9qREQ3;F(FL6}yUS=AMCWqw9r5UP&+Ha8sa)J!`@BK6wKajBukO!9 zLb&4@;B$RQt7jEhuUh2_N=4}bp0N8x?KC|-6EhuM_08LV!Gq?}R9hs(#t!^`KGz#B z09YIx2AIT_>q^+pknVEw#MLOjSWQFYd)$xEs>q6g>ONYXGLP1I#rZ%$c$1kqRY``< z6_7%O#^a$3^PVro!P!65+7f^fA)q$ze%j{^8+4)EKT9H`EhLtlTw+NbYrw08ZK zcrtogByp*Y`gb`mtF5ZnY1`xzc~j^{W6xu{M|(>nHlX#&;lpmMl{?9CN*aNs=LWv3+NnufKK=-$Gp zrR&JTzJI^J`_ibT^l$#f*MDfqNDMpcBi}qMvapbUl8@<`HF=J-K)A6OVxzQ?s@X?A ze`g4h$pap#bu@q8*{&t2KuC>_ki)jD*v;p6Wh#51=7)hUC^5nN%#Y<_+!D ztCw@I?eP7X8%SUKoi^B7Uc{hwIXyLRWI+d%fWzS)4R5D43c*yik{{^CU8B*GF#_@l zgr}7C5O;7uZVewO%E%M5f;KONw&1IJE$AgF?5Ua0RHr!4!_h=PV94OXy&CFUq}5S# zfvl7djr<%5RqXa3qduo*)bAN}S#JGee(eU2_spom6%W8@sZ53&0HBf*nXQZoxQ|Jn zvL6M$ZZ~6MP6s{4u!wvH!#`j4)D?o}ZZ?q{a)4U#+42l6i#c;7x1EpOTeW=EK}KcH zI#j$b@9uIW_|)XWUhD}nA+-6Xt#6TtOCu#Sgg)13(?T_EZ4&!>cHtHxxi}rBZoYlbRIO;SA?kJnRAhZ2 zeD7fC@o86fB;8f5a+-c~^p5;!&yO!kK1lcJV{Tz#=dleB7MX811|CBuAU%8NOxH6( z((t9_gZ=$2@8!+zT~l5z7`ZglCaA7&^9e-3vU?Wh`6g;jJ3ZP}X3Xpk+_dM|+6Haq z<648x2F=RSX{&zlE`RdKRIRM`Sd@96MsS0{OQmhEix7o>4R%GQ;paJ$TkiFnHxtk_ z_?v444IDhU;pn{lXIj&zD<7HnMC$UQ$J|w-bffOp#m%EL>|)UJ1k39%y>tanl7Hb< zjrrEb-RtiwEx+c*f~wpgmqDR+`ts$sT`TineSG&0X8(z>V_d)0>BdHtf5Zl*YRNyh zS*$A|{}7XnYeQbuO6yLhcd~iWk2~SBv^wRs;OGbhK`P9IKl7vmPM-ANL+Lg_;vx0& zBD*6JBkX+wfxrO9@GRyEPDz&)rBi4ZM6Fn}#*iLJBzSe!z$0I(2{nr0udMHoXR0?o zY}q{514~How+j}{*=EC&`|rDaR!9Jpl(53?691Qb%WnaYmqR5j#?6;n7EIUPYl1kEN)W#M*5>OjfbrF}b3O<91fn}Rn)Z#q@zisA zWK9uCTw4tnU!JZvW5#ME^9gP$>$a`eyxpKAzEUQY9Fkm zQ8Kddm9vU{w+v7(!(76;88|@=dnuiY1ACh7mxF1v;;AM8*MR^^jrsS)( z-JctAO12ADnLw{4B?w)4&lz7UebXd|d$&tQH@eQ$^@L!^y}~x4a#!1KJ7=o?Ld~!LZZlU6^ALJvQ*>hCP7?+>P4Q$AIHeb&D zPvQPurq`{q|LD$|weHUHybm9eN195Ew%%M_dl?Kn3bNELWdl{=e;j(yp zly;)GI;({)fGPng9BAB?+pk9Z`Lnx)rHTuQHB?`Xd`c&X*zzHQy!WDRM_B&?r$ z85{2;iArM?vs@W5Zs@fY%(Z7^_KJvy523tWuaklpheq$xrJ?!)F`_!=^mhfHKt>wa zA0r<;zkQ*!%l8WoSh~z#%%|#ix1D`Udr7BEu|Djlx|x0!?UIa z@cnGJHD}65pJT&~x`5IMPJ+6_Rqb=~`t}86kjcis<^PrnCgTS(`J0$^8 za(;U~oQL>JQp*nWu~;V@{QJ5f>@*p0SzZ*f-fx;~@?rU9IMg_Z339D|Y{i4r&x8*4Kzr89mg1 zq{f9-mlrYP?wRTUNFmq&VxKF_CTHxEStKhhedV6f9Y-M7lv8v^$s4>5M=>FGA)_r z>%r^1ew8TsRaR8w6YqGi8mB7CG=Ld&x~vAfESP0N-ITw0=^ zY__V<{?F#$CfVH?W5RZ|r7ZNa_a%HX$v}3AxB z=R3o$zU-f5b?bw*N2lH}gUYX8jr~0m!448%Rt!Akd$%?I8;cnv@ViVjHldK?2hTK{ zFer6X6tzszy^y2i{T_NXJ%l6?xaqCKOem@W_DU`ZGNnC!pS5Ii!7W)snP*-gt7ASH zy73fOa&Lzz%A$1Ief=JaN!E=HH16E)*E=(o5>cjmz5rv8C2Q8aS^R+s$(aX1!At?b zf?N0g!H;XY^=Up5X!qmc{gHC|SwOnD2mn#S=l={>isERKN2-xF+ ztKmNIIQ0i-<>oe2Muyc-3!?sPtFrEXRoSm<1;@XuOp$YGzeVfb7Zqg|57VP*S=)+V ztM|Ey>OT9@zQi9GyzZQkm}HTP<4mg4ipc}&5$KMnTa953L+;4kj;pADcUMo)A*d5f~3Rqk8!`eC`8_UR4 zd4*S>J_*L4)k{(8w3Gsu1F+4CJ1z(yDcyAO8Gm1XG1?4z4*JW&9t>* zVsb(AO-+{m=orfFRP$Mp90#Ubmjb2)X)K)X z)}}jVgLZ&C!obwZtPM&x$lSvfq(i$EcKi&Sq^;d{PYp1Q!9{XW@MowGaMUX#?k&|+ zm!B*zoi8c)LE7q$_{;^}+W!Zq)8vE}ubJaiahp139Sxs8An~!^vuEx24K7S|a3fOt z#J&zomaV;i9q3TFlQZ2~MKUKFc77KVt1KBJvP}N1jQQ^UsZ}`Tx;(f_ltd|0VY&(F zS$l3+MH%j^R&uDE$^3KitX3cE1l_4q>+`6_jtRyB5u^XM_7)p-`?yF>6fi(h5d`T) z_rNF4nFmaMwC5grHXq@^s#;-TuMjVw6Y}sb9WrHO-D_7rTa4h7qLd)}37|~1YJ@wZ z$DWIIx?`am9N_sGeAvrr#9Pi4>zS&2*2Rd5FXCP}%#^&uuC(IEcHk)N?eA-nxK^&T zA9-6`?7&zvjyMGl&$y4{BWS@uUn8%Y(*(2^a`)!#+kN+b!eDVa7-*Lc zN+isjVAMnayEV^(7jxp+v9ia>(&|#)CEVoD)#M#jVFb}ehq?Y7*R@LFze<_F56U&P z5e)gj$&nUAtgJJ7#Qp#$p(yhtTJOsj1SXH2Dy@Q^tzn?S`y$9wQ?bwa+sgPRC@TJI zE!lu4BQOpg;4H4HlgAatMr5BSc@T~h9OT?ww4xB52M-*Wwr;8L;g0pAKi)TgWKf0x zMy*{t@zgxtui?y@3|$!47gXJ2fC1)tYM!obiVqifbHZB}>SuHFBTF?|ZV&I@AHs<8 z)~zbKl9uryT(&>He}_bHByIi5J$VHMLYUp9!tv7TuJK*MtKU(`=mR59AS>1pnwJjE z!G}+tS)_A;3|fm0-RZTQJ#}_58~CWTdUy58ofDE%C(5k13@tyAi54mf$B0D zvQfV0?*x&~OG_KAtNXsJZ_XGczl?Y9aATitc%6*}P4K(nb=p$DnS%GykvyzOcy%U@ zg|*`d_MCxop!4HQ@G3YUA$(xWS*bj6GpKo7G$2(Aqn)TVkjGFMQvU({fR4h} zm}_bpy~2=s170Uh{@$fa71z4>%jaZe1)e%ZsQjd$44BoB#*ty@VMpKfn!%$>>5G2O zcc?B=ff2jH)JZ_BBQMW#TZO^K1T`f;6yUD3M(tZV9nI;WAIaQ`OZA<@-x{7t0nZ1? zh>&OU;Hdhkd1o$M_?s!*r%ziTB9@oyLA~Syp7mydTisU^O!b)J{XRPIx|Iu$vO>}K zWezU@JNM4V!RJgz%wM>0BKGb(cls;8MjJ}GmjAe3s0~_MdAQZv=MM2hMal#aM3JWt z=FD)M`}|w=7-^gMP~zG1mpU=tVA3YAv63##9;=w*c#dty;^DHOpr=rFK0j=U#|1`Q z05t%W0v=rBj#ch@voFBUc=IsH4t4$(0IS&bd1T}dUH}7Ig@9|w1!;!yHxk~Ij=lNh zkmBrn7lMO-(8a_AvvWpkYxkc-eD6l^VD9ac?9xQx%w%#z$?K|NXlSUh=#unjgWpDv z2n-%Qx|~v<5JuoRBudPOIuepzl4B$|>4|%);g~*YB-4-6=gv_d+Sh*+Caqjup*r?` z+CPl_?<+bsmM8GjzH&!^>FEm>3b52+FixmMQQoJmk`HjoPwvC$uey2>+t%UZ`<^AE7^jy0&rxcsCyvTRFPun6Vu!nqXdVX?6$7X%jpLWrT{IO(w{%4gMPvo*nN7mfx(cRw`KNKPEQ&9H79tak90ZMV?x%) zj~c$lpKl9YjsCjz;ZbZX5oNe=KZ%QLQVqr`2;3Zk2zxhvg>OHp+2jCQMG;qlQ-E3R zt(^=al3f?G+v9f@AZE9DIU4)yUhB5=iQnFa8RYx+mkfB?lV`^{CY~)rQOKZ?c(V2x zha|s#1ULZ6**5)KbqCSCI;P6c^={QGlW< zAzzIhSXkKU*|%kL>?&W8HZ$3FGNeAQSGo}qF`M8fJRN~>j-6|s7Qe3e<40bZUq6+P z2iC;g>u8I7Z3k`J_h|6^{n(&9B&_p=(~ zX$(6R~W-N4t`Atz#K=BW{mDr^K@x z-XdkvTUxS8Vs%sCNYp}IM_1n;a(u3HM7WZhO-sP+JIm?Vm>rvSrWKj=Z_sjaT(M%X z%%olW_SLveTj^(Ovsc{H_-jo~m$T!i;u+~xsv2oFi|((x2jk3X_wLF_x1}EaNZ;pMxprkyeUh0nbgqc(mZa?tUCyfG=4ZUyy0JTE z`w5-_wNC1`7B%b#90>@1Em1pcsR%4=X{xKy-;udsqW)h#NAkt*PD{H!d~kl(%&N*t zi1d^Z9IkTDBRR0~2~ht$bx14-^(92;- zZ6mX{#L}Ryp(Q&u((T$*SRN(tzNW#SMY~@Vp>;FN32Sp*T`Fyq?A^b1dVpC99iWfA zNLpR^&&+?iJ{@oG7H9J~gt~kOSBu2n8mFZLBQhkCr5;lXB^LMZlekqTRY>P$*uVmY zEDFk|9*+OkCgP#o%Oef+Q!lPr0tzkty)ULn{bsjWP?W6_(hQeqgRZ+r2l;h@*)Xk*>02n{YU;+D*Aukrn*noA;15}+g8`TVk_47|96Buiy0l|LA{9A$s!@Dmf8KWCBYU6GB~{{bn`BYpq? literal 0 HcmV?d00001 diff --git a/public/img/op-stack/protocol/block-time-research-figure-2.png b/public/img/op-stack/protocol/block-time-research-figure-2.png new file mode 100644 index 0000000000000000000000000000000000000000..4e88aabc435951f5a7d4fb8b4bee1c9809375126 GIT binary patch literal 295107 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 z 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

    &WSc(+ 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

    8(D_qp|V8n!nfW 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¨S8Wv;0{;fGW6xhrBq+1eGWo;b& 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 literal 0 HcmV?d00001 diff --git a/public/img/op-stack/protocol/block-time-research-figure-3.png b/public/img/op-stack/protocol/block-time-research-figure-3.png new file mode 100644 index 0000000000000000000000000000000000000000..74cf842c3eae165e8da0fe6d255f407c78894486 GIT binary patch literal 294358 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�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 ueEugnRNA+BNV1>8N{94@-p3wU00w--<| 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

    TppC> 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 z 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

    IP0 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 literal 0 HcmV?d00001 diff --git a/public/img/op-stack/protocol/block-time-research-figure-6.png b/public/img/op-stack/protocol/block-time-research-figure-6.png new file mode 100644 index 0000000000000000000000000000000000000000..73b3da9a256d924e10d30cc1c9b462e1f034b435 GIT binary patch literal 22182 zcmeIac{rDQyFP5KT2T~Dgdz>*F)|NjDnpTZmJEfW5FxY*4VuW9P?^a*&qXPO%rg-( z&-3`6chB?ez1O>+WAFFbzvK7EdmP)*v0CE${oeQe`CQj^p67L5pNFdF&+Obmw}XU) zWT(PeSv3-pEoLMnzaJ(09sly3hM`AA5}LVhT!R4Z{+Dr>Q_R;pBeRTxks*$R`9pwaYWbDIA>$(Aq0EPJf-I3CgK=H9c68Qi0oC#%QIKJvLy#p`=flKrh?_nGX}$sNZ$QQLEP6`Q{Uv}<&~6pBvD*!h&jg|Ff!7VNSS84 zlgC_I`ff={Nmf>tVsvFiMSR-Nb(WRs&y1SvP0yq@bUL=g|1KJqY+e;O`?EG>{LlAM za`N&C8tegz=9e#PcbLYnlKI@ar8Xw)JY$wOW7CzNb+v6~av|Gwabjp_D1kO4UQt>3 z_Ud>}fx~e6jUVNIkW+W|9F~-HAE*o{chXT+r8;!T@X+qwsot`>y1J|bbrYR={8w9f zpU7u8j<;8b3U#!%H#eVEEz8FHerEKLm6bgk%5whIg9i_;)V=jeO1gG$+fMJD^p4Yg za%BsVXP#-T8=ngmJbCqX!*C#{Zr{(Jm#lxJJK%zW(F$BvGU%E|=y^%WU!3K6FXgFHbor-`dA$zfSpH}N?Zwc&<( zdR982FJAE5bP5Xz3F+&1Omr1Qh~6BDNMB7%Db9DE9sC*YS~C>sb>=lGLv#5PdM_$m zE~|ETmURm?m)@69IXSuG$B$EvT`Tq6eskjw5z}%Ce*TQUzDv>D)>r0d=jTrr%M348 zj5E9JfJ9Nr?-M@Yv9`;k9aH<={xH-sU*bY1!KQHH6=b z%JlQoCr_S?x1>Z+U8)M?vKwdgSnC}bX^*=QshOx%9U;|&eSwGSEftkj;5u;W(j_DJ z@N98g>&Zu=*PN?^rO{oPIgNO3Oe?Ed}v`|fkzu-ps%I1@Rh%| zwY^>b%$XG3j2Jwp`H`lATho0~mz*l_Nms93dm?Ud>&neFC;o&0Uz57CO^2vwXJ->r z?2kU7<&T-!Y*7~HY>ujxTzyxn9ptNQl4o6C<|VgRT(LecTEcbV%klfW4xOM-q2V#g zOi$lIPX0oP{TX>nim`TL(_Uuf=YlsyyX+99x&DNHt>7ER>XIa-kvZp-dM=TO0GnR-c?%Qa$?aT*DknF5yfqs>Xu53Y4& zD}?6QblEvL9F)AhguB>ol4e0gJw5f9!l$^nI8y$JA48D8zwDVaLN=YPm6erkZFvaA zhYugR6uCFXUDzK!TT@$$tz(5{=i=gua9Wi}4SU=c4a3d{g@_|hx9ZBD$4-ly!Orv_Re$L^U@yST zsrdQB^TzJ$Y|-w!7{syjWVN-mNlEWxKklcYxqSID5o}L?eKo|Y2pOcLr>F1d&=Roi z?!=Sn>T>JMy`ihCyMNc~&Nt5^<`7AK$qIS7xt?BLh9&NX-Eu2o(;c=Y5}RwYj*gC7 zwo$~T{#;*OB;C4IM_2dc)z<5HhV{w=?K|lO9VWZGs;jH(>(g~JEEwIF-t-nD0Lgak za=dXPEj!yCd-n5VTJ;J({{sws&Q^v6jsZeaOW*GeR)<;((49H+`Ocj?xw*o5BY5a| znm2IMnVDC+3zuUf+^t$`5gU9L-;>bO(+dgZeEIUl({rn7>Dx>zsg0!{OVdBPIy(;@ zIyCRH-jt~Q`5EKpT!V_fzP^~47$xnAk5dCo<1-B^Qs+WWd}?ZHDlfPA{{BzwAwPQm zfPm_7iH@o&rN}ym(dO~B<=Fv?u&^)*q}Acr+zXNNKGa<7931L&CK?+4(b47uEU6vH zD9MIm&gyzA_4W0got>-nDTW1FD;}q~A3l2)WRzbYQ&6z_?TyS%C+C&nSl5Ly%N+%q zhN59L-Q61lLB@fCwGmQ0o;n4NNuA%3sH7j{+5c1wmASuberk%>;3?Lwt+n;+rgg~D z#GcYi)u~kPBP*(_i?F>+9%?0OTH!{EuJ@L<7<&{Ug*ZDqv#5lN-yG4H>@MoL_2WsX zkS+7^gwiH871~X2|nV{evYVZ$lDtui77^I^G!8j zVvNGqPvw79ufe59xQxW3WDL!_Fv+T^)elq!VeNhl4?AzHEw{F|A{ZDYTr{H9DhdkM zW~!=Rp4890Qs>m;CS=CVfBpLP4wj{r(G-t` zw#!KLA%fT1(@Z~8a~lK)1};>lM3Gp z+C2?$#W&nWg}ErHh=APu{2feKJNBz02pScY+Th?|JdN`5a#2xH2FcsGr|)eer{-)e za$T&CR?^SDDq`1vHh!AkwlK}IA%@SiT=}KIaAg38b@MwBx0N~EUZd6g`u(>GFPPKP z((DJnPS4I-H^%u=Nw?=t}y0 zFCW~f3zu}uSBa1`GBV=h<1;rm#~ZN;rQ95C&bm_9_ld?hGc|Q-p~JSvWt1!IJWJSY z@y$`K>(^65LpxAW4jnp_VpOyevAOp7%a8c}AJ3%11uW~IGs!Tkgd1pRI3SM^CFcO2 zG?{NmNL!x$!4j$Uuw{KB>Sv-+%KK7Q~mywYfZAtM!UBQLo&v=lrJD<4sUY7F?c6KjOA`p|> z$p*B$cQb`i?~(rc@}zZz-*Ie8%I(`l><5+4o;`cvf^VVe>C>kXShk(H)8+KG0$09$ z2RO;Fs9u?^l?vz%bzPe34dl}A-t>DuJimgciK>2pntI>9){YLEefxw(M0PSt-k$FJ zG;^N;PxzX(b;mnh{=6HXpB{>yxg6oPfKWrsTlEwdnb;l@bL=c~&0!m}iF)&KxJWJVYq~AWi7WS?^sVqM*$FtT3+L8@BP{rzTThW(350fB+dDaOXpYFv7mXW1)iYMQSI z4AkteP*Yd;qDm>*$Tyft@mNx53UcWoK)zM)M7;Dc`BHO)x|M6>zEU_q9x)o6?i<7pdruIL|cUsOOHmIqoy;Jh- z?sFeI7G+ZAU2n=Zz1daO7Z9O)koV%9dV0aqva+JWLJF1b_r1MEg@w-^^*7pY>^2{u z0k~3xMIn!@<&<0<%a}1&U3bfnwCjIB)rTb)>WtP-F`AK9LDKH*6lY;MvnkagLAvW8 z>m;|E^11N&&OG~T*RJjCc_4^AWN$w^H#fKAj1FMNhkK;jC;k|oR4AK$$B%19v^FCN zTx~m2M3L_>e8jk544A9%!5+3FN<0DBrU%Yzop4)mVDfZuPjqw=QhULCE^71E_}ExC z%J;HC*qpk-gsRifw>S1bYwAq_=~|3jt5X*WCX4q&k9s$=Don{6@ZRu>R z1n7oOU${^=-jM?U%<0LxxVsQ(-q7WujZJs4n`@B~BLf5Xvl3*PARc2ax>Tx5BaQLi zTd1YaZf=o$)m7l+>f*ACQPQAYBe4m0QCV9nb^ZIDdhYVCX$hY9?^m&KirpMByY((A zl7%r5P)bBtcy6L=bzu_}FEu0MMfcUkQ>Z3|h+=))BJ*q4xB})7+emo>PsdSa16+V& zJ2EcUzW;MeQBhH}AJ$I_;K2J@zYI$l&t!YnC~Aehy}cJz{c;uJM$@iuZ4y|m5ZT-R z00knK*uEZ{8!kmgk_JpnOrS^gq7&UksKM3<6g5|RdIC+;ZWba}ofHxZ5*pC8&T7Zw z5CEL3t4r%7w*Y9Fk(OHQv`2Qzokm<)*hI^9056+)IKO^fhKccCn75M6v zL2oPQ&5!>6D1jMckM)~i0EiH8TLazP>%DK~e1O8J>FDxtm&>z18ATngtS*eJT{AIx z6A%z!!cwmkmzt`&ku$R`E4RQ`(55r^`SYpX`;3Cf{i&&`@7^hgyLzoxg-LZzDVsSp z9^;nzapC4zYg(uIzF`^}uO~l|nlHY;0~nK!+Jj=@Jl~|vp%92GpIul;)=mjGIAU1s z>#l^yRgJt>TdR^Ba6Z}JwDlC3Z$QBQy?bYY8oKjuDslVQ-+70^G-FCiN@{IwJ*@W5 z!0uu^MFuxUDK6O~*OR$JmfZbc!h*oK74osBm~y;^x;F@v`ccxuG@AU6u$KFfn7<(MlvnG1;|t^ zQF7>ocJ125z;{VDh}+PU3gk~43v`wE8e7kxk~RPo!kT+eaLfa66k zWaD3xr|1>1rh3-oyq>P5Aq8b*Mn;B7J6LUfTgK%{4|A%?RYFisF@#f7NX|gBs>IMc^TTkUHa?6i0IWylz(w|Kqi8WZIJfF8`S!dWm z)X8ZvH#gUAJfM5$GS$0x?0FV7Iv+g;}SsxbwEVTQ@7`CS_b2-ZIUyL2AOW2yK4g$ow| zC+hi&XDT@sJ*E=>-wDPKb7!6U|lqoAO0xPDzVUIR}mU{m!0>H5Ae4x)wxpv1@7 z4X8-1J9v#78W{9T@lp&74oV{AMMOkMDH;50cWR%Fti#QinVTzw0=U#SIXiQ0tj(%0 zc{V-_3JNkfvWjdDOdVaa)yiqHqza@K*zm@U8)`cKt3qpgCu*fO{kw(OPUdd5O)`dC zPCR`HDdn8Kqay>q#n)gy)0x@Xdw1`?jf{*=y|tO5X>8mBOo8&PEt$78no^=TP+uY% zHUTiEA~El;u?oJTxzX6x)&?!)325J=M}CTr3lG~IvpkFK=hssk9ugAr;>FROtq1lq zcp{g9`iX3#W$;|>&~7@IC_W=-)p!NF#xUQ(Id|`t`rAAPx!)qsQ07gQdXbki>N`0( zSzC|V@$4z9wk=uD&dt5`vnFgtH*=N8*9mC`H3DfLt4B#rzB*II!?CIU8MoZ|q#7)t zIn_kQxuLmv0TB%@AB19S1eA)jQ~UB{RdsceQIQMQvB+gUAypqYiZ`Q`e-890esQBR z8`a*bF%AhZt;XM<_?J+V&MhGEaxgHL{kG z=OP>s_kk%V&KlR5Ea@lULvd%wnZ8O|?{wa%#YZiMczJq~F-fjX$>cc#JqAb>I5>Ws zdi-*pU1jnp0kt2ZEsb%a`X;&fv}YF7sBPc*BDy>VInP zq}0=_p57R^C0pjblY@gJRLm*a#Kh7v-dCj#r4tc1KiX2o6O7oB_5&-Tajl8#8+FzAqfPoTD{>h;Y(tbc@rhSHzE zh8vv;?PiF>f&e-}(|Dmo;c?N63Rf*=*Z+l5YVD#<@QWAf6QSZ}s8ZNl{Nky2ay%t# zGrmX9fbB3F+Xn34zrU-C2BHa*c7=NKT{8T!#<8Z);obuXur#3My&jIDGgN z8J}f+)br<5fMegjecM=H1@Ku1f6K#4LDAW>ckkwE&!)V*yrPiWb~3U9;@ za>UMq!l?*!`2{K}s#L(1c=cGvp>L=2o%?fd{E%E3imZz~6B`vJzT8h-rj*0bH+*1p zMiSi`bOT36b^_pqFjK`I5}A2$vT*kNl`C<2NfSLKn@8Pyjqq^y7_ZrHIrg;S+N zb&*?s{~g!9i1d$GScmfMZTm;y&I7y`ktPA;p$!EpLek1cmcv%LY;Nv0{fWk|O54a; zj?CBBw+?$9^is)qda;aB3KC}liYqjz=P#R5jHOPTu!B0Qmy`{9E#^2Td~52Wfx)ZW zChI+$8;f{lzSE>6E))U*o_w}dlNCxyOlkpDA9CJ4X;!xo*F>!(mxZz6$;rw7e&C5{ zR5`$AZcr|pRD6%e$|o!=EFdt4q>jAhyguJDpu`B}Vz@JJ7Ig^;oJL!_1rZAn$jQt+ z$e0F3xYKQf?q;1#r@t#yOgvr(2ZzQh0-%OrQXa*(7rUSt5gKD&o1KEvflN^#PkoH$>+4z0AU5VjXR5*xsu7dsun~)z&iTv=v z1f-;1A;!+BgRgU7WA%i_#=3xBk{~m4IZ$Mh*6PyIfo}hT((cNN+FC}wOP+Hd^vgo+ zp3(A`LkGj=1C1S+7<2=*zH^5}NlD51NI-4f7yX|@^D8K1MEKS3KN1~kN1t5GcZNq$ zP!KU5S=WfPiC3cfEkGLJxV^B$*btF~ct~j9`}OH9!%zE&jRO^jamfKGUZ2>X-2qy;i;^-(sH*EtQ72Ez*w`30Z#1wh zJ`%z(=(|qp#nX8;Rh5<0oI2k}N3AU_+uq8NFUxDBW7q#dO4`xdDl97M?d4@|W)@sC zf$JQwp*Fn&tp-8vWM`M2nmV!O{MGCaMZt?N)Scr89(2%9ATsfC69}vF&dV10BE}xy9 z9b_{^_#$L>aRW+7hvB>?(k?Ffw+rS!H>2d#BYl9E&~7^VeEtkE4AKx(-6hn@!Jj`{ z7Osy7cV|5CNVOB{)XTGr2C%AkN+jvqEVke_%+Ew#MrW$2`})Y;RSya;s%Lf@Wu>Kb z0#^>ZUFbHo0Wv{>JN9Wu(QJ(vU3Zy_TmA6>1!Jp++LZpT;4KI$;82-w6XSx z3H6A*kmLC@g%pMUQ!M|SqgO%}HYLIm$+V@WW&-rAJ>6XC`t|F1Dw!mj6Mdh2hKGlx z$;ipcH~JGDv)m3HymhPo{(d~KMys3XG60VbOfHpfQLyEE_ndF?%G!N8z=M>O6p+TE zA~%Ryii(v-9pmPn=Gz%}=$NuE@2Mdzj-2krZOx6fHGKLcm!yR@iN{QT1*&AyQyNElHD=Daki7Q% zTVwL}`#*?gBtt`}-Kax8mJuXCLAUi^cnPPKD@mLq)-%VpM=&NjG0__8aDuBi3CVXx&s3ey(Xp{YmhJE2 zQr`!cH`9fZm&Ewe{6=!;F@Drl>{ft(AMmoYqKT-~x0+nLak*s%P+~8d!uX9P9o2#* z9cRJh@e61edoW0TC%WhVRhRf*xb6fYPG%OCMU-z8h-kHOXo~Du6VRe7O$h->Nl7_5 zi(hlCZuYQuFOj6N@td2Q zlk~FMi(H+u&cgukefmO?$#i#-D^Qj$*tm(w>C+#OnY&#li_~M!um68S==wss@DDG* zmFIzhfzO{`2Wwpz?;vN=N-^rfdO}lic6I&y=~IBe|JByi52$Krks|34BzoU*?IgV> zeD-idEIHF)O<1VEf2KwCOHcvr(MBv318EaI^%LLF&_uO(^i{m5&OAMM!@`Eyh+G}pvLL=FKOL4vcp4=HQrxUCE-2EOWl6c&mz zd1@s#S!HRSAdino7)jaz+W$n}^xB(rffns;E z-pO(4?#S9(@#|Ju2dRA?Jt7G3?WOCkuC7e7^77sV1qBAyCMLaOW3PODnKVK6Dm2l3 zRC@!$fFEbFX)6@?XJDm*gAbJXef%g3HI4n%(_UKjhBWgkY9>!Ab4sfrjuqQH)F{xi z1UKcAUj%3dZj?U?K1}_oG4%*@+%6tPDDeY3t@t^uvf3eWAa?**H@$BFQdE-sEhH%D z=Z_zI4<6+7YCIF$Wc9+&&t-8UNh>iisw}~7@N3BH*N30&_TiME)9Ow?Hfv|G_O-vi zAI+Y|udNB872K7kKL3^zRKtw-4cl2Cx8mYdRG3Cn7|Pp=y`izOKT%ox1*4;*(VYwr z4_DK)u!u1@E}@m+S6P*YCT4p23C;_NO_~K$n%%vT{QUeJoSdBOO`}yB0Xdx9O*GWh zFHwxz_c8cx#|J+B_YXW|oJ}+TD`7$kV)_UwitSu*we1ATCA3RFKR-AaboBJHuhbnmd2$}@(4e>d zh&?E~{6uHyBPbx!K=V7@3;-poFgoInU*o}gB^%`VfvP5I^H?@O5J#~@1=$X`jy_go zWTgK-FDj^cC;0ghJgu)!-+OvcWY4~RW|o$0noz$ujS2~#S5YyHGLF|mBHq58udtts z17w?6s705-qxP>Il1b&KMDJ_*oNl_0iJ$mAU zob%WJ@Udk+Gw+?7O5Lc}*Ve=(Bo-&SIIay241niz^75*Z?LKe-+8uVv5lzrHmDq-x zBaI3P*yVvdi7dyDpR}z1h$@rd=lUWcsvGcQ>H#1gm{crurI?r+h7C0B22Mu&VCZ-SV?Rr+!G&D53ch_ZHR)K#Gy;hH@52R{&_wLDDy3_{} z{`>F08yFf!zJ1%T&r2}n>FH@ACQCNgCu751tPqf}1iou_MokcB#@#!PHlIsL`TmrP zJ-`Z^0BTZR2|QaOl9I)x-FndHpsMaj^xkzy6y@X$EjzAw;yIo6Dire1yQw#QZF-6gHFUnulnP|| zs0?tC^F(}=Sdy!L42aw);rYpfH_PW)z~vv69akpTF7W?)uRV;{@s@v0x&OUY^nZ)g zowx1VeE^Imix$CEBIF}28{_JbX6IdsG@@HZv4P;m5TH8;OAEAwW0RoO|1G~!I9Ch% z?(3%sVX3*WI0CgM>1Hrg_T ziI{@L2zv8vDA%>GL}uY^D}p>C{Qw_mW@a`w(xhZH`2G7g@HYs%=x#EI*nLD}Sn-kc z1N4`Gi;=FbetUhIs8l<4q-SROCrC?6Q}Yz5V_t^ns6WgXy$BZf#nYbN=3l%SLGP^Y9Q( zg2BN-EIT@0Xprrd#s!lxp)Bwbfla6P)R>XC(RsPdVFC1@dYlge=kk9`s+fTzcko);ND*d0Eisg zzvp$<;C<`E*N-33iRBQSkzgV0Bs8;xowRNSijMw_<(HI{#12?kSkSD`(@H$2s5k;; zQ!gpmZx@HtU&+plQTvB?o=xSMoE3$yXr=f?MDn07X$sZ1Yn1uiCH+fbmdo$ddx!vl zeo0tK0spDqLQ(~z)`uqnzFZU+FDfh*#4WX|uV0ltJUo~@|IUjT6qS@R($k|Bz>M%K zb^&ub2`A8hCBAgtf`~cxCKk#Z|7%&3Yd>*RpE_s+f)-o`BdwG&Pq=nG{`enxU*(pc znqm>&+^np;{Hr~&g6Q!NJ4lmBNlC#V2W+QEgad+xoPuJX^ww?L2H~iPiaM(aEY&dV z5GH!lFTwA{ivf-afV*=q1=yT+0wx-m2>5h4# z>x@SaJ97sVXNUpfFxml?0qgBxLKCAI4+xD51}XP7kcr*9ccVp(b&`It`=~qsoA>?u z5mFxR2z03Vemp`b3*Rp^)|d~$b5=sM|BL1c?@wXTFKc969Bcdtw98@$ZfFky6^FYm zw82UWGetZ*0N0TtZy_Gz!GXYR0KG=pp#$>q<45T6Teoh7X;5BH?nci+#-@v-&KPg|ki1rf77dyjof~P(E{|5u2rKfhC8}fbe0$!1zpcY80RtNTA9hJS( zOfaC}!O6zP$BB$7ijK=kitYGGOljYrTs7em91=_DYo9oABI+}C;`Z&^A>YfM+_e+G zk~RLpgm6wrtHo<1*wKWYq^kx9PrP;!KZ|pt+~tGEh(0P%xVZaTZfIzz#uZD;;fV>z z!ba6)M6ti-a$RR`ety67kVF0mBL!ZkTy?MPEjnIGtBaE*H%9|au0MYCD8c&zGUfYY z2k5CGWBx$Ptsp<&#l;1)6Y;9iYQIJ~MtDuj`q0N7gb^23W2-~N6)HbUTh#qpQ^NrN zPu4C%N{uORO%(>{!1`MqBBo@NpQHu70pwkSEJpN#5wKQSdfX8LmTL19#1&=Lwx%AS zr?uqKd~S|42|5PpmnvFhQ~WG^)?#7 znnDNgkHOTYWtY%!;{C#;o z$rN9%`}*}NJyMkDJMHFIbzVVZ!9yxuU+4hB z#1|TOC17~Lg4gu2b`hVFRn=Pc4PCE!;J1RCqs-Uvw{~P51-&4;NH?2K3gCAd1x;%? zVFSH&>(+t5+=2poT3qdG8-78~ZQHhCQx?Eh-wtsI)nhva#k=f3u{~Zd(7MvPfGvVm z#v7No1MYfK!6^u331c(wYSM_`3B-zl;({ATgCgQ8G|3>vO{Jz{NJc%(l-QG8_!Mrq zL*VL%nqyZ1BiRNF&Tu|y)V{~HsjfbDtL;0(=+>BNsb1y>$Lc%dl43ef`b83xkEU zwYPhFdVX0P-A+y}=CN@bhHK`D!Slz zfOTYZ&7P9-8Q=_1PE2(4@ngp@e)AR{5$Ojg08sLrpjV+>K!XEbz_tN7x?1;E&dO>8 zJtdwq3cC0S<`d?Gd3aRF-axL^8!tQe=HUMv>S(yEZ#m)l25o1|tUQsQZB$o*geftX z`clZ2Vb2~rz)s`^!f1oi6zJeL15);c?xd*ON+$Yxjp@Li@RFgJwWpet!I_bcUgZo1 zXJ9#kytfn0GcZAvVaN&36Ntt>@-w>6%U7e1;mQ7@?UIt+Fq6NzOdv)Tm``}2Dt2}n zxVot;sE<{XH=mpTpW3+!r-F7nTpTQ06_Z{J%E6xRXx#vRfQ|VMC_T7 z157_2QF`VbkW(1s$jf1p#mA*|g6DF1tupBGM1c`$<9~vVzT7!leUo0F65cipx98ZF zT>S7mlPt7Nv=DNz_t5{<9DSjus~aFjpYVSKd(6j34H5!_g0z7{2C5-gpd&=i^bZVX zN2t#lLl}R6>m{!c3yZd5GJB3sCy_E4-|SkB9sx(A4M8rv8*cBLCutyRhML z0f=I_3*J>}GWhmsX+_ZXfw~K;T`ge#+`zHf;w82Q$i-c}?00}Q0y%0*#Pk3(5ojseH zogJ6}=nUxr9tukf3&C4c-$AQRu{&MAepXre723$BPTfJLO+%w`eX*LT$uecVgymkij zm^#U}ZmEGg1N<3vHKCUcG191sc9zO3;pw_Fj96kl?vNAam6(VqKu$wCgaL0hI>-pU zoytnMmbBH>?9eqt1N?Kq%Un z8HB?l*|?;;w$>KzlV7cxb&Qe$Pmw_-SakSjyqM!`J4Ykui&rEVNDrCnrlV zih>$8Ki0+%aTv_q>c{9PJt7{K=D4^x+yKNv#Q{KOOPC&zexb?J@7vdis*C5OsQEWj z@7L;Tu0;pfgy8-4J`NcUo|GnWB|NVN&A%3f#`cg;guM`y7d3#F6R-qz(*MOIt<0&@1B91 z?iZq}k^+!2mcTib!^M#`E85%h%flNnxrnb+*(5FP@ltK)`-)I^;Y;yRoL@PiIl$$U zX)d4rZ#}@KG)8Ya{e1@>{zU;GT7Z(@A^Y2bIRf=y)&*Y&(V)IZDGA3ra1$#&ucE?N zA7l{pVFytRc1qE5p#_^oKhOc;1@=W zAm>Xzc>n%ARNQ57Q8i7By}}@YN)yfQOcSrzPH>H9agN+FEii1LojntS<_bbhV-Ev^ zBX9Ose%>GYmMglyl0B)FX1)f9?qbM^|Bbhk%07JF#e>Opsfn?UyZ-Biu!t0~w z+>Gj=9Lx*2x(j9if*{_zch3XHOHB7NeFQ+l&L@h9h_Eoa=!J9jN|;99BaOLUR0|-m zS#%JI=tO(1$!h-YALO1?NSnhgDLv4jXlZD2pah|obRn%_eoZT8fwjJ&0d7@fC=3*h zFo4zHiAzew$j@P^?o7)Un3w@eQB_s7u^}vDbc~Du;FL@s!Jk4;T06ow2q!)ZGxG+V z|LC1gBatjFM!@#?n3f-oG0dC8@-_MMXU^?qJ0@97H)8rc7W1f`jMNB4eErfKrOD9n zYqCl-lUI{^R^NeJ+0yRB%FfA~Ui9zUt5$+w%D?yjG;hu&R7CRZNTB`?UAPif%2zKH zQ#?+ch_iuNvja0h^Wd2ng|kCufCT`02MntIRxs`$&&Mit9Gm%*&q$^o#jBcI=RUd;qQ*Yg=1mlY8wV z8LSWp@fyrjShl4{Q=zw222ykWku(|j8yb@Fm1SjRsRr!tQrV#rW8xsP?to+q+O08A zDkN(D(L2-<<@N~r4=SvCE(5UYzc&s^1&jaAEuJJsnkx(rd|e7b7Kf|J`Mauh-G6>Q z^#jd{jdnVKtEG@1iN&D1#f?TdzRLDw=^18`Z?YbOl?1H^>VT1X^8`{s?)pI5wp>xY zf74Poc1sCr7FXVqMPKqC7M>|sc#N`~M~MS72wvS&Lb&qP9>SaooPYlO(@ti7epsB; z6Hcs|WzOluSHe8kX^BimBJK%Y*riDF$dNwm(Y730bVni#7^tXTYbE~bHzK;2BqSuz zZ(J)`n2=x{S?T$)bXhlV5>*X5Ep-NnZP4+1kT44d6O zAN@jCmC7Y%cjAjT(L;}ecinp!DD?44s%q67Co|0l<1cbFtzEO9sqZt+eEP#_oqKF{ zy2ZVuN2tdwgOS#_r*<)2I<9GC20rn2y@nWcNfGW39*{M}JZ0p&c4D14A7#Q%JoXJt zU>H_`%4&r3O7bV5kCef03@jlcq8nLv%h@@vpn%7?*Z`hqIP|3-z@2pl(K}U24%3$V z&6}8!NW^<6#|8v(>cZGIkAdJq7yri`3#f@hBlbCN`m$fT3fZ9Gfspb(DR$od6ucQ_yNA z22nSbo)hape++LQPGkrZibGJt2`v9R77G z3`WQBjo&Xn%5&LY2gw}!b&$-lU+UxGhrj%q3cn7LIs3O#_%FSL?wHe-p%kRouWUp| zef#z_M}9mEMKYhElWq+qp3-U8d!_9k85(reL?j;O`JLpO%5Lg9>urWFcUR(fRROPyG2+a^<90WQAz(@t*u^?&2){|7hxPhKK$c48av zl%|G8u=*g(XnXct8n=KTmqJBtBDWIbvEAzu<_8D&73AiJNok)p+Dh_1hWOEc@eHo+ zFxjp3bLi06*yi(2L!|xU@7u7)NdAizn(+4C**o1uLeffCdgSWw&nCB#ycgU}ope62 zsky1CEA8u7g{(gla-K~};(P*VDif(H_fC^dBLj;GcP`tJTX2}04fZ^^7))|%m#5rl zy;WB4(KB87ZAYAruHO@RHYw<_tG=me9y4y?pi9IQz78Dbkce_%({g&3Ia_$iJr#)+ zdo!%Xfxag(Az`p)Ri!IQ?3wRHwYIB+lrM%;%3hf!bdYL13fp`_vZeOU4j)X$fgrrY z@W-P^EB!B22qW{v*+yJ&e%qxQ&$eo*^FjyLBU~FaODr}HMolY*P?e6x54bG859hEo zTpmb~i9mQ&z1p_T%!rR)e~!I%yVpHlI?0Ue2ns~`adx87+mo#I_q*8|LhTGUYsoXcSdbJAD zl%ma90=%A!w2|qSolALoL0@HZPtH!ooPZq4D>*JVhs>Xt9MSrnTIhOd9~dOjCx%~i zJ8|}efvPGoLIe&~*+sLmlXg~d@=?--wotMw8y{4H6j`D#kQKe?*&<)`Rw-KKYlKFi zL>t+tnJPcWIhs?UBFah9WK8)K_@Kc_^=^}NwUv^~_wBokl1!dB1qo^PRR6){WX#sT zF~1u2+a7A*7tCA0o?)(s(Mw3)?T~B4T87YGJ%8Dy>)W@(p1JPpF8cbRa&%YFo&vc} zNpW&;7%SWW)IRHgYteqouN*XfM2vcUR%F6ttn0jQc4npn?Y{U*cV1&6%gDFsha&Q|EPhP>DN)X(gp9Ol7$iXSVb) z`V&&wB*Uwt*REdOCw<^aeJsu6Ev4W}Y@Wi7V>+K-0-Z^Sissv&gPSKy$_9bC5tp8> z#%{jzd5E0-JH0H$$hu%7dJ1pM#o)a;_DO^}^Ywu4LyJTe@9OH}N|))B*!HQJ_lV$w z(`hFkKiEk(b?=e@9X&n$mMzC^w;eicQU@P$H({?{VO_K}G|cn_4p3k` z6H;<_GV;et!EYxrSUta85rCB*5im&Ol)jb*FE#c3=-`C ztZ0$0gN1rhfw*bjy0uhv^;EnDPMz3ACvbgck>vgBRyz5Q+xS?sy?3Xbc9dk@VM^(w z2v+sJc;|C#;-IpNJO62A3G@vMJ48n}($|M6Jo}MGw!DrsCpZ8?BwQUYUVJV6rZwa8 zv(E8T=uo&rWJEg??oHG_v~7b5j=BcDc(Iq3*3#ums$SB@M8RbL1lgtqT2?!}E`55m z-%jXK3xM?O>fhvDR;3ZHr&R~$0ldBHqi_Ff}nurr+tKf&1Bb+Ac0D#5p0AmHjrd?q4~(lhCw4gAL|}5b8q*4+2Lxt}WegF8KYbmW<3js#2UU zG$DW3lM1K~=r%7eWb#bbZrpXP_^k5hO}6JP7^R{gw7g76SLJ~uq2{~?FhfhsS|X0Bx_pW_czAH!76$O?PMDpAbSo?C z*?H)6|G)s0cl2Fke|JvF;dyydU4jQ9h6d0c?~d(&CVs4& zQPOFhLVf7fiqYv%s!ZXGCWe+CbN!YL^lwf$iP7X&Rej!BbPDITNX&hck$!-u4hO%P zg@sL9x*V}fEG;czJ8exfJqI+r0Ro3U3X)^IMr8**#F#UW4@{$nQ`PlAJlA5{2C_P0 zJ~=M#OXd~c1CJg(%3UEH`g%nGN9%A(No}IK0OQ%^+)Jj|cJF-bivn`j#gBVc{9zhg zH^pf|IO_)|TO4I;zl#gTxkcNyZvBFH4%W>ic_RNJI9M1?JNV`>D-Zh$>P1DDzo9j{ zNWvR9ia2Hrfc{;&8+bOjNmJ8W?&?1JK7txb8YdHkXz}dxRq9cb#T)eZo z8pmZh6NkaUX?f+!5c-RYl^iKJ{;I(pO&Y8-9KllPa3HV1kF5W5@9!6Rf_1mvvB7=? z9Ww#%hmg2e8grA#7NTry!x)tjhN_GPCXP)&YAo!7zp=N8VNjrG+{C~csr=i#l9lr$ns!^kpp z@RK||JiNTT*yZuD;h@hr1}XQXR zaZxyUCK>xkDTGQoUIY2Cc}^4#ZH)gDN3O7Nb{8jdx3{v1x}_ zX{Io;7h(-fCQnb#PQrRtgu|?ov|IrUkxp@Fk4_XRHmkbYK53*rFK=(mQ$(5KC^;>% z3r0rCEu+W)b<^sYp~3NyM|P5=svw7@M!_|R76DYG_$DhHnt`+ev#Xw2Eu4FYQugnV z3zEC{;jkxCyBd1{BqgLMQ|mJ^TklAMyq#Kv3qf>(4uU)(rawlf-Hs?c8u1z+iH4QR zq0HxBo;0uJ8}hpYbf pevs;Kzuxc-FaH0?BI`GQoAj1u7!} Date: Mon, 28 Oct 2024 13:43:39 -0600 Subject: [PATCH 311/565] moving into research folder --- pages/stack/_meta.json | 2 +- pages/stack/research/_meta.json | 4 ++++ pages/stack/{ => research}/block-time-research.mdx | 0 3 files changed, 5 insertions(+), 1 deletion(-) create mode 100644 pages/stack/research/_meta.json rename pages/stack/{ => research}/block-time-research.mdx (100%) diff --git a/pages/stack/_meta.json b/pages/stack/_meta.json index a0350048c..db6bc1efe 100644 --- a/pages/stack/_meta.json +++ b/pages/stack/_meta.json @@ -17,5 +17,5 @@ "opcm": "OP Contracts Manager", "interop": "Interoperability", "beta-features": "Beta features", - "block-time-research": "Block time research" + "research": "Research" } diff --git a/pages/stack/research/_meta.json b/pages/stack/research/_meta.json new file mode 100644 index 000000000..470d7e645 --- /dev/null +++ b/pages/stack/research/_meta.json @@ -0,0 +1,4 @@ +{ + "block-time-research": "Block time research" +} + \ No newline at end of file diff --git a/pages/stack/block-time-research.mdx b/pages/stack/research/block-time-research.mdx similarity index 100% rename from pages/stack/block-time-research.mdx rename to pages/stack/research/block-time-research.mdx From 8a9133d649ce481f808cd87a8526e160daafa9e8 Mon Sep 17 00:00:00 2001 From: soyboy <85043086+sbvegan@users.noreply.github.com> Date: Mon, 28 Oct 2024 13:46:37 -0600 Subject: [PATCH 312/565] adding lockfile --- pnpm-lock.yaml | 9386 ++++++++++++++++++++++-------------------------- 1 file changed, 4194 insertions(+), 5192 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 92dd2f1bc..5c07b690d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,4 +1,4 @@ -lockfileVersion: '9.0' +lockfileVersion: '6.0' settings: autoInstallPeers: true @@ -15,3716 +15,209 @@ patchedDependencies: hash: jaxvkozlhcbn7zjsiti5ocoubi path: patches/remark-lint-frontmatter-schema@3.15.4.patch -importers: - - .: - dependencies: - '@eth-optimism/contracts-ts': - specifier: ^0.17.0 - version: 0.17.2(typescript@5.4.5)(zod@3.23.8) - '@eth-optimism/tokenlist': - specifier: ^9.0.9 - version: 9.0.51 - '@feelback/react': - specifier: ^0.3.4 - version: 0.3.4(react@18.3.1) - '@headlessui/react': - specifier: ^2.1.8 - version: 2.1.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - algoliasearch: - specifier: ^4.23.3 - version: 4.23.3 - clsx: - specifier: ^2.1.1 - version: 2.1.1 - escape-string-regexp: - specifier: ^5.0.0 - version: 5.0.0 - next: - specifier: 14.2.10 - version: 14.2.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - next-sitemap: - specifier: ^4.2.3 - version: 4.2.3(next@14.2.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) - nextra: - specifier: 2.13.2 - version: 2.13.2(patch_hash=a4rp2hgojklggjmthmkiyqaek4)(next@14.2.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - nextra-theme-docs: - specifier: 2.13.2 - version: 2.13.2(next@14.2.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(nextra@2.13.2(patch_hash=a4rp2hgojklggjmthmkiyqaek4)(next@14.2.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: - specifier: ^18.2.0 - version: 18.3.1 - react-dom: - specifier: ^18.2.0 - version: 18.3.1(react@18.3.1) - search-insights: - specifier: ^2.15.0 - version: 2.17.2 - devDependencies: - '@double-great/remark-lint-alt-text': - specifier: ^1.0.0 - version: 1.0.0 - '@eth-optimism/core-utils': - specifier: ^0.13.1 - version: 0.13.2 - '@eth-optimism/sdk': - specifier: ^3.1.6 - version: 3.3.0(ethers@5.7.2) - '@types/node': - specifier: 18.11.10 - version: 18.11.10 - cspell: - specifier: ^8.1.3 - version: 8.7.0 - eslint: - specifier: ^8.53.0 - version: 8.57.0 - eslint-plugin-mdx: - specifier: ^2.2.0 - version: 2.3.4(eslint@8.57.0) - ethers: - specifier: ^5 - version: 5.7.2 - globby: - specifier: ^11.0.4 - version: 11.1.0 - gray-matter: - specifier: ^4.0.3 - version: 4.0.3 - remark: - specifier: ^15.0.1 - version: 15.0.1 - remark-code-import: - specifier: ^1.2.0 - version: 1.2.0(patch_hash=heylvfasxh3ubj2edns2svea2m) - remark-frontmatter: - specifier: ^5.0.0 - version: 5.0.0 - remark-gfm: - specifier: ^3.0.1 - version: 3.0.1 - remark-lint-frontmatter-schema: - specifier: ^3.15.4 - version: 3.15.4(patch_hash=jaxvkozlhcbn7zjsiti5ocoubi) - remark-lint-heading-style: - specifier: ^3.1.2 - version: 3.1.2 - remark-lint-list-item-indent: - specifier: ^3.1.2 - version: 3.1.2 - remark-lint-table-cell-padding: - specifier: ^4.1.3 - version: 4.1.3 - remark-lint-table-pipe-alignment: - specifier: ^3.1.3 - version: 3.1.3 - remark-lint-table-pipes: - specifier: ^4.1.2 - version: 4.1.2 - remark-lint-unordered-list-marker-style: - specifier: ^3.1.2 - version: 3.1.2 - remark-preset-lint-consistent: - specifier: ^5.1.2 - version: 5.1.2 - remark-preset-lint-recommended: - specifier: ^6.1.3 - version: 6.1.3 - typescript: - specifier: ^5.2.2 - version: 5.4.5 - unified-lint-rule: - specifier: ^2.1.2 - version: 2.1.2 - unist-util-visit: - specifier: ^5.0.0 - version: 5.0.0 - -packages: - - '@adraffy/ens-normalize@1.10.0': - resolution: {integrity: sha512-nA9XHtlAkYfJxY7bce8DcN7eKxWWCWkU+1GR9d+U6MbNpfwQp8TI7vqOsBsMcHoT4mBu2kypKoSKnghEzOOq5Q==} - - '@algolia/cache-browser-local-storage@4.23.3': - resolution: {integrity: sha512-vRHXYCpPlTDE7i6UOy2xE03zHF2C8MEFjPN2v7fRbqVpcOvAUQK81x3Kc21xyb5aSIpYCjWCZbYZuz8Glyzyyg==} - - '@algolia/cache-common@4.23.3': - resolution: {integrity: sha512-h9XcNI6lxYStaw32pHpB1TMm0RuxphF+Ik4o7tcQiodEdpKK+wKufY6QXtba7t3k8eseirEMVB83uFFF3Nu54A==} - - '@algolia/cache-in-memory@4.23.3': - resolution: {integrity: sha512-yvpbuUXg/+0rbcagxNT7un0eo3czx2Uf0y4eiR4z4SD7SiptwYTpbuS0IHxcLHG3lq22ukx1T6Kjtk/rT+mqNg==} - - '@algolia/client-account@4.23.3': - resolution: {integrity: sha512-hpa6S5d7iQmretHHF40QGq6hz0anWEHGlULcTIT9tbUssWUriN9AUXIFQ8Ei4w9azD0hc1rUok9/DeQQobhQMA==} - - '@algolia/client-analytics@4.23.3': - resolution: {integrity: sha512-LBsEARGS9cj8VkTAVEZphjxTjMVCci+zIIiRhpFun9jGDUlS1XmhCW7CTrnaWeIuCQS/2iPyRqSy1nXPjcBLRA==} - - '@algolia/client-common@4.23.3': - resolution: {integrity: sha512-l6EiPxdAlg8CYhroqS5ybfIczsGUIAC47slLPOMDeKSVXYG1n0qGiz4RjAHLw2aD0xzh2EXZ7aRguPfz7UKDKw==} - - '@algolia/client-personalization@4.23.3': - resolution: {integrity: sha512-3E3yF3Ocr1tB/xOZiuC3doHQBQ2zu2MPTYZ0d4lpfWads2WTKG7ZzmGnsHmm63RflvDeLK/UVx7j2b3QuwKQ2g==} - - '@algolia/client-search@4.23.3': - resolution: {integrity: sha512-P4VAKFHqU0wx9O+q29Q8YVuaowaZ5EM77rxfmGnkHUJggh28useXQdopokgwMeYw2XUht49WX5RcTQ40rZIabw==} - - '@algolia/logger-common@4.23.3': - resolution: {integrity: sha512-y9kBtmJwiZ9ZZ+1Ek66P0M68mHQzKRxkW5kAAXYN/rdzgDN0d2COsViEFufxJ0pb45K4FRcfC7+33YB4BLrZ+g==} - - '@algolia/logger-console@4.23.3': - resolution: {integrity: sha512-8xoiseoWDKuCVnWP8jHthgaeobDLolh00KJAdMe9XPrWPuf1by732jSpgy2BlsLTaT9m32pHI8CRfrOqQzHv3A==} - - '@algolia/recommend@4.23.3': - resolution: {integrity: sha512-9fK4nXZF0bFkdcLBRDexsnGzVmu4TSYZqxdpgBW2tEyfuSSY54D4qSRkLmNkrrz4YFvdh2GM1gA8vSsnZPR73w==} - - '@algolia/requester-browser-xhr@4.23.3': - resolution: {integrity: sha512-jDWGIQ96BhXbmONAQsasIpTYWslyjkiGu0Quydjlowe+ciqySpiDUrJHERIRfELE5+wFc7hc1Q5hqjGoV7yghw==} - - '@algolia/requester-common@4.23.3': - resolution: {integrity: sha512-xloIdr/bedtYEGcXCiF2muajyvRhwop4cMZo+K2qzNht0CMzlRkm8YsDdj5IaBhshqfgmBb3rTg4sL4/PpvLYw==} - - '@algolia/requester-node-http@4.23.3': - resolution: {integrity: sha512-zgu++8Uj03IWDEJM3fuNl34s746JnZOWn1Uz5taV1dFyJhVM/kTNw9Ik7YJWiUNHJQXcaD8IXD1eCb0nq/aByA==} - - '@algolia/transporter@4.23.3': - resolution: {integrity: sha512-Wjl5gttqnf/gQKJA+dafnD0Y6Yw97yvfY8R9h0dQltX1GXTgNs1zWgvtWW0tHl1EgMdhAyw189uWiZMnL3QebQ==} - - '@apidevtools/json-schema-ref-parser@11.1.0': - resolution: {integrity: sha512-g/VW9ZQEFJAOwAyUb8JFf7MLiLy2uEB4rU270rGzDwICxnxMlPy0O11KVePSgS36K1NI29gSlK84n5INGhd4Ag==} - engines: {node: '>= 16'} - - '@babel/code-frame@7.24.2': - resolution: {integrity: sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==} - engines: {node: '>=6.9.0'} - - '@babel/helper-validator-identifier@7.22.20': - resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} - engines: {node: '>=6.9.0'} - - '@babel/highlight@7.24.2': - resolution: {integrity: sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==} - engines: {node: '>=6.9.0'} - - '@babel/runtime@7.24.4': - resolution: {integrity: sha512-dkxf7+hn8mFBwKjs9bvBlArzLVxVbS8usaPUDd5p2a9JCL9tB8OaOVN1isD4+Xyk4ns89/xeOmbQvgdK7IIVdA==} - engines: {node: '>=6.9.0'} - - '@braintree/sanitize-url@6.0.4': - resolution: {integrity: sha512-s3jaWicZd0pkP0jf5ysyHUI/RE7MHos6qlToFcGWXVp+ykHOy77OUMrfbgJ9it2C5bow7OIQwYYaHjk9XlBQ2A==} - - '@corex/deepmerge@4.0.43': - resolution: {integrity: sha512-N8uEMrMPL0cu/bdboEWpQYb/0i2K5Qn8eCsxzOmxSggJbbQte7ljMRoXm917AbntqTGOzdTu+vP3KOOzoC70HQ==} - - '@cspell/cspell-bundled-dicts@8.7.0': - resolution: {integrity: sha512-B5YQI7Dd9m0JHTmHgs7PiyP4BWXzl8ixpK+HGOwhxzh7GyfFt1Eo/gxMxBDX/9SaewEzeb2OjRpRKEFtEsto3A==} - engines: {node: '>=18'} - - '@cspell/cspell-json-reporter@8.7.0': - resolution: {integrity: sha512-LTQPEvXvCqnc+ok9WXpSISZyt4/nGse9fVEM430g0BpGzKpt3RMx49B8uasvvnanzCuikaW9+wFLmwgvraERhA==} - engines: {node: '>=18'} - - '@cspell/cspell-pipe@8.7.0': - resolution: {integrity: sha512-ePqddIQ4arqPQgOkC146SkZxvZb9/jL7xIM5Igy2n3tiWTC5ijrX/mbHpPZ1VGcFck+1M0cJUuyhuJk+vMj3rg==} - engines: {node: '>=18'} - - '@cspell/cspell-resolver@8.7.0': - resolution: {integrity: sha512-grZwDFYqcBYQDaz4AkUtdyqc4UUH2J3/7yWVkBbYDPE+FQHa9ofFXzXxyjs56GJlPfi9ULpe5/Wz6uVLg8rQkQ==} - engines: {node: '>=18'} - - '@cspell/cspell-service-bus@8.7.0': - resolution: {integrity: sha512-KW48iu0nTDzbedixc7iB7K7mlAZQ7QeMLuM/akxigOlvtOdVJrRa9Pfn44lwejts1ANb/IXil3GH8YylkVi76Q==} - engines: {node: '>=18'} - - '@cspell/cspell-types@8.7.0': - resolution: {integrity: sha512-Rb+LCE5I9JEb/LE8nSViVSF8z1CWv/z4mPBIG37VMa7aUx2gAQa6gJekNfpY9YZiMzx4Tv3gDujN80ytks4pGA==} - engines: {node: '>=18'} - - '@cspell/dict-ada@4.0.2': - resolution: {integrity: sha512-0kENOWQeHjUlfyId/aCM/mKXtkEgV0Zu2RhUXCBr4hHo9F9vph+Uu8Ww2b0i5a4ZixoIkudGA+eJvyxrG1jUpA==} - - '@cspell/dict-aws@4.0.1': - resolution: {integrity: sha512-NXO+kTPQGqaaJKa4kO92NAXoqS+i99dQzf3/L1BxxWVSBS3/k1f3uhmqIh7Crb/n22W793lOm0D9x952BFga3Q==} - - '@cspell/dict-bash@4.1.3': - resolution: {integrity: sha512-tOdI3QVJDbQSwPjUkOiQFhYcu2eedmX/PtEpVWg0aFps/r6AyjUQINtTgpqMYnYuq8O1QUIQqnpx21aovcgZCw==} - - '@cspell/dict-companies@3.0.31': - resolution: {integrity: sha512-hKVpV/lcGKP4/DpEPS8P4osPvFH/YVLJaDn9cBIOH6/HSmL5LbFgJNKpMGaYRbhm2FEX56MKE3yn/MNeNYuesQ==} - - '@cspell/dict-cpp@5.1.3': - resolution: {integrity: sha512-sqnriXRAInZH9W75C+APBh6dtben9filPqVbIsiRMUXGg+s02ekz0z6LbS7kXeJ5mD2qXoMLBrv13qH2eIwutQ==} - - '@cspell/dict-cryptocurrencies@5.0.0': - resolution: {integrity: sha512-Z4ARIw5+bvmShL+4ZrhDzGhnc9znaAGHOEMaB/GURdS/jdoreEDY34wdN0NtdLHDO5KO7GduZnZyqGdRoiSmYA==} - - '@cspell/dict-csharp@4.0.2': - resolution: {integrity: sha512-1JMofhLK+4p4KairF75D3A924m5ERMgd1GvzhwK2geuYgd2ZKuGW72gvXpIV7aGf52E3Uu1kDXxxGAiZ5uVG7g==} - - '@cspell/dict-css@4.0.12': - resolution: {integrity: sha512-vGBgPM92MkHQF5/2jsWcnaahOZ+C6OE/fPvd5ScBP72oFY9tn5GLuomcyO0z8vWCr2e0nUSX1OGimPtcQAlvSw==} - - '@cspell/dict-dart@2.0.3': - resolution: {integrity: sha512-cLkwo1KT5CJY5N5RJVHks2genFkNCl/WLfj+0fFjqNR+tk3tBI1LY7ldr9piCtSFSm4x9pO1x6IV3kRUY1lLiw==} - - '@cspell/dict-data-science@1.0.11': - resolution: {integrity: sha512-TaHAZRVe0Zlcc3C23StZqqbzC0NrodRwoSAc8dis+5qLeLLnOCtagYQeROQvDlcDg3X/VVEO9Whh4W/z4PAmYQ==} - - '@cspell/dict-django@4.1.0': - resolution: {integrity: sha512-bKJ4gPyrf+1c78Z0Oc4trEB9MuhcB+Yg+uTTWsvhY6O2ncFYbB/LbEZfqhfmmuK/XJJixXfI1laF2zicyf+l0w==} - - '@cspell/dict-docker@1.1.7': - resolution: {integrity: sha512-XlXHAr822euV36GGsl2J1CkBIVg3fZ6879ZOg5dxTIssuhUOCiV2BuzKZmt6aIFmcdPmR14+9i9Xq+3zuxeX0A==} - - '@cspell/dict-dotnet@5.0.0': - resolution: {integrity: sha512-EOwGd533v47aP5QYV8GlSSKkmM9Eq8P3G/eBzSpH3Nl2+IneDOYOBLEUraHuiCtnOkNsz0xtZHArYhAB2bHWAw==} - - '@cspell/dict-elixir@4.0.3': - resolution: {integrity: sha512-g+uKLWvOp9IEZvrIvBPTr/oaO6619uH/wyqypqvwpmnmpjcfi8+/hqZH8YNKt15oviK8k4CkINIqNhyndG9d9Q==} - - '@cspell/dict-en-common-misspellings@2.0.0': - resolution: {integrity: sha512-NOg8dlv37/YqLkCfBs5OXeJm/Wcfb/CzeOmOZJ2ZXRuxwsNuolb4TREUce0yAXRqMhawahY5TSDRJJBgKjBOdw==} - - '@cspell/dict-en-gb@1.1.33': - resolution: {integrity: sha512-tKSSUf9BJEV+GJQAYGw5e+ouhEe2ZXE620S7BLKe3ZmpnjlNG9JqlnaBhkIMxKnNFkLY2BP/EARzw31AZnOv4g==} - - '@cspell/dict-en_us@4.3.19': - resolution: {integrity: sha512-tHcXdkmm0t9LlRct1vgu3+h0KW/wlXCInkTiR4D/rl730q1zu2qVEgiy1saMiTUSNmdu7Hiy+Mhb+1braVqnZQ==} - - '@cspell/dict-filetypes@3.0.3': - resolution: {integrity: sha512-J9UP+qwwBLfOQ8Qg9tAsKtSY/WWmjj21uj6zXTI9hRLD1eG1uUOLcfVovAmtmVqUWziPSKMr87F6SXI3xmJXgw==} - - '@cspell/dict-fonts@4.0.0': - resolution: {integrity: sha512-t9V4GeN/m517UZn63kZPUYP3OQg5f0OBLSd3Md5CU3eH1IFogSvTzHHnz4Wqqbv8NNRiBZ3HfdY/pqREZ6br3Q==} - - '@cspell/dict-fsharp@1.0.1': - resolution: {integrity: sha512-23xyPcD+j+NnqOjRHgW3IU7Li912SX9wmeefcY0QxukbAxJ/vAN4rBpjSwwYZeQPAn3fxdfdNZs03fg+UM+4yQ==} - - '@cspell/dict-fullstack@3.1.5': - resolution: {integrity: sha512-6ppvo1dkXUZ3fbYn/wwzERxCa76RtDDl5Afzv2lijLoijGGUw5yYdLBKJnx8PJBGNLh829X352ftE7BElG4leA==} - - '@cspell/dict-gaming-terms@1.0.5': - resolution: {integrity: sha512-C3riccZDD3d9caJQQs1+MPfrUrQ+0KHdlj9iUR1QD92FgTOF6UxoBpvHUUZ9YSezslcmpFQK4xQQ5FUGS7uWfw==} - - '@cspell/dict-git@3.0.0': - resolution: {integrity: sha512-simGS/lIiXbEaqJu9E2VPoYW1OTC2xrwPPXNXFMa2uo/50av56qOuaxDrZ5eH1LidFXwoc8HROCHYeKoNrDLSw==} - - '@cspell/dict-golang@6.0.5': - resolution: {integrity: sha512-w4mEqGz4/wV+BBljLxduFNkMrd3rstBNDXmoX5kD4UTzIb4Sy0QybWCtg2iVT+R0KWiRRA56QKOvBsgXiddksA==} - - '@cspell/dict-haskell@4.0.1': - resolution: {integrity: sha512-uRrl65mGrOmwT7NxspB4xKXFUenNC7IikmpRZW8Uzqbqcu7ZRCUfstuVH7T1rmjRgRkjcIjE4PC11luDou4wEQ==} - - '@cspell/dict-html-symbol-entities@4.0.0': - resolution: {integrity: sha512-HGRu+48ErJjoweR5IbcixxETRewrBb0uxQBd6xFGcxbEYCX8CnQFTAmKI5xNaIt2PKaZiJH3ijodGSqbKdsxhw==} - - '@cspell/dict-html@4.0.5': - resolution: {integrity: sha512-p0brEnRybzSSWi8sGbuVEf7jSTDmXPx7XhQUb5bgG6b54uj+Z0Qf0V2n8b/LWwIPJNd1GygaO9l8k3HTCy1h4w==} - - '@cspell/dict-java@5.0.6': - resolution: {integrity: sha512-kdE4AHHHrixyZ5p6zyms1SLoYpaJarPxrz8Tveo6gddszBVVwIUZ+JkQE1bWNLK740GWzIXdkznpUfw1hP9nXw==} - - '@cspell/dict-julia@1.0.1': - resolution: {integrity: sha512-4JsCLCRhhLMLiaHpmR7zHFjj1qOauzDI5ZzCNQS31TUMfsOo26jAKDfo0jljFAKgw5M2fEG7sKr8IlPpQAYrmQ==} - - '@cspell/dict-k8s@1.0.2': - resolution: {integrity: sha512-tLT7gZpNPnGa+IIFvK9SP1LrSpPpJ94a/DulzAPOb1Q2UBFwdpFd82UWhio0RNShduvKG/WiMZf/wGl98pn+VQ==} - - '@cspell/dict-latex@4.0.0': - resolution: {integrity: sha512-LPY4y6D5oI7D3d+5JMJHK/wxYTQa2lJMSNxps2JtuF8hbAnBQb3igoWEjEbIbRRH1XBM0X8dQqemnjQNCiAtxQ==} - - '@cspell/dict-lorem-ipsum@4.0.0': - resolution: {integrity: sha512-1l3yjfNvMzZPibW8A7mQU4kTozwVZVw0AvFEdy+NcqtbxH+TvbSkNMqROOFWrkD2PjnKG0+Ea0tHI2Pi6Gchnw==} - - '@cspell/dict-lua@4.0.3': - resolution: {integrity: sha512-lDHKjsrrbqPaea13+G9s0rtXjMO06gPXPYRjRYawbNmo4E/e3XFfVzeci3OQDQNDmf2cPOwt9Ef5lu2lDmwfJg==} - - '@cspell/dict-makefile@1.0.0': - resolution: {integrity: sha512-3W9tHPcSbJa6s0bcqWo6VisEDTSN5zOtDbnPabF7rbyjRpNo0uHXHRJQF8gAbFzoTzBBhgkTmrfSiuyQm7vBUQ==} - - '@cspell/dict-monkeyc@1.0.6': - resolution: {integrity: sha512-oO8ZDu/FtZ55aq9Mb67HtaCnsLn59xvhO/t2mLLTHAp667hJFxpp7bCtr2zOrR1NELzFXmKln/2lw/PvxMSvrA==} - - '@cspell/dict-node@4.0.3': - resolution: {integrity: sha512-sFlUNI5kOogy49KtPg8SMQYirDGIAoKBO3+cDLIwD4MLdsWy1q0upc7pzGht3mrjuyMiPRUV14Bb0rkVLrxOhg==} - - '@cspell/dict-npm@5.0.15': - resolution: {integrity: sha512-sX0X5YWNW54F4baW7b5JJB6705OCBIZtUqjOghlJNORS5No7QY1IX1zc5FxNNu4gsaCZITAmfMi4ityXEsEThA==} - - '@cspell/dict-php@4.0.6': - resolution: {integrity: sha512-ySAXisf7twoVFZqBV2o/DKiCLIDTHNqfnj0EfH9OoOUR7HL3rb6zJkm0viLUFDO2G/8SyIi6YrN/6KX+Scjjjg==} - - '@cspell/dict-powershell@5.0.3': - resolution: {integrity: sha512-lEdzrcyau6mgzu1ie98GjOEegwVHvoaWtzQnm1ie4DyZgMr+N6D0Iyj1lzvtmt0snvsDFa5F2bsYzf3IMKcpcA==} - - '@cspell/dict-public-licenses@2.0.6': - resolution: {integrity: sha512-bHqpSpJvLCUcWxj1ov/Ki8WjmESpYwRpQlqfdchekOTc93Huhvjm/RXVN1R4fVf4Hspyem1QVkCGqAmjJMj6sw==} - - '@cspell/dict-python@4.1.11': - resolution: {integrity: sha512-XG+v3PumfzUW38huSbfT15Vqt3ihNb462ulfXifpQllPok5OWynhszCLCRQjQReV+dgz784ST4ggRxW452/kVg==} - - '@cspell/dict-r@2.0.1': - resolution: {integrity: sha512-KCmKaeYMLm2Ip79mlYPc8p+B2uzwBp4KMkzeLd5E6jUlCL93Y5Nvq68wV5fRLDRTf7N1LvofkVFWfDcednFOgA==} - - '@cspell/dict-ruby@5.0.2': - resolution: {integrity: sha512-cIh8KTjpldzFzKGgrqUX4bFyav5lC52hXDKo4LbRuMVncs3zg4hcSf4HtURY+f2AfEZzN6ZKzXafQpThq3dl2g==} - - '@cspell/dict-rust@4.0.2': - resolution: {integrity: sha512-RhziKDrklzOntxAbY3AvNR58wnFGIo3YS8+dNeLY36GFuWOvXDHFStYw5Pod4f/VXbO/+1tXtywCC4zWfB2p1w==} - - '@cspell/dict-scala@5.0.0': - resolution: {integrity: sha512-ph0twaRoV+ylui022clEO1dZ35QbeEQaKTaV2sPOsdwIokABPIiK09oWwGK9qg7jRGQwVaRPEq0Vp+IG1GpqSQ==} - - '@cspell/dict-software-terms@3.3.20': - resolution: {integrity: sha512-KmPwCxYWEu7SGyT/0m/n6i6R4ZgxbmN3XcerzA6Z629Wm5iZTVfJaMWqDK2RKAyBawS7OMfxGz0W/wYU4FhJlA==} - - '@cspell/dict-sql@2.1.3': - resolution: {integrity: sha512-SEyTNKJrjqD6PAzZ9WpdSu6P7wgdNtGV2RV8Kpuw1x6bV+YsSptuClYG+JSdRExBTE6LwIe1bTklejUp3ZP8TQ==} - - '@cspell/dict-svelte@1.0.2': - resolution: {integrity: sha512-rPJmnn/GsDs0btNvrRBciOhngKV98yZ9SHmg8qI6HLS8hZKvcXc0LMsf9LLuMK1TmS2+WQFAan6qeqg6bBxL2Q==} - - '@cspell/dict-swift@2.0.1': - resolution: {integrity: sha512-gxrCMUOndOk7xZFmXNtkCEeroZRnS2VbeaIPiymGRHj5H+qfTAzAKxtv7jJbVA3YYvEzWcVE2oKDP4wcbhIERw==} - - '@cspell/dict-terraform@1.0.0': - resolution: {integrity: sha512-Ak+vy4HP/bOgzf06BAMC30+ZvL9mzv21xLM2XtfnBLTDJGdxlk/nK0U6QT8VfFLqJ0ZZSpyOxGsUebWDCTr/zQ==} - - '@cspell/dict-typescript@3.1.4': - resolution: {integrity: sha512-jUcPa0rsPca5ur1+G56DXnSc5hbbJkzvPHHvyQtkbPXBQd3CXPMNfrTVCgzex/7cY/7FONcpFCUwgwfni9Jqbw==} - - '@cspell/dict-vue@3.0.0': - resolution: {integrity: sha512-niiEMPWPV9IeRBRzZ0TBZmNnkK3olkOPYxC1Ny2AX4TGlYRajcW0WUtoSHmvvjZNfWLSg2L6ruiBeuPSbjnG6A==} - - '@cspell/dynamic-import@8.7.0': - resolution: {integrity: sha512-xlEPdiHVDu+4xYkvwjL9MgklxOi9XB+Pr1H9s3Ww9WEq+q6BA3xOHxLIU/k8mhqFTMZGFZRCsdy/EwMu6SyRhQ==} - engines: {node: '>=18.0'} - - '@cspell/strong-weak-map@8.7.0': - resolution: {integrity: sha512-0bo0WwDr2lzGoCP7vbpWbDpPyuOrHKK+218txnUpx6Pn1EDBLfcDQsiZED5B6zlpwgbGi6y3vc0rWtJbjKvwzg==} - engines: {node: '>=18'} - - '@double-great/alt-text@3.1.0': - resolution: {integrity: sha512-5gSW9AI0KUO2GQe9K+KjyiCisxl4xL0kesQCxUsko4T9s8zler/stW0qcH5XryUgtKebb293qX9sz1nCmQpdTw==} - - '@double-great/remark-lint-alt-text@1.0.0': - resolution: {integrity: sha512-2FFjSX2VhT/USmsOEkcw40SiCHXXio2sWs4S7docKNFh+W7/z+bHYau+UHfrP4yDRVzfUVSV1MKnsxmigkhixg==} - - '@eslint-community/eslint-utils@4.4.0': - resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - - '@eslint-community/regexpp@4.10.0': - resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} - engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - - '@eslint/eslintrc@2.1.4': - resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - '@eslint/js@8.57.0': - resolution: {integrity: sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - '@eth-optimism/contracts-bedrock@0.17.2': - resolution: {integrity: sha512-YVwPHpBZgFwFX9qY8+iToVAAH7mSnVIVmih+YfHhqjAhlLvLZfYjvj+hRNgcB9eRyl1SOOB0jevp4JOOV1v2BA==} - - '@eth-optimism/contracts-ts@0.17.2': - resolution: {integrity: sha512-5aM+pn1uK8Hx9r9+PHCF6NQTYKVHmrm7Gc7LQ6sO9MQItVP1WdIWNcQYT7TQhkxGKHYG2arF06rbHGeGNqzBeg==} - peerDependencies: - '@wagmi/core': ^2.6.3 - wagmi: ^2.5.5 - peerDependenciesMeta: - '@wagmi/core': - optional: true - wagmi: - optional: true - - '@eth-optimism/contracts@0.6.0': - resolution: {integrity: sha512-vQ04wfG9kMf1Fwy3FEMqH2QZbgS0gldKhcBeBUPfO8zu68L61VI97UDXmsMQXzTsEAxK8HnokW3/gosl4/NW3w==} - peerDependencies: - ethers: ^5 - - '@eth-optimism/core-utils@0.12.0': - resolution: {integrity: sha512-qW+7LZYCz7i8dRa7SRlUKIo1VBU8lvN0HeXCxJR+z+xtMzMQpPds20XJNCMclszxYQHkXY00fOT6GvFw9ZL6nw==} - - '@eth-optimism/core-utils@0.13.2': - resolution: {integrity: sha512-u7TOKm1RxH1V5zw7dHmfy91bOuEAZU68LT/9vJPkuWEjaTl+BgvPDRDTurjzclHzN0GbWdcpOqPZg4ftjkJGaw==} - - '@eth-optimism/sdk@3.3.0': - resolution: {integrity: sha512-0Wt9roWe3itdzp08caCQLoFqhmT47ssquKAzBe7yXI6saVL+f2vWl6VgEaq0aYe2FsWvD9L0tSAJHLx1FiquNw==} - peerDependencies: - ethers: ^5 - - '@eth-optimism/tokenlist@9.0.51': - resolution: {integrity: sha512-GfKk4euEfNLniyRisP7sB/N9Kp96M+2t529mkvwC6nXITouzH4faDP8JdtwU6AOcgC4UlrFjXJ9w8ecnWWNQbw==} - - '@ethereumjs/rlp@4.0.1': - resolution: {integrity: sha512-tqsQiBQDQdmPWE1xkkBq4rlSW5QZpLOUJ5RJh2/9fug+q9tnUhuZoVLk7s0scUIKTOzEtR72DFBXI4WiZcMpvw==} - engines: {node: '>=14'} - hasBin: true - - '@ethereumjs/util@8.1.0': - resolution: {integrity: sha512-zQ0IqbdX8FZ9aw11vP+dZkKDkS+kgIvQPHnSAXzP9pLu+Rfu3D3XEeLbicvoXJTYnhZiPmsZUxgdzXwNKxRPbA==} - engines: {node: '>=14'} - - '@ethersproject/abi@5.7.0': - resolution: {integrity: sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA==} - - '@ethersproject/abstract-provider@5.7.0': - resolution: {integrity: sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw==} - - '@ethersproject/abstract-signer@5.7.0': - resolution: {integrity: sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ==} - - '@ethersproject/address@5.7.0': - resolution: {integrity: sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==} - - '@ethersproject/base64@5.7.0': - resolution: {integrity: sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ==} - - '@ethersproject/basex@5.7.0': - resolution: {integrity: sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw==} - - '@ethersproject/bignumber@5.7.0': - resolution: {integrity: sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw==} - - '@ethersproject/bytes@5.7.0': - resolution: {integrity: sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A==} - - '@ethersproject/constants@5.7.0': - resolution: {integrity: sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA==} - - '@ethersproject/contracts@5.7.0': - resolution: {integrity: sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg==} - - '@ethersproject/hash@5.7.0': - resolution: {integrity: sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g==} - - '@ethersproject/hdnode@5.7.0': - resolution: {integrity: sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg==} - - '@ethersproject/json-wallets@5.7.0': - resolution: {integrity: sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g==} - - '@ethersproject/keccak256@5.7.0': - resolution: {integrity: sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg==} - - '@ethersproject/logger@5.7.0': - resolution: {integrity: sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig==} - - '@ethersproject/networks@5.7.1': - resolution: {integrity: sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ==} - - '@ethersproject/pbkdf2@5.7.0': - resolution: {integrity: sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw==} - - '@ethersproject/properties@5.7.0': - resolution: {integrity: sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw==} - - '@ethersproject/providers@5.7.2': - resolution: {integrity: sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg==} - - '@ethersproject/random@5.7.0': - resolution: {integrity: sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ==} - - '@ethersproject/rlp@5.7.0': - resolution: {integrity: sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w==} - - '@ethersproject/sha2@5.7.0': - resolution: {integrity: sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw==} - - '@ethersproject/signing-key@5.7.0': - resolution: {integrity: sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q==} - - '@ethersproject/solidity@5.7.0': - resolution: {integrity: sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA==} - - '@ethersproject/strings@5.7.0': - resolution: {integrity: sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg==} - - '@ethersproject/transactions@5.7.0': - resolution: {integrity: sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ==} - - '@ethersproject/units@5.7.0': - resolution: {integrity: sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg==} - - '@ethersproject/wallet@5.7.0': - resolution: {integrity: sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA==} - - '@ethersproject/web@5.7.1': - resolution: {integrity: sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w==} - - '@ethersproject/wordlists@5.7.0': - resolution: {integrity: sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA==} - - '@feelback/js@0.3.4': - resolution: {integrity: sha512-xr7gTqSJcVUYQlELs1TntYovCBjMcYUr/hGKTnDoF64/lig5CbX4bOmqLoF50IImCy5q3oIwg9w+TSFvtBwsIA==} - - '@feelback/react@0.3.4': - resolution: {integrity: sha512-ZWzUQAmPwl4nYR2olzBKddHzoLtGW/2pb8TiesiJCirxhaDW2E/XBx2ZaB4fL5TGXtjBt4eYq/qZxJZ0fIE0kg==} - engines: {node: '>=14'} - peerDependencies: - react: '>=17' - - '@floating-ui/core@1.6.2': - resolution: {integrity: sha512-+2XpQV9LLZeanU4ZevzRnGFg2neDeKHgFLjP6YLW+tly0IvrhqT4u8enLGjLH3qeh85g19xY5rsAusfwTdn5lg==} - - '@floating-ui/dom@1.6.5': - resolution: {integrity: sha512-Nsdud2X65Dz+1RHjAIP0t8z5e2ff/IRbei6BqFrl1urT8sDVzM1HMQ+R0XcU5ceRfyO3I6ayeqIfh+6Wb8LGTw==} - - '@floating-ui/react-dom@2.1.0': - resolution: {integrity: sha512-lNzj5EQmEKn5FFKc04+zasr09h/uX8RtJRNj5gUXsSQIXHVWTVh+hVAg1vOMCexkX8EgvemMvIFpQfkosnVNyA==} - peerDependencies: - react: '>=16.8.0' - react-dom: '>=16.8.0' - - '@floating-ui/react@0.26.17': - resolution: {integrity: sha512-ESD+jYWwqwVzaIgIhExrArdsCL1rOAzryG/Sjlu8yaD3Mtqi3uVyhbE2V7jD58Mo52qbzKz2eUY/Xgh5I86FCQ==} - peerDependencies: - react: '>=16.8.0' - react-dom: '>=16.8.0' - - '@floating-ui/utils@0.2.2': - resolution: {integrity: sha512-J4yDIIthosAsRZ5CPYP/jQvUAQtlZTTD/4suA08/FEnlxqW3sKS9iAhgsa9VYLZ6vDHn/ixJgIqRQPotoBjxIw==} - - '@headlessui/react@1.7.19': - resolution: {integrity: sha512-Ll+8q3OlMJfJbAKM/+/Y2q6PPYbryqNTXDbryx7SXLIDamkF6iQFbriYHga0dY44PvDhvvBWCx1Xj4U5+G4hOw==} - engines: {node: '>=10'} - peerDependencies: - react: ^16 || ^17 || ^18 - react-dom: ^16 || ^17 || ^18 - - '@headlessui/react@2.1.10': - resolution: {integrity: sha512-6mLa2fjMDAFQi+/R10B+zU3edsUk/MDtENB2zHho0lqKU1uzhAfJLUduWds4nCo8wbl3vULtC5rJfZAQ1yqIng==} - engines: {node: '>=10'} - peerDependencies: - react: ^18 - react-dom: ^18 - - '@humanwhocodes/config-array@0.11.14': - resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} - engines: {node: '>=10.10.0'} - deprecated: Use @eslint/config-array instead - - '@humanwhocodes/module-importer@1.0.1': - resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} - engines: {node: '>=12.22'} - - '@humanwhocodes/object-schema@2.0.3': - resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} - deprecated: Use @eslint/object-schema instead - - '@isaacs/cliui@8.0.2': - resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} - engines: {node: '>=12'} - - '@jsdevtools/ono@7.1.3': - resolution: {integrity: sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==} - - '@mdx-js/mdx@2.3.0': - resolution: {integrity: sha512-jLuwRlz8DQfQNiUCJR50Y09CGPq3fLtmtUQfVrj79E0JWu3dvsVcxVIcfhR5h0iXu+/z++zDrYeiJqifRynJkA==} - - '@mdx-js/react@2.3.0': - resolution: {integrity: sha512-zQH//gdOmuu7nt2oJR29vFhDv88oGPmVw6BggmrHeMI+xgEkp1B2dX9/bMBSYtK0dyLX/aOmesKS09g222K1/g==} - peerDependencies: - react: '>=16' - - '@napi-rs/simple-git-android-arm-eabi@0.1.16': - resolution: {integrity: sha512-dbrCL0Pl5KZG7x7tXdtVsA5CO6At5ohDX3myf5xIYn9kN4jDFxsocl8bNt6Vb/hZQoJd8fI+k5VlJt+rFhbdVw==} - engines: {node: '>= 10'} - cpu: [arm] - os: [android] - - '@napi-rs/simple-git-android-arm64@0.1.16': - resolution: {integrity: sha512-xYz+TW5J09iK8SuTAKK2D5MMIsBUXVSs8nYp7HcMi8q6FCRO7yJj96YfP9PvKsc/k64hOyqGmL5DhCzY9Cu1FQ==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [android] - - '@napi-rs/simple-git-darwin-arm64@0.1.16': - resolution: {integrity: sha512-XfgsYqxhUE022MJobeiX563TJqyQyX4FmYCnqrtJwAfivESVeAJiH6bQIum8dDEYMHXCsG7nL8Ok0Dp8k2m42g==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [darwin] - - '@napi-rs/simple-git-darwin-x64@0.1.16': - resolution: {integrity: sha512-tkEVBhD6vgRCbeWsaAQqM3bTfpIVGeitamPPRVSbsq8qgzJ5Dx6ZedH27R7KSsA/uao7mZ3dsrNLXbu1Wy5MzA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [darwin] - - '@napi-rs/simple-git-linux-arm-gnueabihf@0.1.16': - resolution: {integrity: sha512-R6VAyNnp/yRaT7DV1Ao3r67SqTWDa+fNq2LrNy0Z8gXk2wB9ZKlrxFtLPE1WSpWknWtyRDLpRlsorh7Evk7+7w==} - engines: {node: '>= 10'} - cpu: [arm] - os: [linux] - - '@napi-rs/simple-git-linux-arm64-gnu@0.1.16': - resolution: {integrity: sha512-LAGI0opFKw/HBMCV2qIBK3uWSEW9h4xd2ireZKLJy8DBPymX6NrWIamuxYNyCuACnFdPRxR4LaRFy4J5ZwuMdw==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - - '@napi-rs/simple-git-linux-arm64-musl@0.1.16': - resolution: {integrity: sha512-I57Ph0F0Yn2KW93ep+V1EzKhACqX0x49vvSiapqIsdDA2PifdEWLc1LJarBolmK7NKoPqKmf6lAKKO9lhiZzkg==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - - '@napi-rs/simple-git-linux-x64-gnu@0.1.16': - resolution: {integrity: sha512-AZYYFY2V7hlcQASPEOWyOa3e1skzTct9QPzz0LiDM3f/hCFY/wBaU2M6NC5iG3d2Kr38heuyFS/+JqxLm5WaKA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - - '@napi-rs/simple-git-linux-x64-musl@0.1.16': - resolution: {integrity: sha512-9TyMcYSBJwjT8jwjY9m24BZbu7ozyWTjsmYBYNtK3B0Um1Ov6jthSNneLVvouQ6x+k3Ow+00TiFh6bvmT00r8g==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - - '@napi-rs/simple-git-win32-arm64-msvc@0.1.16': - resolution: {integrity: sha512-uslJ1WuAHCYJWui6xjsyT47SjX6KOHDtClmNO8hqKz1pmDSNY7AjyUY8HxvD1lK9bDnWwc4JYhikS9cxCqHybw==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [win32] - - '@napi-rs/simple-git-win32-x64-msvc@0.1.16': - resolution: {integrity: sha512-SoEaVeCZCDF1MP+M9bMSXsZWgEjk4On9GWADO5JOulvzR1bKjk0s9PMHwe/YztR9F0sJzrCxwtvBZowhSJsQPg==} - engines: {node: '>= 10'} - cpu: [x64] - os: [win32] - - '@napi-rs/simple-git@0.1.16': - resolution: {integrity: sha512-C5wRPw9waqL2jk3jEDeJv+f7ScuO3N0a39HVdyFLkwKxHH4Sya4ZbzZsu2JLi6eEqe7RuHipHL6mC7B2OfYZZw==} - engines: {node: '>= 10'} - - '@next/env@13.5.6': - resolution: {integrity: sha512-Yac/bV5sBGkkEXmAX5FWPS9Mmo2rthrOPRQQNfycJPkjUAUclomCPH7QFVCDQ4Mp2k2K1SSM6m0zrxYrOwtFQw==} - - '@next/env@14.2.10': - resolution: {integrity: sha512-dZIu93Bf5LUtluBXIv4woQw2cZVZ2DJTjax5/5DOs3lzEOeKLy7GxRSr4caK9/SCPdaW6bCgpye6+n4Dh9oJPw==} - - '@next/swc-darwin-arm64@14.2.10': - resolution: {integrity: sha512-V3z10NV+cvMAfxQUMhKgfQnPbjw+Ew3cnr64b0lr8MDiBJs3eLnM6RpGC46nhfMZsiXgQngCJKWGTC/yDcgrDQ==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [darwin] - - '@next/swc-darwin-x64@14.2.10': - resolution: {integrity: sha512-Y0TC+FXbFUQ2MQgimJ/7Ina2mXIKhE7F+GUe1SgnzRmwFY3hX2z8nyVCxE82I2RicspdkZnSWMn4oTjIKz4uzA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [darwin] - - '@next/swc-linux-arm64-gnu@14.2.10': - resolution: {integrity: sha512-ZfQ7yOy5zyskSj9rFpa0Yd7gkrBnJTkYVSya95hX3zeBG9E55Z6OTNPn1j2BTFWvOVVj65C3T+qsjOyVI9DQpA==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - - '@next/swc-linux-arm64-musl@14.2.10': - resolution: {integrity: sha512-n2i5o3y2jpBfXFRxDREr342BGIQCJbdAUi/K4q6Env3aSx8erM9VuKXHw5KNROK9ejFSPf0LhoSkU/ZiNdacpQ==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - - '@next/swc-linux-x64-gnu@14.2.10': - resolution: {integrity: sha512-GXvajAWh2woTT0GKEDlkVhFNxhJS/XdDmrVHrPOA83pLzlGPQnixqxD8u3bBB9oATBKB//5e4vpACnx5Vaxdqg==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - - '@next/swc-linux-x64-musl@14.2.10': - resolution: {integrity: sha512-opFFN5B0SnO+HTz4Wq4HaylXGFV+iHrVxd3YvREUX9K+xfc4ePbRrxqOuPOFjtSuiVouwe6uLeDtabjEIbkmDA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - - '@next/swc-win32-arm64-msvc@14.2.10': - resolution: {integrity: sha512-9NUzZuR8WiXTvv+EiU/MXdcQ1XUvFixbLIMNQiVHuzs7ZIFrJDLJDaOF1KaqttoTujpcxljM/RNAOmw1GhPPQQ==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [win32] - - '@next/swc-win32-ia32-msvc@14.2.10': - resolution: {integrity: sha512-fr3aEbSd1GeW3YUMBkWAu4hcdjZ6g4NBl1uku4gAn661tcxd1bHs1THWYzdsbTRLcCKLjrDZlNp6j2HTfrw+Bg==} - engines: {node: '>= 10'} - cpu: [ia32] - os: [win32] - - '@next/swc-win32-x64-msvc@14.2.10': - resolution: {integrity: sha512-UjeVoRGKNL2zfbcQ6fscmgjBAS/inHBh63mjIlfPg/NG8Yn2ztqylXt5qilYb6hoHIwaU2ogHknHWWmahJjgZQ==} - engines: {node: '>= 10'} - cpu: [x64] - os: [win32] - - '@noble/curves@1.2.0': - resolution: {integrity: sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==} - - '@noble/curves@1.3.0': - resolution: {integrity: sha512-t01iSXPuN+Eqzb4eBX0S5oubSqXbK/xXa1Ne18Hj8f9pStxztHCE2gfboSp/dZRLSqfuLpRK2nDXDK+W9puocA==} - - '@noble/hashes@1.3.2': - resolution: {integrity: sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==} - engines: {node: '>= 16'} - - '@noble/hashes@1.3.3': - resolution: {integrity: sha512-V7/fPHgl+jsVPXqqeOzT8egNj2iBIVt+ECeMMG8TdcnTikP3oaBtUVqpT/gYCR68aEBJSF+XbYUxStjbFMqIIA==} - engines: {node: '>= 16'} - - '@noble/hashes@1.4.0': - resolution: {integrity: sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==} - engines: {node: '>= 16'} - - '@nodelib/fs.scandir@2.1.5': - resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} - engines: {node: '>= 8'} - - '@nodelib/fs.stat@2.0.5': - resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} - engines: {node: '>= 8'} - - '@nodelib/fs.walk@1.2.8': - resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} - engines: {node: '>= 8'} - - '@npmcli/config@6.4.1': - resolution: {integrity: sha512-uSz+elSGzjCMANWa5IlbGczLYPkNI/LeR+cHrgaTqTrTSh9RHhOFA4daD2eRUz6lMtOW+Fnsb+qv7V2Zz8ML0g==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - - '@npmcli/map-workspaces@3.0.6': - resolution: {integrity: sha512-tkYs0OYnzQm6iIRdfy+LcLBjcKuQCeE5YLb8KnrIlutJfheNaPvPpgoFEyEFgbjzl5PLZ3IA/BWAwRU0eHuQDA==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - - '@npmcli/name-from-folder@2.0.0': - resolution: {integrity: sha512-pwK+BfEBZJbKdNYpHHRTNBwBoqrN/iIMO0AiGvYsp3Hoaq0WbgGSWQR6SCldZovoDpY3yje5lkFUe6gsDgJ2vg==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - - '@pkgjs/parseargs@0.11.0': - resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} - engines: {node: '>=14'} - - '@pkgr/core@0.1.1': - resolution: {integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==} - engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} - - '@popperjs/core@2.11.8': - resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==} - - '@react-aria/focus@3.17.1': - resolution: {integrity: sha512-FLTySoSNqX++u0nWZJPPN5etXY0WBxaIe/YuL/GTEeuqUIuC/2bJSaw5hlsM6T2yjy6Y/VAxBcKSdAFUlU6njQ==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - - '@react-aria/interactions@3.21.3': - resolution: {integrity: sha512-BWIuf4qCs5FreDJ9AguawLVS0lV9UU+sK4CCnbCNNmYqOWY+1+gRXCsnOM32K+oMESBxilAjdHW5n1hsMqYMpA==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - - '@react-aria/ssr@3.9.4': - resolution: {integrity: sha512-4jmAigVq409qcJvQyuorsmBR4+9r3+JEC60wC+Y0MZV0HCtTmm8D9guYXlJMdx0SSkgj0hHAyFm/HvPNFofCoQ==} - engines: {node: '>= 12'} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - - '@react-aria/utils@3.24.1': - resolution: {integrity: sha512-O3s9qhPMd6n42x9sKeJ3lhu5V1Tlnzhu6Yk8QOvDuXf7UGuUjXf9mzfHJt1dYzID4l9Fwm8toczBzPM9t0jc8Q==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - - '@react-stately/utils@3.10.1': - resolution: {integrity: sha512-VS/EHRyicef25zDZcM/ClpzYMC5i2YGN6uegOeQawmgfGjb02yaCX0F0zR69Pod9m2Hr3wunTbtpgVXvYbZItg==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - - '@react-types/shared@3.23.1': - resolution: {integrity: sha512-5d+3HbFDxGZjhbMBeFHRQhexMFt4pUce3okyRtUVKbbedQFUrtXSBg9VszgF2RTeQDKDkMCIQDtz5ccP/Lk1gw==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - - '@scure/base@1.1.6': - resolution: {integrity: sha512-ok9AWwhcgYuGG3Zfhyqg+zwl+Wn5uE+dwC0NV/2qQkx4dABbb/bx96vWu8NSj+BNjjSjno+JRYRjle1jV08k3g==} - - '@scure/bip32@1.3.2': - resolution: {integrity: sha512-N1ZhksgwD3OBlwTv3R6KFEcPojl/W4ElJOeCZdi+vuI5QmTFwLq3OFf2zd2ROpKvxFdgZ6hUpb0dx9bVNEwYCA==} - - '@scure/bip32@1.3.3': - resolution: {integrity: sha512-LJaN3HwRbfQK0X1xFSi0Q9amqOgzQnnDngIt+ZlsBC3Bm7/nE7K0kwshZHyaru79yIVRv/e1mQAjZyuZG6jOFQ==} - - '@scure/bip39@1.2.1': - resolution: {integrity: sha512-Z3/Fsz1yr904dduJD0NpiyRHhRYHdcnyh73FZWiV+/qhWi83wNJ3NWolYqCEN+ZWsUz2TWwajJggcRE9r1zUYg==} - - '@scure/bip39@1.2.2': - resolution: {integrity: sha512-HYf9TUXG80beW+hGAt3TRM8wU6pQoYur9iNypTROm42dorCGmLnFe3eWjz3gOq6G62H2WRh0FCzAR1PI+29zIA==} - - '@swc/counter@0.1.3': - resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} - - '@swc/helpers@0.5.2': - resolution: {integrity: sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==} - - '@swc/helpers@0.5.5': - resolution: {integrity: sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A==} - - '@tanstack/react-virtual@3.10.8': - resolution: {integrity: sha512-VbzbVGSsZlQktyLrP5nxE+vE1ZR+U0NFAWPbJLoG2+DKPwd2D7dVICTVIIaYlJqX1ZCEnYDbaOpmMwbsyhBoIA==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - - '@tanstack/react-virtual@3.5.0': - resolution: {integrity: sha512-rtvo7KwuIvqK9zb0VZ5IL7fiJAEnG+0EiFZz8FUOs+2mhGqdGmjKIaT1XU7Zq0eFqL0jonLlhbayJI/J2SA/Bw==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - - '@tanstack/virtual-core@3.10.8': - resolution: {integrity: sha512-PBu00mtt95jbKFi6Llk9aik8bnR3tR/oQP1o3TSi+iG//+Q2RTIzCEgKkHG8BB86kxMNW6O8wku+Lmi+QFR6jA==} - - '@tanstack/virtual-core@3.5.0': - resolution: {integrity: sha512-KnPRCkQTyqhanNC0K63GBG3wA8I+D1fQuVnAvcBF8f13akOKeQp1gSbu6f77zCxhEk727iV5oQnbHLYzHrECLg==} - - '@testing-library/dom@9.3.4': - resolution: {integrity: sha512-FlS4ZWlp97iiNWig0Muq8p+3rVDjRiYE+YKGbAqXOu9nwJFFOdL00kFpz42M+4huzYi86vAK1sOOfyOG45muIQ==} - engines: {node: '>=14'} - - '@testing-library/react@14.3.1': - resolution: {integrity: sha512-H99XjUhWQw0lTgyMN05W3xQG1Nh4lq574D8keFf1dDoNTJgp66VbJozRaczoF+wsiaPJNt/TcnfpLGufGxSrZQ==} - engines: {node: '>=14'} - peerDependencies: - react: ^18.0.0 - react-dom: ^18.0.0 - - '@theguild/remark-mermaid@0.0.5': - resolution: {integrity: sha512-e+ZIyJkEv9jabI4m7q29wZtZv+2iwPGsXJ2d46Zi7e+QcFudiyuqhLhHG/3gX3ZEB+hxTch+fpItyMS8jwbIcw==} - peerDependencies: - react: ^18.2.0 - - '@theguild/remark-npm2yarn@0.2.1': - resolution: {integrity: sha512-jUTFWwDxtLEFtGZh/TW/w30ySaDJ8atKWH8dq2/IiQF61dPrGfETpl0WxD0VdBfuLOeU14/kop466oBSRO/5CA==} - - '@types/acorn@4.0.6': - resolution: {integrity: sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ==} - - '@types/aria-query@5.0.4': - resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==} - - '@types/change-case@2.3.1': - resolution: {integrity: sha512-HYiGjhmGInNzJjtt6ciXEfl2s8ZQGUQpPiwgWSth1fycE69hXbV/RgWH7MvSq2QPhMBzi4SGhu1vE+cMx1xB8g==} - deprecated: This is a stub types definition for change-case (https://github.com/blakeembrey/change-case). change-case provides its own type definitions, so you don't need @types/change-case installed! - - '@types/concat-stream@2.0.3': - resolution: {integrity: sha512-3qe4oQAPNwVNwK4C9c8u+VJqv9kez+2MR4qJpoPFfXtgxxif1QbFusvXzK0/Wra2VX07smostI2VMmJNSpZjuQ==} - - '@types/d3-scale-chromatic@3.0.3': - resolution: {integrity: sha512-laXM4+1o5ImZv3RpFAsTRn3TEkzqkytiOY0Dz0sq5cnd1dtNlk6sHLon4OvqaiJb28T0S/TdsBI3Sjsy+keJrw==} - - '@types/d3-scale@4.0.8': - resolution: {integrity: sha512-gkK1VVTr5iNiYJ7vWDI+yUFFlszhNMtVeneJ6lUTKPjprsvLLI9/tgEGiXJOnlINJA8FyA88gfnQsHbybVZrYQ==} - - '@types/d3-time@3.0.3': - resolution: {integrity: sha512-2p6olUZ4w3s+07q3Tm2dbiMZy5pCDfYwtLXXHUnVzXgQlZ/OyPtUz6OL382BkOuGlLXqfT+wqv8Fw2v8/0geBw==} - - '@types/debug@4.1.12': - resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} - - '@types/estree-jsx@1.0.5': - resolution: {integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==} - - '@types/estree@1.0.5': - resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} - - '@types/hast@2.3.10': - resolution: {integrity: sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw==} - - '@types/hast@3.0.4': - resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} - - '@types/is-empty@1.2.3': - resolution: {integrity: sha512-4J1l5d79hoIvsrKh5VUKVRA1aIdsOb10Hu5j3J2VfP/msDnfTdGPmNp2E1Wg+vs97Bktzo+MZePFFXSGoykYJw==} - - '@types/js-yaml@4.0.9': - resolution: {integrity: sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==} - - '@types/json-schema@7.0.15': - resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - - '@types/katex@0.16.7': - resolution: {integrity: sha512-HMwFiRujE5PjrgwHQ25+bsLJgowjGjm5Z8FVSf0N6PwgJrwxH0QxzHYDcKsTfV3wva0vzrpqMTJS2jXPr5BMEQ==} - - '@types/lodash.clonedeep@4.5.9': - resolution: {integrity: sha512-19429mWC+FyaAhOLzsS8kZUsI+/GmBAQ0HFiCPsKGU+7pBXOQWhyrY6xNNDwUSX8SMZMJvuFVMF9O5dQOlQK9Q==} - - '@types/lodash@4.17.0': - resolution: {integrity: sha512-t7dhREVv6dbNj0q17X12j7yDG4bD/DHYX7o5/DbDxobP0HnGPgpRz2Ej77aL7TZT3DSw13fqUTj8J4mMnqa7WA==} - - '@types/mdast@3.0.15': - resolution: {integrity: sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==} - - '@types/mdast@4.0.3': - resolution: {integrity: sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg==} - - '@types/mdx@2.0.13': - resolution: {integrity: sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==} - - '@types/ms@0.7.34': - resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==} - - '@types/node@18.11.10': - resolution: {integrity: sha512-juG3RWMBOqcOuXC643OAdSA525V44cVgGV6dUDuiFtss+8Fk5x1hI93Rsld43VeJVIeqlP9I7Fn9/qaVqoEAuQ==} - - '@types/prop-types@15.7.12': - resolution: {integrity: sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==} - - '@types/react-dom@18.3.0': - resolution: {integrity: sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==} - - '@types/react@18.3.1': - resolution: {integrity: sha512-V0kuGBX3+prX+DQ/7r2qsv1NsdfnCLnTgnRJ1pYnxykBhGMz+qj+box5lq7XsO5mtZsBqpjwwTu/7wszPfMBcw==} - - '@types/supports-color@8.1.3': - resolution: {integrity: sha512-Hy6UMpxhE3j1tLpl27exp1XqHD7n8chAiNPzWfz16LPZoMMoSc4dzLl6w9qijkEb/r5O1ozdu1CWGA2L83ZeZg==} - - '@types/unist@2.0.10': - resolution: {integrity: sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==} - - '@types/unist@3.0.2': - resolution: {integrity: sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==} - - '@ungap/structured-clone@1.2.0': - resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} - - abbrev@2.0.0: - resolution: {integrity: sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - - abitype@1.0.0: - resolution: {integrity: sha512-NMeMah//6bJ56H5XRj8QCV4AwuW6hB6zqz2LnhhLdcWVQOsXki6/Pn3APeqxCma62nXIcmZWdu1DlHWS74umVQ==} - peerDependencies: - typescript: '>=5.0.4' - zod: ^3 >=3.22.0 - peerDependenciesMeta: - typescript: - optional: true - zod: - optional: true - - acorn-jsx@5.3.2: - resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} - peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - - acorn@8.11.3: - resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} - engines: {node: '>=0.4.0'} - hasBin: true - - aes-js@3.0.0: - resolution: {integrity: sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==} - - ajv-formats@2.1.1: - resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} - peerDependencies: - ajv: ^8.0.0 - peerDependenciesMeta: - ajv: - optional: true - - ajv@6.12.6: - resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} - - ajv@8.12.0: - resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} - - algoliasearch@4.23.3: - resolution: {integrity: sha512-Le/3YgNvjW9zxIQMRhUHuhiUjAlKY/zsdZpfq4dlLqg6mEm0nL6yk+7f2hDOtLpxsgE4jSzDmvHL7nXdBp5feg==} - - ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} - - ansi-regex@6.0.1: - resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} - engines: {node: '>=12'} - - ansi-sequence-parser@1.1.1: - resolution: {integrity: sha512-vJXt3yiaUL4UU546s3rPXlsry/RnM730G1+HkpKE012AN0sx1eOrxSu95oKDIonskeLTijMgqWZ3uDEe3NFvyg==} - - ansi-styles@3.2.1: - resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} - engines: {node: '>=4'} - - ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} - - ansi-styles@5.2.0: - resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} - engines: {node: '>=10'} - - ansi-styles@6.2.1: - resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} - engines: {node: '>=12'} - - arch@2.2.0: - resolution: {integrity: sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==} - - arg@1.0.0: - resolution: {integrity: sha512-Wk7TEzl1KqvTGs/uyhmHO/3XLd3t1UeU4IstvPXVzGPM522cTjqjNZ99esCkcL52sjqjo8e8CTBcWhkxvGzoAw==} - - argparse@1.0.10: - resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} - - argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - - aria-query@5.1.3: - resolution: {integrity: sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==} - - array-buffer-byte-length@1.0.1: - resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} - engines: {node: '>= 0.4'} - - array-timsort@1.0.3: - resolution: {integrity: sha512-/+3GRL7dDAGEfM6TseQk/U+mi18TU2Ms9I3UlLdUMhz2hbvGNTKdj9xniwXfUqgYhHxRx0+8UnKkvlNwVU+cWQ==} - - array-union@2.1.0: - resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} - engines: {node: '>=8'} - - assertion-error@1.1.0: - resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} - - astring@1.8.6: - resolution: {integrity: sha512-ISvCdHdlTDlH5IpxQJIex7BWBywFWgjJSVdwst+/iQCoEYnyOaQ95+X1JGshuBjGp6nxKUy1jMgE3zPqN7fQdg==} - hasBin: true - - available-typed-arrays@1.0.7: - resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} - engines: {node: '>= 0.4'} - - bail@2.0.2: - resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} - - balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - - bech32@1.1.4: - resolution: {integrity: sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==} - - bignumber.js@9.1.2: - resolution: {integrity: sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==} - - bn.js@4.11.6: - resolution: {integrity: sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA==} - - bn.js@4.12.0: - resolution: {integrity: sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==} - - bn.js@5.2.1: - resolution: {integrity: sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==} - - brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} - - brace-expansion@2.0.1: - resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} - - braces@3.0.2: - resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} - engines: {node: '>=8'} - - brorand@1.1.0: - resolution: {integrity: sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==} - - buffer-from@1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - - buffer-reverse@1.0.1: - resolution: {integrity: sha512-M87YIUBsZ6N924W57vDwT/aOu8hw7ZgdByz6ijksLjmHJELBASmYTTlNHRgjE+pTsT9oJXGaDSgqqwfdHotDUg==} - - bufio@1.2.1: - resolution: {integrity: sha512-9oR3zNdupcg/Ge2sSHQF3GX+kmvL/fTPvD0nd5AGLq8SjUYnTz+SlFjK/GXidndbZtIj+pVKXiWeR9w6e9wKCA==} - engines: {node: '>=14.0.0'} - - busboy@1.6.0: - resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} - engines: {node: '>=10.16.0'} - - call-bind@1.0.7: - resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} - engines: {node: '>= 0.4'} - - callsites@3.1.0: - resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} - engines: {node: '>=6'} - - camel-case@4.1.2: - resolution: {integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==} - - caniuse-lite@1.0.30001614: - resolution: {integrity: sha512-jmZQ1VpmlRwHgdP1/uiKzgiAuGOfLEJsYFP4+GBou/QQ4U6IOJCB4NP1c+1p9RGLpwObcT94jA5/uO+F1vBbog==} - - capital-case@1.0.4: - resolution: {integrity: sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==} - - ccount@2.0.1: - resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} - - chai@4.4.1: - resolution: {integrity: sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==} - engines: {node: '>=4'} - - chalk-template@1.1.0: - resolution: {integrity: sha512-T2VJbcDuZQ0Tb2EWwSotMPJjgpy1/tGee1BTpUNsGZ/qgNjV2t7Mvu+d4600U564nbLesN1x2dPL+xii174Ekg==} - engines: {node: '>=14.16'} - - chalk@2.3.0: - resolution: {integrity: sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==} - engines: {node: '>=4'} - - chalk@2.4.2: - resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} - engines: {node: '>=4'} - - chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} - - chalk@5.3.0: - resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - - change-case@4.1.2: - resolution: {integrity: sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A==} - - character-entities-html4@2.1.0: - resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} - - character-entities-legacy@1.1.4: - resolution: {integrity: sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==} - - character-entities-legacy@3.0.0: - resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} - - character-entities@1.2.4: - resolution: {integrity: sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==} - - character-entities@2.0.2: - resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} - - character-reference-invalid@1.1.4: - resolution: {integrity: sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==} - - character-reference-invalid@2.0.1: - resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} - - check-error@1.0.3: - resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} - - ci-info@4.0.0: - resolution: {integrity: sha512-TdHqgGf9odd8SXNuxtUBVx8Nv+qZOejE6qyqiy5NtbYYQOeFa6zmHkxlPzmaLxWWHsU6nJmB7AETdVPi+2NBUg==} - engines: {node: '>=8'} - - clear-module@4.1.2: - resolution: {integrity: sha512-LWAxzHqdHsAZlPlEyJ2Poz6AIs384mPeqLVCru2p0BrP9G/kVGuhNyZYClLO6cXlnuJjzC8xtsJIuMjKqLXoAw==} - engines: {node: '>=8'} - - client-only@0.0.1: - resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} - - clipboardy@1.2.2: - resolution: {integrity: sha512-16KrBOV7bHmHdxcQiCvfUFYVFyEah4FI8vYT1Fr7CGSA4G+xBWMEfUEQJS1hxeHGtI9ju1Bzs9uXSbj5HZKArw==} - engines: {node: '>=4'} - - clsx@2.1.1: - resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} - engines: {node: '>=6'} - - color-convert@1.9.3: - resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} - - color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} - - color-name@1.1.3: - resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} - - color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - - comma-separated-tokens@2.0.3: - resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} - - commander@12.0.0: - resolution: {integrity: sha512-MwVNWlYjDTtOjX5PiD7o5pK0UrFU/OYgcJfjjK4RaHZETNtjJqrZa9Y9ds88+A+f+d5lv+561eZ+yCKoS3gbAA==} - engines: {node: '>=18'} - - commander@7.2.0: - resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} - engines: {node: '>= 10'} - - commander@8.3.0: - resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} - engines: {node: '>= 12'} - - comment-json@4.2.3: - resolution: {integrity: sha512-SsxdiOf064DWoZLH799Ata6u7iV658A11PlWtZATDlXPpKGJnbJZ5Z24ybixAi+LUUqJ/GKowAejtC5GFUG7Tw==} - engines: {node: '>= 6'} - - compute-scroll-into-view@3.1.0: - resolution: {integrity: sha512-rj8l8pD4bJ1nx+dAkMhV1xB5RuZEyVysfxJqB1pRchh1KVvwOv9b7CGB8ZfjTImVv2oF+sYMUkMZq6Na5Ftmbg==} - - concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - - concat-stream@2.0.0: - resolution: {integrity: sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==} - engines: {'0': node >= 6.0} - - configstore@6.0.0: - resolution: {integrity: sha512-cD31W1v3GqUlQvbBCGcXmd2Nj9SvLDOP1oQ0YFuLETufzSPaKp11rYBsSOm7rCsW3OnIRAFM3OxRhceaXNYHkA==} - engines: {node: '>=12'} - - constant-case@3.0.4: - resolution: {integrity: sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ==} - - core-util-is@1.0.3: - resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} - - cose-base@1.0.3: - resolution: {integrity: sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg==} - - cross-spawn@5.1.0: - resolution: {integrity: sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==} - - cross-spawn@7.0.3: - resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} - engines: {node: '>= 8'} - - crypto-js@4.2.0: - resolution: {integrity: sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==} - - crypto-random-string@4.0.0: - resolution: {integrity: sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==} - engines: {node: '>=12'} - - cspell-config-lib@8.7.0: - resolution: {integrity: sha512-depsd01GbLBo71/tfRrL5iECWQLS4CjCxA9C01dVkFAJqVB0s+K9KLKjTlq5aHOhcvo9Z3dHV+bGQCf5/Q7bfw==} - engines: {node: '>=18'} - - cspell-dictionary@8.7.0: - resolution: {integrity: sha512-S6IpZSzIMxlOO/33NgCOuP0TPH2mZbw8d5CP44z5jajflloq8l74MeJLkeDzYfCRcm0Rtk0A5drBeMg+Ai34OA==} - engines: {node: '>=18'} - - cspell-gitignore@8.7.0: - resolution: {integrity: sha512-yvUZ86qyopUpDgn+YXP1qTpUe/lp65ZFvpMtw21lWHTFlg1OWKntr349EQU/5ben/K6koxk1FiElCBV7Lr4uFg==} - engines: {node: '>=18'} - hasBin: true - - cspell-glob@8.7.0: - resolution: {integrity: sha512-AMdfx0gvROA/aIL8t8b5Y5NtMgscGZELFj6WhCSZiQSuWRxXUKiLGGLUFjx2y0hgXN9LUYOo6aBjvhnxI/v71g==} - engines: {node: '>=18'} - - cspell-grammar@8.7.0: - resolution: {integrity: sha512-SGcXc7322wU2WNRi7vtpToWDXTqZHhxqvR+aIXHT2kkxlMSWp3Rvfpshd0ckgY54nZtgw7R/JtKND2jeACRpwQ==} - engines: {node: '>=18'} - hasBin: true - - cspell-io@8.7.0: - resolution: {integrity: sha512-o7OltyyvVkRG1gQrIqGpN5pUkHNnv6rvihb7Qu6cJ8jITinLGuWJuEQpgt0eF5yIr624jDbFwSzAxsFox8riQg==} - engines: {node: '>=18'} - - cspell-lib@8.7.0: - resolution: {integrity: sha512-qDSHZGekwiDmouYRECTQokE+hgAuPqREm+Hb+G3DoIo3ZK5H47TtEUo8fNCw22XsKefcF8X28LiyoZwiYHVpSg==} - engines: {node: '>=18'} - - cspell-trie-lib@8.7.0: - resolution: {integrity: sha512-W3Nh2cO7gMV91r+hLqyTMgKlvRl4W5diKs5YiyOxjZumRkMBy42IzcNYtgIIacOxghklv96F5Bd1Vx/zY6ylGA==} - engines: {node: '>=18'} - - cspell@8.7.0: - resolution: {integrity: sha512-77nRPgLl240C6FK8RKVKo34lP15Lzp/6bk+SKYJFwUKKXlcgWXDis+Lw4JolA741/JgHtuxmhW1C8P7dCKjJ3w==} - engines: {node: '>=18'} - hasBin: true - - csstype@3.1.3: - resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} - - cytoscape-cose-bilkent@4.1.0: - resolution: {integrity: sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ==} - peerDependencies: - cytoscape: ^3.2.0 - - cytoscape@3.29.2: - resolution: {integrity: sha512-2G1ycU28Nh7OHT9rkXRLpCDP30MKH1dXJORZuBhtEhEW7pKwgPi77ImqlCWinouyE1PNepIOGZBOrE84DG7LyQ==} - engines: {node: '>=0.10'} - - d3-array@2.12.1: - resolution: {integrity: sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==} - - d3-array@3.2.4: - resolution: {integrity: sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==} - engines: {node: '>=12'} - - d3-axis@3.0.0: - resolution: {integrity: sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==} - engines: {node: '>=12'} - - d3-brush@3.0.0: - resolution: {integrity: sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==} - engines: {node: '>=12'} - - d3-chord@3.0.1: - resolution: {integrity: sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==} - engines: {node: '>=12'} - - d3-color@3.1.0: - resolution: {integrity: sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==} - engines: {node: '>=12'} - - d3-contour@4.0.2: - resolution: {integrity: sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==} - engines: {node: '>=12'} - - d3-delaunay@6.0.4: - resolution: {integrity: sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==} - engines: {node: '>=12'} - - d3-dispatch@3.0.1: - resolution: {integrity: sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==} - engines: {node: '>=12'} - - d3-drag@3.0.0: - resolution: {integrity: sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==} - engines: {node: '>=12'} - - d3-dsv@3.0.1: - resolution: {integrity: sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==} - engines: {node: '>=12'} - hasBin: true - - d3-ease@3.0.1: - resolution: {integrity: sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==} - engines: {node: '>=12'} - - d3-fetch@3.0.1: - resolution: {integrity: sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==} - engines: {node: '>=12'} - - d3-force@3.0.0: - resolution: {integrity: sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==} - engines: {node: '>=12'} - - d3-format@3.1.0: - resolution: {integrity: sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==} - engines: {node: '>=12'} - - d3-geo@3.1.1: - resolution: {integrity: sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==} - engines: {node: '>=12'} - - d3-hierarchy@3.1.2: - resolution: {integrity: sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==} - engines: {node: '>=12'} - - d3-interpolate@3.0.1: - resolution: {integrity: sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==} - engines: {node: '>=12'} - - d3-path@1.0.9: - resolution: {integrity: sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==} - - d3-path@3.1.0: - resolution: {integrity: sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==} - engines: {node: '>=12'} - - d3-polygon@3.0.1: - resolution: {integrity: sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==} - engines: {node: '>=12'} - - d3-quadtree@3.0.1: - resolution: {integrity: sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==} - engines: {node: '>=12'} - - d3-random@3.0.1: - resolution: {integrity: sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==} - engines: {node: '>=12'} - - d3-sankey@0.12.3: - resolution: {integrity: sha512-nQhsBRmM19Ax5xEIPLMY9ZmJ/cDvd1BG3UVvt5h3WRxKg5zGRbvnteTyWAbzeSvlh3tW7ZEmq4VwR5mB3tutmQ==} - - d3-scale-chromatic@3.1.0: - resolution: {integrity: sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==} - engines: {node: '>=12'} - - d3-scale@4.0.2: - resolution: {integrity: sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==} - engines: {node: '>=12'} - - d3-selection@3.0.0: - resolution: {integrity: sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==} - engines: {node: '>=12'} - - d3-shape@1.3.7: - resolution: {integrity: sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==} - - d3-shape@3.2.0: - resolution: {integrity: sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==} - engines: {node: '>=12'} - - d3-time-format@4.1.0: - resolution: {integrity: sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==} - engines: {node: '>=12'} - - d3-time@3.1.0: - resolution: {integrity: sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==} - engines: {node: '>=12'} - - d3-timer@3.0.1: - resolution: {integrity: sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==} - engines: {node: '>=12'} - - d3-transition@3.0.1: - resolution: {integrity: sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==} - engines: {node: '>=12'} - peerDependencies: - d3-selection: 2 - 3 - - d3-zoom@3.0.0: - resolution: {integrity: sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==} - engines: {node: '>=12'} - - d3@7.9.0: - resolution: {integrity: sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==} - engines: {node: '>=12'} - - dagre-d3-es@7.0.10: - resolution: {integrity: sha512-qTCQmEhcynucuaZgY5/+ti3X/rnszKZhEQH/ZdWdtP1tA/y3VoHJzcVrO9pjjJCNpigfscAtoUB5ONcd2wNn0A==} - - dayjs@1.11.11: - resolution: {integrity: sha512-okzr3f11N6WuqYtZSvm+F776mB41wRZMhKP+hc34YdW+KmtYYK9iqvHSwo2k9FEH3fhGXvOPV6yz2IcSrfRUDg==} - - debug@4.3.4: - resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - - decode-named-character-reference@1.0.2: - resolution: {integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==} - - deep-eql@4.1.3: - resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} - engines: {node: '>=6'} - - deep-equal@2.2.3: - resolution: {integrity: sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==} - engines: {node: '>= 0.4'} - - deep-is@0.1.4: - resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} - - define-data-property@1.1.4: - resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} - engines: {node: '>= 0.4'} - - define-properties@1.2.1: - resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} - engines: {node: '>= 0.4'} - - delaunator@5.0.1: - resolution: {integrity: sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw==} - - dequal@2.0.3: - resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} - engines: {node: '>=6'} - - devlop@1.1.0: - resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} - - diff@5.2.0: - resolution: {integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==} - engines: {node: '>=0.3.1'} - - dir-glob@3.0.1: - resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} - engines: {node: '>=8'} - - doctrine@3.0.0: - resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} - engines: {node: '>=6.0.0'} - - dom-accessibility-api@0.5.16: - resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==} - - dompurify@3.1.6: - resolution: {integrity: sha512-cTOAhc36AalkjtBpfG6O8JimdTMWNXjiePT2xQH/ppBGi/4uIpmj8eKyIkMJErXWARyINV/sB38yf8JCLF5pbQ==} - - dot-case@3.0.4: - resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} - - dot-prop@6.0.1: - resolution: {integrity: sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==} - engines: {node: '>=10'} - - eastasianwidth@0.2.0: - resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - - elkjs@0.9.3: - resolution: {integrity: sha512-f/ZeWvW/BCXbhGEf1Ujp29EASo/lk1FDnETgNKwJrsVvGZhUWCZyg3xLJjAsxfOmt8KjswHmI5EwCQcPMpOYhQ==} - - elliptic@6.5.4: - resolution: {integrity: sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==} - - emoji-regex@10.3.0: - resolution: {integrity: sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==} - - emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - - emoji-regex@9.2.2: - resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} - - entities@4.5.0: - resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} - engines: {node: '>=0.12'} - - error-ex@1.3.2: - resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} - - es-define-property@1.0.0: - resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} - engines: {node: '>= 0.4'} - - es-errors@1.3.0: - resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} - engines: {node: '>= 0.4'} - - es-get-iterator@1.1.3: - resolution: {integrity: sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==} - - escape-string-regexp@1.0.5: - resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} - engines: {node: '>=0.8.0'} - - escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} - - escape-string-regexp@5.0.0: - resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} - engines: {node: '>=12'} - - eslint-mdx@2.3.4: - resolution: {integrity: sha512-u4NszEUyoGtR7Q0A4qs0OymsEQdCO6yqWlTzDa9vGWsK7aMotdnW0hqifHTkf6lEtA2vHk2xlkWHTCrhYLyRbw==} - engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} - peerDependencies: - eslint: '>=8.0.0' - - eslint-plugin-markdown@3.0.1: - resolution: {integrity: sha512-8rqoc148DWdGdmYF6WSQFT3uQ6PO7zXYgeBpHAOAakX/zpq+NvFYbDA/H7PYzHajwtmaOzAwfxyl++x0g1/N9A==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - - eslint-plugin-mdx@2.3.4: - resolution: {integrity: sha512-kr6tgaifKL+AVGYMtdYc2VCsIjfYQXuUCKz4rK58d2DpnPFHrmgXIOC7NcMvaEld+VOEpxBSCCnjnsf4IVCQGg==} - engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} - peerDependencies: - eslint: '>=8.0.0' - - eslint-scope@7.2.2: - resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - eslint-visitor-keys@3.4.3: - resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - eslint@8.57.0: - resolution: {integrity: sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. - hasBin: true - - espree@9.6.1: - resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - esprima@4.0.1: - resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} - engines: {node: '>=4'} - hasBin: true - - esquery@1.5.0: - resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} - engines: {node: '>=0.10'} - - esrecurse@4.3.0: - resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} - engines: {node: '>=4.0'} - - estraverse@5.3.0: - resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} - engines: {node: '>=4.0'} - - estree-util-attach-comments@2.1.1: - resolution: {integrity: sha512-+5Ba/xGGS6mnwFbXIuQiDPTbuTxuMCooq3arVv7gPZtYpjp+VXH/NkHAP35OOefPhNG/UGqU3vt/LTABwcHX0w==} - - estree-util-build-jsx@2.2.2: - resolution: {integrity: sha512-m56vOXcOBuaF+Igpb9OPAy7f9w9OIkb5yhjsZuaPm7HoGi4oTOQi0h2+yZ+AtKklYFZ+rPC4n0wYCJCEU1ONqg==} - - estree-util-is-identifier-name@2.1.0: - resolution: {integrity: sha512-bEN9VHRyXAUOjkKVQVvArFym08BTWB0aJPppZZr0UNyAqWsLaVfAqP7hbaTJjzHifmB5ebnR8Wm7r7yGN/HonQ==} - - estree-util-to-js@1.2.0: - resolution: {integrity: sha512-IzU74r1PK5IMMGZXUVZbmiu4A1uhiPgW5hm1GjcOfr4ZzHaMPpLNJjR7HjXiIOzi25nZDrgFTobHTkV5Q6ITjA==} - - estree-util-value-to-estree@1.3.0: - resolution: {integrity: sha512-Y+ughcF9jSUJvncXwqRageavjrNPAI+1M/L3BI3PyLp1nmgYTGUXU6t5z1Y7OWuThoDdhPME07bQU+d5LxdJqw==} - engines: {node: '>=12.0.0'} - - estree-util-visit@1.2.1: - resolution: {integrity: sha512-xbgqcrkIVbIG+lI/gzbvd9SGTJL4zqJKBFttUl5pP27KhAjtMKbX/mQXJ7qgyXpMgVy/zvpm0xoQQaGL8OloOw==} - - estree-walker@3.0.3: - resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} - - esutils@2.0.3: - resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} - engines: {node: '>=0.10.0'} - - ethereum-bloom-filters@1.1.0: - resolution: {integrity: sha512-J1gDRkLpuGNvWYzWslBQR9cDV4nd4kfvVTE/Wy4Kkm4yb3EYRSlyi0eB/inTsSTTVyA0+HyzHgbr95Fn/Z1fSw==} - deprecated: do not use this package use package versions above as this can miss some topics - - ethereum-cryptography@2.1.3: - resolution: {integrity: sha512-BlwbIL7/P45W8FGW2r7LGuvoEZ+7PWsniMvQ4p5s2xCyw9tmaDlpfsN9HjAucbF+t/qpVHwZUisgfK24TCW8aA==} - - ethers@5.7.2: - resolution: {integrity: sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==} - - ethjs-unit@0.1.6: - resolution: {integrity: sha512-/Sn9Y0oKl0uqQuvgFk/zQgR7aw1g36qX/jzSQ5lSwlO0GigPymk4eGQfeNTD03w1dPOqfz8V77Cy43jH56pagw==} - engines: {node: '>=6.5.0', npm: '>=3'} - - execa@0.8.0: - resolution: {integrity: sha512-zDWS+Rb1E8BlqqhALSt9kUhss8Qq4nN3iof3gsOdyINksElaPyNBtKUMTR62qhvgVWR0CqCX7sdnKe4MnUbFEA==} - engines: {node: '>=4'} - - extend-shallow@2.0.1: - resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} - engines: {node: '>=0.10.0'} - - extend@3.0.2: - resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} - - fast-deep-equal@3.1.3: - resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - - fast-equals@5.0.1: - resolution: {integrity: sha512-WF1Wi8PwwSY7/6Kx0vKXtw8RwuSGoM1bvDaJbu7MxDlR1vovZjIAKrnzyrThgAjm6JDTu0fVgWXDlMGspodfoQ==} - engines: {node: '>=6.0.0'} - - fast-glob@3.3.2: - resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} - engines: {node: '>=8.6.0'} - - fast-json-stable-stringify@2.1.0: - resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} - - fast-levenshtein@2.0.6: - resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - - fastq@1.17.1: - resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} - - fault@2.0.1: - resolution: {integrity: sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ==} - - file-entry-cache@6.0.1: - resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} - engines: {node: ^10.12.0 || >=12.0.0} - - file-entry-cache@8.0.0: - resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} - engines: {node: '>=16.0.0'} - - fill-range@7.0.1: - resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} - engines: {node: '>=8'} - - find-up-simple@1.0.0: - resolution: {integrity: sha512-q7Us7kcjj2VMePAa02hDAF6d+MzsdsAWEwYyOpwUtlerRBkOEPBCRZrAV4XfcSN8fHAgaD0hP7miwoay6DCprw==} - engines: {node: '>=18'} - - find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} - - find-up@6.3.0: - resolution: {integrity: sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - - flat-cache@3.2.0: - resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} - engines: {node: ^10.12.0 || >=12.0.0} - - flat-cache@4.0.1: - resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} - engines: {node: '>=16'} - - flatted@3.3.1: - resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} - - flexsearch@0.7.43: - resolution: {integrity: sha512-c5o/+Um8aqCSOXGcZoqZOm+NqtVwNsvVpWv6lfmSclU954O3wvQKxxK8zj74fPaSJbXpSLTs4PRhh+wnoCXnKg==} - - focus-visible@5.2.0: - resolution: {integrity: sha512-Rwix9pBtC1Nuy5wysTmKy+UjbDJpIfg8eHjw0rjZ1mX4GNLz1Bmd16uDpI3Gk1i70Fgcs8Csg2lPm8HULFg9DQ==} - - for-each@0.3.3: - resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} - - foreground-child@3.1.1: - resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} - engines: {node: '>=14'} - - format@0.2.2: - resolution: {integrity: sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==} - engines: {node: '>=0.4.x'} - - fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - - function-bind@1.1.2: - resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - - functions-have-names@1.2.3: - resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} - - gensequence@7.0.0: - resolution: {integrity: sha512-47Frx13aZh01afHJTB3zTtKIlFI6vWY+MYCN9Qpew6i52rfKjnhCF/l1YlC8UmEMvvntZZ6z4PiCcmyuedR2aQ==} - engines: {node: '>=18'} - - get-func-name@2.0.2: - resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} - - get-intrinsic@1.2.4: - resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} - engines: {node: '>= 0.4'} - - get-stdin@9.0.0: - resolution: {integrity: sha512-dVKBjfWisLAicarI2Sf+JuBE/DghV4UzNAVe9yhEJuzeREd3JhOTE9cUaJTeSa77fsbQUK3pcOpJfM59+VKZaA==} - engines: {node: '>=12'} - - get-stream@3.0.0: - resolution: {integrity: sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==} - engines: {node: '>=4'} - - git-up@7.0.0: - resolution: {integrity: sha512-ONdIrbBCFusq1Oy0sC71F5azx8bVkvtZtMJAsv+a6lz5YAmbNnLD6HAB4gptHZVLPR8S2/kVN6Gab7lryq5+lQ==} - - git-url-parse@13.1.1: - resolution: {integrity: sha512-PCFJyeSSdtnbfhSNRw9Wk96dDCNx+sogTe4YNXeXSJxt7xz5hvXekuRn9JX7m+Mf4OscCu8h+mtAl3+h5Fo8lQ==} - - github-slugger@1.5.0: - resolution: {integrity: sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw==} - - github-slugger@2.0.0: - resolution: {integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==} - - glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} - - glob-parent@6.0.2: - resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} - engines: {node: '>=10.13.0'} - - glob@10.3.12: - resolution: {integrity: sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg==} - engines: {node: '>=16 || 14 >=14.17'} - hasBin: true - - glob@7.2.3: - resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} - deprecated: Glob versions prior to v9 are no longer supported - - glob@8.1.0: - resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} - engines: {node: '>=12'} - deprecated: Glob versions prior to v9 are no longer supported - - global-directory@4.0.1: - resolution: {integrity: sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==} - engines: {node: '>=18'} - - globals@13.24.0: - resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} - engines: {node: '>=8'} - - globby@11.1.0: - resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} - engines: {node: '>=10'} - - gopd@1.0.1: - resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} - - graceful-fs@4.2.11: - resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - - graphemer@1.4.0: - resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} - - gray-matter@4.0.3: - resolution: {integrity: sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==} - engines: {node: '>=6.0'} - - has-bigints@1.0.2: - resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} - - has-flag@2.0.0: - resolution: {integrity: sha512-P+1n3MnwjR/Epg9BBo1KT8qbye2g2Ou4sFumihwt6I4tsUX7jnLcX4BTOSKg/B1ZrIYMN9FcEnG4x5a7NB8Eng==} - engines: {node: '>=0.10.0'} - - has-flag@3.0.0: - resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} - engines: {node: '>=4'} - - has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} - - has-own-prop@2.0.0: - resolution: {integrity: sha512-Pq0h+hvsVm6dDEa8x82GnLSYHOzNDt7f0ddFa3FqcQlgzEiptPqL+XrOJNavjOzSYiYWIrgeVYYgGlLmnxwilQ==} - engines: {node: '>=8'} - - has-property-descriptors@1.0.2: - resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} - - has-proto@1.0.3: - resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} - engines: {node: '>= 0.4'} - - has-symbols@1.0.3: - resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} - engines: {node: '>= 0.4'} - - has-tostringtag@1.0.2: - resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} - engines: {node: '>= 0.4'} - - hash-obj@4.0.0: - resolution: {integrity: sha512-FwO1BUVWkyHasWDW4S8o0ssQXjvyghLV2rfVhnN36b2bbcj45eGiuzdn9XOvOpjV3TKQD7Gm2BWNXdE9V4KKYg==} - engines: {node: '>=12'} - - hash.js@1.1.7: - resolution: {integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==} - - hasown@2.0.2: - resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} - engines: {node: '>= 0.4'} - - hast-util-from-dom@5.0.0: - resolution: {integrity: sha512-d6235voAp/XR3Hh5uy7aGLbM3S4KamdW0WEgOaU1YoewnuYw4HXb5eRtv9g65m/RFGEfUY1Mw4UqCc5Y8L4Stg==} - - hast-util-from-html-isomorphic@2.0.0: - resolution: {integrity: sha512-zJfpXq44yff2hmE0XmwEOzdWin5xwH+QIhMLOScpX91e/NSGPsAzNCvLQDIEPyO2TXi+lBmU6hjLIhV8MwP2kw==} - - hast-util-from-html@2.0.1: - resolution: {integrity: sha512-RXQBLMl9kjKVNkJTIO6bZyb2n+cUH8LFaSSzo82jiLT6Tfc+Pt7VQCS+/h3YwG4jaNE2TA2sdJisGWR+aJrp0g==} - - hast-util-from-parse5@8.0.1: - resolution: {integrity: sha512-Er/Iixbc7IEa7r/XLtuG52zoqn/b3Xng/w6aZQ0xGVxzhw5xUFxcRqdPzP6yFi/4HBYRaifaI5fQ1RH8n0ZeOQ==} - - hast-util-is-element@3.0.0: - resolution: {integrity: sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==} - - hast-util-parse-selector@4.0.0: - resolution: {integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==} - - hast-util-raw@9.0.2: - resolution: {integrity: sha512-PldBy71wO9Uq1kyaMch9AHIghtQvIwxBUkv823pKmkTM3oV1JxtsTNYdevMxvUHqcnOAuO65JKU2+0NOxc2ksA==} - - hast-util-to-estree@2.3.3: - resolution: {integrity: sha512-ihhPIUPxN0v0w6M5+IiAZZrn0LH2uZomeWwhn7uP7avZC6TE7lIiEh2yBMPr5+zi1aUCXq6VoYRgs2Bw9xmycQ==} - - hast-util-to-parse5@8.0.0: - resolution: {integrity: sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==} - - hast-util-to-text@4.0.2: - resolution: {integrity: sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A==} - - hast-util-whitespace@2.0.1: - resolution: {integrity: sha512-nAxA0v8+vXSBDt3AnRUNjyRIQ0rD+ntpbAp4LnPkumc5M9yUbSMa4XDU9Q6etY4f1Wp4bNgvc1yjiZtsTTrSng==} - - hastscript@8.0.0: - resolution: {integrity: sha512-dMOtzCEd3ABUeSIISmrETiKuyydk1w0pa+gE/uormcTpSYuaNJPbX1NU3JLyscSLjwAQM8bWMhhIlnCqnRvDTw==} - - header-case@2.0.4: - resolution: {integrity: sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q==} - - hmac-drbg@1.0.1: - resolution: {integrity: sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==} - - html-void-elements@3.0.0: - resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} - - iconv-lite@0.6.3: - resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} - engines: {node: '>=0.10.0'} - - ignore@5.3.1: - resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} - engines: {node: '>= 4'} - - import-fresh@3.3.0: - resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} - engines: {node: '>=6'} - - import-meta-resolve@2.2.2: - resolution: {integrity: sha512-f8KcQ1D80V7RnqVm+/lirO9zkOxjGxhaTC1IPrBGd3MEfNgmNG67tSUO9gTi2F3Blr2Az6g1vocaxzkVnWl9MA==} - - import-meta-resolve@4.1.0: - resolution: {integrity: sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==} - - imurmurhash@0.1.4: - resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} - engines: {node: '>=0.8.19'} - - inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. - - inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - - ini@4.1.1: - resolution: {integrity: sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - - ini@4.1.2: - resolution: {integrity: sha512-AMB1mvwR1pyBFY/nSevUX6y8nJWS63/SzUKD3JyQn97s4xgIdgQPT75IRouIiBAN4yLQBUShNYVW0+UG25daCw==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - - inline-style-parser@0.1.1: - resolution: {integrity: sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==} - - internal-slot@1.0.7: - resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==} - engines: {node: '>= 0.4'} - - internmap@1.0.1: - resolution: {integrity: sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==} - - internmap@2.0.3: - resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==} - engines: {node: '>=12'} - - intersection-observer@0.12.2: - resolution: {integrity: sha512-7m1vEcPCxXYI8HqnL8CKI6siDyD+eIWSwgB3DZA+ZTogxk9I4CDnj4wilt9x/+/QbHI4YG5YZNmC6458/e9Ktg==} - - is-alphabetical@1.0.4: - resolution: {integrity: sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==} - - is-alphabetical@2.0.1: - resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==} - - is-alphanumerical@1.0.4: - resolution: {integrity: sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==} - - is-alphanumerical@2.0.1: - resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==} - - is-arguments@1.1.1: - resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} - engines: {node: '>= 0.4'} - - is-array-buffer@3.0.4: - resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==} - engines: {node: '>= 0.4'} - - is-arrayish@0.2.1: - resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} - - is-bigint@1.0.4: - resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} - - is-boolean-object@1.1.2: - resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} - engines: {node: '>= 0.4'} - - is-buffer@2.0.5: - resolution: {integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==} - engines: {node: '>=4'} - - is-callable@1.2.7: - resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} - engines: {node: '>= 0.4'} - - is-date-object@1.0.5: - resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} - engines: {node: '>= 0.4'} - - is-decimal@1.0.4: - resolution: {integrity: sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==} - - is-decimal@2.0.1: - resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} - - is-empty@1.2.0: - resolution: {integrity: sha512-F2FnH/otLNJv0J6wc73A5Xo7oHLNnqplYqZhUu01tD54DIPvxIRSTSLkrUB/M0nHO4vo1O9PDfN4KoTxCzLh/w==} - - is-extendable@0.1.1: - resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} - engines: {node: '>=0.10.0'} - - is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} - - is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} - - is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} - - is-hex-prefixed@1.0.0: - resolution: {integrity: sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA==} - engines: {node: '>=6.5.0', npm: '>=3'} - - is-hexadecimal@1.0.4: - resolution: {integrity: sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==} - - is-hexadecimal@2.0.1: - resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} - - is-map@2.0.3: - resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} - engines: {node: '>= 0.4'} - - is-number-object@1.0.7: - resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} - engines: {node: '>= 0.4'} - - is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - - is-obj@2.0.0: - resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} - engines: {node: '>=8'} - - is-obj@3.0.0: - resolution: {integrity: sha512-IlsXEHOjtKhpN8r/tRFj2nDyTmHvcfNeu/nrRIcXE17ROeatXchkojffa1SpdqW4cr/Fj6QkEf/Gn4zf6KKvEQ==} - engines: {node: '>=12'} - - is-path-inside@3.0.3: - resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} - engines: {node: '>=8'} - - is-plain-obj@3.0.0: - resolution: {integrity: sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==} - engines: {node: '>=10'} - - is-plain-obj@4.1.0: - resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} - engines: {node: '>=12'} - - is-reference@3.0.2: - resolution: {integrity: sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==} - - is-regex@1.1.4: - resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} - engines: {node: '>= 0.4'} - - is-set@2.0.3: - resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} - engines: {node: '>= 0.4'} - - is-shared-array-buffer@1.0.3: - resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==} - engines: {node: '>= 0.4'} - - is-ssh@1.4.0: - resolution: {integrity: sha512-x7+VxdxOdlV3CYpjvRLBv5Lo9OJerlYanjwFrPR9fuGPjCiNiCzFgAWpiLAohSbsnH4ZAys3SBh+hq5rJosxUQ==} - - is-stream@1.1.0: - resolution: {integrity: sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==} - engines: {node: '>=0.10.0'} - - is-string@1.0.7: - resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} - engines: {node: '>= 0.4'} - - is-symbol@1.0.4: - resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} - engines: {node: '>= 0.4'} - - is-typedarray@1.0.0: - resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} - - is-weakmap@2.0.2: - resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} - engines: {node: '>= 0.4'} - - is-weakset@2.0.3: - resolution: {integrity: sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==} - engines: {node: '>= 0.4'} - - isarray@2.0.5: - resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} - - isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - - isows@1.0.3: - resolution: {integrity: sha512-2cKei4vlmg2cxEjm3wVSqn8pcoRF/LX/wpifuuNquFO4SQmPwarClT+SUCA2lt+l581tTeZIPIZuIDo2jWN1fg==} - peerDependencies: - ws: '*' - - jackspeak@2.3.6: - resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} - engines: {node: '>=14'} - - js-sha3@0.8.0: - resolution: {integrity: sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==} - - js-tokens@4.0.0: - resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - - js-yaml@3.14.1: - resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} - hasBin: true - - js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} - hasBin: true - - json-buffer@3.0.1: - resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} - - json-parse-even-better-errors@2.3.1: - resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} - - json-parse-even-better-errors@3.0.1: - resolution: {integrity: sha512-aatBvbL26wVUCLmbWdCpeu9iF5wOyWpagiKkInA+kfws3sWdBrTnsvN2CKcyCYyUrc7rebNBlK6+kteg7ksecg==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - - json-schema-traverse@0.4.1: - resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} - - json-schema-traverse@1.0.0: - resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} - - json-stable-stringify-without-jsonify@1.0.1: - resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} - - jsonc-parser@3.2.1: - resolution: {integrity: sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==} - - katex@0.16.10: - resolution: {integrity: sha512-ZiqaC04tp2O5utMsl2TEZTXxa6WSC4yo0fv5ML++D3QZv/vx2Mct0mTlRx3O+uUkjfuAgOkzsCmq5MiUEsDDdA==} - hasBin: true - - keyv@4.5.4: - resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} - - khroma@2.1.0: - resolution: {integrity: sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw==} - - kind-of@6.0.3: - resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} - engines: {node: '>=0.10.0'} - - kleur@4.1.5: - resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} - engines: {node: '>=6'} - - layout-base@1.0.2: - resolution: {integrity: sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==} - - levn@0.4.1: - resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} - engines: {node: '>= 0.8.0'} - - lines-and-columns@2.0.4: - resolution: {integrity: sha512-wM1+Z03eypVAVUCE7QdSqpVIvelbOakn1M0bPDoA4SGWPx3sNDVUiMo3L6To6WWGClB7VyXnhQ4Sn7gxiJbE6A==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - - load-plugin@5.1.0: - resolution: {integrity: sha512-Lg1CZa1CFj2CbNaxijTL6PCbzd4qGTlZov+iH2p5Xwy/ApcZJh+i6jMN2cYePouTfjJfrNu3nXFdEw8LvbjPFQ==} - - locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} - - locate-path@7.2.0: - resolution: {integrity: sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - - lodash-es@4.17.21: - resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} - - lodash.clonedeep@4.5.0: - resolution: {integrity: sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==} - - lodash.get@4.4.2: - resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} - - lodash.merge@4.6.2: - resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} - - lodash@4.17.21: - resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - - longest-streak@3.1.0: - resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} - - loose-envify@1.4.0: - resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} - hasBin: true - - loupe@2.3.7: - resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} - - lower-case@2.0.2: - resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} - - lru-cache@10.2.2: - resolution: {integrity: sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==} - engines: {node: 14 || >=16.14} - - lru-cache@4.1.5: - resolution: {integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==} - - lru-cache@6.0.0: - resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} - engines: {node: '>=10'} - - lz-string@1.5.0: - resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} - hasBin: true - - markdown-extensions@1.1.1: - resolution: {integrity: sha512-WWC0ZuMzCyDHYCasEGs4IPvLyTGftYwh6wIEOULOF0HXcqZlhwRzrK0w2VUlxWA98xnvb/jszw4ZSkJ6ADpM6Q==} - engines: {node: '>=0.10.0'} - - markdown-table@3.0.3: - resolution: {integrity: sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==} - - match-sorter@6.3.4: - resolution: {integrity: sha512-jfZW7cWS5y/1xswZo8VBOdudUiSd9nifYRWphc9M5D/ee4w4AoXLgBEdRbgVaxbMuagBPeUC5y2Hi8DO6o9aDg==} - - mdast-comment-marker@2.1.2: - resolution: {integrity: sha512-HED3ezseRVkBzZ0uK4q6RJMdufr/2p3VfVZstE3H1N9K8bwtspztWo6Xd7rEatuGNoCXaBna8oEqMwUn0Ve1bw==} - - mdast-util-definitions@5.1.2: - resolution: {integrity: sha512-8SVPMuHqlPME/z3gqVwWY4zVXn8lqKv/pAhC57FuJ40ImXyBpmO5ukh98zB2v7Blql2FiHjHv9LVztSIqjY+MA==} - - mdast-util-find-and-replace@2.2.2: - resolution: {integrity: sha512-MTtdFRz/eMDHXzeK6W3dO7mXUlF82Gom4y0oOgvHhh/HXZAGvIQDUvQ0SuUx+j2tv44b8xTHOm8K/9OoRFnXKw==} - - mdast-util-from-markdown@0.8.5: - resolution: {integrity: sha512-2hkTXtYYnr+NubD/g6KGBS/0mFmBcifAsI0yIWRiRo0PjVs6SSOSOdtzbp6kSGnShDN6G5aWZpKQ2lWRy27mWQ==} - - mdast-util-from-markdown@1.3.1: - resolution: {integrity: sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww==} - - mdast-util-from-markdown@2.0.0: - resolution: {integrity: sha512-n7MTOr/z+8NAX/wmhhDji8O3bRvPTV/U0oTCaZJkjhPSKTPhS3xufVhKGF8s1pJ7Ox4QgoIU7KHseh09S+9rTA==} - - mdast-util-frontmatter@2.0.1: - resolution: {integrity: sha512-LRqI9+wdgC25P0URIJY9vwocIzCcksduHQ9OF2joxQoyTNVduwLAFUzjoopuRJbJAReaKrNQKAZKL3uCMugWJA==} - - mdast-util-gfm-autolink-literal@1.0.3: - resolution: {integrity: sha512-My8KJ57FYEy2W2LyNom4n3E7hKTuQk/0SES0u16tjA9Z3oFkF4RrC/hPAPgjlSpezsOvI8ObcXcElo92wn5IGA==} - - mdast-util-gfm-footnote@1.0.2: - resolution: {integrity: sha512-56D19KOGbE00uKVj3sgIykpwKL179QsVFwx/DCW0u/0+URsryacI4MAdNJl0dh+u2PSsD9FtxPFbHCzJ78qJFQ==} - - mdast-util-gfm-strikethrough@1.0.3: - resolution: {integrity: sha512-DAPhYzTYrRcXdMjUtUjKvW9z/FNAMTdU0ORyMcbmkwYNbKocDpdk+PX1L1dQgOID/+vVs1uBQ7ElrBQfZ0cuiQ==} - - mdast-util-gfm-table@1.0.7: - resolution: {integrity: sha512-jjcpmNnQvrmN5Vx7y7lEc2iIOEytYv7rTvu+MeyAsSHTASGCCRA79Igg2uKssgOs1i1po8s3plW0sTu1wkkLGg==} - - mdast-util-gfm-task-list-item@1.0.2: - resolution: {integrity: sha512-PFTA1gzfp1B1UaiJVyhJZA1rm0+Tzn690frc/L8vNX1Jop4STZgOE6bxUhnzdVSB+vm2GU1tIsuQcA9bxTQpMQ==} - - mdast-util-gfm@2.0.2: - resolution: {integrity: sha512-qvZ608nBppZ4icQlhQQIAdc6S3Ffj9RGmzwUKUWuEICFnd1LVkN3EktF7ZHAgfcEdvZB5owU9tQgt99e2TlLjg==} - - mdast-util-heading-style@2.0.1: - resolution: {integrity: sha512-0L5rthU4xKDVbw+UQ7D8Y8xOEsX4JXZvemWoEAsL+WAaeSH+TvVVwFnTb3G/OrjyP4VYQULoNWU+PdZfkmNu4A==} - - mdast-util-math@2.0.2: - resolution: {integrity: sha512-8gmkKVp9v6+Tgjtq6SYx9kGPpTf6FVYRa53/DLh479aldR9AyP48qeVOgNZ5X7QUK7nOy4yw7vg6mbiGcs9jWQ==} - - mdast-util-mdx-expression@1.3.2: - resolution: {integrity: sha512-xIPmR5ReJDu/DHH1OoIT1HkuybIfRGYRywC+gJtI7qHjCJp/M9jrmBEJW22O8lskDWm562BX2W8TiAwRTb0rKA==} - - mdast-util-mdx-jsx@2.1.4: - resolution: {integrity: sha512-DtMn9CmVhVzZx3f+optVDF8yFgQVt7FghCRNdlIaS3X5Bnym3hZwPbg/XW86vdpKjlc1PVj26SpnLGeJBXD3JA==} - - mdast-util-mdx@2.0.1: - resolution: {integrity: sha512-38w5y+r8nyKlGvNjSEqWrhG0w5PmnRA+wnBvm+ulYCct7nsGYhFVb0lljS9bQav4psDAS1eGkP2LMVcZBi/aqw==} - - mdast-util-mdxjs-esm@1.3.1: - resolution: {integrity: sha512-SXqglS0HrEvSdUEfoXFtcg7DRl7S2cwOXc7jkuusG472Mmjag34DUDeOJUZtl+BVnyeO1frIgVpHlNRWc2gk/w==} - - mdast-util-phrasing@3.0.1: - resolution: {integrity: sha512-WmI1gTXUBJo4/ZmSk79Wcb2HcjPJBzM1nlI/OUWA8yk2X9ik3ffNbBGsU+09BFmXaL1IBb9fiuvq6/KMiNycSg==} - - mdast-util-phrasing@4.1.0: - resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==} - - mdast-util-to-hast@12.3.0: - resolution: {integrity: sha512-pits93r8PhnIoU4Vy9bjW39M2jJ6/tdHyja9rrot9uujkN7UTU9SDnE6WNJz/IGyQk3XHX6yNNtrBH6cQzm8Hw==} - - mdast-util-to-hast@13.1.0: - resolution: {integrity: sha512-/e2l/6+OdGp/FB+ctrJ9Avz71AN/GRH3oi/3KAx/kMnoUsD6q0woXlDT8lLEeViVKE7oZxE7RXzvO3T8kF2/sA==} - - mdast-util-to-markdown@1.5.0: - resolution: {integrity: sha512-bbv7TPv/WC49thZPg3jXuqzuvI45IL2EVAr/KxF0BSdHsU0ceFHOmwQn6evxAh1GaoK/6GQ1wp4R4oW2+LFL/A==} - - mdast-util-to-markdown@2.1.0: - resolution: {integrity: sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ==} - - mdast-util-to-string@2.0.0: - resolution: {integrity: sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==} - - mdast-util-to-string@3.2.0: - resolution: {integrity: sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg==} - - mdast-util-to-string@4.0.0: - resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} - - merge2@1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} - engines: {node: '>= 8'} - - merkletreejs@0.3.11: - resolution: {integrity: sha512-LJKTl4iVNTndhL+3Uz/tfkjD0klIWsHlUzgtuNnNrsf7bAlXR30m+xYB7lHr5Z/l6e/yAIsr26Dabx6Buo4VGQ==} - engines: {node: '>= 7.6.0'} - - mermaid@10.9.3: - resolution: {integrity: sha512-V80X1isSEvAewIL3xhmz/rVmc27CVljcsbWxkxlWJWY/1kQa4XOABqpDl2qQLGKzpKm6WbTfUEKImBlUfFYArw==} - - micro-ftch@0.3.1: - resolution: {integrity: sha512-/0LLxhzP0tfiR5hcQebtudP56gUurs2CLkGarnCiB/OqEyUFQ6U3paQi/tgLv0hBJYt2rnr9MNpxz4fiiugstg==} - - micromark-core-commonmark@1.1.0: - resolution: {integrity: sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw==} - - micromark-core-commonmark@2.0.1: - resolution: {integrity: sha512-CUQyKr1e///ZODyD1U3xit6zXwy1a8q2a1S1HKtIlmgvurrEpaw/Y9y6KSIbF8P59cn/NjzHyO+Q2fAyYLQrAA==} - - micromark-extension-frontmatter@2.0.0: - resolution: {integrity: sha512-C4AkuM3dA58cgZha7zVnuVxBhDsbttIMiytjgsM2XbHAB2faRVaHRle40558FBN+DJcrLNCoqG5mlrpdU4cRtg==} - - micromark-extension-gfm-autolink-literal@1.0.5: - resolution: {integrity: sha512-z3wJSLrDf8kRDOh2qBtoTRD53vJ+CWIyo7uyZuxf/JAbNJjiHsOpG1y5wxk8drtv3ETAHutCu6N3thkOOgueWg==} - - micromark-extension-gfm-footnote@1.1.2: - resolution: {integrity: sha512-Yxn7z7SxgyGWRNa4wzf8AhYYWNrwl5q1Z8ii+CSTTIqVkmGZF1CElX2JI8g5yGoM3GAman9/PVCUFUSJ0kB/8Q==} - - micromark-extension-gfm-strikethrough@1.0.7: - resolution: {integrity: sha512-sX0FawVE1o3abGk3vRjOH50L5TTLr3b5XMqnP9YDRb34M0v5OoZhG+OHFz1OffZ9dlwgpTBKaT4XW/AsUVnSDw==} - - micromark-extension-gfm-table@1.0.7: - resolution: {integrity: sha512-3ZORTHtcSnMQEKtAOsBQ9/oHp9096pI/UvdPtN7ehKvrmZZ2+bbWhi0ln+I9drmwXMt5boocn6OlwQzNXeVeqw==} - - micromark-extension-gfm-tagfilter@1.0.2: - resolution: {integrity: sha512-5XWB9GbAUSHTn8VPU8/1DBXMuKYT5uOgEjJb8gN3mW0PNW5OPHpSdojoqf+iq1xo7vWzw/P8bAHY0n6ijpXF7g==} - - micromark-extension-gfm-task-list-item@1.0.5: - resolution: {integrity: sha512-RMFXl2uQ0pNQy6Lun2YBYT9g9INXtWJULgbt01D/x8/6yJ2qpKyzdZD3pi6UIkzF++Da49xAelVKUeUMqd5eIQ==} - - micromark-extension-gfm@2.0.3: - resolution: {integrity: sha512-vb9OoHqrhCmbRidQv/2+Bc6pkP0FrtlhurxZofvOEy5o8RtuuvTq+RQ1Vw5ZDNrVraQZu3HixESqbG+0iKk/MQ==} - - micromark-extension-math@2.1.2: - resolution: {integrity: sha512-es0CcOV89VNS9wFmyn+wyFTKweXGW4CEvdaAca6SWRWPyYCbBisnjaHLjWO4Nszuiud84jCpkHsqAJoa768Pvg==} - - micromark-extension-mdx-expression@1.0.8: - resolution: {integrity: sha512-zZpeQtc5wfWKdzDsHRBY003H2Smg+PUi2REhqgIhdzAa5xonhP03FcXxqFSerFiNUr5AWmHpaNPQTBVOS4lrXw==} - - micromark-extension-mdx-jsx@1.0.5: - resolution: {integrity: sha512-gPH+9ZdmDflbu19Xkb8+gheqEDqkSpdCEubQyxuz/Hn8DOXiXvrXeikOoBA71+e8Pfi0/UYmU3wW3H58kr7akA==} - - micromark-extension-mdx-md@1.0.1: - resolution: {integrity: sha512-7MSuj2S7xjOQXAjjkbjBsHkMtb+mDGVW6uI2dBL9snOBCbZmoNgDAeZ0nSn9j3T42UE/g2xVNMn18PJxZvkBEA==} - - micromark-extension-mdxjs-esm@1.0.5: - resolution: {integrity: sha512-xNRBw4aoURcyz/S69B19WnZAkWJMxHMT5hE36GtDAyhoyn/8TuAeqjFJQlwk+MKQsUD7b3l7kFX+vlfVWgcX1w==} - - micromark-extension-mdxjs@1.0.1: - resolution: {integrity: sha512-7YA7hF6i5eKOfFUzZ+0z6avRG52GpWR8DL+kN47y3f2KhxbBZMhmxe7auOeaTBrW2DenbbZTf1ea9tA2hDpC2Q==} - - micromark-factory-destination@1.1.0: - resolution: {integrity: sha512-XaNDROBgx9SgSChd69pjiGKbV+nfHGDPVYFs5dOoDd7ZnMAE+Cuu91BCpsY8RT2NP9vo/B8pds2VQNCLiu0zhg==} - - micromark-factory-destination@2.0.0: - resolution: {integrity: sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==} - - micromark-factory-label@1.1.0: - resolution: {integrity: sha512-OLtyez4vZo/1NjxGhcpDSbHQ+m0IIGnT8BoPamh+7jVlzLJBH98zzuCoUeMxvM6WsNeh8wx8cKvqLiPHEACn0w==} - - micromark-factory-label@2.0.0: - resolution: {integrity: sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==} - - micromark-factory-mdx-expression@1.0.9: - resolution: {integrity: sha512-jGIWzSmNfdnkJq05c7b0+Wv0Kfz3NJ3N4cBjnbO4zjXIlxJr+f8lk+5ZmwFvqdAbUy2q6B5rCY//g0QAAaXDWA==} - - micromark-factory-space@1.1.0: - resolution: {integrity: sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==} - - micromark-factory-space@2.0.0: - resolution: {integrity: sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==} - - micromark-factory-title@1.1.0: - resolution: {integrity: sha512-J7n9R3vMmgjDOCY8NPw55jiyaQnH5kBdV2/UXCtZIpnHH3P6nHUKaH7XXEYuWwx/xUJcawa8plLBEjMPU24HzQ==} - - micromark-factory-title@2.0.0: - resolution: {integrity: sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A==} - - micromark-factory-whitespace@1.1.0: - resolution: {integrity: sha512-v2WlmiymVSp5oMg+1Q0N1Lxmt6pMhIHD457whWM7/GUlEks1hI9xj5w3zbc4uuMKXGisksZk8DzP2UyGbGqNsQ==} - - micromark-factory-whitespace@2.0.0: - resolution: {integrity: sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==} - - micromark-util-character@1.2.0: - resolution: {integrity: sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==} - - micromark-util-character@2.1.0: - resolution: {integrity: sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==} - - micromark-util-chunked@1.1.0: - resolution: {integrity: sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ==} - - micromark-util-chunked@2.0.0: - resolution: {integrity: sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==} - - micromark-util-classify-character@1.1.0: - resolution: {integrity: sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw==} - - micromark-util-classify-character@2.0.0: - resolution: {integrity: sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==} - - micromark-util-combine-extensions@1.1.0: - resolution: {integrity: sha512-Q20sp4mfNf9yEqDL50WwuWZHUrCO4fEyeDCnMGmG5Pr0Cz15Uo7KBs6jq+dq0EgX4DPwwrh9m0X+zPV1ypFvUA==} - - micromark-util-combine-extensions@2.0.0: - resolution: {integrity: sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ==} - - micromark-util-decode-numeric-character-reference@1.1.0: - resolution: {integrity: sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw==} - - micromark-util-decode-numeric-character-reference@2.0.1: - resolution: {integrity: sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ==} - - micromark-util-decode-string@1.1.0: - resolution: {integrity: sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ==} - - micromark-util-decode-string@2.0.0: - resolution: {integrity: sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA==} - - micromark-util-encode@1.1.0: - resolution: {integrity: sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw==} - - micromark-util-encode@2.0.0: - resolution: {integrity: sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==} - - micromark-util-events-to-acorn@1.2.3: - resolution: {integrity: sha512-ij4X7Wuc4fED6UoLWkmo0xJQhsktfNh1J0m8g4PbIMPlx+ek/4YdW5mvbye8z/aZvAPUoxgXHrwVlXAPKMRp1w==} - - micromark-util-html-tag-name@1.2.0: - resolution: {integrity: sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q==} - - micromark-util-html-tag-name@2.0.0: - resolution: {integrity: sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==} - - micromark-util-normalize-identifier@1.1.0: - resolution: {integrity: sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q==} - - micromark-util-normalize-identifier@2.0.0: - resolution: {integrity: sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==} - - micromark-util-resolve-all@1.1.0: - resolution: {integrity: sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA==} - - micromark-util-resolve-all@2.0.0: - resolution: {integrity: sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==} - - micromark-util-sanitize-uri@1.2.0: - resolution: {integrity: sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A==} - - micromark-util-sanitize-uri@2.0.0: - resolution: {integrity: sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==} - - micromark-util-subtokenize@1.1.0: - resolution: {integrity: sha512-kUQHyzRoxvZO2PuLzMt2P/dwVsTiivCK8icYTeR+3WgbuPqfHgPPy7nFKbeqRivBvn/3N3GBiNC+JRTMSxEC7A==} - - micromark-util-subtokenize@2.0.1: - resolution: {integrity: sha512-jZNtiFl/1aY73yS3UGQkutD0UbhTt68qnRpw2Pifmz5wV9h8gOVsN70v+Lq/f1rKaU/W8pxRe8y8Q9FX1AOe1Q==} - - micromark-util-symbol@1.1.0: - resolution: {integrity: sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==} - - micromark-util-symbol@2.0.0: - resolution: {integrity: sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==} - - micromark-util-types@1.1.0: - resolution: {integrity: sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==} - - micromark-util-types@2.0.0: - resolution: {integrity: sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==} - - micromark@2.11.4: - resolution: {integrity: sha512-+WoovN/ppKolQOFIAajxi7Lu9kInbPxFuTBVEavFcL8eAfVstoc5MocPmqBeAdBOJV00uaVjegzH4+MA0DN/uA==} - - micromark@3.2.0: - resolution: {integrity: sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA==} - - micromark@4.0.0: - resolution: {integrity: sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==} - - micromatch@4.0.5: - resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} - engines: {node: '>=8.6'} - - min-indent@1.0.1: - resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} - engines: {node: '>=4'} - - minimalistic-assert@1.0.1: - resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} - - minimalistic-crypto-utils@1.0.1: - resolution: {integrity: sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==} - - minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - - minimatch@5.1.6: - resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} - engines: {node: '>=10'} - - minimatch@9.0.3: - resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} - engines: {node: '>=16 || 14 >=14.17'} - - minimatch@9.0.4: - resolution: {integrity: sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==} - engines: {node: '>=16 || 14 >=14.17'} - - minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - - minipass@7.0.4: - resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==} - engines: {node: '>=16 || 14 >=14.17'} - - mri@1.2.0: - resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} - engines: {node: '>=4'} - - ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - - nanoid@3.3.7: - resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - - natural-compare@1.4.0: - resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - - next-mdx-remote@4.4.1: - resolution: {integrity: sha512-1BvyXaIou6xy3XoNF4yaMZUCb6vD2GTAa5ciOa6WoO+gAUTYsb1K4rI/HSC2ogAWLrb/7VSV52skz07vOzmqIQ==} - engines: {node: '>=14', npm: '>=7'} - peerDependencies: - react: '>=16.x <=18.x' - react-dom: '>=16.x <=18.x' - - next-seo@6.5.0: - resolution: {integrity: sha512-MfzUeWTN/x/rsKp/1n0213eojO97lIl0unxqbeCY+6pAucViHDA8GSLRRcXpgjsSmBxfCFdfpu7LXbt4ANQoNQ==} - peerDependencies: - next: ^8.1.1-canary.54 || >=9.0.0 - react: '>=16.0.0' - react-dom: '>=16.0.0' - - next-sitemap@4.2.3: - resolution: {integrity: sha512-vjdCxeDuWDzldhCnyFCQipw5bfpl4HmZA7uoo3GAaYGjGgfL4Cxb1CiztPuWGmS+auYs7/8OekRS8C2cjdAsjQ==} - engines: {node: '>=14.18'} - hasBin: true - peerDependencies: - next: '*' - - next-themes@0.2.1: - resolution: {integrity: sha512-B+AKNfYNIzh0vqQQKqQItTS8evEouKD7H5Hj3kmuPERwddR2TxvDSFZuTj6T7Jfn1oyeUyJMydPl1Bkxkh0W7A==} - peerDependencies: - next: '*' - react: '*' - react-dom: '*' - - next@14.2.10: - resolution: {integrity: sha512-sDDExXnh33cY3RkS9JuFEKaS4HmlWmDKP1VJioucCG6z5KuA008DPsDZOzi8UfqEk3Ii+2NCQSJrfbEWtZZfww==} - engines: {node: '>=18.17.0'} - hasBin: true - peerDependencies: - '@opentelemetry/api': ^1.1.0 - '@playwright/test': ^1.41.2 - react: ^18.2.0 - react-dom: ^18.2.0 - sass: ^1.3.0 - peerDependenciesMeta: - '@opentelemetry/api': - optional: true - '@playwright/test': - optional: true - sass: - optional: true - - nextra-theme-docs@2.13.2: - resolution: {integrity: sha512-yE4umXaImp1/kf/sFciPj2+EFrNSwd9Db26hi98sIIiujzGf3+9eUgAz45vF9CwBw50FSXxm1QGRcY+slQ4xQQ==} - peerDependencies: - next: '>=9.5.3' - nextra: 2.13.2 - react: '>=16.13.1' - react-dom: '>=16.13.1' - - nextra@2.13.2: - resolution: {integrity: sha512-pIgOSXNUqTz1laxV4ChFZOU7lzJAoDHHaBPj8L09PuxrLKqU1BU/iZtXAG6bQeKCx8EPdBsoXxEuENnL9QGnGA==} - engines: {node: '>=16'} - peerDependencies: - next: '>=9.5.3' - react: '>=16.13.1' - react-dom: '>=16.13.1' - - no-case@3.0.4: - resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} - - node-fetch@2.7.0: - resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} - engines: {node: 4.x || >=6.0.0} - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true - - non-layered-tidy-tree-layout@2.0.2: - resolution: {integrity: sha512-gkXMxRzUH+PB0ax9dUN0yYF0S25BqeAYqhgMaLUFmpXLEk7Fcu8f4emJuOAY0V8kjDICxROIKsTAKsV/v355xw==} - - nopt@7.2.0: - resolution: {integrity: sha512-CVDtwCdhYIvnAzFoJ6NJ6dX3oga9/HyciQDnG1vQDjSLMeKLJ4A93ZqYKDrgYSr1FBY5/hMYC+2VCi24pgpkGA==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - hasBin: true - - npm-normalize-package-bin@3.0.1: - resolution: {integrity: sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - - npm-run-path@2.0.2: - resolution: {integrity: sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==} - engines: {node: '>=4'} - - npm-to-yarn@2.2.1: - resolution: {integrity: sha512-O/j/ROyX0KGLG7O6Ieut/seQ0oiTpHF2tXAcFbpdTLQFiaNtkyTXXocM1fwpaa60dg1qpWj0nHlbNhx6qwuENQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - number-to-bn@1.7.0: - resolution: {integrity: sha512-wsJ9gfSz1/s4ZsJN01lyonwuxA1tml6X1yBDnfpMglypcBRFZZkus26EdPSlqS5GJfYddVZa22p3VNb3z5m5Ig==} - engines: {node: '>=6.5.0', npm: '>=3'} - - object-inspect@1.13.1: - resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} - - object-is@1.1.6: - resolution: {integrity: sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==} - engines: {node: '>= 0.4'} - - object-keys@1.1.1: - resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} - engines: {node: '>= 0.4'} - - object.assign@4.1.5: - resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} - engines: {node: '>= 0.4'} - - once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - - optionator@0.9.4: - resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} - engines: {node: '>= 0.8.0'} - - p-finally@1.0.0: - resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==} - engines: {node: '>=4'} - - p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} - - p-limit@4.0.0: - resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - - p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} - - p-locate@6.0.0: - resolution: {integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - - param-case@3.0.4: - resolution: {integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==} - - parent-module@1.0.1: - resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} - engines: {node: '>=6'} - - parent-module@2.0.0: - resolution: {integrity: sha512-uo0Z9JJeWzv8BG+tRcapBKNJ0dro9cLyczGzulS6EfeyAdeC9sbojtW6XwvYxJkEne9En+J2XEl4zyglVeIwFg==} - engines: {node: '>=8'} - - parse-entities@2.0.0: - resolution: {integrity: sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==} - - parse-entities@4.0.1: - resolution: {integrity: sha512-SWzvYcSJh4d/SGLIOQfZ/CoNv6BTlI6YEQ7Nj82oDVnRpwe/Z/F1EMx42x3JAOwGBlCjeCH0BRJQbQ/opHL17w==} - - parse-json@6.0.2: - resolution: {integrity: sha512-SA5aMiaIjXkAiBrW/yPgLgQAQg42f7K3ACO+2l/zOvtQBwX58DMUsFJXelW2fx3yMBmWOVkR6j1MGsdSbCA4UA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - - parse-numeric-range@1.3.0: - resolution: {integrity: sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ==} - - parse-path@7.0.0: - resolution: {integrity: sha512-Euf9GG8WT9CdqwuWJGdf3RkUcTBArppHABkO7Lm8IzRQp0e2r/kkFnmhu4TSK30Wcu5rVAZLmfPKSBBi9tWFog==} - - parse-url@8.1.0: - resolution: {integrity: sha512-xDvOoLU5XRrcOZvnI6b8zA6n9O9ejNk/GExuz1yBuWUGn9KA97GI6HTs6u02wKara1CeVmZhH+0TZFdWScR89w==} - - parse5@7.1.2: - resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} - - pascal-case@3.1.2: - resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==} - - path-case@3.0.4: - resolution: {integrity: sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg==} - - path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} - - path-exists@5.0.0: - resolution: {integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - - path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} - - path-key@2.0.1: - resolution: {integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==} - engines: {node: '>=4'} - - path-key@3.1.1: - resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} - engines: {node: '>=8'} - - path-scurry@1.10.2: - resolution: {integrity: sha512-7xTavNy5RQXnsjANvVvMkEjvloOinkAjv/Z6Ildz9v2RinZ4SBKTWFOVRbaF8p0vpHnyjV/UwNDdKuUv6M5qcA==} - engines: {node: '>=16 || 14 >=14.17'} - - path-type@4.0.0: - resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} - engines: {node: '>=8'} - - pathval@1.1.1: - resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} - - periscopic@3.1.0: - resolution: {integrity: sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==} - - picocolors@1.0.0: - resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} - - picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} - - pluralize@8.0.0: - resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} - engines: {node: '>=4'} - - possible-typed-array-names@1.0.0: - resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} - engines: {node: '>= 0.4'} - - postcss@8.4.31: - resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} - engines: {node: ^10 || ^12 || >=14} - - prelude-ls@1.2.1: - resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} - engines: {node: '>= 0.8.0'} - - pretty-format@27.5.1: - resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - - proc-log@3.0.0: - resolution: {integrity: sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - - property-information@6.5.0: - resolution: {integrity: sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==} - - protocols@2.0.1: - resolution: {integrity: sha512-/XJ368cyBJ7fzLMwLKv1e4vLxOju2MNAIokcr7meSaNcVbWz/CPcW22cP04mwxOErdA5mwjA8Q6w/cdAQxVn7Q==} - - pseudomap@1.0.2: - resolution: {integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==} - - punycode@2.3.1: - resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} - engines: {node: '>=6'} - - queue-microtask@1.2.3: - resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - - randombytes@2.1.0: - resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} - - react-dom@18.3.1: - resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==} - peerDependencies: - react: ^18.3.1 - - react-is@17.0.2: - resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} - - react@18.3.1: - resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} - engines: {node: '>=0.10.0'} - - read-package-json-fast@3.0.2: - resolution: {integrity: sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - - readable-stream@3.6.2: - resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} - engines: {node: '>= 6'} - - reading-time@1.5.0: - resolution: {integrity: sha512-onYyVhBNr4CmAxFsKS7bz+uTLRakypIe4R+5A824vBSkQy/hB3fZepoVEf8OVAxzLvK+H/jm9TzpI3ETSm64Kg==} - - regenerator-runtime@0.14.1: - resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} - - regexp.prototype.flags@1.5.2: - resolution: {integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==} - engines: {node: '>= 0.4'} - - rehype-katex@7.0.0: - resolution: {integrity: sha512-h8FPkGE00r2XKU+/acgqwWUlyzve1IiOKwsEkg4pDL3k48PiE0Pt+/uLtVHDVkN1yA4iurZN6UES8ivHVEQV6Q==} - - rehype-pretty-code@0.9.11: - resolution: {integrity: sha512-Eq90eCYXQJISktfRZ8PPtwc5SUyH6fJcxS8XOMnHPUQZBtC6RYo67gGlley9X2nR8vlniPj0/7oCDEYHKQa/oA==} - engines: {node: '>=16'} - peerDependencies: - shiki: '*' - - rehype-raw@7.0.0: - resolution: {integrity: sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==} - - remark-code-import@1.2.0: - resolution: {integrity: sha512-fgwLruqlZbVOIhCJFjY+JDwPZhA4/eK3InJzN8Ox8UDdtudpG212JwtRj6la+lAzJU7JmSEyewZSukVZdknt3Q==} - engines: {node: '>= 12'} - - remark-frontmatter@5.0.0: - resolution: {integrity: sha512-XTFYvNASMe5iPN0719nPrdItC9aU0ssC4v14mH1BCi1u0n1gAocqcujWUrByftZTbLhRtiKRyjYTSIOcr69UVQ==} - - remark-gfm@3.0.1: - resolution: {integrity: sha512-lEFDoi2PICJyNrACFOfDD3JlLkuSbOa5Wd8EPt06HUdptv8Gn0bxYTdbU/XXQ3swAPkEaGxxPN9cbnMHvVu1Ig==} - - remark-lint-blockquote-indentation@3.1.2: - resolution: {integrity: sha512-5DOrFsZd5dXqA4p/VZvWSrqIWNFbBXjX7IV/FkVkxlNhNF/0FMf/4v8x1I2W3mzaZ7yDsWS/egpZnmligq1ckQ==} - - remark-lint-checkbox-character-style@4.1.2: - resolution: {integrity: sha512-5ITz+1cCuJ3Jv/Q7rKgDEucCOnIgjWDnSHPJA1tb4TI/D316h+ALbDhZIpP8gyfAm6sBAh3Pwz9XZJN2uJB5UQ==} - - remark-lint-code-block-style@3.1.2: - resolution: {integrity: sha512-3wsWmzzdyEsB9sOzBOf46TSkwwVKXN2JpTEQb6feN0Tl6Vg75F7T9MHqMz7aqk/56bOXSxUzdpXDscGBhziLRA==} - - remark-lint-emphasis-marker@3.1.2: - resolution: {integrity: sha512-hPZ8vxZrIfxmLA5B66bA8y3PdHjcCQuaLsySIqi5PM2DkpN6a7zAP3v1znyRSaYJ1ANVWcu00/0bNzuUjflGCA==} - - remark-lint-fenced-code-marker@3.1.2: - resolution: {integrity: sha512-6XNqjOuhT+0c7Q/22aCsMz61ne9g8HRpYF79EXQPdbzYa+PcfPXMiQKStONY3PfC8OE2/3WXI2zcs8w9x+8+VQ==} - - remark-lint-final-newline@2.1.2: - resolution: {integrity: sha512-K0FdPGPyEB94PwNgopwVJFE8oRWi7IhY2ycXFVAMReI51el7EHB8F1gX14tB6p6zyGy6mUh69bCVU9mMTNeOUg==} - - remark-lint-frontmatter-schema@3.15.4: - resolution: {integrity: sha512-egChkbtCCG4hw1F2qoipzSxp6Ea9z4pxaVkWYa36DnCZ9fn3GhCNyOUjbFSIvdhVcWN+AqvHdqPbXC9Pp81Hmg==} - - remark-lint-hard-break-spaces@3.1.2: - resolution: {integrity: sha512-HaW0xsl3TI7VFAqGWWcZtPqyz0NWu19KKjSO7OGFTUJU4S9YiRnhIxmSFM0ZLSsVAynE+dhzVKa8U7dOpWDcOg==} - - remark-lint-heading-style@3.1.2: - resolution: {integrity: sha512-0RkcRPV/H2bPFgeInzBkK1cWUwtFTm83I+Db/Z5tDY02GzKOosHLvxtJyj/1391/opAH1LYbHtHWffir99IUgw==} - - remark-lint-link-title-style@3.1.2: - resolution: {integrity: sha512-if4MahYJVvQUWlrXDF8GSv4b9VtLSgMSDHeikQp1/hGYlihLl9uGw3nlL5Lf9DqTN0qaT6RPbXOjuuzHlk38sg==} - - remark-lint-list-item-bullet-indent@4.1.2: - resolution: {integrity: sha512-WgU5nooqIEm6f35opcbHKBzWrdFJA3XcyTfB3nv/v0KX43/h6qFGmmMJ5kEiaFExuQp3dZSdatWuY0YZ9YRbUg==} - - remark-lint-list-item-content-indent@3.1.2: - resolution: {integrity: sha512-TB0pmrWiRaQW80Y/PILFQTnHDghRxXNzMwyawlP+DBF9gNom3pEBmb4ZlGQlN0aa3r8VWeIKdv1ylHrfXE0vqA==} - - remark-lint-list-item-indent@3.1.2: - resolution: {integrity: sha512-tkrra1pxZVE4OVJGfN435u/v0ljruXU+dHzWiKDYeifquD4aWhJxvSApu7+FbE098D/4usVXgMxwFkNhrpZcSQ==} - - remark-lint-no-blockquote-without-marker@5.1.2: - resolution: {integrity: sha512-QPbqsrt7EfpSWqTkZJ9tepabPIhBDlNqZkuxxMQYD0OQ2N+tHDUq3zE1JxI5ts1V9o/mWApgySocqGd3jlcKmQ==} - - remark-lint-no-duplicate-definitions@3.1.2: - resolution: {integrity: sha512-vi0nXA7p+pjQOorZOkr9E+QDhG74JAdbzqglWPrWWNI3z2rUYWYHTNSyWJbwEXaIIcev1ZAw8SCAOis5MNm+pA==} - - remark-lint-no-heading-content-indent@4.1.2: - resolution: {integrity: sha512-TTxFsm1f4ZHFxZQCuz7j0QK4RvP6oArTiwazKLr16yaZe1608ypogMek4A30j2xX8WuO9+2uBzLXCY5OBo5x5Q==} - - remark-lint-no-inline-padding@4.1.2: - resolution: {integrity: sha512-dGyhWsiqCZS3Slob0EVBUfsFBbdpMIBCvb56LlCgaHbnLsnNYx8PpF/wA5CgsN8BXIbXfRpyPB5cIJwIq5taYg==} - - remark-lint-no-literal-urls@3.1.2: - resolution: {integrity: sha512-4tV9JGLKxAMFSuWDMOqLozkFJ3HyRvhzgrPrxASoziaml23m7UXAozk5dkIrFny1cN2oG988Z8tORxX2FL1Ilw==} - - remark-lint-no-shortcut-reference-image@3.1.2: - resolution: {integrity: sha512-NX4XJFPyDeJJ77pmETxRj4oM/zayf7Lmn/O87HgExBkQIPz2NYbDeKD8QEyliLaV/oKA2rQufpzuFw55xa1Tww==} - - remark-lint-no-shortcut-reference-link@3.1.2: - resolution: {integrity: sha512-/9iPN7FLKaaIzw4tLWKu7Rx0wAP7E2EuzIeentQlkY0rO/mMHipmT3IlgiebsAInKagzTY6TNFoG1rq2VnaCcA==} - - remark-lint-no-undefined-references@4.2.1: - resolution: {integrity: sha512-HdNg5b2KiuNplcuVvRtsrUiROw557kAG1CiZYB7jQrrVWFgd86lKTa3bDiywe+87dGrGmHd3qQ28eZYTuHz2Nw==} - - remark-lint-no-unused-definitions@3.1.2: - resolution: {integrity: sha512-bOcaJAnjKxT3kASFquUA3fO9xem9wZhVqt8TbqjA84+G4n40qjaLXDs/4vq73aMsSde73K0f3j1u0pMe7et8yQ==} - - remark-lint-ordered-list-marker-style@3.1.2: - resolution: {integrity: sha512-62iVE/YQsA0Azaqt8yAJWPplWLS47kDLjXeC2PlRIAzCqbNt9qH3HId8vZ15QTSrp8rHmJwrCMdcqV6AZUi7gQ==} - - remark-lint-rule-style@3.1.2: - resolution: {integrity: sha512-0CsX2XcX9pIhAP5N7Y8mhYXp3/Ld+NvxXY1p0LHAq0NZu17UsZLuegvx/s25uFbQs08DcmSqyKnepU9qGGqmTQ==} - - remark-lint-strong-marker@3.1.2: - resolution: {integrity: sha512-U/g4wngmiI0Q6WBRQG6pZxnDS33Wt/0QYA3+KNFBDykoi1vXsDEorIqy3dEag9z6XHwcMvFDsff6VRUhaOJWQg==} - - remark-lint-table-cell-padding@4.1.3: - resolution: {integrity: sha512-N9xtnS6MG/H3srAMjqqaF26A7socr87pIgt64dr5rxoSbDRWRPChGQ8y7wKyV8VeyRNF37e3E5KB3bQVqjSYaQ==} - - remark-lint-table-pipe-alignment@3.1.3: - resolution: {integrity: sha512-bnE8WrB4kSrN+Yr+xN2GHWVgGukeSFU43qPMrpCzTyOSbzep366wORlFKqZmyFPEkIZ/uAUFS0Qm9DND66Yz/A==} - - remark-lint-table-pipes@4.1.2: - resolution: {integrity: sha512-Ex2cJDXA0hdD9CC5Nu0p3K5LP+AhzPvk4sIOSbevCTSRyCS/SkNk4CQ6pwWBxuPVuHQUkqXkT8lgu8wwr/9A3A==} - - remark-lint-unordered-list-marker-style@3.1.2: - resolution: {integrity: sha512-JFiyB4ZprJGGndCaFB8FssXd48m4Kh+CUqzNgu3lBLEiW8dEAGRlD9M2AzyyA+Q29WJP/FntDCbP22DeON91UA==} - - remark-lint@9.1.2: - resolution: {integrity: sha512-m9e/aPlh7tsvfJfj8tPxrQzD6oEdb9Foko+Ya/6OwUP9EoGMfehv1Qtv26W1DoH58Wn8rT8CD+KuprTWscMmIA==} - - remark-math@5.1.1: - resolution: {integrity: sha512-cE5T2R/xLVtfFI4cCePtiRn+e6jKMtFDR3P8V3qpv8wpKjwvHoBA4eJzvX+nVrnlNy0911bdGmuspCSwetfYHw==} - - remark-mdx@2.3.0: - resolution: {integrity: sha512-g53hMkpM0I98MU266IzDFMrTD980gNF3BJnkyFcmN+dD873mQeD5rdMO3Y2X+x8umQfbSE0PcoEDl7ledSA+2g==} - - remark-message-control@7.1.1: - resolution: {integrity: sha512-xKRWl1NTBOKed0oEtCd8BUfH5m4s8WXxFFSoo7uUwx6GW/qdCy4zov5LfPyw7emantDmhfWn5PdIZgcbVcWMDQ==} - - remark-parse@10.0.2: - resolution: {integrity: sha512-3ydxgHa/ZQzG8LvC7jTXccARYDcRld3VfcgIIFs7bI6vbRSxJJmzgLEIIoYKyrfhaY+ujuWaf/PJiMZXoiCXgw==} - - remark-parse@11.0.0: - resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==} - - remark-preset-lint-consistent@5.1.2: - resolution: {integrity: sha512-RQrWBFmyIkKfXtp9P1Fui7UbGSfXth9nuvRJUVnO0vfevBJe02iyMZWPokXSwkDOI/cM539wj0i3vrQupz+v5A==} - - remark-preset-lint-recommended@6.1.3: - resolution: {integrity: sha512-DGjbeP2TsFmQeJflUiIvJWAOs1PxJt7SG3WQyMxOppkRr/up+mxWVkuv+6AUuaR0EsuaaFGz7WmZM5TrSSFWJw==} - - remark-reading-time@2.0.1: - resolution: {integrity: sha512-fy4BKy9SRhtYbEHvp6AItbRTnrhiDGbqLQTSYVbQPGuRCncU1ubSsh9p/W5QZSxtYcUXv8KGL0xBgPLyNJA1xw==} - - remark-rehype@10.1.0: - resolution: {integrity: sha512-EFmR5zppdBp0WQeDVZ/b66CWJipB2q2VLNFMabzDSGR66Z2fQii83G5gTBbgGEnEEA0QRussvrFHxk1HWGJskw==} - - remark-stringify@10.0.3: - resolution: {integrity: sha512-koyOzCMYoUHudypbj4XpnAKFbkddRMYZHwghnxd7ue5210WzGw6kOBwauJTRUMq16jsovXx8dYNvSSWP89kZ3A==} - - remark-stringify@11.0.0: - resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==} - - remark@15.0.1: - resolution: {integrity: sha512-Eht5w30ruCXgFmxVUSlNWQ9iiimq07URKeFS3hNc8cUWy1llX4KDWfyEDZRycMc+znsN9Ux5/tJ/BFdgdOwA3A==} - - remove-accents@0.5.0: - resolution: {integrity: sha512-8g3/Otx1eJaVD12e31UbJj1YzdtVvzH85HV7t+9MJYk/u3XmkOUJ5Ys9wQrf9PCPK8+xn4ymzqYCiZl6QWKn+A==} - - repeat-string@1.6.1: - resolution: {integrity: sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==} - engines: {node: '>=0.10'} - - require-from-string@2.0.2: - resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} - engines: {node: '>=0.10.0'} - - resolve-from@4.0.0: - resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} - engines: {node: '>=4'} - - resolve-from@5.0.0: - resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} - engines: {node: '>=8'} - - reusify@1.0.4: - resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} - engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - - rimraf@3.0.2: - resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} - deprecated: Rimraf versions prior to v4 are no longer supported - hasBin: true - - rlp@2.2.7: - resolution: {integrity: sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ==} - hasBin: true - - robust-predicates@3.0.2: - resolution: {integrity: sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==} - - run-parallel@1.2.0: - resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} - - rw@1.3.3: - resolution: {integrity: sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==} - - sade@1.8.1: - resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} - engines: {node: '>=6'} - - safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - - safer-buffer@2.1.2: - resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - - scheduler@0.23.2: - resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} - - scroll-into-view-if-needed@3.1.0: - resolution: {integrity: sha512-49oNpRjWRvnU8NyGVmUaYG4jtTkNonFZI86MmGRDqBphEK2EXT9gdEUoQPZhuBM8yWHxCWbobltqYO5M4XrUvQ==} - - scrypt-js@3.0.1: - resolution: {integrity: sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==} - - search-insights@2.17.2: - resolution: {integrity: sha512-zFNpOpUO+tY2D85KrxJ+aqwnIfdEGi06UH2+xEb+Bp9Mwznmauqc9djbnBibJO5mpfUPPa8st6Sx65+vbeO45g==} - - section-matter@1.0.0: - resolution: {integrity: sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==} - engines: {node: '>=4'} - - semver@7.6.0: - resolution: {integrity: sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==} - engines: {node: '>=10'} - hasBin: true - - sentence-case@3.0.4: - resolution: {integrity: sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg==} - - set-function-length@1.2.2: - resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} - engines: {node: '>= 0.4'} - - set-function-name@2.0.2: - resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} - engines: {node: '>= 0.4'} - - shebang-command@1.2.0: - resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} - engines: {node: '>=0.10.0'} - - shebang-command@2.0.0: - resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} - engines: {node: '>=8'} - - shebang-regex@1.0.0: - resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==} - engines: {node: '>=0.10.0'} - - shebang-regex@3.0.0: - resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} - engines: {node: '>=8'} - - shiki@0.14.7: - resolution: {integrity: sha512-dNPAPrxSc87ua2sKJ3H5dQ/6ZaY8RNnaAqK+t0eG7p0Soi2ydiqbGOTaZCqaYvA/uZYfS1LJnemt3Q+mSfcPCg==} - - side-channel@1.0.6: - resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} - engines: {node: '>= 0.4'} - - signal-exit@3.0.7: - resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} - - signal-exit@4.1.0: - resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} - engines: {node: '>=14'} - - slash@3.0.0: - resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} - engines: {node: '>=8'} - - snake-case@3.0.4: - resolution: {integrity: sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==} - - sort-keys@5.0.0: - resolution: {integrity: sha512-Pdz01AvCAottHTPQGzndktFNdbRA75BgOfeT1hH+AMnJFv8lynkPi42rfeEhpx1saTEI3YNMWxfqu0sFD1G8pw==} - engines: {node: '>=12'} - - source-map-js@1.2.0: - resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} - engines: {node: '>=0.10.0'} - - source-map@0.7.4: - resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} - engines: {node: '>= 8'} - - space-separated-tokens@2.0.2: - resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} - - sprintf-js@1.0.3: - resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} - - stop-iteration-iterator@1.0.0: - resolution: {integrity: sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==} - engines: {node: '>= 0.4'} - - streamsearch@1.1.0: - resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} - engines: {node: '>=10.0.0'} - - string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} - - string-width@5.1.2: - resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} - engines: {node: '>=12'} - - string_decoder@1.3.0: - resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} - - stringify-entities@4.0.4: - resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} - - strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} - - strip-ansi@7.1.0: - resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} - engines: {node: '>=12'} - - strip-bom-string@1.0.0: - resolution: {integrity: sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==} - engines: {node: '>=0.10.0'} - - strip-eof@1.0.0: - resolution: {integrity: sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==} - engines: {node: '>=0.10.0'} - - strip-hex-prefix@1.0.0: - resolution: {integrity: sha512-q8d4ue7JGEiVcypji1bALTos+0pWtyGlivAWyPuTkHzuTCJqrK9sWxYQZUq6Nq3cuyv3bm734IhHvHtGGURU6A==} - engines: {node: '>=6.5.0', npm: '>=3'} - - strip-indent@4.0.0: - resolution: {integrity: sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA==} - engines: {node: '>=12'} - - strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} - - style-to-object@0.4.4: - resolution: {integrity: sha512-HYNoHZa2GorYNyqiCaBgsxvcJIn7OHq6inEga+E6Ke3m5JkoqpQbnFssk4jwe+K7AhGa2fcha4wSOf1Kn01dMg==} - - styled-jsx@5.1.1: - resolution: {integrity: sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==} - engines: {node: '>= 12.0.0'} - peerDependencies: - '@babel/core': '*' - babel-plugin-macros: '*' - react: '>= 16.8.0 || 17.x.x || ^18.0.0-0' - peerDependenciesMeta: - '@babel/core': - optional: true - babel-plugin-macros: - optional: true - - stylis@4.3.2: - resolution: {integrity: sha512-bhtUjWd/z6ltJiQwg0dUfxEJ+W+jdqQd8TbWLWyeIJHlnsqmGLRFFd8e5mA0AZi/zx90smXRlN66YMTcaSFifg==} - - supports-color@4.5.0: - resolution: {integrity: sha512-ycQR/UbvI9xIlEdQT1TQqwoXtEldExbCEAJgRo5YXlmSKjv6ThHnP9/vwGa1gr19Gfw+LkFd7KqYMhzrRC5JYw==} - engines: {node: '>=4'} - - supports-color@5.5.0: - resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} - engines: {node: '>=4'} - - supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} - - supports-color@9.4.0: - resolution: {integrity: sha512-VL+lNrEoIXww1coLPOmiEmK/0sGigko5COxI09KzHc2VJXJsQ37UaQ+8quuxjDeA7+KnLGTWRyOXSLLR2Wb4jw==} - engines: {node: '>=12'} - - synckit@0.9.0: - resolution: {integrity: sha512-7RnqIMq572L8PeEzKeBINYEJDDxpcH8JEgLwUqBd3TkofhFRbkq4QLR0u+36avGAhCRbk2nnmjcW9SE531hPDg==} - engines: {node: ^14.18.0 || >=16.0.0} - - tabbable@6.2.0: - resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==} - - text-table@0.2.0: - resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} - - tinyurl@1.1.7: - resolution: {integrity: sha512-NCnyDkBTByS/pLH/Vrx/DPL8EciAUDoAvruaM/WnQLfX6Uame3D1nuWNy2Z9CXw7rcsok0tjuonRLolhmyz5rg==} - deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. - - title@3.5.3: - resolution: {integrity: sha512-20JyowYglSEeCvZv3EZ0nZ046vLarO37prvV0mbtQV7C8DJPGgN967r8SJkqd3XK3K3lD3/Iyfp3avjfil8Q2Q==} - hasBin: true - - titleize@1.0.0: - resolution: {integrity: sha512-TARUb7z1pGvlLxgPk++7wJ6aycXF3GJ0sNSBTAsTuJrQG5QuZlkUQP+zl+nbjAh4gMX9yDw9ZYklMd7vAfJKEw==} - engines: {node: '>=0.10.0'} - - to-gatsby-remark-plugin@0.1.0: - resolution: {integrity: sha512-blmhJ/gIrytWnWLgPSRCkhCPeki6UBK2daa3k9mGahN7GjwHu8KrS7F70MvwlsG7IE794JLgwAdCbi4hU4faFQ==} - - to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} - - to-vfile@6.1.0: - resolution: {integrity: sha512-BxX8EkCxOAZe+D/ToHdDsJcVI4HqQfmw0tCkp31zf3dNP/XWIAjU4CmeuSwsSoOzOTqHPOL0KUzyZqJplkD0Qw==} - - to-vfile@7.2.4: - resolution: {integrity: sha512-2eQ+rJ2qGbyw3senPI0qjuM7aut8IYXK6AEoOWb+fJx/mQYzviTckm1wDjq91QYHAPBTYzmdJXxMFA6Mk14mdw==} - - tr46@0.0.3: - resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - - treeify@1.1.0: - resolution: {integrity: sha512-1m4RA7xVAJrSGrrXGs0L3YTwyvBs2S8PbRHaLZAkFw7JR8oIFwYtysxlBZhYIa7xSyiYJKZ3iGrrk55cGA3i9A==} - engines: {node: '>=0.6'} - - trim-lines@3.0.1: - resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} - - trough@2.2.0: - resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} - - ts-dedent@2.2.0: - resolution: {integrity: sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==} - engines: {node: '>=6.10'} - - tslib@2.6.2: - resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} - - type-check@0.4.0: - resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} - engines: {node: '>= 0.8.0'} - - type-detect@4.0.8: - resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} - engines: {node: '>=4'} - - type-fest@0.20.2: - resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} - engines: {node: '>=10'} - - type-fest@1.4.0: - resolution: {integrity: sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==} - engines: {node: '>=10'} - - typedarray-to-buffer@3.1.5: - resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} - - typedarray@0.0.6: - resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} - - typescript@5.4.5: - resolution: {integrity: sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==} - engines: {node: '>=14.17'} - hasBin: true - - unified-engine@10.1.0: - resolution: {integrity: sha512-5+JDIs4hqKfHnJcVCxTid1yBoI/++FfF/1PFdSMpaftZZZY+qg2JFruRbf7PaIwa9KgLotXQV3gSjtY0IdcFGQ==} - - unified-lint-rule@2.1.2: - resolution: {integrity: sha512-JWudPtRN7TLFHVLEVZ+Rm8FUb6kCAtHxEXFgBGDxRSdNMnGyTU5zyYvduHSF/liExlFB3vdFvsAHnNVE/UjAwA==} - - unified-message-control@4.0.0: - resolution: {integrity: sha512-1b92N+VkPHftOsvXNOtkJm4wHlr+UDmTBF2dUzepn40oy9NxanJ9xS1RwUBTjXJwqr2K0kMbEyv1Krdsho7+Iw==} - - unified@10.1.2: - resolution: {integrity: sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==} - - unified@11.0.4: - resolution: {integrity: sha512-apMPnyLjAX+ty4OrNap7yumyVAMlKx5IWU2wlzzUdYJO9A8f1p9m/gywF/GM2ZDFcjQPrx59Mc90KwmxsoklxQ==} - - unique-string@3.0.0: - resolution: {integrity: sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==} - engines: {node: '>=12'} - - unist-util-find-after@5.0.0: - resolution: {integrity: sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==} - - unist-util-generated@2.0.1: - resolution: {integrity: sha512-qF72kLmPxAw0oN2fwpWIqbXAVyEqUzDHMsbtPvOudIlUzXYFIeQIuxXQCRCFh22B7cixvU0MG7m3MW8FTq/S+A==} - - unist-util-inspect@7.0.2: - resolution: {integrity: sha512-Op0XnmHUl6C2zo/yJCwhXQSm/SmW22eDZdWP2qdf4WpGrgO1ZxFodq+5zFyeRGasFjJotAnLgfuD1jkcKqiH1Q==} - - unist-util-is@5.2.1: - resolution: {integrity: sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==} - - unist-util-is@6.0.0: - resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} - - unist-util-position-from-estree@1.1.2: - resolution: {integrity: sha512-poZa0eXpS+/XpoQwGwl79UUdea4ol2ZuCYguVaJS4qzIOMDzbqz8a3erUCOmubSZkaOuGamb3tX790iwOIROww==} - - unist-util-position@4.0.4: - resolution: {integrity: sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg==} - - unist-util-position@5.0.0: - resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} - - unist-util-remove-position@4.0.2: - resolution: {integrity: sha512-TkBb0HABNmxzAcfLf4qsIbFbaPDvMO6wa3b3j4VcEzFVaw1LBKwnW4/sRJ/atSLSzoIg41JWEdnE7N6DIhGDGQ==} - - unist-util-remove-position@5.0.0: - resolution: {integrity: sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==} - - unist-util-remove@4.0.0: - resolution: {integrity: sha512-b4gokeGId57UVRX/eVKej5gXqGlc9+trkORhFJpu9raqZkZhU0zm8Doi05+HaiBsMEIJowL+2WtQ5ItjsngPXg==} - - unist-util-stringify-position@2.0.3: - resolution: {integrity: sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==} - - unist-util-stringify-position@3.0.3: - resolution: {integrity: sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==} - - unist-util-stringify-position@4.0.0: - resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} - - unist-util-visit-parents@4.1.1: - resolution: {integrity: sha512-1xAFJXAKpnnJl8G7K5KgU7FY55y3GcLIXqkzUj5QF/QVP7biUm0K0O2oqVkYsdjzJKifYeWn9+o6piAK2hGSHw==} - - unist-util-visit-parents@5.1.3: - resolution: {integrity: sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==} - - unist-util-visit-parents@6.0.1: - resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==} - - unist-util-visit@3.1.0: - resolution: {integrity: sha512-Szoh+R/Ll68QWAyQyZZpQzZQm2UPbxibDvaY8Xc9SUtYgPsDzx5AWSk++UUt2hJuow8mvwR+rG+LQLw+KsuAKA==} - - unist-util-visit@4.1.2: - resolution: {integrity: sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==} - - unist-util-visit@5.0.0: - resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} - - upper-case-first@2.0.2: - resolution: {integrity: sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==} - - upper-case@2.0.2: - resolution: {integrity: sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg==} - - uri-js@4.4.1: - resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} - - utf8@3.0.0: - resolution: {integrity: sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ==} - - util-deprecate@1.0.2: - resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - - uuid@9.0.1: - resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} - hasBin: true - - uvu@0.5.6: - resolution: {integrity: sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA==} - engines: {node: '>=8'} - hasBin: true - - vfile-location@4.1.0: - resolution: {integrity: sha512-YF23YMyASIIJXpktBa4vIGLJ5Gs88UB/XePgqPmTa7cDA+JeO3yclbpheQYCHjVHBn/yePzrXuygIL+xbvRYHw==} - - vfile-location@5.0.2: - resolution: {integrity: sha512-NXPYyxyBSH7zB5U6+3uDdd6Nybz6o6/od9rk8bp9H8GR3L+cm/fC0uUTbqBmUTnMCUDslAGBOIKNfvvb+gGlDg==} - - vfile-matter@3.0.1: - resolution: {integrity: sha512-CAAIDwnh6ZdtrqAuxdElUqQRQDQgbbIrYtDYI8gCjXS1qQ+1XdLoK8FIZWxJwn0/I+BkSSZpar3SOgjemQz4fg==} - - vfile-message@2.0.4: - resolution: {integrity: sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==} - - vfile-message@3.1.4: - resolution: {integrity: sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==} - - vfile-message@4.0.2: - resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==} - - vfile-reporter@7.0.5: - resolution: {integrity: sha512-NdWWXkv6gcd7AZMvDomlQbK3MqFWL1RlGzMn++/O2TI+68+nqxCPTvLugdOtfSzXmjh+xUyhp07HhlrbJjT+mw==} - - vfile-sort@3.0.1: - resolution: {integrity: sha512-1os1733XY6y0D5x0ugqSeaVJm9lYgj0j5qdcZQFyxlZOSy1jYarL77lLyb5gK4Wqr1d5OxmuyflSO3zKyFnTFw==} - - vfile-statistics@2.0.1: - resolution: {integrity: sha512-W6dkECZmP32EG/l+dp2jCLdYzmnDBIw6jwiLZSER81oR5AHRcVqL+k3Z+pfH1R73le6ayDkJRMk0sutj1bMVeg==} - - vfile@4.2.1: - resolution: {integrity: sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==} - - vfile@5.3.7: - resolution: {integrity: sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==} - - vfile@6.0.1: - resolution: {integrity: sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw==} - - viem@2.9.28: - resolution: {integrity: sha512-/1iTg8yQlCNJ+7wSmdsBNB/vhjWqFJtTH6XZXHjGXrZnlBxAtHR5ZAr5TvTJc/2nhVIVE4BkCe5JCrIiSuZodg==} - peerDependencies: - typescript: '>=5.0.4' - peerDependenciesMeta: - typescript: - optional: true - - vscode-languageserver-textdocument@1.0.11: - resolution: {integrity: sha512-X+8T3GoiwTVlJbicx/sIAF+yuJAqz8VvwJyoMVhwEMoEKE/fkDmrqUgDMyBECcM2A2frVZIUj5HI/ErRXCfOeA==} - - vscode-oniguruma@1.7.0: - resolution: {integrity: sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==} - - vscode-textmate@8.0.0: - resolution: {integrity: sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg==} - - vscode-uri@3.0.8: - resolution: {integrity: sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==} - - walk-up-path@3.0.1: - resolution: {integrity: sha512-9YlCL/ynK3CTlrSRrDxZvUauLzAswPCrsaCgilqFevUYpeEW0/3ScEjaa3kbW/T0ghhkEr7mv+fpjqn1Y1YuTA==} - - web-namespaces@2.0.1: - resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} - - web-worker@1.3.0: - resolution: {integrity: sha512-BSR9wyRsy/KOValMgd5kMyr3JzpdeoR9KVId8u5GVlTTAtNChlsE4yTxeY7zMdNSyOmoKBv8NH2qeRY9Tg+IaA==} - - web3-utils@1.10.4: - resolution: {integrity: sha512-tsu8FiKJLk2PzhDl9fXbGUWTkkVXYhtTA+SmEFkKft+9BgwLxfCRpU96sWv7ICC8zixBNd3JURVoiR3dUXgP8A==} - engines: {node: '>=8.0.0'} - - webidl-conversions@3.0.1: - resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} - - whatwg-url@5.0.0: - resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} - - which-boxed-primitive@1.0.2: - resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} - - which-collection@1.0.2: - resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} - engines: {node: '>= 0.4'} - - which-typed-array@1.1.15: - resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==} - engines: {node: '>= 0.4'} - - which@1.3.1: - resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} - hasBin: true +dependencies: + '@eth-optimism/contracts-ts': + specifier: ^0.17.0 + version: 0.17.0(typescript@5.3.2) + '@eth-optimism/tokenlist': + specifier: ^9.0.9 + version: 9.0.9 + '@feelback/react': + specifier: ^0.3.4 + version: 0.3.4(react@18.2.0) + '@headlessui/react': + specifier: ^2.1.8 + version: 2.1.8(react-dom@18.2.0)(react@18.2.0) + algoliasearch: + specifier: ^4.23.3 + version: 4.23.3 + clsx: + specifier: ^2.1.1 + version: 2.1.1 + escape-string-regexp: + specifier: ^5.0.0 + version: 5.0.0 + next: + specifier: 14.2.10 + version: 14.2.10(react-dom@18.2.0)(react@18.2.0) + next-sitemap: + specifier: ^4.2.3 + version: 4.2.3(next@14.2.10) + nextra: + specifier: 2.13.2 + version: 2.13.2(patch_hash=a4rp2hgojklggjmthmkiyqaek4)(next@14.2.10)(react-dom@18.2.0)(react@18.2.0) + nextra-theme-docs: + specifier: 2.13.2 + version: 2.13.2(next@14.2.10)(nextra@2.13.2)(react-dom@18.2.0)(react@18.2.0) + react: + specifier: ^18.2.0 + version: 18.2.0 + react-dom: + specifier: ^18.2.0 + version: 18.2.0(react@18.2.0) + search-insights: + specifier: ^2.15.0 + version: 2.15.0 + +devDependencies: + '@double-great/remark-lint-alt-text': + specifier: ^1.0.0 + version: 1.0.0 + '@eth-optimism/core-utils': + specifier: ^0.13.1 + version: 0.13.1 + '@eth-optimism/sdk': + specifier: ^3.1.6 + version: 3.1.6(ethers@5.7.2) + '@types/node': + specifier: 18.11.10 + version: 18.11.10 + cspell: + specifier: ^8.1.3 + version: 8.1.3 + eslint: + specifier: ^8.53.0 + version: 8.54.0 + eslint-plugin-mdx: + specifier: ^2.2.0 + version: 2.2.0(eslint@8.54.0) + ethers: + specifier: ^5 + version: 5.7.2 + globby: + specifier: ^11.0.4 + version: 11.0.4 + gray-matter: + specifier: ^4.0.3 + version: 4.0.3 + remark: + specifier: ^15.0.1 + version: 15.0.1 + remark-code-import: + specifier: ^1.2.0 + version: 1.2.0(patch_hash=heylvfasxh3ubj2edns2svea2m) + remark-frontmatter: + specifier: ^5.0.0 + version: 5.0.0 + remark-gfm: + specifier: ^3.0.1 + version: 3.0.1 + remark-lint-frontmatter-schema: + specifier: ^3.15.4 + version: 3.15.4(patch_hash=jaxvkozlhcbn7zjsiti5ocoubi) + remark-lint-heading-style: + specifier: ^3.1.2 + version: 3.1.2 + remark-lint-list-item-indent: + specifier: ^3.1.2 + version: 3.1.2 + remark-lint-table-cell-padding: + specifier: ^4.1.3 + version: 4.1.3 + remark-lint-table-pipe-alignment: + specifier: ^3.1.3 + version: 3.1.3 + remark-lint-table-pipes: + specifier: ^4.1.2 + version: 4.1.2 + remark-lint-unordered-list-marker-style: + specifier: ^3.1.2 + version: 3.1.2 + remark-preset-lint-consistent: + specifier: ^5.1.2 + version: 5.1.2 + remark-preset-lint-recommended: + specifier: ^6.1.3 + version: 6.1.3 + typescript: + specifier: ^5.2.2 + version: 5.3.2 + unified-lint-rule: + specifier: ^2.1.2 + version: 2.1.2 + unist-util-visit: + specifier: ^5.0.0 + version: 5.0.0 - which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true +packages: - word-wrap@1.2.5: - resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + /@aashutoshrathi/word-wrap@1.2.6: + resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} engines: {node: '>=0.10.0'} + dev: true - wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} - - wrap-ansi@8.1.0: - resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} - engines: {node: '>=12'} - - wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - - write-file-atomic@3.0.3: - resolution: {integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==} - - ws@7.4.6: - resolution: {integrity: sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==} - engines: {node: '>=8.3.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - ws@8.13.0: - resolution: {integrity: sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - xdg-basedir@5.1.0: - resolution: {integrity: sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ==} - engines: {node: '>=12'} - - yallist@2.1.2: - resolution: {integrity: sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==} - - yallist@4.0.0: - resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - - yaml@2.3.3: - resolution: {integrity: sha512-zw0VAJxgeZ6+++/su5AFoqBbZbrEakwu+X0M5HmcwUiBL7AzcuPKjj5we4xfQLp78LkEMpD0cOnUhmgOVy3KdQ==} - engines: {node: '>= 14'} - - yaml@2.4.2: - resolution: {integrity: sha512-B3VqDZ+JAg1nZpaEmWtTXUlBneoGx6CPM9b0TENK6aoSu5t73dItudwdgmi6tHlIZZId4dZ9skcAQ2UbcyAeVA==} - engines: {node: '>= 14'} - hasBin: true - - yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} - - yocto-queue@1.0.0: - resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} - engines: {node: '>=12.20'} - - zod@3.23.8: - resolution: {integrity: sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==} - - zwitch@2.0.4: - resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} - -snapshots: - - '@adraffy/ens-normalize@1.10.0': {} + /@adraffy/ens-normalize@1.10.0: + resolution: {integrity: sha512-nA9XHtlAkYfJxY7bce8DcN7eKxWWCWkU+1GR9d+U6MbNpfwQp8TI7vqOsBsMcHoT4mBu2kypKoSKnghEzOOq5Q==} + dev: false - '@algolia/cache-browser-local-storage@4.23.3': + /@algolia/cache-browser-local-storage@4.23.3: + resolution: {integrity: sha512-vRHXYCpPlTDE7i6UOy2xE03zHF2C8MEFjPN2v7fRbqVpcOvAUQK81x3Kc21xyb5aSIpYCjWCZbYZuz8Glyzyyg==} dependencies: '@algolia/cache-common': 4.23.3 + dev: false - '@algolia/cache-common@4.23.3': {} + /@algolia/cache-common@4.23.3: + resolution: {integrity: sha512-h9XcNI6lxYStaw32pHpB1TMm0RuxphF+Ik4o7tcQiodEdpKK+wKufY6QXtba7t3k8eseirEMVB83uFFF3Nu54A==} + dev: false - '@algolia/cache-in-memory@4.23.3': + /@algolia/cache-in-memory@4.23.3: + resolution: {integrity: sha512-yvpbuUXg/+0rbcagxNT7un0eo3czx2Uf0y4eiR4z4SD7SiptwYTpbuS0IHxcLHG3lq22ukx1T6Kjtk/rT+mqNg==} dependencies: '@algolia/cache-common': 4.23.3 + dev: false - '@algolia/client-account@4.23.3': + /@algolia/client-account@4.23.3: + resolution: {integrity: sha512-hpa6S5d7iQmretHHF40QGq6hz0anWEHGlULcTIT9tbUssWUriN9AUXIFQ8Ei4w9azD0hc1rUok9/DeQQobhQMA==} dependencies: '@algolia/client-common': 4.23.3 '@algolia/client-search': 4.23.3 '@algolia/transporter': 4.23.3 + dev: false - '@algolia/client-analytics@4.23.3': + /@algolia/client-analytics@4.23.3: + resolution: {integrity: sha512-LBsEARGS9cj8VkTAVEZphjxTjMVCci+zIIiRhpFun9jGDUlS1XmhCW7CTrnaWeIuCQS/2iPyRqSy1nXPjcBLRA==} dependencies: '@algolia/client-common': 4.23.3 '@algolia/client-search': 4.23.3 '@algolia/requester-common': 4.23.3 '@algolia/transporter': 4.23.3 + dev: false - '@algolia/client-common@4.23.3': + /@algolia/client-common@4.23.3: + resolution: {integrity: sha512-l6EiPxdAlg8CYhroqS5ybfIczsGUIAC47slLPOMDeKSVXYG1n0qGiz4RjAHLw2aD0xzh2EXZ7aRguPfz7UKDKw==} dependencies: '@algolia/requester-common': 4.23.3 '@algolia/transporter': 4.23.3 + dev: false - '@algolia/client-personalization@4.23.3': + /@algolia/client-personalization@4.23.3: + resolution: {integrity: sha512-3E3yF3Ocr1tB/xOZiuC3doHQBQ2zu2MPTYZ0d4lpfWads2WTKG7ZzmGnsHmm63RflvDeLK/UVx7j2b3QuwKQ2g==} dependencies: '@algolia/client-common': 4.23.3 '@algolia/requester-common': 4.23.3 '@algolia/transporter': 4.23.3 + dev: false - '@algolia/client-search@4.23.3': + /@algolia/client-search@4.23.3: + resolution: {integrity: sha512-P4VAKFHqU0wx9O+q29Q8YVuaowaZ5EM77rxfmGnkHUJggh28useXQdopokgwMeYw2XUht49WX5RcTQ40rZIabw==} dependencies: '@algolia/client-common': 4.23.3 '@algolia/requester-common': 4.23.3 '@algolia/transporter': 4.23.3 + dev: false - '@algolia/logger-common@4.23.3': {} + /@algolia/logger-common@4.23.3: + resolution: {integrity: sha512-y9kBtmJwiZ9ZZ+1Ek66P0M68mHQzKRxkW5kAAXYN/rdzgDN0d2COsViEFufxJ0pb45K4FRcfC7+33YB4BLrZ+g==} + dev: false - '@algolia/logger-console@4.23.3': + /@algolia/logger-console@4.23.3: + resolution: {integrity: sha512-8xoiseoWDKuCVnWP8jHthgaeobDLolh00KJAdMe9XPrWPuf1by732jSpgy2BlsLTaT9m32pHI8CRfrOqQzHv3A==} dependencies: '@algolia/logger-common': 4.23.3 + dev: false - '@algolia/recommend@4.23.3': + /@algolia/recommend@4.23.3: + resolution: {integrity: sha512-9fK4nXZF0bFkdcLBRDexsnGzVmu4TSYZqxdpgBW2tEyfuSSY54D4qSRkLmNkrrz4YFvdh2GM1gA8vSsnZPR73w==} dependencies: '@algolia/cache-browser-local-storage': 4.23.3 '@algolia/cache-common': 4.23.3 @@ -3737,61 +230,87 @@ snapshots: '@algolia/requester-common': 4.23.3 '@algolia/requester-node-http': 4.23.3 '@algolia/transporter': 4.23.3 + dev: false - '@algolia/requester-browser-xhr@4.23.3': + /@algolia/requester-browser-xhr@4.23.3: + resolution: {integrity: sha512-jDWGIQ96BhXbmONAQsasIpTYWslyjkiGu0Quydjlowe+ciqySpiDUrJHERIRfELE5+wFc7hc1Q5hqjGoV7yghw==} dependencies: '@algolia/requester-common': 4.23.3 + dev: false - '@algolia/requester-common@4.23.3': {} + /@algolia/requester-common@4.23.3: + resolution: {integrity: sha512-xloIdr/bedtYEGcXCiF2muajyvRhwop4cMZo+K2qzNht0CMzlRkm8YsDdj5IaBhshqfgmBb3rTg4sL4/PpvLYw==} + dev: false - '@algolia/requester-node-http@4.23.3': + /@algolia/requester-node-http@4.23.3: + resolution: {integrity: sha512-zgu++8Uj03IWDEJM3fuNl34s746JnZOWn1Uz5taV1dFyJhVM/kTNw9Ik7YJWiUNHJQXcaD8IXD1eCb0nq/aByA==} dependencies: '@algolia/requester-common': 4.23.3 + dev: false - '@algolia/transporter@4.23.3': + /@algolia/transporter@4.23.3: + resolution: {integrity: sha512-Wjl5gttqnf/gQKJA+dafnD0Y6Yw97yvfY8R9h0dQltX1GXTgNs1zWgvtWW0tHl1EgMdhAyw189uWiZMnL3QebQ==} dependencies: '@algolia/cache-common': 4.23.3 '@algolia/logger-common': 4.23.3 '@algolia/requester-common': 4.23.3 + dev: false - '@apidevtools/json-schema-ref-parser@11.1.0': + /@apidevtools/json-schema-ref-parser@11.1.0: + resolution: {integrity: sha512-g/VW9ZQEFJAOwAyUb8JFf7MLiLy2uEB4rU270rGzDwICxnxMlPy0O11KVePSgS36K1NI29gSlK84n5INGhd4Ag==} + engines: {node: '>= 16'} dependencies: '@jsdevtools/ono': 7.1.3 '@types/json-schema': 7.0.15 '@types/lodash.clonedeep': 4.5.9 js-yaml: 4.1.0 lodash.clonedeep: 4.5.0 + dev: true - '@babel/code-frame@7.24.2': + /@babel/code-frame@7.23.4: + resolution: {integrity: sha512-r1IONyb6Ia+jYR2vvIDhdWdlTGhqbBoFqLTQidzZ4kepUFH15ejXvFHxCVbtl7BOXIudsIubf4E81xeA3h3IXA==} + engines: {node: '>=6.9.0'} dependencies: - '@babel/highlight': 7.24.2 - picocolors: 1.0.0 + '@babel/highlight': 7.23.4 + chalk: 2.4.2 - '@babel/helper-validator-identifier@7.22.20': {} + /@babel/helper-validator-identifier@7.22.20: + resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} + engines: {node: '>=6.9.0'} - '@babel/highlight@7.24.2': + /@babel/highlight@7.23.4: + resolution: {integrity: sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==} + engines: {node: '>=6.9.0'} dependencies: '@babel/helper-validator-identifier': 7.22.20 chalk: 2.4.2 js-tokens: 4.0.0 - picocolors: 1.0.0 - '@babel/runtime@7.24.4': + /@babel/runtime@7.23.2: + resolution: {integrity: sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg==} + engines: {node: '>=6.9.0'} dependencies: - regenerator-runtime: 0.14.1 + regenerator-runtime: 0.14.0 + dev: false - '@braintree/sanitize-url@6.0.4': {} + /@braintree/sanitize-url@6.0.4: + resolution: {integrity: sha512-s3jaWicZd0pkP0jf5ysyHUI/RE7MHos6qlToFcGWXVp+ykHOy77OUMrfbgJ9it2C5bow7OIQwYYaHjk9XlBQ2A==} + dev: false - '@corex/deepmerge@4.0.43': {} + /@corex/deepmerge@4.0.43: + resolution: {integrity: sha512-N8uEMrMPL0cu/bdboEWpQYb/0i2K5Qn8eCsxzOmxSggJbbQte7ljMRoXm917AbntqTGOzdTu+vP3KOOzoC70HQ==} + dev: false - '@cspell/cspell-bundled-dicts@8.7.0': + /@cspell/cspell-bundled-dicts@8.1.3: + resolution: {integrity: sha512-TwLyL2bCtetXGhMudjOIgFPAsWF2UkT0E7T+DAZG8aUBfHoC/eco/sTmR6UJVpi6Crjs0YOQkFUBGrQ2pxJPcA==} + engines: {node: '>=18'} dependencies: '@cspell/dict-ada': 4.0.2 - '@cspell/dict-aws': 4.0.1 + '@cspell/dict-aws': 4.0.0 '@cspell/dict-bash': 4.1.3 - '@cspell/dict-companies': 3.0.31 - '@cspell/dict-cpp': 5.1.3 - '@cspell/dict-cryptocurrencies': 5.0.0 + '@cspell/dict-companies': 3.0.28 + '@cspell/dict-cpp': 5.0.10 + '@cspell/dict-cryptocurrencies': 4.0.0 '@cspell/dict-csharp': 4.0.2 '@cspell/dict-css': 4.0.12 '@cspell/dict-dart': 2.0.3 @@ -3799,223 +318,369 @@ snapshots: '@cspell/dict-docker': 1.1.7 '@cspell/dict-dotnet': 5.0.0 '@cspell/dict-elixir': 4.0.3 - '@cspell/dict-en-common-misspellings': 2.0.0 + '@cspell/dict-en-common-misspellings': 1.0.2 '@cspell/dict-en-gb': 1.1.33 - '@cspell/dict-en_us': 4.3.19 + '@cspell/dict-en_us': 4.3.12 '@cspell/dict-filetypes': 3.0.3 '@cspell/dict-fonts': 4.0.0 '@cspell/dict-fsharp': 1.0.1 '@cspell/dict-fullstack': 3.1.5 - '@cspell/dict-gaming-terms': 1.0.5 - '@cspell/dict-git': 3.0.0 + '@cspell/dict-gaming-terms': 1.0.4 + '@cspell/dict-git': 2.0.0 '@cspell/dict-golang': 6.0.5 '@cspell/dict-haskell': 4.0.1 '@cspell/dict-html': 4.0.5 '@cspell/dict-html-symbol-entities': 4.0.0 '@cspell/dict-java': 5.0.6 - '@cspell/dict-julia': 1.0.1 '@cspell/dict-k8s': 1.0.2 '@cspell/dict-latex': 4.0.0 '@cspell/dict-lorem-ipsum': 4.0.0 '@cspell/dict-lua': 4.0.3 '@cspell/dict-makefile': 1.0.0 - '@cspell/dict-monkeyc': 1.0.6 '@cspell/dict-node': 4.0.3 - '@cspell/dict-npm': 5.0.15 - '@cspell/dict-php': 4.0.6 + '@cspell/dict-npm': 5.0.13 + '@cspell/dict-php': 4.0.4 '@cspell/dict-powershell': 5.0.3 - '@cspell/dict-public-licenses': 2.0.6 - '@cspell/dict-python': 4.1.11 + '@cspell/dict-public-licenses': 2.0.5 + '@cspell/dict-python': 4.1.10 '@cspell/dict-r': 2.0.1 - '@cspell/dict-ruby': 5.0.2 - '@cspell/dict-rust': 4.0.2 + '@cspell/dict-ruby': 5.0.1 + '@cspell/dict-rust': 4.0.1 '@cspell/dict-scala': 5.0.0 - '@cspell/dict-software-terms': 3.3.20 - '@cspell/dict-sql': 2.1.3 + '@cspell/dict-software-terms': 3.3.12 + '@cspell/dict-sql': 2.1.2 '@cspell/dict-svelte': 1.0.2 '@cspell/dict-swift': 2.0.1 - '@cspell/dict-terraform': 1.0.0 - '@cspell/dict-typescript': 3.1.4 + '@cspell/dict-typescript': 3.1.2 '@cspell/dict-vue': 3.0.0 + dev: true - '@cspell/cspell-json-reporter@8.7.0': + /@cspell/cspell-json-reporter@8.1.3: + resolution: {integrity: sha512-9iOU0Y733XuF0cqC7xwzJkOKFdJ65rYGnHFdUHzr5lxEqeG9X/jhlkzyHuGGOhPxkUeFP1x9XoLhXo1isMDbKA==} + engines: {node: '>=18'} dependencies: - '@cspell/cspell-types': 8.7.0 + '@cspell/cspell-types': 8.1.3 + dev: true - '@cspell/cspell-pipe@8.7.0': {} + /@cspell/cspell-pipe@8.1.3: + resolution: {integrity: sha512-/dcnyLDeyFuoX4seZv7VsDQyRpt3ZY0vjZiDpqFul8hPydM8czLyRPPMD6Za+Gqg6dZmh9+VsQWK52hVsqc0QA==} + engines: {node: '>=18'} + dev: true - '@cspell/cspell-resolver@8.7.0': + /@cspell/cspell-resolver@8.1.3: + resolution: {integrity: sha512-bGyJYqkHRilqhyKGL/NvODN5U+UvCuQo7kxgt0i3Vd7m7k6XYLsSLYZ4w6r1S5IQ/ybU8I5lh6/6fNqKwvo9eg==} + engines: {node: '>=18'} dependencies: global-directory: 4.0.1 + dev: true - '@cspell/cspell-service-bus@8.7.0': {} - - '@cspell/cspell-types@8.7.0': {} - - '@cspell/dict-ada@4.0.2': {} + /@cspell/cspell-service-bus@8.1.3: + resolution: {integrity: sha512-8E5ZveQKneNfK+cuFMy0y6tDsho71UPppEHNoLZsEFDbIxDdtQcAfs0pk4nwEzxPBt+dBB+Yl8KExQ6x2FAYQw==} + engines: {node: '>=18'} + dev: true - '@cspell/dict-aws@4.0.1': {} + /@cspell/cspell-types@8.1.3: + resolution: {integrity: sha512-j14FENj+DzWu6JjzTl+0X5/OJv9AEckpEp6Jaw9YglxirrBBzTkZGfoLePe/AWo/MlIYp0asl92C1UHEjgz+FQ==} + engines: {node: '>=18'} + dev: true - '@cspell/dict-bash@4.1.3': {} + /@cspell/dict-ada@4.0.2: + resolution: {integrity: sha512-0kENOWQeHjUlfyId/aCM/mKXtkEgV0Zu2RhUXCBr4hHo9F9vph+Uu8Ww2b0i5a4ZixoIkudGA+eJvyxrG1jUpA==} + dev: true - '@cspell/dict-companies@3.0.31': {} + /@cspell/dict-aws@4.0.0: + resolution: {integrity: sha512-1YkCMWuna/EGIDN/zKkW+j98/55mxigftrSFgsehXhPld+ZMJM5J9UuBA88YfL7+/ETvBdd7mwW6IwWsC+/ltQ==} + dev: true - '@cspell/dict-cpp@5.1.3': {} + /@cspell/dict-bash@4.1.3: + resolution: {integrity: sha512-tOdI3QVJDbQSwPjUkOiQFhYcu2eedmX/PtEpVWg0aFps/r6AyjUQINtTgpqMYnYuq8O1QUIQqnpx21aovcgZCw==} + dev: true - '@cspell/dict-cryptocurrencies@5.0.0': {} + /@cspell/dict-companies@3.0.28: + resolution: {integrity: sha512-UinHkMYB/1pUkLKm1PGIm9PBFYxeAa6YvbB1Rq/RAAlrs0WDwiDBr3BAYdxydukG1IqqwT5z9WtU+8D/yV/5lw==} + dev: true - '@cspell/dict-csharp@4.0.2': {} + /@cspell/dict-cpp@5.0.10: + resolution: {integrity: sha512-WCRuDrkFdpmeIR6uXQYKU9loMQKNFS4bUhtHdv5fu4qVyJSh3k/kgmtTm1h1BDTj8EwPRc/RGxS+9Z3b2mnabA==} + dev: true - '@cspell/dict-css@4.0.12': {} + /@cspell/dict-cryptocurrencies@4.0.0: + resolution: {integrity: sha512-EiZp91ATyRxTmauIQfOX9adLYCunKjHEh092rrM7o2eMXP9n7zpXAL9BK7LviL+LbB8VDOm21q+s83cKrrRrsg==} + dev: true - '@cspell/dict-dart@2.0.3': {} + /@cspell/dict-csharp@4.0.2: + resolution: {integrity: sha512-1JMofhLK+4p4KairF75D3A924m5ERMgd1GvzhwK2geuYgd2ZKuGW72gvXpIV7aGf52E3Uu1kDXxxGAiZ5uVG7g==} + dev: true - '@cspell/dict-data-science@1.0.11': {} + /@cspell/dict-css@4.0.12: + resolution: {integrity: sha512-vGBgPM92MkHQF5/2jsWcnaahOZ+C6OE/fPvd5ScBP72oFY9tn5GLuomcyO0z8vWCr2e0nUSX1OGimPtcQAlvSw==} + dev: true - '@cspell/dict-django@4.1.0': {} + /@cspell/dict-dart@2.0.3: + resolution: {integrity: sha512-cLkwo1KT5CJY5N5RJVHks2genFkNCl/WLfj+0fFjqNR+tk3tBI1LY7ldr9piCtSFSm4x9pO1x6IV3kRUY1lLiw==} + dev: true - '@cspell/dict-docker@1.1.7': {} + /@cspell/dict-data-science@1.0.11: + resolution: {integrity: sha512-TaHAZRVe0Zlcc3C23StZqqbzC0NrodRwoSAc8dis+5qLeLLnOCtagYQeROQvDlcDg3X/VVEO9Whh4W/z4PAmYQ==} + dev: true - '@cspell/dict-dotnet@5.0.0': {} + /@cspell/dict-django@4.1.0: + resolution: {integrity: sha512-bKJ4gPyrf+1c78Z0Oc4trEB9MuhcB+Yg+uTTWsvhY6O2ncFYbB/LbEZfqhfmmuK/XJJixXfI1laF2zicyf+l0w==} + dev: true - '@cspell/dict-elixir@4.0.3': {} + /@cspell/dict-docker@1.1.7: + resolution: {integrity: sha512-XlXHAr822euV36GGsl2J1CkBIVg3fZ6879ZOg5dxTIssuhUOCiV2BuzKZmt6aIFmcdPmR14+9i9Xq+3zuxeX0A==} + dev: true - '@cspell/dict-en-common-misspellings@2.0.0': {} + /@cspell/dict-dotnet@5.0.0: + resolution: {integrity: sha512-EOwGd533v47aP5QYV8GlSSKkmM9Eq8P3G/eBzSpH3Nl2+IneDOYOBLEUraHuiCtnOkNsz0xtZHArYhAB2bHWAw==} + dev: true - '@cspell/dict-en-gb@1.1.33': {} + /@cspell/dict-elixir@4.0.3: + resolution: {integrity: sha512-g+uKLWvOp9IEZvrIvBPTr/oaO6619uH/wyqypqvwpmnmpjcfi8+/hqZH8YNKt15oviK8k4CkINIqNhyndG9d9Q==} + dev: true - '@cspell/dict-en_us@4.3.19': {} + /@cspell/dict-en-common-misspellings@1.0.2: + resolution: {integrity: sha512-jg7ZQZpZH7+aAxNBlcAG4tGhYF6Ksy+QS5Df73Oo+XyckBjC9QS+PrRwLTeYoFIgXy5j3ICParK5r3MSSoL4gw==} + dev: true - '@cspell/dict-filetypes@3.0.3': {} + /@cspell/dict-en-gb@1.1.33: + resolution: {integrity: sha512-tKSSUf9BJEV+GJQAYGw5e+ouhEe2ZXE620S7BLKe3ZmpnjlNG9JqlnaBhkIMxKnNFkLY2BP/EARzw31AZnOv4g==} + dev: true - '@cspell/dict-fonts@4.0.0': {} + /@cspell/dict-en_us@4.3.12: + resolution: {integrity: sha512-1bsUxFjgxF30FTzcU5uvmCvH3lyqVKR9dbwsJhomBlUM97f0edrd6590SiYBXDm7ruE68m3lJd4vs0Ev2D6FtQ==} + dev: true - '@cspell/dict-fsharp@1.0.1': {} + /@cspell/dict-filetypes@3.0.3: + resolution: {integrity: sha512-J9UP+qwwBLfOQ8Qg9tAsKtSY/WWmjj21uj6zXTI9hRLD1eG1uUOLcfVovAmtmVqUWziPSKMr87F6SXI3xmJXgw==} + dev: true - '@cspell/dict-fullstack@3.1.5': {} + /@cspell/dict-fonts@4.0.0: + resolution: {integrity: sha512-t9V4GeN/m517UZn63kZPUYP3OQg5f0OBLSd3Md5CU3eH1IFogSvTzHHnz4Wqqbv8NNRiBZ3HfdY/pqREZ6br3Q==} + dev: true - '@cspell/dict-gaming-terms@1.0.5': {} + /@cspell/dict-fsharp@1.0.1: + resolution: {integrity: sha512-23xyPcD+j+NnqOjRHgW3IU7Li912SX9wmeefcY0QxukbAxJ/vAN4rBpjSwwYZeQPAn3fxdfdNZs03fg+UM+4yQ==} + dev: true - '@cspell/dict-git@3.0.0': {} + /@cspell/dict-fullstack@3.1.5: + resolution: {integrity: sha512-6ppvo1dkXUZ3fbYn/wwzERxCa76RtDDl5Afzv2lijLoijGGUw5yYdLBKJnx8PJBGNLh829X352ftE7BElG4leA==} + dev: true - '@cspell/dict-golang@6.0.5': {} + /@cspell/dict-gaming-terms@1.0.4: + resolution: {integrity: sha512-hbDduNXlk4AOY0wFxcDMWBPpm34rpqJBeqaySeoUH70eKxpxm+dvjpoRLJgyu0TmymEICCQSl6lAHTHSDiWKZg==} + dev: true - '@cspell/dict-haskell@4.0.1': {} + /@cspell/dict-git@2.0.0: + resolution: {integrity: sha512-n1AxyX5Kgxij/sZFkxFJlzn3K9y/sCcgVPg/vz4WNJ4K9YeTsUmyGLA2OQI7d10GJeiuAo2AP1iZf2A8j9aj2w==} + dev: true - '@cspell/dict-html-symbol-entities@4.0.0': {} + /@cspell/dict-golang@6.0.5: + resolution: {integrity: sha512-w4mEqGz4/wV+BBljLxduFNkMrd3rstBNDXmoX5kD4UTzIb4Sy0QybWCtg2iVT+R0KWiRRA56QKOvBsgXiddksA==} + dev: true - '@cspell/dict-html@4.0.5': {} + /@cspell/dict-haskell@4.0.1: + resolution: {integrity: sha512-uRrl65mGrOmwT7NxspB4xKXFUenNC7IikmpRZW8Uzqbqcu7ZRCUfstuVH7T1rmjRgRkjcIjE4PC11luDou4wEQ==} + dev: true - '@cspell/dict-java@5.0.6': {} + /@cspell/dict-html-symbol-entities@4.0.0: + resolution: {integrity: sha512-HGRu+48ErJjoweR5IbcixxETRewrBb0uxQBd6xFGcxbEYCX8CnQFTAmKI5xNaIt2PKaZiJH3ijodGSqbKdsxhw==} + dev: true - '@cspell/dict-julia@1.0.1': {} + /@cspell/dict-html@4.0.5: + resolution: {integrity: sha512-p0brEnRybzSSWi8sGbuVEf7jSTDmXPx7XhQUb5bgG6b54uj+Z0Qf0V2n8b/LWwIPJNd1GygaO9l8k3HTCy1h4w==} + dev: true - '@cspell/dict-k8s@1.0.2': {} + /@cspell/dict-java@5.0.6: + resolution: {integrity: sha512-kdE4AHHHrixyZ5p6zyms1SLoYpaJarPxrz8Tveo6gddszBVVwIUZ+JkQE1bWNLK740GWzIXdkznpUfw1hP9nXw==} + dev: true - '@cspell/dict-latex@4.0.0': {} + /@cspell/dict-k8s@1.0.2: + resolution: {integrity: sha512-tLT7gZpNPnGa+IIFvK9SP1LrSpPpJ94a/DulzAPOb1Q2UBFwdpFd82UWhio0RNShduvKG/WiMZf/wGl98pn+VQ==} + dev: true - '@cspell/dict-lorem-ipsum@4.0.0': {} + /@cspell/dict-latex@4.0.0: + resolution: {integrity: sha512-LPY4y6D5oI7D3d+5JMJHK/wxYTQa2lJMSNxps2JtuF8hbAnBQb3igoWEjEbIbRRH1XBM0X8dQqemnjQNCiAtxQ==} + dev: true - '@cspell/dict-lua@4.0.3': {} + /@cspell/dict-lorem-ipsum@4.0.0: + resolution: {integrity: sha512-1l3yjfNvMzZPibW8A7mQU4kTozwVZVw0AvFEdy+NcqtbxH+TvbSkNMqROOFWrkD2PjnKG0+Ea0tHI2Pi6Gchnw==} + dev: true - '@cspell/dict-makefile@1.0.0': {} + /@cspell/dict-lua@4.0.3: + resolution: {integrity: sha512-lDHKjsrrbqPaea13+G9s0rtXjMO06gPXPYRjRYawbNmo4E/e3XFfVzeci3OQDQNDmf2cPOwt9Ef5lu2lDmwfJg==} + dev: true - '@cspell/dict-monkeyc@1.0.6': {} + /@cspell/dict-makefile@1.0.0: + resolution: {integrity: sha512-3W9tHPcSbJa6s0bcqWo6VisEDTSN5zOtDbnPabF7rbyjRpNo0uHXHRJQF8gAbFzoTzBBhgkTmrfSiuyQm7vBUQ==} + dev: true - '@cspell/dict-node@4.0.3': {} + /@cspell/dict-node@4.0.3: + resolution: {integrity: sha512-sFlUNI5kOogy49KtPg8SMQYirDGIAoKBO3+cDLIwD4MLdsWy1q0upc7pzGht3mrjuyMiPRUV14Bb0rkVLrxOhg==} + dev: true - '@cspell/dict-npm@5.0.15': {} + /@cspell/dict-npm@5.0.13: + resolution: {integrity: sha512-uPb3DlQA/FvlmzT5RjZoy7fy91mxMRZW1B+K3atVM5A/cmP1QlDaSW/iCtde5kHET1MOV7uxz+vy0Yha2OI5pQ==} + dev: true - '@cspell/dict-php@4.0.6': {} + /@cspell/dict-php@4.0.4: + resolution: {integrity: sha512-fRlLV730fJbulDsLIouZxXoxHt3KIH6hcLFwxaupHL+iTXDg0lo7neRpbqD5MScr/J3idEr7i9G8XWzIikKFug==} + dev: true - '@cspell/dict-powershell@5.0.3': {} + /@cspell/dict-powershell@5.0.3: + resolution: {integrity: sha512-lEdzrcyau6mgzu1ie98GjOEegwVHvoaWtzQnm1ie4DyZgMr+N6D0Iyj1lzvtmt0snvsDFa5F2bsYzf3IMKcpcA==} + dev: true - '@cspell/dict-public-licenses@2.0.6': {} + /@cspell/dict-public-licenses@2.0.5: + resolution: {integrity: sha512-91HK4dSRri/HqzAypHgduRMarJAleOX5NugoI8SjDLPzWYkwZ1ftuCXSk+fy8DLc3wK7iOaFcZAvbjmnLhVs4A==} + dev: true - '@cspell/dict-python@4.1.11': + /@cspell/dict-python@4.1.10: + resolution: {integrity: sha512-ErF/Ohcu6Xk4QVNzFgo8p7CxkxvAKAmFszvso41qOOhu8CVpB35ikBRpGVDw9gsCUtZzi15Yl0izi4do6WcLkA==} dependencies: '@cspell/dict-data-science': 1.0.11 + dev: true - '@cspell/dict-r@2.0.1': {} - - '@cspell/dict-ruby@5.0.2': {} + /@cspell/dict-r@2.0.1: + resolution: {integrity: sha512-KCmKaeYMLm2Ip79mlYPc8p+B2uzwBp4KMkzeLd5E6jUlCL93Y5Nvq68wV5fRLDRTf7N1LvofkVFWfDcednFOgA==} + dev: true - '@cspell/dict-rust@4.0.2': {} + /@cspell/dict-ruby@5.0.1: + resolution: {integrity: sha512-rruTm7Emhty/BSYavSm8ZxRuVw0OBqzJkwIFXcV0cX7To8D1qbmS9HFHRuRg8IL11+/nJvtdDz+lMFBSmPUagQ==} + dev: true - '@cspell/dict-scala@5.0.0': {} + /@cspell/dict-rust@4.0.1: + resolution: {integrity: sha512-xJSSzHDK2z6lSVaOmMxl3PTOtfoffaxMo7fTcbZUF+SCJzfKbO6vnN9TCGX2sx1RHFDz66Js6goz6SAZQdOwaw==} + dev: true - '@cspell/dict-software-terms@3.3.20': {} + /@cspell/dict-scala@5.0.0: + resolution: {integrity: sha512-ph0twaRoV+ylui022clEO1dZ35QbeEQaKTaV2sPOsdwIokABPIiK09oWwGK9qg7jRGQwVaRPEq0Vp+IG1GpqSQ==} + dev: true - '@cspell/dict-sql@2.1.3': {} + /@cspell/dict-software-terms@3.3.12: + resolution: {integrity: sha512-6aa4T9VqOMc0SFNBt6gxp0CWjvRqMg/uxvgpRbil+ToHWcU+Q+As0WKhPLaOniuTdCM85WWzRouD0O1XUGqg5Q==} + dev: true - '@cspell/dict-svelte@1.0.2': {} + /@cspell/dict-sql@2.1.2: + resolution: {integrity: sha512-Pi0hAcvsSGtZZeyyAN1VfGtQJbrXos5x2QjJU0niAQKhmITSOrXU/1II1Gogk+FYDjWyV9wP2De0U2f7EWs6oQ==} + dev: true - '@cspell/dict-swift@2.0.1': {} + /@cspell/dict-svelte@1.0.2: + resolution: {integrity: sha512-rPJmnn/GsDs0btNvrRBciOhngKV98yZ9SHmg8qI6HLS8hZKvcXc0LMsf9LLuMK1TmS2+WQFAan6qeqg6bBxL2Q==} + dev: true - '@cspell/dict-terraform@1.0.0': {} + /@cspell/dict-swift@2.0.1: + resolution: {integrity: sha512-gxrCMUOndOk7xZFmXNtkCEeroZRnS2VbeaIPiymGRHj5H+qfTAzAKxtv7jJbVA3YYvEzWcVE2oKDP4wcbhIERw==} + dev: true - '@cspell/dict-typescript@3.1.4': {} + /@cspell/dict-typescript@3.1.2: + resolution: {integrity: sha512-lcNOYWjLUvDZdLa0UMNd/LwfVdxhE9rKA+agZBGjL3lTA3uNvH7IUqSJM/IXhJoBpLLMVEOk8v1N9xi+vDuCdA==} + dev: true - '@cspell/dict-vue@3.0.0': {} + /@cspell/dict-vue@3.0.0: + resolution: {integrity: sha512-niiEMPWPV9IeRBRzZ0TBZmNnkK3olkOPYxC1Ny2AX4TGlYRajcW0WUtoSHmvvjZNfWLSg2L6ruiBeuPSbjnG6A==} + dev: true - '@cspell/dynamic-import@8.7.0': + /@cspell/dynamic-import@8.1.3: + resolution: {integrity: sha512-/lXFLa92v4oOcZ2PbdRpOqBvnqWlYmGaV7iCy8+QhIWlMdzi+7tBX3LVTm9Jzvt/rJseVHQQ6RvfTsSmhbUMFQ==} + engines: {node: '>=18.0'} dependencies: - import-meta-resolve: 4.1.0 + import-meta-resolve: 4.0.0 + dev: true - '@cspell/strong-weak-map@8.7.0': {} + /@cspell/strong-weak-map@8.1.3: + resolution: {integrity: sha512-GhWyximzk8tumo0zhrDV3+nFYiETYefiTBWAEVbXJMibuvitFocVZwddqN85J0UdZ2M7q6tvBleEaI9ME/16gA==} + engines: {node: '>=18'} + dev: true - '@double-great/alt-text@3.1.0': + /@double-great/alt-text@3.1.0: + resolution: {integrity: sha512-5gSW9AI0KUO2GQe9K+KjyiCisxl4xL0kesQCxUsko4T9s8zler/stW0qcH5XryUgtKebb293qX9sz1nCmQpdTw==} dependencies: emoji-regex: 10.3.0 github-slugger: 1.5.0 tinyurl: 1.1.7 + dev: true - '@double-great/remark-lint-alt-text@1.0.0': + /@double-great/remark-lint-alt-text@1.0.0: + resolution: {integrity: sha512-2FFjSX2VhT/USmsOEkcw40SiCHXXio2sWs4S7docKNFh+W7/z+bHYau+UHfrP4yDRVzfUVSV1MKnsxmigkhixg==} dependencies: '@double-great/alt-text': 3.1.0 unified-lint-rule: 2.1.2 unist-util-visit-parents: 5.1.3 + dev: true - '@eslint-community/eslint-utils@4.4.0(eslint@8.57.0)': + /@eslint-community/eslint-utils@4.4.0(eslint@8.54.0): + resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 dependencies: - eslint: 8.57.0 + eslint: 8.54.0 eslint-visitor-keys: 3.4.3 + dev: true - '@eslint-community/regexpp@4.10.0': {} + /@eslint-community/regexpp@4.10.0: + resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + dev: true - '@eslint/eslintrc@2.1.4': + /@eslint/eslintrc@2.1.3: + resolution: {integrity: sha512-yZzuIG+jnVu6hNSzFEN07e8BxF3uAzYtQb6uDkaYZLo6oYZDCq454c5kB8zxnzfCYyP4MIuyBn10L0DqwujTmA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: ajv: 6.12.6 debug: 4.3.4 espree: 9.6.1 - globals: 13.24.0 - ignore: 5.3.1 + globals: 13.23.0 + ignore: 5.3.0 import-fresh: 3.3.0 js-yaml: 4.1.0 minimatch: 3.1.2 strip-json-comments: 3.1.1 transitivePeerDependencies: - supports-color + dev: true - '@eslint/js@8.57.0': {} + /@eslint/js@8.54.0: + resolution: {integrity: sha512-ut5V+D+fOoWPgGGNj83GGjnntO39xDy6DWxO0wb7Jp3DcMX0TfIqdzHF85VTQkerdyGmuuMD9AKAo5KiNlf/AQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true - '@eth-optimism/contracts-bedrock@0.17.2': {} + /@eth-optimism/contracts-bedrock@0.16.2: + resolution: {integrity: sha512-a2+f7soDbrd6jV74U02EpyMwQt2iZeDZ4c2ZwgkObcxXUZLZQ2ELt/VRFBf8TIL3wYcBOGpUa1aXAE2oHQ7oRA==} + requiresBuild: true + dev: true - '@eth-optimism/contracts-ts@0.17.2(typescript@5.4.5)(zod@3.23.8)': + /@eth-optimism/contracts-ts@0.17.0(typescript@5.3.2): + resolution: {integrity: sha512-V4uJtS4ngAQ8tLSeIHWAK7ZNrz3a5Mf4YN3vf5U3u2/c+bKWIkGYgmD/GPQuyMmALOv67tJpFn3GRDTb9LgG1g==} + requiresBuild: true + peerDependencies: + '@wagmi/core': '>1.0.0' + wagmi: '>1.0.0' + peerDependenciesMeta: + '@wagmi/core': + optional: true + wagmi: + optional: true dependencies: - '@testing-library/react': 14.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@testing-library/react': 14.1.2(react-dom@18.2.0)(react@18.2.0) '@types/change-case': 2.3.1 change-case: 4.1.2 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - viem: 2.9.28(typescript@5.4.5)(zod@3.23.8) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + viem: 1.19.6(typescript@5.3.2) transitivePeerDependencies: - bufferutil - typescript - utf-8-validate - zod + dev: false - '@eth-optimism/contracts@0.6.0(ethers@5.7.2)': + /@eth-optimism/contracts@0.6.0(ethers@5.7.2): + resolution: {integrity: sha512-vQ04wfG9kMf1Fwy3FEMqH2QZbgS0gldKhcBeBUPfO8zu68L61VI97UDXmsMQXzTsEAxK8HnokW3/gosl4/NW3w==} + peerDependencies: + ethers: ^5 dependencies: '@eth-optimism/core-utils': 0.12.0 '@ethersproject/abstract-provider': 5.7.0 @@ -4024,8 +689,10 @@ snapshots: transitivePeerDependencies: - bufferutil - utf-8-validate + dev: true - '@eth-optimism/core-utils@0.12.0': + /@eth-optimism/core-utils@0.12.0: + resolution: {integrity: sha512-qW+7LZYCz7i8dRa7SRlUKIo1VBU8lvN0HeXCxJR+z+xtMzMQpPds20XJNCMclszxYQHkXY00fOT6GvFw9ZL6nw==} dependencies: '@ethersproject/abi': 5.7.0 '@ethersproject/abstract-provider': 5.7.0 @@ -4042,12 +709,15 @@ snapshots: '@ethersproject/transactions': 5.7.0 '@ethersproject/web': 5.7.1 bufio: 1.2.1 - chai: 4.4.1 + chai: 4.3.10 transitivePeerDependencies: - bufferutil - utf-8-validate + dev: true - '@eth-optimism/core-utils@0.13.2': + /@eth-optimism/core-utils@0.13.1: + resolution: {integrity: sha512-1FvzbUmCEy9zSKPG1QWg2VfA2Cy90xBA9Wkp11lXXrz91zUPCNCNSRTujXWYIC86ketNsZp7p4njSf6lTycHCw==} + requiresBuild: true dependencies: '@ethersproject/abi': 5.7.0 '@ethersproject/abstract-provider': 5.7.0 @@ -4060,40 +730,55 @@ snapshots: '@ethersproject/properties': 5.7.0 '@ethersproject/rlp': 5.7.0 '@ethersproject/web': 5.7.1 - chai: 4.4.1 + chai: 4.3.10 ethers: 5.7.2 node-fetch: 2.7.0 transitivePeerDependencies: - bufferutil - encoding - utf-8-validate + dev: true - '@eth-optimism/sdk@3.3.0(ethers@5.7.2)': + /@eth-optimism/sdk@3.1.6(ethers@5.7.2): + resolution: {integrity: sha512-YU3Sx4jPFfdXW4gs0PvnFDFPrJjbsaFxAJrsqxDpkUH3fMC3MmQgECYdkj8y1xTO6CTHm9gWLNC2WQdYTdNJsQ==} + requiresBuild: true + peerDependencies: + ethers: ^5 dependencies: '@eth-optimism/contracts': 0.6.0(ethers@5.7.2) - '@eth-optimism/contracts-bedrock': 0.17.2 - '@eth-optimism/core-utils': 0.13.2 + '@eth-optimism/contracts-bedrock': 0.16.2 + '@eth-optimism/core-utils': 0.13.1 ethers: 5.7.2 lodash: 4.17.21 merkletreejs: 0.3.11 rlp: 2.2.7 - semver: 7.6.0 transitivePeerDependencies: - bufferutil - encoding - utf-8-validate + dev: true - '@eth-optimism/tokenlist@9.0.51': {} + /@eth-optimism/tokenlist@9.0.9: + resolution: {integrity: sha512-Wz0ZbvJKBUIikZpAjX1dqXYlSq0mHCnVXfGST+rZOhpCnY9Qwf9PEpSEK9kMeUz2ySDVV1mqtXtLgVjZb6z3Pg==} + dev: false - '@ethereumjs/rlp@4.0.1': {} + /@ethereumjs/rlp@4.0.1: + resolution: {integrity: sha512-tqsQiBQDQdmPWE1xkkBq4rlSW5QZpLOUJ5RJh2/9fug+q9tnUhuZoVLk7s0scUIKTOzEtR72DFBXI4WiZcMpvw==} + engines: {node: '>=14'} + hasBin: true + dev: true - '@ethereumjs/util@8.1.0': + /@ethereumjs/util@8.1.0: + resolution: {integrity: sha512-zQ0IqbdX8FZ9aw11vP+dZkKDkS+kgIvQPHnSAXzP9pLu+Rfu3D3XEeLbicvoXJTYnhZiPmsZUxgdzXwNKxRPbA==} + engines: {node: '>=14'} dependencies: '@ethereumjs/rlp': 4.0.1 - ethereum-cryptography: 2.1.3 + ethereum-cryptography: 2.1.2 micro-ftch: 0.3.1 + dev: true - '@ethersproject/abi@5.7.0': + /@ethersproject/abi@5.7.0: + resolution: {integrity: sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA==} dependencies: '@ethersproject/address': 5.7.0 '@ethersproject/bignumber': 5.7.0 @@ -4104,8 +789,10 @@ snapshots: '@ethersproject/logger': 5.7.0 '@ethersproject/properties': 5.7.0 '@ethersproject/strings': 5.7.0 + dev: true - '@ethersproject/abstract-provider@5.7.0': + /@ethersproject/abstract-provider@5.7.0: + resolution: {integrity: sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw==} dependencies: '@ethersproject/bignumber': 5.7.0 '@ethersproject/bytes': 5.7.0 @@ -4114,47 +801,63 @@ snapshots: '@ethersproject/properties': 5.7.0 '@ethersproject/transactions': 5.7.0 '@ethersproject/web': 5.7.1 + dev: true - '@ethersproject/abstract-signer@5.7.0': + /@ethersproject/abstract-signer@5.7.0: + resolution: {integrity: sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ==} dependencies: '@ethersproject/abstract-provider': 5.7.0 '@ethersproject/bignumber': 5.7.0 '@ethersproject/bytes': 5.7.0 '@ethersproject/logger': 5.7.0 '@ethersproject/properties': 5.7.0 + dev: true - '@ethersproject/address@5.7.0': + /@ethersproject/address@5.7.0: + resolution: {integrity: sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==} dependencies: '@ethersproject/bignumber': 5.7.0 '@ethersproject/bytes': 5.7.0 '@ethersproject/keccak256': 5.7.0 '@ethersproject/logger': 5.7.0 '@ethersproject/rlp': 5.7.0 + dev: true - '@ethersproject/base64@5.7.0': + /@ethersproject/base64@5.7.0: + resolution: {integrity: sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ==} dependencies: '@ethersproject/bytes': 5.7.0 + dev: true - '@ethersproject/basex@5.7.0': + /@ethersproject/basex@5.7.0: + resolution: {integrity: sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw==} dependencies: '@ethersproject/bytes': 5.7.0 '@ethersproject/properties': 5.7.0 + dev: true - '@ethersproject/bignumber@5.7.0': + /@ethersproject/bignumber@5.7.0: + resolution: {integrity: sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw==} dependencies: '@ethersproject/bytes': 5.7.0 '@ethersproject/logger': 5.7.0 bn.js: 5.2.1 + dev: true - '@ethersproject/bytes@5.7.0': + /@ethersproject/bytes@5.7.0: + resolution: {integrity: sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A==} dependencies: '@ethersproject/logger': 5.7.0 + dev: true - '@ethersproject/constants@5.7.0': + /@ethersproject/constants@5.7.0: + resolution: {integrity: sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA==} dependencies: '@ethersproject/bignumber': 5.7.0 + dev: true - '@ethersproject/contracts@5.7.0': + /@ethersproject/contracts@5.7.0: + resolution: {integrity: sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg==} dependencies: '@ethersproject/abi': 5.7.0 '@ethersproject/abstract-provider': 5.7.0 @@ -4166,8 +869,10 @@ snapshots: '@ethersproject/logger': 5.7.0 '@ethersproject/properties': 5.7.0 '@ethersproject/transactions': 5.7.0 + dev: true - '@ethersproject/hash@5.7.0': + /@ethersproject/hash@5.7.0: + resolution: {integrity: sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g==} dependencies: '@ethersproject/abstract-signer': 5.7.0 '@ethersproject/address': 5.7.0 @@ -4178,8 +883,10 @@ snapshots: '@ethersproject/logger': 5.7.0 '@ethersproject/properties': 5.7.0 '@ethersproject/strings': 5.7.0 + dev: true - '@ethersproject/hdnode@5.7.0': + /@ethersproject/hdnode@5.7.0: + resolution: {integrity: sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg==} dependencies: '@ethersproject/abstract-signer': 5.7.0 '@ethersproject/basex': 5.7.0 @@ -4193,8 +900,10 @@ snapshots: '@ethersproject/strings': 5.7.0 '@ethersproject/transactions': 5.7.0 '@ethersproject/wordlists': 5.7.0 + dev: true - '@ethersproject/json-wallets@5.7.0': + /@ethersproject/json-wallets@5.7.0: + resolution: {integrity: sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g==} dependencies: '@ethersproject/abstract-signer': 5.7.0 '@ethersproject/address': 5.7.0 @@ -4209,28 +918,40 @@ snapshots: '@ethersproject/transactions': 5.7.0 aes-js: 3.0.0 scrypt-js: 3.0.1 + dev: true - '@ethersproject/keccak256@5.7.0': + /@ethersproject/keccak256@5.7.0: + resolution: {integrity: sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg==} dependencies: '@ethersproject/bytes': 5.7.0 js-sha3: 0.8.0 + dev: true - '@ethersproject/logger@5.7.0': {} + /@ethersproject/logger@5.7.0: + resolution: {integrity: sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig==} + dev: true - '@ethersproject/networks@5.7.1': + /@ethersproject/networks@5.7.1: + resolution: {integrity: sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ==} dependencies: '@ethersproject/logger': 5.7.0 + dev: true - '@ethersproject/pbkdf2@5.7.0': + /@ethersproject/pbkdf2@5.7.0: + resolution: {integrity: sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw==} dependencies: '@ethersproject/bytes': 5.7.0 '@ethersproject/sha2': 5.7.0 + dev: true - '@ethersproject/properties@5.7.0': + /@ethersproject/properties@5.7.0: + resolution: {integrity: sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw==} dependencies: '@ethersproject/logger': 5.7.0 + dev: true - '@ethersproject/providers@5.7.2': + /@ethersproject/providers@5.7.2: + resolution: {integrity: sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg==} dependencies: '@ethersproject/abstract-provider': 5.7.0 '@ethersproject/abstract-signer': 5.7.0 @@ -4255,24 +976,32 @@ snapshots: transitivePeerDependencies: - bufferutil - utf-8-validate + dev: true - '@ethersproject/random@5.7.0': + /@ethersproject/random@5.7.0: + resolution: {integrity: sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ==} dependencies: '@ethersproject/bytes': 5.7.0 '@ethersproject/logger': 5.7.0 + dev: true - '@ethersproject/rlp@5.7.0': + /@ethersproject/rlp@5.7.0: + resolution: {integrity: sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w==} dependencies: '@ethersproject/bytes': 5.7.0 '@ethersproject/logger': 5.7.0 + dev: true - '@ethersproject/sha2@5.7.0': + /@ethersproject/sha2@5.7.0: + resolution: {integrity: sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw==} dependencies: '@ethersproject/bytes': 5.7.0 '@ethersproject/logger': 5.7.0 hash.js: 1.1.7 + dev: true - '@ethersproject/signing-key@5.7.0': + /@ethersproject/signing-key@5.7.0: + resolution: {integrity: sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q==} dependencies: '@ethersproject/bytes': 5.7.0 '@ethersproject/logger': 5.7.0 @@ -4280,8 +1009,10 @@ snapshots: bn.js: 5.2.1 elliptic: 6.5.4 hash.js: 1.1.7 + dev: true - '@ethersproject/solidity@5.7.0': + /@ethersproject/solidity@5.7.0: + resolution: {integrity: sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA==} dependencies: '@ethersproject/bignumber': 5.7.0 '@ethersproject/bytes': 5.7.0 @@ -4289,14 +1020,18 @@ snapshots: '@ethersproject/logger': 5.7.0 '@ethersproject/sha2': 5.7.0 '@ethersproject/strings': 5.7.0 + dev: true - '@ethersproject/strings@5.7.0': + /@ethersproject/strings@5.7.0: + resolution: {integrity: sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg==} dependencies: '@ethersproject/bytes': 5.7.0 '@ethersproject/constants': 5.7.0 '@ethersproject/logger': 5.7.0 + dev: true - '@ethersproject/transactions@5.7.0': + /@ethersproject/transactions@5.7.0: + resolution: {integrity: sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ==} dependencies: '@ethersproject/address': 5.7.0 '@ethersproject/bignumber': 5.7.0 @@ -4307,14 +1042,18 @@ snapshots: '@ethersproject/properties': 5.7.0 '@ethersproject/rlp': 5.7.0 '@ethersproject/signing-key': 5.7.0 + dev: true - '@ethersproject/units@5.7.0': + /@ethersproject/units@5.7.0: + resolution: {integrity: sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg==} dependencies: '@ethersproject/bignumber': 5.7.0 '@ethersproject/constants': 5.7.0 '@ethersproject/logger': 5.7.0 + dev: true - '@ethersproject/wallet@5.7.0': + /@ethersproject/wallet@5.7.0: + resolution: {integrity: sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA==} dependencies: '@ethersproject/abstract-provider': 5.7.0 '@ethersproject/abstract-signer': 5.7.0 @@ -4331,98 +1070,151 @@ snapshots: '@ethersproject/signing-key': 5.7.0 '@ethersproject/transactions': 5.7.0 '@ethersproject/wordlists': 5.7.0 + dev: true - '@ethersproject/web@5.7.1': + /@ethersproject/web@5.7.1: + resolution: {integrity: sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w==} dependencies: '@ethersproject/base64': 5.7.0 '@ethersproject/bytes': 5.7.0 '@ethersproject/logger': 5.7.0 '@ethersproject/properties': 5.7.0 '@ethersproject/strings': 5.7.0 + dev: true - '@ethersproject/wordlists@5.7.0': + /@ethersproject/wordlists@5.7.0: + resolution: {integrity: sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA==} dependencies: '@ethersproject/bytes': 5.7.0 '@ethersproject/hash': 5.7.0 '@ethersproject/logger': 5.7.0 '@ethersproject/properties': 5.7.0 '@ethersproject/strings': 5.7.0 + dev: true - '@feelback/js@0.3.4': {} + /@feelback/js@0.3.4: + resolution: {integrity: sha512-xr7gTqSJcVUYQlELs1TntYovCBjMcYUr/hGKTnDoF64/lig5CbX4bOmqLoF50IImCy5q3oIwg9w+TSFvtBwsIA==} + dev: false - '@feelback/react@0.3.4(react@18.3.1)': + /@feelback/react@0.3.4(react@18.2.0): + resolution: {integrity: sha512-ZWzUQAmPwl4nYR2olzBKddHzoLtGW/2pb8TiesiJCirxhaDW2E/XBx2ZaB4fL5TGXtjBt4eYq/qZxJZ0fIE0kg==} + engines: {node: '>=14'} + peerDependencies: + react: '>=17' dependencies: '@feelback/js': 0.3.4 - react: 18.3.1 + react: 18.2.0 + dev: false - '@floating-ui/core@1.6.2': + /@floating-ui/core@1.6.8: + resolution: {integrity: sha512-7XJ9cPU+yI2QeLS+FCSlqNFZJq8arvswefkZrYI1yQBbftw6FyrZOxYSh+9S7z7TpeWlRt9zJ5IhM1WIL334jA==} dependencies: - '@floating-ui/utils': 0.2.2 + '@floating-ui/utils': 0.2.8 + dev: false - '@floating-ui/dom@1.6.5': + /@floating-ui/dom@1.6.11: + resolution: {integrity: sha512-qkMCxSR24v2vGkhYDo/UzxfJN3D4syqSjyuTFz6C7XcpU1pASPRieNI0Kj5VP3/503mOfYiGY891ugBX1GlABQ==} dependencies: - '@floating-ui/core': 1.6.2 - '@floating-ui/utils': 0.2.2 + '@floating-ui/core': 1.6.8 + '@floating-ui/utils': 0.2.8 + dev: false - '@floating-ui/react-dom@2.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + /@floating-ui/react-dom@2.1.2(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-06okr5cgPzMNBy+Ycse2A6udMi4bqwW/zgBF/rwjcNqWkyr82Mcg8b0vjX8OJpZFy/FKjJmw6wV7t44kK6kW7A==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' dependencies: - '@floating-ui/dom': 1.6.5 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + '@floating-ui/dom': 1.6.11 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false - '@floating-ui/react@0.26.17(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + /@floating-ui/react@0.26.25(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-hZOmgN0NTOzOuZxI1oIrDu3Gcl8WViIkvPMpB4xdd4QD6xAMtwgwr3VPoiyH/bLtRcS1cDnhxLSD1NsMJmwh/A==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' dependencies: - '@floating-ui/react-dom': 2.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@floating-ui/utils': 0.2.2 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + '@floating-ui/react-dom': 2.1.2(react-dom@18.2.0)(react@18.2.0) + '@floating-ui/utils': 0.2.8 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) tabbable: 6.2.0 + dev: false - '@floating-ui/utils@0.2.2': {} + /@floating-ui/utils@0.2.8: + resolution: {integrity: sha512-kym7SodPp8/wloecOpcmSnWJsK7M0E5Wg8UcFA+uO4B9s5d0ywXOEro/8HM9x0rW+TljRzul/14UYz3TleT3ig==} + dev: false - '@headlessui/react@1.7.19(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + /@headlessui/react@1.7.17(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-4am+tzvkqDSSgiwrsEpGWqgGo9dz8qU5M3znCkC4PgkpY4HcCZzEDEvozltGGGHIKl9jbXbZPSH5TWn4sWJdow==} + engines: {node: '>=10'} + peerDependencies: + react: ^16 || ^17 || ^18 + react-dom: ^16 || ^17 || ^18 dependencies: - '@tanstack/react-virtual': 3.5.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) client-only: 0.0.1 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false - '@headlessui/react@2.1.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + /@headlessui/react@2.1.8(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-uajqVkAcVG/wHwG9Fh5PFMcFpf2VxM4vNRNKxRjuK009kePVur8LkuuygHfIE+2uZ7z7GnlTtYsyUe6glPpTLg==} + engines: {node: '>=10'} + peerDependencies: + react: ^18 + react-dom: ^18 dependencies: - '@floating-ui/react': 0.26.17(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@react-aria/focus': 3.17.1(react@18.3.1) - '@react-aria/interactions': 3.21.3(react@18.3.1) - '@tanstack/react-virtual': 3.10.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + '@floating-ui/react': 0.26.25(react-dom@18.2.0)(react@18.2.0) + '@react-aria/focus': 3.18.4(react@18.2.0) + '@react-aria/interactions': 3.22.4(react@18.2.0) + '@tanstack/react-virtual': 3.10.8(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false - '@humanwhocodes/config-array@0.11.14': + /@humanwhocodes/config-array@0.11.13: + resolution: {integrity: sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==} + engines: {node: '>=10.10.0'} dependencies: - '@humanwhocodes/object-schema': 2.0.3 + '@humanwhocodes/object-schema': 2.0.1 debug: 4.3.4 minimatch: 3.1.2 transitivePeerDependencies: - supports-color + dev: true - '@humanwhocodes/module-importer@1.0.1': {} + /@humanwhocodes/module-importer@1.0.1: + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + dev: true - '@humanwhocodes/object-schema@2.0.3': {} + /@humanwhocodes/object-schema@2.0.1: + resolution: {integrity: sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==} + dev: true - '@isaacs/cliui@8.0.2': + /@isaacs/cliui@8.0.2: + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} dependencies: string-width: 5.1.2 - string-width-cjs: string-width@4.2.3 + string-width-cjs: /string-width@4.2.3 strip-ansi: 7.1.0 - strip-ansi-cjs: strip-ansi@6.0.1 + strip-ansi-cjs: /strip-ansi@6.0.1 wrap-ansi: 8.1.0 - wrap-ansi-cjs: wrap-ansi@7.0.0 + wrap-ansi-cjs: /wrap-ansi@7.0.0 + dev: true - '@jsdevtools/ono@7.1.3': {} + /@jsdevtools/ono@7.1.3: + resolution: {integrity: sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==} + dev: true - '@mdx-js/mdx@2.3.0': + /@mdx-js/mdx@2.3.0: + resolution: {integrity: sha512-jLuwRlz8DQfQNiUCJR50Y09CGPq3fLtmtUQfVrj79E0JWu3dvsVcxVIcfhR5h0iXu+/z++zDrYeiJqifRynJkA==} dependencies: - '@types/estree-jsx': 1.0.5 - '@types/mdx': 2.0.13 + '@types/estree-jsx': 1.0.3 + '@types/mdx': 2.0.9 estree-util-build-jsx: 2.2.2 estree-util-is-identifier-name: 2.1.0 estree-util-to-js: 1.2.0 @@ -4440,388 +1232,691 @@ snapshots: vfile: 5.3.7 transitivePeerDependencies: - supports-color + dev: false - '@mdx-js/react@2.3.0(react@18.3.1)': + /@mdx-js/react@2.3.0(react@18.2.0): + resolution: {integrity: sha512-zQH//gdOmuu7nt2oJR29vFhDv88oGPmVw6BggmrHeMI+xgEkp1B2dX9/bMBSYtK0dyLX/aOmesKS09g222K1/g==} + peerDependencies: + react: '>=16' dependencies: - '@types/mdx': 2.0.13 - '@types/react': 18.3.1 - react: 18.3.1 + '@types/mdx': 2.0.9 + '@types/react': 18.2.36 + react: 18.2.0 + dev: false - '@napi-rs/simple-git-android-arm-eabi@0.1.16': + /@napi-rs/simple-git-android-arm-eabi@0.1.9: + resolution: {integrity: sha512-9D4JnfePMpgL4pg9aMUX7/TIWEUQ+Tgx8n3Pf8TNCMGjUbImJyYsDSLJzbcv9wH7srgn4GRjSizXFJHAPjzEug==} + engines: {node: '>= 10'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: false optional: true - '@napi-rs/simple-git-android-arm64@0.1.16': + /@napi-rs/simple-git-android-arm64@0.1.9: + resolution: {integrity: sha512-Krilsw0gPrrASZzudNEl9pdLuNbhoTK0j7pUbfB8FRifpPdFB/zouwuEm0aSnsDXN4ftGrmGG82kuiR/2MeoPg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: false optional: true - '@napi-rs/simple-git-darwin-arm64@0.1.16': + /@napi-rs/simple-git-darwin-arm64@0.1.9: + resolution: {integrity: sha512-H/F09nDgYjv4gcFrZBgdTKkZEepqt0KLYcCJuUADuxkKupmjLdecMhypXLk13AzvLW4UQI7NlLTLDXUFLyr2BA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false optional: true - '@napi-rs/simple-git-darwin-x64@0.1.16': + /@napi-rs/simple-git-darwin-x64@0.1.9: + resolution: {integrity: sha512-jBR2xS9nVPqmHv0TWz874W0m/d453MGrMeLjB+boK5IPPLhg3AWIZj0aN9jy2Je1BGVAa0w3INIQJtBBeB6kFA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false optional: true - '@napi-rs/simple-git-linux-arm-gnueabihf@0.1.16': + /@napi-rs/simple-git-linux-arm-gnueabihf@0.1.9: + resolution: {integrity: sha512-3n0+VpO4YfZxndZ0sCvsHIvsazd+JmbSjrlTRBCnJeAU1/sfos3skNZtKGZksZhjvd+3o+/GFM8L7Xnv01yggA==} + engines: {node: '>= 10'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: false optional: true - '@napi-rs/simple-git-linux-arm64-gnu@0.1.16': + /@napi-rs/simple-git-linux-arm64-gnu@0.1.9: + resolution: {integrity: sha512-lIzf0KHU2SKC12vMrWwCtysG2Sdt31VHRPMUiz9lD9t3xwVn8qhFSTn5yDkTeG3rgX6o0p5EKalfQN5BXsJq2w==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false optional: true - '@napi-rs/simple-git-linux-arm64-musl@0.1.16': + /@napi-rs/simple-git-linux-arm64-musl@0.1.9: + resolution: {integrity: sha512-KQozUoNXrxrB8k741ncWXSiMbjl1AGBGfZV21PANzUM8wH4Yem2bg3kfglYS/QIx3udspsT35I9abu49n7D1/w==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false optional: true - '@napi-rs/simple-git-linux-x64-gnu@0.1.16': + /@napi-rs/simple-git-linux-x64-gnu@0.1.9: + resolution: {integrity: sha512-O/Niui5mnHPcK3iYC3ui8wgERtJWsQ3Y74W/09t0bL/3dgzGMl4oQt0qTj9dWCsnoGsIEYHPzwCBp/2vqYp/pw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false optional: true - '@napi-rs/simple-git-linux-x64-musl@0.1.16': + /@napi-rs/simple-git-linux-x64-musl@0.1.9: + resolution: {integrity: sha512-L9n+e8Wn3hKr3RsIdY8GaB+ry4xZ4BaGwyKExgoB8nDGQuRUY9oP6p0WA4hWfJvJnU1H6hvo36a5UFPReyBO7A==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false optional: true - '@napi-rs/simple-git-win32-arm64-msvc@0.1.16': + /@napi-rs/simple-git-win32-arm64-msvc@0.1.9: + resolution: {integrity: sha512-Z6Ja/SZK+lMvRWaxj7wjnvSbAsGrH006sqZo8P8nxKUdZfkVvoCaAWr1r0cfkk2Z3aijLLtD+vKeXGlUPH6gGQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: false optional: true - '@napi-rs/simple-git-win32-x64-msvc@0.1.16': + /@napi-rs/simple-git-win32-x64-msvc@0.1.9: + resolution: {integrity: sha512-VAZj1UvC+R2MjKOD3I/Y7dmQlHWAYy4omhReQJRpbCf+oGCBi9CWiIduGqeYEq723nLIKdxP7XjaO0wl1NnUww==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false optional: true - '@napi-rs/simple-git@0.1.16': + /@napi-rs/simple-git@0.1.9: + resolution: {integrity: sha512-qKzDS0+VjMvVyU28px+C6zlD1HKy83NIdYzfMQWa/g/V1iG/Ic8uwrS2ihHfm7mp7X0PPrmINLiTTi6ieUIKfw==} + engines: {node: '>= 10'} optionalDependencies: - '@napi-rs/simple-git-android-arm-eabi': 0.1.16 - '@napi-rs/simple-git-android-arm64': 0.1.16 - '@napi-rs/simple-git-darwin-arm64': 0.1.16 - '@napi-rs/simple-git-darwin-x64': 0.1.16 - '@napi-rs/simple-git-linux-arm-gnueabihf': 0.1.16 - '@napi-rs/simple-git-linux-arm64-gnu': 0.1.16 - '@napi-rs/simple-git-linux-arm64-musl': 0.1.16 - '@napi-rs/simple-git-linux-x64-gnu': 0.1.16 - '@napi-rs/simple-git-linux-x64-musl': 0.1.16 - '@napi-rs/simple-git-win32-arm64-msvc': 0.1.16 - '@napi-rs/simple-git-win32-x64-msvc': 0.1.16 - - '@next/env@13.5.6': {} - - '@next/env@14.2.10': {} - - '@next/swc-darwin-arm64@14.2.10': + '@napi-rs/simple-git-android-arm-eabi': 0.1.9 + '@napi-rs/simple-git-android-arm64': 0.1.9 + '@napi-rs/simple-git-darwin-arm64': 0.1.9 + '@napi-rs/simple-git-darwin-x64': 0.1.9 + '@napi-rs/simple-git-linux-arm-gnueabihf': 0.1.9 + '@napi-rs/simple-git-linux-arm64-gnu': 0.1.9 + '@napi-rs/simple-git-linux-arm64-musl': 0.1.9 + '@napi-rs/simple-git-linux-x64-gnu': 0.1.9 + '@napi-rs/simple-git-linux-x64-musl': 0.1.9 + '@napi-rs/simple-git-win32-arm64-msvc': 0.1.9 + '@napi-rs/simple-git-win32-x64-msvc': 0.1.9 + dev: false + + /@next/env@13.5.6: + resolution: {integrity: sha512-Yac/bV5sBGkkEXmAX5FWPS9Mmo2rthrOPRQQNfycJPkjUAUclomCPH7QFVCDQ4Mp2k2K1SSM6m0zrxYrOwtFQw==} + dev: false + + /@next/env@14.2.10: + resolution: {integrity: sha512-dZIu93Bf5LUtluBXIv4woQw2cZVZ2DJTjax5/5DOs3lzEOeKLy7GxRSr4caK9/SCPdaW6bCgpye6+n4Dh9oJPw==} + dev: false + + /@next/swc-darwin-arm64@14.2.10: + resolution: {integrity: sha512-V3z10NV+cvMAfxQUMhKgfQnPbjw+Ew3cnr64b0lr8MDiBJs3eLnM6RpGC46nhfMZsiXgQngCJKWGTC/yDcgrDQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false optional: true - '@next/swc-darwin-x64@14.2.10': + /@next/swc-darwin-x64@14.2.10: + resolution: {integrity: sha512-Y0TC+FXbFUQ2MQgimJ/7Ina2mXIKhE7F+GUe1SgnzRmwFY3hX2z8nyVCxE82I2RicspdkZnSWMn4oTjIKz4uzA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false optional: true - '@next/swc-linux-arm64-gnu@14.2.10': + /@next/swc-linux-arm64-gnu@14.2.10: + resolution: {integrity: sha512-ZfQ7yOy5zyskSj9rFpa0Yd7gkrBnJTkYVSya95hX3zeBG9E55Z6OTNPn1j2BTFWvOVVj65C3T+qsjOyVI9DQpA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false optional: true - '@next/swc-linux-arm64-musl@14.2.10': + /@next/swc-linux-arm64-musl@14.2.10: + resolution: {integrity: sha512-n2i5o3y2jpBfXFRxDREr342BGIQCJbdAUi/K4q6Env3aSx8erM9VuKXHw5KNROK9ejFSPf0LhoSkU/ZiNdacpQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false optional: true - '@next/swc-linux-x64-gnu@14.2.10': + /@next/swc-linux-x64-gnu@14.2.10: + resolution: {integrity: sha512-GXvajAWh2woTT0GKEDlkVhFNxhJS/XdDmrVHrPOA83pLzlGPQnixqxD8u3bBB9oATBKB//5e4vpACnx5Vaxdqg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false optional: true - '@next/swc-linux-x64-musl@14.2.10': + /@next/swc-linux-x64-musl@14.2.10: + resolution: {integrity: sha512-opFFN5B0SnO+HTz4Wq4HaylXGFV+iHrVxd3YvREUX9K+xfc4ePbRrxqOuPOFjtSuiVouwe6uLeDtabjEIbkmDA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false optional: true - '@next/swc-win32-arm64-msvc@14.2.10': + /@next/swc-win32-arm64-msvc@14.2.10: + resolution: {integrity: sha512-9NUzZuR8WiXTvv+EiU/MXdcQ1XUvFixbLIMNQiVHuzs7ZIFrJDLJDaOF1KaqttoTujpcxljM/RNAOmw1GhPPQQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: false optional: true - '@next/swc-win32-ia32-msvc@14.2.10': + /@next/swc-win32-ia32-msvc@14.2.10: + resolution: {integrity: sha512-fr3aEbSd1GeW3YUMBkWAu4hcdjZ6g4NBl1uku4gAn661tcxd1bHs1THWYzdsbTRLcCKLjrDZlNp6j2HTfrw+Bg==} + engines: {node: '>= 10'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: false optional: true - '@next/swc-win32-x64-msvc@14.2.10': + /@next/swc-win32-x64-msvc@14.2.10: + resolution: {integrity: sha512-UjeVoRGKNL2zfbcQ6fscmgjBAS/inHBh63mjIlfPg/NG8Yn2ztqylXt5qilYb6hoHIwaU2ogHknHWWmahJjgZQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false optional: true - '@noble/curves@1.2.0': + /@noble/curves@1.1.0: + resolution: {integrity: sha512-091oBExgENk/kGj3AZmtBDMpxQPDtxQABR2B9lb1JbVTs6ytdzZNwvhxQ4MWasRNEzlbEH8jCWFCwhF/Obj5AA==} dependencies: - '@noble/hashes': 1.3.2 + '@noble/hashes': 1.3.1 + dev: true - '@noble/curves@1.3.0': + /@noble/curves@1.2.0: + resolution: {integrity: sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==} dependencies: - '@noble/hashes': 1.3.3 - - '@noble/hashes@1.3.2': {} + '@noble/hashes': 1.3.2 + dev: false - '@noble/hashes@1.3.3': {} + /@noble/hashes@1.3.1: + resolution: {integrity: sha512-EbqwksQwz9xDRGfDST86whPBgM65E0OH/pCgqW0GBVzO22bNE+NuIbeTb714+IfSjU3aRk47EUvXIb5bTsenKA==} + engines: {node: '>= 16'} - '@noble/hashes@1.4.0': {} + /@noble/hashes@1.3.2: + resolution: {integrity: sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==} + engines: {node: '>= 16'} + dev: false - '@nodelib/fs.scandir@2.1.5': + /@nodelib/fs.scandir@2.1.5: + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} dependencies: '@nodelib/fs.stat': 2.0.5 run-parallel: 1.2.0 - '@nodelib/fs.stat@2.0.5': {} + /@nodelib/fs.stat@2.0.5: + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} - '@nodelib/fs.walk@1.2.8': + /@nodelib/fs.walk@1.2.8: + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} dependencies: '@nodelib/fs.scandir': 2.1.5 - fastq: 1.17.1 + fastq: 1.15.0 - '@npmcli/config@6.4.1': + /@npmcli/config@6.4.0: + resolution: {integrity: sha512-/fQjIbuNVIT/PbXvw178Tm97bxV0E0nVUFKHivMKtSI2pcs8xKdaWkHJxf9dTI0G/y5hp/KuCvgcUu5HwAtI1w==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} dependencies: - '@npmcli/map-workspaces': 3.0.6 - ci-info: 4.0.0 - ini: 4.1.2 + '@npmcli/map-workspaces': 3.0.4 + ci-info: 3.9.0 + ini: 4.1.1 nopt: 7.2.0 proc-log: 3.0.0 read-package-json-fast: 3.0.2 - semver: 7.6.0 + semver: 7.5.4 walk-up-path: 3.0.1 + dev: true - '@npmcli/map-workspaces@3.0.6': + /@npmcli/map-workspaces@3.0.4: + resolution: {integrity: sha512-Z0TbvXkRbacjFFLpVpV0e2mheCh+WzQpcqL+4xp49uNJOxOnIAPZyXtUxZ5Qn3QBTGKA11Exjd9a5411rBrhDg==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} dependencies: '@npmcli/name-from-folder': 2.0.0 - glob: 10.3.12 - minimatch: 9.0.4 + glob: 10.3.10 + minimatch: 9.0.3 read-package-json-fast: 3.0.2 + dev: true - '@npmcli/name-from-folder@2.0.0': {} + /@npmcli/name-from-folder@2.0.0: + resolution: {integrity: sha512-pwK+BfEBZJbKdNYpHHRTNBwBoqrN/iIMO0AiGvYsp3Hoaq0WbgGSWQR6SCldZovoDpY3yje5lkFUe6gsDgJ2vg==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dev: true - '@pkgjs/parseargs@0.11.0': + /@pkgjs/parseargs@0.11.0: + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + requiresBuild: true + dev: true optional: true - '@pkgr/core@0.1.1': {} + /@pkgr/utils@2.4.2: + resolution: {integrity: sha512-POgTXhjrTfbTV63DiFXav4lBHiICLKKwDeaKn9Nphwj7WH6m0hMMCaJkMyRWjgtPFyRKRVoMXXjczsTQRDEhYw==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + dependencies: + cross-spawn: 7.0.3 + fast-glob: 3.3.2 + is-glob: 4.0.3 + open: 9.1.0 + picocolors: 1.0.0 + tslib: 2.6.2 + dev: true - '@popperjs/core@2.11.8': {} + /@popperjs/core@2.11.8: + resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==} + dev: false - '@react-aria/focus@3.17.1(react@18.3.1)': + /@react-aria/focus@3.18.4(react@18.2.0): + resolution: {integrity: sha512-91J35077w9UNaMK1cpMUEFRkNNz0uZjnSwiyBCFuRdaVuivO53wNC9XtWSDNDdcO5cGy87vfJRVAiyoCn/mjqA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 dependencies: - '@react-aria/interactions': 3.21.3(react@18.3.1) - '@react-aria/utils': 3.24.1(react@18.3.1) - '@react-types/shared': 3.23.1(react@18.3.1) + '@react-aria/interactions': 3.22.4(react@18.2.0) + '@react-aria/utils': 3.25.3(react@18.2.0) + '@react-types/shared': 3.25.0(react@18.2.0) '@swc/helpers': 0.5.2 clsx: 2.1.1 - react: 18.3.1 + react: 18.2.0 + dev: false - '@react-aria/interactions@3.21.3(react@18.3.1)': + /@react-aria/interactions@3.22.4(react@18.2.0): + resolution: {integrity: sha512-E0vsgtpItmknq/MJELqYJwib+YN18Qag8nroqwjk1qOnBa9ROIkUhWJerLi1qs5diXq9LHKehZDXRlwPvdEFww==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 dependencies: - '@react-aria/ssr': 3.9.4(react@18.3.1) - '@react-aria/utils': 3.24.1(react@18.3.1) - '@react-types/shared': 3.23.1(react@18.3.1) + '@react-aria/ssr': 3.9.6(react@18.2.0) + '@react-aria/utils': 3.25.3(react@18.2.0) + '@react-types/shared': 3.25.0(react@18.2.0) '@swc/helpers': 0.5.2 - react: 18.3.1 + react: 18.2.0 + dev: false - '@react-aria/ssr@3.9.4(react@18.3.1)': + /@react-aria/ssr@3.9.6(react@18.2.0): + resolution: {integrity: sha512-iLo82l82ilMiVGy342SELjshuWottlb5+VefO3jOQqQRNYnJBFpUSadswDPbRimSgJUZuFwIEYs6AabkP038fA==} + engines: {node: '>= 12'} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 dependencies: '@swc/helpers': 0.5.2 - react: 18.3.1 + react: 18.2.0 + dev: false - '@react-aria/utils@3.24.1(react@18.3.1)': + /@react-aria/utils@3.25.3(react@18.2.0): + resolution: {integrity: sha512-PR5H/2vaD8fSq0H/UB9inNbc8KDcVmW6fYAfSWkkn+OAdhTTMVKqXXrZuZBWyFfSD5Ze7VN6acr4hrOQm2bmrA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 dependencies: - '@react-aria/ssr': 3.9.4(react@18.3.1) - '@react-stately/utils': 3.10.1(react@18.3.1) - '@react-types/shared': 3.23.1(react@18.3.1) + '@react-aria/ssr': 3.9.6(react@18.2.0) + '@react-stately/utils': 3.10.4(react@18.2.0) + '@react-types/shared': 3.25.0(react@18.2.0) '@swc/helpers': 0.5.2 clsx: 2.1.1 - react: 18.3.1 + react: 18.2.0 + dev: false - '@react-stately/utils@3.10.1(react@18.3.1)': + /@react-stately/utils@3.10.4(react@18.2.0): + resolution: {integrity: sha512-gBEQEIMRh5f60KCm7QKQ2WfvhB2gLUr9b72sqUdIZ2EG+xuPgaIlCBeSicvjmjBvYZwOjoOEnmIkcx2GHp/HWw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 dependencies: '@swc/helpers': 0.5.2 - react: 18.3.1 + react: 18.2.0 + dev: false - '@react-types/shared@3.23.1(react@18.3.1)': + /@react-types/shared@3.25.0(react@18.2.0): + resolution: {integrity: sha512-OZSyhzU6vTdW3eV/mz5i6hQwQUhkRs7xwY2d1aqPvTdMe0+2cY7Fwp45PAiwYLEj73i9ro2FxF9qC4DvHGSCgQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 dependencies: - react: 18.3.1 - - '@scure/base@1.1.6': {} + react: 18.2.0 + dev: false - '@scure/bip32@1.3.2': - dependencies: - '@noble/curves': 1.2.0 - '@noble/hashes': 1.3.2 - '@scure/base': 1.1.6 + /@scure/base@1.1.3: + resolution: {integrity: sha512-/+SgoRjLq7Xlf0CWuLHq2LUZeL/w65kfzAPG5NH9pcmBhs+nunQTn4gvdwgMTIXnt9b2C/1SeL2XiysZEyIC9Q==} - '@scure/bip32@1.3.3': + /@scure/bip32@1.3.1: + resolution: {integrity: sha512-osvveYtyzdEVbt3OfwwXFr4P2iVBL5u1Q3q4ONBfDY/UpOuXmOlbgwc1xECEboY8wIays8Yt6onaWMUdUbfl0A==} dependencies: - '@noble/curves': 1.3.0 - '@noble/hashes': 1.3.3 - '@scure/base': 1.1.6 + '@noble/curves': 1.1.0 + '@noble/hashes': 1.3.1 + '@scure/base': 1.1.3 + dev: true - '@scure/bip39@1.2.1': + /@scure/bip32@1.3.2: + resolution: {integrity: sha512-N1ZhksgwD3OBlwTv3R6KFEcPojl/W4ElJOeCZdi+vuI5QmTFwLq3OFf2zd2ROpKvxFdgZ6hUpb0dx9bVNEwYCA==} dependencies: + '@noble/curves': 1.2.0 '@noble/hashes': 1.3.2 - '@scure/base': 1.1.6 + '@scure/base': 1.1.3 + dev: false - '@scure/bip39@1.2.2': + /@scure/bip39@1.2.1: + resolution: {integrity: sha512-Z3/Fsz1yr904dduJD0NpiyRHhRYHdcnyh73FZWiV+/qhWi83wNJ3NWolYqCEN+ZWsUz2TWwajJggcRE9r1zUYg==} dependencies: - '@noble/hashes': 1.3.3 - '@scure/base': 1.1.6 + '@noble/hashes': 1.3.1 + '@scure/base': 1.1.3 - '@swc/counter@0.1.3': {} + /@swc/counter@0.1.3: + resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} + dev: false - '@swc/helpers@0.5.2': + /@swc/helpers@0.5.2: + resolution: {integrity: sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==} dependencies: tslib: 2.6.2 + dev: false - '@swc/helpers@0.5.5': + /@swc/helpers@0.5.5: + resolution: {integrity: sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A==} dependencies: '@swc/counter': 0.1.3 tslib: 2.6.2 + dev: false - '@tanstack/react-virtual@3.10.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + /@tanstack/react-virtual@3.10.8(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-VbzbVGSsZlQktyLrP5nxE+vE1ZR+U0NFAWPbJLoG2+DKPwd2D7dVICTVIIaYlJqX1ZCEnYDbaOpmMwbsyhBoIA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 dependencies: '@tanstack/virtual-core': 3.10.8 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - - '@tanstack/react-virtual@3.5.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@tanstack/virtual-core': 3.5.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - - '@tanstack/virtual-core@3.10.8': {} + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false - '@tanstack/virtual-core@3.5.0': {} + /@tanstack/virtual-core@3.10.8: + resolution: {integrity: sha512-PBu00mtt95jbKFi6Llk9aik8bnR3tR/oQP1o3TSi+iG//+Q2RTIzCEgKkHG8BB86kxMNW6O8wku+Lmi+QFR6jA==} + dev: false - '@testing-library/dom@9.3.4': + /@testing-library/dom@9.3.3: + resolution: {integrity: sha512-fB0R+fa3AUqbLHWyxXa2kGVtf1Fe1ZZFr0Zp6AIbIAzXb2mKbEXl+PCQNUOaq5lbTab5tfctfXRNsWXxa2f7Aw==} + engines: {node: '>=14'} dependencies: - '@babel/code-frame': 7.24.2 - '@babel/runtime': 7.24.4 + '@babel/code-frame': 7.23.4 + '@babel/runtime': 7.23.2 '@types/aria-query': 5.0.4 aria-query: 5.1.3 chalk: 4.1.2 dom-accessibility-api: 0.5.16 lz-string: 1.5.0 pretty-format: 27.5.1 + dev: false - '@testing-library/react@14.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + /@testing-library/react@14.1.2(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-z4p7DVBTPjKM5qDZ0t5ZjzkpSNb+fZy1u6bzO7kk8oeGagpPCAtgh4cx1syrfp7a+QWkM021jGqjJaxJJnXAZg==} + engines: {node: '>=14'} + peerDependencies: + react: ^18.0.0 + react-dom: ^18.0.0 dependencies: - '@babel/runtime': 7.24.4 - '@testing-library/dom': 9.3.4 - '@types/react-dom': 18.3.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + '@babel/runtime': 7.23.2 + '@testing-library/dom': 9.3.3 + '@types/react-dom': 18.2.16 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false - '@theguild/remark-mermaid@0.0.5(react@18.3.1)': + /@theguild/remark-mermaid@0.0.5(react@18.2.0): + resolution: {integrity: sha512-e+ZIyJkEv9jabI4m7q29wZtZv+2iwPGsXJ2d46Zi7e+QcFudiyuqhLhHG/3gX3ZEB+hxTch+fpItyMS8jwbIcw==} + peerDependencies: + react: ^18.2.0 dependencies: - mermaid: 10.9.3 - react: 18.3.1 + mermaid: 10.6.1 + react: 18.2.0 unist-util-visit: 5.0.0 transitivePeerDependencies: - supports-color + dev: false - '@theguild/remark-npm2yarn@0.2.1': + /@theguild/remark-npm2yarn@0.2.1: + resolution: {integrity: sha512-jUTFWwDxtLEFtGZh/TW/w30ySaDJ8atKWH8dq2/IiQF61dPrGfETpl0WxD0VdBfuLOeU14/kop466oBSRO/5CA==} dependencies: - npm-to-yarn: 2.2.1 + npm-to-yarn: 2.1.0 unist-util-visit: 5.0.0 + dev: false - '@types/acorn@4.0.6': + /@types/acorn@4.0.6: + resolution: {integrity: sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ==} dependencies: '@types/estree': 1.0.5 - '@types/aria-query@5.0.4': {} + /@types/aria-query@5.0.4: + resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==} + dev: false - '@types/change-case@2.3.1': + /@types/change-case@2.3.1: + resolution: {integrity: sha512-HYiGjhmGInNzJjtt6ciXEfl2s8ZQGUQpPiwgWSth1fycE69hXbV/RgWH7MvSq2QPhMBzi4SGhu1vE+cMx1xB8g==} + deprecated: This is a stub types definition for change-case (https://github.com/blakeembrey/change-case). change-case provides its own type definitions, so you don't need @types/change-case installed! dependencies: change-case: 4.1.2 + dev: false - '@types/concat-stream@2.0.3': + /@types/concat-stream@2.0.3: + resolution: {integrity: sha512-3qe4oQAPNwVNwK4C9c8u+VJqv9kez+2MR4qJpoPFfXtgxxif1QbFusvXzK0/Wra2VX07smostI2VMmJNSpZjuQ==} dependencies: '@types/node': 18.11.10 + dev: true - '@types/d3-scale-chromatic@3.0.3': {} + /@types/d3-scale-chromatic@3.0.1: + resolution: {integrity: sha512-Ob7OrwiTeQXY/WBBbRHGZBOn6rH1h7y3jjpTSKYqDEeqFjktql6k2XSgNwLrLDmAsXhEn8P9NHDY4VTuo0ZY1w==} + dev: false - '@types/d3-scale@4.0.8': + /@types/d3-scale@4.0.7: + resolution: {integrity: sha512-/YEbMIOtqSFSELqUT8desdT3a7iybPkSQiIx/wN4CZ/5b7wrCvmyXWELTMUYB10k0N5rzHVu4f/OkhulG1b3Lw==} dependencies: - '@types/d3-time': 3.0.3 + '@types/d3-time': 3.0.2 + dev: false - '@types/d3-time@3.0.3': {} + /@types/d3-time@3.0.2: + resolution: {integrity: sha512-kbdRXTmUgNfw5OTE3KZnFQn6XdIc4QGroN5UixgdrXATmYsdlPQS6pEut9tVlIojtzuFD4txs/L+Rq41AHtLpg==} + dev: false - '@types/debug@4.1.12': + /@types/debug@4.1.11: + resolution: {integrity: sha512-R2qflTjHDs4CL6D/6TkqBeIHr54WzZfIxN729xvCNlYIVp2LknlnCro5Yo3frNaX2E5gO9pZ3/QAPVdGmu+q9w==} dependencies: - '@types/ms': 0.7.34 + '@types/ms': 0.7.33 - '@types/estree-jsx@1.0.5': + /@types/estree-jsx@1.0.3: + resolution: {integrity: sha512-pvQ+TKeRHeiUGRhvYwRrQ/ISnohKkSJR14fT2yqyZ4e9K5vqc7hrtY2Y1Dw0ZwAzQ6DQsxsaCUuSIIi8v0Cq6w==} dependencies: '@types/estree': 1.0.5 - '@types/estree@1.0.5': {} + /@types/estree@1.0.5: + resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} - '@types/hast@2.3.10': + /@types/hast@2.3.7: + resolution: {integrity: sha512-EVLigw5zInURhzfXUM65eixfadfsHKomGKUakToXo84t8gGIJuTcD2xooM2See7GyQ7DRtYjhCHnSUQez8JaLw==} dependencies: - '@types/unist': 2.0.10 + '@types/unist': 2.0.9 - '@types/hast@3.0.4': + /@types/hast@3.0.2: + resolution: {integrity: sha512-B5hZHgHsXvfCoO3xgNJvBnX7N8p86TqQeGKXcokW4XXi+qY4vxxPSFYofytvVmpFxzPv7oxDQzjg5Un5m2/xiw==} dependencies: - '@types/unist': 3.0.2 + '@types/unist': 3.0.1 + dev: false - '@types/is-empty@1.2.3': {} + /@types/is-empty@1.2.3: + resolution: {integrity: sha512-4J1l5d79hoIvsrKh5VUKVRA1aIdsOb10Hu5j3J2VfP/msDnfTdGPmNp2E1Wg+vs97Bktzo+MZePFFXSGoykYJw==} + dev: true - '@types/js-yaml@4.0.9': {} + /@types/js-yaml@4.0.8: + resolution: {integrity: sha512-m6jnPk1VhlYRiLFm3f8X9Uep761f+CK8mHyS65LutH2OhmBF0BeMEjHgg05usH8PLZMWWc/BUR9RPmkvpWnyRA==} + dev: false - '@types/json-schema@7.0.15': {} + /@types/json-schema@7.0.15: + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + dev: true - '@types/katex@0.16.7': {} + /@types/katex@0.16.5: + resolution: {integrity: sha512-DD2Y3xMlTQvAnN6d8803xdgnOeYZ+HwMglb7/9YCf49J9RkJL53azf9qKa40MkEYhqVwxZ1GS2+VlShnz4Z1Bw==} + dev: false - '@types/lodash.clonedeep@4.5.9': + /@types/lodash.clonedeep@4.5.9: + resolution: {integrity: sha512-19429mWC+FyaAhOLzsS8kZUsI+/GmBAQ0HFiCPsKGU+7pBXOQWhyrY6xNNDwUSX8SMZMJvuFVMF9O5dQOlQK9Q==} dependencies: - '@types/lodash': 4.17.0 + '@types/lodash': 4.14.202 + dev: true - '@types/lodash@4.17.0': {} + /@types/lodash@4.14.202: + resolution: {integrity: sha512-OvlIYQK9tNneDlS0VN54LLd5uiPCBOp7gS5Z0f1mjoJYBrtStzgmJBxONW3U6OZqdtNzZPmn9BS/7WI7BFFcFQ==} + dev: true - '@types/mdast@3.0.15': + /@types/mdast@3.0.14: + resolution: {integrity: sha512-gVZ04PGgw1qLZKsnWnyFv4ORnaJ+DXLdHTVSFbU8yX6xZ34Bjg4Q32yPkmveUP1yItXReKfB0Aknlh/3zxTKAw==} dependencies: - '@types/unist': 2.0.10 + '@types/unist': 2.0.9 - '@types/mdast@4.0.3': + /@types/mdast@4.0.2: + resolution: {integrity: sha512-tYR83EignvhYO9iU3kDg8V28M0jqyh9zzp5GV+EO+AYnyUl3P5ltkTeJuTiFZQFz670FSb3EwT/6LQdX+UdKfw==} dependencies: - '@types/unist': 3.0.2 + '@types/unist': 3.0.1 - '@types/mdx@2.0.13': {} + /@types/mdx@2.0.9: + resolution: {integrity: sha512-OKMdj17y8Cs+k1r0XFyp59ChSOwf8ODGtMQ4mnpfz5eFDk1aO41yN3pSKGuvVzmWAkFp37seubY1tzOVpwfWwg==} + dev: false - '@types/ms@0.7.34': {} + /@types/ms@0.7.33: + resolution: {integrity: sha512-AuHIyzR5Hea7ij0P9q7vx7xu4z0C28ucwjAZC0ja7JhINyCnOw8/DnvAPQQ9TfOlCtZAmCERKQX9+o1mgQhuOQ==} - '@types/node@18.11.10': {} + /@types/node@18.11.10: + resolution: {integrity: sha512-juG3RWMBOqcOuXC643OAdSA525V44cVgGV6dUDuiFtss+8Fk5x1hI93Rsld43VeJVIeqlP9I7Fn9/qaVqoEAuQ==} + dev: true - '@types/prop-types@15.7.12': {} + /@types/prop-types@15.7.9: + resolution: {integrity: sha512-n1yyPsugYNSmHgxDFjicaI2+gCNjsBck8UX9kuofAKlc0h1bL+20oSF72KeNaW2DUlesbEVCFgyV2dPGTiY42g==} + dev: false - '@types/react-dom@18.3.0': + /@types/react-dom@18.2.16: + resolution: {integrity: sha512-766c37araZ9vxtYs25gvY2wNdFWsT2ZiUvOd0zMhTaoGj6B911N8CKQWgXXJoPMLF3J82thpRqQA7Rf3rBwyJw==} dependencies: - '@types/react': 18.3.1 + '@types/react': 18.2.36 + dev: false - '@types/react@18.3.1': + /@types/react@18.2.36: + resolution: {integrity: sha512-o9XFsHYLLZ4+sb9CWUYwHqFVoG61SesydF353vFMMsQziiyRu8np4n2OYMUSDZ8XuImxDr9c5tR7gidlH29Vnw==} dependencies: - '@types/prop-types': 15.7.12 - csstype: 3.1.3 + '@types/prop-types': 15.7.9 + '@types/scheduler': 0.16.5 + csstype: 3.1.2 + dev: false - '@types/supports-color@8.1.3': {} + /@types/scheduler@0.16.5: + resolution: {integrity: sha512-s/FPdYRmZR8SjLWGMCuax7r3qCWQw9QKHzXVukAuuIJkXkDRwp+Pu5LMIVFi0Fxbav35WURicYr8u1QsoybnQw==} + dev: false - '@types/unist@2.0.10': {} + /@types/supports-color@8.1.3: + resolution: {integrity: sha512-Hy6UMpxhE3j1tLpl27exp1XqHD7n8chAiNPzWfz16LPZoMMoSc4dzLl6w9qijkEb/r5O1ozdu1CWGA2L83ZeZg==} + dev: true - '@types/unist@3.0.2': {} + /@types/unist@2.0.9: + resolution: {integrity: sha512-zC0iXxAv1C1ERURduJueYzkzZ2zaGyc+P2c95hgkikHPr3z8EdUZOlgEQ5X0DRmwDZn+hekycQnoeiiRVrmilQ==} - '@ungap/structured-clone@1.2.0': {} + /@types/unist@3.0.1: + resolution: {integrity: sha512-ue/hDUpPjC85m+PM9OQDMZr3LywT+CT6mPsQq8OJtCLiERkGRcQUFvu9XASF5XWqyZFXbf15lvb3JFJ4dRLWPg==} - abbrev@2.0.0: {} + /@ungap/structured-clone@1.2.0: + resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} - abitype@1.0.0(typescript@5.4.5)(zod@3.23.8): - optionalDependencies: - typescript: 5.4.5 - zod: 3.23.8 + /abbrev@2.0.0: + resolution: {integrity: sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dev: true - acorn-jsx@5.3.2(acorn@8.11.3): + /abitype@0.9.8(typescript@5.3.2): + resolution: {integrity: sha512-puLifILdm+8sjyss4S+fsUN09obiT1g2YW6CtcQF+QDzxR0euzgEB29MZujC6zMk2a6SVmtttq1fc6+YFA7WYQ==} + peerDependencies: + typescript: '>=5.0.4' + zod: ^3 >=3.19.1 + peerDependenciesMeta: + typescript: + optional: true + zod: + optional: true dependencies: - acorn: 8.11.3 + typescript: 5.3.2 + dev: false - acorn@8.11.3: {} + /acorn-jsx@5.3.2(acorn@8.11.2): + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + acorn: 8.11.2 - aes-js@3.0.0: {} + /acorn@8.11.2: + resolution: {integrity: sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==} + engines: {node: '>=0.4.0'} + hasBin: true - ajv-formats@2.1.1(ajv@8.12.0): - optionalDependencies: + /aes-js@3.0.0: + resolution: {integrity: sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==} + dev: true + + /ajv-formats@2.1.1(ajv@8.12.0): + resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + dependencies: ajv: 8.12.0 + dev: true - ajv@6.12.6: + /ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} dependencies: fast-deep-equal: 3.1.3 fast-json-stable-stringify: 2.1.0 json-schema-traverse: 0.4.1 uri-js: 4.4.1 + dev: true - ajv@8.12.0: + /ajv@8.12.0: + resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} dependencies: fast-deep-equal: 3.1.3 json-schema-traverse: 1.0.0 require-from-string: 2.0.2 uri-js: 4.4.1 + dev: true - algoliasearch@4.23.3: + /algoliasearch@4.23.3: + resolution: {integrity: sha512-Le/3YgNvjW9zxIQMRhUHuhiUjAlKY/zsdZpfq4dlLqg6mEm0nL6yk+7f2hDOtLpxsgE4jSzDmvHL7nXdBp5feg==} dependencies: '@algolia/cache-browser-local-storage': 4.23.3 '@algolia/cache-common': 4.23.3 @@ -4838,121 +1933,222 @@ snapshots: '@algolia/requester-common': 4.23.3 '@algolia/requester-node-http': 4.23.3 '@algolia/transporter': 4.23.3 + dev: false - ansi-regex@5.0.1: {} + /ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} - ansi-regex@6.0.1: {} + /ansi-regex@6.0.1: + resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} + engines: {node: '>=12'} + dev: true - ansi-sequence-parser@1.1.1: {} + /ansi-sequence-parser@1.1.1: + resolution: {integrity: sha512-vJXt3yiaUL4UU546s3rPXlsry/RnM730G1+HkpKE012AN0sx1eOrxSu95oKDIonskeLTijMgqWZ3uDEe3NFvyg==} + dev: false - ansi-styles@3.2.1: + /ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} dependencies: color-convert: 1.9.3 - ansi-styles@4.3.0: + /ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} dependencies: color-convert: 2.0.1 - ansi-styles@5.2.0: {} + /ansi-styles@5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + dev: false - ansi-styles@6.2.1: {} + /ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + dev: true - arch@2.2.0: {} + /arch@2.2.0: + resolution: {integrity: sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==} + dev: false - arg@1.0.0: {} + /arg@1.0.0: + resolution: {integrity: sha512-Wk7TEzl1KqvTGs/uyhmHO/3XLd3t1UeU4IstvPXVzGPM522cTjqjNZ99esCkcL52sjqjo8e8CTBcWhkxvGzoAw==} + dev: false - argparse@1.0.10: + /argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} dependencies: sprintf-js: 1.0.3 - argparse@2.0.1: {} + /argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - aria-query@5.1.3: + /aria-query@5.1.3: + resolution: {integrity: sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==} dependencies: deep-equal: 2.2.3 + dev: false - array-buffer-byte-length@1.0.1: + /array-buffer-byte-length@1.0.0: + resolution: {integrity: sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==} dependencies: - call-bind: 1.0.7 - is-array-buffer: 3.0.4 + call-bind: 1.0.5 + is-array-buffer: 3.0.2 + dev: false + + /array-timsort@1.0.3: + resolution: {integrity: sha512-/+3GRL7dDAGEfM6TseQk/U+mi18TU2Ms9I3UlLdUMhz2hbvGNTKdj9xniwXfUqgYhHxRx0+8UnKkvlNwVU+cWQ==} + dev: true + + /array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + dev: true - array-timsort@1.0.3: {} + /assertion-error@1.1.0: + resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} + dev: true - array-union@2.1.0: {} + /astring@1.8.6: + resolution: {integrity: sha512-ISvCdHdlTDlH5IpxQJIex7BWBywFWgjJSVdwst+/iQCoEYnyOaQ95+X1JGshuBjGp6nxKUy1jMgE3zPqN7fQdg==} + hasBin: true + dev: false - assertion-error@1.1.0: {} + /available-typed-arrays@1.0.5: + resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==} + engines: {node: '>= 0.4'} + dev: false - astring@1.8.6: {} + /bail@2.0.2: + resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} - available-typed-arrays@1.0.7: - dependencies: - possible-typed-array-names: 1.0.0 + /balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + dev: true - bail@2.0.2: {} + /bech32@1.1.4: + resolution: {integrity: sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==} + dev: true - balanced-match@1.0.2: {} + /big-integer@1.6.52: + resolution: {integrity: sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==} + engines: {node: '>=0.6'} + dev: true - bech32@1.1.4: {} + /bignumber.js@9.1.2: + resolution: {integrity: sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==} + dev: true - bignumber.js@9.1.2: {} + /bn.js@4.11.6: + resolution: {integrity: sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA==} + dev: true - bn.js@4.11.6: {} + /bn.js@4.12.0: + resolution: {integrity: sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==} + dev: true - bn.js@4.12.0: {} + /bn.js@5.2.1: + resolution: {integrity: sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==} + dev: true - bn.js@5.2.1: {} + /bplist-parser@0.2.0: + resolution: {integrity: sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==} + engines: {node: '>= 5.10.0'} + dependencies: + big-integer: 1.6.52 + dev: true - brace-expansion@1.1.11: + /brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} dependencies: balanced-match: 1.0.2 concat-map: 0.0.1 + dev: true - brace-expansion@2.0.1: + /brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} dependencies: balanced-match: 1.0.2 + dev: true - braces@3.0.2: + /braces@3.0.2: + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + engines: {node: '>=8'} dependencies: fill-range: 7.0.1 - brorand@1.1.0: {} + /brorand@1.1.0: + resolution: {integrity: sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==} + dev: true + + /buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + dev: true - buffer-from@1.1.2: {} + /buffer-reverse@1.0.1: + resolution: {integrity: sha512-M87YIUBsZ6N924W57vDwT/aOu8hw7ZgdByz6ijksLjmHJELBASmYTTlNHRgjE+pTsT9oJXGaDSgqqwfdHotDUg==} + dev: true - buffer-reverse@1.0.1: {} + /bufio@1.2.1: + resolution: {integrity: sha512-9oR3zNdupcg/Ge2sSHQF3GX+kmvL/fTPvD0nd5AGLq8SjUYnTz+SlFjK/GXidndbZtIj+pVKXiWeR9w6e9wKCA==} + engines: {node: '>=14.0.0'} + dev: true - bufio@1.2.1: {} + /bundle-name@3.0.0: + resolution: {integrity: sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw==} + engines: {node: '>=12'} + dependencies: + run-applescript: 5.0.0 + dev: true - busboy@1.6.0: + /busboy@1.6.0: + resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} + engines: {node: '>=10.16.0'} dependencies: streamsearch: 1.1.0 + dev: false - call-bind@1.0.7: + /call-bind@1.0.5: + resolution: {integrity: sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==} dependencies: - es-define-property: 1.0.0 - es-errors: 1.3.0 function-bind: 1.1.2 - get-intrinsic: 1.2.4 - set-function-length: 1.2.2 + get-intrinsic: 1.2.2 + set-function-length: 1.1.1 + dev: false - callsites@3.1.0: {} + /callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + dev: true - camel-case@4.1.2: + /camel-case@4.1.2: + resolution: {integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==} dependencies: pascal-case: 3.1.2 tslib: 2.6.2 + dev: false - caniuse-lite@1.0.30001614: {} + /caniuse-lite@1.0.30001669: + resolution: {integrity: sha512-DlWzFDJqstqtIVx1zeSpIMLjunf5SmwOw0N2Ck/QSQdS8PLS4+9HrLaYei4w8BIAL7IB/UEDu889d8vhCTPA0w==} + dev: false - capital-case@1.0.4: + /capital-case@1.0.4: + resolution: {integrity: sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==} dependencies: no-case: 3.0.4 tslib: 2.6.2 upper-case-first: 2.0.2 + dev: false - ccount@2.0.1: {} + /ccount@2.0.1: + resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} - chai@4.4.1: + /chai@4.3.10: + resolution: {integrity: sha512-0UXG04VuVbruMUYbJ6JctvH0YnC/4q3/AkT18q4NaITo91CUm0liMS9VqzT9vZhVQ/1eqPanMWjBM+Juhfb/9g==} + engines: {node: '>=4'} dependencies: assertion-error: 1.1.0 check-error: 1.0.3 @@ -4961,31 +2157,46 @@ snapshots: loupe: 2.3.7 pathval: 1.1.1 type-detect: 4.0.8 + dev: true - chalk-template@1.1.0: + /chalk-template@1.1.0: + resolution: {integrity: sha512-T2VJbcDuZQ0Tb2EWwSotMPJjgpy1/tGee1BTpUNsGZ/qgNjV2t7Mvu+d4600U564nbLesN1x2dPL+xii174Ekg==} + engines: {node: '>=14.16'} dependencies: chalk: 5.3.0 + dev: true - chalk@2.3.0: + /chalk@2.3.0: + resolution: {integrity: sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==} + engines: {node: '>=4'} dependencies: ansi-styles: 3.2.1 escape-string-regexp: 1.0.5 supports-color: 4.5.0 + dev: false - chalk@2.4.2: + /chalk@2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} dependencies: ansi-styles: 3.2.1 escape-string-regexp: 1.0.5 supports-color: 5.5.0 - chalk@4.1.2: + /chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} dependencies: ansi-styles: 4.3.0 supports-color: 7.2.0 - chalk@5.3.0: {} + /chalk@5.3.0: + resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + dev: true - change-case@4.1.2: + /change-case@4.1.2: + resolution: {integrity: sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A==} dependencies: camel-case: 4.1.2 capital-case: 1.0.4 @@ -4999,328 +2210,554 @@ snapshots: sentence-case: 3.0.4 snake-case: 3.0.4 tslib: 2.6.2 + dev: false - character-entities-html4@2.1.0: {} + /character-entities-html4@2.1.0: + resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} - character-entities-legacy@1.1.4: {} + /character-entities-legacy@1.1.4: + resolution: {integrity: sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==} + dev: true - character-entities-legacy@3.0.0: {} + /character-entities-legacy@3.0.0: + resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} - character-entities@1.2.4: {} + /character-entities@1.2.4: + resolution: {integrity: sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==} + dev: true - character-entities@2.0.2: {} + /character-entities@2.0.2: + resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} - character-reference-invalid@1.1.4: {} + /character-reference-invalid@1.1.4: + resolution: {integrity: sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==} + dev: true - character-reference-invalid@2.0.1: {} + /character-reference-invalid@2.0.1: + resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} - check-error@1.0.3: + /check-error@1.0.3: + resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} dependencies: get-func-name: 2.0.2 + dev: true - ci-info@4.0.0: {} + /ci-info@3.9.0: + resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} + engines: {node: '>=8'} + dev: true - clear-module@4.1.2: + /clear-module@4.1.2: + resolution: {integrity: sha512-LWAxzHqdHsAZlPlEyJ2Poz6AIs384mPeqLVCru2p0BrP9G/kVGuhNyZYClLO6cXlnuJjzC8xtsJIuMjKqLXoAw==} + engines: {node: '>=8'} dependencies: parent-module: 2.0.0 resolve-from: 5.0.0 + dev: true - client-only@0.0.1: {} + /client-only@0.0.1: + resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} + dev: false - clipboardy@1.2.2: + /clipboardy@1.2.2: + resolution: {integrity: sha512-16KrBOV7bHmHdxcQiCvfUFYVFyEah4FI8vYT1Fr7CGSA4G+xBWMEfUEQJS1hxeHGtI9ju1Bzs9uXSbj5HZKArw==} + engines: {node: '>=4'} dependencies: arch: 2.2.0 execa: 0.8.0 + dev: false - clsx@2.1.1: {} + /clsx@2.1.1: + resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} + engines: {node: '>=6'} + dev: false - color-convert@1.9.3: + /color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} dependencies: color-name: 1.1.3 - color-convert@2.0.1: + /color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} dependencies: color-name: 1.1.4 - color-name@1.1.3: {} + /color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} - color-name@1.1.4: {} + /color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - comma-separated-tokens@2.0.3: {} + /comma-separated-tokens@2.0.3: + resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} + dev: false - commander@12.0.0: {} + /commander@11.1.0: + resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==} + engines: {node: '>=16'} + dev: true - commander@7.2.0: {} + /commander@7.2.0: + resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} + engines: {node: '>= 10'} + dev: false - commander@8.3.0: {} + /commander@8.3.0: + resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} + engines: {node: '>= 12'} + dev: false - comment-json@4.2.3: + /comment-json@4.2.3: + resolution: {integrity: sha512-SsxdiOf064DWoZLH799Ata6u7iV658A11PlWtZATDlXPpKGJnbJZ5Z24ybixAi+LUUqJ/GKowAejtC5GFUG7Tw==} + engines: {node: '>= 6'} dependencies: array-timsort: 1.0.3 core-util-is: 1.0.3 esprima: 4.0.1 has-own-prop: 2.0.0 repeat-string: 1.6.1 + dev: true - compute-scroll-into-view@3.1.0: {} + /compute-scroll-into-view@3.1.0: + resolution: {integrity: sha512-rj8l8pD4bJ1nx+dAkMhV1xB5RuZEyVysfxJqB1pRchh1KVvwOv9b7CGB8ZfjTImVv2oF+sYMUkMZq6Na5Ftmbg==} + dev: false - concat-map@0.0.1: {} + /concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + dev: true - concat-stream@2.0.0: + /concat-stream@2.0.0: + resolution: {integrity: sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==} + engines: {'0': node >= 6.0} dependencies: buffer-from: 1.1.2 inherits: 2.0.4 readable-stream: 3.6.2 typedarray: 0.0.6 + dev: true - configstore@6.0.0: + /configstore@6.0.0: + resolution: {integrity: sha512-cD31W1v3GqUlQvbBCGcXmd2Nj9SvLDOP1oQ0YFuLETufzSPaKp11rYBsSOm7rCsW3OnIRAFM3OxRhceaXNYHkA==} + engines: {node: '>=12'} dependencies: dot-prop: 6.0.1 graceful-fs: 4.2.11 unique-string: 3.0.0 write-file-atomic: 3.0.3 xdg-basedir: 5.1.0 + dev: true - constant-case@3.0.4: + /constant-case@3.0.4: + resolution: {integrity: sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ==} dependencies: no-case: 3.0.4 tslib: 2.6.2 upper-case: 2.0.2 + dev: false - core-util-is@1.0.3: {} + /core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + dev: true - cose-base@1.0.3: + /cose-base@1.0.3: + resolution: {integrity: sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg==} dependencies: layout-base: 1.0.2 + dev: false + + /cose-base@2.2.0: + resolution: {integrity: sha512-AzlgcsCbUMymkADOJtQm3wO9S3ltPfYOFD5033keQn9NJzIbtnZj+UdBJe7DYml/8TdbtHJW3j58SOnKhWY/5g==} + dependencies: + layout-base: 2.0.1 + dev: false - cross-spawn@5.1.0: + /cross-spawn@5.1.0: + resolution: {integrity: sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==} dependencies: lru-cache: 4.1.5 shebang-command: 1.2.0 which: 1.3.1 + dev: false - cross-spawn@7.0.3: + /cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} dependencies: path-key: 3.1.1 shebang-command: 2.0.0 which: 2.0.2 + dev: true - crypto-js@4.2.0: {} + /crypto-js@4.2.0: + resolution: {integrity: sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==} + dev: true - crypto-random-string@4.0.0: + /crypto-random-string@4.0.0: + resolution: {integrity: sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==} + engines: {node: '>=12'} dependencies: type-fest: 1.4.0 + dev: true - cspell-config-lib@8.7.0: + /cspell-config-lib@8.1.3: + resolution: {integrity: sha512-whzJYxcxos3vnywn0alCFZ+Myc0K/C62pUurfOGhgvIba7ArmlXhNRaL2r5noBxWARtpBOtzz3vrzSBK7Lq6jg==} + engines: {node: '>=18'} dependencies: - '@cspell/cspell-types': 8.7.0 + '@cspell/cspell-types': 8.1.3 comment-json: 4.2.3 - yaml: 2.4.2 + yaml: 2.3.4 + dev: true - cspell-dictionary@8.7.0: + /cspell-dictionary@8.1.3: + resolution: {integrity: sha512-nkRQDPNnA6tw+hJFBqq26M0nK306q5rtyv/AUIWa8ZHhQkwzACnpMSpuJA7/DV5GVvPKltMK5M4A6vgfpoaFHw==} + engines: {node: '>=18'} dependencies: - '@cspell/cspell-pipe': 8.7.0 - '@cspell/cspell-types': 8.7.0 - cspell-trie-lib: 8.7.0 + '@cspell/cspell-pipe': 8.1.3 + '@cspell/cspell-types': 8.1.3 + cspell-trie-lib: 8.1.3 fast-equals: 5.0.1 - gensequence: 7.0.0 + gensequence: 6.0.0 + dev: true - cspell-gitignore@8.7.0: + /cspell-gitignore@8.1.3: + resolution: {integrity: sha512-NHx5lg44eCKb6yJmUPOCz4prcuYowzoo5GJ5hOcCfbk7ZEBWV1E2/kDRuQMOK2W0y1hNGr45CSxO3UxWJlYg7w==} + engines: {node: '>=18'} + hasBin: true dependencies: - cspell-glob: 8.7.0 + cspell-glob: 8.1.3 find-up-simple: 1.0.0 + dev: true - cspell-glob@8.7.0: + /cspell-glob@8.1.3: + resolution: {integrity: sha512-Likr7UVUXBpthQnM5r6yao3X0YBNRbJ9AHWXTC2RJfzwZOFKF+pKPfeo3FU+Px8My96M4RC2bVMbrbZUwN5NJw==} + engines: {node: '>=18'} dependencies: micromatch: 4.0.5 + dev: true - cspell-grammar@8.7.0: + /cspell-grammar@8.1.3: + resolution: {integrity: sha512-dTOwNq6a5wcVzOsi4xY5/tq2r2w/+wLVU+WfyySTsPe66Rjqx/QceFl4OinImks/ZMKF7Zyjd3WGyQ5TcSsJFQ==} + engines: {node: '>=18'} + hasBin: true dependencies: - '@cspell/cspell-pipe': 8.7.0 - '@cspell/cspell-types': 8.7.0 + '@cspell/cspell-pipe': 8.1.3 + '@cspell/cspell-types': 8.1.3 + dev: true - cspell-io@8.7.0: + /cspell-io@8.1.3: + resolution: {integrity: sha512-QkcFeYd79oIl7PgSqFSZyvwXnZQhXmdCI733n54IN2+iXDcf7W0mwptxoC/cE19RkEwAwEFLG81UAy6L/BXI6A==} + engines: {node: '>=18'} dependencies: - '@cspell/cspell-service-bus': 8.7.0 + '@cspell/cspell-service-bus': 8.1.3 + dev: true - cspell-lib@8.7.0: + /cspell-lib@8.1.3: + resolution: {integrity: sha512-Kk8bpHVkDZO4MEiPkDvRf/LgJ0h5mufbKLTWModq6k0Ca8EkZ/qgQlZ0ve0rIivbleSqebuWjpJHKDM+IHmzHA==} + engines: {node: '>=18'} dependencies: - '@cspell/cspell-bundled-dicts': 8.7.0 - '@cspell/cspell-pipe': 8.7.0 - '@cspell/cspell-resolver': 8.7.0 - '@cspell/cspell-types': 8.7.0 - '@cspell/dynamic-import': 8.7.0 - '@cspell/strong-weak-map': 8.7.0 + '@cspell/cspell-bundled-dicts': 8.1.3 + '@cspell/cspell-pipe': 8.1.3 + '@cspell/cspell-resolver': 8.1.3 + '@cspell/cspell-types': 8.1.3 + '@cspell/dynamic-import': 8.1.3 + '@cspell/strong-weak-map': 8.1.3 clear-module: 4.1.2 comment-json: 4.2.3 configstore: 6.0.0 - cspell-config-lib: 8.7.0 - cspell-dictionary: 8.7.0 - cspell-glob: 8.7.0 - cspell-grammar: 8.7.0 - cspell-io: 8.7.0 - cspell-trie-lib: 8.7.0 + cspell-config-lib: 8.1.3 + cspell-dictionary: 8.1.3 + cspell-glob: 8.1.3 + cspell-grammar: 8.1.3 + cspell-io: 8.1.3 + cspell-trie-lib: 8.1.3 fast-equals: 5.0.1 - gensequence: 7.0.0 + gensequence: 6.0.0 import-fresh: 3.3.0 resolve-from: 5.0.0 vscode-languageserver-textdocument: 1.0.11 vscode-uri: 3.0.8 + dev: true - cspell-trie-lib@8.7.0: + /cspell-trie-lib@8.1.3: + resolution: {integrity: sha512-EDSYU9MCtzPSJDrfvDrTKmc0rzl50Ehjg1c5rUCqn33p2LCRe/G8hW0FxXe0mxrZxrMO2b8l0PVSGlrCXCQ8RQ==} + engines: {node: '>=18'} dependencies: - '@cspell/cspell-pipe': 8.7.0 - '@cspell/cspell-types': 8.7.0 - gensequence: 7.0.0 + '@cspell/cspell-pipe': 8.1.3 + '@cspell/cspell-types': 8.1.3 + gensequence: 6.0.0 + dev: true - cspell@8.7.0: + /cspell@8.1.3: + resolution: {integrity: sha512-SU4Su6002bPoJYaiMeNV4wwLoS8TwaOgIwaTxhys3GDbJIxZV6CrDgwksezHcG7TZrC4yrveDVsdpnrzmQ7T5Q==} + engines: {node: '>=18'} + hasBin: true dependencies: - '@cspell/cspell-json-reporter': 8.7.0 - '@cspell/cspell-pipe': 8.7.0 - '@cspell/cspell-types': 8.7.0 - '@cspell/dynamic-import': 8.7.0 + '@cspell/cspell-json-reporter': 8.1.3 + '@cspell/cspell-pipe': 8.1.3 + '@cspell/cspell-types': 8.1.3 + '@cspell/dynamic-import': 8.1.3 chalk: 5.3.0 chalk-template: 1.1.0 - commander: 12.0.0 - cspell-gitignore: 8.7.0 - cspell-glob: 8.7.0 - cspell-io: 8.7.0 - cspell-lib: 8.7.0 + commander: 11.1.0 + cspell-gitignore: 8.1.3 + cspell-glob: 8.1.3 + cspell-io: 8.1.3 + cspell-lib: 8.1.3 fast-glob: 3.3.2 fast-json-stable-stringify: 2.1.0 - file-entry-cache: 8.0.0 + file-entry-cache: 7.0.2 get-stdin: 9.0.0 - semver: 7.6.0 + semver: 7.5.4 strip-ansi: 7.1.0 vscode-uri: 3.0.8 + dev: true - csstype@3.1.3: {} + /csstype@3.1.2: + resolution: {integrity: sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==} + dev: false - cytoscape-cose-bilkent@4.1.0(cytoscape@3.29.2): + /cytoscape-cose-bilkent@4.1.0(cytoscape@3.27.0): + resolution: {integrity: sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ==} + peerDependencies: + cytoscape: ^3.2.0 dependencies: cose-base: 1.0.3 - cytoscape: 3.29.2 + cytoscape: 3.27.0 + dev: false + + /cytoscape-fcose@2.2.0(cytoscape@3.27.0): + resolution: {integrity: sha512-ki1/VuRIHFCzxWNrsshHYPs6L7TvLu3DL+TyIGEsRcvVERmxokbf5Gdk7mFxZnTdiGtnA4cfSmjZJMviqSuZrQ==} + peerDependencies: + cytoscape: ^3.2.0 + dependencies: + cose-base: 2.2.0 + cytoscape: 3.27.0 + dev: false - cytoscape@3.29.2: {} + /cytoscape@3.27.0: + resolution: {integrity: sha512-pPZJilfX9BxESwujODz5pydeGi+FBrXq1rcaB1mfhFXXFJ9GjE6CNndAk+8jPzoXGD+16LtSS4xlYEIUiW4Abg==} + engines: {node: '>=0.10'} + dependencies: + heap: 0.2.7 + lodash: 4.17.21 + dev: false - d3-array@2.12.1: + /d3-array@2.12.1: + resolution: {integrity: sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==} dependencies: internmap: 1.0.1 + dev: false - d3-array@3.2.4: + /d3-array@3.2.4: + resolution: {integrity: sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==} + engines: {node: '>=12'} dependencies: internmap: 2.0.3 + dev: false - d3-axis@3.0.0: {} + /d3-axis@3.0.0: + resolution: {integrity: sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==} + engines: {node: '>=12'} + dev: false - d3-brush@3.0.0: + /d3-brush@3.0.0: + resolution: {integrity: sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==} + engines: {node: '>=12'} dependencies: d3-dispatch: 3.0.1 d3-drag: 3.0.0 d3-interpolate: 3.0.1 d3-selection: 3.0.0 d3-transition: 3.0.1(d3-selection@3.0.0) + dev: false - d3-chord@3.0.1: + /d3-chord@3.0.1: + resolution: {integrity: sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==} + engines: {node: '>=12'} dependencies: d3-path: 3.1.0 + dev: false - d3-color@3.1.0: {} + /d3-color@3.1.0: + resolution: {integrity: sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==} + engines: {node: '>=12'} + dev: false - d3-contour@4.0.2: + /d3-contour@4.0.2: + resolution: {integrity: sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==} + engines: {node: '>=12'} dependencies: d3-array: 3.2.4 + dev: false - d3-delaunay@6.0.4: + /d3-delaunay@6.0.4: + resolution: {integrity: sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==} + engines: {node: '>=12'} dependencies: - delaunator: 5.0.1 + delaunator: 5.0.0 + dev: false - d3-dispatch@3.0.1: {} + /d3-dispatch@3.0.1: + resolution: {integrity: sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==} + engines: {node: '>=12'} + dev: false - d3-drag@3.0.0: + /d3-drag@3.0.0: + resolution: {integrity: sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==} + engines: {node: '>=12'} dependencies: d3-dispatch: 3.0.1 d3-selection: 3.0.0 + dev: false - d3-dsv@3.0.1: + /d3-dsv@3.0.1: + resolution: {integrity: sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==} + engines: {node: '>=12'} + hasBin: true dependencies: commander: 7.2.0 iconv-lite: 0.6.3 rw: 1.3.3 + dev: false - d3-ease@3.0.1: {} + /d3-ease@3.0.1: + resolution: {integrity: sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==} + engines: {node: '>=12'} + dev: false - d3-fetch@3.0.1: + /d3-fetch@3.0.1: + resolution: {integrity: sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==} + engines: {node: '>=12'} dependencies: d3-dsv: 3.0.1 + dev: false - d3-force@3.0.0: + /d3-force@3.0.0: + resolution: {integrity: sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==} + engines: {node: '>=12'} dependencies: d3-dispatch: 3.0.1 d3-quadtree: 3.0.1 d3-timer: 3.0.1 + dev: false - d3-format@3.1.0: {} + /d3-format@3.1.0: + resolution: {integrity: sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==} + engines: {node: '>=12'} + dev: false - d3-geo@3.1.1: + /d3-geo@3.1.0: + resolution: {integrity: sha512-JEo5HxXDdDYXCaWdwLRt79y7giK8SbhZJbFWXqbRTolCHFI5jRqteLzCsq51NKbUoX0PjBVSohxrx+NoOUujYA==} + engines: {node: '>=12'} dependencies: d3-array: 3.2.4 + dev: false - d3-hierarchy@3.1.2: {} + /d3-hierarchy@3.1.2: + resolution: {integrity: sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==} + engines: {node: '>=12'} + dev: false - d3-interpolate@3.0.1: + /d3-interpolate@3.0.1: + resolution: {integrity: sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==} + engines: {node: '>=12'} dependencies: d3-color: 3.1.0 + dev: false - d3-path@1.0.9: {} + /d3-path@1.0.9: + resolution: {integrity: sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==} + dev: false - d3-path@3.1.0: {} + /d3-path@3.1.0: + resolution: {integrity: sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==} + engines: {node: '>=12'} + dev: false - d3-polygon@3.0.1: {} + /d3-polygon@3.0.1: + resolution: {integrity: sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==} + engines: {node: '>=12'} + dev: false - d3-quadtree@3.0.1: {} + /d3-quadtree@3.0.1: + resolution: {integrity: sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==} + engines: {node: '>=12'} + dev: false - d3-random@3.0.1: {} + /d3-random@3.0.1: + resolution: {integrity: sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==} + engines: {node: '>=12'} + dev: false - d3-sankey@0.12.3: + /d3-sankey@0.12.3: + resolution: {integrity: sha512-nQhsBRmM19Ax5xEIPLMY9ZmJ/cDvd1BG3UVvt5h3WRxKg5zGRbvnteTyWAbzeSvlh3tW7ZEmq4VwR5mB3tutmQ==} dependencies: d3-array: 2.12.1 d3-shape: 1.3.7 + dev: false - d3-scale-chromatic@3.1.0: + /d3-scale-chromatic@3.0.0: + resolution: {integrity: sha512-Lx9thtxAKrO2Pq6OO2Ua474opeziKr279P/TKZsMAhYyNDD3EnCffdbgeSYN5O7m2ByQsxtuP2CSDczNUIZ22g==} + engines: {node: '>=12'} dependencies: d3-color: 3.1.0 d3-interpolate: 3.0.1 + dev: false - d3-scale@4.0.2: + /d3-scale@4.0.2: + resolution: {integrity: sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==} + engines: {node: '>=12'} dependencies: d3-array: 3.2.4 d3-format: 3.1.0 d3-interpolate: 3.0.1 d3-time: 3.1.0 d3-time-format: 4.1.0 + dev: false - d3-selection@3.0.0: {} + /d3-selection@3.0.0: + resolution: {integrity: sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==} + engines: {node: '>=12'} + dev: false - d3-shape@1.3.7: + /d3-shape@1.3.7: + resolution: {integrity: sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==} dependencies: d3-path: 1.0.9 + dev: false - d3-shape@3.2.0: + /d3-shape@3.2.0: + resolution: {integrity: sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==} + engines: {node: '>=12'} dependencies: d3-path: 3.1.0 + dev: false - d3-time-format@4.1.0: + /d3-time-format@4.1.0: + resolution: {integrity: sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==} + engines: {node: '>=12'} dependencies: d3-time: 3.1.0 + dev: false - d3-time@3.1.0: + /d3-time@3.1.0: + resolution: {integrity: sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==} + engines: {node: '>=12'} dependencies: d3-array: 3.2.4 + dev: false - d3-timer@3.0.1: {} + /d3-timer@3.0.1: + resolution: {integrity: sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==} + engines: {node: '>=12'} + dev: false - d3-transition@3.0.1(d3-selection@3.0.0): + /d3-transition@3.0.1(d3-selection@3.0.0): + resolution: {integrity: sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==} + engines: {node: '>=12'} + peerDependencies: + d3-selection: 2 - 3 dependencies: d3-color: 3.1.0 d3-dispatch: 3.0.1 @@ -5328,16 +2765,22 @@ snapshots: d3-interpolate: 3.0.1 d3-selection: 3.0.0 d3-timer: 3.0.1 + dev: false - d3-zoom@3.0.0: + /d3-zoom@3.0.0: + resolution: {integrity: sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==} + engines: {node: '>=12'} dependencies: d3-dispatch: 3.0.1 d3-drag: 3.0.0 d3-interpolate: 3.0.1 d3-selection: 3.0.0 d3-transition: 3.0.1(d3-selection@3.0.0) + dev: false - d3@7.9.0: + /d3@7.8.5: + resolution: {integrity: sha512-JgoahDG51ncUfJu6wX/1vWQEqOflgXyl4MaHqlcSruTez7yhaRKR9i8VjjcQGeS2en/jnFivXuaIMnseMMt0XA==} + engines: {node: '>=12'} dependencies: d3-array: 3.2.4 d3-axis: 3.0.0 @@ -5353,7 +2796,7 @@ snapshots: d3-fetch: 3.0.1 d3-force: 3.0.0 d3-format: 3.1.0 - d3-geo: 3.1.1 + d3-geo: 3.1.0 d3-hierarchy: 3.1.2 d3-interpolate: 3.0.1 d3-path: 3.1.0 @@ -5361,7 +2804,7 @@ snapshots: d3-quadtree: 3.0.1 d3-random: 3.0.1 d3-scale: 4.0.2 - d3-scale-chromatic: 3.1.0 + d3-scale-chromatic: 3.0.0 d3-selection: 3.0.0 d3-shape: 3.2.0 d3-time: 3.1.0 @@ -5369,99 +2812,176 @@ snapshots: d3-timer: 3.0.1 d3-transition: 3.0.1(d3-selection@3.0.0) d3-zoom: 3.0.0 + dev: false - dagre-d3-es@7.0.10: + /dagre-d3-es@7.0.10: + resolution: {integrity: sha512-qTCQmEhcynucuaZgY5/+ti3X/rnszKZhEQH/ZdWdtP1tA/y3VoHJzcVrO9pjjJCNpigfscAtoUB5ONcd2wNn0A==} dependencies: - d3: 7.9.0 + d3: 7.8.5 lodash-es: 4.17.21 + dev: false - dayjs@1.11.11: {} + /dayjs@1.11.10: + resolution: {integrity: sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==} + dev: false - debug@4.3.4: + /debug@4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true dependencies: ms: 2.1.2 - decode-named-character-reference@1.0.2: + /decode-named-character-reference@1.0.2: + resolution: {integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==} dependencies: character-entities: 2.0.2 - deep-eql@4.1.3: + /deep-eql@4.1.3: + resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} + engines: {node: '>=6'} dependencies: type-detect: 4.0.8 + dev: true - deep-equal@2.2.3: + /deep-equal@2.2.3: + resolution: {integrity: sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==} + engines: {node: '>= 0.4'} dependencies: - array-buffer-byte-length: 1.0.1 - call-bind: 1.0.7 + array-buffer-byte-length: 1.0.0 + call-bind: 1.0.5 es-get-iterator: 1.1.3 - get-intrinsic: 1.2.4 + get-intrinsic: 1.2.2 is-arguments: 1.1.1 - is-array-buffer: 3.0.4 + is-array-buffer: 3.0.2 is-date-object: 1.0.5 is-regex: 1.1.4 - is-shared-array-buffer: 1.0.3 + is-shared-array-buffer: 1.0.2 isarray: 2.0.5 - object-is: 1.1.6 + object-is: 1.1.5 object-keys: 1.1.1 - object.assign: 4.1.5 - regexp.prototype.flags: 1.5.2 - side-channel: 1.0.6 + object.assign: 4.1.4 + regexp.prototype.flags: 1.5.1 + side-channel: 1.0.4 which-boxed-primitive: 1.0.2 - which-collection: 1.0.2 - which-typed-array: 1.1.15 + which-collection: 1.0.1 + which-typed-array: 1.1.13 + dev: false + + /deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + dev: true - deep-is@0.1.4: {} + /default-browser-id@3.0.0: + resolution: {integrity: sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==} + engines: {node: '>=12'} + dependencies: + bplist-parser: 0.2.0 + untildify: 4.0.0 + dev: true + + /default-browser@4.0.0: + resolution: {integrity: sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA==} + engines: {node: '>=14.16'} + dependencies: + bundle-name: 3.0.0 + default-browser-id: 3.0.0 + execa: 7.2.0 + titleize: 3.0.0 + dev: true - define-data-property@1.1.4: + /define-data-property@1.1.1: + resolution: {integrity: sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==} + engines: {node: '>= 0.4'} dependencies: - es-define-property: 1.0.0 - es-errors: 1.3.0 + get-intrinsic: 1.2.2 gopd: 1.0.1 + has-property-descriptors: 1.0.1 + dev: false + + /define-lazy-prop@3.0.0: + resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} + engines: {node: '>=12'} + dev: true - define-properties@1.2.1: + /define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} dependencies: - define-data-property: 1.1.4 - has-property-descriptors: 1.0.2 + define-data-property: 1.1.1 + has-property-descriptors: 1.0.1 object-keys: 1.1.1 + dev: false - delaunator@5.0.1: + /delaunator@5.0.0: + resolution: {integrity: sha512-AyLvtyJdbv/U1GkiS6gUUzclRoAY4Gs75qkMygJJhU75LW4DNuSF2RMzpxs9jw9Oz1BobHjTdkG3zdP55VxAqw==} dependencies: robust-predicates: 3.0.2 + dev: false - dequal@2.0.3: {} + /dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} - devlop@1.1.0: + /devlop@1.1.0: + resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} dependencies: dequal: 2.0.3 - diff@5.2.0: {} + /diff@5.1.0: + resolution: {integrity: sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==} + engines: {node: '>=0.3.1'} - dir-glob@3.0.1: + /dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} dependencies: path-type: 4.0.0 + dev: true - doctrine@3.0.0: + /doctrine@3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} dependencies: esutils: 2.0.3 + dev: true - dom-accessibility-api@0.5.16: {} + /dom-accessibility-api@0.5.16: + resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==} + dev: false - dompurify@3.1.6: {} + /dompurify@3.0.6: + resolution: {integrity: sha512-ilkD8YEnnGh1zJ240uJsW7AzE+2qpbOUYjacomn3AvJ6J4JhKGSZ2nh4wUIXPZrEPppaCLx5jFe8T89Rk8tQ7w==} + dev: false - dot-case@3.0.4: + /dot-case@3.0.4: + resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} dependencies: no-case: 3.0.4 tslib: 2.6.2 + dev: false - dot-prop@6.0.1: + /dot-prop@6.0.1: + resolution: {integrity: sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==} + engines: {node: '>=10'} dependencies: is-obj: 2.0.0 + dev: true - eastasianwidth@0.2.0: {} + /eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + dev: true - elkjs@0.9.3: {} + /elkjs@0.8.2: + resolution: {integrity: sha512-L6uRgvZTH+4OF5NE/MBbzQx/WYpru1xCBE9respNj6qznEewGUIfhzmm7horWWxbNO2M0WckQypGctR8lH79xQ==} + dev: false - elliptic@6.5.4: + /elliptic@6.5.4: + resolution: {integrity: sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==} dependencies: bn.js: 4.12.0 brorand: 1.1.0 @@ -5470,54 +2990,73 @@ snapshots: inherits: 2.0.4 minimalistic-assert: 1.0.1 minimalistic-crypto-utils: 1.0.1 + dev: true - emoji-regex@10.3.0: {} + /emoji-regex@10.3.0: + resolution: {integrity: sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==} + dev: true - emoji-regex@8.0.0: {} + /emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + dev: true - emoji-regex@9.2.2: {} + /emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + dev: true - entities@4.5.0: {} + /entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + dev: false - error-ex@1.3.2: + /error-ex@1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} dependencies: is-arrayish: 0.2.1 + dev: true - es-define-property@1.0.0: - dependencies: - get-intrinsic: 1.2.4 - - es-errors@1.3.0: {} - - es-get-iterator@1.1.3: + /es-get-iterator@1.1.3: + resolution: {integrity: sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==} dependencies: - call-bind: 1.0.7 - get-intrinsic: 1.2.4 + call-bind: 1.0.5 + get-intrinsic: 1.2.2 has-symbols: 1.0.3 is-arguments: 1.1.1 - is-map: 2.0.3 - is-set: 2.0.3 + is-map: 2.0.2 + is-set: 2.0.2 is-string: 1.0.7 isarray: 2.0.5 stop-iteration-iterator: 1.0.0 + dev: false - escape-string-regexp@1.0.5: {} + /escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} - escape-string-regexp@4.0.0: {} + /escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + dev: true - escape-string-regexp@5.0.0: {} + /escape-string-regexp@5.0.0: + resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} + engines: {node: '>=12'} - eslint-mdx@2.3.4(eslint@8.57.0): + /eslint-mdx@2.2.0(eslint@8.54.0): + resolution: {integrity: sha512-AriN6lCW6KhWQ9GEiXapR1DokKHefOUqKvCmHxnE9puCWYhWiycU2SNKH8jmrasDBreZ+RtJDLi+RcUNLJatjg==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + peerDependencies: + eslint: '>=8.0.0' dependencies: - acorn: 8.11.3 - acorn-jsx: 5.3.2(acorn@8.11.3) - eslint: 8.57.0 + acorn: 8.11.2 + acorn-jsx: 5.3.2(acorn@8.11.2) + eslint: 8.54.0 espree: 9.6.1 estree-util-visit: 1.2.1 remark-mdx: 2.3.0 remark-parse: 10.0.2 remark-stringify: 10.0.3 - synckit: 0.9.0 + synckit: 0.8.5 tslib: 2.6.2 unified: 10.1.2 unified-engine: 10.1.0 @@ -5526,19 +3065,29 @@ snapshots: vfile: 5.3.7 transitivePeerDependencies: - supports-color + dev: true - eslint-plugin-markdown@3.0.1(eslint@8.57.0): + /eslint-plugin-markdown@3.0.1(eslint@8.54.0): + resolution: {integrity: sha512-8rqoc148DWdGdmYF6WSQFT3uQ6PO7zXYgeBpHAOAakX/zpq+NvFYbDA/H7PYzHajwtmaOzAwfxyl++x0g1/N9A==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: - eslint: 8.57.0 + eslint: 8.54.0 mdast-util-from-markdown: 0.8.5 transitivePeerDependencies: - supports-color + dev: true - eslint-plugin-mdx@2.3.4(eslint@8.57.0): + /eslint-plugin-mdx@2.2.0(eslint@8.54.0): + resolution: {integrity: sha512-OseoMXUIr8iy3E0me+wJLVAxuB0kxHP1plxuYAJDynzorzOj2OKv8Fhr+rIOJ32zfl3bnEWsqFnUiCnyznr1JQ==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + peerDependencies: + eslint: '>=8.0.0' dependencies: - eslint: 8.57.0 - eslint-mdx: 2.3.4(eslint@8.57.0) - eslint-plugin-markdown: 3.0.1(eslint@8.57.0) + eslint: 8.54.0 + eslint-mdx: 2.2.0(eslint@8.54.0) + eslint-plugin-markdown: 3.0.1(eslint@8.54.0) remark-mdx: 2.3.0 remark-parse: 10.0.2 remark-stringify: 10.0.3 @@ -5547,21 +3096,31 @@ snapshots: vfile: 5.3.7 transitivePeerDependencies: - supports-color + dev: true - eslint-scope@7.2.2: + /eslint-scope@7.2.2: + resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: esrecurse: 4.3.0 estraverse: 5.3.0 + dev: true - eslint-visitor-keys@3.4.3: {} + /eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true - eslint@8.57.0: + /eslint@8.54.0: + resolution: {integrity: sha512-NY0DfAkM8BIZDVl6PgSa1ttZbx3xHgJzSNJKYcQglem6CppHyMhRIQkBVSSMaSRnLhig3jsDbEzOjwCVt4AmmA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + hasBin: true dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@8.54.0) '@eslint-community/regexpp': 4.10.0 - '@eslint/eslintrc': 2.1.4 - '@eslint/js': 8.57.0 - '@humanwhocodes/config-array': 0.11.14 + '@eslint/eslintrc': 2.1.3 + '@eslint/js': 8.54.0 + '@humanwhocodes/config-array': 0.11.13 '@humanwhocodes/module-importer': 1.0.1 '@nodelib/fs.walk': 1.2.8 '@ungap/structured-clone': 1.2.0 @@ -5580,9 +3139,9 @@ snapshots: file-entry-cache: 6.0.1 find-up: 5.0.0 glob-parent: 6.0.2 - globals: 13.24.0 + globals: 13.23.0 graphemer: 1.4.0 - ignore: 5.3.1 + ignore: 5.3.0 imurmurhash: 0.1.4 is-glob: 4.0.3 is-path-inside: 3.0.3 @@ -5592,75 +3151,112 @@ snapshots: lodash.merge: 4.6.2 minimatch: 3.1.2 natural-compare: 1.4.0 - optionator: 0.9.4 + optionator: 0.9.3 strip-ansi: 6.0.1 text-table: 0.2.0 transitivePeerDependencies: - supports-color + dev: true - espree@9.6.1: + /espree@9.6.1: + resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: - acorn: 8.11.3 - acorn-jsx: 5.3.2(acorn@8.11.3) + acorn: 8.11.2 + acorn-jsx: 5.3.2(acorn@8.11.2) eslint-visitor-keys: 3.4.3 + dev: true - esprima@4.0.1: {} + /esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true - esquery@1.5.0: + /esquery@1.5.0: + resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} + engines: {node: '>=0.10'} dependencies: estraverse: 5.3.0 + dev: true - esrecurse@4.3.0: + /esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} dependencies: estraverse: 5.3.0 + dev: true - estraverse@5.3.0: {} + /estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + dev: true - estree-util-attach-comments@2.1.1: + /estree-util-attach-comments@2.1.1: + resolution: {integrity: sha512-+5Ba/xGGS6mnwFbXIuQiDPTbuTxuMCooq3arVv7gPZtYpjp+VXH/NkHAP35OOefPhNG/UGqU3vt/LTABwcHX0w==} dependencies: '@types/estree': 1.0.5 + dev: false - estree-util-build-jsx@2.2.2: + /estree-util-build-jsx@2.2.2: + resolution: {integrity: sha512-m56vOXcOBuaF+Igpb9OPAy7f9w9OIkb5yhjsZuaPm7HoGi4oTOQi0h2+yZ+AtKklYFZ+rPC4n0wYCJCEU1ONqg==} dependencies: - '@types/estree-jsx': 1.0.5 + '@types/estree-jsx': 1.0.3 estree-util-is-identifier-name: 2.1.0 estree-walker: 3.0.3 + dev: false - estree-util-is-identifier-name@2.1.0: {} + /estree-util-is-identifier-name@2.1.0: + resolution: {integrity: sha512-bEN9VHRyXAUOjkKVQVvArFym08BTWB0aJPppZZr0UNyAqWsLaVfAqP7hbaTJjzHifmB5ebnR8Wm7r7yGN/HonQ==} - estree-util-to-js@1.2.0: + /estree-util-to-js@1.2.0: + resolution: {integrity: sha512-IzU74r1PK5IMMGZXUVZbmiu4A1uhiPgW5hm1GjcOfr4ZzHaMPpLNJjR7HjXiIOzi25nZDrgFTobHTkV5Q6ITjA==} dependencies: - '@types/estree-jsx': 1.0.5 + '@types/estree-jsx': 1.0.3 astring: 1.8.6 source-map: 0.7.4 + dev: false - estree-util-value-to-estree@1.3.0: + /estree-util-value-to-estree@1.3.0: + resolution: {integrity: sha512-Y+ughcF9jSUJvncXwqRageavjrNPAI+1M/L3BI3PyLp1nmgYTGUXU6t5z1Y7OWuThoDdhPME07bQU+d5LxdJqw==} + engines: {node: '>=12.0.0'} dependencies: is-plain-obj: 3.0.0 + dev: false - estree-util-visit@1.2.1: + /estree-util-visit@1.2.1: + resolution: {integrity: sha512-xbgqcrkIVbIG+lI/gzbvd9SGTJL4zqJKBFttUl5pP27KhAjtMKbX/mQXJ7qgyXpMgVy/zvpm0xoQQaGL8OloOw==} dependencies: - '@types/estree-jsx': 1.0.5 - '@types/unist': 2.0.10 + '@types/estree-jsx': 1.0.3 + '@types/unist': 2.0.9 - estree-walker@3.0.3: + /estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} dependencies: '@types/estree': 1.0.5 + dev: false - esutils@2.0.3: {} + /esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + dev: true - ethereum-bloom-filters@1.1.0: + /ethereum-bloom-filters@1.0.10: + resolution: {integrity: sha512-rxJ5OFN3RwjQxDcFP2Z5+Q9ho4eIdEmSc2ht0fCu8Se9nbXjZ7/031uXoUYJ87KHCOdVeiUuwSnoS7hmYAGVHA==} dependencies: - '@noble/hashes': 1.4.0 + js-sha3: 0.8.0 + dev: true - ethereum-cryptography@2.1.3: + /ethereum-cryptography@2.1.2: + resolution: {integrity: sha512-Z5Ba0T0ImZ8fqXrJbpHcbpAvIswRte2wGNR/KePnu8GbbvgJ47lMxT/ZZPG6i9Jaht4azPDop4HaM00J0J59ug==} dependencies: - '@noble/curves': 1.3.0 - '@noble/hashes': 1.3.3 - '@scure/bip32': 1.3.3 - '@scure/bip39': 1.2.2 + '@noble/curves': 1.1.0 + '@noble/hashes': 1.3.1 + '@scure/bip32': 1.3.1 + '@scure/bip39': 1.2.1 + dev: true - ethers@5.7.2: + /ethers@5.7.2: + resolution: {integrity: sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==} dependencies: '@ethersproject/abi': 5.7.0 '@ethersproject/abstract-provider': 5.7.0 @@ -5695,13 +3291,19 @@ snapshots: transitivePeerDependencies: - bufferutil - utf-8-validate + dev: true - ethjs-unit@0.1.6: + /ethjs-unit@0.1.6: + resolution: {integrity: sha512-/Sn9Y0oKl0uqQuvgFk/zQgR7aw1g36qX/jzSQ5lSwlO0GigPymk4eGQfeNTD03w1dPOqfz8V77Cy43jH56pagw==} + engines: {node: '>=6.5.0', npm: '>=3'} dependencies: bn.js: 4.11.6 number-to-bn: 1.7.0 + dev: true - execa@0.8.0: + /execa@0.8.0: + resolution: {integrity: sha512-zDWS+Rb1E8BlqqhALSt9kUhss8Qq4nN3iof3gsOdyINksElaPyNBtKUMTR62qhvgVWR0CqCX7sdnKe4MnUbFEA==} + engines: {node: '>=4'} dependencies: cross-spawn: 5.1.0 get-stream: 3.0.0 @@ -5710,18 +3312,59 @@ snapshots: p-finally: 1.0.0 signal-exit: 3.0.7 strip-eof: 1.0.0 + dev: false + + /execa@5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} + dependencies: + cross-spawn: 7.0.3 + get-stream: 6.0.1 + human-signals: 2.1.0 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + dev: true + + /execa@7.2.0: + resolution: {integrity: sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==} + engines: {node: ^14.18.0 || ^16.14.0 || >=18.0.0} + dependencies: + cross-spawn: 7.0.3 + get-stream: 6.0.1 + human-signals: 4.3.1 + is-stream: 3.0.0 + merge-stream: 2.0.0 + npm-run-path: 5.1.0 + onetime: 6.0.0 + signal-exit: 3.0.7 + strip-final-newline: 3.0.0 + dev: true - extend-shallow@2.0.1: + /extend-shallow@2.0.1: + resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} + engines: {node: '>=0.10.0'} dependencies: is-extendable: 0.1.1 - extend@3.0.2: {} + /extend@3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} - fast-deep-equal@3.1.3: {} + /fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + dev: true - fast-equals@5.0.1: {} + /fast-equals@5.0.1: + resolution: {integrity: sha512-WF1Wi8PwwSY7/6Kx0vKXtw8RwuSGoM1bvDaJbu7MxDlR1vovZjIAKrnzyrThgAjm6JDTu0fVgWXDlMGspodfoQ==} + engines: {node: '>=6.0.0'} + dev: true - fast-glob@3.3.2: + /fast-glob@3.3.2: + resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + engines: {node: '>=8.6.0'} dependencies: '@nodelib/fs.stat': 2.0.5 '@nodelib/fs.walk': 1.2.8 @@ -5729,122 +3372,199 @@ snapshots: merge2: 1.4.1 micromatch: 4.0.5 - fast-json-stable-stringify@2.1.0: {} + /fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + dev: true - fast-levenshtein@2.0.6: {} + /fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + dev: true - fastq@1.17.1: + /fastq@1.15.0: + resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} dependencies: reusify: 1.0.4 - fault@2.0.1: + /fault@2.0.1: + resolution: {integrity: sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ==} dependencies: format: 0.2.2 + dev: true - file-entry-cache@6.0.1: + /file-entry-cache@6.0.1: + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} + engines: {node: ^10.12.0 || >=12.0.0} dependencies: flat-cache: 3.2.0 + dev: true - file-entry-cache@8.0.0: + /file-entry-cache@7.0.2: + resolution: {integrity: sha512-TfW7/1iI4Cy7Y8L6iqNdZQVvdXn0f8B4QcIXmkIbtTIe/Okm/nSlHb4IwGzRVOd3WfSieCgvf5cMzEfySAIl0g==} + engines: {node: '>=12.0.0'} dependencies: - flat-cache: 4.0.1 + flat-cache: 3.2.0 + dev: true - fill-range@7.0.1: + /fill-range@7.0.1: + resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + engines: {node: '>=8'} dependencies: to-regex-range: 5.0.1 - find-up-simple@1.0.0: {} + /find-up-simple@1.0.0: + resolution: {integrity: sha512-q7Us7kcjj2VMePAa02hDAF6d+MzsdsAWEwYyOpwUtlerRBkOEPBCRZrAV4XfcSN8fHAgaD0hP7miwoay6DCprw==} + engines: {node: '>=18'} + dev: true - find-up@5.0.0: + /find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} dependencies: locate-path: 6.0.0 path-exists: 4.0.0 + dev: true - find-up@6.3.0: + /find-up@6.3.0: + resolution: {integrity: sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dependencies: locate-path: 7.2.0 path-exists: 5.0.0 + dev: true - flat-cache@3.2.0: + /flat-cache@3.2.0: + resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} + engines: {node: ^10.12.0 || >=12.0.0} dependencies: - flatted: 3.3.1 + flatted: 3.2.9 keyv: 4.5.4 rimraf: 3.0.2 + dev: true - flat-cache@4.0.1: - dependencies: - flatted: 3.3.1 - keyv: 4.5.4 - - flatted@3.3.1: {} + /flatted@3.2.9: + resolution: {integrity: sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==} + dev: true - flexsearch@0.7.43: {} + /flexsearch@0.7.31: + resolution: {integrity: sha512-XGozTsMPYkm+6b5QL3Z9wQcJjNYxp0CYn3U1gO7dwD6PAqU1SVWZxI9CCg3z+ml3YfqdPnrBehaBrnH2AGKbNA==} + dev: false - focus-visible@5.2.0: {} + /focus-visible@5.2.0: + resolution: {integrity: sha512-Rwix9pBtC1Nuy5wysTmKy+UjbDJpIfg8eHjw0rjZ1mX4GNLz1Bmd16uDpI3Gk1i70Fgcs8Csg2lPm8HULFg9DQ==} + dev: false - for-each@0.3.3: + /for-each@0.3.3: + resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} dependencies: is-callable: 1.2.7 + dev: false - foreground-child@3.1.1: + /foreground-child@3.1.1: + resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} + engines: {node: '>=14'} dependencies: cross-spawn: 7.0.3 signal-exit: 4.1.0 + dev: true - format@0.2.2: {} + /format@0.2.2: + resolution: {integrity: sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==} + engines: {node: '>=0.4.x'} + dev: true - fs.realpath@1.0.0: {} + /fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + dev: true - function-bind@1.1.2: {} + /function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + dev: false - functions-have-names@1.2.3: {} + /functions-have-names@1.2.3: + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + dev: false - gensequence@7.0.0: {} + /gensequence@6.0.0: + resolution: {integrity: sha512-8WwuywE9pokJRAcg2QFR/plk3cVPebSUqRPzpGQh3WQ0wIiHAw+HyOQj5IuHyUTQBHpBKFoB2JUMu9zT3vJ16Q==} + engines: {node: '>=16'} + dev: true - get-func-name@2.0.2: {} + /get-func-name@2.0.2: + resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} + dev: true - get-intrinsic@1.2.4: + /get-intrinsic@1.2.2: + resolution: {integrity: sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==} dependencies: - es-errors: 1.3.0 function-bind: 1.1.2 - has-proto: 1.0.3 + has-proto: 1.0.1 has-symbols: 1.0.3 - hasown: 2.0.2 + hasown: 2.0.0 + dev: false - get-stdin@9.0.0: {} + /get-stdin@9.0.0: + resolution: {integrity: sha512-dVKBjfWisLAicarI2Sf+JuBE/DghV4UzNAVe9yhEJuzeREd3JhOTE9cUaJTeSa77fsbQUK3pcOpJfM59+VKZaA==} + engines: {node: '>=12'} + dev: true + + /get-stream@3.0.0: + resolution: {integrity: sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==} + engines: {node: '>=4'} + dev: false - get-stream@3.0.0: {} + /get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + dev: true - git-up@7.0.0: + /git-up@7.0.0: + resolution: {integrity: sha512-ONdIrbBCFusq1Oy0sC71F5azx8bVkvtZtMJAsv+a6lz5YAmbNnLD6HAB4gptHZVLPR8S2/kVN6Gab7lryq5+lQ==} dependencies: is-ssh: 1.4.0 parse-url: 8.1.0 + dev: false - git-url-parse@13.1.1: + /git-url-parse@13.1.1: + resolution: {integrity: sha512-PCFJyeSSdtnbfhSNRw9Wk96dDCNx+sogTe4YNXeXSJxt7xz5hvXekuRn9JX7m+Mf4OscCu8h+mtAl3+h5Fo8lQ==} dependencies: git-up: 7.0.0 + dev: false - github-slugger@1.5.0: {} + /github-slugger@1.5.0: + resolution: {integrity: sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw==} + dev: true - github-slugger@2.0.0: {} + /github-slugger@2.0.0: + resolution: {integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==} + dev: false - glob-parent@5.1.2: + /glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} dependencies: is-glob: 4.0.3 - glob-parent@6.0.2: + /glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} dependencies: is-glob: 4.0.3 + dev: true - glob@10.3.12: + /glob@10.3.10: + resolution: {integrity: sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true dependencies: foreground-child: 3.1.1 jackspeak: 2.3.6 - minimatch: 9.0.4 + minimatch: 9.0.3 minipass: 7.0.4 - path-scurry: 1.10.2 + path-scurry: 1.10.1 + dev: true - glob@7.2.3: + /glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} dependencies: fs.realpath: 1.0.0 inflight: 1.0.6 @@ -5852,521 +3572,892 @@ snapshots: minimatch: 3.1.2 once: 1.4.0 path-is-absolute: 1.0.1 + dev: true - glob@8.1.0: + /glob@8.1.0: + resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} + engines: {node: '>=12'} dependencies: fs.realpath: 1.0.0 inflight: 1.0.6 inherits: 2.0.4 minimatch: 5.1.6 once: 1.4.0 + dev: true - global-directory@4.0.1: + /global-directory@4.0.1: + resolution: {integrity: sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==} + engines: {node: '>=18'} dependencies: ini: 4.1.1 + dev: true - globals@13.24.0: + /globals@13.23.0: + resolution: {integrity: sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==} + engines: {node: '>=8'} dependencies: type-fest: 0.20.2 + dev: true - globby@11.1.0: + /globby@11.0.4: + resolution: {integrity: sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==} + engines: {node: '>=10'} dependencies: array-union: 2.1.0 dir-glob: 3.0.1 fast-glob: 3.3.2 - ignore: 5.3.1 + ignore: 5.3.0 merge2: 1.4.1 slash: 3.0.0 + dev: true - gopd@1.0.1: + /gopd@1.0.1: + resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} dependencies: - get-intrinsic: 1.2.4 + get-intrinsic: 1.2.2 + dev: false - graceful-fs@4.2.11: {} + /graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - graphemer@1.4.0: {} + /graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + dev: true - gray-matter@4.0.3: + /gray-matter@4.0.3: + resolution: {integrity: sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==} + engines: {node: '>=6.0'} dependencies: js-yaml: 3.14.1 kind-of: 6.0.3 section-matter: 1.0.0 strip-bom-string: 1.0.0 - has-bigints@1.0.2: {} + /has-bigints@1.0.2: + resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} + dev: false - has-flag@2.0.0: {} + /has-flag@2.0.0: + resolution: {integrity: sha512-P+1n3MnwjR/Epg9BBo1KT8qbye2g2Ou4sFumihwt6I4tsUX7jnLcX4BTOSKg/B1ZrIYMN9FcEnG4x5a7NB8Eng==} + engines: {node: '>=0.10.0'} + dev: false - has-flag@3.0.0: {} + /has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} - has-flag@4.0.0: {} + /has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} - has-own-prop@2.0.0: {} + /has-own-prop@2.0.0: + resolution: {integrity: sha512-Pq0h+hvsVm6dDEa8x82GnLSYHOzNDt7f0ddFa3FqcQlgzEiptPqL+XrOJNavjOzSYiYWIrgeVYYgGlLmnxwilQ==} + engines: {node: '>=8'} + dev: true - has-property-descriptors@1.0.2: + /has-property-descriptors@1.0.1: + resolution: {integrity: sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==} dependencies: - es-define-property: 1.0.0 + get-intrinsic: 1.2.2 + dev: false - has-proto@1.0.3: {} + /has-proto@1.0.1: + resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} + engines: {node: '>= 0.4'} + dev: false - has-symbols@1.0.3: {} + /has-symbols@1.0.3: + resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + engines: {node: '>= 0.4'} + dev: false - has-tostringtag@1.0.2: + /has-tostringtag@1.0.0: + resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==} + engines: {node: '>= 0.4'} dependencies: has-symbols: 1.0.3 + dev: false - hash-obj@4.0.0: + /hash-obj@4.0.0: + resolution: {integrity: sha512-FwO1BUVWkyHasWDW4S8o0ssQXjvyghLV2rfVhnN36b2bbcj45eGiuzdn9XOvOpjV3TKQD7Gm2BWNXdE9V4KKYg==} + engines: {node: '>=12'} dependencies: is-obj: 3.0.0 sort-keys: 5.0.0 type-fest: 1.4.0 + dev: false - hash.js@1.1.7: + /hash.js@1.1.7: + resolution: {integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==} dependencies: inherits: 2.0.4 minimalistic-assert: 1.0.1 + dev: true - hasown@2.0.2: + /hasown@2.0.0: + resolution: {integrity: sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==} + engines: {node: '>= 0.4'} dependencies: function-bind: 1.1.2 + dev: false - hast-util-from-dom@5.0.0: + /hast-util-from-dom@5.0.0: + resolution: {integrity: sha512-d6235voAp/XR3Hh5uy7aGLbM3S4KamdW0WEgOaU1YoewnuYw4HXb5eRtv9g65m/RFGEfUY1Mw4UqCc5Y8L4Stg==} dependencies: - '@types/hast': 3.0.4 + '@types/hast': 3.0.2 hastscript: 8.0.0 web-namespaces: 2.0.1 + dev: false - hast-util-from-html-isomorphic@2.0.0: + /hast-util-from-html-isomorphic@2.0.0: + resolution: {integrity: sha512-zJfpXq44yff2hmE0XmwEOzdWin5xwH+QIhMLOScpX91e/NSGPsAzNCvLQDIEPyO2TXi+lBmU6hjLIhV8MwP2kw==} dependencies: - '@types/hast': 3.0.4 + '@types/hast': 3.0.2 hast-util-from-dom: 5.0.0 hast-util-from-html: 2.0.1 unist-util-remove-position: 5.0.0 + dev: false - hast-util-from-html@2.0.1: + /hast-util-from-html@2.0.1: + resolution: {integrity: sha512-RXQBLMl9kjKVNkJTIO6bZyb2n+cUH8LFaSSzo82jiLT6Tfc+Pt7VQCS+/h3YwG4jaNE2TA2sdJisGWR+aJrp0g==} dependencies: - '@types/hast': 3.0.4 + '@types/hast': 3.0.2 devlop: 1.1.0 hast-util-from-parse5: 8.0.1 parse5: 7.1.2 vfile: 6.0.1 vfile-message: 4.0.2 + dev: false - hast-util-from-parse5@8.0.1: + /hast-util-from-parse5@8.0.1: + resolution: {integrity: sha512-Er/Iixbc7IEa7r/XLtuG52zoqn/b3Xng/w6aZQ0xGVxzhw5xUFxcRqdPzP6yFi/4HBYRaifaI5fQ1RH8n0ZeOQ==} dependencies: - '@types/hast': 3.0.4 - '@types/unist': 3.0.2 + '@types/hast': 3.0.2 + '@types/unist': 3.0.1 devlop: 1.1.0 hastscript: 8.0.0 - property-information: 6.5.0 + property-information: 6.4.0 vfile: 6.0.1 vfile-location: 5.0.2 web-namespaces: 2.0.1 + dev: false - hast-util-is-element@3.0.0: + /hast-util-is-element@3.0.0: + resolution: {integrity: sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==} dependencies: - '@types/hast': 3.0.4 + '@types/hast': 3.0.2 + dev: false - hast-util-parse-selector@4.0.0: + /hast-util-parse-selector@4.0.0: + resolution: {integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==} dependencies: - '@types/hast': 3.0.4 + '@types/hast': 3.0.2 + dev: false - hast-util-raw@9.0.2: + /hast-util-raw@9.0.1: + resolution: {integrity: sha512-5m1gmba658Q+lO5uqL5YNGQWeh1MYWZbZmWrM5lncdcuiXuo5E2HT/CIOp0rLF8ksfSwiCVJ3twlgVRyTGThGA==} dependencies: - '@types/hast': 3.0.4 - '@types/unist': 3.0.2 + '@types/hast': 3.0.2 + '@types/unist': 3.0.1 '@ungap/structured-clone': 1.2.0 hast-util-from-parse5: 8.0.1 hast-util-to-parse5: 8.0.0 html-void-elements: 3.0.0 - mdast-util-to-hast: 13.1.0 + mdast-util-to-hast: 13.0.2 parse5: 7.1.2 unist-util-position: 5.0.0 unist-util-visit: 5.0.0 vfile: 6.0.1 web-namespaces: 2.0.1 zwitch: 2.0.4 + dev: false - hast-util-to-estree@2.3.3: + /hast-util-to-estree@2.3.3: + resolution: {integrity: sha512-ihhPIUPxN0v0w6M5+IiAZZrn0LH2uZomeWwhn7uP7avZC6TE7lIiEh2yBMPr5+zi1aUCXq6VoYRgs2Bw9xmycQ==} dependencies: '@types/estree': 1.0.5 - '@types/estree-jsx': 1.0.5 - '@types/hast': 2.3.10 - '@types/unist': 2.0.10 + '@types/estree-jsx': 1.0.3 + '@types/hast': 2.3.7 + '@types/unist': 2.0.9 comma-separated-tokens: 2.0.3 estree-util-attach-comments: 2.1.1 estree-util-is-identifier-name: 2.1.0 hast-util-whitespace: 2.0.1 mdast-util-mdx-expression: 1.3.2 mdast-util-mdxjs-esm: 1.3.1 - property-information: 6.5.0 + property-information: 6.4.0 space-separated-tokens: 2.0.2 style-to-object: 0.4.4 unist-util-position: 4.0.4 zwitch: 2.0.4 transitivePeerDependencies: - supports-color + dev: false - hast-util-to-parse5@8.0.0: + /hast-util-to-parse5@8.0.0: + resolution: {integrity: sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==} dependencies: - '@types/hast': 3.0.4 + '@types/hast': 3.0.2 comma-separated-tokens: 2.0.3 devlop: 1.1.0 - property-information: 6.5.0 + property-information: 6.4.0 space-separated-tokens: 2.0.2 web-namespaces: 2.0.1 zwitch: 2.0.4 + dev: false - hast-util-to-text@4.0.2: + /hast-util-to-text@4.0.0: + resolution: {integrity: sha512-EWiE1FSArNBPUo1cKWtzqgnuRQwEeQbQtnFJRYV1hb1BWDgrAlBU0ExptvZMM/KSA82cDpm2sFGf3Dmc5Mza3w==} dependencies: - '@types/hast': 3.0.4 - '@types/unist': 3.0.2 + '@types/hast': 3.0.2 + '@types/unist': 3.0.1 hast-util-is-element: 3.0.0 unist-util-find-after: 5.0.0 + dev: false - hast-util-whitespace@2.0.1: {} + /hast-util-whitespace@2.0.1: + resolution: {integrity: sha512-nAxA0v8+vXSBDt3AnRUNjyRIQ0rD+ntpbAp4LnPkumc5M9yUbSMa4XDU9Q6etY4f1Wp4bNgvc1yjiZtsTTrSng==} + dev: false - hastscript@8.0.0: + /hastscript@8.0.0: + resolution: {integrity: sha512-dMOtzCEd3ABUeSIISmrETiKuyydk1w0pa+gE/uormcTpSYuaNJPbX1NU3JLyscSLjwAQM8bWMhhIlnCqnRvDTw==} dependencies: - '@types/hast': 3.0.4 + '@types/hast': 3.0.2 comma-separated-tokens: 2.0.3 hast-util-parse-selector: 4.0.0 - property-information: 6.5.0 + property-information: 6.4.0 space-separated-tokens: 2.0.2 + dev: false - header-case@2.0.4: + /header-case@2.0.4: + resolution: {integrity: sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q==} dependencies: capital-case: 1.0.4 tslib: 2.6.2 + dev: false + + /heap@0.2.7: + resolution: {integrity: sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==} + dev: false - hmac-drbg@1.0.1: + /hmac-drbg@1.0.1: + resolution: {integrity: sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==} dependencies: hash.js: 1.1.7 minimalistic-assert: 1.0.1 minimalistic-crypto-utils: 1.0.1 + dev: true + + /html-void-elements@3.0.0: + resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} + dev: false + + /human-signals@2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} + dev: true - html-void-elements@3.0.0: {} + /human-signals@4.3.1: + resolution: {integrity: sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==} + engines: {node: '>=14.18.0'} + dev: true - iconv-lite@0.6.3: + /iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} dependencies: safer-buffer: 2.1.2 + dev: false - ignore@5.3.1: {} + /ignore@5.3.0: + resolution: {integrity: sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==} + engines: {node: '>= 4'} + dev: true - import-fresh@3.3.0: + /import-fresh@3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} dependencies: parent-module: 1.0.1 resolve-from: 4.0.0 + dev: true - import-meta-resolve@2.2.2: {} + /import-meta-resolve@2.2.2: + resolution: {integrity: sha512-f8KcQ1D80V7RnqVm+/lirO9zkOxjGxhaTC1IPrBGd3MEfNgmNG67tSUO9gTi2F3Blr2Az6g1vocaxzkVnWl9MA==} + dev: true - import-meta-resolve@4.1.0: {} + /import-meta-resolve@4.0.0: + resolution: {integrity: sha512-okYUR7ZQPH+efeuMJGlq4f8ubUgO50kByRPyt/Cy1Io4PSRsPjxME+YlVaCOx+NIToW7hCsZNFJyTPFFKepRSA==} + dev: true - imurmurhash@0.1.4: {} + /imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + dev: true - inflight@1.0.6: + /inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} dependencies: once: 1.4.0 wrappy: 1.0.2 + dev: true - inherits@2.0.4: {} - - ini@4.1.1: {} + /inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + dev: true - ini@4.1.2: {} + /ini@4.1.1: + resolution: {integrity: sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dev: true - inline-style-parser@0.1.1: {} + /inline-style-parser@0.1.1: + resolution: {integrity: sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==} + dev: false - internal-slot@1.0.7: + /internal-slot@1.0.6: + resolution: {integrity: sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==} + engines: {node: '>= 0.4'} dependencies: - es-errors: 1.3.0 - hasown: 2.0.2 - side-channel: 1.0.6 + get-intrinsic: 1.2.2 + hasown: 2.0.0 + side-channel: 1.0.4 + dev: false - internmap@1.0.1: {} + /internmap@1.0.1: + resolution: {integrity: sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==} + dev: false - internmap@2.0.3: {} + /internmap@2.0.3: + resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==} + engines: {node: '>=12'} + dev: false - intersection-observer@0.12.2: {} + /intersection-observer@0.12.2: + resolution: {integrity: sha512-7m1vEcPCxXYI8HqnL8CKI6siDyD+eIWSwgB3DZA+ZTogxk9I4CDnj4wilt9x/+/QbHI4YG5YZNmC6458/e9Ktg==} + dev: false - is-alphabetical@1.0.4: {} + /is-alphabetical@1.0.4: + resolution: {integrity: sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==} + dev: true - is-alphabetical@2.0.1: {} + /is-alphabetical@2.0.1: + resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==} - is-alphanumerical@1.0.4: + /is-alphanumerical@1.0.4: + resolution: {integrity: sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==} dependencies: is-alphabetical: 1.0.4 is-decimal: 1.0.4 + dev: true - is-alphanumerical@2.0.1: + /is-alphanumerical@2.0.1: + resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==} dependencies: is-alphabetical: 2.0.1 is-decimal: 2.0.1 - is-arguments@1.1.1: + /is-arguments@1.1.1: + resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} + engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.7 - has-tostringtag: 1.0.2 + call-bind: 1.0.5 + has-tostringtag: 1.0.0 + dev: false - is-array-buffer@3.0.4: + /is-array-buffer@3.0.2: + resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==} dependencies: - call-bind: 1.0.7 - get-intrinsic: 1.2.4 + call-bind: 1.0.5 + get-intrinsic: 1.2.2 + is-typed-array: 1.1.12 + dev: false - is-arrayish@0.2.1: {} + /is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + dev: true - is-bigint@1.0.4: + /is-bigint@1.0.4: + resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} dependencies: has-bigints: 1.0.2 + dev: false - is-boolean-object@1.1.2: + /is-boolean-object@1.1.2: + resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} + engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.7 - has-tostringtag: 1.0.2 + call-bind: 1.0.5 + has-tostringtag: 1.0.0 + dev: false - is-buffer@2.0.5: {} + /is-buffer@2.0.5: + resolution: {integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==} + engines: {node: '>=4'} - is-callable@1.2.7: {} + /is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + dev: false - is-date-object@1.0.5: + /is-date-object@1.0.5: + resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} + engines: {node: '>= 0.4'} dependencies: - has-tostringtag: 1.0.2 + has-tostringtag: 1.0.0 + dev: false + + /is-decimal@1.0.4: + resolution: {integrity: sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==} + dev: true + + /is-decimal@2.0.1: + resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} - is-decimal@1.0.4: {} + /is-docker@2.2.1: + resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} + engines: {node: '>=8'} + hasBin: true + dev: true - is-decimal@2.0.1: {} + /is-docker@3.0.0: + resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + hasBin: true + dev: true - is-empty@1.2.0: {} + /is-empty@1.2.0: + resolution: {integrity: sha512-F2FnH/otLNJv0J6wc73A5Xo7oHLNnqplYqZhUu01tD54DIPvxIRSTSLkrUB/M0nHO4vo1O9PDfN4KoTxCzLh/w==} + dev: true - is-extendable@0.1.1: {} + /is-extendable@0.1.1: + resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} + engines: {node: '>=0.10.0'} - is-extglob@2.1.1: {} + /is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} - is-fullwidth-code-point@3.0.0: {} + /is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + dev: true - is-glob@4.0.3: + /is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} dependencies: is-extglob: 2.1.1 - is-hex-prefixed@1.0.0: {} + /is-hex-prefixed@1.0.0: + resolution: {integrity: sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA==} + engines: {node: '>=6.5.0', npm: '>=3'} + dev: true + + /is-hexadecimal@1.0.4: + resolution: {integrity: sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==} + dev: true - is-hexadecimal@1.0.4: {} + /is-hexadecimal@2.0.1: + resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} - is-hexadecimal@2.0.1: {} + /is-inside-container@1.0.0: + resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} + engines: {node: '>=14.16'} + hasBin: true + dependencies: + is-docker: 3.0.0 + dev: true - is-map@2.0.3: {} + /is-map@2.0.2: + resolution: {integrity: sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==} + dev: false - is-number-object@1.0.7: + /is-number-object@1.0.7: + resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} + engines: {node: '>= 0.4'} dependencies: - has-tostringtag: 1.0.2 + has-tostringtag: 1.0.0 + dev: false - is-number@7.0.0: {} + /is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} - is-obj@2.0.0: {} + /is-obj@2.0.0: + resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} + engines: {node: '>=8'} + dev: true - is-obj@3.0.0: {} + /is-obj@3.0.0: + resolution: {integrity: sha512-IlsXEHOjtKhpN8r/tRFj2nDyTmHvcfNeu/nrRIcXE17ROeatXchkojffa1SpdqW4cr/Fj6QkEf/Gn4zf6KKvEQ==} + engines: {node: '>=12'} + dev: false - is-path-inside@3.0.3: {} + /is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + dev: true - is-plain-obj@3.0.0: {} + /is-plain-obj@3.0.0: + resolution: {integrity: sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==} + engines: {node: '>=10'} + dev: false - is-plain-obj@4.1.0: {} + /is-plain-obj@4.1.0: + resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} + engines: {node: '>=12'} - is-reference@3.0.2: + /is-reference@3.0.2: + resolution: {integrity: sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==} dependencies: '@types/estree': 1.0.5 + dev: false - is-regex@1.1.4: + /is-regex@1.1.4: + resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} + engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.7 - has-tostringtag: 1.0.2 + call-bind: 1.0.5 + has-tostringtag: 1.0.0 + dev: false - is-set@2.0.3: {} + /is-set@2.0.2: + resolution: {integrity: sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==} + dev: false - is-shared-array-buffer@1.0.3: + /is-shared-array-buffer@1.0.2: + resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==} dependencies: - call-bind: 1.0.7 + call-bind: 1.0.5 + dev: false - is-ssh@1.4.0: + /is-ssh@1.4.0: + resolution: {integrity: sha512-x7+VxdxOdlV3CYpjvRLBv5Lo9OJerlYanjwFrPR9fuGPjCiNiCzFgAWpiLAohSbsnH4ZAys3SBh+hq5rJosxUQ==} dependencies: protocols: 2.0.1 + dev: false + + /is-stream@1.1.0: + resolution: {integrity: sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==} + engines: {node: '>=0.10.0'} + dev: false + + /is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + dev: true - is-stream@1.1.0: {} + /is-stream@3.0.0: + resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: true - is-string@1.0.7: + /is-string@1.0.7: + resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} + engines: {node: '>= 0.4'} dependencies: - has-tostringtag: 1.0.2 + has-tostringtag: 1.0.0 + dev: false - is-symbol@1.0.4: + /is-symbol@1.0.4: + resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} + engines: {node: '>= 0.4'} dependencies: has-symbols: 1.0.3 + dev: false + + /is-typed-array@1.1.12: + resolution: {integrity: sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==} + engines: {node: '>= 0.4'} + dependencies: + which-typed-array: 1.1.13 + dev: false + + /is-typedarray@1.0.0: + resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} + dev: true - is-typedarray@1.0.0: {} + /is-weakmap@2.0.1: + resolution: {integrity: sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==} + dev: false - is-weakmap@2.0.2: {} + /is-weakset@2.0.2: + resolution: {integrity: sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==} + dependencies: + call-bind: 1.0.5 + get-intrinsic: 1.2.2 + dev: false - is-weakset@2.0.3: + /is-wsl@2.2.0: + resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} + engines: {node: '>=8'} dependencies: - call-bind: 1.0.7 - get-intrinsic: 1.2.4 + is-docker: 2.2.1 + dev: true - isarray@2.0.5: {} + /isarray@2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + dev: false - isexe@2.0.0: {} + /isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - isows@1.0.3(ws@8.13.0): + /isows@1.0.3(ws@8.13.0): + resolution: {integrity: sha512-2cKei4vlmg2cxEjm3wVSqn8pcoRF/LX/wpifuuNquFO4SQmPwarClT+SUCA2lt+l581tTeZIPIZuIDo2jWN1fg==} + peerDependencies: + ws: '*' dependencies: ws: 8.13.0 + dev: false - jackspeak@2.3.6: + /jackspeak@2.3.6: + resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} + engines: {node: '>=14'} dependencies: '@isaacs/cliui': 8.0.2 optionalDependencies: '@pkgjs/parseargs': 0.11.0 + dev: true - js-sha3@0.8.0: {} + /js-sha3@0.8.0: + resolution: {integrity: sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==} + dev: true - js-tokens@4.0.0: {} + /js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - js-yaml@3.14.1: + /js-yaml@3.14.1: + resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} + hasBin: true dependencies: argparse: 1.0.10 esprima: 4.0.1 - js-yaml@4.1.0: + /js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true dependencies: argparse: 2.0.1 - json-buffer@3.0.1: {} + /json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + dev: true - json-parse-even-better-errors@2.3.1: {} + /json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + dev: true - json-parse-even-better-errors@3.0.1: {} + /json-parse-even-better-errors@3.0.0: + resolution: {integrity: sha512-iZbGHafX/59r39gPwVPRBGw0QQKnA7tte5pSMrhWOW7swGsVvVTjmfyAV9pNqk8YGT7tRCdxRu8uzcgZwoDooA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dev: true - json-schema-traverse@0.4.1: {} + /json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + dev: true - json-schema-traverse@1.0.0: {} + /json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + dev: true - json-stable-stringify-without-jsonify@1.0.1: {} + /json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + dev: true - jsonc-parser@3.2.1: {} + /jsonc-parser@3.2.0: + resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} + dev: false - katex@0.16.10: + /katex@0.16.9: + resolution: {integrity: sha512-fsSYjWS0EEOwvy81j3vRA8TEAhQhKiqO+FQaKWp0m39qwOzHVBgAUBIXWj1pB+O2W3fIpNa6Y9KSKCVbfPhyAQ==} + hasBin: true dependencies: commander: 8.3.0 + dev: false - keyv@4.5.4: + /keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} dependencies: json-buffer: 3.0.1 + dev: true + + /khroma@2.1.0: + resolution: {integrity: sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw==} + dev: false - khroma@2.1.0: {} + /kind-of@6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} - kind-of@6.0.3: {} + /kleur@4.1.5: + resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} + engines: {node: '>=6'} - kleur@4.1.5: {} + /layout-base@1.0.2: + resolution: {integrity: sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==} + dev: false - layout-base@1.0.2: {} + /layout-base@2.0.1: + resolution: {integrity: sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg==} + dev: false - levn@0.4.1: + /levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} dependencies: prelude-ls: 1.2.1 type-check: 0.4.0 + dev: true - lines-and-columns@2.0.4: {} + /lines-and-columns@2.0.4: + resolution: {integrity: sha512-wM1+Z03eypVAVUCE7QdSqpVIvelbOakn1M0bPDoA4SGWPx3sNDVUiMo3L6To6WWGClB7VyXnhQ4Sn7gxiJbE6A==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: true - load-plugin@5.1.0: + /load-plugin@5.1.0: + resolution: {integrity: sha512-Lg1CZa1CFj2CbNaxijTL6PCbzd4qGTlZov+iH2p5Xwy/ApcZJh+i6jMN2cYePouTfjJfrNu3nXFdEw8LvbjPFQ==} dependencies: - '@npmcli/config': 6.4.1 + '@npmcli/config': 6.4.0 import-meta-resolve: 2.2.2 + dev: true - locate-path@6.0.0: + /locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} dependencies: p-locate: 5.0.0 + dev: true - locate-path@7.2.0: + /locate-path@7.2.0: + resolution: {integrity: sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dependencies: p-locate: 6.0.0 + dev: true - lodash-es@4.17.21: {} + /lodash-es@4.17.21: + resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} + dev: false - lodash.clonedeep@4.5.0: {} + /lodash.clonedeep@4.5.0: + resolution: {integrity: sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==} + dev: true - lodash.get@4.4.2: {} + /lodash.get@4.4.2: + resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} + dev: false - lodash.merge@4.6.2: {} + /lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + dev: true - lodash@4.17.21: {} + /lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - longest-streak@3.1.0: {} + /longest-streak@3.1.0: + resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} - loose-envify@1.4.0: + /loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true dependencies: js-tokens: 4.0.0 + dev: false - loupe@2.3.7: + /loupe@2.3.7: + resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} dependencies: get-func-name: 2.0.2 + dev: true - lower-case@2.0.2: + /lower-case@2.0.2: + resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} dependencies: tslib: 2.6.2 + dev: false - lru-cache@10.2.2: {} + /lru-cache@10.0.3: + resolution: {integrity: sha512-B7gr+F6MkqB3uzINHXNctGieGsRTMwIBgxkp0yq/5BwcuDzD4A8wQpHQW6vDAm1uKSLQghmRdD9sKqf2vJ1cEg==} + engines: {node: 14 || >=16.14} + dev: true - lru-cache@4.1.5: + /lru-cache@4.1.5: + resolution: {integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==} dependencies: pseudomap: 1.0.2 yallist: 2.1.2 + dev: false - lru-cache@6.0.0: + /lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} dependencies: yallist: 4.0.0 + dev: true - lz-string@1.5.0: {} + /lz-string@1.5.0: + resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} + hasBin: true + dev: false - markdown-extensions@1.1.1: {} + /markdown-extensions@1.1.1: + resolution: {integrity: sha512-WWC0ZuMzCyDHYCasEGs4IPvLyTGftYwh6wIEOULOF0HXcqZlhwRzrK0w2VUlxWA98xnvb/jszw4ZSkJ6ADpM6Q==} + engines: {node: '>=0.10.0'} + dev: false - markdown-table@3.0.3: {} + /markdown-table@3.0.3: + resolution: {integrity: sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==} - match-sorter@6.3.4: + /match-sorter@6.3.1: + resolution: {integrity: sha512-mxybbo3pPNuA+ZuCUhm5bwNkXrJTbsk5VWbR5wiwz/GC6LIiegBGn2w3O08UG/jdbYLinw51fSQ5xNU1U3MgBw==} dependencies: - '@babel/runtime': 7.24.4 - remove-accents: 0.5.0 + '@babel/runtime': 7.23.2 + remove-accents: 0.4.2 + dev: false - mdast-comment-marker@2.1.2: + /mdast-comment-marker@2.1.2: + resolution: {integrity: sha512-HED3ezseRVkBzZ0uK4q6RJMdufr/2p3VfVZstE3H1N9K8bwtspztWo6Xd7rEatuGNoCXaBna8oEqMwUn0Ve1bw==} dependencies: - '@types/mdast': 3.0.15 + '@types/mdast': 3.0.14 mdast-util-mdx-expression: 1.3.2 transitivePeerDependencies: - supports-color + dev: true - mdast-util-definitions@5.1.2: + /mdast-util-definitions@5.1.2: + resolution: {integrity: sha512-8SVPMuHqlPME/z3gqVwWY4zVXn8lqKv/pAhC57FuJ40ImXyBpmO5ukh98zB2v7Blql2FiHjHv9LVztSIqjY+MA==} dependencies: - '@types/mdast': 3.0.15 - '@types/unist': 2.0.10 + '@types/mdast': 3.0.14 + '@types/unist': 2.0.9 unist-util-visit: 4.1.2 + dev: false - mdast-util-find-and-replace@2.2.2: + /mdast-util-find-and-replace@2.2.2: + resolution: {integrity: sha512-MTtdFRz/eMDHXzeK6W3dO7mXUlF82Gom4y0oOgvHhh/HXZAGvIQDUvQ0SuUx+j2tv44b8xTHOm8K/9OoRFnXKw==} dependencies: - '@types/mdast': 3.0.15 + '@types/mdast': 3.0.14 escape-string-regexp: 5.0.0 unist-util-is: 5.2.1 unist-util-visit-parents: 5.1.3 - mdast-util-from-markdown@0.8.5: + /mdast-util-from-markdown@0.8.5: + resolution: {integrity: sha512-2hkTXtYYnr+NubD/g6KGBS/0mFmBcifAsI0yIWRiRo0PjVs6SSOSOdtzbp6kSGnShDN6G5aWZpKQ2lWRy27mWQ==} dependencies: - '@types/mdast': 3.0.15 + '@types/mdast': 3.0.14 mdast-util-to-string: 2.0.0 micromark: 2.11.4 parse-entities: 2.0.0 unist-util-stringify-position: 2.0.3 transitivePeerDependencies: - supports-color + dev: true - mdast-util-from-markdown@1.3.1: + /mdast-util-from-markdown@1.3.1: + resolution: {integrity: sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww==} dependencies: - '@types/mdast': 3.0.15 - '@types/unist': 2.0.10 + '@types/mdast': 3.0.14 + '@types/unist': 2.0.9 decode-named-character-reference: 1.0.2 mdast-util-to-string: 3.2.0 micromark: 3.2.0 @@ -6380,10 +4471,11 @@ snapshots: transitivePeerDependencies: - supports-color - mdast-util-from-markdown@2.0.0: + /mdast-util-from-markdown@2.0.0: + resolution: {integrity: sha512-n7MTOr/z+8NAX/wmhhDji8O3bRvPTV/U0oTCaZJkjhPSKTPhS3xufVhKGF8s1pJ7Ox4QgoIU7KHseh09S+9rTA==} dependencies: - '@types/mdast': 4.0.3 - '@types/unist': 3.0.2 + '@types/mdast': 4.0.2 + '@types/unist': 3.0.1 decode-named-character-reference: 1.0.2 devlop: 1.1.0 mdast-util-to-string: 4.0.0 @@ -6396,10 +4488,12 @@ snapshots: unist-util-stringify-position: 4.0.0 transitivePeerDependencies: - supports-color + dev: true - mdast-util-frontmatter@2.0.1: + /mdast-util-frontmatter@2.0.1: + resolution: {integrity: sha512-LRqI9+wdgC25P0URIJY9vwocIzCcksduHQ9OF2joxQoyTNVduwLAFUzjoopuRJbJAReaKrNQKAZKL3uCMugWJA==} dependencies: - '@types/mdast': 4.0.3 + '@types/mdast': 4.0.2 devlop: 1.1.0 escape-string-regexp: 5.0.0 mdast-util-from-markdown: 2.0.0 @@ -6407,40 +4501,47 @@ snapshots: micromark-extension-frontmatter: 2.0.0 transitivePeerDependencies: - supports-color + dev: true - mdast-util-gfm-autolink-literal@1.0.3: + /mdast-util-gfm-autolink-literal@1.0.3: + resolution: {integrity: sha512-My8KJ57FYEy2W2LyNom4n3E7hKTuQk/0SES0u16tjA9Z3oFkF4RrC/hPAPgjlSpezsOvI8ObcXcElo92wn5IGA==} dependencies: - '@types/mdast': 3.0.15 + '@types/mdast': 3.0.14 ccount: 2.0.1 mdast-util-find-and-replace: 2.2.2 micromark-util-character: 1.2.0 - mdast-util-gfm-footnote@1.0.2: + /mdast-util-gfm-footnote@1.0.2: + resolution: {integrity: sha512-56D19KOGbE00uKVj3sgIykpwKL179QsVFwx/DCW0u/0+URsryacI4MAdNJl0dh+u2PSsD9FtxPFbHCzJ78qJFQ==} dependencies: - '@types/mdast': 3.0.15 + '@types/mdast': 3.0.14 mdast-util-to-markdown: 1.5.0 micromark-util-normalize-identifier: 1.1.0 - mdast-util-gfm-strikethrough@1.0.3: + /mdast-util-gfm-strikethrough@1.0.3: + resolution: {integrity: sha512-DAPhYzTYrRcXdMjUtUjKvW9z/FNAMTdU0ORyMcbmkwYNbKocDpdk+PX1L1dQgOID/+vVs1uBQ7ElrBQfZ0cuiQ==} dependencies: - '@types/mdast': 3.0.15 + '@types/mdast': 3.0.14 mdast-util-to-markdown: 1.5.0 - mdast-util-gfm-table@1.0.7: + /mdast-util-gfm-table@1.0.7: + resolution: {integrity: sha512-jjcpmNnQvrmN5Vx7y7lEc2iIOEytYv7rTvu+MeyAsSHTASGCCRA79Igg2uKssgOs1i1po8s3plW0sTu1wkkLGg==} dependencies: - '@types/mdast': 3.0.15 + '@types/mdast': 3.0.14 markdown-table: 3.0.3 mdast-util-from-markdown: 1.3.1 mdast-util-to-markdown: 1.5.0 transitivePeerDependencies: - supports-color - mdast-util-gfm-task-list-item@1.0.2: + /mdast-util-gfm-task-list-item@1.0.2: + resolution: {integrity: sha512-PFTA1gzfp1B1UaiJVyhJZA1rm0+Tzn690frc/L8vNX1Jop4STZgOE6bxUhnzdVSB+vm2GU1tIsuQcA9bxTQpMQ==} dependencies: - '@types/mdast': 3.0.15 + '@types/mdast': 3.0.14 mdast-util-to-markdown: 1.5.0 - mdast-util-gfm@2.0.2: + /mdast-util-gfm@2.0.2: + resolution: {integrity: sha512-qvZ608nBppZ4icQlhQQIAdc6S3Ffj9RGmzwUKUWuEICFnd1LVkN3EktF7ZHAgfcEdvZB5owU9tQgt99e2TlLjg==} dependencies: mdast-util-from-markdown: 1.3.1 mdast-util-gfm-autolink-literal: 1.0.3 @@ -6452,44 +4553,51 @@ snapshots: transitivePeerDependencies: - supports-color - mdast-util-heading-style@2.0.1: + /mdast-util-heading-style@2.0.1: + resolution: {integrity: sha512-0L5rthU4xKDVbw+UQ7D8Y8xOEsX4JXZvemWoEAsL+WAaeSH+TvVVwFnTb3G/OrjyP4VYQULoNWU+PdZfkmNu4A==} dependencies: - '@types/mdast': 3.0.15 + '@types/mdast': 3.0.14 + dev: true - mdast-util-math@2.0.2: + /mdast-util-math@2.0.2: + resolution: {integrity: sha512-8gmkKVp9v6+Tgjtq6SYx9kGPpTf6FVYRa53/DLh479aldR9AyP48qeVOgNZ5X7QUK7nOy4yw7vg6mbiGcs9jWQ==} dependencies: - '@types/mdast': 3.0.15 + '@types/mdast': 3.0.14 longest-streak: 3.1.0 mdast-util-to-markdown: 1.5.0 + dev: false - mdast-util-mdx-expression@1.3.2: + /mdast-util-mdx-expression@1.3.2: + resolution: {integrity: sha512-xIPmR5ReJDu/DHH1OoIT1HkuybIfRGYRywC+gJtI7qHjCJp/M9jrmBEJW22O8lskDWm562BX2W8TiAwRTb0rKA==} dependencies: - '@types/estree-jsx': 1.0.5 - '@types/hast': 2.3.10 - '@types/mdast': 3.0.15 + '@types/estree-jsx': 1.0.3 + '@types/hast': 2.3.7 + '@types/mdast': 3.0.14 mdast-util-from-markdown: 1.3.1 mdast-util-to-markdown: 1.5.0 transitivePeerDependencies: - supports-color - mdast-util-mdx-jsx@2.1.4: + /mdast-util-mdx-jsx@2.1.4: + resolution: {integrity: sha512-DtMn9CmVhVzZx3f+optVDF8yFgQVt7FghCRNdlIaS3X5Bnym3hZwPbg/XW86vdpKjlc1PVj26SpnLGeJBXD3JA==} dependencies: - '@types/estree-jsx': 1.0.5 - '@types/hast': 2.3.10 - '@types/mdast': 3.0.15 - '@types/unist': 2.0.10 + '@types/estree-jsx': 1.0.3 + '@types/hast': 2.3.7 + '@types/mdast': 3.0.14 + '@types/unist': 2.0.9 ccount: 2.0.1 mdast-util-from-markdown: 1.3.1 mdast-util-to-markdown: 1.5.0 parse-entities: 4.0.1 - stringify-entities: 4.0.4 + stringify-entities: 4.0.3 unist-util-remove-position: 4.0.2 unist-util-stringify-position: 3.0.3 vfile-message: 3.1.4 transitivePeerDependencies: - supports-color - mdast-util-mdx@2.0.1: + /mdast-util-mdx@2.0.1: + resolution: {integrity: sha512-38w5y+r8nyKlGvNjSEqWrhG0w5PmnRA+wnBvm+ulYCct7nsGYhFVb0lljS9bQav4psDAS1eGkP2LMVcZBi/aqw==} dependencies: mdast-util-from-markdown: 1.3.1 mdast-util-mdx-expression: 1.3.2 @@ -6499,53 +4607,61 @@ snapshots: transitivePeerDependencies: - supports-color - mdast-util-mdxjs-esm@1.3.1: + /mdast-util-mdxjs-esm@1.3.1: + resolution: {integrity: sha512-SXqglS0HrEvSdUEfoXFtcg7DRl7S2cwOXc7jkuusG472Mmjag34DUDeOJUZtl+BVnyeO1frIgVpHlNRWc2gk/w==} dependencies: - '@types/estree-jsx': 1.0.5 - '@types/hast': 2.3.10 - '@types/mdast': 3.0.15 + '@types/estree-jsx': 1.0.3 + '@types/hast': 2.3.7 + '@types/mdast': 3.0.14 mdast-util-from-markdown: 1.3.1 mdast-util-to-markdown: 1.5.0 transitivePeerDependencies: - supports-color - mdast-util-phrasing@3.0.1: + /mdast-util-phrasing@3.0.1: + resolution: {integrity: sha512-WmI1gTXUBJo4/ZmSk79Wcb2HcjPJBzM1nlI/OUWA8yk2X9ik3ffNbBGsU+09BFmXaL1IBb9fiuvq6/KMiNycSg==} dependencies: - '@types/mdast': 3.0.15 + '@types/mdast': 3.0.14 unist-util-is: 5.2.1 - mdast-util-phrasing@4.1.0: + /mdast-util-phrasing@4.0.0: + resolution: {integrity: sha512-xadSsJayQIucJ9n053dfQwVu1kuXg7jCTdYsMK8rqzKZh52nLfSH/k0sAxE0u+pj/zKZX+o5wB+ML5mRayOxFA==} dependencies: - '@types/mdast': 4.0.3 + '@types/mdast': 4.0.2 unist-util-is: 6.0.0 + dev: true - mdast-util-to-hast@12.3.0: + /mdast-util-to-hast@12.3.0: + resolution: {integrity: sha512-pits93r8PhnIoU4Vy9bjW39M2jJ6/tdHyja9rrot9uujkN7UTU9SDnE6WNJz/IGyQk3XHX6yNNtrBH6cQzm8Hw==} dependencies: - '@types/hast': 2.3.10 - '@types/mdast': 3.0.15 + '@types/hast': 2.3.7 + '@types/mdast': 3.0.14 mdast-util-definitions: 5.1.2 micromark-util-sanitize-uri: 1.2.0 trim-lines: 3.0.1 unist-util-generated: 2.0.1 unist-util-position: 4.0.4 unist-util-visit: 4.1.2 + dev: false - mdast-util-to-hast@13.1.0: + /mdast-util-to-hast@13.0.2: + resolution: {integrity: sha512-U5I+500EOOw9e3ZrclN3Is3fRpw8c19SMyNZlZ2IS+7vLsNzb2Om11VpIVOR+/0137GhZsFEF6YiKD5+0Hr2Og==} dependencies: - '@types/hast': 3.0.4 - '@types/mdast': 4.0.3 + '@types/hast': 3.0.2 + '@types/mdast': 4.0.2 '@ungap/structured-clone': 1.2.0 devlop: 1.1.0 micromark-util-sanitize-uri: 2.0.0 trim-lines: 3.0.1 unist-util-position: 5.0.0 unist-util-visit: 5.0.0 - vfile: 6.0.1 + dev: false - mdast-util-to-markdown@1.5.0: + /mdast-util-to-markdown@1.5.0: + resolution: {integrity: sha512-bbv7TPv/WC49thZPg3jXuqzuvI45IL2EVAr/KxF0BSdHsU0ceFHOmwQn6evxAh1GaoK/6GQ1wp4R4oW2+LFL/A==} dependencies: - '@types/mdast': 3.0.15 - '@types/unist': 2.0.10 + '@types/mdast': 3.0.14 + '@types/unist': 2.0.9 longest-streak: 3.1.0 mdast-util-phrasing: 3.0.1 mdast-util-to-string: 3.2.0 @@ -6553,65 +4669,86 @@ snapshots: unist-util-visit: 4.1.2 zwitch: 2.0.4 - mdast-util-to-markdown@2.1.0: + /mdast-util-to-markdown@2.1.0: + resolution: {integrity: sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ==} dependencies: - '@types/mdast': 4.0.3 - '@types/unist': 3.0.2 + '@types/mdast': 4.0.2 + '@types/unist': 3.0.1 longest-streak: 3.1.0 - mdast-util-phrasing: 4.1.0 + mdast-util-phrasing: 4.0.0 mdast-util-to-string: 4.0.0 micromark-util-decode-string: 2.0.0 unist-util-visit: 5.0.0 zwitch: 2.0.4 + dev: true - mdast-util-to-string@2.0.0: {} + /mdast-util-to-string@2.0.0: + resolution: {integrity: sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==} + dev: true - mdast-util-to-string@3.2.0: + /mdast-util-to-string@3.2.0: + resolution: {integrity: sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg==} dependencies: - '@types/mdast': 3.0.15 + '@types/mdast': 3.0.14 - mdast-util-to-string@4.0.0: + /mdast-util-to-string@4.0.0: + resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} dependencies: - '@types/mdast': 4.0.3 + '@types/mdast': 4.0.2 + dev: true - merge2@1.4.1: {} + /merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + dev: true - merkletreejs@0.3.11: + /merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + /merkletreejs@0.3.11: + resolution: {integrity: sha512-LJKTl4iVNTndhL+3Uz/tfkjD0klIWsHlUzgtuNnNrsf7bAlXR30m+xYB7lHr5Z/l6e/yAIsr26Dabx6Buo4VGQ==} + engines: {node: '>= 7.6.0'} dependencies: bignumber.js: 9.1.2 buffer-reverse: 1.0.1 crypto-js: 4.2.0 treeify: 1.1.0 - web3-utils: 1.10.4 + web3-utils: 1.10.3 + dev: true - mermaid@10.9.3: + /mermaid@10.6.1: + resolution: {integrity: sha512-Hky0/RpOw/1il9X8AvzOEChfJtVvmXm+y7JML5C//ePYMy0/9jCEmW1E1g86x9oDfW9+iVEdTV/i+M6KWRNs4A==} dependencies: '@braintree/sanitize-url': 6.0.4 - '@types/d3-scale': 4.0.8 - '@types/d3-scale-chromatic': 3.0.3 - cytoscape: 3.29.2 - cytoscape-cose-bilkent: 4.1.0(cytoscape@3.29.2) - d3: 7.9.0 + '@types/d3-scale': 4.0.7 + '@types/d3-scale-chromatic': 3.0.1 + cytoscape: 3.27.0 + cytoscape-cose-bilkent: 4.1.0(cytoscape@3.27.0) + cytoscape-fcose: 2.2.0(cytoscape@3.27.0) + d3: 7.8.5 d3-sankey: 0.12.3 dagre-d3-es: 7.0.10 - dayjs: 1.11.11 - dompurify: 3.1.6 - elkjs: 0.9.3 - katex: 0.16.10 + dayjs: 1.11.10 + dompurify: 3.0.6 + elkjs: 0.8.2 khroma: 2.1.0 lodash-es: 4.17.21 mdast-util-from-markdown: 1.3.1 non-layered-tidy-tree-layout: 2.0.2 - stylis: 4.3.2 + stylis: 4.3.0 ts-dedent: 2.2.0 uuid: 9.0.1 - web-worker: 1.3.0 + web-worker: 1.2.0 transitivePeerDependencies: - supports-color + dev: false - micro-ftch@0.3.1: {} + /micro-ftch@0.3.1: + resolution: {integrity: sha512-/0LLxhzP0tfiR5hcQebtudP56gUurs2CLkGarnCiB/OqEyUFQ6U3paQi/tgLv0hBJYt2rnr9MNpxz4fiiugstg==} + dev: true - micromark-core-commonmark@1.1.0: + /micromark-core-commonmark@1.1.0: + resolution: {integrity: sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw==} dependencies: decode-named-character-reference: 1.0.2 micromark-factory-destination: 1.1.0 @@ -6630,7 +4767,8 @@ snapshots: micromark-util-types: 1.1.0 uvu: 0.5.6 - micromark-core-commonmark@2.0.1: + /micromark-core-commonmark@2.0.0: + resolution: {integrity: sha512-jThOz/pVmAYUtkroV3D5c1osFXAMv9e0ypGDOIZuCeAe91/sD6BoE2Sjzt30yuXtwOYUmySOhMas/PVyh02itA==} dependencies: decode-named-character-reference: 1.0.2 devlop: 1.1.0 @@ -6639,31 +4777,36 @@ snapshots: micromark-factory-space: 2.0.0 micromark-factory-title: 2.0.0 micromark-factory-whitespace: 2.0.0 - micromark-util-character: 2.1.0 + micromark-util-character: 2.0.1 micromark-util-chunked: 2.0.0 micromark-util-classify-character: 2.0.0 micromark-util-html-tag-name: 2.0.0 micromark-util-normalize-identifier: 2.0.0 micromark-util-resolve-all: 2.0.0 - micromark-util-subtokenize: 2.0.1 + micromark-util-subtokenize: 2.0.0 micromark-util-symbol: 2.0.0 micromark-util-types: 2.0.0 + dev: true - micromark-extension-frontmatter@2.0.0: + /micromark-extension-frontmatter@2.0.0: + resolution: {integrity: sha512-C4AkuM3dA58cgZha7zVnuVxBhDsbttIMiytjgsM2XbHAB2faRVaHRle40558FBN+DJcrLNCoqG5mlrpdU4cRtg==} dependencies: fault: 2.0.1 - micromark-util-character: 2.1.0 + micromark-util-character: 2.0.1 micromark-util-symbol: 2.0.0 micromark-util-types: 2.0.0 + dev: true - micromark-extension-gfm-autolink-literal@1.0.5: + /micromark-extension-gfm-autolink-literal@1.0.5: + resolution: {integrity: sha512-z3wJSLrDf8kRDOh2qBtoTRD53vJ+CWIyo7uyZuxf/JAbNJjiHsOpG1y5wxk8drtv3ETAHutCu6N3thkOOgueWg==} dependencies: micromark-util-character: 1.2.0 micromark-util-sanitize-uri: 1.2.0 micromark-util-symbol: 1.1.0 micromark-util-types: 1.1.0 - micromark-extension-gfm-footnote@1.1.2: + /micromark-extension-gfm-footnote@1.1.2: + resolution: {integrity: sha512-Yxn7z7SxgyGWRNa4wzf8AhYYWNrwl5q1Z8ii+CSTTIqVkmGZF1CElX2JI8g5yGoM3GAman9/PVCUFUSJ0kB/8Q==} dependencies: micromark-core-commonmark: 1.1.0 micromark-factory-space: 1.1.0 @@ -6674,7 +4817,8 @@ snapshots: micromark-util-types: 1.1.0 uvu: 0.5.6 - micromark-extension-gfm-strikethrough@1.0.7: + /micromark-extension-gfm-strikethrough@1.0.7: + resolution: {integrity: sha512-sX0FawVE1o3abGk3vRjOH50L5TTLr3b5XMqnP9YDRb34M0v5OoZhG+OHFz1OffZ9dlwgpTBKaT4XW/AsUVnSDw==} dependencies: micromark-util-chunked: 1.1.0 micromark-util-classify-character: 1.1.0 @@ -6683,7 +4827,8 @@ snapshots: micromark-util-types: 1.1.0 uvu: 0.5.6 - micromark-extension-gfm-table@1.0.7: + /micromark-extension-gfm-table@1.0.7: + resolution: {integrity: sha512-3ZORTHtcSnMQEKtAOsBQ9/oHp9096pI/UvdPtN7ehKvrmZZ2+bbWhi0ln+I9drmwXMt5boocn6OlwQzNXeVeqw==} dependencies: micromark-factory-space: 1.1.0 micromark-util-character: 1.2.0 @@ -6691,11 +4836,13 @@ snapshots: micromark-util-types: 1.1.0 uvu: 0.5.6 - micromark-extension-gfm-tagfilter@1.0.2: + /micromark-extension-gfm-tagfilter@1.0.2: + resolution: {integrity: sha512-5XWB9GbAUSHTn8VPU8/1DBXMuKYT5uOgEjJb8gN3mW0PNW5OPHpSdojoqf+iq1xo7vWzw/P8bAHY0n6ijpXF7g==} dependencies: micromark-util-types: 1.1.0 - micromark-extension-gfm-task-list-item@1.0.5: + /micromark-extension-gfm-task-list-item@1.0.5: + resolution: {integrity: sha512-RMFXl2uQ0pNQy6Lun2YBYT9g9INXtWJULgbt01D/x8/6yJ2qpKyzdZD3pi6UIkzF++Da49xAelVKUeUMqd5eIQ==} dependencies: micromark-factory-space: 1.1.0 micromark-util-character: 1.2.0 @@ -6703,7 +4850,8 @@ snapshots: micromark-util-types: 1.1.0 uvu: 0.5.6 - micromark-extension-gfm@2.0.3: + /micromark-extension-gfm@2.0.3: + resolution: {integrity: sha512-vb9OoHqrhCmbRidQv/2+Bc6pkP0FrtlhurxZofvOEy5o8RtuuvTq+RQ1Vw5ZDNrVraQZu3HixESqbG+0iKk/MQ==} dependencies: micromark-extension-gfm-autolink-literal: 1.0.5 micromark-extension-gfm-footnote: 1.1.2 @@ -6714,17 +4862,20 @@ snapshots: micromark-util-combine-extensions: 1.1.0 micromark-util-types: 1.1.0 - micromark-extension-math@2.1.2: + /micromark-extension-math@2.1.2: + resolution: {integrity: sha512-es0CcOV89VNS9wFmyn+wyFTKweXGW4CEvdaAca6SWRWPyYCbBisnjaHLjWO4Nszuiud84jCpkHsqAJoa768Pvg==} dependencies: - '@types/katex': 0.16.7 - katex: 0.16.10 + '@types/katex': 0.16.5 + katex: 0.16.9 micromark-factory-space: 1.1.0 micromark-util-character: 1.2.0 micromark-util-symbol: 1.1.0 micromark-util-types: 1.1.0 uvu: 0.5.6 + dev: false - micromark-extension-mdx-expression@1.0.8: + /micromark-extension-mdx-expression@1.0.8: + resolution: {integrity: sha512-zZpeQtc5wfWKdzDsHRBY003H2Smg+PUi2REhqgIhdzAa5xonhP03FcXxqFSerFiNUr5AWmHpaNPQTBVOS4lrXw==} dependencies: '@types/estree': 1.0.5 micromark-factory-mdx-expression: 1.0.9 @@ -6735,7 +4886,8 @@ snapshots: micromark-util-types: 1.1.0 uvu: 0.5.6 - micromark-extension-mdx-jsx@1.0.5: + /micromark-extension-mdx-jsx@1.0.5: + resolution: {integrity: sha512-gPH+9ZdmDflbu19Xkb8+gheqEDqkSpdCEubQyxuz/Hn8DOXiXvrXeikOoBA71+e8Pfi0/UYmU3wW3H58kr7akA==} dependencies: '@types/acorn': 4.0.6 '@types/estree': 1.0.5 @@ -6748,11 +4900,13 @@ snapshots: uvu: 0.5.6 vfile-message: 3.1.4 - micromark-extension-mdx-md@1.0.1: + /micromark-extension-mdx-md@1.0.1: + resolution: {integrity: sha512-7MSuj2S7xjOQXAjjkbjBsHkMtb+mDGVW6uI2dBL9snOBCbZmoNgDAeZ0nSn9j3T42UE/g2xVNMn18PJxZvkBEA==} dependencies: micromark-util-types: 1.1.0 - micromark-extension-mdxjs-esm@1.0.5: + /micromark-extension-mdxjs-esm@1.0.5: + resolution: {integrity: sha512-xNRBw4aoURcyz/S69B19WnZAkWJMxHMT5hE36GtDAyhoyn/8TuAeqjFJQlwk+MKQsUD7b3l7kFX+vlfVWgcX1w==} dependencies: '@types/estree': 1.0.5 micromark-core-commonmark: 1.1.0 @@ -6764,10 +4918,11 @@ snapshots: uvu: 0.5.6 vfile-message: 3.1.4 - micromark-extension-mdxjs@1.0.1: + /micromark-extension-mdxjs@1.0.1: + resolution: {integrity: sha512-7YA7hF6i5eKOfFUzZ+0z6avRG52GpWR8DL+kN47y3f2KhxbBZMhmxe7auOeaTBrW2DenbbZTf1ea9tA2hDpC2Q==} dependencies: - acorn: 8.11.3 - acorn-jsx: 5.3.2(acorn@8.11.3) + acorn: 8.11.2 + acorn-jsx: 5.3.2(acorn@8.11.2) micromark-extension-mdx-expression: 1.0.8 micromark-extension-mdx-jsx: 1.0.5 micromark-extension-mdx-md: 1.0.1 @@ -6775,33 +4930,40 @@ snapshots: micromark-util-combine-extensions: 1.1.0 micromark-util-types: 1.1.0 - micromark-factory-destination@1.1.0: + /micromark-factory-destination@1.1.0: + resolution: {integrity: sha512-XaNDROBgx9SgSChd69pjiGKbV+nfHGDPVYFs5dOoDd7ZnMAE+Cuu91BCpsY8RT2NP9vo/B8pds2VQNCLiu0zhg==} dependencies: micromark-util-character: 1.2.0 micromark-util-symbol: 1.1.0 micromark-util-types: 1.1.0 - micromark-factory-destination@2.0.0: + /micromark-factory-destination@2.0.0: + resolution: {integrity: sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==} dependencies: - micromark-util-character: 2.1.0 + micromark-util-character: 2.0.1 micromark-util-symbol: 2.0.0 micromark-util-types: 2.0.0 + dev: true - micromark-factory-label@1.1.0: + /micromark-factory-label@1.1.0: + resolution: {integrity: sha512-OLtyez4vZo/1NjxGhcpDSbHQ+m0IIGnT8BoPamh+7jVlzLJBH98zzuCoUeMxvM6WsNeh8wx8cKvqLiPHEACn0w==} dependencies: micromark-util-character: 1.2.0 micromark-util-symbol: 1.1.0 micromark-util-types: 1.1.0 uvu: 0.5.6 - micromark-factory-label@2.0.0: + /micromark-factory-label@2.0.0: + resolution: {integrity: sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==} dependencies: devlop: 1.1.0 - micromark-util-character: 2.1.0 + micromark-util-character: 2.0.1 micromark-util-symbol: 2.0.0 micromark-util-types: 2.0.0 + dev: true - micromark-factory-mdx-expression@1.0.9: + /micromark-factory-mdx-expression@1.0.9: + resolution: {integrity: sha512-jGIWzSmNfdnkJq05c7b0+Wv0Kfz3NJ3N4cBjnbO4zjXIlxJr+f8lk+5ZmwFvqdAbUy2q6B5rCY//g0QAAaXDWA==} dependencies: '@types/estree': 1.0.5 micromark-util-character: 1.2.0 @@ -6812,185 +4974,235 @@ snapshots: uvu: 0.5.6 vfile-message: 3.1.4 - micromark-factory-space@1.1.0: + /micromark-factory-space@1.1.0: + resolution: {integrity: sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==} dependencies: micromark-util-character: 1.2.0 micromark-util-types: 1.1.0 - micromark-factory-space@2.0.0: + /micromark-factory-space@2.0.0: + resolution: {integrity: sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==} dependencies: - micromark-util-character: 2.1.0 + micromark-util-character: 2.0.1 micromark-util-types: 2.0.0 + dev: true - micromark-factory-title@1.1.0: + /micromark-factory-title@1.1.0: + resolution: {integrity: sha512-J7n9R3vMmgjDOCY8NPw55jiyaQnH5kBdV2/UXCtZIpnHH3P6nHUKaH7XXEYuWwx/xUJcawa8plLBEjMPU24HzQ==} dependencies: micromark-factory-space: 1.1.0 micromark-util-character: 1.2.0 micromark-util-symbol: 1.1.0 micromark-util-types: 1.1.0 - micromark-factory-title@2.0.0: + /micromark-factory-title@2.0.0: + resolution: {integrity: sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A==} dependencies: micromark-factory-space: 2.0.0 - micromark-util-character: 2.1.0 + micromark-util-character: 2.0.1 micromark-util-symbol: 2.0.0 micromark-util-types: 2.0.0 + dev: true - micromark-factory-whitespace@1.1.0: + /micromark-factory-whitespace@1.1.0: + resolution: {integrity: sha512-v2WlmiymVSp5oMg+1Q0N1Lxmt6pMhIHD457whWM7/GUlEks1hI9xj5w3zbc4uuMKXGisksZk8DzP2UyGbGqNsQ==} dependencies: micromark-factory-space: 1.1.0 micromark-util-character: 1.2.0 micromark-util-symbol: 1.1.0 micromark-util-types: 1.1.0 - micromark-factory-whitespace@2.0.0: + /micromark-factory-whitespace@2.0.0: + resolution: {integrity: sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==} dependencies: micromark-factory-space: 2.0.0 - micromark-util-character: 2.1.0 + micromark-util-character: 2.0.1 micromark-util-symbol: 2.0.0 micromark-util-types: 2.0.0 + dev: true - micromark-util-character@1.2.0: + /micromark-util-character@1.2.0: + resolution: {integrity: sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==} dependencies: micromark-util-symbol: 1.1.0 micromark-util-types: 1.1.0 - micromark-util-character@2.1.0: + /micromark-util-character@2.0.1: + resolution: {integrity: sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==} dependencies: micromark-util-symbol: 2.0.0 micromark-util-types: 2.0.0 - micromark-util-chunked@1.1.0: + /micromark-util-chunked@1.1.0: + resolution: {integrity: sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ==} dependencies: micromark-util-symbol: 1.1.0 - micromark-util-chunked@2.0.0: + /micromark-util-chunked@2.0.0: + resolution: {integrity: sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==} dependencies: micromark-util-symbol: 2.0.0 + dev: true - micromark-util-classify-character@1.1.0: + /micromark-util-classify-character@1.1.0: + resolution: {integrity: sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw==} dependencies: micromark-util-character: 1.2.0 micromark-util-symbol: 1.1.0 micromark-util-types: 1.1.0 - micromark-util-classify-character@2.0.0: + /micromark-util-classify-character@2.0.0: + resolution: {integrity: sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==} dependencies: - micromark-util-character: 2.1.0 + micromark-util-character: 2.0.1 micromark-util-symbol: 2.0.0 micromark-util-types: 2.0.0 + dev: true - micromark-util-combine-extensions@1.1.0: + /micromark-util-combine-extensions@1.1.0: + resolution: {integrity: sha512-Q20sp4mfNf9yEqDL50WwuWZHUrCO4fEyeDCnMGmG5Pr0Cz15Uo7KBs6jq+dq0EgX4DPwwrh9m0X+zPV1ypFvUA==} dependencies: micromark-util-chunked: 1.1.0 micromark-util-types: 1.1.0 - micromark-util-combine-extensions@2.0.0: + /micromark-util-combine-extensions@2.0.0: + resolution: {integrity: sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ==} dependencies: micromark-util-chunked: 2.0.0 micromark-util-types: 2.0.0 + dev: true - micromark-util-decode-numeric-character-reference@1.1.0: + /micromark-util-decode-numeric-character-reference@1.1.0: + resolution: {integrity: sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw==} dependencies: micromark-util-symbol: 1.1.0 - micromark-util-decode-numeric-character-reference@2.0.1: + /micromark-util-decode-numeric-character-reference@2.0.1: + resolution: {integrity: sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ==} dependencies: micromark-util-symbol: 2.0.0 + dev: true - micromark-util-decode-string@1.1.0: + /micromark-util-decode-string@1.1.0: + resolution: {integrity: sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ==} dependencies: decode-named-character-reference: 1.0.2 micromark-util-character: 1.2.0 micromark-util-decode-numeric-character-reference: 1.1.0 micromark-util-symbol: 1.1.0 - micromark-util-decode-string@2.0.0: + /micromark-util-decode-string@2.0.0: + resolution: {integrity: sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA==} dependencies: decode-named-character-reference: 1.0.2 - micromark-util-character: 2.1.0 + micromark-util-character: 2.0.1 micromark-util-decode-numeric-character-reference: 2.0.1 micromark-util-symbol: 2.0.0 + dev: true - micromark-util-encode@1.1.0: {} + /micromark-util-encode@1.1.0: + resolution: {integrity: sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw==} - micromark-util-encode@2.0.0: {} + /micromark-util-encode@2.0.0: + resolution: {integrity: sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==} - micromark-util-events-to-acorn@1.2.3: + /micromark-util-events-to-acorn@1.2.3: + resolution: {integrity: sha512-ij4X7Wuc4fED6UoLWkmo0xJQhsktfNh1J0m8g4PbIMPlx+ek/4YdW5mvbye8z/aZvAPUoxgXHrwVlXAPKMRp1w==} dependencies: '@types/acorn': 4.0.6 '@types/estree': 1.0.5 - '@types/unist': 2.0.10 + '@types/unist': 2.0.9 estree-util-visit: 1.2.1 micromark-util-symbol: 1.1.0 micromark-util-types: 1.1.0 uvu: 0.5.6 vfile-message: 3.1.4 - micromark-util-html-tag-name@1.2.0: {} + /micromark-util-html-tag-name@1.2.0: + resolution: {integrity: sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q==} - micromark-util-html-tag-name@2.0.0: {} + /micromark-util-html-tag-name@2.0.0: + resolution: {integrity: sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==} + dev: true - micromark-util-normalize-identifier@1.1.0: + /micromark-util-normalize-identifier@1.1.0: + resolution: {integrity: sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q==} dependencies: micromark-util-symbol: 1.1.0 - micromark-util-normalize-identifier@2.0.0: + /micromark-util-normalize-identifier@2.0.0: + resolution: {integrity: sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==} dependencies: micromark-util-symbol: 2.0.0 + dev: true - micromark-util-resolve-all@1.1.0: + /micromark-util-resolve-all@1.1.0: + resolution: {integrity: sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA==} dependencies: micromark-util-types: 1.1.0 - micromark-util-resolve-all@2.0.0: + /micromark-util-resolve-all@2.0.0: + resolution: {integrity: sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==} dependencies: micromark-util-types: 2.0.0 + dev: true - micromark-util-sanitize-uri@1.2.0: + /micromark-util-sanitize-uri@1.2.0: + resolution: {integrity: sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A==} dependencies: micromark-util-character: 1.2.0 micromark-util-encode: 1.1.0 micromark-util-symbol: 1.1.0 - micromark-util-sanitize-uri@2.0.0: + /micromark-util-sanitize-uri@2.0.0: + resolution: {integrity: sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==} dependencies: - micromark-util-character: 2.1.0 + micromark-util-character: 2.0.1 micromark-util-encode: 2.0.0 micromark-util-symbol: 2.0.0 - micromark-util-subtokenize@1.1.0: + /micromark-util-subtokenize@1.1.0: + resolution: {integrity: sha512-kUQHyzRoxvZO2PuLzMt2P/dwVsTiivCK8icYTeR+3WgbuPqfHgPPy7nFKbeqRivBvn/3N3GBiNC+JRTMSxEC7A==} dependencies: micromark-util-chunked: 1.1.0 micromark-util-symbol: 1.1.0 micromark-util-types: 1.1.0 uvu: 0.5.6 - micromark-util-subtokenize@2.0.1: + /micromark-util-subtokenize@2.0.0: + resolution: {integrity: sha512-vc93L1t+gpR3p8jxeVdaYlbV2jTYteDje19rNSS/H5dlhxUYll5Fy6vJ2cDwP8RnsXi818yGty1ayP55y3W6fg==} dependencies: devlop: 1.1.0 micromark-util-chunked: 2.0.0 micromark-util-symbol: 2.0.0 micromark-util-types: 2.0.0 + dev: true - micromark-util-symbol@1.1.0: {} + /micromark-util-symbol@1.1.0: + resolution: {integrity: sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==} - micromark-util-symbol@2.0.0: {} + /micromark-util-symbol@2.0.0: + resolution: {integrity: sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==} - micromark-util-types@1.1.0: {} + /micromark-util-types@1.1.0: + resolution: {integrity: sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==} - micromark-util-types@2.0.0: {} + /micromark-util-types@2.0.0: + resolution: {integrity: sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==} - micromark@2.11.4: + /micromark@2.11.4: + resolution: {integrity: sha512-+WoovN/ppKolQOFIAajxi7Lu9kInbPxFuTBVEavFcL8eAfVstoc5MocPmqBeAdBOJV00uaVjegzH4+MA0DN/uA==} dependencies: debug: 4.3.4 parse-entities: 2.0.0 transitivePeerDependencies: - supports-color + dev: true - micromark@3.2.0: + /micromark@3.2.0: + resolution: {integrity: sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA==} dependencies: - '@types/debug': 4.1.12 + '@types/debug': 4.1.11 debug: 4.3.4 decode-named-character-reference: 1.0.2 micromark-core-commonmark: 1.1.0 @@ -7010,15 +5222,16 @@ snapshots: transitivePeerDependencies: - supports-color - micromark@4.0.0: + /micromark@4.0.0: + resolution: {integrity: sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==} dependencies: - '@types/debug': 4.1.12 + '@types/debug': 4.1.11 debug: 4.3.4 decode-named-character-reference: 1.0.2 devlop: 1.1.0 - micromark-core-commonmark: 2.0.1 + micromark-core-commonmark: 2.0.0 micromark-factory-space: 2.0.0 - micromark-util-character: 2.1.0 + micromark-util-character: 2.0.1 micromark-util-chunked: 2.0.0 micromark-util-combine-extensions: 2.0.0 micromark-util-decode-numeric-character-reference: 2.0.1 @@ -7026,93 +5239,171 @@ snapshots: micromark-util-normalize-identifier: 2.0.0 micromark-util-resolve-all: 2.0.0 micromark-util-sanitize-uri: 2.0.0 - micromark-util-subtokenize: 2.0.1 + micromark-util-subtokenize: 2.0.0 micromark-util-symbol: 2.0.0 micromark-util-types: 2.0.0 transitivePeerDependencies: - supports-color + dev: true - micromatch@4.0.5: + /micromatch@4.0.5: + resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + engines: {node: '>=8.6'} dependencies: braces: 3.0.2 picomatch: 2.3.1 - min-indent@1.0.1: {} + /mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + dev: true + + /mimic-fn@4.0.0: + resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} + engines: {node: '>=12'} + dev: true - minimalistic-assert@1.0.1: {} + /min-indent@1.0.1: + resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} + engines: {node: '>=4'} + dev: true - minimalistic-crypto-utils@1.0.1: {} + /minimalistic-assert@1.0.1: + resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} + dev: true - minimatch@3.1.2: - dependencies: - brace-expansion: 1.1.11 + /minimalistic-crypto-utils@1.0.1: + resolution: {integrity: sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==} + dev: true - minimatch@5.1.6: + /minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} dependencies: - brace-expansion: 2.0.1 + brace-expansion: 1.1.11 + dev: true - minimatch@9.0.3: + /minimatch@5.1.6: + resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} + engines: {node: '>=10'} dependencies: brace-expansion: 2.0.1 + dev: true - minimatch@9.0.4: + /minimatch@9.0.3: + resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} + engines: {node: '>=16 || 14 >=14.17'} dependencies: brace-expansion: 2.0.1 + dev: true - minimist@1.2.8: {} + /minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + dev: false - minipass@7.0.4: {} + /minipass@7.0.4: + resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==} + engines: {node: '>=16 || 14 >=14.17'} + dev: true - mri@1.2.0: {} + /mri@1.2.0: + resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} + engines: {node: '>=4'} - ms@2.1.2: {} + /ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - nanoid@3.3.7: {} + /nanoid@3.3.7: + resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + dev: false - natural-compare@1.4.0: {} + /natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + dev: true - next-mdx-remote@4.4.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + /next-mdx-remote@4.4.1(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-1BvyXaIou6xy3XoNF4yaMZUCb6vD2GTAa5ciOa6WoO+gAUTYsb1K4rI/HSC2ogAWLrb/7VSV52skz07vOzmqIQ==} + engines: {node: '>=14', npm: '>=7'} + peerDependencies: + react: '>=16.x <=18.x' + react-dom: '>=16.x <=18.x' dependencies: '@mdx-js/mdx': 2.3.0 - '@mdx-js/react': 2.3.0(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + '@mdx-js/react': 2.3.0(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) vfile: 5.3.7 vfile-matter: 3.0.1 transitivePeerDependencies: - supports-color + dev: false - next-seo@6.5.0(next@14.2.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + /next-seo@6.4.0(next@14.2.10)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-XQFxkOL2hw0YE+P100HbI3EAvcludlHPxuzMgaIjKb7kPK0CvjGvLFjd9hszZFEDc5oiQkGFA8+cuWcnip7eYA==} + peerDependencies: + next: ^8.1.1-canary.54 || >=9.0.0 + react: '>=16.0.0' + react-dom: '>=16.0.0' dependencies: - next: 14.2.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + next: 14.2.10(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false - next-sitemap@4.2.3(next@14.2.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1)): + /next-sitemap@4.2.3(next@14.2.10): + resolution: {integrity: sha512-vjdCxeDuWDzldhCnyFCQipw5bfpl4HmZA7uoo3GAaYGjGgfL4Cxb1CiztPuWGmS+auYs7/8OekRS8C2cjdAsjQ==} + engines: {node: '>=14.18'} + hasBin: true + peerDependencies: + next: '*' dependencies: '@corex/deepmerge': 4.0.43 '@next/env': 13.5.6 fast-glob: 3.3.2 minimist: 1.2.8 - next: 14.2.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + next: 14.2.10(react-dom@18.2.0)(react@18.2.0) + dev: false - next-themes@0.2.1(next@14.2.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + /next-themes@0.2.1(next@14.2.10)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-B+AKNfYNIzh0vqQQKqQItTS8evEouKD7H5Hj3kmuPERwddR2TxvDSFZuTj6T7Jfn1oyeUyJMydPl1Bkxkh0W7A==} + peerDependencies: + next: '*' + react: '*' + react-dom: '*' dependencies: - next: 14.2.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + next: 14.2.10(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false - next@14.2.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + /next@14.2.10(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-sDDExXnh33cY3RkS9JuFEKaS4HmlWmDKP1VJioucCG6z5KuA008DPsDZOzi8UfqEk3Ii+2NCQSJrfbEWtZZfww==} + engines: {node: '>=18.17.0'} + hasBin: true + peerDependencies: + '@opentelemetry/api': ^1.1.0 + '@playwright/test': ^1.41.2 + react: ^18.2.0 + react-dom: ^18.2.0 + sass: ^1.3.0 + peerDependenciesMeta: + '@opentelemetry/api': + optional: true + '@playwright/test': + optional: true + sass: + optional: true dependencies: '@next/env': 14.2.10 '@swc/helpers': 0.5.5 busboy: 1.6.0 - caniuse-lite: 1.0.30001614 + caniuse-lite: 1.0.30001669 graceful-fs: 4.2.11 postcss: 8.4.31 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - styled-jsx: 5.1.1(react@18.3.1) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + styled-jsx: 5.1.1(react@18.2.0) optionalDependencies: '@next/swc-darwin-arm64': 14.2.10 '@next/swc-darwin-x64': 14.2.10 @@ -7126,150 +5417,271 @@ snapshots: transitivePeerDependencies: - '@babel/core' - babel-plugin-macros + dev: false - nextra-theme-docs@2.13.2(next@14.2.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(nextra@2.13.2(patch_hash=a4rp2hgojklggjmthmkiyqaek4)(next@14.2.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + /nextra-theme-docs@2.13.2(next@14.2.10)(nextra@2.13.2)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-yE4umXaImp1/kf/sFciPj2+EFrNSwd9Db26hi98sIIiujzGf3+9eUgAz45vF9CwBw50FSXxm1QGRcY+slQ4xQQ==} + peerDependencies: + next: '>=9.5.3' + nextra: 2.13.2 + react: '>=16.13.1' + react-dom: '>=16.13.1' dependencies: - '@headlessui/react': 1.7.19(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@headlessui/react': 1.7.17(react-dom@18.2.0)(react@18.2.0) '@popperjs/core': 2.11.8 clsx: 2.1.1 escape-string-regexp: 5.0.0 - flexsearch: 0.7.43 + flexsearch: 0.7.31 focus-visible: 5.2.0 git-url-parse: 13.1.1 intersection-observer: 0.12.2 - match-sorter: 6.3.4 - next: 14.2.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - next-seo: 6.5.0(next@14.2.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - next-themes: 0.2.1(next@14.2.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - nextra: 2.13.2(patch_hash=a4rp2hgojklggjmthmkiyqaek4)(next@14.2.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + match-sorter: 6.3.1 + next: 14.2.10(react-dom@18.2.0)(react@18.2.0) + next-seo: 6.4.0(next@14.2.10)(react-dom@18.2.0)(react@18.2.0) + next-themes: 0.2.1(next@14.2.10)(react-dom@18.2.0)(react@18.2.0) + nextra: 2.13.2(patch_hash=a4rp2hgojklggjmthmkiyqaek4)(next@14.2.10)(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) scroll-into-view-if-needed: 3.1.0 - zod: 3.23.8 + zod: 3.22.4 + dev: false - nextra@2.13.2(patch_hash=a4rp2hgojklggjmthmkiyqaek4)(next@14.2.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + /nextra@2.13.2(patch_hash=a4rp2hgojklggjmthmkiyqaek4)(next@14.2.10)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-pIgOSXNUqTz1laxV4ChFZOU7lzJAoDHHaBPj8L09PuxrLKqU1BU/iZtXAG6bQeKCx8EPdBsoXxEuENnL9QGnGA==} + engines: {node: '>=16'} + peerDependencies: + next: '>=9.5.3' + react: '>=16.13.1' + react-dom: '>=16.13.1' dependencies: - '@headlessui/react': 1.7.19(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@headlessui/react': 1.7.17(react-dom@18.2.0)(react@18.2.0) '@mdx-js/mdx': 2.3.0 - '@mdx-js/react': 2.3.0(react@18.3.1) - '@napi-rs/simple-git': 0.1.16 - '@theguild/remark-mermaid': 0.0.5(react@18.3.1) + '@mdx-js/react': 2.3.0(react@18.2.0) + '@napi-rs/simple-git': 0.1.9 + '@theguild/remark-mermaid': 0.0.5(react@18.2.0) '@theguild/remark-npm2yarn': 0.2.1 clsx: 2.1.1 github-slugger: 2.0.0 graceful-fs: 4.2.11 gray-matter: 4.0.3 - katex: 0.16.10 + katex: 0.16.9 lodash.get: 4.4.2 - next: 14.2.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - next-mdx-remote: 4.4.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + next: 14.2.10(react-dom@18.2.0)(react@18.2.0) + next-mdx-remote: 4.4.1(react-dom@18.2.0)(react@18.2.0) p-limit: 3.1.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) rehype-katex: 7.0.0 - rehype-pretty-code: 0.9.11(shiki@0.14.7) + rehype-pretty-code: 0.9.11(shiki@0.14.5) rehype-raw: 7.0.0 remark-gfm: 3.0.1 remark-math: 5.1.1 remark-reading-time: 2.0.1 - shiki: 0.14.7 + shiki: 0.14.5 slash: 3.0.0 title: 3.5.3 unist-util-remove: 4.0.0 unist-util-visit: 5.0.0 - zod: 3.23.8 + zod: 3.22.4 transitivePeerDependencies: - supports-color + dev: false + patched: true - no-case@3.0.4: + /no-case@3.0.4: + resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} dependencies: lower-case: 2.0.2 tslib: 2.6.2 + dev: false - node-fetch@2.7.0: + /node-fetch@2.7.0: + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true dependencies: whatwg-url: 5.0.0 + dev: true - non-layered-tidy-tree-layout@2.0.2: {} + /non-layered-tidy-tree-layout@2.0.2: + resolution: {integrity: sha512-gkXMxRzUH+PB0ax9dUN0yYF0S25BqeAYqhgMaLUFmpXLEk7Fcu8f4emJuOAY0V8kjDICxROIKsTAKsV/v355xw==} + dev: false - nopt@7.2.0: + /nopt@7.2.0: + resolution: {integrity: sha512-CVDtwCdhYIvnAzFoJ6NJ6dX3oga9/HyciQDnG1vQDjSLMeKLJ4A93ZqYKDrgYSr1FBY5/hMYC+2VCi24pgpkGA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + hasBin: true dependencies: abbrev: 2.0.0 + dev: true - npm-normalize-package-bin@3.0.1: {} + /npm-normalize-package-bin@3.0.1: + resolution: {integrity: sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dev: true - npm-run-path@2.0.2: + /npm-run-path@2.0.2: + resolution: {integrity: sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==} + engines: {node: '>=4'} dependencies: path-key: 2.0.1 + dev: false + + /npm-run-path@4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + dependencies: + path-key: 3.1.1 + dev: true + + /npm-run-path@5.1.0: + resolution: {integrity: sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + path-key: 4.0.0 + dev: true - npm-to-yarn@2.2.1: {} + /npm-to-yarn@2.1.0: + resolution: {integrity: sha512-2C1IgJLdJngq1bSER7K7CGFszRr9s2rijEwvENPEgI0eK9xlD3tNwDc0UJnRj7FIT2aydWm72jB88uVswAhXHA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: false - number-to-bn@1.7.0: + /number-to-bn@1.7.0: + resolution: {integrity: sha512-wsJ9gfSz1/s4ZsJN01lyonwuxA1tml6X1yBDnfpMglypcBRFZZkus26EdPSlqS5GJfYddVZa22p3VNb3z5m5Ig==} + engines: {node: '>=6.5.0', npm: '>=3'} dependencies: bn.js: 4.11.6 strip-hex-prefix: 1.0.0 + dev: true - object-inspect@1.13.1: {} + /object-inspect@1.13.1: + resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} + dev: false - object-is@1.1.6: + /object-is@1.1.5: + resolution: {integrity: sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==} + engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.7 + call-bind: 1.0.5 define-properties: 1.2.1 + dev: false - object-keys@1.1.1: {} + /object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + dev: false - object.assign@4.1.5: + /object.assign@4.1.4: + resolution: {integrity: sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==} + engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.7 + call-bind: 1.0.5 define-properties: 1.2.1 has-symbols: 1.0.3 object-keys: 1.1.1 + dev: false - once@1.4.0: + /once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} dependencies: wrappy: 1.0.2 + dev: true + + /onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + dependencies: + mimic-fn: 2.1.0 + dev: true + + /onetime@6.0.0: + resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} + engines: {node: '>=12'} + dependencies: + mimic-fn: 4.0.0 + dev: true + + /open@9.1.0: + resolution: {integrity: sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==} + engines: {node: '>=14.16'} + dependencies: + default-browser: 4.0.0 + define-lazy-prop: 3.0.0 + is-inside-container: 1.0.0 + is-wsl: 2.2.0 + dev: true - optionator@0.9.4: + /optionator@0.9.3: + resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} + engines: {node: '>= 0.8.0'} dependencies: + '@aashutoshrathi/word-wrap': 1.2.6 deep-is: 0.1.4 fast-levenshtein: 2.0.6 levn: 0.4.1 prelude-ls: 1.2.1 type-check: 0.4.0 - word-wrap: 1.2.5 + dev: true - p-finally@1.0.0: {} + /p-finally@1.0.0: + resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==} + engines: {node: '>=4'} + dev: false - p-limit@3.1.0: + /p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} dependencies: yocto-queue: 0.1.0 - p-limit@4.0.0: + /p-limit@4.0.0: + resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dependencies: yocto-queue: 1.0.0 + dev: true - p-locate@5.0.0: + /p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} dependencies: p-limit: 3.1.0 + dev: true - p-locate@6.0.0: + /p-locate@6.0.0: + resolution: {integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dependencies: p-limit: 4.0.0 + dev: true - param-case@3.0.4: + /param-case@3.0.4: + resolution: {integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==} dependencies: dot-case: 3.0.4 tslib: 2.6.2 + dev: false - parent-module@1.0.1: + /parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} dependencies: callsites: 3.1.0 + dev: true - parent-module@2.0.0: + /parent-module@2.0.0: + resolution: {integrity: sha512-uo0Z9JJeWzv8BG+tRcapBKNJ0dro9cLyczGzulS6EfeyAdeC9sbojtW6XwvYxJkEne9En+J2XEl4zyglVeIwFg==} + engines: {node: '>=8'} dependencies: callsites: 3.1.0 + dev: true - parse-entities@2.0.0: + /parse-entities@2.0.0: + resolution: {integrity: sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==} dependencies: character-entities: 1.2.4 character-entities-legacy: 1.1.4 @@ -7277,10 +5689,12 @@ snapshots: is-alphanumerical: 1.0.4 is-decimal: 1.0.4 is-hexadecimal: 1.0.4 + dev: true - parse-entities@4.0.1: + /parse-entities@4.0.1: + resolution: {integrity: sha512-SWzvYcSJh4d/SGLIOQfZ/CoNv6BTlI6YEQ7Nj82oDVnRpwe/Z/F1EMx42x3JAOwGBlCjeCH0BRJQbQ/opHL17w==} dependencies: - '@types/unist': 2.0.10 + '@types/unist': 2.0.9 character-entities: 2.0.2 character-entities-legacy: 3.0.0 character-reference-invalid: 2.0.1 @@ -7289,231 +5703,354 @@ snapshots: is-decimal: 2.0.1 is-hexadecimal: 2.0.1 - parse-json@6.0.2: + /parse-json@6.0.2: + resolution: {integrity: sha512-SA5aMiaIjXkAiBrW/yPgLgQAQg42f7K3ACO+2l/zOvtQBwX58DMUsFJXelW2fx3yMBmWOVkR6j1MGsdSbCA4UA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dependencies: - '@babel/code-frame': 7.24.2 + '@babel/code-frame': 7.23.4 error-ex: 1.3.2 json-parse-even-better-errors: 2.3.1 lines-and-columns: 2.0.4 + dev: true - parse-numeric-range@1.3.0: {} + /parse-numeric-range@1.3.0: + resolution: {integrity: sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ==} + dev: false - parse-path@7.0.0: + /parse-path@7.0.0: + resolution: {integrity: sha512-Euf9GG8WT9CdqwuWJGdf3RkUcTBArppHABkO7Lm8IzRQp0e2r/kkFnmhu4TSK30Wcu5rVAZLmfPKSBBi9tWFog==} dependencies: protocols: 2.0.1 + dev: false - parse-url@8.1.0: + /parse-url@8.1.0: + resolution: {integrity: sha512-xDvOoLU5XRrcOZvnI6b8zA6n9O9ejNk/GExuz1yBuWUGn9KA97GI6HTs6u02wKara1CeVmZhH+0TZFdWScR89w==} dependencies: parse-path: 7.0.0 + dev: false - parse5@7.1.2: + /parse5@7.1.2: + resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} dependencies: entities: 4.5.0 + dev: false - pascal-case@3.1.2: + /pascal-case@3.1.2: + resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==} dependencies: no-case: 3.0.4 tslib: 2.6.2 + dev: false - path-case@3.0.4: + /path-case@3.0.4: + resolution: {integrity: sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg==} dependencies: dot-case: 3.0.4 tslib: 2.6.2 + dev: false - path-exists@4.0.0: {} + /path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + dev: true + + /path-exists@5.0.0: + resolution: {integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: true - path-exists@5.0.0: {} + /path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + dev: true - path-is-absolute@1.0.1: {} + /path-key@2.0.1: + resolution: {integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==} + engines: {node: '>=4'} + dev: false - path-key@2.0.1: {} + /path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + dev: true - path-key@3.1.1: {} + /path-key@4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} + dev: true - path-scurry@1.10.2: + /path-scurry@1.10.1: + resolution: {integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==} + engines: {node: '>=16 || 14 >=14.17'} dependencies: - lru-cache: 10.2.2 + lru-cache: 10.0.3 minipass: 7.0.4 + dev: true - path-type@4.0.0: {} + /path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + dev: true - pathval@1.1.1: {} + /pathval@1.1.1: + resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} + dev: true - periscopic@3.1.0: + /periscopic@3.1.0: + resolution: {integrity: sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==} dependencies: '@types/estree': 1.0.5 estree-walker: 3.0.3 is-reference: 3.0.2 + dev: false - picocolors@1.0.0: {} - - picomatch@2.3.1: {} + /picocolors@1.0.0: + resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} - pluralize@8.0.0: {} + /picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} - possible-typed-array-names@1.0.0: {} + /pluralize@8.0.0: + resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} + engines: {node: '>=4'} + dev: true - postcss@8.4.31: + /postcss@8.4.31: + resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} + engines: {node: ^10 || ^12 || >=14} dependencies: nanoid: 3.3.7 picocolors: 1.0.0 - source-map-js: 1.2.0 + source-map-js: 1.0.2 + dev: false - prelude-ls@1.2.1: {} + /prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + dev: true - pretty-format@27.5.1: + /pretty-format@27.5.1: + resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: ansi-regex: 5.0.1 ansi-styles: 5.2.0 react-is: 17.0.2 + dev: false - proc-log@3.0.0: {} + /proc-log@3.0.0: + resolution: {integrity: sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dev: true - property-information@6.5.0: {} + /property-information@6.4.0: + resolution: {integrity: sha512-9t5qARVofg2xQqKtytzt+lZ4d1Qvj8t5B8fEwXK6qOfgRLgH/b13QlgEyDh033NOS31nXeFbYv7CLUDG1CeifQ==} + dev: false - protocols@2.0.1: {} + /protocols@2.0.1: + resolution: {integrity: sha512-/XJ368cyBJ7fzLMwLKv1e4vLxOju2MNAIokcr7meSaNcVbWz/CPcW22cP04mwxOErdA5mwjA8Q6w/cdAQxVn7Q==} + dev: false - pseudomap@1.0.2: {} + /pseudomap@1.0.2: + resolution: {integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==} + dev: false - punycode@2.3.1: {} + /punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + dev: true - queue-microtask@1.2.3: {} + /queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - randombytes@2.1.0: + /randombytes@2.1.0: + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} dependencies: safe-buffer: 5.2.1 + dev: true - react-dom@18.3.1(react@18.3.1): + /react-dom@18.2.0(react@18.2.0): + resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==} + peerDependencies: + react: ^18.2.0 dependencies: loose-envify: 1.4.0 - react: 18.3.1 - scheduler: 0.23.2 + react: 18.2.0 + scheduler: 0.23.0 + dev: false - react-is@17.0.2: {} + /react-is@17.0.2: + resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} + dev: false - react@18.3.1: + /react@18.2.0: + resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==} + engines: {node: '>=0.10.0'} dependencies: loose-envify: 1.4.0 + dev: false - read-package-json-fast@3.0.2: + /read-package-json-fast@3.0.2: + resolution: {integrity: sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} dependencies: - json-parse-even-better-errors: 3.0.1 + json-parse-even-better-errors: 3.0.0 npm-normalize-package-bin: 3.0.1 + dev: true - readable-stream@3.6.2: + /readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} dependencies: inherits: 2.0.4 string_decoder: 1.3.0 util-deprecate: 1.0.2 + dev: true - reading-time@1.5.0: {} + /reading-time@1.5.0: + resolution: {integrity: sha512-onYyVhBNr4CmAxFsKS7bz+uTLRakypIe4R+5A824vBSkQy/hB3fZepoVEf8OVAxzLvK+H/jm9TzpI3ETSm64Kg==} + dev: false - regenerator-runtime@0.14.1: {} + /regenerator-runtime@0.14.0: + resolution: {integrity: sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==} + dev: false - regexp.prototype.flags@1.5.2: + /regexp.prototype.flags@1.5.1: + resolution: {integrity: sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==} + engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.7 + call-bind: 1.0.5 define-properties: 1.2.1 - es-errors: 1.3.0 - set-function-name: 2.0.2 + set-function-name: 2.0.1 + dev: false - rehype-katex@7.0.0: + /rehype-katex@7.0.0: + resolution: {integrity: sha512-h8FPkGE00r2XKU+/acgqwWUlyzve1IiOKwsEkg4pDL3k48PiE0Pt+/uLtVHDVkN1yA4iurZN6UES8ivHVEQV6Q==} dependencies: - '@types/hast': 3.0.4 - '@types/katex': 0.16.7 + '@types/hast': 3.0.2 + '@types/katex': 0.16.5 hast-util-from-html-isomorphic: 2.0.0 - hast-util-to-text: 4.0.2 - katex: 0.16.10 + hast-util-to-text: 4.0.0 + katex: 0.16.9 unist-util-visit-parents: 6.0.1 vfile: 6.0.1 + dev: false - rehype-pretty-code@0.9.11(shiki@0.14.7): + /rehype-pretty-code@0.9.11(shiki@0.14.5): + resolution: {integrity: sha512-Eq90eCYXQJISktfRZ8PPtwc5SUyH6fJcxS8XOMnHPUQZBtC6RYo67gGlley9X2nR8vlniPj0/7oCDEYHKQa/oA==} + engines: {node: '>=16'} + peerDependencies: + shiki: '*' dependencies: - '@types/hast': 2.3.10 + '@types/hast': 2.3.7 hash-obj: 4.0.0 parse-numeric-range: 1.3.0 - shiki: 0.14.7 + shiki: 0.14.5 + dev: false - rehype-raw@7.0.0: + /rehype-raw@7.0.0: + resolution: {integrity: sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==} dependencies: - '@types/hast': 3.0.4 - hast-util-raw: 9.0.2 + '@types/hast': 3.0.2 + hast-util-raw: 9.0.1 vfile: 6.0.1 + dev: false - remark-code-import@1.2.0(patch_hash=heylvfasxh3ubj2edns2svea2m): + /remark-code-import@1.2.0(patch_hash=heylvfasxh3ubj2edns2svea2m): + resolution: {integrity: sha512-fgwLruqlZbVOIhCJFjY+JDwPZhA4/eK3InJzN8Ox8UDdtudpG212JwtRj6la+lAzJU7JmSEyewZSukVZdknt3Q==} + engines: {node: '>= 12'} dependencies: strip-indent: 4.0.0 to-gatsby-remark-plugin: 0.1.0 unist-util-visit: 4.1.2 + dev: true + patched: true - remark-frontmatter@5.0.0: + /remark-frontmatter@5.0.0: + resolution: {integrity: sha512-XTFYvNASMe5iPN0719nPrdItC9aU0ssC4v14mH1BCi1u0n1gAocqcujWUrByftZTbLhRtiKRyjYTSIOcr69UVQ==} dependencies: - '@types/mdast': 4.0.3 + '@types/mdast': 4.0.2 mdast-util-frontmatter: 2.0.1 micromark-extension-frontmatter: 2.0.0 unified: 11.0.4 transitivePeerDependencies: - supports-color + dev: true - remark-gfm@3.0.1: + /remark-gfm@3.0.1: + resolution: {integrity: sha512-lEFDoi2PICJyNrACFOfDD3JlLkuSbOa5Wd8EPt06HUdptv8Gn0bxYTdbU/XXQ3swAPkEaGxxPN9cbnMHvVu1Ig==} dependencies: - '@types/mdast': 3.0.15 + '@types/mdast': 3.0.14 mdast-util-gfm: 2.0.2 micromark-extension-gfm: 2.0.3 unified: 10.1.2 transitivePeerDependencies: - supports-color - remark-lint-blockquote-indentation@3.1.2: + /remark-lint-blockquote-indentation@3.1.2: + resolution: {integrity: sha512-5DOrFsZd5dXqA4p/VZvWSrqIWNFbBXjX7IV/FkVkxlNhNF/0FMf/4v8x1I2W3mzaZ7yDsWS/egpZnmligq1ckQ==} dependencies: - '@types/mdast': 3.0.15 + '@types/mdast': 3.0.14 pluralize: 8.0.0 unified: 10.1.2 unified-lint-rule: 2.1.2 unist-util-generated: 2.0.1 unist-util-position: 4.0.4 unist-util-visit: 4.1.2 + dev: true - remark-lint-checkbox-character-style@4.1.2: + /remark-lint-checkbox-character-style@4.1.2: + resolution: {integrity: sha512-5ITz+1cCuJ3Jv/Q7rKgDEucCOnIgjWDnSHPJA1tb4TI/D316h+ALbDhZIpP8gyfAm6sBAh3Pwz9XZJN2uJB5UQ==} dependencies: - '@types/mdast': 3.0.15 + '@types/mdast': 3.0.14 unified: 10.1.2 unified-lint-rule: 2.1.2 unist-util-position: 4.0.4 unist-util-visit: 4.1.2 + dev: true - remark-lint-code-block-style@3.1.2: + /remark-lint-code-block-style@3.1.2: + resolution: {integrity: sha512-3wsWmzzdyEsB9sOzBOf46TSkwwVKXN2JpTEQb6feN0Tl6Vg75F7T9MHqMz7aqk/56bOXSxUzdpXDscGBhziLRA==} dependencies: - '@types/mdast': 3.0.15 + '@types/mdast': 3.0.14 unified: 10.1.2 unified-lint-rule: 2.1.2 unist-util-generated: 2.0.1 unist-util-position: 4.0.4 unist-util-visit: 4.1.2 + dev: true - remark-lint-emphasis-marker@3.1.2: + /remark-lint-emphasis-marker@3.1.2: + resolution: {integrity: sha512-hPZ8vxZrIfxmLA5B66bA8y3PdHjcCQuaLsySIqi5PM2DkpN6a7zAP3v1znyRSaYJ1ANVWcu00/0bNzuUjflGCA==} dependencies: - '@types/mdast': 3.0.15 + '@types/mdast': 3.0.14 unified: 10.1.2 unified-lint-rule: 2.1.2 unist-util-position: 4.0.4 unist-util-visit: 4.1.2 + dev: true - remark-lint-fenced-code-marker@3.1.2: + /remark-lint-fenced-code-marker@3.1.2: + resolution: {integrity: sha512-6XNqjOuhT+0c7Q/22aCsMz61ne9g8HRpYF79EXQPdbzYa+PcfPXMiQKStONY3PfC8OE2/3WXI2zcs8w9x+8+VQ==} dependencies: - '@types/mdast': 3.0.15 + '@types/mdast': 3.0.14 unified: 10.1.2 unified-lint-rule: 2.1.2 unist-util-position: 4.0.4 unist-util-visit: 4.1.2 + dev: true - remark-lint-final-newline@2.1.2: + /remark-lint-final-newline@2.1.2: + resolution: {integrity: sha512-K0FdPGPyEB94PwNgopwVJFE8oRWi7IhY2ycXFVAMReI51el7EHB8F1gX14tB6p6zyGy6mUh69bCVU9mMTNeOUg==} dependencies: - '@types/mdast': 3.0.15 + '@types/mdast': 3.0.14 unified: 10.1.2 unified-lint-rule: 2.1.2 + dev: true - remark-lint-frontmatter-schema@3.15.4(patch_hash=jaxvkozlhcbn7zjsiti5ocoubi): + /remark-lint-frontmatter-schema@3.15.4(patch_hash=jaxvkozlhcbn7zjsiti5ocoubi): + resolution: {integrity: sha512-egChkbtCCG4hw1F2qoipzSxp6Ea9z4pxaVkWYa36DnCZ9fn3GhCNyOUjbFSIvdhVcWN+AqvHdqPbXC9Pp81Hmg==} dependencies: '@apidevtools/json-schema-ref-parser': 11.1.0 ajv: 8.12.0 @@ -7522,84 +6059,103 @@ snapshots: minimatch: 9.0.3 unified-lint-rule: 2.1.2 yaml: 2.3.3 + dev: true + patched: true - remark-lint-hard-break-spaces@3.1.2: + /remark-lint-hard-break-spaces@3.1.2: + resolution: {integrity: sha512-HaW0xsl3TI7VFAqGWWcZtPqyz0NWu19KKjSO7OGFTUJU4S9YiRnhIxmSFM0ZLSsVAynE+dhzVKa8U7dOpWDcOg==} dependencies: - '@types/mdast': 3.0.15 + '@types/mdast': 3.0.14 unified: 10.1.2 unified-lint-rule: 2.1.2 unist-util-generated: 2.0.1 unist-util-position: 4.0.4 unist-util-visit: 4.1.2 + dev: true - remark-lint-heading-style@3.1.2: + /remark-lint-heading-style@3.1.2: + resolution: {integrity: sha512-0RkcRPV/H2bPFgeInzBkK1cWUwtFTm83I+Db/Z5tDY02GzKOosHLvxtJyj/1391/opAH1LYbHtHWffir99IUgw==} dependencies: - '@types/mdast': 3.0.15 + '@types/mdast': 3.0.14 mdast-util-heading-style: 2.0.1 unified: 10.1.2 unified-lint-rule: 2.1.2 unist-util-generated: 2.0.1 unist-util-visit: 4.1.2 + dev: true - remark-lint-link-title-style@3.1.2: + /remark-lint-link-title-style@3.1.2: + resolution: {integrity: sha512-if4MahYJVvQUWlrXDF8GSv4b9VtLSgMSDHeikQp1/hGYlihLl9uGw3nlL5Lf9DqTN0qaT6RPbXOjuuzHlk38sg==} dependencies: - '@types/mdast': 3.0.15 + '@types/mdast': 3.0.14 unified: 10.1.2 unified-lint-rule: 2.1.2 unist-util-position: 4.0.4 unist-util-visit: 4.1.2 vfile-location: 4.1.0 + dev: true - remark-lint-list-item-bullet-indent@4.1.2: + /remark-lint-list-item-bullet-indent@4.1.2: + resolution: {integrity: sha512-WgU5nooqIEm6f35opcbHKBzWrdFJA3XcyTfB3nv/v0KX43/h6qFGmmMJ5kEiaFExuQp3dZSdatWuY0YZ9YRbUg==} dependencies: - '@types/mdast': 3.0.15 + '@types/mdast': 3.0.14 pluralize: 8.0.0 unified: 10.1.2 unified-lint-rule: 2.1.2 unist-util-visit: 4.1.2 + dev: true - remark-lint-list-item-content-indent@3.1.2: + /remark-lint-list-item-content-indent@3.1.2: + resolution: {integrity: sha512-TB0pmrWiRaQW80Y/PILFQTnHDghRxXNzMwyawlP+DBF9gNom3pEBmb4ZlGQlN0aa3r8VWeIKdv1ylHrfXE0vqA==} dependencies: - '@types/mdast': 3.0.15 + '@types/mdast': 3.0.14 pluralize: 8.0.0 unified: 10.1.2 unified-lint-rule: 2.1.2 unist-util-position: 4.0.4 unist-util-visit: 4.1.2 + dev: true - remark-lint-list-item-indent@3.1.2: + /remark-lint-list-item-indent@3.1.2: + resolution: {integrity: sha512-tkrra1pxZVE4OVJGfN435u/v0ljruXU+dHzWiKDYeifquD4aWhJxvSApu7+FbE098D/4usVXgMxwFkNhrpZcSQ==} dependencies: - '@types/mdast': 3.0.15 + '@types/mdast': 3.0.14 pluralize: 8.0.0 unified: 10.1.2 unified-lint-rule: 2.1.2 unist-util-generated: 2.0.1 unist-util-position: 4.0.4 unist-util-visit: 4.1.2 + dev: true - remark-lint-no-blockquote-without-marker@5.1.2: + /remark-lint-no-blockquote-without-marker@5.1.2: + resolution: {integrity: sha512-QPbqsrt7EfpSWqTkZJ9tepabPIhBDlNqZkuxxMQYD0OQ2N+tHDUq3zE1JxI5ts1V9o/mWApgySocqGd3jlcKmQ==} dependencies: - '@types/mdast': 3.0.15 + '@types/mdast': 3.0.14 unified: 10.1.2 unified-lint-rule: 2.1.2 unist-util-generated: 2.0.1 unist-util-position: 4.0.4 unist-util-visit: 4.1.2 vfile-location: 4.1.0 + dev: true - remark-lint-no-duplicate-definitions@3.1.2: + /remark-lint-no-duplicate-definitions@3.1.2: + resolution: {integrity: sha512-vi0nXA7p+pjQOorZOkr9E+QDhG74JAdbzqglWPrWWNI3z2rUYWYHTNSyWJbwEXaIIcev1ZAw8SCAOis5MNm+pA==} dependencies: - '@types/mdast': 3.0.15 + '@types/mdast': 3.0.14 unified: 10.1.2 unified-lint-rule: 2.1.2 unist-util-generated: 2.0.1 unist-util-position: 4.0.4 unist-util-stringify-position: 3.0.3 unist-util-visit: 4.1.2 + dev: true - remark-lint-no-heading-content-indent@4.1.2: + /remark-lint-no-heading-content-indent@4.1.2: + resolution: {integrity: sha512-TTxFsm1f4ZHFxZQCuz7j0QK4RvP6oArTiwazKLr16yaZe1608ypogMek4A30j2xX8WuO9+2uBzLXCY5OBo5x5Q==} dependencies: - '@types/mdast': 3.0.15 + '@types/mdast': 3.0.14 mdast-util-heading-style: 2.0.1 pluralize: 8.0.0 unified: 10.1.2 @@ -7607,45 +6163,55 @@ snapshots: unist-util-generated: 2.0.1 unist-util-position: 4.0.4 unist-util-visit: 4.1.2 + dev: true - remark-lint-no-inline-padding@4.1.2: + /remark-lint-no-inline-padding@4.1.2: + resolution: {integrity: sha512-dGyhWsiqCZS3Slob0EVBUfsFBbdpMIBCvb56LlCgaHbnLsnNYx8PpF/wA5CgsN8BXIbXfRpyPB5cIJwIq5taYg==} dependencies: - '@types/mdast': 3.0.15 + '@types/mdast': 3.0.14 mdast-util-to-string: 3.2.0 unified: 10.1.2 unified-lint-rule: 2.1.2 unist-util-generated: 2.0.1 unist-util-visit: 4.1.2 + dev: true - remark-lint-no-literal-urls@3.1.2: + /remark-lint-no-literal-urls@3.1.2: + resolution: {integrity: sha512-4tV9JGLKxAMFSuWDMOqLozkFJ3HyRvhzgrPrxASoziaml23m7UXAozk5dkIrFny1cN2oG988Z8tORxX2FL1Ilw==} dependencies: - '@types/mdast': 3.0.15 + '@types/mdast': 3.0.14 mdast-util-to-string: 3.2.0 unified: 10.1.2 unified-lint-rule: 2.1.2 unist-util-generated: 2.0.1 unist-util-position: 4.0.4 unist-util-visit: 4.1.2 + dev: true - remark-lint-no-shortcut-reference-image@3.1.2: + /remark-lint-no-shortcut-reference-image@3.1.2: + resolution: {integrity: sha512-NX4XJFPyDeJJ77pmETxRj4oM/zayf7Lmn/O87HgExBkQIPz2NYbDeKD8QEyliLaV/oKA2rQufpzuFw55xa1Tww==} dependencies: - '@types/mdast': 3.0.15 + '@types/mdast': 3.0.14 unified: 10.1.2 unified-lint-rule: 2.1.2 unist-util-generated: 2.0.1 unist-util-visit: 4.1.2 + dev: true - remark-lint-no-shortcut-reference-link@3.1.2: + /remark-lint-no-shortcut-reference-link@3.1.2: + resolution: {integrity: sha512-/9iPN7FLKaaIzw4tLWKu7Rx0wAP7E2EuzIeentQlkY0rO/mMHipmT3IlgiebsAInKagzTY6TNFoG1rq2VnaCcA==} dependencies: - '@types/mdast': 3.0.15 + '@types/mdast': 3.0.14 unified: 10.1.2 unified-lint-rule: 2.1.2 unist-util-generated: 2.0.1 unist-util-visit: 4.1.2 + dev: true - remark-lint-no-undefined-references@4.2.1: + /remark-lint-no-undefined-references@4.2.1: + resolution: {integrity: sha512-HdNg5b2KiuNplcuVvRtsrUiROw557kAG1CiZYB7jQrrVWFgd86lKTa3bDiywe+87dGrGmHd3qQ28eZYTuHz2Nw==} dependencies: - '@types/mdast': 3.0.15 + '@types/mdast': 3.0.14 micromark-util-normalize-identifier: 1.1.0 unified: 10.1.2 unified-lint-rule: 2.1.2 @@ -7653,126 +6219,154 @@ snapshots: unist-util-position: 4.0.4 unist-util-visit: 4.1.2 vfile-location: 4.1.0 + dev: true - remark-lint-no-unused-definitions@3.1.2: + /remark-lint-no-unused-definitions@3.1.2: + resolution: {integrity: sha512-bOcaJAnjKxT3kASFquUA3fO9xem9wZhVqt8TbqjA84+G4n40qjaLXDs/4vq73aMsSde73K0f3j1u0pMe7et8yQ==} dependencies: - '@types/mdast': 3.0.15 + '@types/mdast': 3.0.14 unified: 10.1.2 unified-lint-rule: 2.1.2 unist-util-generated: 2.0.1 unist-util-visit: 4.1.2 + dev: true - remark-lint-ordered-list-marker-style@3.1.2: + /remark-lint-ordered-list-marker-style@3.1.2: + resolution: {integrity: sha512-62iVE/YQsA0Azaqt8yAJWPplWLS47kDLjXeC2PlRIAzCqbNt9qH3HId8vZ15QTSrp8rHmJwrCMdcqV6AZUi7gQ==} dependencies: - '@types/mdast': 3.0.15 + '@types/mdast': 3.0.14 unified: 10.1.2 unified-lint-rule: 2.1.2 unist-util-generated: 2.0.1 unist-util-position: 4.0.4 unist-util-visit: 4.1.2 + dev: true - remark-lint-rule-style@3.1.2: + /remark-lint-rule-style@3.1.2: + resolution: {integrity: sha512-0CsX2XcX9pIhAP5N7Y8mhYXp3/Ld+NvxXY1p0LHAq0NZu17UsZLuegvx/s25uFbQs08DcmSqyKnepU9qGGqmTQ==} dependencies: - '@types/mdast': 3.0.15 + '@types/mdast': 3.0.14 unified: 10.1.2 unified-lint-rule: 2.1.2 unist-util-position: 4.0.4 unist-util-visit: 4.1.2 + dev: true - remark-lint-strong-marker@3.1.2: + /remark-lint-strong-marker@3.1.2: + resolution: {integrity: sha512-U/g4wngmiI0Q6WBRQG6pZxnDS33Wt/0QYA3+KNFBDykoi1vXsDEorIqy3dEag9z6XHwcMvFDsff6VRUhaOJWQg==} dependencies: - '@types/mdast': 3.0.15 + '@types/mdast': 3.0.14 unified: 10.1.2 unified-lint-rule: 2.1.2 unist-util-position: 4.0.4 unist-util-visit: 4.1.2 + dev: true - remark-lint-table-cell-padding@4.1.3: + /remark-lint-table-cell-padding@4.1.3: + resolution: {integrity: sha512-N9xtnS6MG/H3srAMjqqaF26A7socr87pIgt64dr5rxoSbDRWRPChGQ8y7wKyV8VeyRNF37e3E5KB3bQVqjSYaQ==} dependencies: - '@types/mdast': 3.0.15 - '@types/unist': 2.0.10 + '@types/mdast': 3.0.14 + '@types/unist': 2.0.9 unified: 10.1.2 unified-lint-rule: 2.1.2 unist-util-position: 4.0.4 unist-util-visit: 4.1.2 + dev: true - remark-lint-table-pipe-alignment@3.1.3: + /remark-lint-table-pipe-alignment@3.1.3: + resolution: {integrity: sha512-bnE8WrB4kSrN+Yr+xN2GHWVgGukeSFU43qPMrpCzTyOSbzep366wORlFKqZmyFPEkIZ/uAUFS0Qm9DND66Yz/A==} dependencies: - '@types/mdast': 3.0.15 + '@types/mdast': 3.0.14 unified: 10.1.2 unified-lint-rule: 2.1.2 unist-util-position: 4.0.4 unist-util-visit: 4.1.2 + dev: true - remark-lint-table-pipes@4.1.2: + /remark-lint-table-pipes@4.1.2: + resolution: {integrity: sha512-Ex2cJDXA0hdD9CC5Nu0p3K5LP+AhzPvk4sIOSbevCTSRyCS/SkNk4CQ6pwWBxuPVuHQUkqXkT8lgu8wwr/9A3A==} dependencies: - '@types/mdast': 3.0.15 + '@types/mdast': 3.0.14 unified: 10.1.2 unified-lint-rule: 2.1.2 unist-util-position: 4.0.4 unist-util-visit: 4.1.2 + dev: true - remark-lint-unordered-list-marker-style@3.1.2: + /remark-lint-unordered-list-marker-style@3.1.2: + resolution: {integrity: sha512-JFiyB4ZprJGGndCaFB8FssXd48m4Kh+CUqzNgu3lBLEiW8dEAGRlD9M2AzyyA+Q29WJP/FntDCbP22DeON91UA==} dependencies: - '@types/mdast': 3.0.15 + '@types/mdast': 3.0.14 unified: 10.1.2 unified-lint-rule: 2.1.2 unist-util-generated: 2.0.1 unist-util-position: 4.0.4 unist-util-visit: 4.1.2 + dev: true - remark-lint@9.1.2: + /remark-lint@9.1.2: + resolution: {integrity: sha512-m9e/aPlh7tsvfJfj8tPxrQzD6oEdb9Foko+Ya/6OwUP9EoGMfehv1Qtv26W1DoH58Wn8rT8CD+KuprTWscMmIA==} dependencies: - '@types/mdast': 3.0.15 + '@types/mdast': 3.0.14 remark-message-control: 7.1.1 unified: 10.1.2 transitivePeerDependencies: - supports-color + dev: true - remark-math@5.1.1: + /remark-math@5.1.1: + resolution: {integrity: sha512-cE5T2R/xLVtfFI4cCePtiRn+e6jKMtFDR3P8V3qpv8wpKjwvHoBA4eJzvX+nVrnlNy0911bdGmuspCSwetfYHw==} dependencies: - '@types/mdast': 3.0.15 + '@types/mdast': 3.0.14 mdast-util-math: 2.0.2 micromark-extension-math: 2.1.2 unified: 10.1.2 + dev: false - remark-mdx@2.3.0: + /remark-mdx@2.3.0: + resolution: {integrity: sha512-g53hMkpM0I98MU266IzDFMrTD980gNF3BJnkyFcmN+dD873mQeD5rdMO3Y2X+x8umQfbSE0PcoEDl7ledSA+2g==} dependencies: mdast-util-mdx: 2.0.1 micromark-extension-mdxjs: 1.0.1 transitivePeerDependencies: - supports-color - remark-message-control@7.1.1: + /remark-message-control@7.1.1: + resolution: {integrity: sha512-xKRWl1NTBOKed0oEtCd8BUfH5m4s8WXxFFSoo7uUwx6GW/qdCy4zov5LfPyw7emantDmhfWn5PdIZgcbVcWMDQ==} dependencies: - '@types/mdast': 3.0.15 + '@types/mdast': 3.0.14 mdast-comment-marker: 2.1.2 unified: 10.1.2 unified-message-control: 4.0.0 vfile: 5.3.7 transitivePeerDependencies: - supports-color + dev: true - remark-parse@10.0.2: + /remark-parse@10.0.2: + resolution: {integrity: sha512-3ydxgHa/ZQzG8LvC7jTXccARYDcRld3VfcgIIFs7bI6vbRSxJJmzgLEIIoYKyrfhaY+ujuWaf/PJiMZXoiCXgw==} dependencies: - '@types/mdast': 3.0.15 + '@types/mdast': 3.0.14 mdast-util-from-markdown: 1.3.1 unified: 10.1.2 transitivePeerDependencies: - supports-color - remark-parse@11.0.0: + /remark-parse@11.0.0: + resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==} dependencies: - '@types/mdast': 4.0.3 + '@types/mdast': 4.0.2 mdast-util-from-markdown: 2.0.0 micromark-util-types: 2.0.0 unified: 11.0.4 transitivePeerDependencies: - supports-color + dev: true - remark-preset-lint-consistent@5.1.2: + /remark-preset-lint-consistent@5.1.2: + resolution: {integrity: sha512-RQrWBFmyIkKfXtp9P1Fui7UbGSfXth9nuvRJUVnO0vfevBJe02iyMZWPokXSwkDOI/cM539wj0i3vrQupz+v5A==} dependencies: - '@types/mdast': 3.0.15 + '@types/mdast': 3.0.14 remark-lint: 9.1.2 remark-lint-blockquote-indentation: 3.1.2 remark-lint-checkbox-character-style: 4.1.2 @@ -7789,10 +6383,12 @@ snapshots: unified: 10.1.2 transitivePeerDependencies: - supports-color + dev: true - remark-preset-lint-recommended@6.1.3: + /remark-preset-lint-recommended@6.1.3: + resolution: {integrity: sha512-DGjbeP2TsFmQeJflUiIvJWAOs1PxJt7SG3WQyMxOppkRr/up+mxWVkuv+6AUuaR0EsuaaFGz7WmZM5TrSSFWJw==} dependencies: - '@types/mdast': 3.0.15 + '@types/mdast': 3.0.14 remark-lint: 9.1.2 remark-lint-final-newline: 2.1.2 remark-lint-hard-break-spaces: 3.1.2 @@ -7811,528 +6407,833 @@ snapshots: unified: 10.1.2 transitivePeerDependencies: - supports-color + dev: true - remark-reading-time@2.0.1: + /remark-reading-time@2.0.1: + resolution: {integrity: sha512-fy4BKy9SRhtYbEHvp6AItbRTnrhiDGbqLQTSYVbQPGuRCncU1ubSsh9p/W5QZSxtYcUXv8KGL0xBgPLyNJA1xw==} dependencies: estree-util-is-identifier-name: 2.1.0 estree-util-value-to-estree: 1.3.0 reading-time: 1.5.0 unist-util-visit: 3.1.0 + dev: false - remark-rehype@10.1.0: + /remark-rehype@10.1.0: + resolution: {integrity: sha512-EFmR5zppdBp0WQeDVZ/b66CWJipB2q2VLNFMabzDSGR66Z2fQii83G5gTBbgGEnEEA0QRussvrFHxk1HWGJskw==} dependencies: - '@types/hast': 2.3.10 - '@types/mdast': 3.0.15 + '@types/hast': 2.3.7 + '@types/mdast': 3.0.14 mdast-util-to-hast: 12.3.0 unified: 10.1.2 + dev: false - remark-stringify@10.0.3: + /remark-stringify@10.0.3: + resolution: {integrity: sha512-koyOzCMYoUHudypbj4XpnAKFbkddRMYZHwghnxd7ue5210WzGw6kOBwauJTRUMq16jsovXx8dYNvSSWP89kZ3A==} dependencies: - '@types/mdast': 3.0.15 + '@types/mdast': 3.0.14 mdast-util-to-markdown: 1.5.0 unified: 10.1.2 + dev: true - remark-stringify@11.0.0: + /remark-stringify@11.0.0: + resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==} dependencies: - '@types/mdast': 4.0.3 + '@types/mdast': 4.0.2 mdast-util-to-markdown: 2.1.0 unified: 11.0.4 + dev: true - remark@15.0.1: + /remark@15.0.1: + resolution: {integrity: sha512-Eht5w30ruCXgFmxVUSlNWQ9iiimq07URKeFS3hNc8cUWy1llX4KDWfyEDZRycMc+znsN9Ux5/tJ/BFdgdOwA3A==} dependencies: - '@types/mdast': 4.0.3 + '@types/mdast': 4.0.2 remark-parse: 11.0.0 remark-stringify: 11.0.0 unified: 11.0.4 transitivePeerDependencies: - supports-color + dev: true - remove-accents@0.5.0: {} + /remove-accents@0.4.2: + resolution: {integrity: sha512-7pXIJqJOq5tFgG1A2Zxti3Ht8jJF337m4sowbuHsW30ZnkQFnDzy9qBNhgzX8ZLW4+UBcXiiR7SwR6pokHsxiA==} + dev: false - repeat-string@1.6.1: {} + /repeat-string@1.6.1: + resolution: {integrity: sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==} + engines: {node: '>=0.10'} + dev: true - require-from-string@2.0.2: {} + /require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + dev: true - resolve-from@4.0.0: {} + /resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + dev: true - resolve-from@5.0.0: {} + /resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + dev: true - reusify@1.0.4: {} + /reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - rimraf@3.0.2: + /rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + hasBin: true dependencies: glob: 7.2.3 + dev: true - rlp@2.2.7: + /rlp@2.2.7: + resolution: {integrity: sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ==} + hasBin: true dependencies: bn.js: 5.2.1 + dev: true + + /robust-predicates@3.0.2: + resolution: {integrity: sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==} + dev: false - robust-predicates@3.0.2: {} + /run-applescript@5.0.0: + resolution: {integrity: sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==} + engines: {node: '>=12'} + dependencies: + execa: 5.1.1 + dev: true - run-parallel@1.2.0: + /run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} dependencies: queue-microtask: 1.2.3 - rw@1.3.3: {} + /rw@1.3.3: + resolution: {integrity: sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==} + dev: false - sade@1.8.1: + /sade@1.8.1: + resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} + engines: {node: '>=6'} dependencies: mri: 1.2.0 - safe-buffer@5.2.1: {} + /safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + dev: true - safer-buffer@2.1.2: {} + /safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + dev: false - scheduler@0.23.2: + /scheduler@0.23.0: + resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==} dependencies: loose-envify: 1.4.0 + dev: false - scroll-into-view-if-needed@3.1.0: + /scroll-into-view-if-needed@3.1.0: + resolution: {integrity: sha512-49oNpRjWRvnU8NyGVmUaYG4jtTkNonFZI86MmGRDqBphEK2EXT9gdEUoQPZhuBM8yWHxCWbobltqYO5M4XrUvQ==} dependencies: compute-scroll-into-view: 3.1.0 + dev: false - scrypt-js@3.0.1: {} + /scrypt-js@3.0.1: + resolution: {integrity: sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==} + dev: true - search-insights@2.17.2: {} + /search-insights@2.15.0: + resolution: {integrity: sha512-ch2sPCUDD4sbPQdknVl9ALSi9H7VyoeVbsxznYz6QV55jJ8CI3EtwpO1i84keN4+hF5IeHWIeGvc08530JkVXQ==} + dev: false - section-matter@1.0.0: + /section-matter@1.0.0: + resolution: {integrity: sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==} + engines: {node: '>=4'} dependencies: extend-shallow: 2.0.1 kind-of: 6.0.3 - semver@7.6.0: + /semver@7.5.4: + resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} + engines: {node: '>=10'} + hasBin: true dependencies: lru-cache: 6.0.0 + dev: true - sentence-case@3.0.4: + /sentence-case@3.0.4: + resolution: {integrity: sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg==} dependencies: no-case: 3.0.4 tslib: 2.6.2 upper-case-first: 2.0.2 + dev: false - set-function-length@1.2.2: + /set-function-length@1.1.1: + resolution: {integrity: sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==} + engines: {node: '>= 0.4'} dependencies: - define-data-property: 1.1.4 - es-errors: 1.3.0 - function-bind: 1.1.2 - get-intrinsic: 1.2.4 + define-data-property: 1.1.1 + get-intrinsic: 1.2.2 gopd: 1.0.1 - has-property-descriptors: 1.0.2 + has-property-descriptors: 1.0.1 + dev: false - set-function-name@2.0.2: + /set-function-name@2.0.1: + resolution: {integrity: sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==} + engines: {node: '>= 0.4'} dependencies: - define-data-property: 1.1.4 - es-errors: 1.3.0 + define-data-property: 1.1.1 functions-have-names: 1.2.3 - has-property-descriptors: 1.0.2 + has-property-descriptors: 1.0.1 + dev: false - shebang-command@1.2.0: + /shebang-command@1.2.0: + resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} + engines: {node: '>=0.10.0'} dependencies: shebang-regex: 1.0.0 + dev: false - shebang-command@2.0.0: + /shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} dependencies: shebang-regex: 3.0.0 + dev: true - shebang-regex@1.0.0: {} + /shebang-regex@1.0.0: + resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==} + engines: {node: '>=0.10.0'} + dev: false - shebang-regex@3.0.0: {} + /shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + dev: true - shiki@0.14.7: + /shiki@0.14.5: + resolution: {integrity: sha512-1gCAYOcmCFONmErGTrS1fjzJLA7MGZmKzrBNX7apqSwhyITJg2O102uFzXUeBxNnEkDA9vHIKLyeKq0V083vIw==} dependencies: ansi-sequence-parser: 1.1.1 - jsonc-parser: 3.2.1 + jsonc-parser: 3.2.0 vscode-oniguruma: 1.7.0 vscode-textmate: 8.0.0 + dev: false - side-channel@1.0.6: + /side-channel@1.0.4: + resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - get-intrinsic: 1.2.4 + call-bind: 1.0.5 + get-intrinsic: 1.2.2 object-inspect: 1.13.1 + dev: false - signal-exit@3.0.7: {} + /signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} - signal-exit@4.1.0: {} + /signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + dev: true - slash@3.0.0: {} + /slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} - snake-case@3.0.4: + /snake-case@3.0.4: + resolution: {integrity: sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==} dependencies: dot-case: 3.0.4 tslib: 2.6.2 + dev: false - sort-keys@5.0.0: + /sort-keys@5.0.0: + resolution: {integrity: sha512-Pdz01AvCAottHTPQGzndktFNdbRA75BgOfeT1hH+AMnJFv8lynkPi42rfeEhpx1saTEI3YNMWxfqu0sFD1G8pw==} + engines: {node: '>=12'} dependencies: is-plain-obj: 4.1.0 + dev: false - source-map-js@1.2.0: {} + /source-map-js@1.0.2: + resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} + engines: {node: '>=0.10.0'} + dev: false - source-map@0.7.4: {} + /source-map@0.7.4: + resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} + engines: {node: '>= 8'} + dev: false - space-separated-tokens@2.0.2: {} + /space-separated-tokens@2.0.2: + resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} + dev: false - sprintf-js@1.0.3: {} + /sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} - stop-iteration-iterator@1.0.0: + /stop-iteration-iterator@1.0.0: + resolution: {integrity: sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==} + engines: {node: '>= 0.4'} dependencies: - internal-slot: 1.0.7 + internal-slot: 1.0.6 + dev: false - streamsearch@1.1.0: {} + /streamsearch@1.1.0: + resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} + engines: {node: '>=10.0.0'} + dev: false - string-width@4.2.3: + /string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} dependencies: emoji-regex: 8.0.0 is-fullwidth-code-point: 3.0.0 strip-ansi: 6.0.1 + dev: true - string-width@5.1.2: + /string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} dependencies: eastasianwidth: 0.2.0 emoji-regex: 9.2.2 strip-ansi: 7.1.0 + dev: true - string_decoder@1.3.0: + /string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} dependencies: safe-buffer: 5.2.1 + dev: true - stringify-entities@4.0.4: + /stringify-entities@4.0.3: + resolution: {integrity: sha512-BP9nNHMhhfcMbiuQKCqMjhDP5yBCAxsPu4pHFFzJ6Alo9dZgY4VLDPutXqIjpRiMoKdp7Av85Gr73Q5uH9k7+g==} dependencies: character-entities-html4: 2.1.0 character-entities-legacy: 3.0.0 - strip-ansi@6.0.1: + /strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} dependencies: ansi-regex: 5.0.1 + dev: true - strip-ansi@7.1.0: + /strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} dependencies: ansi-regex: 6.0.1 + dev: true + + /strip-bom-string@1.0.0: + resolution: {integrity: sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==} + engines: {node: '>=0.10.0'} + + /strip-eof@1.0.0: + resolution: {integrity: sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==} + engines: {node: '>=0.10.0'} + dev: false - strip-bom-string@1.0.0: {} + /strip-final-newline@2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + dev: true - strip-eof@1.0.0: {} + /strip-final-newline@3.0.0: + resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} + engines: {node: '>=12'} + dev: true - strip-hex-prefix@1.0.0: + /strip-hex-prefix@1.0.0: + resolution: {integrity: sha512-q8d4ue7JGEiVcypji1bALTos+0pWtyGlivAWyPuTkHzuTCJqrK9sWxYQZUq6Nq3cuyv3bm734IhHvHtGGURU6A==} + engines: {node: '>=6.5.0', npm: '>=3'} dependencies: is-hex-prefixed: 1.0.0 + dev: true - strip-indent@4.0.0: + /strip-indent@4.0.0: + resolution: {integrity: sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA==} + engines: {node: '>=12'} dependencies: min-indent: 1.0.1 + dev: true - strip-json-comments@3.1.1: {} + /strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + dev: true - style-to-object@0.4.4: + /style-to-object@0.4.4: + resolution: {integrity: sha512-HYNoHZa2GorYNyqiCaBgsxvcJIn7OHq6inEga+E6Ke3m5JkoqpQbnFssk4jwe+K7AhGa2fcha4wSOf1Kn01dMg==} dependencies: inline-style-parser: 0.1.1 + dev: false - styled-jsx@5.1.1(react@18.3.1): + /styled-jsx@5.1.1(react@18.2.0): + resolution: {integrity: sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==} + engines: {node: '>= 12.0.0'} + peerDependencies: + '@babel/core': '*' + babel-plugin-macros: '*' + react: '>= 16.8.0 || 17.x.x || ^18.0.0-0' + peerDependenciesMeta: + '@babel/core': + optional: true + babel-plugin-macros: + optional: true dependencies: client-only: 0.0.1 - react: 18.3.1 + react: 18.2.0 + dev: false - stylis@4.3.2: {} + /stylis@4.3.0: + resolution: {integrity: sha512-E87pIogpwUsUwXw7dNyU4QDjdgVMy52m+XEOPEKUn161cCzWjjhPSQhByfd1CcNvrOLnXQ6OnnZDwnJrz/Z4YQ==} + dev: false - supports-color@4.5.0: + /supports-color@4.5.0: + resolution: {integrity: sha512-ycQR/UbvI9xIlEdQT1TQqwoXtEldExbCEAJgRo5YXlmSKjv6ThHnP9/vwGa1gr19Gfw+LkFd7KqYMhzrRC5JYw==} + engines: {node: '>=4'} dependencies: has-flag: 2.0.0 + dev: false - supports-color@5.5.0: + /supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} dependencies: has-flag: 3.0.0 - supports-color@7.2.0: + /supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} dependencies: has-flag: 4.0.0 - supports-color@9.4.0: {} + /supports-color@9.4.0: + resolution: {integrity: sha512-VL+lNrEoIXww1coLPOmiEmK/0sGigko5COxI09KzHc2VJXJsQ37UaQ+8quuxjDeA7+KnLGTWRyOXSLLR2Wb4jw==} + engines: {node: '>=12'} + dev: true - synckit@0.9.0: + /synckit@0.8.5: + resolution: {integrity: sha512-L1dapNV6vu2s/4Sputv8xGsCdAVlb5nRDMFU/E27D44l5U6cw1g0dGd45uLc+OXjNMmF4ntiMdCimzcjFKQI8Q==} + engines: {node: ^14.18.0 || >=16.0.0} dependencies: - '@pkgr/core': 0.1.1 + '@pkgr/utils': 2.4.2 tslib: 2.6.2 + dev: true - tabbable@6.2.0: {} + /tabbable@6.2.0: + resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==} + dev: false - text-table@0.2.0: {} + /text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + dev: true - tinyurl@1.1.7: {} + /tinyurl@1.1.7: + resolution: {integrity: sha512-NCnyDkBTByS/pLH/Vrx/DPL8EciAUDoAvruaM/WnQLfX6Uame3D1nuWNy2Z9CXw7rcsok0tjuonRLolhmyz5rg==} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. + dev: true - title@3.5.3: + /title@3.5.3: + resolution: {integrity: sha512-20JyowYglSEeCvZv3EZ0nZ046vLarO37prvV0mbtQV7C8DJPGgN967r8SJkqd3XK3K3lD3/Iyfp3avjfil8Q2Q==} + hasBin: true dependencies: arg: 1.0.0 chalk: 2.3.0 clipboardy: 1.2.2 titleize: 1.0.0 + dev: false - titleize@1.0.0: {} + /titleize@1.0.0: + resolution: {integrity: sha512-TARUb7z1pGvlLxgPk++7wJ6aycXF3GJ0sNSBTAsTuJrQG5QuZlkUQP+zl+nbjAh4gMX9yDw9ZYklMd7vAfJKEw==} + engines: {node: '>=0.10.0'} + dev: false + + /titleize@3.0.0: + resolution: {integrity: sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==} + engines: {node: '>=12'} + dev: true - to-gatsby-remark-plugin@0.1.0: + /to-gatsby-remark-plugin@0.1.0: + resolution: {integrity: sha512-blmhJ/gIrytWnWLgPSRCkhCPeki6UBK2daa3k9mGahN7GjwHu8KrS7F70MvwlsG7IE794JLgwAdCbi4hU4faFQ==} dependencies: to-vfile: 6.1.0 + dev: true - to-regex-range@5.0.1: + /to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} dependencies: is-number: 7.0.0 - to-vfile@6.1.0: + /to-vfile@6.1.0: + resolution: {integrity: sha512-BxX8EkCxOAZe+D/ToHdDsJcVI4HqQfmw0tCkp31zf3dNP/XWIAjU4CmeuSwsSoOzOTqHPOL0KUzyZqJplkD0Qw==} dependencies: is-buffer: 2.0.5 vfile: 4.2.1 + dev: true - to-vfile@7.2.4: + /to-vfile@7.2.4: + resolution: {integrity: sha512-2eQ+rJ2qGbyw3senPI0qjuM7aut8IYXK6AEoOWb+fJx/mQYzviTckm1wDjq91QYHAPBTYzmdJXxMFA6Mk14mdw==} dependencies: is-buffer: 2.0.5 vfile: 5.3.7 + dev: true - tr46@0.0.3: {} + /tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + dev: true - treeify@1.1.0: {} + /treeify@1.1.0: + resolution: {integrity: sha512-1m4RA7xVAJrSGrrXGs0L3YTwyvBs2S8PbRHaLZAkFw7JR8oIFwYtysxlBZhYIa7xSyiYJKZ3iGrrk55cGA3i9A==} + engines: {node: '>=0.6'} + dev: true - trim-lines@3.0.1: {} + /trim-lines@3.0.1: + resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} + dev: false - trough@2.2.0: {} + /trough@2.1.0: + resolution: {integrity: sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g==} - ts-dedent@2.2.0: {} + /ts-dedent@2.2.0: + resolution: {integrity: sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==} + engines: {node: '>=6.10'} + dev: false - tslib@2.6.2: {} + /tslib@2.6.2: + resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} - type-check@0.4.0: + /type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} dependencies: prelude-ls: 1.2.1 + dev: true - type-detect@4.0.8: {} + /type-detect@4.0.8: + resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} + engines: {node: '>=4'} + dev: true - type-fest@0.20.2: {} + /type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + dev: true - type-fest@1.4.0: {} + /type-fest@1.4.0: + resolution: {integrity: sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==} + engines: {node: '>=10'} - typedarray-to-buffer@3.1.5: + /typedarray-to-buffer@3.1.5: + resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} dependencies: is-typedarray: 1.0.0 + dev: true - typedarray@0.0.6: {} + /typedarray@0.0.6: + resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} + dev: true - typescript@5.4.5: {} + /typescript@5.3.2: + resolution: {integrity: sha512-6l+RyNy7oAHDfxC4FzSJcz9vnjTKxrLpDG5M2Vu4SHRVNg6xzqZp6LYSR9zjqQTu8DU/f5xwxUdADOkbrIX2gQ==} + engines: {node: '>=14.17'} + hasBin: true - unified-engine@10.1.0: + /unified-engine@10.1.0: + resolution: {integrity: sha512-5+JDIs4hqKfHnJcVCxTid1yBoI/++FfF/1PFdSMpaftZZZY+qg2JFruRbf7PaIwa9KgLotXQV3gSjtY0IdcFGQ==} dependencies: '@types/concat-stream': 2.0.3 - '@types/debug': 4.1.12 + '@types/debug': 4.1.11 '@types/is-empty': 1.2.3 '@types/node': 18.11.10 - '@types/unist': 2.0.10 + '@types/unist': 2.0.9 concat-stream: 2.0.0 debug: 4.3.4 fault: 2.0.1 glob: 8.1.0 - ignore: 5.3.1 + ignore: 5.3.0 is-buffer: 2.0.5 is-empty: 1.2.0 is-plain-obj: 4.1.0 load-plugin: 5.1.0 parse-json: 6.0.2 to-vfile: 7.2.4 - trough: 2.2.0 + trough: 2.1.0 unist-util-inspect: 7.0.2 vfile-message: 3.1.4 vfile-reporter: 7.0.5 vfile-statistics: 2.0.1 - yaml: 2.4.2 + yaml: 2.3.4 transitivePeerDependencies: - supports-color + dev: true - unified-lint-rule@2.1.2: + /unified-lint-rule@2.1.2: + resolution: {integrity: sha512-JWudPtRN7TLFHVLEVZ+Rm8FUb6kCAtHxEXFgBGDxRSdNMnGyTU5zyYvduHSF/liExlFB3vdFvsAHnNVE/UjAwA==} dependencies: - '@types/unist': 2.0.10 - trough: 2.2.0 + '@types/unist': 2.0.9 + trough: 2.1.0 unified: 10.1.2 vfile: 5.3.7 + dev: true - unified-message-control@4.0.0: + /unified-message-control@4.0.0: + resolution: {integrity: sha512-1b92N+VkPHftOsvXNOtkJm4wHlr+UDmTBF2dUzepn40oy9NxanJ9xS1RwUBTjXJwqr2K0kMbEyv1Krdsho7+Iw==} dependencies: - '@types/unist': 2.0.10 + '@types/unist': 2.0.9 unist-util-is: 5.2.1 unist-util-visit: 3.1.0 vfile: 5.3.7 vfile-location: 4.1.0 vfile-message: 3.1.4 + dev: true - unified@10.1.2: + /unified@10.1.2: + resolution: {integrity: sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==} dependencies: - '@types/unist': 2.0.10 + '@types/unist': 2.0.9 bail: 2.0.2 extend: 3.0.2 is-buffer: 2.0.5 is-plain-obj: 4.1.0 - trough: 2.2.0 + trough: 2.1.0 vfile: 5.3.7 - unified@11.0.4: + /unified@11.0.4: + resolution: {integrity: sha512-apMPnyLjAX+ty4OrNap7yumyVAMlKx5IWU2wlzzUdYJO9A8f1p9m/gywF/GM2ZDFcjQPrx59Mc90KwmxsoklxQ==} dependencies: - '@types/unist': 3.0.2 + '@types/unist': 3.0.1 bail: 2.0.2 devlop: 1.1.0 extend: 3.0.2 is-plain-obj: 4.1.0 - trough: 2.2.0 + trough: 2.1.0 vfile: 6.0.1 + dev: true - unique-string@3.0.0: + /unique-string@3.0.0: + resolution: {integrity: sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==} + engines: {node: '>=12'} dependencies: crypto-random-string: 4.0.0 + dev: true - unist-util-find-after@5.0.0: + /unist-util-find-after@5.0.0: + resolution: {integrity: sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==} dependencies: - '@types/unist': 3.0.2 + '@types/unist': 3.0.1 unist-util-is: 6.0.0 + dev: false - unist-util-generated@2.0.1: {} + /unist-util-generated@2.0.1: + resolution: {integrity: sha512-qF72kLmPxAw0oN2fwpWIqbXAVyEqUzDHMsbtPvOudIlUzXYFIeQIuxXQCRCFh22B7cixvU0MG7m3MW8FTq/S+A==} - unist-util-inspect@7.0.2: + /unist-util-inspect@7.0.2: + resolution: {integrity: sha512-Op0XnmHUl6C2zo/yJCwhXQSm/SmW22eDZdWP2qdf4WpGrgO1ZxFodq+5zFyeRGasFjJotAnLgfuD1jkcKqiH1Q==} dependencies: - '@types/unist': 2.0.10 + '@types/unist': 2.0.9 + dev: true - unist-util-is@5.2.1: + /unist-util-is@5.2.1: + resolution: {integrity: sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==} dependencies: - '@types/unist': 2.0.10 + '@types/unist': 2.0.9 - unist-util-is@6.0.0: + /unist-util-is@6.0.0: + resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} dependencies: - '@types/unist': 3.0.2 + '@types/unist': 3.0.1 - unist-util-position-from-estree@1.1.2: + /unist-util-position-from-estree@1.1.2: + resolution: {integrity: sha512-poZa0eXpS+/XpoQwGwl79UUdea4ol2ZuCYguVaJS4qzIOMDzbqz8a3erUCOmubSZkaOuGamb3tX790iwOIROww==} dependencies: - '@types/unist': 2.0.10 + '@types/unist': 2.0.9 - unist-util-position@4.0.4: + /unist-util-position@4.0.4: + resolution: {integrity: sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg==} dependencies: - '@types/unist': 2.0.10 + '@types/unist': 2.0.9 - unist-util-position@5.0.0: + /unist-util-position@5.0.0: + resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} dependencies: - '@types/unist': 3.0.2 + '@types/unist': 3.0.1 + dev: false - unist-util-remove-position@4.0.2: + /unist-util-remove-position@4.0.2: + resolution: {integrity: sha512-TkBb0HABNmxzAcfLf4qsIbFbaPDvMO6wa3b3j4VcEzFVaw1LBKwnW4/sRJ/atSLSzoIg41JWEdnE7N6DIhGDGQ==} dependencies: - '@types/unist': 2.0.10 + '@types/unist': 2.0.9 unist-util-visit: 4.1.2 - unist-util-remove-position@5.0.0: + /unist-util-remove-position@5.0.0: + resolution: {integrity: sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==} dependencies: - '@types/unist': 3.0.2 + '@types/unist': 3.0.1 unist-util-visit: 5.0.0 + dev: false - unist-util-remove@4.0.0: + /unist-util-remove@4.0.0: + resolution: {integrity: sha512-b4gokeGId57UVRX/eVKej5gXqGlc9+trkORhFJpu9raqZkZhU0zm8Doi05+HaiBsMEIJowL+2WtQ5ItjsngPXg==} dependencies: - '@types/unist': 3.0.2 + '@types/unist': 3.0.1 unist-util-is: 6.0.0 unist-util-visit-parents: 6.0.1 + dev: false - unist-util-stringify-position@2.0.3: + /unist-util-stringify-position@2.0.3: + resolution: {integrity: sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==} dependencies: - '@types/unist': 2.0.10 + '@types/unist': 2.0.9 + dev: true - unist-util-stringify-position@3.0.3: + /unist-util-stringify-position@3.0.3: + resolution: {integrity: sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==} dependencies: - '@types/unist': 2.0.10 + '@types/unist': 2.0.9 - unist-util-stringify-position@4.0.0: + /unist-util-stringify-position@4.0.0: + resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} dependencies: - '@types/unist': 3.0.2 + '@types/unist': 3.0.1 - unist-util-visit-parents@4.1.1: + /unist-util-visit-parents@4.1.1: + resolution: {integrity: sha512-1xAFJXAKpnnJl8G7K5KgU7FY55y3GcLIXqkzUj5QF/QVP7biUm0K0O2oqVkYsdjzJKifYeWn9+o6piAK2hGSHw==} dependencies: - '@types/unist': 2.0.10 + '@types/unist': 2.0.9 unist-util-is: 5.2.1 - unist-util-visit-parents@5.1.3: + /unist-util-visit-parents@5.1.3: + resolution: {integrity: sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==} dependencies: - '@types/unist': 2.0.10 + '@types/unist': 2.0.9 unist-util-is: 5.2.1 - unist-util-visit-parents@6.0.1: + /unist-util-visit-parents@6.0.1: + resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==} dependencies: - '@types/unist': 3.0.2 + '@types/unist': 3.0.1 unist-util-is: 6.0.0 - unist-util-visit@3.1.0: + /unist-util-visit@3.1.0: + resolution: {integrity: sha512-Szoh+R/Ll68QWAyQyZZpQzZQm2UPbxibDvaY8Xc9SUtYgPsDzx5AWSk++UUt2hJuow8mvwR+rG+LQLw+KsuAKA==} dependencies: - '@types/unist': 2.0.10 + '@types/unist': 2.0.9 unist-util-is: 5.2.1 unist-util-visit-parents: 4.1.1 - unist-util-visit@4.1.2: + /unist-util-visit@4.1.2: + resolution: {integrity: sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==} dependencies: - '@types/unist': 2.0.10 + '@types/unist': 2.0.9 unist-util-is: 5.2.1 unist-util-visit-parents: 5.1.3 - unist-util-visit@5.0.0: + /unist-util-visit@5.0.0: + resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} dependencies: - '@types/unist': 3.0.2 + '@types/unist': 3.0.1 unist-util-is: 6.0.0 unist-util-visit-parents: 6.0.1 - upper-case-first@2.0.2: + /untildify@4.0.0: + resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==} + engines: {node: '>=8'} + dev: true + + /upper-case-first@2.0.2: + resolution: {integrity: sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==} dependencies: tslib: 2.6.2 + dev: false - upper-case@2.0.2: + /upper-case@2.0.2: + resolution: {integrity: sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg==} dependencies: tslib: 2.6.2 + dev: false - uri-js@4.4.1: + /uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} dependencies: punycode: 2.3.1 + dev: true - utf8@3.0.0: {} + /utf8@3.0.0: + resolution: {integrity: sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ==} + dev: true - util-deprecate@1.0.2: {} + /util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + dev: true - uuid@9.0.1: {} + /uuid@9.0.1: + resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} + hasBin: true + dev: false - uvu@0.5.6: + /uvu@0.5.6: + resolution: {integrity: sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA==} + engines: {node: '>=8'} + hasBin: true dependencies: dequal: 2.0.3 - diff: 5.2.0 + diff: 5.1.0 kleur: 4.1.5 sade: 1.8.1 - vfile-location@4.1.0: + /vfile-location@4.1.0: + resolution: {integrity: sha512-YF23YMyASIIJXpktBa4vIGLJ5Gs88UB/XePgqPmTa7cDA+JeO3yclbpheQYCHjVHBn/yePzrXuygIL+xbvRYHw==} dependencies: - '@types/unist': 2.0.10 + '@types/unist': 2.0.9 vfile: 5.3.7 + dev: true - vfile-location@5.0.2: + /vfile-location@5.0.2: + resolution: {integrity: sha512-NXPYyxyBSH7zB5U6+3uDdd6Nybz6o6/od9rk8bp9H8GR3L+cm/fC0uUTbqBmUTnMCUDslAGBOIKNfvvb+gGlDg==} dependencies: - '@types/unist': 3.0.2 + '@types/unist': 3.0.1 vfile: 6.0.1 + dev: false - vfile-matter@3.0.1: + /vfile-matter@3.0.1: + resolution: {integrity: sha512-CAAIDwnh6ZdtrqAuxdElUqQRQDQgbbIrYtDYI8gCjXS1qQ+1XdLoK8FIZWxJwn0/I+BkSSZpar3SOgjemQz4fg==} dependencies: - '@types/js-yaml': 4.0.9 + '@types/js-yaml': 4.0.8 is-buffer: 2.0.5 js-yaml: 4.1.0 + dev: false - vfile-message@2.0.4: + /vfile-message@2.0.4: + resolution: {integrity: sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==} dependencies: - '@types/unist': 2.0.10 + '@types/unist': 2.0.9 unist-util-stringify-position: 2.0.3 + dev: true - vfile-message@3.1.4: + /vfile-message@3.1.4: + resolution: {integrity: sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==} dependencies: - '@types/unist': 2.0.10 + '@types/unist': 2.0.9 unist-util-stringify-position: 3.0.3 - vfile-message@4.0.2: + /vfile-message@4.0.2: + resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==} dependencies: - '@types/unist': 3.0.2 + '@types/unist': 3.0.1 unist-util-stringify-position: 4.0.0 - vfile-reporter@7.0.5: + /vfile-reporter@7.0.5: + resolution: {integrity: sha512-NdWWXkv6gcd7AZMvDomlQbK3MqFWL1RlGzMn++/O2TI+68+nqxCPTvLugdOtfSzXmjh+xUyhp07HhlrbJjT+mw==} dependencies: '@types/supports-color': 8.1.3 string-width: 5.1.2 @@ -8342,158 +7243,259 @@ snapshots: vfile-message: 3.1.4 vfile-sort: 3.0.1 vfile-statistics: 2.0.1 + dev: true - vfile-sort@3.0.1: + /vfile-sort@3.0.1: + resolution: {integrity: sha512-1os1733XY6y0D5x0ugqSeaVJm9lYgj0j5qdcZQFyxlZOSy1jYarL77lLyb5gK4Wqr1d5OxmuyflSO3zKyFnTFw==} dependencies: vfile: 5.3.7 vfile-message: 3.1.4 + dev: true - vfile-statistics@2.0.1: + /vfile-statistics@2.0.1: + resolution: {integrity: sha512-W6dkECZmP32EG/l+dp2jCLdYzmnDBIw6jwiLZSER81oR5AHRcVqL+k3Z+pfH1R73le6ayDkJRMk0sutj1bMVeg==} dependencies: vfile: 5.3.7 vfile-message: 3.1.4 + dev: true - vfile@4.2.1: + /vfile@4.2.1: + resolution: {integrity: sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==} dependencies: - '@types/unist': 2.0.10 + '@types/unist': 2.0.9 is-buffer: 2.0.5 unist-util-stringify-position: 2.0.3 vfile-message: 2.0.4 + dev: true - vfile@5.3.7: + /vfile@5.3.7: + resolution: {integrity: sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==} dependencies: - '@types/unist': 2.0.10 + '@types/unist': 2.0.9 is-buffer: 2.0.5 unist-util-stringify-position: 3.0.3 vfile-message: 3.1.4 - vfile@6.0.1: + /vfile@6.0.1: + resolution: {integrity: sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw==} dependencies: - '@types/unist': 3.0.2 + '@types/unist': 3.0.1 unist-util-stringify-position: 4.0.0 vfile-message: 4.0.2 - viem@2.9.28(typescript@5.4.5)(zod@3.23.8): + /viem@1.19.6(typescript@5.3.2): + resolution: {integrity: sha512-WSBHBMurWIWQk2yisOD8hqSA5S56cZu6onty3hzauVjiHMildtVWujF7YT0xjoU40GpFODvJASRR2RFdzgvUUg==} + peerDependencies: + typescript: '>=5.0.4' + peerDependenciesMeta: + typescript: + optional: true dependencies: '@adraffy/ens-normalize': 1.10.0 '@noble/curves': 1.2.0 '@noble/hashes': 1.3.2 '@scure/bip32': 1.3.2 '@scure/bip39': 1.2.1 - abitype: 1.0.0(typescript@5.4.5)(zod@3.23.8) + abitype: 0.9.8(typescript@5.3.2) isows: 1.0.3(ws@8.13.0) + typescript: 5.3.2 ws: 8.13.0 - optionalDependencies: - typescript: 5.4.5 transitivePeerDependencies: - bufferutil - utf-8-validate - zod + dev: false - vscode-languageserver-textdocument@1.0.11: {} + /vscode-languageserver-textdocument@1.0.11: + resolution: {integrity: sha512-X+8T3GoiwTVlJbicx/sIAF+yuJAqz8VvwJyoMVhwEMoEKE/fkDmrqUgDMyBECcM2A2frVZIUj5HI/ErRXCfOeA==} + dev: true - vscode-oniguruma@1.7.0: {} + /vscode-oniguruma@1.7.0: + resolution: {integrity: sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==} + dev: false - vscode-textmate@8.0.0: {} + /vscode-textmate@8.0.0: + resolution: {integrity: sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg==} + dev: false - vscode-uri@3.0.8: {} + /vscode-uri@3.0.8: + resolution: {integrity: sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==} + dev: true - walk-up-path@3.0.1: {} + /walk-up-path@3.0.1: + resolution: {integrity: sha512-9YlCL/ynK3CTlrSRrDxZvUauLzAswPCrsaCgilqFevUYpeEW0/3ScEjaa3kbW/T0ghhkEr7mv+fpjqn1Y1YuTA==} + dev: true - web-namespaces@2.0.1: {} + /web-namespaces@2.0.1: + resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} + dev: false - web-worker@1.3.0: {} + /web-worker@1.2.0: + resolution: {integrity: sha512-PgF341avzqyx60neE9DD+XS26MMNMoUQRz9NOZwW32nPQrF6p77f1htcnjBSEV8BGMKZ16choqUG4hyI0Hx7mA==} + dev: false - web3-utils@1.10.4: + /web3-utils@1.10.3: + resolution: {integrity: sha512-OqcUrEE16fDBbGoQtZXWdavsPzbGIDc5v3VrRTZ0XrIpefC/viZ1ZU9bGEemazyS0catk/3rkOOxpzTfY+XsyQ==} + engines: {node: '>=8.0.0'} dependencies: '@ethereumjs/util': 8.1.0 bn.js: 5.2.1 - ethereum-bloom-filters: 1.1.0 - ethereum-cryptography: 2.1.3 + ethereum-bloom-filters: 1.0.10 + ethereum-cryptography: 2.1.2 ethjs-unit: 0.1.6 number-to-bn: 1.7.0 randombytes: 2.1.0 utf8: 3.0.0 + dev: true - webidl-conversions@3.0.1: {} + /webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + dev: true - whatwg-url@5.0.0: + /whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} dependencies: tr46: 0.0.3 webidl-conversions: 3.0.1 + dev: true - which-boxed-primitive@1.0.2: + /which-boxed-primitive@1.0.2: + resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} dependencies: is-bigint: 1.0.4 is-boolean-object: 1.1.2 is-number-object: 1.0.7 is-string: 1.0.7 is-symbol: 1.0.4 + dev: false - which-collection@1.0.2: + /which-collection@1.0.1: + resolution: {integrity: sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==} dependencies: - is-map: 2.0.3 - is-set: 2.0.3 - is-weakmap: 2.0.2 - is-weakset: 2.0.3 + is-map: 2.0.2 + is-set: 2.0.2 + is-weakmap: 2.0.1 + is-weakset: 2.0.2 + dev: false - which-typed-array@1.1.15: + /which-typed-array@1.1.13: + resolution: {integrity: sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==} + engines: {node: '>= 0.4'} dependencies: - available-typed-arrays: 1.0.7 - call-bind: 1.0.7 + available-typed-arrays: 1.0.5 + call-bind: 1.0.5 for-each: 0.3.3 gopd: 1.0.1 - has-tostringtag: 1.0.2 + has-tostringtag: 1.0.0 + dev: false - which@1.3.1: + /which@1.3.1: + resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} + hasBin: true dependencies: isexe: 2.0.0 + dev: false - which@2.0.2: + /which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true dependencies: isexe: 2.0.0 + dev: true - word-wrap@1.2.5: {} - - wrap-ansi@7.0.0: + /wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} dependencies: ansi-styles: 4.3.0 string-width: 4.2.3 strip-ansi: 6.0.1 + dev: true - wrap-ansi@8.1.0: + /wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} dependencies: ansi-styles: 6.2.1 string-width: 5.1.2 strip-ansi: 7.1.0 + dev: true - wrappy@1.0.2: {} + /wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + dev: true - write-file-atomic@3.0.3: + /write-file-atomic@3.0.3: + resolution: {integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==} dependencies: imurmurhash: 0.1.4 is-typedarray: 1.0.0 signal-exit: 3.0.7 typedarray-to-buffer: 3.1.5 + dev: true - ws@7.4.6: {} + /ws@7.4.6: + resolution: {integrity: sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==} + engines: {node: '>=8.3.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + dev: true - ws@8.13.0: {} + /ws@8.13.0: + resolution: {integrity: sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + dev: false - xdg-basedir@5.1.0: {} + /xdg-basedir@5.1.0: + resolution: {integrity: sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ==} + engines: {node: '>=12'} + dev: true - yallist@2.1.2: {} + /yallist@2.1.2: + resolution: {integrity: sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==} + dev: false - yallist@4.0.0: {} + /yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + dev: true - yaml@2.3.3: {} + /yaml@2.3.3: + resolution: {integrity: sha512-zw0VAJxgeZ6+++/su5AFoqBbZbrEakwu+X0M5HmcwUiBL7AzcuPKjj5we4xfQLp78LkEMpD0cOnUhmgOVy3KdQ==} + engines: {node: '>= 14'} + dev: true - yaml@2.4.2: {} + /yaml@2.3.4: + resolution: {integrity: sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==} + engines: {node: '>= 14'} + dev: true - yocto-queue@0.1.0: {} + /yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} - yocto-queue@1.0.0: {} + /yocto-queue@1.0.0: + resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} + engines: {node: '>=12.20'} + dev: true - zod@3.23.8: {} + /zod@3.22.4: + resolution: {integrity: sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==} + dev: false - zwitch@2.0.4: {} + /zwitch@2.0.4: + resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} From 3bdd0b96d33900384f4883d70355bfcee1245626 Mon Sep 17 00:00:00 2001 From: soyboy <85043086+sbvegan@users.noreply.github.com> Date: Mon, 28 Oct 2024 13:50:13 -0600 Subject: [PATCH 313/565] fixing linter errors --- pages/stack/research/block-time-research.mdx | 56 ++++++++++---------- words.txt | 16 ++++-- 2 files changed, 40 insertions(+), 32 deletions(-) diff --git a/pages/stack/research/block-time-research.mdx b/pages/stack/research/block-time-research.mdx index 1aa95b94a..f8e4a1700 100644 --- a/pages/stack/research/block-time-research.mdx +++ b/pages/stack/research/block-time-research.mdx @@ -7,53 +7,52 @@ description: Sunnyside Labs' (formerly Test in Prod) and OP Labs 1 second block # Block time research -Sunnyside Labs (formerly Test in Prod) and OP Labs have researched whether we can drop OP Chains’ block time to one second. +Sunnyside Labs (formerly Test in Prod) and OP Labs have researched whether we can drop OP Chains' block time to one second. To validate if dropping the block time is safe, we should check if nodes can build a block under a second when the block spends maximum gas in the production environment–i.e., block building time should take less than one second when the block spends maximum gas. We benchmarked the block-building time of every block at Base and grouped the data in various gas ranges using multiple clients–op-geth & op-reth. ## Method and raw data -This [GitHub repository](https://github.com/testinprod-io/block-building-stats/tree/main) contains the test methods, data sets, client versions, and raw data. +This [GitHub repository](https://github.com/testinprod-io/block-building-stats/tree/main) contains the test methods, data sets, client versions, and raw data. The following benchmarks are available in this [notebook](https://github.com/testinprod-io/block-building-stats/blob/main/stats.ipynb). -## Benchmarks +## Benchmarks -![Figure 1: op-geth / archive node / block 5492540 ~ 9816497 -](/img/op-stack/protocol/block-time-research-figure-1.png) +![Figure 1: op-geth / archive node / block 5492540 \~ 9816497 +.](/img/op-stack/protocol/block-time-research-figure-1.png) -**Figure 1**: op-geth / archive node / block 5492540 ~ 9816497 +**Figure 1**: op-geth / archive node / block 5492540 \~ 9816497 +![Figure 2: op-geth / full node / block 5492540 \~ 9816497.](/img/op-stack/protocol/block-time-research-figure-2.png) -![Figure 2: op-geth / full node / block 5492540 ~ 9816497](/img/op-stack/protocol/block-time-research-figure-2.png) +**Figure 2**: op-geth / full node / block 5492540 \~ 9816497 -**Figure 2**: op-geth / full node / block 5492540 ~ 9816497 +Figures 1 and 2 show the Base nodes' block-building time distribution with op-geth archive node & full node from block 5492540 to 9816497. We can see that the average block building time takes 0.58 and 0.36 seconds each for blocks that spent 25M \~ 30M gas, which is less than one second. -Figures 1 and 2 show the Base nodes’ block-building time distribution with op-geth archive node & full node from block 5492540 to 9816497. We can see that the average block building time takes 0.58 and 0.36 seconds each for blocks that spent 25M ~ 30M gas, which is less than one second. +![Figure 3: op-reth / archive node / block 5492540 \~ 9816497.](/img/op-stack/protocol/block-time-research-figure-3.png) -![Figure 3: op-reth / archive node / block 5492540 ~ 9816497](/img/op-stack/protocol/block-time-research-figure-3.png) +**Figure 3**: op-reth / archive node / block 5492540 \~ 9816497 -**Figure 3**: op-reth / archive node / block 5492540 ~ 9816497 +Figure 3 shows the Base nodes' block-building time distribution using the op-reth archive node from block 5492540 to 9816497. Compared to op-geth's archive node, we can see that op-reth shows a better performance in all ranges. -Figure 3 shows the Base nodes’ block-building time distribution using the op-reth archive node from block 5492540 to 9816497. Compared to op-geth’s archive node, we can see that op-reth shows a better performance in all ranges. +![Figure 4: op-geth / archive node / block 13686867 \~ 15074141.](/img/op-stack/protocol/block-time-research-figure-4.png) -![Figure 4: op-geth / archive node / block 13686867 ~ 15074141](/img/op-stack/protocol/block-time-research-figure-4.png) +**Figure 4:** op-geth / archive node / block 13686867 \~ 15074141 -**Figure 4:** op-geth / archive node / block 13686867 ~ 15074141 +![Figure 5: op-geth / full node / block 14567037 \~ 15074141.](/img/op-stack/protocol/block-time-research-figure-5.png) -![Figure 5: op-geth / full node / block 14567037 ~ 15074141](/img/op-stack/protocol/block-time-research-figure-5.png) - -**Figure 5:** op-geth / full node / block 14567037 ~ 15074141 +**Figure 5:** op-geth / full node / block 14567037 \~ 15074141 Throughout the research, we found that the node meaningfully takes longer to build a block as the chain stores more states and transactions to access more historical data. Therefore, we benchmarked the latest blocks in Figures 4 and 5. On average, both the full node and archive node could build a congested block on time. It is worth noting that the average block-building time of high gas spending range is similar to the older blocks, but the average block-building time is higher on the newer blocks. -![Figure 6: op-geth / archive node / block 13686867 ~ 15074141 / histogram of 25m~30m gas range](/img/op-stack/protocol/block-time-research-figure-6.png) +![Figure 6: op-geth / archive node / block 13686867 \~ 15074141 / histogram of 25m\~30m gas range.](/img/op-stack/protocol/block-time-research-figure-6.png) -**Figure 6**: op-geth / archive node / block 13686867 ~ 15074141 / histogram of 25m~30m gas range +**Figure 6**: op-geth / archive node / block 13686867 \~ 15074141 / histogram of 25m\~30m gas range -If we zoom in on the 25m~30m gas range of the archive node, the average could be potentially concerning–0.51 sec. It is worth noting that we can see the average is diverged from p50 (0.4 sec) because of outliers in the histogram (Figure 6), and p50 is a more important metric than the average for the block progression (Sequencer) because of its asynchronous nature. +If we zoom in on the 25m\~30m gas range of the archive node, the average could be potentially concerning–0.51 sec. It is worth noting that we can see the average is diverged from p50 (0.4 sec) because of outliers in the histogram (Figure 6), and p50 is a more important metric than the average for the block progression (Sequencer) because of its asynchronous nature. -When the sequencer seals the block after the block time, it stops to include the transactions and yields the current processing transactions to the next block. Therefore, the sequencer can include most transactions that took less than one second in the block on time and include outliers in the next block. Therefore, we can expect the system to be able to build blocks in one second in most cases, even in the highest gas range (25m~30m gas). +When the sequencer seals the block after the block time, it stops to include the transactions and yields the current processing transactions to the next block. Therefore, the sequencer can include most transactions that took less than one second in the block on time and include outliers in the next block. Therefore, we can expect the system to be able to build blocks in one second in most cases, even in the highest gas range (25m\~30m gas). As a result, we can learn that nodes can build the latest blocks of Base Mainnet with the highest level of production loads in one second with an [i3en.3xlarge instance](https://aws.amazon.com/ec2/instance-types/i3en/) (or similar specs). @@ -61,22 +60,21 @@ As a result, we can learn that nodes can build the latest blocks of Base Mainnet ### Verifier -* Sync from genesis: If OP Chains’ block time drops to one second, verifiers may need longer to sync the chain from the genesis with L1 derivation. However, we expect it won’t be a notable issue for verifiers as OP Stack supports the [engine sync](/builders/node-operators/management/snap-sync). -* Following the tip: The research suggests that verifiers are less likely to have a problem following the tip because nodes could build a block under one second at the highest gas range, especially since most verifiers are full nodes. +* Sync from genesis: If OP Chains' block time drops to one second, verifiers may need longer to sync the chain from the genesis with L1 derivation. However, we expect it won't be a notable issue for verifiers as OP Stack supports the [engine sync](/builders/node-operators/management/snap-sync). +* Following the tip: The research suggests that verifiers are less likely to have a problem following the tip because nodes could build a block under one second at the highest gas range, especially since most verifiers are full nodes. ### Sequencer -* Block progression: As the previous paragraph mentioned, the data suggests we don’t expect problems on a shorter block time. +* Block progression: As the previous paragraph mentioned, the data suggests we don't expect problems on a shorter block time. ## Limitation -The data suggests we don’t expect a problem dropping the block time to one second for now, as the average block building time of the latest blocks takes 0.19 seconds for the Base Mainnet. One concerning point: the benchmark shows that it takes longer to build a block as the chain progresses. When the chain stores more states over time and usage surges to a peak like 2017 Ethereum, we might need performance patches then. +The data suggests we don't expect a problem dropping the block time to one second for now, as the average block building time of the latest blocks takes 0.19 seconds for the Base Mainnet. One concerning point: the benchmark shows that it takes longer to build a block as the chain progresses. When the chain stores more states over time and usage surges to a peak like 2017 Ethereum, we might need performance patches then. -However, it is also worth noting that the research assumes that the Base Mainnet handles 2x of their current traffic–dropping the block time to half but still spending gas as current (when it runs two seconds of block time). Plus, the Base Mainnet’s average block gas spending is 10M. To make all blocks reach the highest gas level that this research focuses on (25M), it’s another 2.5x. +However, it is also worth noting that the research assumes that the Base Mainnet handles 2x of their current traffic–dropping the block time to half but still spending gas as current (when it runs two seconds of block time). Plus, the Base Mainnet's average block gas spending is 10M. To make all blocks reach the highest gas level that this research focuses on (25M), it's another 2.5x. -Therefore, this research assumes the chain processes approximately 5x traffic compared to the current Base Mainnet (2x in block time * 2.5x in gas spending). +Therefore, this research assumes the chain processes approximately 5x traffic compared to the current Base Mainnet (2x in block time \* 2.5x in gas spending). ## Reference -Base’s prior research for raising gas limit: [replayor](https://github.com/danyalprout/replayor) - +Base's prior research for raising gas limit: [replayor](https://github.com/danyalprout/replayor) diff --git a/words.txt b/words.txt index c4cf76483..79b22b4bd 100644 --- a/words.txt +++ b/words.txt @@ -11,6 +11,7 @@ Allocs allocs altda ANDI +Ankr Apeworx Arweave authrpc @@ -65,6 +66,7 @@ computependingblock confs corsdomain counterfactually +Crosschain crosschain Crossmint daserver @@ -146,6 +148,7 @@ Holesky holesky IGNOREPRICE ignoreprice +Immunefi implicity Inator inator @@ -194,6 +197,7 @@ minsuggestedpriorityfee Mintable Mintplex MIPSEVM +Mitigations Monitorism Moralis Mordor @@ -285,9 +289,10 @@ productionize productionized Protip Proxied -Proxyd proxyd pseudorandomly +Pyth +Pyth's QRNG Quicknode quicknode @@ -300,6 +305,7 @@ rejournal REMOTEDB remotedb replayability +replayor reproven REQUIREDBLOCKS requiredblocks @@ -319,7 +325,9 @@ safedb Schnorr secp SELFDESTRUCT -Sendrawtransactionconditional +SEPOLIA +Sepolia +sepolia seqnr SEQUENCERHTTP sequencerhttp @@ -345,6 +353,7 @@ subcomponents subgame subheaders SUBU +Sunnyside SUPERCHAIN Superchain superchain @@ -371,7 +380,6 @@ txmgr txns TXPOOL txpool -Txproxy txproxy uncountered Unprotect @@ -387,8 +395,10 @@ VMDEBUG vmdebug VMODULE vmodule +voxel wagmi Warpcast +xlarge XORI xtensibility ZKPs From 365ac3cbae9b4750882f4688a7a59fcaf95c47a5 Mon Sep 17 00:00:00 2001 From: Matthew Slipper Date: Mon, 28 Oct 2024 14:27:25 -0600 Subject: [PATCH 314/565] Small cleanups and describe bootstrapping --- .../chain-operators/tools/op-deployer.mdx | 51 ++++++++++++++----- 1 file changed, 39 insertions(+), 12 deletions(-) diff --git a/pages/builders/chain-operators/tools/op-deployer.mdx b/pages/builders/chain-operators/tools/op-deployer.mdx index fff7b4d9b..446d69a46 100644 --- a/pages/builders/chain-operators/tools/op-deployer.mdx +++ b/pages/builders/chain-operators/tools/op-deployer.mdx @@ -13,7 +13,12 @@ import {Callout, Steps} from 'nextra/components' ## Installation -You can find the latest releases in the monorepo's [release page](https://github.com/ethereum-optimism/optimism/releases). The following guide is how to complie it from source. Assuming you have the Go toolchain installed, you can install `op-deployer` by following these steps: +The recommended way to install `op-deployer` is to download the latest release from the monorepo's +[release page](https://github.com/ethereum-optimism/optimism/releases). To install a release, download the binary +for your platform then extract it somewhere on your `PATH`. The rest of this tutorial will assume that you have +installed `op-deployer` using this method. + +To install from source, follow the steps below. You will need to install the Go toolchain and `just` as prerequisites. ### **Clone the monorepo**: @@ -32,9 +37,13 @@ You can find the latest releases in the monorepo's [release page](https://github cd op-deployer just build ``` + + The binary will be in the `bin` directory. -## Usage +## Deployment Usage + +The base use case for `op-deployer` is deploying new OP Chains. This process is broken down into three steps: @@ -48,7 +57,13 @@ To get started with `op-deployer`, you need to create an intent file that outlin This command will create a directory called `.deployer` in your current working directory containing the intent file and an empty `state.json` file. `state.json` is populated with the results of your deployment, and never needs to be edited directly. -Your intent file will need to be modified to your parameters, but it will initally look something like this: +Your intent file will need to be modified to your parameters, but it will initially look something like this: + + + Do not use the default addresses in the intent for a production chain! They are generated from the `test... junk` + mnemonic. **Any funds they hold will be stolen on a live chain.** + + ```toml deploymentStrategy = "live" # Deploying a chain to a live network i.e. Sepolia @@ -105,7 +120,7 @@ You can also do chain by chain configurations in the `chains` table. Now that you've created your intent file, you can apply it to your chain to deploy the L1 smart contracts: ``` -./bin/op-deployer apply --workdir .deployer --l1-rpc-url --private-key +op-deployer apply --workdir .deployer --l1-rpc-url --private-key ``` This command will deploy the OP Stack to L1. It will deploy all L2s specified in the intent file. Superchain @@ -119,23 +134,35 @@ You'll be inspecting the `state.json` file, so you need to navigate into your wo ``` cd .deployer -../bin/op-deployer inspect genesis > genesis.json -../bin/op-deployer inspect rollup > rollup.json +op-deployer --workdir .deployer inspect genesis > genesis.json +op-deployer --workdir .deployer inspect rollup > rollup.json ``` Now that you have your `genesis.json` and `rollup.json` you can spin up a node on your network. You can also use the following inspect subcommands to get additional data: ``` -../bin/op-deployer inspect l1 # outputs all L1 contract addresses for an L2 chain -../bin/op-deployer inspect deploy-config # outputs the deploy config for an L2 chain -../bin/op-deployer inspect l2-semvers # outputs the semvers for all L2 chains +op-deployer --workdir .deployer inspect l1 # outputs all L1 contract addresses for an L2 chain +op-deployer --workdir .deployer inspect deploy-config # outputs the deploy config for an L2 chain +op-deployer --workdir .deployer inspect l2-semvers # outputs the semvers for all L2 chains ``` - -## `bootstrap` +## Bootstrap Usage + +`op-deployer` can also be used to deploy the contracts it needs to run the `init`... `apply` flow on new chains. +This process is called "bootstrapping," and is useful for when you want to use `op-deployer` with L3s, new testnets, +or other custom settlement chains. + +### OPCM Bootstrap -todo: how does this work? +To deploy OPCM to a new chain, run the following command: + +```bash +op-deployer bootstrap opcm \ + --l1-rpc-url \ + --private-key \ + --artifacts-locator tag://op-contracts/v1.6.0 +``` ## Next steps From b3b8df23e558388e2f85ac541834a7ead0e9ae39 Mon Sep 17 00:00:00 2001 From: soyboy <85043086+sbvegan@users.noreply.github.com> Date: Mon, 28 Oct 2024 14:33:52 -0600 Subject: [PATCH 315/565] Apply suggestions from code review Co-authored-by: Bradley Camacho <42678939+bradleycamacho@users.noreply.github.com> --- pages/stack/research/block-time-research.mdx | 37 ++++++++++---------- 1 file changed, 18 insertions(+), 19 deletions(-) diff --git a/pages/stack/research/block-time-research.mdx b/pages/stack/research/block-time-research.mdx index f8e4a1700..3bf6b69df 100644 --- a/pages/stack/research/block-time-research.mdx +++ b/pages/stack/research/block-time-research.mdx @@ -19,36 +19,35 @@ The following benchmarks are available in this [notebook](https://github.com/tes ## Benchmarks -![Figure 1: op-geth / archive node / block 5492540 \~ 9816497 -.](/img/op-stack/protocol/block-time-research-figure-1.png) +| ![Figure 1: op-geth / archive node / block 5492540 \~ 9816497.](/img/op-stack/protocol/block-time-research-figure-1.png)| +|:--:| +| **Figure 1**: op-geth / archive node / block 5492540 \~ 9816497 | -**Figure 1**: op-geth / archive node / block 5492540 \~ 9816497 - -![Figure 2: op-geth / full node / block 5492540 \~ 9816497.](/img/op-stack/protocol/block-time-research-figure-2.png) - -**Figure 2**: op-geth / full node / block 5492540 \~ 9816497 +| ![Figure 2: op-geth / full node / block 5492540 \~ 9816497.](/img/op-stack/protocol/block-time-research-figure-2.png) | +|:--:| +| **Figure 2**: op-geth / full node / block 5492540 \~ 9816497 | Figures 1 and 2 show the Base nodes' block-building time distribution with op-geth archive node & full node from block 5492540 to 9816497. We can see that the average block building time takes 0.58 and 0.36 seconds each for blocks that spent 25M \~ 30M gas, which is less than one second. -![Figure 3: op-reth / archive node / block 5492540 \~ 9816497.](/img/op-stack/protocol/block-time-research-figure-3.png) - -**Figure 3**: op-reth / archive node / block 5492540 \~ 9816497 +| ![Figure 3: op-reth / archive node / block 5492540 \~ 9816497.](/img/op-stack/protocol/block-time-research-figure-3.png) | +|:--:| +| **Figure 3**: op-reth / archive node / block 5492540 \~ 9816497 | Figure 3 shows the Base nodes' block-building time distribution using the op-reth archive node from block 5492540 to 9816497. Compared to op-geth's archive node, we can see that op-reth shows a better performance in all ranges. -![Figure 4: op-geth / archive node / block 13686867 \~ 15074141.](/img/op-stack/protocol/block-time-research-figure-4.png) +| ![Figure 4: op-geth / archive node / block 13686867 \~ 15074141.](/img/op-stack/protocol/block-time-research-figure-4.png) | +|:--:| +| **Figure 4:** op-geth / archive node / block 13686867 \~ 15074141 | -**Figure 4:** op-geth / archive node / block 13686867 \~ 15074141 - -![Figure 5: op-geth / full node / block 14567037 \~ 15074141.](/img/op-stack/protocol/block-time-research-figure-5.png) - -**Figure 5:** op-geth / full node / block 14567037 \~ 15074141 +| ![Figure 5: op-geth / full node / block 14567037 \~ 15074141.](/img/op-stack/protocol/block-time-research-figure-5.png) | +|:--:| +| **Figure 5:** op-geth / full node / block 14567037 \~ 15074141 | Throughout the research, we found that the node meaningfully takes longer to build a block as the chain stores more states and transactions to access more historical data. Therefore, we benchmarked the latest blocks in Figures 4 and 5. On average, both the full node and archive node could build a congested block on time. It is worth noting that the average block-building time of high gas spending range is similar to the older blocks, but the average block-building time is higher on the newer blocks. -![Figure 6: op-geth / archive node / block 13686867 \~ 15074141 / histogram of 25m\~30m gas range.](/img/op-stack/protocol/block-time-research-figure-6.png) - -**Figure 6**: op-geth / archive node / block 13686867 \~ 15074141 / histogram of 25m\~30m gas range +| ![Figure 6: op-geth / archive node / block 13686867 \~ 15074141 / histogram of 25m\~30m gas range.](/img/op-stack/protocol/block-time-research-figure-6.png) | +|:--:| +| **Figure 6**: op-geth / archive node / block 13686867 \~ 15074141 / histogram of 25m\~30m gas range | If we zoom in on the 25m\~30m gas range of the archive node, the average could be potentially concerning–0.51 sec. It is worth noting that we can see the average is diverged from p50 (0.4 sec) because of outliers in the histogram (Figure 6), and p50 is a more important metric than the average for the block progression (Sequencer) because of its asynchronous nature. From 66c9dacebdcf8f32acc690fd5ed6e49f75e59854 Mon Sep 17 00:00:00 2001 From: Bradley Camacho <42678939+bradleycamacho@users.noreply.github.com> Date: Mon, 28 Oct 2024 14:28:58 -0700 Subject: [PATCH 316/565] Apply linting --- pages/stack/research/block-time-research.mdx | 36 ++++++++++---------- words.txt | 9 ----- 2 files changed, 18 insertions(+), 27 deletions(-) diff --git a/pages/stack/research/block-time-research.mdx b/pages/stack/research/block-time-research.mdx index 3bf6b69df..ca8678765 100644 --- a/pages/stack/research/block-time-research.mdx +++ b/pages/stack/research/block-time-research.mdx @@ -19,35 +19,35 @@ The following benchmarks are available in this [notebook](https://github.com/tes ## Benchmarks -| ![Figure 1: op-geth / archive node / block 5492540 \~ 9816497.](/img/op-stack/protocol/block-time-research-figure-1.png)| -|:--:| -| **Figure 1**: op-geth / archive node / block 5492540 \~ 9816497 | +| ![Figure 1: op-geth / archive node / block 5492540 \~ 9816497.](/img/op-stack/protocol/block-time-research-figure-1.png) | +| :----------------------------------------------------------------------------------------------------------------------: | +| **Figure 1**: op-geth / archive node / block 5492540 \~ 9816497 | -| ![Figure 2: op-geth / full node / block 5492540 \~ 9816497.](/img/op-stack/protocol/block-time-research-figure-2.png) | -|:--:| -| **Figure 2**: op-geth / full node / block 5492540 \~ 9816497 | +| ![Figure 2: op-geth / full node / block 5492540 \~ 9816497.](/img/op-stack/protocol/block-time-research-figure-2.png) | +| :-------------------------------------------------------------------------------------------------------------------: | +| **Figure 2**: op-geth / full node / block 5492540 \~ 9816497 | Figures 1 and 2 show the Base nodes' block-building time distribution with op-geth archive node & full node from block 5492540 to 9816497. We can see that the average block building time takes 0.58 and 0.36 seconds each for blocks that spent 25M \~ 30M gas, which is less than one second. -| ![Figure 3: op-reth / archive node / block 5492540 \~ 9816497.](/img/op-stack/protocol/block-time-research-figure-3.png) | -|:--:| -| **Figure 3**: op-reth / archive node / block 5492540 \~ 9816497 | +| ![Figure 3: op-reth / archive node / block 5492540 \~ 9816497.](/img/op-stack/protocol/block-time-research-figure-3.png) | +| :----------------------------------------------------------------------------------------------------------------------: | +| **Figure 3**: op-reth / archive node / block 5492540 \~ 9816497 | Figure 3 shows the Base nodes' block-building time distribution using the op-reth archive node from block 5492540 to 9816497. Compared to op-geth's archive node, we can see that op-reth shows a better performance in all ranges. -| ![Figure 4: op-geth / archive node / block 13686867 \~ 15074141.](/img/op-stack/protocol/block-time-research-figure-4.png) | -|:--:| -| **Figure 4:** op-geth / archive node / block 13686867 \~ 15074141 | +| ![Figure 4: op-geth / archive node / block 13686867 \~ 15074141.](/img/op-stack/protocol/block-time-research-figure-4.png) | +| :------------------------------------------------------------------------------------------------------------------------: | +| **Figure 4:** op-geth / archive node / block 13686867 \~ 15074141 | -| ![Figure 5: op-geth / full node / block 14567037 \~ 15074141.](/img/op-stack/protocol/block-time-research-figure-5.png) | -|:--:| -| **Figure 5:** op-geth / full node / block 14567037 \~ 15074141 | +| ![Figure 5: op-geth / full node / block 14567037 \~ 15074141.](/img/op-stack/protocol/block-time-research-figure-5.png) | +| :---------------------------------------------------------------------------------------------------------------------: | +| **Figure 5:** op-geth / full node / block 14567037 \~ 15074141 | Throughout the research, we found that the node meaningfully takes longer to build a block as the chain stores more states and transactions to access more historical data. Therefore, we benchmarked the latest blocks in Figures 4 and 5. On average, both the full node and archive node could build a congested block on time. It is worth noting that the average block-building time of high gas spending range is similar to the older blocks, but the average block-building time is higher on the newer blocks. -| ![Figure 6: op-geth / archive node / block 13686867 \~ 15074141 / histogram of 25m\~30m gas range.](/img/op-stack/protocol/block-time-research-figure-6.png) | -|:--:| -| **Figure 6**: op-geth / archive node / block 13686867 \~ 15074141 / histogram of 25m\~30m gas range | +| ![Figure 6: op-geth / archive node / block 13686867 \~ 15074141 / histogram of 25m\~30m gas range.](/img/op-stack/protocol/block-time-research-figure-6.png) | +| :----------------------------------------------------------------------------------------------------------------------------------------------------------: | +| **Figure 6**: op-geth / archive node / block 13686867 \~ 15074141 / histogram of 25m\~30m gas range | If we zoom in on the 25m\~30m gas range of the archive node, the average could be potentially concerning–0.51 sec. It is worth noting that we can see the average is diverged from p50 (0.4 sec) because of outliers in the histogram (Figure 6), and p50 is a more important metric than the average for the block progression (Sequencer) because of its asynchronous nature. diff --git a/words.txt b/words.txt index 79b22b4bd..dc4587226 100644 --- a/words.txt +++ b/words.txt @@ -11,7 +11,6 @@ Allocs allocs altda ANDI -Ankr Apeworx Arweave authrpc @@ -148,7 +147,6 @@ Holesky holesky IGNOREPRICE ignoreprice -Immunefi implicity Inator inator @@ -197,7 +195,6 @@ minsuggestedpriorityfee Mintable Mintplex MIPSEVM -Mitigations Monitorism Moralis Mordor @@ -291,8 +288,6 @@ Protip Proxied proxyd pseudorandomly -Pyth -Pyth's QRNG Quicknode quicknode @@ -325,9 +320,6 @@ safedb Schnorr secp SELFDESTRUCT -SEPOLIA -Sepolia -sepolia seqnr SEQUENCERHTTP sequencerhttp @@ -395,7 +387,6 @@ VMDEBUG vmdebug VMODULE vmodule -voxel wagmi Warpcast xlarge From df110b2ffd0780d78610190c577feaee5a3753ec Mon Sep 17 00:00:00 2001 From: soyboy <85043086+sbvegan@users.noreply.github.com> Date: Mon, 28 Oct 2024 15:29:35 -0600 Subject: [PATCH 317/565] Update op-challenger.mdx There have been more recent releases of the op-challenger. Lets just link directly to the release page. --- pages/builders/chain-operators/tools/op-challenger.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/builders/chain-operators/tools/op-challenger.mdx b/pages/builders/chain-operators/tools/op-challenger.mdx index 1fc8b90d9..d9c041a72 100644 --- a/pages/builders/chain-operators/tools/op-challenger.mdx +++ b/pages/builders/chain-operators/tools/op-challenger.mdx @@ -19,7 +19,7 @@ This guide provides a walkthrough of setting up the configuration and monitoring git clone https://github.com/ethereum-optimism/optimism.git ``` - * Check out the [latest release of `op-challenger`](https://github.com/ethereum-optimism/optimism/releases/tag/op-challenger%2Fv1.0.1) and use the commit to deploy. Alternatively, chain operators can use the prebuilt [challenger docker images](https://us-docker.pkg.dev/oplabs-tools-artifacts/images/op-challenger:v1.0.1). + * Check out the [latest release of `op-challenger`](https://github.com/ethereum-optimism/optimism/releases) and use the commit to deploy. Alternatively, chain operators can use the prebuilt [challenger docker images](https://us-docker.pkg.dev/oplabs-tools-artifacts/images/op-challenger:v1.0.1). If a Docker image is used, it already comes with `op-program` server and an executable for Cannon embedded, so the Cannon bin doesn't need to be specified. ```bash From 638df39b8b204a9e5a70fd1b1c5b186f2a24b5c3 Mon Sep 17 00:00:00 2001 From: soyboy <85043086+sbvegan@users.noreply.github.com> Date: Mon, 28 Oct 2024 15:32:14 -0600 Subject: [PATCH 318/565] quick fix --- pages/builders/chain-operators/tools/op-challenger.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/builders/chain-operators/tools/op-challenger.mdx b/pages/builders/chain-operators/tools/op-challenger.mdx index d9c041a72..7a3cc27d6 100644 --- a/pages/builders/chain-operators/tools/op-challenger.mdx +++ b/pages/builders/chain-operators/tools/op-challenger.mdx @@ -19,7 +19,7 @@ This guide provides a walkthrough of setting up the configuration and monitoring git clone https://github.com/ethereum-optimism/optimism.git ``` - * Check out the [latest release of `op-challenger`](https://github.com/ethereum-optimism/optimism/releases) and use the commit to deploy. Alternatively, chain operators can use the prebuilt [challenger docker images](https://us-docker.pkg.dev/oplabs-tools-artifacts/images/op-challenger:v1.0.1). + * Check out the [latest release of `op-challenger`](https://github.com/ethereum-optimism/optimism/releases) and use the commit to deploy. Alternatively, chain operators can use the prebuilt challenger docker images included in the release notes. If a Docker image is used, it already comes with `op-program` server and an executable for Cannon embedded, so the Cannon bin doesn't need to be specified. ```bash From f42998cc8edfe9d0857523f533e6d9f188a40c4f Mon Sep 17 00:00:00 2001 From: soyboy <85043086+sbvegan@users.noreply.github.com> Date: Mon, 28 Oct 2024 15:59:59 -0600 Subject: [PATCH 319/565] removing fp and granite notices --- next-env.d.ts | 2 +- pages/builders/notices.mdx | 6 +- pages/builders/notices/_meta.json | 2 - pages/builders/notices/fp-changes.mdx | 100 --------------------- pages/builders/notices/granite-changes.mdx | 86 ------------------ public/_redirects | 4 +- 6 files changed, 5 insertions(+), 195 deletions(-) delete mode 100644 pages/builders/notices/fp-changes.mdx delete mode 100644 pages/builders/notices/granite-changes.mdx diff --git a/next-env.d.ts b/next-env.d.ts index 4f11a03dc..a4a7b3f5c 100644 --- a/next-env.d.ts +++ b/next-env.d.ts @@ -2,4 +2,4 @@ /// // NOTE: This file should not be edited -// see https://nextjs.org/docs/basic-features/typescript for more information. +// see https://nextjs.org/docs/pages/building-your-application/configuring/typescript for more information. diff --git a/pages/builders/notices.mdx b/pages/builders/notices.mdx index 81a3ecb0a..53ca1701f 100644 --- a/pages/builders/notices.mdx +++ b/pages/builders/notices.mdx @@ -8,12 +8,8 @@ import { Card, Cards } from 'nextra/components' # Notices -This section provides information on preparing for fault proofs breaking changes, preparing for granite breaking changes and deprecation of the optimism sdk. You'll find overview, tutorial to help you understand and work with these topics. +This section offers essential information for builders to stay up-to-date with the latest changes in the OP Stack. - - - - diff --git a/pages/builders/notices/_meta.json b/pages/builders/notices/_meta.json index b85000edf..f75d9972e 100644 --- a/pages/builders/notices/_meta.json +++ b/pages/builders/notices/_meta.json @@ -1,5 +1,3 @@ { - "granite-changes": "Preparing for Granite breaking changes", - "fp-changes": "Preparing for fault proofs breaking changes", "sdk-deprecation": "Preparing for Optimism SDK deprecation" } diff --git a/pages/builders/notices/fp-changes.mdx b/pages/builders/notices/fp-changes.mdx deleted file mode 100644 index 0ef6d47cd..000000000 --- a/pages/builders/notices/fp-changes.mdx +++ /dev/null @@ -1,100 +0,0 @@ ---- -title: Preparing for fault proofs breaking changes -lang: en-US -description: Learn how to prepare for Fault Proofs changes. ---- - -import { Steps, Callout } from 'nextra/components' - -# Preparing for fault proofs breaking changes - -OP Labs has submitted a [proposal to governance](https://gov.optimism.io/t/upgrade-proposal-fault-proofs/8161) to upgrade OP Mainnet to support Fault Proofs. If this proposal passes, fault proofs would launch on OP Mainnet approximately June 2024. This document details changes that apply to users, bridges, and centralized exchanges, as well as any custom solutions that use withdrawals. This page outlines changes for OP Mainnet and OP Sepolia only. Details for other OP Chains are forthcoming. - -If you experience difficulty at any stage of this process, please reach out to [OP Labs Developer Support](https://github.com/ethereum-optimism/developers/discussions). - - - **Important Notice for Bridges and Users** - -**ALL** withdrawals that are not finalized before the Fault Proofs upgrade executes will need to be reproven after the upgrade is complete. - - * Reproving simply requires that you execute the [withdrawal proving flow](/stack/transactions/withdrawal-flow) again. - * Withdrawals prior to the Fault Proofs upgrade must wait a 7-day challenge period before finalization. As a result, any withdrawal initiated less than 7 days before the upgrade cannot be finalized before the upgrade is executed. You may want to consider waiting until after the upgrade is complete to begin a withdrawal during this 7-day window. - - - - **Important Notice for Bridges and Users** - - Maximum withdrawal delay times are increasing with the Fault Proofs upgrade. - * Withdrawals will generally take 7 days to finalize (unchanged from before Fault Proofs). - * Withdrawals that are proven against an output proposal that receives a validity challenge are delayed by an additional 3.5 days. Valid proposals that are challenged maliciously can be delayed by up to an additional 9 days at a very high cost to the malicious actor. Additional delays of this type are expected to be infrequent. - - - - As of the Fault Proofs update to OP Sepolia in March 2024, **OP Sepolia withdrawals are no longer instant.** This is because the Fault Proof mechanism now applies to OP Sepolia transactions. - - -## Overview of changes - -If you are operating a custom bridge, review this section for changes you need to make. If you are using Optimism SDK or Viem for your bridging, you can [skip to the next section](#for-bridges-and-centralized-exchanges). - -The `L2OutputOracle` is being entirely removed and replaced by the `OptimismPortal` and `DisputeGameFactory`. The `L2OutputOracle` smart contract is currently used by the trusted Proposer role to store L2 state output proposals. -Presently, developers use these outputs to prove that their withdrawals actually happened on L2. But with fault proofs, developers will have to change how their client software proves withdrawals in the first step of the two-step withdrawal process. - -### `L2OutputOracle` - -The `OptimismPortal` is changing slightly with Fault Proof Mainnet because it now points to the `DisputeGameFactory` contract instead of the `L2OutputOracle` contract. -Most notable change for developers is that withdrawals will have to be proven against the `rootClaim` of some dispute game rather than referencing an output in the `L2OutputOracle` contract. - -### `OptimismPortal` - -The `OptimismPortal` smart contract is the low-level contract on L1 used to execute deposits and withdrawals. -Previously, developers would look at the `L2OutputOracle` to find the exact next output that included their withdrawal. -Now, developers must look at the `OptimismPortal` contract to determine the `respectedGameType` and then use this information to query the `DisputeGameFactory` for a list of recent `DisputeGame` contracts with the correct game type. - -### `DisputeGameFactory` - -It is recommended that developers search for a reasonable number of recent games, say 100 games, and pick the first proposal with a sufficient block number. -Developers should then verify this proposal locally as the default game type will allow for permissionless proposals and there is no longer a strong guarantee that proposals will be valid. - -## For bridges and centralized exchanges - -The proposed Fault Proof upgrade requires developers to enable Fault Proof changes before the Op Mainnet release. This impacts bridges, centralized exchanges, and custom solutions that use withdrawals. - - - Withdrawals that haven't finalized before the upgrade occurs will be unable to be finalized post-upgrade without reproving. This means these withdrawals will need to go through a new 7-day period. The time accrued before the upgrade will not count. - This means the withdrawal time could be as long as 13-14 days during the upgrade window. (If you submit it \~6 days before the upgrade, then must re-prove after the upgrade, you will have to wait a new seven days.) - - - - ### Update logic to support fault proofs - - - Most teams use the Optimism SDK or Viem to handle this logic under the hood and will simply need to update their software version ahead of the upgrade. However, any project performing withdrawals programmatically will need to update their client code (see [`OptimismPortal`](#optimismportal) for details). - - - * **Option 1: Optimism SDK Update.** If you use OptimismSDK for bridging, simply update to version 3.2.0 or higher. - The Optimism SDK changes do not break the API and require no changes other than updating to the correct software version to support the new `OptimismPortal` logic. The Optimism SDK will automatically begin to use the new logic once it detects that the FPM update has gone live. - * **Option 2: Viem Update.** Update to the latest version of Viem (version of >=2.9.0). Viem will automatically begin to use the new logic once it detects that the FPM update has gone live. - - ### Update withdrawal monitor - - The Withdrawal Monitor service is an important part of the two-step withdrawal system that checks if anyone has been able to prove withdrawals that do not actually appear on L2. - The Withdrawal Monitor is now slightly slower at startup time but is more reliable, simpler, and compatible with more infrastructure to more easily support any OP Stack chain. - Changes to the Withdrawal Monitor are entirely backwards compatible. - - * **Option 1: Withdrawal from source.** If building or using withdrawal-monitor from source, make sure that you are using the latest develop branch. All withdrawal monitor changes are fully backwards compatible. - * **Option 2: Docker image.** If using docker, use the latest chain-mon docker image. - - ### Update dispute monitor - - The Dispute Monitor service detects when invalid outputs have been proposed. Given the large number of changes to the output proposal system, the current Fault Monitor is being replaced in favor of a new Dispute Monitor purposely built for the fault proof monitor system. - - - Any team running the current Fault Monitor will see the monitor stop functioning when the Fault Proof Monitor upgrade goes live. These teams should run the new service and update their alerting accordingly. - - - -## Next steps - -* See the [Fault Proofs Explainer](/stack/fault-proofs/explainer) to learn more about the three main components of the Fault Proof System. -* You can also read more about [Cannon FPVM](/stack/fault-proofs/cannon) and [Mips.sol](/stack/fault-proofs/mips), the onchain smart contract implementation of Cannon. diff --git a/pages/builders/notices/granite-changes.mdx b/pages/builders/notices/granite-changes.mdx deleted file mode 100644 index 5fc68df94..000000000 --- a/pages/builders/notices/granite-changes.mdx +++ /dev/null @@ -1,86 +0,0 @@ ---- -title: Preparing for Granite breaking changes -lang: en-US -description: Learn how to prepare for Granite upgrade breaking changes. ---- - -import { Steps, Callout } from 'nextra/components' - -# Preparing for Granite breaking changes - -This page outlines breaking changes related to the Granite network upgrade for chain operators and node operators. -If you experience difficulty at any stage of this process, please reach out to [developer support](https://github.com/ethereum-optimism/developers/discussions). - - - The Granite upgrade for OP Sepolia was activated on **1723478400 - Mon Aug 12 16:00:00 UTC**. The Granite OP Mainnet upgrade will be activated at **1726070401 - Wed 11 Sep 2024 16:00:01 UTC**, here is the [governance vote](https://vote.optimism.io/proposals/46514799174839131952937755475635933411907395382311347042580299316635260952272). - - -## What's included in Granite - -This upgrade is proposed in response to security vulnerabilities identified during a series of third-party security audits by Spearbit, Cantina, and Code4rena. None of the vulnerabilities have been exploited, and user assets are not and were never at risk. However, out of an abundance of caution, the permissioned fallback mechanism has been activated in order to avoid any potential instability while the vulnerabilities are patched. For more information on the permissioned fallback mechanism and the OP Stack's defense-in-depth approach to Fault Proof security, see the [fault proof documentation](/stack/fault-proofs/fp-security). - -The upgrade includes both a set of smart contract upgrades to fix the vulnerabilities identified in the audit as well as an L2 hardfork to improve the stability and performance of the fault proof system. In addition, we propose extending the capabilities of the Guardian and DeputyGuardian to set the anchor state for the fault proof system in order to prevent referencing invalid anchor states. Aside from implementing these fixes, the primary impact of this upgrade would be to reset user withdrawals at the planned time, similar to the initial Fault Proof upgrade. - -Please refer to the [governance proposal](https://gov.optimism.io/t/upgrade-proposal-10-granite-network-upgrade/8733) for the full details. - -## For chain operators - -The proposed Granite upgrade impacts OP chains and requires chain operators to upgrade their chain and configure the sequencer for Granite. - - - - ### Prepare sequencer node - - - If you are operating an OP Chain that has an entry in the [`superchain-registry`](https://github.com/ethereum-optimism/superchain-registry/blob/main/chainList.json), the Granite activation date is part of the `op-node` and `op-geth` nodes, and are using the [--network](/builders/node-operators/configuration/consensus-config#network) and [--op-network](/builders/node-operators/configuration/execution-config#op-network-betaop-network) flags. No action is needed for the sequencer after preparing the `SystemConfig` transaction. - - - For custom chains not included in the [`superchain-registry`](https://github.com/ethereum-optimism/superchain-registry/blob/main/chainList.json), you will need to manually configure the [activation timestamp](https://github.com/ethereum-optimism/superchain-registry/blob/main/superchain/configs/mainnet/superchain.toml). You have two configuration options for your sequencer node: - - * **Option 1:** Set the Granite activation date in your `rollup.json` config file. You will still need to set the `override.granite` flag in `op-geth` with the UNIX timestamp. - * **Option 2:** Alternatively, chain operators can use the override flags to configure your sequencer node by specifying a time in the future when Granite will activate. - * Set `override.granite` in both `op-node` and `op-geth` to the UNIX timestamp of the block you want to activate the Granite hardfork or corresponding env vars for this. - * In general, run `op-node --help` or `op-geth --help` to see flags, their descriptions and environment variables. - - ### Rollup configuration breaking changes - - Alt-DA mode has had a name change. What was formerly known as Plasma Mode has been renamed and you may need to [update your rollup configuration file](/builders/chain-operators/features/alt-da-mode#breaking-changes-renaming-plasma-mode-to-alt-da-mode). - - - - To verify proper configuration, chain operators should confirm in the startup logs of their `op-node` and `op-geth` that the correct Granite activation timestamps are set. - - -## For node operators - -Node operators will need to upgrade to Granite before the activation date. -The op-node release [v1.9.1](https://github.com/ethereum-optimism/optimism/releases/tag/v1.9.1) -and op-geth release [v1.101408.0](https://github.com/ethereum-optimism/op-geth/releases/tag/v1.101408.0) contain these changes. - -These following steps are necessary for every node operator: - - - ### Update to the latest release - - * [`op-node`](https://github.com/ethereum-optimism/optimism/releases/tag/v1.9.1) - * [`op-geth`](https://github.com/ethereum-optimism/op-geth/releases/tag/v1.101408.0) - - ### Configure the Granite activation date - - - If you are operating a node for an OP Chain that has an entry in the [`superchain-registry`](https://github.com/ethereum-optimism/superchain-registry/blob/main/chainList.json), the Granite activation date is part of the `op-node` and `op-geth` nodes. So, no action is needed for the sequencer after upgrading to the latest release. Please skip to [Step 3: Verify Your Configuration](#verify-your-configuration). - - - For node operators of custom chains not included in the [`superchain-registry`](https://github.com/ethereum-optimism/superchain-registry/blob/main/chainList.json), you will need to manually configure the [activation timestamp](https://github.com/ethereum-optimism/superchain-registry/blob/main/superchain/configs/mainnet/superchain.toml). This can be done one of two ways: - - * **Option 1:** Set the activation time in the `rollup.json` for `op-node`. You will still need to set the `override.granite` flag in `op-geth` if you use this option. - * **Option 2:** Set the activation time via overrides (CLI) in both `op-node` and `op-geth`. These will need to be set on `op-node` and `op-geth` for the sequencer and all other nodes. - - ### Verify your configuration - - Make the following checks to verify that your node is properly configured. - - * `op-node` and `op-geth` will log their configurations at startup - * Check that the Granite time is set to `activation-timestamp` in the op-node startup logs - * Check that the Granite time is set to `activation-timestamp` in the op-geth startup logs - diff --git a/public/_redirects b/public/_redirects index d586cee18..55ee480e3 100644 --- a/public/_redirects +++ b/public/_redirects @@ -101,4 +101,6 @@ /stack/protocol/rollup/deposit-flow /stack/transactions/deposit-flow /stack/protocol/outages /stack/rollup/outages /stack/operators/features/op-txproxy /builders/chain-operators/tools/op-txproxy -/stack/operators/features/proxyd /builders/chain-operators/tools/proxyd \ No newline at end of file +/stack/operators/features/proxyd /builders/chain-operators/tools/proxyd +/builders/notices/granite-changes https://github.com/ethereum-optimism/docs/blob/ef619668ae44276edecdfd657157254b9809e2d6/pages/builders/notices/granite-changes.mdx +/builders/notices/fp-changes https://github.com/ethereum-optimism/docs/blob/ef619668ae44276edecdfd657157254b9809e2d6/pages/builders/notices/fp-changes.mdx \ No newline at end of file From 3ee02e996d7991eac81a94d0d163e218407fbbce Mon Sep 17 00:00:00 2001 From: soyboy <85043086+sbvegan@users.noreply.github.com> Date: Mon, 28 Oct 2024 16:05:40 -0600 Subject: [PATCH 320/565] adding missing words --- words.txt | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/words.txt b/words.txt index dc4587226..79b22b4bd 100644 --- a/words.txt +++ b/words.txt @@ -11,6 +11,7 @@ Allocs allocs altda ANDI +Ankr Apeworx Arweave authrpc @@ -147,6 +148,7 @@ Holesky holesky IGNOREPRICE ignoreprice +Immunefi implicity Inator inator @@ -195,6 +197,7 @@ minsuggestedpriorityfee Mintable Mintplex MIPSEVM +Mitigations Monitorism Moralis Mordor @@ -288,6 +291,8 @@ Protip Proxied proxyd pseudorandomly +Pyth +Pyth's QRNG Quicknode quicknode @@ -320,6 +325,9 @@ safedb Schnorr secp SELFDESTRUCT +SEPOLIA +Sepolia +sepolia seqnr SEQUENCERHTTP sequencerhttp @@ -387,6 +395,7 @@ VMDEBUG vmdebug VMODULE vmodule +voxel wagmi Warpcast xlarge From 455433fb2c72431c215d62e031d2a49e6f0eaec9 Mon Sep 17 00:00:00 2001 From: soyboy <85043086+sbvegan@users.noreply.github.com> Date: Mon, 28 Oct 2024 16:13:51 -0600 Subject: [PATCH 321/565] adding tess's suggestions --- next-env.d.ts | 2 +- pages/builders/chain-operators/tools/op-deployer.mdx | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/next-env.d.ts b/next-env.d.ts index 4f11a03dc..a4a7b3f5c 100644 --- a/next-env.d.ts +++ b/next-env.d.ts @@ -2,4 +2,4 @@ /// // NOTE: This file should not be edited -// see https://nextjs.org/docs/basic-features/typescript for more information. +// see https://nextjs.org/docs/pages/building-your-application/configuring/typescript for more information. diff --git a/pages/builders/chain-operators/tools/op-deployer.mdx b/pages/builders/chain-operators/tools/op-deployer.mdx index 446d69a46..14df3f678 100644 --- a/pages/builders/chain-operators/tools/op-deployer.mdx +++ b/pages/builders/chain-operators/tools/op-deployer.mdx @@ -2,7 +2,7 @@ title: Deployer lang: en-US tags: ["op-deployer","eng-platforms"] -description: Learn how op-deployer can simplify deployment of the standard OP Stack. +description: Learn how op-deployer can simplify deployment a standard OP Stack chain. --- import {Callout, Steps} from 'nextra/components' @@ -130,6 +130,10 @@ address as other chains on the Superchain. ### `inspect`: generating genesis files and chain information + + You will need to write the output of these commands to files to make an addition to the [Superchain Registry](https://github.com/ethereum-optimism/superchain-registry). + + You'll be inspecting the `state.json` file, so you need to navigate into your working directory to inspect the file. With the contracts deployed, you can generate the genesis and rollup configuration files. Run the following commands to do so: ``` From ec5ccaaa76ec7835be06c6b4889483b948bdea84 Mon Sep 17 00:00:00 2001 From: soyboy <85043086+sbvegan@users.noreply.github.com> Date: Mon, 28 Oct 2024 16:24:08 -0600 Subject: [PATCH 322/565] centralizing the runbook link --- .../chain-operators/management/best-practices.mdx | 15 ++++++++------- pages/builders/chain-operators/self-hosted.mdx | 2 -- pages/builders/node-operators/rollup-node.mdx | 2 -- 3 files changed, 8 insertions(+), 11 deletions(-) diff --git a/pages/builders/chain-operators/management/best-practices.mdx b/pages/builders/chain-operators/management/best-practices.mdx index 33184b384..31cf1c631 100644 --- a/pages/builders/chain-operators/management/best-practices.mdx +++ b/pages/builders/chain-operators/management/best-practices.mdx @@ -11,9 +11,7 @@ import { Callout } from 'nextra/components' The following information has some best practices around running the OP Stack's off-chain components. -## Best Practices - -### Correct Release Versions +## Correct Release Versions Chain and node operators should always run the latest production releases of the OP Stack's off chain components. Our latest releases, notes, and changelogs @@ -35,7 +33,7 @@ and `op-geth` releases can be found [here](https://github.com/ethereum-optimism/ version. Since we cannot left-pad with zeroes, the geth major version is not padded. -### Keep Deployment Artifacts +## Keep Deployment Artifacts After deploying your contracts on Ethereum, you should keep a record of all the deployment artifacts: @@ -49,20 +47,20 @@ created in [packages/contracts-bedrock/deployments](https://github.com/ethereum- deployment * The genesis file that you generated after the contract deployment -### Incremental Upgrade Rollouts +## Incremental Upgrade Rollouts When upgrading your nodes, take a staggered approach. This means deploying the upgrade gradually across your infrastructure and ensuring things work as expected before making changes to every node. -### Isolate Your Sequencer +## Isolate Your Sequencer You can isolate your sequencer node, by not connecting it directly to the internet. Instead, you could handle your ingress traffic behind a proxy. Have the proxy forward traffic to replicas and have them gossip the transactions internally. -### Improve Reliability of Peer-to-Peer transactions +## Improve Reliability of Peer-to-Peer transactions These flags can improve the reliability of peer-to-peer transactions from internal replica nodes and the sequencer node. @@ -84,6 +82,9 @@ GETH_TXPOOL_NOLOCALS: "true" For additional information about these flags, check out our [Execution Layer Configuration Options](/builders/node-operators/configuration/execution-config) doc. +## Write your own runbooks + +Create custom runbooks to prepare for operating an OP Stack chain. For a deeper understanding of daily operations and best practices, explore the public [OP Mainnet Runbooks](https://oplabs.notion.site/OP-Mainnet-Runbooks-120f153ee1628045b230d5cd3df79f63) to see how these practices could be applied to your own chain. ## Assumptions diff --git a/pages/builders/chain-operators/self-hosted.mdx b/pages/builders/chain-operators/self-hosted.mdx index 3a5edd689..200eb7f4b 100644 --- a/pages/builders/chain-operators/self-hosted.mdx +++ b/pages/builders/chain-operators/self-hosted.mdx @@ -105,8 +105,6 @@ They'll help you get a head start deploying your first OP Stack chain. You can also [suggest a new tutorial](https://github.com/ethereum-optimism/docs/issues/new?assignees=\&labels=tutorial%2Cdocumentation%2Ccommunity-request\&projects=\&template=suggest_tutorial.yaml\&title=%5BTUTORIAL%5D+Add+PR+title) if you have something specific in mind. We'd love to grow this list! -Lastly, for deeper insight into the day-to-day operations of OP Mainnet to see how these operational practices could apply to your chain, see the public [OP Mainnet Runbooks](https://oplabs.notion.site/OP-Mainnet-Runbooks-120f153ee1628045b230d5cd3df79f63). - ## Next Steps * After deploying your chain, check the [Rollup Operations](./management/operations) guide for common operations you'll need to run with your rollup. diff --git a/pages/builders/node-operators/rollup-node.mdx b/pages/builders/node-operators/rollup-node.mdx index ac84bdc47..dcffe980d 100644 --- a/pages/builders/node-operators/rollup-node.mdx +++ b/pages/builders/node-operators/rollup-node.mdx @@ -121,8 +121,6 @@ It is important to regularly monitor your node, and you can optionally configure | [Running an OP Mainnet Node from Source](tutorials/mainnet) | Learn how to run an OP Mainnet node from source code. | 🟡 Medium | | [Running an OP Sepolia Node from Source](tutorials/testnet) | Learn how to run an OP Sepolia node from source code. | 🟡 Medium | -For deeper insight into the day-to-day operations of OP Mainnet to see how these practices could apply to your own node operations, see the public [OP Mainnet Runbooks](https://oplabs.notion.site/OP-Mainnet-Runbooks-120f153ee1628045b230d5cd3df79f63). - ## Next Steps * If you've already got your node up and running, check out the [Node Metrics and Monitoring Guide](/builders/node-operators/management/metrics) to learn how to keep tabs on your node and make sure it keeps running smoothly. From 276b018e4a2e6b85b8741c607517e415a1b422a6 Mon Sep 17 00:00:00 2001 From: soyboy <85043086+sbvegan@users.noreply.github.com> Date: Mon, 28 Oct 2024 16:27:35 -0600 Subject: [PATCH 323/565] fixing linter --- words.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/words.txt b/words.txt index 79b22b4bd..be73f2ed6 100644 --- a/words.txt +++ b/words.txt @@ -306,7 +306,6 @@ REMOTEDB remotedb replayability replayor -reproven REQUIREDBLOCKS requiredblocks rollouts @@ -320,6 +319,8 @@ rpcs RPGF Rpgf rpgf +Runbooks +runbooks RWAs safedb Schnorr From 076632cf72152ee6318c371b05aa3c74ef25f414 Mon Sep 17 00:00:00 2001 From: soyboy <85043086+sbvegan@users.noreply.github.com> Date: Mon, 28 Oct 2024 16:58:42 -0600 Subject: [PATCH 324/565] Apply suggestions from code review Co-authored-by: Bradley Camacho <42678939+bradleycamacho@users.noreply.github.com> --- .../chain-operators/tools/op-deployer.mdx | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/pages/builders/chain-operators/tools/op-deployer.mdx b/pages/builders/chain-operators/tools/op-deployer.mdx index 14df3f678..cb71e4107 100644 --- a/pages/builders/chain-operators/tools/op-deployer.mdx +++ b/pages/builders/chain-operators/tools/op-deployer.mdx @@ -18,7 +18,7 @@ The recommended way to install `op-deployer` is to download the latest release f for your platform then extract it somewhere on your `PATH`. The rest of this tutorial will assume that you have installed `op-deployer` using this method. -To install from source, follow the steps below. You will need to install the Go toolchain and `just` as prerequisites. +To alternatively install from source, follow the steps below. You will need to install the Go toolchain and `just` as prerequisites. ### **Clone the monorepo**: @@ -47,9 +47,9 @@ The base use case for `op-deployer` is deploying new OP Chains. This process is -### `init`: configuring your chain +### `init`: configure your chain -To get started with `op-deployer`, you need to create an intent file that outlines your desired chain configuration. You can use the built-in `op-deployer` utility to generate this file. Just run the following command to create an example intent file for a development chain: +To get started with `op-deployer`, create an intent file that defines your desired chain configuration. Use the built-in `op-deployer` utility to generate this file: ``` ./bin/op-deployer init --l1-chain-id 11155111 --l2-chain-ids --workdir .deployer @@ -102,7 +102,7 @@ l2ContractsLocator = "tag://op-contracts/v1.7.0-beta.1+l2-contracts" # L2 smart ``` -By default, `op-deployer` will fill in all other configuration variables with those that match the [standard configuration](https://specs.optimism.io/protocol/configurability.html). You can override these defaults by adding them to your intent file by adding the following table: +By default, `op-deployer` will fill in all other configuration variables with those that match the [standard configuration](https://specs.optimism.io/protocol/configurability.html). You can override these default settings by adding them to your intent file using the table below: ```toml [globalDeployOverrides] @@ -128,7 +128,7 @@ configuration will be set to the Superchain-wide defaults - i.e., your chain wil and will use the same [protocol versions](https://github.com/ethereum-optimism/specs/blob/main/specs/protocol/superchain-upgrades.md) address as other chains on the Superchain. -### `inspect`: generating genesis files and chain information +### `inspect`: generate genesis files and chain information You will need to write the output of these commands to files to make an addition to the [Superchain Registry](https://github.com/ethereum-optimism/superchain-registry). @@ -153,11 +153,9 @@ op-deployer --workdir .deployer inspect l2-semvers # outputs the s ## Bootstrap Usage -`op-deployer` can also be used to deploy the contracts it needs to run the `init`... `apply` flow on new chains. -This process is called "bootstrapping," and is useful for when you want to use `op-deployer` with L3s, new testnets, -or other custom settlement chains. +You can also use `op-deployer` to deploy the contracts needed to run the `init`... `apply` flow on new chains. This process, called 'bootstrapping,' is useful when you want to use `op-deployer` with L3s, new testnets, or other custom settlement chains. -### OPCM Bootstrap +### OPCM bootstrap To deploy OPCM to a new chain, run the following command: From 877e8c4d921a089fc69dc2d89f409dbd94ed9f0a Mon Sep 17 00:00:00 2001 From: soyboy <85043086+sbvegan@users.noreply.github.com> Date: Mon, 28 Oct 2024 17:03:23 -0600 Subject: [PATCH 325/565] addressing superchain-registry callout --- pages/builders/chain-operators/tools/op-deployer.mdx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pages/builders/chain-operators/tools/op-deployer.mdx b/pages/builders/chain-operators/tools/op-deployer.mdx index cb71e4107..8a8e54399 100644 --- a/pages/builders/chain-operators/tools/op-deployer.mdx +++ b/pages/builders/chain-operators/tools/op-deployer.mdx @@ -41,7 +41,7 @@ To alternatively install from source, follow the steps below. You will need to i The binary will be in the `bin` directory. -## Deployment Usage +## Deployment usage The base use case for `op-deployer` is deploying new OP Chains. This process is broken down into three steps: @@ -131,7 +131,7 @@ address as other chains on the Superchain. ### `inspect`: generate genesis files and chain information - You will need to write the output of these commands to files to make an addition to the [Superchain Registry](https://github.com/ethereum-optimism/superchain-registry). + To add your chain to the [Superchain Registry](https://github.com/ethereum-optimism/superchain-registry) you will need to provide the chain artifacts. To get these chain artifacts, you will need to write the output of these commands to new files. You'll be inspecting the `state.json` file, so you need to navigate into your working directory to inspect the file. With the contracts deployed, you can generate the genesis and rollup configuration files. Run the following commands to do so: From 1bbc4b4230f27754baee40c3b1db3cb6c55a0e48 Mon Sep 17 00:00:00 2001 From: soyboy <85043086+sbvegan@users.noreply.github.com> Date: Mon, 28 Oct 2024 17:04:13 -0600 Subject: [PATCH 326/565] Apply suggestions from code review Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> Co-authored-by: Bradley Camacho <42678939+bradleycamacho@users.noreply.github.com> --- pages/builders/chain-operators/tools/op-deployer.mdx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pages/builders/chain-operators/tools/op-deployer.mdx b/pages/builders/chain-operators/tools/op-deployer.mdx index 8a8e54399..274e782a6 100644 --- a/pages/builders/chain-operators/tools/op-deployer.mdx +++ b/pages/builders/chain-operators/tools/op-deployer.mdx @@ -2,7 +2,7 @@ title: Deployer lang: en-US tags: ["op-deployer","eng-platforms"] -description: Learn how op-deployer can simplify deployment a standard OP Stack chain. +description: Learn how op-deployer can simplify deploying a standard OP Stack Chain. --- import {Callout, Steps} from 'nextra/components' @@ -134,7 +134,7 @@ address as other chains on the Superchain. To add your chain to the [Superchain Registry](https://github.com/ethereum-optimism/superchain-registry) you will need to provide the chain artifacts. To get these chain artifacts, you will need to write the output of these commands to new files. -You'll be inspecting the `state.json` file, so you need to navigate into your working directory to inspect the file. With the contracts deployed, you can generate the genesis and rollup configuration files. Run the following commands to do so: +Inspect the `state.json` file by navigating to your working directory. With the contracts deployed, generate the genesis and rollup configuration files by running the following commands:" ``` cd .deployer @@ -151,7 +151,7 @@ op-deployer --workdir .deployer inspect l2-semvers # outputs the s ``` -## Bootstrap Usage +## Bootstrap usage You can also use `op-deployer` to deploy the contracts needed to run the `init`... `apply` flow on new chains. This process, called 'bootstrapping,' is useful when you want to use `op-deployer` with L3s, new testnets, or other custom settlement chains. From 80c5b187c4f376f6425b06f91835f4fcc3350981 Mon Sep 17 00:00:00 2001 From: jsvisa Date: Tue, 29 Oct 2024 15:12:27 +0800 Subject: [PATCH 327/565] tutorials: make geth before using geth init Signed-off-by: jsvisa --- .../builders/chain-operators/tutorials/create-l2-rollup.mdx | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/pages/builders/chain-operators/tutorials/create-l2-rollup.mdx b/pages/builders/chain-operators/tutorials/create-l2-rollup.mdx index 93b2e978f..52c7b5370 100644 --- a/pages/builders/chain-operators/tutorials/create-l2-rollup.mdx +++ b/pages/builders/chain-operators/tutorials/create-l2-rollup.mdx @@ -503,6 +503,12 @@ cd ~/op-geth mkdir datadir ``` +{

    Build the op-geth binary

    } + +```bash +make geth +``` + {

    Initialize op-geth

    } ```bash From ac6c0e51690e170e4d3fdf15defb73ab5249a874 Mon Sep 17 00:00:00 2001 From: cpengilly <29023967+cpengilly@users.noreply.github.com> Date: Tue, 29 Oct 2024 00:55:40 -0700 Subject: [PATCH 328/565] superchain-weth --- pages/stack/interop/_meta.json | 3 +- pages/stack/interop/cross-chain-message.mdx | 2 +- pages/stack/interop/explainer.mdx | 4 +- pages/stack/interop/superchain-weth.mdx | 81 +++++++++++++++++++++ words.txt | 9 --- 5 files changed, 86 insertions(+), 13 deletions(-) create mode 100644 pages/stack/interop/superchain-weth.mdx diff --git a/pages/stack/interop/_meta.json b/pages/stack/interop/_meta.json index 0fad31024..49179f9c4 100644 --- a/pages/stack/interop/_meta.json +++ b/pages/stack/interop/_meta.json @@ -2,5 +2,6 @@ "explainer": "Interop explainer", "cross-chain-message": "Anatomy of cross-chain message", "supersim": "Supersim Multichain Development Environment", - "superchain-erc20": "SuperchainERC20 token standard" + "superchain-erc20": "SuperchainERC20 token standard", + "superchain-weth": "SuperchainWETH (Interoperable ETH)" } \ No newline at end of file diff --git a/pages/stack/interop/cross-chain-message.mdx b/pages/stack/interop/cross-chain-message.mdx index ae15b27c1..3d7d8d406 100644 --- a/pages/stack/interop/cross-chain-message.mdx +++ b/pages/stack/interop/cross-chain-message.mdx @@ -9,7 +9,7 @@ import Image from 'next/image' # Anatomy of a cross-chain message -A cross-chain message applies to any message sent across a chain. This applies to asset transfers using the [SuperchainERC20](https://specs.optimism.io/interop/token-bridging.html) token standard. +A cross-chain message applies to any message sent across a chain. This applies to asset transfers using the [SuperchainERC20](superchain-erc20) token standard. ## How it works diff --git a/pages/stack/interop/explainer.mdx b/pages/stack/interop/explainer.mdx index 4da94e360..d054afc89 100644 --- a/pages/stack/interop/explainer.mdx +++ b/pages/stack/interop/explainer.mdx @@ -24,8 +24,8 @@ Native OP Stack interoperability provides the ability to read messages and trans ## Secure message passing Superchain interop includes both the protocol layer message passing and the Superchain ERC20 token specification. -* **Message passing protocol:** the initial + finalizing/executing [message](https://specs.optimism.io/interop/messaging.html) that fire events to be consumed by the chains in the [dependency set](https://specs.optimism.io/interop/dependency-set.html) -* **SuperchainERC20 token specification**: the [SuperchainERC20](https://specs.optimism.io/interop/token-bridging.html) turns message passing into asset transfer between chains in the interop set. Learn more about how the SuperchainERC20 token standard enables asset interoperability in the Superchain [here](/stack/interop/superchain-erc20) +* **Message passing protocol:** the initial + finalizing/executing [message](cross-chain-message) that fire events to be consumed by the chains in the [dependency set](https://specs.optimism.io/interop/dependency-set.html) +* **SuperchainERC20 token specification**: the [SuperchainERC20](superchain-erc20) turns message passing into asset transfer between chains in the interop set. Learn more about how the SuperchainERC20 token standard enables asset interoperability in the Superchain [here](/stack/interop/superchain-erc20) This means ETH and ERC-20s can seamlessly and securely move across L2s, and intent-based protocols (i.e., bridges) can build better experiences on top of the message passing protocol. diff --git a/pages/stack/interop/superchain-weth.mdx b/pages/stack/interop/superchain-weth.mdx new file mode 100644 index 000000000..ac71d63df --- /dev/null +++ b/pages/stack/interop/superchain-weth.mdx @@ -0,0 +1,81 @@ +--- +title: SuperchainWETH (Interoperable ETH) +lang: en-US +description: Learn basic details about the SuperchainWETH or Interoperable ETH. +--- + +import { Callout } from 'nextra/components' + +# SuperchainWETH (Interoperable ETH) + + + Interop is currently in active development and not yet ready for production use. The information provided here may change. Check back regularly for the most up-to-date information. + + +Superchain WETH or Interoperable ETH is a specialized version of the standard WETH (Wrapped Ether) contract designed to enable seamless movement of ETH across the Superchain. It addresses the liquidity constraints and usability issues that arise when transferring ETH between different chains. + +## Features and benefits + +* Enables seamless ETH transfers across different chains in the Superchain +* Minimizes protocol complexity by treating ETH as an ERC-20 token +* Maintains fungibility of ETH across the Superchain +* Provides liquidity for cross-chain transactions +* Supports interoperability between chains with different native assets (i.e., gas tokens) +* Improves user experience by abstracting complex bridging processes + + + `SuperchainWETH` requires `SuperchainTokenBridge` integration for full interoperable, cross-chain functionality. + + +## How it works + +Interoperable ETH (Superchain WETH) facilitates secure movement of ETH across the Superchain via `crosschainBurn` and `crosschainMint`. + +* **`crosschainBurn`**: Facilitates cross-chain transfers by **burning** WETH. The user sends ETH to the `SuperchainWETH` contract. `SuperchainWETH` interacts with `ETHLiquidity` to burn the ETH and sends a cross-chain message via the `L2ToL2CrossDomainMessenger` to the destination chain. +* **`crosschainMint`**: Mints WETH on the destination chain after a cross-chain transfer. The user receives ETH or WETH on the destination chain. If the destination is a non-custom gas token chain, ETH is sourced from the `ETHLiquidity` contract. + +```mermaid +sequenceDiagram + participant User + participant SuperchainWETH + participant ETHLiquidity + participant L2ToL2CrossDomainMessenger + participant DestinationChain + + User->>SuperchainWETH: Send ETH + SuperchainWETH->>ETHLiquidity: Burn ETH + SuperchainWETH->>L2ToL2CrossDomainMessenger: Send cross-chain message + L2ToL2CrossDomainMessenger->>DestinationChain: Relay message + DestinationChain->>SuperchainWETH: Call relayETH/relayERC20 + SuperchainWETH->>ETHLiquidity: Source ETH (if non-custom gas token chain) + SuperchainWETH->>User: Receive ETH/WETH on destination chain +``` + +This diagram illustrates the process where the user sends ETH to the `SuperchainWETH` contract which burns the ETH and sends a cross-chain message to the destination chain, enabling seamless cross-chain ETH transfers without the need for asset wrapping. + +## Major components + +### `SuperchainWETH` Contract + +This contract implements the core functionality for wrapping, unwrapping, and cross-chain transfer of ETH. It integrates with the `SuperchainTokenBridge` for interoperable actions. +* Contract address: `0x4200000000000000000000000000000000000024` + +### `ETHLiquidity` Contract + +A predeploy contract with a large pool of ETH that provides liquidity for cross-chain transfers. It allows "burning" and "minting" of ETH for cross-chain transfers. +* Contract address: `0x4200000000000000000000000000000000000025` + +### `L2ToL2CrossDomainMessenger` Contract + +This predeploy contract facilitates general message passing between different chains in the Superchain. It also securely transfers ERC20 tokens between L2 chains. +* Contract address: `0x4200000000000000000000000000000000000023` + + + `SuperchainWETH` implements strict access controls to ensure security (e.g., only `SuperchainWETH` can call `ETHLiquidity` functions). + + +## Next steps + +* Explore the [`SuperchainWETH`](https://specs.optimism.io/interop/superchain-weth.html) specs for in-depth implementation details. +* Learn more about [cross-chain messages](cross-chain-message) and the [SuperchainERC20 token standard](superchain-erc20). +* Review the [Superchain Interop Explainer](explainer) for answers to common questions about interoperability. diff --git a/words.txt b/words.txt index be73f2ed6..bfbf88387 100644 --- a/words.txt +++ b/words.txt @@ -11,7 +11,6 @@ Allocs allocs altda ANDI -Ankr Apeworx Arweave authrpc @@ -148,7 +147,6 @@ Holesky holesky IGNOREPRICE ignoreprice -Immunefi implicity Inator inator @@ -197,7 +195,6 @@ minsuggestedpriorityfee Mintable Mintplex MIPSEVM -Mitigations Monitorism Moralis Mordor @@ -291,8 +288,6 @@ Protip Proxied proxyd pseudorandomly -Pyth -Pyth's QRNG Quicknode quicknode @@ -326,9 +321,6 @@ safedb Schnorr secp SELFDESTRUCT -SEPOLIA -Sepolia -sepolia seqnr SEQUENCERHTTP sequencerhttp @@ -396,7 +388,6 @@ VMDEBUG vmdebug VMODULE vmodule -voxel wagmi Warpcast xlarge From e643ab4583cd8749462f1f4aefaba0665ea5bfc6 Mon Sep 17 00:00:00 2001 From: cpengilly <29023967+cpengilly@users.noreply.github.com> Date: Tue, 29 Oct 2024 01:50:23 -0700 Subject: [PATCH 329/565] Update superchain-weth.mdx --- pages/stack/interop/superchain-weth.mdx | 1 - 1 file changed, 1 deletion(-) diff --git a/pages/stack/interop/superchain-weth.mdx b/pages/stack/interop/superchain-weth.mdx index ac71d63df..f2547d687 100644 --- a/pages/stack/interop/superchain-weth.mdx +++ b/pages/stack/interop/superchain-weth.mdx @@ -77,5 +77,4 @@ This predeploy contract facilitates general message passing between different ch ## Next steps * Explore the [`SuperchainWETH`](https://specs.optimism.io/interop/superchain-weth.html) specs for in-depth implementation details. -* Learn more about [cross-chain messages](cross-chain-message) and the [SuperchainERC20 token standard](superchain-erc20). * Review the [Superchain Interop Explainer](explainer) for answers to common questions about interoperability. From 6e6901000c329eaf91baffc6e6e257463fd64e39 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Tue, 29 Oct 2024 11:25:10 +0100 Subject: [PATCH 330/565] fix lint issues --- words.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/words.txt b/words.txt index bfbf88387..00a5dcdd9 100644 --- a/words.txt +++ b/words.txt @@ -6,6 +6,7 @@ ADDI ADDIU ADDU airgap +Sepolia Allnodes Allocs allocs From 4d87f5c0fa417f8dd1354edb453a7c08edda3f37 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Tue, 29 Oct 2024 11:30:56 +0100 Subject: [PATCH 331/565] fix lint spelling issues --- words.txt | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/words.txt b/words.txt index 00a5dcdd9..376553b4f 100644 --- a/words.txt +++ b/words.txt @@ -1,17 +1,17 @@ -ACCOUNTQUEUE accountqueue +ACCOUNTQUEUE ACCOUNTSLOTS accountslots ADDI ADDIU ADDU airgap -Sepolia Allnodes Allocs allocs altda ANDI +Ankr Apeworx Arweave authrpc @@ -29,8 +29,8 @@ BLOBPOOL blobpool blobspace blockhash -blocklists BLOCKLOGS +blocklists blocklogs BLOCKPROFILERATE blockprofilerate @@ -148,6 +148,7 @@ Holesky holesky IGNOREPRICE ignoreprice +Immunefi implicity Inator inator @@ -196,6 +197,7 @@ minsuggestedpriorityfee Mintable Mintplex MIPSEVM +Mitigations Monitorism Moralis Mordor @@ -289,6 +291,8 @@ Protip Proxied proxyd pseudorandomly +Pyth +Pyth's QRNG Quicknode quicknode @@ -322,6 +326,7 @@ safedb Schnorr secp SELFDESTRUCT +Sepolia seqnr SEQUENCERHTTP sequencerhttp @@ -389,6 +394,7 @@ VMDEBUG vmdebug VMODULE vmodule +voxel wagmi Warpcast xlarge @@ -397,4 +403,4 @@ xtensibility ZKPs ZKVM Zora -zora +zora \ No newline at end of file From a14b61778a2647f6d8b4793fb85fee3eab7ae5d9 Mon Sep 17 00:00:00 2001 From: cpengilly <29023967+cpengilly@users.noreply.github.com> Date: Tue, 29 Oct 2024 04:58:15 -0700 Subject: [PATCH 332/565] Create op-supervisor.mdx --- pages/stack/interop/op-supervisor.mdx | 73 +++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 pages/stack/interop/op-supervisor.mdx diff --git a/pages/stack/interop/op-supervisor.mdx b/pages/stack/interop/op-supervisor.mdx new file mode 100644 index 000000000..32ff4a68c --- /dev/null +++ b/pages/stack/interop/op-supervisor.mdx @@ -0,0 +1,73 @@ +--- +title: OP-Supervisor +lang: en-US +description: Learn the basics of OP-Supervisor. +--- + +import { Callout, Tabs, Steps } from 'nextra/components' + +# OP-Supervisor + + + Interop is currently in active development and not yet ready for production use. The information provided here may change. Check back regularly for the most up-to-date information. + + +`op-supervisor` is a critical service designed to verify cross-chain messages and manage the safety of interoperability between different chains in the OP Stack. It acts as a hub for indexing data that every `op-node` needs to cross-verify with other chains. + +## Features and benefits + +* Enables secure cross-chain message passing on the Superchain +* Provides a centralized point for managing interoperability data +* Reduces the complexity and cost of operating individual nodes +* Supports multiple networks simultaneously +* Offers potential for public endpoints to aid in node synchronization + +## Major components + +### Cross-chain message verification + +Verifies messages between different chains in the OP Stack, reducing the risk of invalid or malicious cross-chain interactions.⁠ It centralizes the verification process, which reduces the complexity and cost of operating individual nodes⁠.⁠ + +* `op-geth`: queries `op-supervisor` during block-building to verify if a message is sufficiently safe to include. This process involves checking each executing message and potentially undoing transactions if conflicts or unknown states are encountered. +* `op-node`: queries cross-chain safety information and coordinates safety updates between OP stack nodes and `op-supervisor`. It uses the API provided by `op-supervisor` to perform actions like: + * Updating and retrieving various safety levels + * Checking and returning the `cross-unsafe` head for a given chain + * Attempting to promote a block to `cross-safe` status + * Attempting to finalize an L2 block based on L1 finality + +### Safe data indexing and management + +Acts as a hub for indexing data that every `op-node` needs to cross-verify with other chains, centralizing the process of managing interoperability data. Maintains the integrity of cross-chain interactions by tracking safety changes⁠ across the Superchain, ensuring consistent application of invalid dependency resolutions. ⁠ + +`op-supervisor` indexes two types of cross-chain dependencies: + +* Interop messages (events): `op-supervisor`maintains an events-index per L2 chain, which determines message-dependencies to check if blocks are safe +* L1 DA (data availability) batches: `op-supervisor`maintains a DA safety-index per L2 chain, which helps determine how to rewind L2 chains to resolve invalid dependencies + +### API for cross-chain safety + +Provides an interface for `op-node` to query cross-chain safety information and coordinate safety updates between OP stack nodes and `op-supervisor⁠⁠`. OP-Supervisor uses a global read API to determine **message safety** and **block safety,** utilizing both the events index and the safety index (See op-supervisor's [safe data indexing](#safe-data-indexing-and-management)). The API is designed to handle potential L1 reorgs that can affect the validity of cross-chain messages⁠. + +Key API methods include: + +| Method | Description | +| -------------------- | ---------------------------------------------------------------------------------------- | +| `ExchangeSyncStatus` | Updates and retrieves various safety levels (LocalUnsafe, CrossUnsafe, LocalSafe, etc.)⁠ | +| `TryCrossUnsafe` | Checks and returns the cross-unsafe head for a given chain⁠⁠​ | +| `TryCrossSafe` | Attempts to promote a block to cross-safe status⁠⁠​ | +| `TryFinalize` | Attempts to finalize an L2 block based on L1 finality⁠ | + +### RPC access to all chains + +The `op-supervisor` requires RPC access to all chains in the dependency set. This allows `op-supervisor` to verify cross-chain messages and sync data across multiple networks simultaneously, such as OP Mainnet and Base nodes using the same instance. + +Benefits of this approach: + +* Cost-effective: Running `op-supervisor` is cheaper than running a full node for each chain in the dependency set. +* Scalability: As the number of chains in the Superchain grows, `op-supervisor` can handle the increasing complexity of cross-chain interactions. +* Improved reliability: It enables a more redundant setup, which is good for stability in the growing ecosystem. + +## Next steps + +* Want to learn more? Read our guide on the anatomy of a [cross-chain message](/stack/interop/cross-chain-message) or check out this [interop design video walk-thru](https://www.youtube.com/watch?v=FKc5RgjtGes). +* For more info about how OP Stack interoperability works under the hood, [check out the specs](https://specs.optimism.io/interop/overview.html). From e95498fc6336513c64e42e4e0df3ebbae6e117c3 Mon Sep 17 00:00:00 2001 From: krofax Date: Tue, 29 Oct 2024 15:43:52 +0100 Subject: [PATCH 333/565] Cleaned the code --- next-env.d.ts | 2 +- pages/stack/interop/_meta.json | 2 +- pages/stack/interop/message-passing.mdx | 288 +++++++++++++++++++----- 3 files changed, 228 insertions(+), 64 deletions(-) diff --git a/next-env.d.ts b/next-env.d.ts index 4f11a03dc..a4a7b3f5c 100644 --- a/next-env.d.ts +++ b/next-env.d.ts @@ -2,4 +2,4 @@ /// // NOTE: This file should not be edited -// see https://nextjs.org/docs/basic-features/typescript for more information. +// see https://nextjs.org/docs/pages/building-your-application/configuring/typescript for more information. diff --git a/pages/stack/interop/_meta.json b/pages/stack/interop/_meta.json index fc2575737..0b88cd36e 100644 --- a/pages/stack/interop/_meta.json +++ b/pages/stack/interop/_meta.json @@ -3,5 +3,5 @@ "cross-chain-message": "Anatomy of cross-chain message", "supersim": "Supersim Multichain Development Environment", "superchain-erc20": "SuperchainERC20 token standard", - "general-message-passing": "How to use general message passing on OP Stack" + "message-passing": "General message passing with Interop" } \ No newline at end of file diff --git a/pages/stack/interop/message-passing.mdx b/pages/stack/interop/message-passing.mdx index dcf42cd62..97b3cb01c 100644 --- a/pages/stack/interop/message-passing.mdx +++ b/pages/stack/interop/message-passing.mdx @@ -1,97 +1,261 @@ --- -title: How to use general message passing on OP Stack +title: 'Message Passing with Interop' lang: en-US -description: Learn how to use general message passing on OP Stack using OP Stack cross-chain messaging standards. +description: 'Learn how to implement cross-chain message passing using interop messaging.' --- import { Steps } from 'nextra/components' -# How to use general message passing on OP Stack +# Message passing with Interop -Optimism supports cross-chain message passing, allowing communication between Ethereum and Optimism chains. This guide provides step-by-step instructions for general message passing without using Supersim, following Optimism's cross-chain messaging standards. +This guide explains how to implement cross-chain message passing using interop messaging. +You'll learn the core concepts and implementation details independent of specific tooling. -## Overview of cross-chain messaging +## Message passing concepts -Cross-chain messaging on Optimism allows messages to be sent from one chain (e.g., Ethereum) to another (e.g., Optimism) using specific contracts: +Before diving into implementation, it's crucial to understand the core concepts of interop message passing: -* **MessagePasser contract** on the source chain. -* **MessageReceiver contract** on the destination chain. +### Message structure -For more information, refer to the [Optimism Messaging Specification](https://specs.optimism.io/interop/messaging.html) and the [Cross-Chain Message Documentation](https://docs.optimism.io/stack/protocol/interop/cross-chain-message). +A message is a broadcast payload emitted from an identified source. It consists of: -## Step 1: Prepare the cross-chain message +* **Message Payload**: Raw bytes representing a Log, created by concatenating topics and data +* **Unique Identifier**: A structure that points to a specific log emission +* **Execution Context**: Information about where and how the message should be processed -To send a message from one chain to another, follow these steps to prepare and send a message. +### Message payload construction -1. Define the Message Content +```typescript +// Message payload is constructed by concatenating: +// 1. All event topics (each 32 bytes) +// 2. The event data +messagePayload = eventTopics.concat(eventData) +``` -Define the data you want to pass across the chains. This message may include function calls, values, or arbitrary data. +### Message identifier components -```typescript -const messageData = "0xYourMessageData"; // Replace with your actual data +```solidity +struct Identifier { + address origin; // Contract that emitted the log + uint256 blockNumber; // Block number of emission + uint256 logIndex; // Position in block's logs array + uint256 timestamp; // Emission timestamp + uint256 chainId; // Chain identifier where message originated +} ``` -2. Specify the Target Contract and Function - Identify the target contract and function you want to call on the destination chain. Ensure this contract is deployed on both chains if you need bi-directional communication. +## How It works -## Step 2: Send the Message +### Message lifecycle -1. Call the MessagePasser Contract - On the source chain, call the MessagePasser contract with the message data. This contract serves as an entry point for cross-chain messages on Optimism. +The cross-chain messaging process follows a specific lifecycle: -```typescript -import { viem } from 'viem'; - -const tx = await viem.writeContract({ - address: '0xYourMessagePasserAddress', // Replace with the MessagePasser contract address - abi: MessagePasserABI, // The ABI of the MessagePasser contract - functionName: 'sendMessage', - args: [targetAddress, messageData], -}); -``` +1. **Message Creation**: Events on source chain become initiating messages +2. **Message Serialization**: Converting log data into a standardized format +3. **Identifier Creation**: Generating unique identifiers for message tracking +4. **Message Execution**: Processing messages on destination chain -2. Confirm the transaction - Once you send the message, wait for the transaction confirmation. This confirmation ensures that the message has been successfully sent and recorded on the source chain. +### Message processing flow -```typescript -await tx.wait(); -console.log('Message sent successfully'); -``` +1. **Source chain**: + * Event emission triggers message creation + * System generates unique identifier + * Message is serialized and prepared for transmission -## Step 3: Receive the message on the destination chain +2. **Cross-Chain transit**: + * Message payload is prepared for relay + * System validates message structure + * Cross-chain proof is generated -After the message is sent, it will need to be relayed and processed on the destination chain. +3. **Destination chain**: + * Message receipt and validation + * Execution of message content + * Verification of successful processing -1. Relay the message - Relay the message manually or use an automatic relay solution. To relay manually, use the MessageReceiver contract's function to receive and process the message. +## Implementation guide -```typescript -const relayTx = await viem.writeContract({ - address: '0xYourMessageReceiverAddress', // Replace with the MessageReceiver contract address - abi: MessageReceiverABI, // The ABI of the MessageReceiver contract - functionName: 'receiveMessage', - args: [messageData], -}); -``` + + ### Prepare message sending -2. Confirm the message reception - Wait for the message reception transaction to confirm. + The [CrossChainMessenger](https://github.com/ethereum-optimism/optimism/blob/92ed64e171c6eb9c6a080c626640e8836f0653cc/packages/contracts-bedrock/src/L2/L2ToL2CrossDomainMessenger.sol) contract serves as the primary interface for cross-chain communication. + It initializes the connection to the L2 messenger contract and provides the base functionality for sending messages across chains. -```typescript -await relayTx.wait(); -console.log('Message received on destination chain'); -``` + Key components: + + * L2\_MESSENGER: The address of the L2 cross-domain messenger contract + * sendCrossChainMessage: Function to initiate cross-chain message sending + + ```solidity + contract CrossChainMessenger { + address public immutable L2_MESSENGER = 0x4200000000000000000000000000000000000023; + + function sendCrossChainMessage( + address _target, // Destination contract address + bytes memory _message, // Message content to be sent + uint32 _gasLimit // Gas limit for execution on destination + ) external { + IL2CrossDomainMessenger(L2_MESSENGER).sendMessage( + _target, + _message, + _gasLimit + ); + } + } + ``` + + ### Send the message + + This function handles the actual transmission of your message to the destination chain. It manages: + + * Contract interaction with the messenger + * Gas limit settings for the transaction + * Error handling during transmission + * Returns the transaction hash for tracking + + ```typescript + async function sendMessage( + messenger: address, // Address of the messenger contract + target: address, // Destination contract address + message: bytes, // Message content to be transmitted + gasLimit: number // Execution gas limit + ): Promise { + // Send the message with appropriate gas settings + const tx = await contract.sendMessage( + target, + message, + gasLimit, + { gasLimit: 200000 } // Transaction gas limit for sending + ); + + return tx.hash; + } + ``` + + ### Create message identifier + + Creates a unique identifier for tracking your message across chains. This function: + + * Retrieves transaction details + * Locates the specific message event + * Constructs the identifier structure with: + * Origin address + * Block information + * Chain details + * Timing data + + ```typescript + async function createMessageIdentifier( + txHash: string, // Transaction hash of the sent message + provider: Provider // Network provider for accessing chain data + ): Promise { + // Get transaction and block information + const receipt = await provider.getTransactionReceipt(txHash); + const block = await provider.getBlock(receipt.blockNumber); + + // Find the message sent event + const sentEvent = receipt.logs.find(log => + log.address === L2_MESSENGER_ADDRESS && + log.topics[0] === SENT_MESSAGE_EVENT_SIGNATURE + ); + + if (!sentEvent) throw new Error("Message event not found"); + + // Construct and return the identifier + return { + origin: L2_MESSENGER_ADDRESS, + blockNumber: receipt.blockNumber, + logIndex: sentEvent.logIndex, + timestamp: block.timestamp, + chainId: provider.network.chainId + }; + } + ``` + + ### Construct message payload + + Assembles the complete message payload for transmission. This function: + + * Concatenates event topics and data + * Formats the payload for cross-chain transmission + * Ensures proper byte alignment + * Maintains data integrity + + ```typescript + function constructMessagePayload( + topics: string[], // Event topics to include + data: string // Additional message data + ): string { + // Combine topics and data into a single payload + return ethers.utils.hexConcat([ + ...topics, + data + ]); + } + ``` + + ### Relay the message + + Executes the message on the destination chain. This function: + + * Creates a messenger contract instance + * Sends the relay transaction + * Handles gas estimation + * Manages transaction confirmation + * Returns the transaction hash + + ```typescript + async function relayMessage( + identifier: Identifier, // Message identifier from source chain + payload: string, // Constructed message payload + provider: Provider // Network provider for destination chain + ): Promise { + // Initialize messenger contract + const messenger = new Contract( + L2_MESSENGER_ADDRESS, + L2_MESSENGER_ABI, + provider.getSigner() + ); + + // Send relay transaction with appropriate gas limit + const tx = await messenger.relayMessage( + identifier, + payload, + { gasLimit: 500000 } + ); + + return tx.hash; + } + ``` -## Error Handling and troubleshooting + ### Verify message receipt -* Ensure Contract Compatibility: Verify that both MessagePasser and MessageReceiver contracts are compatible and have matching function signatures on each chain. + Confirms that your message was successfully processed on the destination chain. This function: -* Gas Fees: Check that you have enough funds to cover the gas fees for message passing on both chains. + * Retrieves the transaction receipt + * Checks for the relay event + * Verifies processing status + * Returns success/failure status -* Event Logs: Use event logs to debug and confirm message delivery at each stage. + ```typescript + async function verifyMessageRelayed( + txHash: string, // Transaction hash of the relay transaction + provider: Provider // Network provider for destination chain + ): Promise { + // Get transaction receipt + const receipt = await provider.getTransactionReceipt(txHash); + + // Check for successful relay event + return receipt.logs.some(log => + log.address === L2_MESSENGER_ADDRESS && + log.topics[0] === RELAYED_MESSAGE_EVENT_SIGNATURE + ); + } + ``` + -## Additional Resources +## Next steps -For further guidance on interop messaging and cross-chain message handling, see: -* -* +* More questions? Read our guide on the anatomy of a [cross-chain message](cross-chain-message) +* Use [Supersim](supersim), a local dev environment that simulates Superchain interop for testing applications against a local version of the Superchain. +* Use [viem bindings/actions](https://supersim.pages.dev/guides/interop/relay-using-viem.html)the guide will show you how to use viem bindings/actions to fetch identifiers and relay messages. +* Read how to manually [relay interop messages](https://supersim.pages.dev/guides/interop/manually-relaying-interop-messages-cast) with cast and `L2ToL2CrossDomainMessenger` From d703984b8a7640acc2ffc90d9d0df963aecc8dbb Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Tue, 29 Oct 2024 16:27:19 +0100 Subject: [PATCH 334/565] Update nouns.txt Co-authored-by: soyboy <85043086+sbvegan@users.noreply.github.com> --- nouns.txt | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/nouns.txt b/nouns.txt index 22467f4ab..49bee1513 100644 --- a/nouns.txt +++ b/nouns.txt @@ -1,12 +1,5 @@ Optimism OP Mainnet Ethereum -JavaScript -NFT -Web3 -DeFi -DAO -EVM -L2 -dApp +OP Stack MetaMask \ No newline at end of file From fcf34502ddf515f95747537ff4e813d8c0805ffd Mon Sep 17 00:00:00 2001 From: cpengilly <29023967+cpengilly@users.noreply.github.com> Date: Tue, 29 Oct 2024 10:53:40 -0700 Subject: [PATCH 335/565] fix superchainerc20 language - update language - update _meta.json files - update nouns.txt --- nouns.txt | 15 +++++++++- .../app-developers/contracts/_meta.json | 2 +- pages/stack/interop/_meta.json | 2 +- pages/stack/interop/superchain-erc20.mdx | 28 +++++++++---------- 4 files changed, 30 insertions(+), 17 deletions(-) diff --git a/nouns.txt b/nouns.txt index 49bee1513..6fd4a3cab 100644 --- a/nouns.txt +++ b/nouns.txt @@ -2,4 +2,17 @@ Optimism OP Mainnet Ethereum OP Stack -MetaMask \ No newline at end of file +MetaMask +SuperchainERC20 +ZK +Security Council +Sequencer PBS +Superchain Registry +Retro Funding +Alt-DA +Teleportr +Dev Console +Granite +Holocene +Monitorism +Kubernetes diff --git a/pages/builders/app-developers/contracts/_meta.json b/pages/builders/app-developers/contracts/_meta.json index 535326a4c..c4b36699f 100644 --- a/pages/builders/app-developers/contracts/_meta.json +++ b/pages/builders/app-developers/contracts/_meta.json @@ -2,5 +2,5 @@ "compatibility": "Solidity compatibility", "system-contracts": "System contracts", "optimization": "Cost optimization", - "superchain-erc20": "SuperchainERC20 token standard" + "superchain-erc20": "SuperchainERC20" } diff --git a/pages/stack/interop/_meta.json b/pages/stack/interop/_meta.json index 0fad31024..304ddf4a7 100644 --- a/pages/stack/interop/_meta.json +++ b/pages/stack/interop/_meta.json @@ -2,5 +2,5 @@ "explainer": "Interop explainer", "cross-chain-message": "Anatomy of cross-chain message", "supersim": "Supersim Multichain Development Environment", - "superchain-erc20": "SuperchainERC20 token standard" + "superchain-erc20": "SuperchainERC20" } \ No newline at end of file diff --git a/pages/stack/interop/superchain-erc20.mdx b/pages/stack/interop/superchain-erc20.mdx index 092af2cb4..77d7daf41 100644 --- a/pages/stack/interop/superchain-erc20.mdx +++ b/pages/stack/interop/superchain-erc20.mdx @@ -1,29 +1,29 @@ --- -title: SuperchainERC20 Token Standard +title: SuperchainERC20 lang: en-US -description: Learn basic details about the SuperchainERC20 token standard. +description: Learn basic details about SuperchainERC20 implementation. --- import { Callout } from 'nextra/components' -# SuperchainERC20 Token Standard +# SuperchainERC20 Interop is currently in active development and not yet ready for production use. The information provided here may change. Check back regularly for the most up-to-date information. -`SuperchainERC20` is a token standard designed to enable asset interoperability in the Superchain. +`SuperchainERC20` is designed to enable asset interoperability in the Superchain. Asset interoperability allows for tokens to securely move across chains without asset wrapping or liquidity pools for maximal capital efficiency, thus unifying liquidity and simplifying the user experience. Additional features: -* **Simplified deployments**: Provides a consistent, unified standard for tokens across all Superchain-compatible networks and a common crosschain interface for the EVM ecosystem at large. +* **Simplified deployments**: Provides a consistent, unified implementation for tokens across all Superchain-compatible networks and a common crosschain interface for the EVM ecosystem at large. * **Permissionless propagation**: Easily clone an existing token contract to a new OP Stack chain using `create2` without requiring the original owner, which enables movement of assets to the new chain once Interop goes live. Importantly, permissionless propagation retains the integrity of the original owner on the contract and preserves security but proliferates the contract's availability to new chains. -* **Ethereum-aligned**: Intentionally designed to be generic and supported as an Ethereum-wide standard (RIP coming soon). +* **Ethereum-aligned**: Intentionally designed to be generic and supported as an Ethereum-wide implementation (RIP coming soon). ## How it works -`SuperchainERC20` token standard facilitates secure token transfers between chains in the Superchain networks via native burning and minting. +`SuperchainERC20` facilitates secure token transfers between chains in the Superchain networks via native burning and minting. * **Token Burning**: Initiating message where token is **burned** on the source chain. A user initiates a transfer of token from one blockchain to another and specifies the recipient wallet address on the destination chain. A specified amount of token is burned on the source chain. * **Token Minting**: Executing message where token is **minted** on the destination chain. The specified amount of token is minted on the destination chain directly to the recipient wallet address. @@ -55,19 +55,19 @@ This diagram illustrates the process where tokens are burned on the source chain ## Major components -* **Token Contract**: implements the `SuperchainERC20` standard with bridging functionality. +* **Token Contract**: implements `SuperchainERC20` with bridging functionality. * **Factory Predeploy**: uses a `create2`-based factory for deploying `SuperchainERC20` tokens consistently across chains. * **Bridging Functions**: using methods like `sendERC20` and `relayERC20` for cross-chain transfers. -## Comparison to other standards +## Comparison to other tokens -`SuperchainERC20` differs from other token standards in its focus and implementation: +`SuperchainERC20` differs from other tokens in its focus and implementation: -* `SuperchainERC20` has minimal differentiation from a standard ERC20 deployment, only requiring a minimal crosschain mint/burn interface, which aims to be a common pattern for the EVM ecosystem (RIP coming soon). +* `SuperchainERC20` has minimal differentiation from an ERC20 deployment, only requiring a minimal crosschain mint/burn interface, which aims to be a common pattern for the EVM ecosystem (RIP coming soon). * `SuperchainERC20` shares trust assumptions across all chains in the Superchain, such that custom assumptions around security and latency are not required to account for when executing transfers. - Projects moving from other token standards may need to adapt to the `SuperchainERC20` specification. + Projects moving from other token implementations may need to adapt to the `SuperchainERC20` specification. ## Implementation details @@ -77,10 +77,10 @@ Application developers must do two things to make their tokens `SuperchainERC20` 1. Permission only `SuperchainERC20Bridge` to call `crosschainMint` and `crosschainBurn`. 2. Deployment at same address on every chain in the Superchain using `create2` function. -For now, application developers should view `SuperchainERC20`as standard ERC20 tokens with additional built-in functions that allow cross-chain asset movement that will be enabled once Interop goes live. +For now, application developers should view `SuperchainERC20`as ERC20 tokens with additional built-in functions that allow cross-chain asset movement that will be enabled once Interop goes live. - To enable asset interoperability, `SuperchainERC20` token must give access to the address where the future `SuperchainERC20Bridge` will live. + To enable asset interoperability, `SuperchainERC20` must give access to the address where the future `SuperchainERC20Bridge` will live. ## Next steps From b91ced02c4509182f4cbae21d162f2c161f34fd9 Mon Sep 17 00:00:00 2001 From: cpengilly <29023967+cpengilly@users.noreply.github.com> Date: Tue, 29 Oct 2024 12:45:46 -0700 Subject: [PATCH 336/565] Apply suggestions from code review Co-authored-by: soyboy <85043086+sbvegan@users.noreply.github.com> --- pages/stack/interop/superchain-erc20.mdx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pages/stack/interop/superchain-erc20.mdx b/pages/stack/interop/superchain-erc20.mdx index 77d7daf41..6542f6ae5 100644 --- a/pages/stack/interop/superchain-erc20.mdx +++ b/pages/stack/interop/superchain-erc20.mdx @@ -1,7 +1,7 @@ --- title: SuperchainERC20 lang: en-US -description: Learn basic details about SuperchainERC20 implementation. +description: Learn about the basic details of the SuperchainERC20 implementation. --- import { Callout } from 'nextra/components' @@ -59,9 +59,9 @@ This diagram illustrates the process where tokens are burned on the source chain * **Factory Predeploy**: uses a `create2`-based factory for deploying `SuperchainERC20` tokens consistently across chains. * **Bridging Functions**: using methods like `sendERC20` and `relayERC20` for cross-chain transfers. -## Comparison to other tokens +## Comparison to other token implementations -`SuperchainERC20` differs from other tokens in its focus and implementation: +`SuperchainERC20` differs from other token implementations in its focus and implementation: * `SuperchainERC20` has minimal differentiation from an ERC20 deployment, only requiring a minimal crosschain mint/burn interface, which aims to be a common pattern for the EVM ecosystem (RIP coming soon). * `SuperchainERC20` shares trust assumptions across all chains in the Superchain, such that custom assumptions around security and latency are not required to account for when executing transfers. From 5c07df4609055273101860f898c7308d62f008f9 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Wed, 30 Oct 2024 11:46:05 +0100 Subject: [PATCH 337/565] updated pnpm package --- pnpm-lock.yaml | 8504 ++++++++++++++++++++++++++++-------------------- words.txt | 12 - 2 files changed, 4892 insertions(+), 3624 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5c07b690d..408b01112 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,4 +1,4 @@ -lockfileVersion: '6.0' +lockfileVersion: '9.0' settings: autoInstallPeers: true @@ -15,209 +15,3860 @@ patchedDependencies: hash: jaxvkozlhcbn7zjsiti5ocoubi path: patches/remark-lint-frontmatter-schema@3.15.4.patch -dependencies: - '@eth-optimism/contracts-ts': - specifier: ^0.17.0 - version: 0.17.0(typescript@5.3.2) - '@eth-optimism/tokenlist': - specifier: ^9.0.9 - version: 9.0.9 - '@feelback/react': - specifier: ^0.3.4 - version: 0.3.4(react@18.2.0) - '@headlessui/react': - specifier: ^2.1.8 - version: 2.1.8(react-dom@18.2.0)(react@18.2.0) - algoliasearch: - specifier: ^4.23.3 - version: 4.23.3 - clsx: - specifier: ^2.1.1 - version: 2.1.1 - escape-string-regexp: - specifier: ^5.0.0 - version: 5.0.0 - next: - specifier: 14.2.10 - version: 14.2.10(react-dom@18.2.0)(react@18.2.0) - next-sitemap: - specifier: ^4.2.3 - version: 4.2.3(next@14.2.10) - nextra: - specifier: 2.13.2 - version: 2.13.2(patch_hash=a4rp2hgojklggjmthmkiyqaek4)(next@14.2.10)(react-dom@18.2.0)(react@18.2.0) - nextra-theme-docs: - specifier: 2.13.2 - version: 2.13.2(next@14.2.10)(nextra@2.13.2)(react-dom@18.2.0)(react@18.2.0) - react: - specifier: ^18.2.0 - version: 18.2.0 - react-dom: - specifier: ^18.2.0 - version: 18.2.0(react@18.2.0) - search-insights: - specifier: ^2.15.0 - version: 2.15.0 - -devDependencies: - '@double-great/remark-lint-alt-text': - specifier: ^1.0.0 - version: 1.0.0 - '@eth-optimism/core-utils': - specifier: ^0.13.1 - version: 0.13.1 - '@eth-optimism/sdk': - specifier: ^3.1.6 - version: 3.1.6(ethers@5.7.2) - '@types/node': - specifier: 18.11.10 - version: 18.11.10 - cspell: - specifier: ^8.1.3 - version: 8.1.3 - eslint: - specifier: ^8.53.0 - version: 8.54.0 - eslint-plugin-mdx: - specifier: ^2.2.0 - version: 2.2.0(eslint@8.54.0) - ethers: - specifier: ^5 - version: 5.7.2 - globby: - specifier: ^11.0.4 - version: 11.0.4 - gray-matter: - specifier: ^4.0.3 - version: 4.0.3 - remark: - specifier: ^15.0.1 - version: 15.0.1 - remark-code-import: - specifier: ^1.2.0 - version: 1.2.0(patch_hash=heylvfasxh3ubj2edns2svea2m) - remark-frontmatter: - specifier: ^5.0.0 - version: 5.0.0 - remark-gfm: - specifier: ^3.0.1 - version: 3.0.1 - remark-lint-frontmatter-schema: - specifier: ^3.15.4 - version: 3.15.4(patch_hash=jaxvkozlhcbn7zjsiti5ocoubi) - remark-lint-heading-style: - specifier: ^3.1.2 - version: 3.1.2 - remark-lint-list-item-indent: - specifier: ^3.1.2 - version: 3.1.2 - remark-lint-table-cell-padding: - specifier: ^4.1.3 - version: 4.1.3 - remark-lint-table-pipe-alignment: - specifier: ^3.1.3 - version: 3.1.3 - remark-lint-table-pipes: - specifier: ^4.1.2 - version: 4.1.2 - remark-lint-unordered-list-marker-style: - specifier: ^3.1.2 - version: 3.1.2 - remark-preset-lint-consistent: - specifier: ^5.1.2 - version: 5.1.2 - remark-preset-lint-recommended: - specifier: ^6.1.3 - version: 6.1.3 - typescript: - specifier: ^5.2.2 - version: 5.3.2 - unified-lint-rule: - specifier: ^2.1.2 - version: 2.1.2 - unist-util-visit: - specifier: ^5.0.0 - version: 5.0.0 +importers: + + .: + dependencies: + '@eth-optimism/contracts-ts': + specifier: ^0.17.0 + version: 0.17.0(typescript@5.3.2)(zod@3.22.4) + '@eth-optimism/tokenlist': + specifier: ^9.0.9 + version: 9.0.9 + '@feelback/react': + specifier: ^0.3.4 + version: 0.3.4(react@18.2.0) + '@headlessui/react': + specifier: ^2.1.8 + version: 2.1.8(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + algoliasearch: + specifier: ^4.23.3 + version: 4.23.3 + clsx: + specifier: ^2.1.1 + version: 2.1.1 + escape-string-regexp: + specifier: ^5.0.0 + version: 5.0.0 + next: + specifier: 14.2.10 + version: 14.2.10(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + next-sitemap: + specifier: ^4.2.3 + version: 4.2.3(next@14.2.10(react-dom@18.2.0(react@18.2.0))(react@18.2.0)) + nextra: + specifier: 2.13.2 + version: 2.13.2(patch_hash=a4rp2hgojklggjmthmkiyqaek4)(next@14.2.10(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + nextra-theme-docs: + specifier: 2.13.2 + version: 2.13.2(next@14.2.10(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(nextra@2.13.2(patch_hash=a4rp2hgojklggjmthmkiyqaek4)(next@14.2.10(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + react: + specifier: ^18.2.0 + version: 18.2.0 + react-dom: + specifier: ^18.2.0 + version: 18.2.0(react@18.2.0) + search-insights: + specifier: ^2.15.0 + version: 2.15.0 + viem: + specifier: ^2.21.18 + version: 2.21.37(typescript@5.3.2)(zod@3.22.4) + devDependencies: + '@double-great/remark-lint-alt-text': + specifier: ^1.0.0 + version: 1.0.0 + '@eth-optimism/core-utils': + specifier: ^0.13.1 + version: 0.13.1 + '@eth-optimism/sdk': + specifier: ^3.1.6 + version: 3.1.6(ethers@5.7.2) + '@types/node': + specifier: 18.11.10 + version: 18.11.10 + cspell: + specifier: ^8.1.3 + version: 8.1.3 + eslint: + specifier: ^8.53.0 + version: 8.54.0 + eslint-plugin-mdx: + specifier: ^2.2.0 + version: 2.2.0(eslint@8.54.0) + ethers: + specifier: ^5 + version: 5.7.2 + globby: + specifier: ^11.0.4 + version: 11.0.4 + gray-matter: + specifier: ^4.0.3 + version: 4.0.3 + remark: + specifier: ^15.0.1 + version: 15.0.1 + remark-code-import: + specifier: ^1.2.0 + version: 1.2.0(patch_hash=heylvfasxh3ubj2edns2svea2m) + remark-frontmatter: + specifier: ^5.0.0 + version: 5.0.0 + remark-gfm: + specifier: ^3.0.1 + version: 3.0.1 + remark-lint-frontmatter-schema: + specifier: ^3.15.4 + version: 3.15.4(patch_hash=jaxvkozlhcbn7zjsiti5ocoubi) + remark-lint-heading-style: + specifier: ^3.1.2 + version: 3.1.2 + remark-lint-list-item-indent: + specifier: ^3.1.2 + version: 3.1.2 + remark-lint-table-cell-padding: + specifier: ^4.1.3 + version: 4.1.3 + remark-lint-table-pipe-alignment: + specifier: ^3.1.3 + version: 3.1.3 + remark-lint-table-pipes: + specifier: ^4.1.2 + version: 4.1.2 + remark-lint-unordered-list-marker-style: + specifier: ^3.1.2 + version: 3.1.2 + remark-preset-lint-consistent: + specifier: ^5.1.2 + version: 5.1.2 + remark-preset-lint-recommended: + specifier: ^6.1.3 + version: 6.1.3 + typescript: + specifier: ^5.2.2 + version: 5.3.2 + unified-lint-rule: + specifier: ^2.1.2 + version: 2.1.2 + unist-util-visit: + specifier: ^5.0.0 + version: 5.0.0 + +packages: + + '@aashutoshrathi/word-wrap@1.2.6': + resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} + engines: {node: '>=0.10.0'} + + '@adraffy/ens-normalize@1.10.0': + resolution: {integrity: sha512-nA9XHtlAkYfJxY7bce8DcN7eKxWWCWkU+1GR9d+U6MbNpfwQp8TI7vqOsBsMcHoT4mBu2kypKoSKnghEzOOq5Q==} + + '@adraffy/ens-normalize@1.11.0': + resolution: {integrity: sha512-/3DDPKHqqIqxUULp8yP4zODUY1i+2xvVWsv8A79xGWdCAG+8sb0hRh0Rk2QyOJUnnbyPUAZYcpBuRe3nS2OIUg==} + + '@algolia/cache-browser-local-storage@4.23.3': + resolution: {integrity: sha512-vRHXYCpPlTDE7i6UOy2xE03zHF2C8MEFjPN2v7fRbqVpcOvAUQK81x3Kc21xyb5aSIpYCjWCZbYZuz8Glyzyyg==} + + '@algolia/cache-common@4.23.3': + resolution: {integrity: sha512-h9XcNI6lxYStaw32pHpB1TMm0RuxphF+Ik4o7tcQiodEdpKK+wKufY6QXtba7t3k8eseirEMVB83uFFF3Nu54A==} + + '@algolia/cache-in-memory@4.23.3': + resolution: {integrity: sha512-yvpbuUXg/+0rbcagxNT7un0eo3czx2Uf0y4eiR4z4SD7SiptwYTpbuS0IHxcLHG3lq22ukx1T6Kjtk/rT+mqNg==} + + '@algolia/client-account@4.23.3': + resolution: {integrity: sha512-hpa6S5d7iQmretHHF40QGq6hz0anWEHGlULcTIT9tbUssWUriN9AUXIFQ8Ei4w9azD0hc1rUok9/DeQQobhQMA==} + + '@algolia/client-analytics@4.23.3': + resolution: {integrity: sha512-LBsEARGS9cj8VkTAVEZphjxTjMVCci+zIIiRhpFun9jGDUlS1XmhCW7CTrnaWeIuCQS/2iPyRqSy1nXPjcBLRA==} + + '@algolia/client-common@4.23.3': + resolution: {integrity: sha512-l6EiPxdAlg8CYhroqS5ybfIczsGUIAC47slLPOMDeKSVXYG1n0qGiz4RjAHLw2aD0xzh2EXZ7aRguPfz7UKDKw==} + + '@algolia/client-personalization@4.23.3': + resolution: {integrity: sha512-3E3yF3Ocr1tB/xOZiuC3doHQBQ2zu2MPTYZ0d4lpfWads2WTKG7ZzmGnsHmm63RflvDeLK/UVx7j2b3QuwKQ2g==} + + '@algolia/client-search@4.23.3': + resolution: {integrity: sha512-P4VAKFHqU0wx9O+q29Q8YVuaowaZ5EM77rxfmGnkHUJggh28useXQdopokgwMeYw2XUht49WX5RcTQ40rZIabw==} + + '@algolia/logger-common@4.23.3': + resolution: {integrity: sha512-y9kBtmJwiZ9ZZ+1Ek66P0M68mHQzKRxkW5kAAXYN/rdzgDN0d2COsViEFufxJ0pb45K4FRcfC7+33YB4BLrZ+g==} + + '@algolia/logger-console@4.23.3': + resolution: {integrity: sha512-8xoiseoWDKuCVnWP8jHthgaeobDLolh00KJAdMe9XPrWPuf1by732jSpgy2BlsLTaT9m32pHI8CRfrOqQzHv3A==} + + '@algolia/recommend@4.23.3': + resolution: {integrity: sha512-9fK4nXZF0bFkdcLBRDexsnGzVmu4TSYZqxdpgBW2tEyfuSSY54D4qSRkLmNkrrz4YFvdh2GM1gA8vSsnZPR73w==} + + '@algolia/requester-browser-xhr@4.23.3': + resolution: {integrity: sha512-jDWGIQ96BhXbmONAQsasIpTYWslyjkiGu0Quydjlowe+ciqySpiDUrJHERIRfELE5+wFc7hc1Q5hqjGoV7yghw==} + + '@algolia/requester-common@4.23.3': + resolution: {integrity: sha512-xloIdr/bedtYEGcXCiF2muajyvRhwop4cMZo+K2qzNht0CMzlRkm8YsDdj5IaBhshqfgmBb3rTg4sL4/PpvLYw==} + + '@algolia/requester-node-http@4.23.3': + resolution: {integrity: sha512-zgu++8Uj03IWDEJM3fuNl34s746JnZOWn1Uz5taV1dFyJhVM/kTNw9Ik7YJWiUNHJQXcaD8IXD1eCb0nq/aByA==} + + '@algolia/transporter@4.23.3': + resolution: {integrity: sha512-Wjl5gttqnf/gQKJA+dafnD0Y6Yw97yvfY8R9h0dQltX1GXTgNs1zWgvtWW0tHl1EgMdhAyw189uWiZMnL3QebQ==} + + '@apidevtools/json-schema-ref-parser@11.1.0': + resolution: {integrity: sha512-g/VW9ZQEFJAOwAyUb8JFf7MLiLy2uEB4rU270rGzDwICxnxMlPy0O11KVePSgS36K1NI29gSlK84n5INGhd4Ag==} + engines: {node: '>= 16'} + + '@babel/code-frame@7.23.4': + resolution: {integrity: sha512-r1IONyb6Ia+jYR2vvIDhdWdlTGhqbBoFqLTQidzZ4kepUFH15ejXvFHxCVbtl7BOXIudsIubf4E81xeA3h3IXA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.22.20': + resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} + engines: {node: '>=6.9.0'} + + '@babel/highlight@7.23.4': + resolution: {integrity: sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==} + engines: {node: '>=6.9.0'} + + '@babel/runtime@7.23.2': + resolution: {integrity: sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg==} + engines: {node: '>=6.9.0'} + + '@braintree/sanitize-url@6.0.4': + resolution: {integrity: sha512-s3jaWicZd0pkP0jf5ysyHUI/RE7MHos6qlToFcGWXVp+ykHOy77OUMrfbgJ9it2C5bow7OIQwYYaHjk9XlBQ2A==} + + '@corex/deepmerge@4.0.43': + resolution: {integrity: sha512-N8uEMrMPL0cu/bdboEWpQYb/0i2K5Qn8eCsxzOmxSggJbbQte7ljMRoXm917AbntqTGOzdTu+vP3KOOzoC70HQ==} + + '@cspell/cspell-bundled-dicts@8.1.3': + resolution: {integrity: sha512-TwLyL2bCtetXGhMudjOIgFPAsWF2UkT0E7T+DAZG8aUBfHoC/eco/sTmR6UJVpi6Crjs0YOQkFUBGrQ2pxJPcA==} + engines: {node: '>=18'} + + '@cspell/cspell-json-reporter@8.1.3': + resolution: {integrity: sha512-9iOU0Y733XuF0cqC7xwzJkOKFdJ65rYGnHFdUHzr5lxEqeG9X/jhlkzyHuGGOhPxkUeFP1x9XoLhXo1isMDbKA==} + engines: {node: '>=18'} + + '@cspell/cspell-pipe@8.1.3': + resolution: {integrity: sha512-/dcnyLDeyFuoX4seZv7VsDQyRpt3ZY0vjZiDpqFul8hPydM8czLyRPPMD6Za+Gqg6dZmh9+VsQWK52hVsqc0QA==} + engines: {node: '>=18'} + + '@cspell/cspell-resolver@8.1.3': + resolution: {integrity: sha512-bGyJYqkHRilqhyKGL/NvODN5U+UvCuQo7kxgt0i3Vd7m7k6XYLsSLYZ4w6r1S5IQ/ybU8I5lh6/6fNqKwvo9eg==} + engines: {node: '>=18'} + + '@cspell/cspell-service-bus@8.1.3': + resolution: {integrity: sha512-8E5ZveQKneNfK+cuFMy0y6tDsho71UPppEHNoLZsEFDbIxDdtQcAfs0pk4nwEzxPBt+dBB+Yl8KExQ6x2FAYQw==} + engines: {node: '>=18'} + + '@cspell/cspell-types@8.1.3': + resolution: {integrity: sha512-j14FENj+DzWu6JjzTl+0X5/OJv9AEckpEp6Jaw9YglxirrBBzTkZGfoLePe/AWo/MlIYp0asl92C1UHEjgz+FQ==} + engines: {node: '>=18'} + + '@cspell/dict-ada@4.0.2': + resolution: {integrity: sha512-0kENOWQeHjUlfyId/aCM/mKXtkEgV0Zu2RhUXCBr4hHo9F9vph+Uu8Ww2b0i5a4ZixoIkudGA+eJvyxrG1jUpA==} + + '@cspell/dict-aws@4.0.0': + resolution: {integrity: sha512-1YkCMWuna/EGIDN/zKkW+j98/55mxigftrSFgsehXhPld+ZMJM5J9UuBA88YfL7+/ETvBdd7mwW6IwWsC+/ltQ==} + + '@cspell/dict-bash@4.1.3': + resolution: {integrity: sha512-tOdI3QVJDbQSwPjUkOiQFhYcu2eedmX/PtEpVWg0aFps/r6AyjUQINtTgpqMYnYuq8O1QUIQqnpx21aovcgZCw==} + + '@cspell/dict-companies@3.0.28': + resolution: {integrity: sha512-UinHkMYB/1pUkLKm1PGIm9PBFYxeAa6YvbB1Rq/RAAlrs0WDwiDBr3BAYdxydukG1IqqwT5z9WtU+8D/yV/5lw==} + + '@cspell/dict-cpp@5.0.10': + resolution: {integrity: sha512-WCRuDrkFdpmeIR6uXQYKU9loMQKNFS4bUhtHdv5fu4qVyJSh3k/kgmtTm1h1BDTj8EwPRc/RGxS+9Z3b2mnabA==} + + '@cspell/dict-cryptocurrencies@4.0.0': + resolution: {integrity: sha512-EiZp91ATyRxTmauIQfOX9adLYCunKjHEh092rrM7o2eMXP9n7zpXAL9BK7LviL+LbB8VDOm21q+s83cKrrRrsg==} + + '@cspell/dict-csharp@4.0.2': + resolution: {integrity: sha512-1JMofhLK+4p4KairF75D3A924m5ERMgd1GvzhwK2geuYgd2ZKuGW72gvXpIV7aGf52E3Uu1kDXxxGAiZ5uVG7g==} + + '@cspell/dict-css@4.0.12': + resolution: {integrity: sha512-vGBgPM92MkHQF5/2jsWcnaahOZ+C6OE/fPvd5ScBP72oFY9tn5GLuomcyO0z8vWCr2e0nUSX1OGimPtcQAlvSw==} + + '@cspell/dict-dart@2.0.3': + resolution: {integrity: sha512-cLkwo1KT5CJY5N5RJVHks2genFkNCl/WLfj+0fFjqNR+tk3tBI1LY7ldr9piCtSFSm4x9pO1x6IV3kRUY1lLiw==} + + '@cspell/dict-data-science@1.0.11': + resolution: {integrity: sha512-TaHAZRVe0Zlcc3C23StZqqbzC0NrodRwoSAc8dis+5qLeLLnOCtagYQeROQvDlcDg3X/VVEO9Whh4W/z4PAmYQ==} + + '@cspell/dict-django@4.1.0': + resolution: {integrity: sha512-bKJ4gPyrf+1c78Z0Oc4trEB9MuhcB+Yg+uTTWsvhY6O2ncFYbB/LbEZfqhfmmuK/XJJixXfI1laF2zicyf+l0w==} + + '@cspell/dict-docker@1.1.7': + resolution: {integrity: sha512-XlXHAr822euV36GGsl2J1CkBIVg3fZ6879ZOg5dxTIssuhUOCiV2BuzKZmt6aIFmcdPmR14+9i9Xq+3zuxeX0A==} + + '@cspell/dict-dotnet@5.0.0': + resolution: {integrity: sha512-EOwGd533v47aP5QYV8GlSSKkmM9Eq8P3G/eBzSpH3Nl2+IneDOYOBLEUraHuiCtnOkNsz0xtZHArYhAB2bHWAw==} + + '@cspell/dict-elixir@4.0.3': + resolution: {integrity: sha512-g+uKLWvOp9IEZvrIvBPTr/oaO6619uH/wyqypqvwpmnmpjcfi8+/hqZH8YNKt15oviK8k4CkINIqNhyndG9d9Q==} + + '@cspell/dict-en-common-misspellings@1.0.2': + resolution: {integrity: sha512-jg7ZQZpZH7+aAxNBlcAG4tGhYF6Ksy+QS5Df73Oo+XyckBjC9QS+PrRwLTeYoFIgXy5j3ICParK5r3MSSoL4gw==} + + '@cspell/dict-en-gb@1.1.33': + resolution: {integrity: sha512-tKSSUf9BJEV+GJQAYGw5e+ouhEe2ZXE620S7BLKe3ZmpnjlNG9JqlnaBhkIMxKnNFkLY2BP/EARzw31AZnOv4g==} + + '@cspell/dict-en_us@4.3.12': + resolution: {integrity: sha512-1bsUxFjgxF30FTzcU5uvmCvH3lyqVKR9dbwsJhomBlUM97f0edrd6590SiYBXDm7ruE68m3lJd4vs0Ev2D6FtQ==} + + '@cspell/dict-filetypes@3.0.3': + resolution: {integrity: sha512-J9UP+qwwBLfOQ8Qg9tAsKtSY/WWmjj21uj6zXTI9hRLD1eG1uUOLcfVovAmtmVqUWziPSKMr87F6SXI3xmJXgw==} + + '@cspell/dict-fonts@4.0.0': + resolution: {integrity: sha512-t9V4GeN/m517UZn63kZPUYP3OQg5f0OBLSd3Md5CU3eH1IFogSvTzHHnz4Wqqbv8NNRiBZ3HfdY/pqREZ6br3Q==} + + '@cspell/dict-fsharp@1.0.1': + resolution: {integrity: sha512-23xyPcD+j+NnqOjRHgW3IU7Li912SX9wmeefcY0QxukbAxJ/vAN4rBpjSwwYZeQPAn3fxdfdNZs03fg+UM+4yQ==} + + '@cspell/dict-fullstack@3.1.5': + resolution: {integrity: sha512-6ppvo1dkXUZ3fbYn/wwzERxCa76RtDDl5Afzv2lijLoijGGUw5yYdLBKJnx8PJBGNLh829X352ftE7BElG4leA==} + + '@cspell/dict-gaming-terms@1.0.4': + resolution: {integrity: sha512-hbDduNXlk4AOY0wFxcDMWBPpm34rpqJBeqaySeoUH70eKxpxm+dvjpoRLJgyu0TmymEICCQSl6lAHTHSDiWKZg==} + + '@cspell/dict-git@2.0.0': + resolution: {integrity: sha512-n1AxyX5Kgxij/sZFkxFJlzn3K9y/sCcgVPg/vz4WNJ4K9YeTsUmyGLA2OQI7d10GJeiuAo2AP1iZf2A8j9aj2w==} + + '@cspell/dict-golang@6.0.5': + resolution: {integrity: sha512-w4mEqGz4/wV+BBljLxduFNkMrd3rstBNDXmoX5kD4UTzIb4Sy0QybWCtg2iVT+R0KWiRRA56QKOvBsgXiddksA==} + + '@cspell/dict-haskell@4.0.1': + resolution: {integrity: sha512-uRrl65mGrOmwT7NxspB4xKXFUenNC7IikmpRZW8Uzqbqcu7ZRCUfstuVH7T1rmjRgRkjcIjE4PC11luDou4wEQ==} + + '@cspell/dict-html-symbol-entities@4.0.0': + resolution: {integrity: sha512-HGRu+48ErJjoweR5IbcixxETRewrBb0uxQBd6xFGcxbEYCX8CnQFTAmKI5xNaIt2PKaZiJH3ijodGSqbKdsxhw==} + + '@cspell/dict-html@4.0.5': + resolution: {integrity: sha512-p0brEnRybzSSWi8sGbuVEf7jSTDmXPx7XhQUb5bgG6b54uj+Z0Qf0V2n8b/LWwIPJNd1GygaO9l8k3HTCy1h4w==} + + '@cspell/dict-java@5.0.6': + resolution: {integrity: sha512-kdE4AHHHrixyZ5p6zyms1SLoYpaJarPxrz8Tveo6gddszBVVwIUZ+JkQE1bWNLK740GWzIXdkznpUfw1hP9nXw==} + + '@cspell/dict-k8s@1.0.2': + resolution: {integrity: sha512-tLT7gZpNPnGa+IIFvK9SP1LrSpPpJ94a/DulzAPOb1Q2UBFwdpFd82UWhio0RNShduvKG/WiMZf/wGl98pn+VQ==} + + '@cspell/dict-latex@4.0.0': + resolution: {integrity: sha512-LPY4y6D5oI7D3d+5JMJHK/wxYTQa2lJMSNxps2JtuF8hbAnBQb3igoWEjEbIbRRH1XBM0X8dQqemnjQNCiAtxQ==} + + '@cspell/dict-lorem-ipsum@4.0.0': + resolution: {integrity: sha512-1l3yjfNvMzZPibW8A7mQU4kTozwVZVw0AvFEdy+NcqtbxH+TvbSkNMqROOFWrkD2PjnKG0+Ea0tHI2Pi6Gchnw==} + + '@cspell/dict-lua@4.0.3': + resolution: {integrity: sha512-lDHKjsrrbqPaea13+G9s0rtXjMO06gPXPYRjRYawbNmo4E/e3XFfVzeci3OQDQNDmf2cPOwt9Ef5lu2lDmwfJg==} + + '@cspell/dict-makefile@1.0.0': + resolution: {integrity: sha512-3W9tHPcSbJa6s0bcqWo6VisEDTSN5zOtDbnPabF7rbyjRpNo0uHXHRJQF8gAbFzoTzBBhgkTmrfSiuyQm7vBUQ==} + + '@cspell/dict-node@4.0.3': + resolution: {integrity: sha512-sFlUNI5kOogy49KtPg8SMQYirDGIAoKBO3+cDLIwD4MLdsWy1q0upc7pzGht3mrjuyMiPRUV14Bb0rkVLrxOhg==} + + '@cspell/dict-npm@5.0.13': + resolution: {integrity: sha512-uPb3DlQA/FvlmzT5RjZoy7fy91mxMRZW1B+K3atVM5A/cmP1QlDaSW/iCtde5kHET1MOV7uxz+vy0Yha2OI5pQ==} + + '@cspell/dict-php@4.0.4': + resolution: {integrity: sha512-fRlLV730fJbulDsLIouZxXoxHt3KIH6hcLFwxaupHL+iTXDg0lo7neRpbqD5MScr/J3idEr7i9G8XWzIikKFug==} + + '@cspell/dict-powershell@5.0.3': + resolution: {integrity: sha512-lEdzrcyau6mgzu1ie98GjOEegwVHvoaWtzQnm1ie4DyZgMr+N6D0Iyj1lzvtmt0snvsDFa5F2bsYzf3IMKcpcA==} + + '@cspell/dict-public-licenses@2.0.5': + resolution: {integrity: sha512-91HK4dSRri/HqzAypHgduRMarJAleOX5NugoI8SjDLPzWYkwZ1ftuCXSk+fy8DLc3wK7iOaFcZAvbjmnLhVs4A==} + + '@cspell/dict-python@4.1.10': + resolution: {integrity: sha512-ErF/Ohcu6Xk4QVNzFgo8p7CxkxvAKAmFszvso41qOOhu8CVpB35ikBRpGVDw9gsCUtZzi15Yl0izi4do6WcLkA==} + + '@cspell/dict-r@2.0.1': + resolution: {integrity: sha512-KCmKaeYMLm2Ip79mlYPc8p+B2uzwBp4KMkzeLd5E6jUlCL93Y5Nvq68wV5fRLDRTf7N1LvofkVFWfDcednFOgA==} + + '@cspell/dict-ruby@5.0.1': + resolution: {integrity: sha512-rruTm7Emhty/BSYavSm8ZxRuVw0OBqzJkwIFXcV0cX7To8D1qbmS9HFHRuRg8IL11+/nJvtdDz+lMFBSmPUagQ==} + + '@cspell/dict-rust@4.0.1': + resolution: {integrity: sha512-xJSSzHDK2z6lSVaOmMxl3PTOtfoffaxMo7fTcbZUF+SCJzfKbO6vnN9TCGX2sx1RHFDz66Js6goz6SAZQdOwaw==} + + '@cspell/dict-scala@5.0.0': + resolution: {integrity: sha512-ph0twaRoV+ylui022clEO1dZ35QbeEQaKTaV2sPOsdwIokABPIiK09oWwGK9qg7jRGQwVaRPEq0Vp+IG1GpqSQ==} + + '@cspell/dict-software-terms@3.3.12': + resolution: {integrity: sha512-6aa4T9VqOMc0SFNBt6gxp0CWjvRqMg/uxvgpRbil+ToHWcU+Q+As0WKhPLaOniuTdCM85WWzRouD0O1XUGqg5Q==} + + '@cspell/dict-sql@2.1.2': + resolution: {integrity: sha512-Pi0hAcvsSGtZZeyyAN1VfGtQJbrXos5x2QjJU0niAQKhmITSOrXU/1II1Gogk+FYDjWyV9wP2De0U2f7EWs6oQ==} + + '@cspell/dict-svelte@1.0.2': + resolution: {integrity: sha512-rPJmnn/GsDs0btNvrRBciOhngKV98yZ9SHmg8qI6HLS8hZKvcXc0LMsf9LLuMK1TmS2+WQFAan6qeqg6bBxL2Q==} + + '@cspell/dict-swift@2.0.1': + resolution: {integrity: sha512-gxrCMUOndOk7xZFmXNtkCEeroZRnS2VbeaIPiymGRHj5H+qfTAzAKxtv7jJbVA3YYvEzWcVE2oKDP4wcbhIERw==} + + '@cspell/dict-typescript@3.1.2': + resolution: {integrity: sha512-lcNOYWjLUvDZdLa0UMNd/LwfVdxhE9rKA+agZBGjL3lTA3uNvH7IUqSJM/IXhJoBpLLMVEOk8v1N9xi+vDuCdA==} + + '@cspell/dict-vue@3.0.0': + resolution: {integrity: sha512-niiEMPWPV9IeRBRzZ0TBZmNnkK3olkOPYxC1Ny2AX4TGlYRajcW0WUtoSHmvvjZNfWLSg2L6ruiBeuPSbjnG6A==} + + '@cspell/dynamic-import@8.1.3': + resolution: {integrity: sha512-/lXFLa92v4oOcZ2PbdRpOqBvnqWlYmGaV7iCy8+QhIWlMdzi+7tBX3LVTm9Jzvt/rJseVHQQ6RvfTsSmhbUMFQ==} + engines: {node: '>=18.0'} + + '@cspell/strong-weak-map@8.1.3': + resolution: {integrity: sha512-GhWyximzk8tumo0zhrDV3+nFYiETYefiTBWAEVbXJMibuvitFocVZwddqN85J0UdZ2M7q6tvBleEaI9ME/16gA==} + engines: {node: '>=18'} + + '@double-great/alt-text@3.1.0': + resolution: {integrity: sha512-5gSW9AI0KUO2GQe9K+KjyiCisxl4xL0kesQCxUsko4T9s8zler/stW0qcH5XryUgtKebb293qX9sz1nCmQpdTw==} + + '@double-great/remark-lint-alt-text@1.0.0': + resolution: {integrity: sha512-2FFjSX2VhT/USmsOEkcw40SiCHXXio2sWs4S7docKNFh+W7/z+bHYau+UHfrP4yDRVzfUVSV1MKnsxmigkhixg==} + + '@eslint-community/eslint-utils@4.4.0': + resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + + '@eslint-community/regexpp@4.10.0': + resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + '@eslint/eslintrc@2.1.3': + resolution: {integrity: sha512-yZzuIG+jnVu6hNSzFEN07e8BxF3uAzYtQb6uDkaYZLo6oYZDCq454c5kB8zxnzfCYyP4MIuyBn10L0DqwujTmA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@eslint/js@8.54.0': + resolution: {integrity: sha512-ut5V+D+fOoWPgGGNj83GGjnntO39xDy6DWxO0wb7Jp3DcMX0TfIqdzHF85VTQkerdyGmuuMD9AKAo5KiNlf/AQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@eth-optimism/contracts-bedrock@0.16.2': + resolution: {integrity: sha512-a2+f7soDbrd6jV74U02EpyMwQt2iZeDZ4c2ZwgkObcxXUZLZQ2ELt/VRFBf8TIL3wYcBOGpUa1aXAE2oHQ7oRA==} + + '@eth-optimism/contracts-ts@0.17.0': + resolution: {integrity: sha512-V4uJtS4ngAQ8tLSeIHWAK7ZNrz3a5Mf4YN3vf5U3u2/c+bKWIkGYgmD/GPQuyMmALOv67tJpFn3GRDTb9LgG1g==} + peerDependencies: + '@wagmi/core': '>1.0.0' + wagmi: '>1.0.0' + peerDependenciesMeta: + '@wagmi/core': + optional: true + wagmi: + optional: true + + '@eth-optimism/contracts@0.6.0': + resolution: {integrity: sha512-vQ04wfG9kMf1Fwy3FEMqH2QZbgS0gldKhcBeBUPfO8zu68L61VI97UDXmsMQXzTsEAxK8HnokW3/gosl4/NW3w==} + peerDependencies: + ethers: ^5 + + '@eth-optimism/core-utils@0.12.0': + resolution: {integrity: sha512-qW+7LZYCz7i8dRa7SRlUKIo1VBU8lvN0HeXCxJR+z+xtMzMQpPds20XJNCMclszxYQHkXY00fOT6GvFw9ZL6nw==} + + '@eth-optimism/core-utils@0.13.1': + resolution: {integrity: sha512-1FvzbUmCEy9zSKPG1QWg2VfA2Cy90xBA9Wkp11lXXrz91zUPCNCNSRTujXWYIC86ketNsZp7p4njSf6lTycHCw==} + + '@eth-optimism/sdk@3.1.6': + resolution: {integrity: sha512-YU3Sx4jPFfdXW4gs0PvnFDFPrJjbsaFxAJrsqxDpkUH3fMC3MmQgECYdkj8y1xTO6CTHm9gWLNC2WQdYTdNJsQ==} + peerDependencies: + ethers: ^5 + + '@eth-optimism/tokenlist@9.0.9': + resolution: {integrity: sha512-Wz0ZbvJKBUIikZpAjX1dqXYlSq0mHCnVXfGST+rZOhpCnY9Qwf9PEpSEK9kMeUz2ySDVV1mqtXtLgVjZb6z3Pg==} + + '@ethereumjs/rlp@4.0.1': + resolution: {integrity: sha512-tqsQiBQDQdmPWE1xkkBq4rlSW5QZpLOUJ5RJh2/9fug+q9tnUhuZoVLk7s0scUIKTOzEtR72DFBXI4WiZcMpvw==} + engines: {node: '>=14'} + hasBin: true + + '@ethereumjs/util@8.1.0': + resolution: {integrity: sha512-zQ0IqbdX8FZ9aw11vP+dZkKDkS+kgIvQPHnSAXzP9pLu+Rfu3D3XEeLbicvoXJTYnhZiPmsZUxgdzXwNKxRPbA==} + engines: {node: '>=14'} + + '@ethersproject/abi@5.7.0': + resolution: {integrity: sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA==} + + '@ethersproject/abstract-provider@5.7.0': + resolution: {integrity: sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw==} + + '@ethersproject/abstract-signer@5.7.0': + resolution: {integrity: sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ==} + + '@ethersproject/address@5.7.0': + resolution: {integrity: sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==} + + '@ethersproject/base64@5.7.0': + resolution: {integrity: sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ==} + + '@ethersproject/basex@5.7.0': + resolution: {integrity: sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw==} + + '@ethersproject/bignumber@5.7.0': + resolution: {integrity: sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw==} + + '@ethersproject/bytes@5.7.0': + resolution: {integrity: sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A==} + + '@ethersproject/constants@5.7.0': + resolution: {integrity: sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA==} + + '@ethersproject/contracts@5.7.0': + resolution: {integrity: sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg==} + + '@ethersproject/hash@5.7.0': + resolution: {integrity: sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g==} + + '@ethersproject/hdnode@5.7.0': + resolution: {integrity: sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg==} + + '@ethersproject/json-wallets@5.7.0': + resolution: {integrity: sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g==} + + '@ethersproject/keccak256@5.7.0': + resolution: {integrity: sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg==} + + '@ethersproject/logger@5.7.0': + resolution: {integrity: sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig==} + + '@ethersproject/networks@5.7.1': + resolution: {integrity: sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ==} + + '@ethersproject/pbkdf2@5.7.0': + resolution: {integrity: sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw==} + + '@ethersproject/properties@5.7.0': + resolution: {integrity: sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw==} + + '@ethersproject/providers@5.7.2': + resolution: {integrity: sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg==} + + '@ethersproject/random@5.7.0': + resolution: {integrity: sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ==} + + '@ethersproject/rlp@5.7.0': + resolution: {integrity: sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w==} + + '@ethersproject/sha2@5.7.0': + resolution: {integrity: sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw==} + + '@ethersproject/signing-key@5.7.0': + resolution: {integrity: sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q==} + + '@ethersproject/solidity@5.7.0': + resolution: {integrity: sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA==} + + '@ethersproject/strings@5.7.0': + resolution: {integrity: sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg==} + + '@ethersproject/transactions@5.7.0': + resolution: {integrity: sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ==} + + '@ethersproject/units@5.7.0': + resolution: {integrity: sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg==} + + '@ethersproject/wallet@5.7.0': + resolution: {integrity: sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA==} + + '@ethersproject/web@5.7.1': + resolution: {integrity: sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w==} + + '@ethersproject/wordlists@5.7.0': + resolution: {integrity: sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA==} + + '@feelback/js@0.3.4': + resolution: {integrity: sha512-xr7gTqSJcVUYQlELs1TntYovCBjMcYUr/hGKTnDoF64/lig5CbX4bOmqLoF50IImCy5q3oIwg9w+TSFvtBwsIA==} + + '@feelback/react@0.3.4': + resolution: {integrity: sha512-ZWzUQAmPwl4nYR2olzBKddHzoLtGW/2pb8TiesiJCirxhaDW2E/XBx2ZaB4fL5TGXtjBt4eYq/qZxJZ0fIE0kg==} + engines: {node: '>=14'} + peerDependencies: + react: '>=17' + + '@floating-ui/core@1.6.8': + resolution: {integrity: sha512-7XJ9cPU+yI2QeLS+FCSlqNFZJq8arvswefkZrYI1yQBbftw6FyrZOxYSh+9S7z7TpeWlRt9zJ5IhM1WIL334jA==} + + '@floating-ui/dom@1.6.11': + resolution: {integrity: sha512-qkMCxSR24v2vGkhYDo/UzxfJN3D4syqSjyuTFz6C7XcpU1pASPRieNI0Kj5VP3/503mOfYiGY891ugBX1GlABQ==} + + '@floating-ui/react-dom@2.1.2': + resolution: {integrity: sha512-06okr5cgPzMNBy+Ycse2A6udMi4bqwW/zgBF/rwjcNqWkyr82Mcg8b0vjX8OJpZFy/FKjJmw6wV7t44kK6kW7A==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + + '@floating-ui/react@0.26.25': + resolution: {integrity: sha512-hZOmgN0NTOzOuZxI1oIrDu3Gcl8WViIkvPMpB4xdd4QD6xAMtwgwr3VPoiyH/bLtRcS1cDnhxLSD1NsMJmwh/A==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + + '@floating-ui/utils@0.2.8': + resolution: {integrity: sha512-kym7SodPp8/wloecOpcmSnWJsK7M0E5Wg8UcFA+uO4B9s5d0ywXOEro/8HM9x0rW+TljRzul/14UYz3TleT3ig==} + + '@headlessui/react@1.7.17': + resolution: {integrity: sha512-4am+tzvkqDSSgiwrsEpGWqgGo9dz8qU5M3znCkC4PgkpY4HcCZzEDEvozltGGGHIKl9jbXbZPSH5TWn4sWJdow==} + engines: {node: '>=10'} + peerDependencies: + react: ^16 || ^17 || ^18 + react-dom: ^16 || ^17 || ^18 + + '@headlessui/react@2.1.8': + resolution: {integrity: sha512-uajqVkAcVG/wHwG9Fh5PFMcFpf2VxM4vNRNKxRjuK009kePVur8LkuuygHfIE+2uZ7z7GnlTtYsyUe6glPpTLg==} + engines: {node: '>=10'} + peerDependencies: + react: ^18 + react-dom: ^18 + + '@humanwhocodes/config-array@0.11.13': + resolution: {integrity: sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==} + engines: {node: '>=10.10.0'} + + '@humanwhocodes/module-importer@1.0.1': + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + + '@humanwhocodes/object-schema@2.0.1': + resolution: {integrity: sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==} + + '@isaacs/cliui@8.0.2': + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + + '@jsdevtools/ono@7.1.3': + resolution: {integrity: sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==} + + '@mdx-js/mdx@2.3.0': + resolution: {integrity: sha512-jLuwRlz8DQfQNiUCJR50Y09CGPq3fLtmtUQfVrj79E0JWu3dvsVcxVIcfhR5h0iXu+/z++zDrYeiJqifRynJkA==} + + '@mdx-js/react@2.3.0': + resolution: {integrity: sha512-zQH//gdOmuu7nt2oJR29vFhDv88oGPmVw6BggmrHeMI+xgEkp1B2dX9/bMBSYtK0dyLX/aOmesKS09g222K1/g==} + peerDependencies: + react: '>=16' + + '@napi-rs/simple-git-android-arm-eabi@0.1.9': + resolution: {integrity: sha512-9D4JnfePMpgL4pg9aMUX7/TIWEUQ+Tgx8n3Pf8TNCMGjUbImJyYsDSLJzbcv9wH7srgn4GRjSizXFJHAPjzEug==} + engines: {node: '>= 10'} + cpu: [arm] + os: [android] + + '@napi-rs/simple-git-android-arm64@0.1.9': + resolution: {integrity: sha512-Krilsw0gPrrASZzudNEl9pdLuNbhoTK0j7pUbfB8FRifpPdFB/zouwuEm0aSnsDXN4ftGrmGG82kuiR/2MeoPg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [android] + + '@napi-rs/simple-git-darwin-arm64@0.1.9': + resolution: {integrity: sha512-H/F09nDgYjv4gcFrZBgdTKkZEepqt0KLYcCJuUADuxkKupmjLdecMhypXLk13AzvLW4UQI7NlLTLDXUFLyr2BA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + + '@napi-rs/simple-git-darwin-x64@0.1.9': + resolution: {integrity: sha512-jBR2xS9nVPqmHv0TWz874W0m/d453MGrMeLjB+boK5IPPLhg3AWIZj0aN9jy2Je1BGVAa0w3INIQJtBBeB6kFA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + + '@napi-rs/simple-git-linux-arm-gnueabihf@0.1.9': + resolution: {integrity: sha512-3n0+VpO4YfZxndZ0sCvsHIvsazd+JmbSjrlTRBCnJeAU1/sfos3skNZtKGZksZhjvd+3o+/GFM8L7Xnv01yggA==} + engines: {node: '>= 10'} + cpu: [arm] + os: [linux] + + '@napi-rs/simple-git-linux-arm64-gnu@0.1.9': + resolution: {integrity: sha512-lIzf0KHU2SKC12vMrWwCtysG2Sdt31VHRPMUiz9lD9t3xwVn8qhFSTn5yDkTeG3rgX6o0p5EKalfQN5BXsJq2w==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@napi-rs/simple-git-linux-arm64-musl@0.1.9': + resolution: {integrity: sha512-KQozUoNXrxrB8k741ncWXSiMbjl1AGBGfZV21PANzUM8wH4Yem2bg3kfglYS/QIx3udspsT35I9abu49n7D1/w==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@napi-rs/simple-git-linux-x64-gnu@0.1.9': + resolution: {integrity: sha512-O/Niui5mnHPcK3iYC3ui8wgERtJWsQ3Y74W/09t0bL/3dgzGMl4oQt0qTj9dWCsnoGsIEYHPzwCBp/2vqYp/pw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@napi-rs/simple-git-linux-x64-musl@0.1.9': + resolution: {integrity: sha512-L9n+e8Wn3hKr3RsIdY8GaB+ry4xZ4BaGwyKExgoB8nDGQuRUY9oP6p0WA4hWfJvJnU1H6hvo36a5UFPReyBO7A==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@napi-rs/simple-git-win32-arm64-msvc@0.1.9': + resolution: {integrity: sha512-Z6Ja/SZK+lMvRWaxj7wjnvSbAsGrH006sqZo8P8nxKUdZfkVvoCaAWr1r0cfkk2Z3aijLLtD+vKeXGlUPH6gGQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + + '@napi-rs/simple-git-win32-x64-msvc@0.1.9': + resolution: {integrity: sha512-VAZj1UvC+R2MjKOD3I/Y7dmQlHWAYy4omhReQJRpbCf+oGCBi9CWiIduGqeYEq723nLIKdxP7XjaO0wl1NnUww==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + + '@napi-rs/simple-git@0.1.9': + resolution: {integrity: sha512-qKzDS0+VjMvVyU28px+C6zlD1HKy83NIdYzfMQWa/g/V1iG/Ic8uwrS2ihHfm7mp7X0PPrmINLiTTi6ieUIKfw==} + engines: {node: '>= 10'} + + '@next/env@13.5.6': + resolution: {integrity: sha512-Yac/bV5sBGkkEXmAX5FWPS9Mmo2rthrOPRQQNfycJPkjUAUclomCPH7QFVCDQ4Mp2k2K1SSM6m0zrxYrOwtFQw==} + + '@next/env@14.2.10': + resolution: {integrity: sha512-dZIu93Bf5LUtluBXIv4woQw2cZVZ2DJTjax5/5DOs3lzEOeKLy7GxRSr4caK9/SCPdaW6bCgpye6+n4Dh9oJPw==} + + '@next/swc-darwin-arm64@14.2.10': + resolution: {integrity: sha512-V3z10NV+cvMAfxQUMhKgfQnPbjw+Ew3cnr64b0lr8MDiBJs3eLnM6RpGC46nhfMZsiXgQngCJKWGTC/yDcgrDQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + + '@next/swc-darwin-x64@14.2.10': + resolution: {integrity: sha512-Y0TC+FXbFUQ2MQgimJ/7Ina2mXIKhE7F+GUe1SgnzRmwFY3hX2z8nyVCxE82I2RicspdkZnSWMn4oTjIKz4uzA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + + '@next/swc-linux-arm64-gnu@14.2.10': + resolution: {integrity: sha512-ZfQ7yOy5zyskSj9rFpa0Yd7gkrBnJTkYVSya95hX3zeBG9E55Z6OTNPn1j2BTFWvOVVj65C3T+qsjOyVI9DQpA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@next/swc-linux-arm64-musl@14.2.10': + resolution: {integrity: sha512-n2i5o3y2jpBfXFRxDREr342BGIQCJbdAUi/K4q6Env3aSx8erM9VuKXHw5KNROK9ejFSPf0LhoSkU/ZiNdacpQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@next/swc-linux-x64-gnu@14.2.10': + resolution: {integrity: sha512-GXvajAWh2woTT0GKEDlkVhFNxhJS/XdDmrVHrPOA83pLzlGPQnixqxD8u3bBB9oATBKB//5e4vpACnx5Vaxdqg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@next/swc-linux-x64-musl@14.2.10': + resolution: {integrity: sha512-opFFN5B0SnO+HTz4Wq4HaylXGFV+iHrVxd3YvREUX9K+xfc4ePbRrxqOuPOFjtSuiVouwe6uLeDtabjEIbkmDA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@next/swc-win32-arm64-msvc@14.2.10': + resolution: {integrity: sha512-9NUzZuR8WiXTvv+EiU/MXdcQ1XUvFixbLIMNQiVHuzs7ZIFrJDLJDaOF1KaqttoTujpcxljM/RNAOmw1GhPPQQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + + '@next/swc-win32-ia32-msvc@14.2.10': + resolution: {integrity: sha512-fr3aEbSd1GeW3YUMBkWAu4hcdjZ6g4NBl1uku4gAn661tcxd1bHs1THWYzdsbTRLcCKLjrDZlNp6j2HTfrw+Bg==} + engines: {node: '>= 10'} + cpu: [ia32] + os: [win32] + + '@next/swc-win32-x64-msvc@14.2.10': + resolution: {integrity: sha512-UjeVoRGKNL2zfbcQ6fscmgjBAS/inHBh63mjIlfPg/NG8Yn2ztqylXt5qilYb6hoHIwaU2ogHknHWWmahJjgZQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + + '@noble/curves@1.1.0': + resolution: {integrity: sha512-091oBExgENk/kGj3AZmtBDMpxQPDtxQABR2B9lb1JbVTs6ytdzZNwvhxQ4MWasRNEzlbEH8jCWFCwhF/Obj5AA==} + + '@noble/curves@1.2.0': + resolution: {integrity: sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==} + + '@noble/curves@1.6.0': + resolution: {integrity: sha512-TlaHRXDehJuRNR9TfZDNQ45mMEd5dwUwmicsafcIX4SsNiqnCHKjE/1alYPd/lDRVhxdhUAlv8uEhMCI5zjIJQ==} + engines: {node: ^14.21.3 || >=16} + + '@noble/hashes@1.3.1': + resolution: {integrity: sha512-EbqwksQwz9xDRGfDST86whPBgM65E0OH/pCgqW0GBVzO22bNE+NuIbeTb714+IfSjU3aRk47EUvXIb5bTsenKA==} + engines: {node: '>= 16'} + + '@noble/hashes@1.3.2': + resolution: {integrity: sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==} + engines: {node: '>= 16'} + + '@noble/hashes@1.5.0': + resolution: {integrity: sha512-1j6kQFb7QRru7eKN3ZDvRcP13rugwdxZqCjbiAVZfIJwgj2A65UmT4TgARXGlXgnRkORLTDTrO19ZErt7+QXgA==} + engines: {node: ^14.21.3 || >=16} + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@npmcli/config@6.4.0': + resolution: {integrity: sha512-/fQjIbuNVIT/PbXvw178Tm97bxV0E0nVUFKHivMKtSI2pcs8xKdaWkHJxf9dTI0G/y5hp/KuCvgcUu5HwAtI1w==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + '@npmcli/map-workspaces@3.0.4': + resolution: {integrity: sha512-Z0TbvXkRbacjFFLpVpV0e2mheCh+WzQpcqL+4xp49uNJOxOnIAPZyXtUxZ5Qn3QBTGKA11Exjd9a5411rBrhDg==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + '@npmcli/name-from-folder@2.0.0': + resolution: {integrity: sha512-pwK+BfEBZJbKdNYpHHRTNBwBoqrN/iIMO0AiGvYsp3Hoaq0WbgGSWQR6SCldZovoDpY3yje5lkFUe6gsDgJ2vg==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + + '@pkgr/utils@2.4.2': + resolution: {integrity: sha512-POgTXhjrTfbTV63DiFXav4lBHiICLKKwDeaKn9Nphwj7WH6m0hMMCaJkMyRWjgtPFyRKRVoMXXjczsTQRDEhYw==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + + '@popperjs/core@2.11.8': + resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==} + + '@react-aria/focus@3.18.4': + resolution: {integrity: sha512-91J35077w9UNaMK1cpMUEFRkNNz0uZjnSwiyBCFuRdaVuivO53wNC9XtWSDNDdcO5cGy87vfJRVAiyoCn/mjqA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + + '@react-aria/interactions@3.22.4': + resolution: {integrity: sha512-E0vsgtpItmknq/MJELqYJwib+YN18Qag8nroqwjk1qOnBa9ROIkUhWJerLi1qs5diXq9LHKehZDXRlwPvdEFww==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + + '@react-aria/ssr@3.9.6': + resolution: {integrity: sha512-iLo82l82ilMiVGy342SELjshuWottlb5+VefO3jOQqQRNYnJBFpUSadswDPbRimSgJUZuFwIEYs6AabkP038fA==} + engines: {node: '>= 12'} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + + '@react-aria/utils@3.25.3': + resolution: {integrity: sha512-PR5H/2vaD8fSq0H/UB9inNbc8KDcVmW6fYAfSWkkn+OAdhTTMVKqXXrZuZBWyFfSD5Ze7VN6acr4hrOQm2bmrA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + + '@react-stately/utils@3.10.4': + resolution: {integrity: sha512-gBEQEIMRh5f60KCm7QKQ2WfvhB2gLUr9b72sqUdIZ2EG+xuPgaIlCBeSicvjmjBvYZwOjoOEnmIkcx2GHp/HWw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + + '@react-types/shared@3.25.0': + resolution: {integrity: sha512-OZSyhzU6vTdW3eV/mz5i6hQwQUhkRs7xwY2d1aqPvTdMe0+2cY7Fwp45PAiwYLEj73i9ro2FxF9qC4DvHGSCgQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + + '@scure/base@1.1.3': + resolution: {integrity: sha512-/+SgoRjLq7Xlf0CWuLHq2LUZeL/w65kfzAPG5NH9pcmBhs+nunQTn4gvdwgMTIXnt9b2C/1SeL2XiysZEyIC9Q==} + + '@scure/base@1.1.9': + resolution: {integrity: sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg==} + + '@scure/bip32@1.3.1': + resolution: {integrity: sha512-osvveYtyzdEVbt3OfwwXFr4P2iVBL5u1Q3q4ONBfDY/UpOuXmOlbgwc1xECEboY8wIays8Yt6onaWMUdUbfl0A==} + + '@scure/bip32@1.3.2': + resolution: {integrity: sha512-N1ZhksgwD3OBlwTv3R6KFEcPojl/W4ElJOeCZdi+vuI5QmTFwLq3OFf2zd2ROpKvxFdgZ6hUpb0dx9bVNEwYCA==} + + '@scure/bip32@1.5.0': + resolution: {integrity: sha512-8EnFYkqEQdnkuGBVpCzKxyIwDCBLDVj3oiX0EKUFre/tOjL/Hqba1D6n/8RcmaQy4f95qQFrO2A8Sr6ybh4NRw==} + + '@scure/bip39@1.2.1': + resolution: {integrity: sha512-Z3/Fsz1yr904dduJD0NpiyRHhRYHdcnyh73FZWiV+/qhWi83wNJ3NWolYqCEN+ZWsUz2TWwajJggcRE9r1zUYg==} + + '@scure/bip39@1.4.0': + resolution: {integrity: sha512-BEEm6p8IueV/ZTfQLp/0vhw4NPnT9oWf5+28nvmeUICjP99f4vr2d+qc7AVGDDtwRep6ifR43Yed9ERVmiITzw==} + + '@swc/counter@0.1.3': + resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} + + '@swc/helpers@0.5.2': + resolution: {integrity: sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==} + + '@swc/helpers@0.5.5': + resolution: {integrity: sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A==} + + '@tanstack/react-virtual@3.10.8': + resolution: {integrity: sha512-VbzbVGSsZlQktyLrP5nxE+vE1ZR+U0NFAWPbJLoG2+DKPwd2D7dVICTVIIaYlJqX1ZCEnYDbaOpmMwbsyhBoIA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + + '@tanstack/virtual-core@3.10.8': + resolution: {integrity: sha512-PBu00mtt95jbKFi6Llk9aik8bnR3tR/oQP1o3TSi+iG//+Q2RTIzCEgKkHG8BB86kxMNW6O8wku+Lmi+QFR6jA==} + + '@testing-library/dom@9.3.3': + resolution: {integrity: sha512-fB0R+fa3AUqbLHWyxXa2kGVtf1Fe1ZZFr0Zp6AIbIAzXb2mKbEXl+PCQNUOaq5lbTab5tfctfXRNsWXxa2f7Aw==} + engines: {node: '>=14'} + + '@testing-library/react@14.1.2': + resolution: {integrity: sha512-z4p7DVBTPjKM5qDZ0t5ZjzkpSNb+fZy1u6bzO7kk8oeGagpPCAtgh4cx1syrfp7a+QWkM021jGqjJaxJJnXAZg==} + engines: {node: '>=14'} + peerDependencies: + react: ^18.0.0 + react-dom: ^18.0.0 + + '@theguild/remark-mermaid@0.0.5': + resolution: {integrity: sha512-e+ZIyJkEv9jabI4m7q29wZtZv+2iwPGsXJ2d46Zi7e+QcFudiyuqhLhHG/3gX3ZEB+hxTch+fpItyMS8jwbIcw==} + peerDependencies: + react: ^18.2.0 + + '@theguild/remark-npm2yarn@0.2.1': + resolution: {integrity: sha512-jUTFWwDxtLEFtGZh/TW/w30ySaDJ8atKWH8dq2/IiQF61dPrGfETpl0WxD0VdBfuLOeU14/kop466oBSRO/5CA==} + + '@types/acorn@4.0.6': + resolution: {integrity: sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ==} + + '@types/aria-query@5.0.4': + resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==} + + '@types/change-case@2.3.1': + resolution: {integrity: sha512-HYiGjhmGInNzJjtt6ciXEfl2s8ZQGUQpPiwgWSth1fycE69hXbV/RgWH7MvSq2QPhMBzi4SGhu1vE+cMx1xB8g==} + deprecated: This is a stub types definition for change-case (https://github.com/blakeembrey/change-case). change-case provides its own type definitions, so you don't need @types/change-case installed! + + '@types/concat-stream@2.0.3': + resolution: {integrity: sha512-3qe4oQAPNwVNwK4C9c8u+VJqv9kez+2MR4qJpoPFfXtgxxif1QbFusvXzK0/Wra2VX07smostI2VMmJNSpZjuQ==} + + '@types/d3-scale-chromatic@3.0.1': + resolution: {integrity: sha512-Ob7OrwiTeQXY/WBBbRHGZBOn6rH1h7y3jjpTSKYqDEeqFjktql6k2XSgNwLrLDmAsXhEn8P9NHDY4VTuo0ZY1w==} + + '@types/d3-scale@4.0.7': + resolution: {integrity: sha512-/YEbMIOtqSFSELqUT8desdT3a7iybPkSQiIx/wN4CZ/5b7wrCvmyXWELTMUYB10k0N5rzHVu4f/OkhulG1b3Lw==} + + '@types/d3-time@3.0.2': + resolution: {integrity: sha512-kbdRXTmUgNfw5OTE3KZnFQn6XdIc4QGroN5UixgdrXATmYsdlPQS6pEut9tVlIojtzuFD4txs/L+Rq41AHtLpg==} + + '@types/debug@4.1.11': + resolution: {integrity: sha512-R2qflTjHDs4CL6D/6TkqBeIHr54WzZfIxN729xvCNlYIVp2LknlnCro5Yo3frNaX2E5gO9pZ3/QAPVdGmu+q9w==} + + '@types/estree-jsx@1.0.3': + resolution: {integrity: sha512-pvQ+TKeRHeiUGRhvYwRrQ/ISnohKkSJR14fT2yqyZ4e9K5vqc7hrtY2Y1Dw0ZwAzQ6DQsxsaCUuSIIi8v0Cq6w==} + + '@types/estree@1.0.5': + resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} + + '@types/hast@2.3.7': + resolution: {integrity: sha512-EVLigw5zInURhzfXUM65eixfadfsHKomGKUakToXo84t8gGIJuTcD2xooM2See7GyQ7DRtYjhCHnSUQez8JaLw==} + + '@types/hast@3.0.2': + resolution: {integrity: sha512-B5hZHgHsXvfCoO3xgNJvBnX7N8p86TqQeGKXcokW4XXi+qY4vxxPSFYofytvVmpFxzPv7oxDQzjg5Un5m2/xiw==} + + '@types/is-empty@1.2.3': + resolution: {integrity: sha512-4J1l5d79hoIvsrKh5VUKVRA1aIdsOb10Hu5j3J2VfP/msDnfTdGPmNp2E1Wg+vs97Bktzo+MZePFFXSGoykYJw==} + + '@types/js-yaml@4.0.8': + resolution: {integrity: sha512-m6jnPk1VhlYRiLFm3f8X9Uep761f+CK8mHyS65LutH2OhmBF0BeMEjHgg05usH8PLZMWWc/BUR9RPmkvpWnyRA==} + + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + + '@types/katex@0.16.5': + resolution: {integrity: sha512-DD2Y3xMlTQvAnN6d8803xdgnOeYZ+HwMglb7/9YCf49J9RkJL53azf9qKa40MkEYhqVwxZ1GS2+VlShnz4Z1Bw==} + + '@types/lodash.clonedeep@4.5.9': + resolution: {integrity: sha512-19429mWC+FyaAhOLzsS8kZUsI+/GmBAQ0HFiCPsKGU+7pBXOQWhyrY6xNNDwUSX8SMZMJvuFVMF9O5dQOlQK9Q==} + + '@types/lodash@4.14.202': + resolution: {integrity: sha512-OvlIYQK9tNneDlS0VN54LLd5uiPCBOp7gS5Z0f1mjoJYBrtStzgmJBxONW3U6OZqdtNzZPmn9BS/7WI7BFFcFQ==} + + '@types/mdast@3.0.14': + resolution: {integrity: sha512-gVZ04PGgw1qLZKsnWnyFv4ORnaJ+DXLdHTVSFbU8yX6xZ34Bjg4Q32yPkmveUP1yItXReKfB0Aknlh/3zxTKAw==} + + '@types/mdast@4.0.2': + resolution: {integrity: sha512-tYR83EignvhYO9iU3kDg8V28M0jqyh9zzp5GV+EO+AYnyUl3P5ltkTeJuTiFZQFz670FSb3EwT/6LQdX+UdKfw==} + + '@types/mdx@2.0.9': + resolution: {integrity: sha512-OKMdj17y8Cs+k1r0XFyp59ChSOwf8ODGtMQ4mnpfz5eFDk1aO41yN3pSKGuvVzmWAkFp37seubY1tzOVpwfWwg==} + + '@types/ms@0.7.33': + resolution: {integrity: sha512-AuHIyzR5Hea7ij0P9q7vx7xu4z0C28ucwjAZC0ja7JhINyCnOw8/DnvAPQQ9TfOlCtZAmCERKQX9+o1mgQhuOQ==} + + '@types/node@18.11.10': + resolution: {integrity: sha512-juG3RWMBOqcOuXC643OAdSA525V44cVgGV6dUDuiFtss+8Fk5x1hI93Rsld43VeJVIeqlP9I7Fn9/qaVqoEAuQ==} + + '@types/prop-types@15.7.9': + resolution: {integrity: sha512-n1yyPsugYNSmHgxDFjicaI2+gCNjsBck8UX9kuofAKlc0h1bL+20oSF72KeNaW2DUlesbEVCFgyV2dPGTiY42g==} + + '@types/react-dom@18.2.16': + resolution: {integrity: sha512-766c37araZ9vxtYs25gvY2wNdFWsT2ZiUvOd0zMhTaoGj6B911N8CKQWgXXJoPMLF3J82thpRqQA7Rf3rBwyJw==} + + '@types/react@18.2.36': + resolution: {integrity: sha512-o9XFsHYLLZ4+sb9CWUYwHqFVoG61SesydF353vFMMsQziiyRu8np4n2OYMUSDZ8XuImxDr9c5tR7gidlH29Vnw==} + + '@types/scheduler@0.16.5': + resolution: {integrity: sha512-s/FPdYRmZR8SjLWGMCuax7r3qCWQw9QKHzXVukAuuIJkXkDRwp+Pu5LMIVFi0Fxbav35WURicYr8u1QsoybnQw==} + + '@types/supports-color@8.1.3': + resolution: {integrity: sha512-Hy6UMpxhE3j1tLpl27exp1XqHD7n8chAiNPzWfz16LPZoMMoSc4dzLl6w9qijkEb/r5O1ozdu1CWGA2L83ZeZg==} + + '@types/unist@2.0.9': + resolution: {integrity: sha512-zC0iXxAv1C1ERURduJueYzkzZ2zaGyc+P2c95hgkikHPr3z8EdUZOlgEQ5X0DRmwDZn+hekycQnoeiiRVrmilQ==} + + '@types/unist@3.0.1': + resolution: {integrity: sha512-ue/hDUpPjC85m+PM9OQDMZr3LywT+CT6mPsQq8OJtCLiERkGRcQUFvu9XASF5XWqyZFXbf15lvb3JFJ4dRLWPg==} + + '@ungap/structured-clone@1.2.0': + resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} + + abbrev@2.0.0: + resolution: {integrity: sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + abitype@0.9.8: + resolution: {integrity: sha512-puLifILdm+8sjyss4S+fsUN09obiT1g2YW6CtcQF+QDzxR0euzgEB29MZujC6zMk2a6SVmtttq1fc6+YFA7WYQ==} + peerDependencies: + typescript: '>=5.0.4' + zod: ^3 >=3.19.1 + peerDependenciesMeta: + typescript: + optional: true + zod: + optional: true + + abitype@1.0.6: + resolution: {integrity: sha512-MMSqYh4+C/aVqI2RQaWqbvI4Kxo5cQV40WQ4QFtDnNzCkqChm8MuENhElmynZlO0qUy/ObkEUaXtKqYnx1Kp3A==} + peerDependencies: + typescript: '>=5.0.4' + zod: ^3 >=3.22.0 + peerDependenciesMeta: + typescript: + optional: true + zod: + optional: true + + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn@8.11.2: + resolution: {integrity: sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==} + engines: {node: '>=0.4.0'} + hasBin: true + + aes-js@3.0.0: + resolution: {integrity: sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==} + + ajv-formats@2.1.1: + resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + + ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + + ajv@8.12.0: + resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} + + algoliasearch@4.23.3: + resolution: {integrity: sha512-Le/3YgNvjW9zxIQMRhUHuhiUjAlKY/zsdZpfq4dlLqg6mEm0nL6yk+7f2hDOtLpxsgE4jSzDmvHL7nXdBp5feg==} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-regex@6.0.1: + resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} + engines: {node: '>=12'} + + ansi-sequence-parser@1.1.1: + resolution: {integrity: sha512-vJXt3yiaUL4UU546s3rPXlsry/RnM730G1+HkpKE012AN0sx1eOrxSu95oKDIonskeLTijMgqWZ3uDEe3NFvyg==} + + ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + ansi-styles@5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + + ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + + arch@2.2.0: + resolution: {integrity: sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==} + + arg@1.0.0: + resolution: {integrity: sha512-Wk7TEzl1KqvTGs/uyhmHO/3XLd3t1UeU4IstvPXVzGPM522cTjqjNZ99esCkcL52sjqjo8e8CTBcWhkxvGzoAw==} + + argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + aria-query@5.1.3: + resolution: {integrity: sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==} + + array-buffer-byte-length@1.0.0: + resolution: {integrity: sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==} + + array-timsort@1.0.3: + resolution: {integrity: sha512-/+3GRL7dDAGEfM6TseQk/U+mi18TU2Ms9I3UlLdUMhz2hbvGNTKdj9xniwXfUqgYhHxRx0+8UnKkvlNwVU+cWQ==} + + array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + + assertion-error@1.1.0: + resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} + + astring@1.8.6: + resolution: {integrity: sha512-ISvCdHdlTDlH5IpxQJIex7BWBywFWgjJSVdwst+/iQCoEYnyOaQ95+X1JGshuBjGp6nxKUy1jMgE3zPqN7fQdg==} + hasBin: true + + available-typed-arrays@1.0.5: + resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==} + engines: {node: '>= 0.4'} + + bail@2.0.2: + resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + bech32@1.1.4: + resolution: {integrity: sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==} + + big-integer@1.6.52: + resolution: {integrity: sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==} + engines: {node: '>=0.6'} + + bignumber.js@9.1.2: + resolution: {integrity: sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==} + + bn.js@4.11.6: + resolution: {integrity: sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA==} + + bn.js@4.12.0: + resolution: {integrity: sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==} + + bn.js@5.2.1: + resolution: {integrity: sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==} + + bplist-parser@0.2.0: + resolution: {integrity: sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==} + engines: {node: '>= 5.10.0'} + + brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + + brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + + braces@3.0.2: + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + engines: {node: '>=8'} + + brorand@1.1.0: + resolution: {integrity: sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==} + + buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + + buffer-reverse@1.0.1: + resolution: {integrity: sha512-M87YIUBsZ6N924W57vDwT/aOu8hw7ZgdByz6ijksLjmHJELBASmYTTlNHRgjE+pTsT9oJXGaDSgqqwfdHotDUg==} + + bufio@1.2.1: + resolution: {integrity: sha512-9oR3zNdupcg/Ge2sSHQF3GX+kmvL/fTPvD0nd5AGLq8SjUYnTz+SlFjK/GXidndbZtIj+pVKXiWeR9w6e9wKCA==} + engines: {node: '>=14.0.0'} + + bundle-name@3.0.0: + resolution: {integrity: sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw==} + engines: {node: '>=12'} + + busboy@1.6.0: + resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} + engines: {node: '>=10.16.0'} + + call-bind@1.0.5: + resolution: {integrity: sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + camel-case@4.1.2: + resolution: {integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==} + + caniuse-lite@1.0.30001669: + resolution: {integrity: sha512-DlWzFDJqstqtIVx1zeSpIMLjunf5SmwOw0N2Ck/QSQdS8PLS4+9HrLaYei4w8BIAL7IB/UEDu889d8vhCTPA0w==} + + capital-case@1.0.4: + resolution: {integrity: sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==} + + ccount@2.0.1: + resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} + + chai@4.3.10: + resolution: {integrity: sha512-0UXG04VuVbruMUYbJ6JctvH0YnC/4q3/AkT18q4NaITo91CUm0liMS9VqzT9vZhVQ/1eqPanMWjBM+Juhfb/9g==} + engines: {node: '>=4'} + + chalk-template@1.1.0: + resolution: {integrity: sha512-T2VJbcDuZQ0Tb2EWwSotMPJjgpy1/tGee1BTpUNsGZ/qgNjV2t7Mvu+d4600U564nbLesN1x2dPL+xii174Ekg==} + engines: {node: '>=14.16'} + + chalk@2.3.0: + resolution: {integrity: sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==} + engines: {node: '>=4'} + + chalk@2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + chalk@5.3.0: + resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + + change-case@4.1.2: + resolution: {integrity: sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A==} + + character-entities-html4@2.1.0: + resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} + + character-entities-legacy@1.1.4: + resolution: {integrity: sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==} + + character-entities-legacy@3.0.0: + resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} + + character-entities@1.2.4: + resolution: {integrity: sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==} + + character-entities@2.0.2: + resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} + + character-reference-invalid@1.1.4: + resolution: {integrity: sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==} + + character-reference-invalid@2.0.1: + resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} + + check-error@1.0.3: + resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} + + ci-info@3.9.0: + resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} + engines: {node: '>=8'} + + clear-module@4.1.2: + resolution: {integrity: sha512-LWAxzHqdHsAZlPlEyJ2Poz6AIs384mPeqLVCru2p0BrP9G/kVGuhNyZYClLO6cXlnuJjzC8xtsJIuMjKqLXoAw==} + engines: {node: '>=8'} + + client-only@0.0.1: + resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} + + clipboardy@1.2.2: + resolution: {integrity: sha512-16KrBOV7bHmHdxcQiCvfUFYVFyEah4FI8vYT1Fr7CGSA4G+xBWMEfUEQJS1hxeHGtI9ju1Bzs9uXSbj5HZKArw==} + engines: {node: '>=4'} + + clsx@2.1.1: + resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} + engines: {node: '>=6'} + + color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + comma-separated-tokens@2.0.3: + resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} + + commander@11.1.0: + resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==} + engines: {node: '>=16'} + + commander@7.2.0: + resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} + engines: {node: '>= 10'} + + commander@8.3.0: + resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} + engines: {node: '>= 12'} + + comment-json@4.2.3: + resolution: {integrity: sha512-SsxdiOf064DWoZLH799Ata6u7iV658A11PlWtZATDlXPpKGJnbJZ5Z24ybixAi+LUUqJ/GKowAejtC5GFUG7Tw==} + engines: {node: '>= 6'} + + compute-scroll-into-view@3.1.0: + resolution: {integrity: sha512-rj8l8pD4bJ1nx+dAkMhV1xB5RuZEyVysfxJqB1pRchh1KVvwOv9b7CGB8ZfjTImVv2oF+sYMUkMZq6Na5Ftmbg==} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + concat-stream@2.0.0: + resolution: {integrity: sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==} + engines: {'0': node >= 6.0} + + configstore@6.0.0: + resolution: {integrity: sha512-cD31W1v3GqUlQvbBCGcXmd2Nj9SvLDOP1oQ0YFuLETufzSPaKp11rYBsSOm7rCsW3OnIRAFM3OxRhceaXNYHkA==} + engines: {node: '>=12'} + + constant-case@3.0.4: + resolution: {integrity: sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ==} + + core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + + cose-base@1.0.3: + resolution: {integrity: sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg==} + + cose-base@2.2.0: + resolution: {integrity: sha512-AzlgcsCbUMymkADOJtQm3wO9S3ltPfYOFD5033keQn9NJzIbtnZj+UdBJe7DYml/8TdbtHJW3j58SOnKhWY/5g==} + + cross-spawn@5.1.0: + resolution: {integrity: sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==} + + cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + + crypto-js@4.2.0: + resolution: {integrity: sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==} + + crypto-random-string@4.0.0: + resolution: {integrity: sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==} + engines: {node: '>=12'} + + cspell-config-lib@8.1.3: + resolution: {integrity: sha512-whzJYxcxos3vnywn0alCFZ+Myc0K/C62pUurfOGhgvIba7ArmlXhNRaL2r5noBxWARtpBOtzz3vrzSBK7Lq6jg==} + engines: {node: '>=18'} + + cspell-dictionary@8.1.3: + resolution: {integrity: sha512-nkRQDPNnA6tw+hJFBqq26M0nK306q5rtyv/AUIWa8ZHhQkwzACnpMSpuJA7/DV5GVvPKltMK5M4A6vgfpoaFHw==} + engines: {node: '>=18'} + + cspell-gitignore@8.1.3: + resolution: {integrity: sha512-NHx5lg44eCKb6yJmUPOCz4prcuYowzoo5GJ5hOcCfbk7ZEBWV1E2/kDRuQMOK2W0y1hNGr45CSxO3UxWJlYg7w==} + engines: {node: '>=18'} + hasBin: true + + cspell-glob@8.1.3: + resolution: {integrity: sha512-Likr7UVUXBpthQnM5r6yao3X0YBNRbJ9AHWXTC2RJfzwZOFKF+pKPfeo3FU+Px8My96M4RC2bVMbrbZUwN5NJw==} + engines: {node: '>=18'} + + cspell-grammar@8.1.3: + resolution: {integrity: sha512-dTOwNq6a5wcVzOsi4xY5/tq2r2w/+wLVU+WfyySTsPe66Rjqx/QceFl4OinImks/ZMKF7Zyjd3WGyQ5TcSsJFQ==} + engines: {node: '>=18'} + hasBin: true + + cspell-io@8.1.3: + resolution: {integrity: sha512-QkcFeYd79oIl7PgSqFSZyvwXnZQhXmdCI733n54IN2+iXDcf7W0mwptxoC/cE19RkEwAwEFLG81UAy6L/BXI6A==} + engines: {node: '>=18'} + + cspell-lib@8.1.3: + resolution: {integrity: sha512-Kk8bpHVkDZO4MEiPkDvRf/LgJ0h5mufbKLTWModq6k0Ca8EkZ/qgQlZ0ve0rIivbleSqebuWjpJHKDM+IHmzHA==} + engines: {node: '>=18'} + + cspell-trie-lib@8.1.3: + resolution: {integrity: sha512-EDSYU9MCtzPSJDrfvDrTKmc0rzl50Ehjg1c5rUCqn33p2LCRe/G8hW0FxXe0mxrZxrMO2b8l0PVSGlrCXCQ8RQ==} + engines: {node: '>=18'} + + cspell@8.1.3: + resolution: {integrity: sha512-SU4Su6002bPoJYaiMeNV4wwLoS8TwaOgIwaTxhys3GDbJIxZV6CrDgwksezHcG7TZrC4yrveDVsdpnrzmQ7T5Q==} + engines: {node: '>=18'} + hasBin: true + + csstype@3.1.2: + resolution: {integrity: sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==} + + cytoscape-cose-bilkent@4.1.0: + resolution: {integrity: sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ==} + peerDependencies: + cytoscape: ^3.2.0 + + cytoscape-fcose@2.2.0: + resolution: {integrity: sha512-ki1/VuRIHFCzxWNrsshHYPs6L7TvLu3DL+TyIGEsRcvVERmxokbf5Gdk7mFxZnTdiGtnA4cfSmjZJMviqSuZrQ==} + peerDependencies: + cytoscape: ^3.2.0 + + cytoscape@3.27.0: + resolution: {integrity: sha512-pPZJilfX9BxESwujODz5pydeGi+FBrXq1rcaB1mfhFXXFJ9GjE6CNndAk+8jPzoXGD+16LtSS4xlYEIUiW4Abg==} + engines: {node: '>=0.10'} + + d3-array@2.12.1: + resolution: {integrity: sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==} + + d3-array@3.2.4: + resolution: {integrity: sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==} + engines: {node: '>=12'} + + d3-axis@3.0.0: + resolution: {integrity: sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==} + engines: {node: '>=12'} + + d3-brush@3.0.0: + resolution: {integrity: sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==} + engines: {node: '>=12'} + + d3-chord@3.0.1: + resolution: {integrity: sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==} + engines: {node: '>=12'} + + d3-color@3.1.0: + resolution: {integrity: sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==} + engines: {node: '>=12'} + + d3-contour@4.0.2: + resolution: {integrity: sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==} + engines: {node: '>=12'} + + d3-delaunay@6.0.4: + resolution: {integrity: sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==} + engines: {node: '>=12'} + + d3-dispatch@3.0.1: + resolution: {integrity: sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==} + engines: {node: '>=12'} + + d3-drag@3.0.0: + resolution: {integrity: sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==} + engines: {node: '>=12'} + + d3-dsv@3.0.1: + resolution: {integrity: sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==} + engines: {node: '>=12'} + hasBin: true + + d3-ease@3.0.1: + resolution: {integrity: sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==} + engines: {node: '>=12'} + + d3-fetch@3.0.1: + resolution: {integrity: sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==} + engines: {node: '>=12'} + + d3-force@3.0.0: + resolution: {integrity: sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==} + engines: {node: '>=12'} + + d3-format@3.1.0: + resolution: {integrity: sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==} + engines: {node: '>=12'} + + d3-geo@3.1.0: + resolution: {integrity: sha512-JEo5HxXDdDYXCaWdwLRt79y7giK8SbhZJbFWXqbRTolCHFI5jRqteLzCsq51NKbUoX0PjBVSohxrx+NoOUujYA==} + engines: {node: '>=12'} + + d3-hierarchy@3.1.2: + resolution: {integrity: sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==} + engines: {node: '>=12'} + + d3-interpolate@3.0.1: + resolution: {integrity: sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==} + engines: {node: '>=12'} + + d3-path@1.0.9: + resolution: {integrity: sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==} + + d3-path@3.1.0: + resolution: {integrity: sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==} + engines: {node: '>=12'} + + d3-polygon@3.0.1: + resolution: {integrity: sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==} + engines: {node: '>=12'} + + d3-quadtree@3.0.1: + resolution: {integrity: sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==} + engines: {node: '>=12'} + + d3-random@3.0.1: + resolution: {integrity: sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==} + engines: {node: '>=12'} + + d3-sankey@0.12.3: + resolution: {integrity: sha512-nQhsBRmM19Ax5xEIPLMY9ZmJ/cDvd1BG3UVvt5h3WRxKg5zGRbvnteTyWAbzeSvlh3tW7ZEmq4VwR5mB3tutmQ==} + + d3-scale-chromatic@3.0.0: + resolution: {integrity: sha512-Lx9thtxAKrO2Pq6OO2Ua474opeziKr279P/TKZsMAhYyNDD3EnCffdbgeSYN5O7m2ByQsxtuP2CSDczNUIZ22g==} + engines: {node: '>=12'} + + d3-scale@4.0.2: + resolution: {integrity: sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==} + engines: {node: '>=12'} + + d3-selection@3.0.0: + resolution: {integrity: sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==} + engines: {node: '>=12'} + + d3-shape@1.3.7: + resolution: {integrity: sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==} + + d3-shape@3.2.0: + resolution: {integrity: sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==} + engines: {node: '>=12'} + + d3-time-format@4.1.0: + resolution: {integrity: sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==} + engines: {node: '>=12'} + + d3-time@3.1.0: + resolution: {integrity: sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==} + engines: {node: '>=12'} + + d3-timer@3.0.1: + resolution: {integrity: sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==} + engines: {node: '>=12'} + + d3-transition@3.0.1: + resolution: {integrity: sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==} + engines: {node: '>=12'} + peerDependencies: + d3-selection: 2 - 3 + + d3-zoom@3.0.0: + resolution: {integrity: sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==} + engines: {node: '>=12'} + + d3@7.8.5: + resolution: {integrity: sha512-JgoahDG51ncUfJu6wX/1vWQEqOflgXyl4MaHqlcSruTez7yhaRKR9i8VjjcQGeS2en/jnFivXuaIMnseMMt0XA==} + engines: {node: '>=12'} + + dagre-d3-es@7.0.10: + resolution: {integrity: sha512-qTCQmEhcynucuaZgY5/+ti3X/rnszKZhEQH/ZdWdtP1tA/y3VoHJzcVrO9pjjJCNpigfscAtoUB5ONcd2wNn0A==} + + dayjs@1.11.10: + resolution: {integrity: sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==} + + debug@4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + decode-named-character-reference@1.0.2: + resolution: {integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==} + + deep-eql@4.1.3: + resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} + engines: {node: '>=6'} + + deep-equal@2.2.3: + resolution: {integrity: sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==} + engines: {node: '>= 0.4'} + + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + + default-browser-id@3.0.0: + resolution: {integrity: sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==} + engines: {node: '>=12'} + + default-browser@4.0.0: + resolution: {integrity: sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA==} + engines: {node: '>=14.16'} + + define-data-property@1.1.1: + resolution: {integrity: sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==} + engines: {node: '>= 0.4'} + + define-lazy-prop@3.0.0: + resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} + engines: {node: '>=12'} + + define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + + delaunator@5.0.0: + resolution: {integrity: sha512-AyLvtyJdbv/U1GkiS6gUUzclRoAY4Gs75qkMygJJhU75LW4DNuSF2RMzpxs9jw9Oz1BobHjTdkG3zdP55VxAqw==} + + dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + + devlop@1.1.0: + resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + + diff@5.1.0: + resolution: {integrity: sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==} + engines: {node: '>=0.3.1'} + + dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + + doctrine@3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + + dom-accessibility-api@0.5.16: + resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==} + + dompurify@3.0.6: + resolution: {integrity: sha512-ilkD8YEnnGh1zJ240uJsW7AzE+2qpbOUYjacomn3AvJ6J4JhKGSZ2nh4wUIXPZrEPppaCLx5jFe8T89Rk8tQ7w==} + + dot-case@3.0.4: + resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} + + dot-prop@6.0.1: + resolution: {integrity: sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==} + engines: {node: '>=10'} + + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + + elkjs@0.8.2: + resolution: {integrity: sha512-L6uRgvZTH+4OF5NE/MBbzQx/WYpru1xCBE9respNj6qznEewGUIfhzmm7horWWxbNO2M0WckQypGctR8lH79xQ==} + + elliptic@6.5.4: + resolution: {integrity: sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==} + + emoji-regex@10.3.0: + resolution: {integrity: sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + + error-ex@1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + + es-get-iterator@1.1.3: + resolution: {integrity: sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==} + + escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + escape-string-regexp@5.0.0: + resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} + engines: {node: '>=12'} + + eslint-mdx@2.2.0: + resolution: {integrity: sha512-AriN6lCW6KhWQ9GEiXapR1DokKHefOUqKvCmHxnE9puCWYhWiycU2SNKH8jmrasDBreZ+RtJDLi+RcUNLJatjg==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + peerDependencies: + eslint: '>=8.0.0' + + eslint-plugin-markdown@3.0.1: + resolution: {integrity: sha512-8rqoc148DWdGdmYF6WSQFT3uQ6PO7zXYgeBpHAOAakX/zpq+NvFYbDA/H7PYzHajwtmaOzAwfxyl++x0g1/N9A==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + + eslint-plugin-mdx@2.2.0: + resolution: {integrity: sha512-OseoMXUIr8iy3E0me+wJLVAxuB0kxHP1plxuYAJDynzorzOj2OKv8Fhr+rIOJ32zfl3bnEWsqFnUiCnyznr1JQ==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + peerDependencies: + eslint: '>=8.0.0' + + eslint-scope@7.2.2: + resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint@8.54.0: + resolution: {integrity: sha512-NY0DfAkM8BIZDVl6PgSa1ttZbx3xHgJzSNJKYcQglem6CppHyMhRIQkBVSSMaSRnLhig3jsDbEzOjwCVt4AmmA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + hasBin: true + + espree@9.6.1: + resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + + esquery@1.5.0: + resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} + engines: {node: '>=0.10'} + + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + estree-util-attach-comments@2.1.1: + resolution: {integrity: sha512-+5Ba/xGGS6mnwFbXIuQiDPTbuTxuMCooq3arVv7gPZtYpjp+VXH/NkHAP35OOefPhNG/UGqU3vt/LTABwcHX0w==} + + estree-util-build-jsx@2.2.2: + resolution: {integrity: sha512-m56vOXcOBuaF+Igpb9OPAy7f9w9OIkb5yhjsZuaPm7HoGi4oTOQi0h2+yZ+AtKklYFZ+rPC4n0wYCJCEU1ONqg==} + + estree-util-is-identifier-name@2.1.0: + resolution: {integrity: sha512-bEN9VHRyXAUOjkKVQVvArFym08BTWB0aJPppZZr0UNyAqWsLaVfAqP7hbaTJjzHifmB5ebnR8Wm7r7yGN/HonQ==} + + estree-util-to-js@1.2.0: + resolution: {integrity: sha512-IzU74r1PK5IMMGZXUVZbmiu4A1uhiPgW5hm1GjcOfr4ZzHaMPpLNJjR7HjXiIOzi25nZDrgFTobHTkV5Q6ITjA==} + + estree-util-value-to-estree@1.3.0: + resolution: {integrity: sha512-Y+ughcF9jSUJvncXwqRageavjrNPAI+1M/L3BI3PyLp1nmgYTGUXU6t5z1Y7OWuThoDdhPME07bQU+d5LxdJqw==} + engines: {node: '>=12.0.0'} + + estree-util-visit@1.2.1: + resolution: {integrity: sha512-xbgqcrkIVbIG+lI/gzbvd9SGTJL4zqJKBFttUl5pP27KhAjtMKbX/mQXJ7qgyXpMgVy/zvpm0xoQQaGL8OloOw==} + + estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + ethereum-bloom-filters@1.0.10: + resolution: {integrity: sha512-rxJ5OFN3RwjQxDcFP2Z5+Q9ho4eIdEmSc2ht0fCu8Se9nbXjZ7/031uXoUYJ87KHCOdVeiUuwSnoS7hmYAGVHA==} + + ethereum-cryptography@2.1.2: + resolution: {integrity: sha512-Z5Ba0T0ImZ8fqXrJbpHcbpAvIswRte2wGNR/KePnu8GbbvgJ47lMxT/ZZPG6i9Jaht4azPDop4HaM00J0J59ug==} + + ethers@5.7.2: + resolution: {integrity: sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==} + + ethjs-unit@0.1.6: + resolution: {integrity: sha512-/Sn9Y0oKl0uqQuvgFk/zQgR7aw1g36qX/jzSQ5lSwlO0GigPymk4eGQfeNTD03w1dPOqfz8V77Cy43jH56pagw==} + engines: {node: '>=6.5.0', npm: '>=3'} + + execa@0.8.0: + resolution: {integrity: sha512-zDWS+Rb1E8BlqqhALSt9kUhss8Qq4nN3iof3gsOdyINksElaPyNBtKUMTR62qhvgVWR0CqCX7sdnKe4MnUbFEA==} + engines: {node: '>=4'} + + execa@5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} + + execa@7.2.0: + resolution: {integrity: sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==} + engines: {node: ^14.18.0 || ^16.14.0 || >=18.0.0} + + extend-shallow@2.0.1: + resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} + engines: {node: '>=0.10.0'} + + extend@3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-equals@5.0.1: + resolution: {integrity: sha512-WF1Wi8PwwSY7/6Kx0vKXtw8RwuSGoM1bvDaJbu7MxDlR1vovZjIAKrnzyrThgAjm6JDTu0fVgWXDlMGspodfoQ==} + engines: {node: '>=6.0.0'} + + fast-glob@3.3.2: + resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + engines: {node: '>=8.6.0'} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + fastq@1.15.0: + resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} + + fault@2.0.1: + resolution: {integrity: sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ==} + + file-entry-cache@6.0.1: + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} + engines: {node: ^10.12.0 || >=12.0.0} + + file-entry-cache@7.0.2: + resolution: {integrity: sha512-TfW7/1iI4Cy7Y8L6iqNdZQVvdXn0f8B4QcIXmkIbtTIe/Okm/nSlHb4IwGzRVOd3WfSieCgvf5cMzEfySAIl0g==} + engines: {node: '>=12.0.0'} + + fill-range@7.0.1: + resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + engines: {node: '>=8'} + + find-up-simple@1.0.0: + resolution: {integrity: sha512-q7Us7kcjj2VMePAa02hDAF6d+MzsdsAWEwYyOpwUtlerRBkOEPBCRZrAV4XfcSN8fHAgaD0hP7miwoay6DCprw==} + engines: {node: '>=18'} + + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + + find-up@6.3.0: + resolution: {integrity: sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + flat-cache@3.2.0: + resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} + engines: {node: ^10.12.0 || >=12.0.0} + + flatted@3.2.9: + resolution: {integrity: sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==} + + flexsearch@0.7.31: + resolution: {integrity: sha512-XGozTsMPYkm+6b5QL3Z9wQcJjNYxp0CYn3U1gO7dwD6PAqU1SVWZxI9CCg3z+ml3YfqdPnrBehaBrnH2AGKbNA==} + + focus-visible@5.2.0: + resolution: {integrity: sha512-Rwix9pBtC1Nuy5wysTmKy+UjbDJpIfg8eHjw0rjZ1mX4GNLz1Bmd16uDpI3Gk1i70Fgcs8Csg2lPm8HULFg9DQ==} + + for-each@0.3.3: + resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} + + foreground-child@3.1.1: + resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} + engines: {node: '>=14'} + + format@0.2.2: + resolution: {integrity: sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==} + engines: {node: '>=0.4.x'} + + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + functions-have-names@1.2.3: + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + + gensequence@6.0.0: + resolution: {integrity: sha512-8WwuywE9pokJRAcg2QFR/plk3cVPebSUqRPzpGQh3WQ0wIiHAw+HyOQj5IuHyUTQBHpBKFoB2JUMu9zT3vJ16Q==} + engines: {node: '>=16'} + + get-func-name@2.0.2: + resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} + + get-intrinsic@1.2.2: + resolution: {integrity: sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==} + + get-stdin@9.0.0: + resolution: {integrity: sha512-dVKBjfWisLAicarI2Sf+JuBE/DghV4UzNAVe9yhEJuzeREd3JhOTE9cUaJTeSa77fsbQUK3pcOpJfM59+VKZaA==} + engines: {node: '>=12'} + + get-stream@3.0.0: + resolution: {integrity: sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==} + engines: {node: '>=4'} + + get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + + git-up@7.0.0: + resolution: {integrity: sha512-ONdIrbBCFusq1Oy0sC71F5azx8bVkvtZtMJAsv+a6lz5YAmbNnLD6HAB4gptHZVLPR8S2/kVN6Gab7lryq5+lQ==} + + git-url-parse@13.1.1: + resolution: {integrity: sha512-PCFJyeSSdtnbfhSNRw9Wk96dDCNx+sogTe4YNXeXSJxt7xz5hvXekuRn9JX7m+Mf4OscCu8h+mtAl3+h5Fo8lQ==} + + github-slugger@1.5.0: + resolution: {integrity: sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw==} + + github-slugger@2.0.0: + resolution: {integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + + glob@10.3.10: + resolution: {integrity: sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + + glob@8.1.0: + resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} + engines: {node: '>=12'} + + global-directory@4.0.1: + resolution: {integrity: sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==} + engines: {node: '>=18'} + + globals@13.23.0: + resolution: {integrity: sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==} + engines: {node: '>=8'} + + globby@11.0.4: + resolution: {integrity: sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==} + engines: {node: '>=10'} + + gopd@1.0.1: + resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + + gray-matter@4.0.3: + resolution: {integrity: sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==} + engines: {node: '>=6.0'} + + has-bigints@1.0.2: + resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} + + has-flag@2.0.0: + resolution: {integrity: sha512-P+1n3MnwjR/Epg9BBo1KT8qbye2g2Ou4sFumihwt6I4tsUX7jnLcX4BTOSKg/B1ZrIYMN9FcEnG4x5a7NB8Eng==} + engines: {node: '>=0.10.0'} + + has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + has-own-prop@2.0.0: + resolution: {integrity: sha512-Pq0h+hvsVm6dDEa8x82GnLSYHOzNDt7f0ddFa3FqcQlgzEiptPqL+XrOJNavjOzSYiYWIrgeVYYgGlLmnxwilQ==} + engines: {node: '>=8'} + + has-property-descriptors@1.0.1: + resolution: {integrity: sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==} + + has-proto@1.0.1: + resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} + engines: {node: '>= 0.4'} + + has-symbols@1.0.3: + resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.0: + resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==} + engines: {node: '>= 0.4'} + + hash-obj@4.0.0: + resolution: {integrity: sha512-FwO1BUVWkyHasWDW4S8o0ssQXjvyghLV2rfVhnN36b2bbcj45eGiuzdn9XOvOpjV3TKQD7Gm2BWNXdE9V4KKYg==} + engines: {node: '>=12'} + + hash.js@1.1.7: + resolution: {integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==} + + hasown@2.0.0: + resolution: {integrity: sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==} + engines: {node: '>= 0.4'} + + hast-util-from-dom@5.0.0: + resolution: {integrity: sha512-d6235voAp/XR3Hh5uy7aGLbM3S4KamdW0WEgOaU1YoewnuYw4HXb5eRtv9g65m/RFGEfUY1Mw4UqCc5Y8L4Stg==} + + hast-util-from-html-isomorphic@2.0.0: + resolution: {integrity: sha512-zJfpXq44yff2hmE0XmwEOzdWin5xwH+QIhMLOScpX91e/NSGPsAzNCvLQDIEPyO2TXi+lBmU6hjLIhV8MwP2kw==} + + hast-util-from-html@2.0.1: + resolution: {integrity: sha512-RXQBLMl9kjKVNkJTIO6bZyb2n+cUH8LFaSSzo82jiLT6Tfc+Pt7VQCS+/h3YwG4jaNE2TA2sdJisGWR+aJrp0g==} + + hast-util-from-parse5@8.0.1: + resolution: {integrity: sha512-Er/Iixbc7IEa7r/XLtuG52zoqn/b3Xng/w6aZQ0xGVxzhw5xUFxcRqdPzP6yFi/4HBYRaifaI5fQ1RH8n0ZeOQ==} + + hast-util-is-element@3.0.0: + resolution: {integrity: sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==} + + hast-util-parse-selector@4.0.0: + resolution: {integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==} + + hast-util-raw@9.0.1: + resolution: {integrity: sha512-5m1gmba658Q+lO5uqL5YNGQWeh1MYWZbZmWrM5lncdcuiXuo5E2HT/CIOp0rLF8ksfSwiCVJ3twlgVRyTGThGA==} + + hast-util-to-estree@2.3.3: + resolution: {integrity: sha512-ihhPIUPxN0v0w6M5+IiAZZrn0LH2uZomeWwhn7uP7avZC6TE7lIiEh2yBMPr5+zi1aUCXq6VoYRgs2Bw9xmycQ==} + + hast-util-to-parse5@8.0.0: + resolution: {integrity: sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==} + + hast-util-to-text@4.0.0: + resolution: {integrity: sha512-EWiE1FSArNBPUo1cKWtzqgnuRQwEeQbQtnFJRYV1hb1BWDgrAlBU0ExptvZMM/KSA82cDpm2sFGf3Dmc5Mza3w==} + + hast-util-whitespace@2.0.1: + resolution: {integrity: sha512-nAxA0v8+vXSBDt3AnRUNjyRIQ0rD+ntpbAp4LnPkumc5M9yUbSMa4XDU9Q6etY4f1Wp4bNgvc1yjiZtsTTrSng==} + + hastscript@8.0.0: + resolution: {integrity: sha512-dMOtzCEd3ABUeSIISmrETiKuyydk1w0pa+gE/uormcTpSYuaNJPbX1NU3JLyscSLjwAQM8bWMhhIlnCqnRvDTw==} + + header-case@2.0.4: + resolution: {integrity: sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q==} + + heap@0.2.7: + resolution: {integrity: sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==} + + hmac-drbg@1.0.1: + resolution: {integrity: sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==} + + html-void-elements@3.0.0: + resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} + + human-signals@2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} + + human-signals@4.3.1: + resolution: {integrity: sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==} + engines: {node: '>=14.18.0'} + + iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + + ignore@5.3.0: + resolution: {integrity: sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==} + engines: {node: '>= 4'} + + import-fresh@3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + + import-meta-resolve@2.2.2: + resolution: {integrity: sha512-f8KcQ1D80V7RnqVm+/lirO9zkOxjGxhaTC1IPrBGd3MEfNgmNG67tSUO9gTi2F3Blr2Az6g1vocaxzkVnWl9MA==} + + import-meta-resolve@4.0.0: + resolution: {integrity: sha512-okYUR7ZQPH+efeuMJGlq4f8ubUgO50kByRPyt/Cy1Io4PSRsPjxME+YlVaCOx+NIToW7hCsZNFJyTPFFKepRSA==} + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + ini@4.1.1: + resolution: {integrity: sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + inline-style-parser@0.1.1: + resolution: {integrity: sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==} + + internal-slot@1.0.6: + resolution: {integrity: sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==} + engines: {node: '>= 0.4'} + + internmap@1.0.1: + resolution: {integrity: sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==} + + internmap@2.0.3: + resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==} + engines: {node: '>=12'} + + intersection-observer@0.12.2: + resolution: {integrity: sha512-7m1vEcPCxXYI8HqnL8CKI6siDyD+eIWSwgB3DZA+ZTogxk9I4CDnj4wilt9x/+/QbHI4YG5YZNmC6458/e9Ktg==} + + is-alphabetical@1.0.4: + resolution: {integrity: sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==} + + is-alphabetical@2.0.1: + resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==} + + is-alphanumerical@1.0.4: + resolution: {integrity: sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==} + + is-alphanumerical@2.0.1: + resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==} + + is-arguments@1.1.1: + resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} + engines: {node: '>= 0.4'} + + is-array-buffer@3.0.2: + resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==} + + is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + + is-bigint@1.0.4: + resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} + + is-boolean-object@1.1.2: + resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} + engines: {node: '>= 0.4'} + + is-buffer@2.0.5: + resolution: {integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==} + engines: {node: '>=4'} + + is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + + is-date-object@1.0.5: + resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} + engines: {node: '>= 0.4'} + + is-decimal@1.0.4: + resolution: {integrity: sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==} + + is-decimal@2.0.1: + resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} + + is-docker@2.2.1: + resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} + engines: {node: '>=8'} + hasBin: true + + is-docker@3.0.0: + resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + hasBin: true + + is-empty@1.2.0: + resolution: {integrity: sha512-F2FnH/otLNJv0J6wc73A5Xo7oHLNnqplYqZhUu01tD54DIPvxIRSTSLkrUB/M0nHO4vo1O9PDfN4KoTxCzLh/w==} + + is-extendable@0.1.1: + resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} + engines: {node: '>=0.10.0'} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-hex-prefixed@1.0.0: + resolution: {integrity: sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA==} + engines: {node: '>=6.5.0', npm: '>=3'} + + is-hexadecimal@1.0.4: + resolution: {integrity: sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==} + + is-hexadecimal@2.0.1: + resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} + + is-inside-container@1.0.0: + resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} + engines: {node: '>=14.16'} + hasBin: true + + is-map@2.0.2: + resolution: {integrity: sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==} + + is-number-object@1.0.7: + resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} + engines: {node: '>= 0.4'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-obj@2.0.0: + resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} + engines: {node: '>=8'} + + is-obj@3.0.0: + resolution: {integrity: sha512-IlsXEHOjtKhpN8r/tRFj2nDyTmHvcfNeu/nrRIcXE17ROeatXchkojffa1SpdqW4cr/Fj6QkEf/Gn4zf6KKvEQ==} + engines: {node: '>=12'} + + is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + + is-plain-obj@3.0.0: + resolution: {integrity: sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==} + engines: {node: '>=10'} + + is-plain-obj@4.1.0: + resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} + engines: {node: '>=12'} + + is-reference@3.0.2: + resolution: {integrity: sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==} + + is-regex@1.1.4: + resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} + engines: {node: '>= 0.4'} + + is-set@2.0.2: + resolution: {integrity: sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==} + + is-shared-array-buffer@1.0.2: + resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==} + + is-ssh@1.4.0: + resolution: {integrity: sha512-x7+VxdxOdlV3CYpjvRLBv5Lo9OJerlYanjwFrPR9fuGPjCiNiCzFgAWpiLAohSbsnH4ZAys3SBh+hq5rJosxUQ==} + + is-stream@1.1.0: + resolution: {integrity: sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==} + engines: {node: '>=0.10.0'} + + is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + + is-stream@3.0.0: + resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + is-string@1.0.7: + resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} + engines: {node: '>= 0.4'} + + is-symbol@1.0.4: + resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} + engines: {node: '>= 0.4'} + + is-typed-array@1.1.12: + resolution: {integrity: sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==} + engines: {node: '>= 0.4'} + + is-typedarray@1.0.0: + resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} + + is-weakmap@2.0.1: + resolution: {integrity: sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==} + + is-weakset@2.0.2: + resolution: {integrity: sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==} + + is-wsl@2.2.0: + resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} + engines: {node: '>=8'} + + isarray@2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + isows@1.0.3: + resolution: {integrity: sha512-2cKei4vlmg2cxEjm3wVSqn8pcoRF/LX/wpifuuNquFO4SQmPwarClT+SUCA2lt+l581tTeZIPIZuIDo2jWN1fg==} + peerDependencies: + ws: '*' + + isows@1.0.6: + resolution: {integrity: sha512-lPHCayd40oW98/I0uvgaHKWCSvkzY27LjWLbtzOm64yQ+G3Q5npjjbdppU65iZXkK1Zt+kH9pfegli0AYfwYYw==} + peerDependencies: + ws: '*' + + jackspeak@2.3.6: + resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} + engines: {node: '>=14'} + + js-sha3@0.8.0: + resolution: {integrity: sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==} + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-yaml@3.14.1: + resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} + hasBin: true + + js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + + json-parse-even-better-errors@3.0.0: + resolution: {integrity: sha512-iZbGHafX/59r39gPwVPRBGw0QQKnA7tte5pSMrhWOW7swGsVvVTjmfyAV9pNqk8YGT7tRCdxRu8uzcgZwoDooA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + + json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + + jsonc-parser@3.2.0: + resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} + + katex@0.16.9: + resolution: {integrity: sha512-fsSYjWS0EEOwvy81j3vRA8TEAhQhKiqO+FQaKWp0m39qwOzHVBgAUBIXWj1pB+O2W3fIpNa6Y9KSKCVbfPhyAQ==} + hasBin: true + + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + + khroma@2.1.0: + resolution: {integrity: sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw==} + + kind-of@6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} + + kleur@4.1.5: + resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} + engines: {node: '>=6'} + + layout-base@1.0.2: + resolution: {integrity: sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==} + + layout-base@2.0.1: + resolution: {integrity: sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg==} + + levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + + lines-and-columns@2.0.4: + resolution: {integrity: sha512-wM1+Z03eypVAVUCE7QdSqpVIvelbOakn1M0bPDoA4SGWPx3sNDVUiMo3L6To6WWGClB7VyXnhQ4Sn7gxiJbE6A==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + load-plugin@5.1.0: + resolution: {integrity: sha512-Lg1CZa1CFj2CbNaxijTL6PCbzd4qGTlZov+iH2p5Xwy/ApcZJh+i6jMN2cYePouTfjJfrNu3nXFdEw8LvbjPFQ==} + + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + + locate-path@7.2.0: + resolution: {integrity: sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + lodash-es@4.17.21: + resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} + + lodash.clonedeep@4.5.0: + resolution: {integrity: sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==} + + lodash.get@4.4.2: + resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} + + lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + longest-streak@3.1.0: + resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} + + loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + + loupe@2.3.7: + resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} + + lower-case@2.0.2: + resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} + + lru-cache@10.0.3: + resolution: {integrity: sha512-B7gr+F6MkqB3uzINHXNctGieGsRTMwIBgxkp0yq/5BwcuDzD4A8wQpHQW6vDAm1uKSLQghmRdD9sKqf2vJ1cEg==} + engines: {node: 14 || >=16.14} + + lru-cache@4.1.5: + resolution: {integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==} + + lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + + lz-string@1.5.0: + resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} + hasBin: true + + markdown-extensions@1.1.1: + resolution: {integrity: sha512-WWC0ZuMzCyDHYCasEGs4IPvLyTGftYwh6wIEOULOF0HXcqZlhwRzrK0w2VUlxWA98xnvb/jszw4ZSkJ6ADpM6Q==} + engines: {node: '>=0.10.0'} + + markdown-table@3.0.3: + resolution: {integrity: sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==} + + match-sorter@6.3.1: + resolution: {integrity: sha512-mxybbo3pPNuA+ZuCUhm5bwNkXrJTbsk5VWbR5wiwz/GC6LIiegBGn2w3O08UG/jdbYLinw51fSQ5xNU1U3MgBw==} + + mdast-comment-marker@2.1.2: + resolution: {integrity: sha512-HED3ezseRVkBzZ0uK4q6RJMdufr/2p3VfVZstE3H1N9K8bwtspztWo6Xd7rEatuGNoCXaBna8oEqMwUn0Ve1bw==} + + mdast-util-definitions@5.1.2: + resolution: {integrity: sha512-8SVPMuHqlPME/z3gqVwWY4zVXn8lqKv/pAhC57FuJ40ImXyBpmO5ukh98zB2v7Blql2FiHjHv9LVztSIqjY+MA==} + + mdast-util-find-and-replace@2.2.2: + resolution: {integrity: sha512-MTtdFRz/eMDHXzeK6W3dO7mXUlF82Gom4y0oOgvHhh/HXZAGvIQDUvQ0SuUx+j2tv44b8xTHOm8K/9OoRFnXKw==} + + mdast-util-from-markdown@0.8.5: + resolution: {integrity: sha512-2hkTXtYYnr+NubD/g6KGBS/0mFmBcifAsI0yIWRiRo0PjVs6SSOSOdtzbp6kSGnShDN6G5aWZpKQ2lWRy27mWQ==} + + mdast-util-from-markdown@1.3.1: + resolution: {integrity: sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww==} + + mdast-util-from-markdown@2.0.0: + resolution: {integrity: sha512-n7MTOr/z+8NAX/wmhhDji8O3bRvPTV/U0oTCaZJkjhPSKTPhS3xufVhKGF8s1pJ7Ox4QgoIU7KHseh09S+9rTA==} + + mdast-util-frontmatter@2.0.1: + resolution: {integrity: sha512-LRqI9+wdgC25P0URIJY9vwocIzCcksduHQ9OF2joxQoyTNVduwLAFUzjoopuRJbJAReaKrNQKAZKL3uCMugWJA==} + + mdast-util-gfm-autolink-literal@1.0.3: + resolution: {integrity: sha512-My8KJ57FYEy2W2LyNom4n3E7hKTuQk/0SES0u16tjA9Z3oFkF4RrC/hPAPgjlSpezsOvI8ObcXcElo92wn5IGA==} + + mdast-util-gfm-footnote@1.0.2: + resolution: {integrity: sha512-56D19KOGbE00uKVj3sgIykpwKL179QsVFwx/DCW0u/0+URsryacI4MAdNJl0dh+u2PSsD9FtxPFbHCzJ78qJFQ==} + + mdast-util-gfm-strikethrough@1.0.3: + resolution: {integrity: sha512-DAPhYzTYrRcXdMjUtUjKvW9z/FNAMTdU0ORyMcbmkwYNbKocDpdk+PX1L1dQgOID/+vVs1uBQ7ElrBQfZ0cuiQ==} + + mdast-util-gfm-table@1.0.7: + resolution: {integrity: sha512-jjcpmNnQvrmN5Vx7y7lEc2iIOEytYv7rTvu+MeyAsSHTASGCCRA79Igg2uKssgOs1i1po8s3plW0sTu1wkkLGg==} + + mdast-util-gfm-task-list-item@1.0.2: + resolution: {integrity: sha512-PFTA1gzfp1B1UaiJVyhJZA1rm0+Tzn690frc/L8vNX1Jop4STZgOE6bxUhnzdVSB+vm2GU1tIsuQcA9bxTQpMQ==} + + mdast-util-gfm@2.0.2: + resolution: {integrity: sha512-qvZ608nBppZ4icQlhQQIAdc6S3Ffj9RGmzwUKUWuEICFnd1LVkN3EktF7ZHAgfcEdvZB5owU9tQgt99e2TlLjg==} + + mdast-util-heading-style@2.0.1: + resolution: {integrity: sha512-0L5rthU4xKDVbw+UQ7D8Y8xOEsX4JXZvemWoEAsL+WAaeSH+TvVVwFnTb3G/OrjyP4VYQULoNWU+PdZfkmNu4A==} + + mdast-util-math@2.0.2: + resolution: {integrity: sha512-8gmkKVp9v6+Tgjtq6SYx9kGPpTf6FVYRa53/DLh479aldR9AyP48qeVOgNZ5X7QUK7nOy4yw7vg6mbiGcs9jWQ==} + + mdast-util-mdx-expression@1.3.2: + resolution: {integrity: sha512-xIPmR5ReJDu/DHH1OoIT1HkuybIfRGYRywC+gJtI7qHjCJp/M9jrmBEJW22O8lskDWm562BX2W8TiAwRTb0rKA==} + + mdast-util-mdx-jsx@2.1.4: + resolution: {integrity: sha512-DtMn9CmVhVzZx3f+optVDF8yFgQVt7FghCRNdlIaS3X5Bnym3hZwPbg/XW86vdpKjlc1PVj26SpnLGeJBXD3JA==} + + mdast-util-mdx@2.0.1: + resolution: {integrity: sha512-38w5y+r8nyKlGvNjSEqWrhG0w5PmnRA+wnBvm+ulYCct7nsGYhFVb0lljS9bQav4psDAS1eGkP2LMVcZBi/aqw==} + + mdast-util-mdxjs-esm@1.3.1: + resolution: {integrity: sha512-SXqglS0HrEvSdUEfoXFtcg7DRl7S2cwOXc7jkuusG472Mmjag34DUDeOJUZtl+BVnyeO1frIgVpHlNRWc2gk/w==} + + mdast-util-phrasing@3.0.1: + resolution: {integrity: sha512-WmI1gTXUBJo4/ZmSk79Wcb2HcjPJBzM1nlI/OUWA8yk2X9ik3ffNbBGsU+09BFmXaL1IBb9fiuvq6/KMiNycSg==} + + mdast-util-phrasing@4.0.0: + resolution: {integrity: sha512-xadSsJayQIucJ9n053dfQwVu1kuXg7jCTdYsMK8rqzKZh52nLfSH/k0sAxE0u+pj/zKZX+o5wB+ML5mRayOxFA==} + + mdast-util-to-hast@12.3.0: + resolution: {integrity: sha512-pits93r8PhnIoU4Vy9bjW39M2jJ6/tdHyja9rrot9uujkN7UTU9SDnE6WNJz/IGyQk3XHX6yNNtrBH6cQzm8Hw==} + + mdast-util-to-hast@13.0.2: + resolution: {integrity: sha512-U5I+500EOOw9e3ZrclN3Is3fRpw8c19SMyNZlZ2IS+7vLsNzb2Om11VpIVOR+/0137GhZsFEF6YiKD5+0Hr2Og==} + + mdast-util-to-markdown@1.5.0: + resolution: {integrity: sha512-bbv7TPv/WC49thZPg3jXuqzuvI45IL2EVAr/KxF0BSdHsU0ceFHOmwQn6evxAh1GaoK/6GQ1wp4R4oW2+LFL/A==} + + mdast-util-to-markdown@2.1.0: + resolution: {integrity: sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ==} + + mdast-util-to-string@2.0.0: + resolution: {integrity: sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==} + + mdast-util-to-string@3.2.0: + resolution: {integrity: sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg==} + + mdast-util-to-string@4.0.0: + resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} + + merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + merkletreejs@0.3.11: + resolution: {integrity: sha512-LJKTl4iVNTndhL+3Uz/tfkjD0klIWsHlUzgtuNnNrsf7bAlXR30m+xYB7lHr5Z/l6e/yAIsr26Dabx6Buo4VGQ==} + engines: {node: '>= 7.6.0'} + + mermaid@10.6.1: + resolution: {integrity: sha512-Hky0/RpOw/1il9X8AvzOEChfJtVvmXm+y7JML5C//ePYMy0/9jCEmW1E1g86x9oDfW9+iVEdTV/i+M6KWRNs4A==} + + micro-ftch@0.3.1: + resolution: {integrity: sha512-/0LLxhzP0tfiR5hcQebtudP56gUurs2CLkGarnCiB/OqEyUFQ6U3paQi/tgLv0hBJYt2rnr9MNpxz4fiiugstg==} + + micromark-core-commonmark@1.1.0: + resolution: {integrity: sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw==} + + micromark-core-commonmark@2.0.0: + resolution: {integrity: sha512-jThOz/pVmAYUtkroV3D5c1osFXAMv9e0ypGDOIZuCeAe91/sD6BoE2Sjzt30yuXtwOYUmySOhMas/PVyh02itA==} + + micromark-extension-frontmatter@2.0.0: + resolution: {integrity: sha512-C4AkuM3dA58cgZha7zVnuVxBhDsbttIMiytjgsM2XbHAB2faRVaHRle40558FBN+DJcrLNCoqG5mlrpdU4cRtg==} + + micromark-extension-gfm-autolink-literal@1.0.5: + resolution: {integrity: sha512-z3wJSLrDf8kRDOh2qBtoTRD53vJ+CWIyo7uyZuxf/JAbNJjiHsOpG1y5wxk8drtv3ETAHutCu6N3thkOOgueWg==} + + micromark-extension-gfm-footnote@1.1.2: + resolution: {integrity: sha512-Yxn7z7SxgyGWRNa4wzf8AhYYWNrwl5q1Z8ii+CSTTIqVkmGZF1CElX2JI8g5yGoM3GAman9/PVCUFUSJ0kB/8Q==} + + micromark-extension-gfm-strikethrough@1.0.7: + resolution: {integrity: sha512-sX0FawVE1o3abGk3vRjOH50L5TTLr3b5XMqnP9YDRb34M0v5OoZhG+OHFz1OffZ9dlwgpTBKaT4XW/AsUVnSDw==} + + micromark-extension-gfm-table@1.0.7: + resolution: {integrity: sha512-3ZORTHtcSnMQEKtAOsBQ9/oHp9096pI/UvdPtN7ehKvrmZZ2+bbWhi0ln+I9drmwXMt5boocn6OlwQzNXeVeqw==} + + micromark-extension-gfm-tagfilter@1.0.2: + resolution: {integrity: sha512-5XWB9GbAUSHTn8VPU8/1DBXMuKYT5uOgEjJb8gN3mW0PNW5OPHpSdojoqf+iq1xo7vWzw/P8bAHY0n6ijpXF7g==} + + micromark-extension-gfm-task-list-item@1.0.5: + resolution: {integrity: sha512-RMFXl2uQ0pNQy6Lun2YBYT9g9INXtWJULgbt01D/x8/6yJ2qpKyzdZD3pi6UIkzF++Da49xAelVKUeUMqd5eIQ==} + + micromark-extension-gfm@2.0.3: + resolution: {integrity: sha512-vb9OoHqrhCmbRidQv/2+Bc6pkP0FrtlhurxZofvOEy5o8RtuuvTq+RQ1Vw5ZDNrVraQZu3HixESqbG+0iKk/MQ==} + + micromark-extension-math@2.1.2: + resolution: {integrity: sha512-es0CcOV89VNS9wFmyn+wyFTKweXGW4CEvdaAca6SWRWPyYCbBisnjaHLjWO4Nszuiud84jCpkHsqAJoa768Pvg==} + + micromark-extension-mdx-expression@1.0.8: + resolution: {integrity: sha512-zZpeQtc5wfWKdzDsHRBY003H2Smg+PUi2REhqgIhdzAa5xonhP03FcXxqFSerFiNUr5AWmHpaNPQTBVOS4lrXw==} + + micromark-extension-mdx-jsx@1.0.5: + resolution: {integrity: sha512-gPH+9ZdmDflbu19Xkb8+gheqEDqkSpdCEubQyxuz/Hn8DOXiXvrXeikOoBA71+e8Pfi0/UYmU3wW3H58kr7akA==} + + micromark-extension-mdx-md@1.0.1: + resolution: {integrity: sha512-7MSuj2S7xjOQXAjjkbjBsHkMtb+mDGVW6uI2dBL9snOBCbZmoNgDAeZ0nSn9j3T42UE/g2xVNMn18PJxZvkBEA==} + + micromark-extension-mdxjs-esm@1.0.5: + resolution: {integrity: sha512-xNRBw4aoURcyz/S69B19WnZAkWJMxHMT5hE36GtDAyhoyn/8TuAeqjFJQlwk+MKQsUD7b3l7kFX+vlfVWgcX1w==} + + micromark-extension-mdxjs@1.0.1: + resolution: {integrity: sha512-7YA7hF6i5eKOfFUzZ+0z6avRG52GpWR8DL+kN47y3f2KhxbBZMhmxe7auOeaTBrW2DenbbZTf1ea9tA2hDpC2Q==} + + micromark-factory-destination@1.1.0: + resolution: {integrity: sha512-XaNDROBgx9SgSChd69pjiGKbV+nfHGDPVYFs5dOoDd7ZnMAE+Cuu91BCpsY8RT2NP9vo/B8pds2VQNCLiu0zhg==} + + micromark-factory-destination@2.0.0: + resolution: {integrity: sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==} + + micromark-factory-label@1.1.0: + resolution: {integrity: sha512-OLtyez4vZo/1NjxGhcpDSbHQ+m0IIGnT8BoPamh+7jVlzLJBH98zzuCoUeMxvM6WsNeh8wx8cKvqLiPHEACn0w==} + + micromark-factory-label@2.0.0: + resolution: {integrity: sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==} + + micromark-factory-mdx-expression@1.0.9: + resolution: {integrity: sha512-jGIWzSmNfdnkJq05c7b0+Wv0Kfz3NJ3N4cBjnbO4zjXIlxJr+f8lk+5ZmwFvqdAbUy2q6B5rCY//g0QAAaXDWA==} + + micromark-factory-space@1.1.0: + resolution: {integrity: sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==} + + micromark-factory-space@2.0.0: + resolution: {integrity: sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==} + + micromark-factory-title@1.1.0: + resolution: {integrity: sha512-J7n9R3vMmgjDOCY8NPw55jiyaQnH5kBdV2/UXCtZIpnHH3P6nHUKaH7XXEYuWwx/xUJcawa8plLBEjMPU24HzQ==} + + micromark-factory-title@2.0.0: + resolution: {integrity: sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A==} + + micromark-factory-whitespace@1.1.0: + resolution: {integrity: sha512-v2WlmiymVSp5oMg+1Q0N1Lxmt6pMhIHD457whWM7/GUlEks1hI9xj5w3zbc4uuMKXGisksZk8DzP2UyGbGqNsQ==} + + micromark-factory-whitespace@2.0.0: + resolution: {integrity: sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==} + + micromark-util-character@1.2.0: + resolution: {integrity: sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==} + + micromark-util-character@2.0.1: + resolution: {integrity: sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==} + + micromark-util-chunked@1.1.0: + resolution: {integrity: sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ==} + + micromark-util-chunked@2.0.0: + resolution: {integrity: sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==} + + micromark-util-classify-character@1.1.0: + resolution: {integrity: sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw==} + + micromark-util-classify-character@2.0.0: + resolution: {integrity: sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==} + + micromark-util-combine-extensions@1.1.0: + resolution: {integrity: sha512-Q20sp4mfNf9yEqDL50WwuWZHUrCO4fEyeDCnMGmG5Pr0Cz15Uo7KBs6jq+dq0EgX4DPwwrh9m0X+zPV1ypFvUA==} + + micromark-util-combine-extensions@2.0.0: + resolution: {integrity: sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ==} + + micromark-util-decode-numeric-character-reference@1.1.0: + resolution: {integrity: sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw==} + + micromark-util-decode-numeric-character-reference@2.0.1: + resolution: {integrity: sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ==} + + micromark-util-decode-string@1.1.0: + resolution: {integrity: sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ==} + + micromark-util-decode-string@2.0.0: + resolution: {integrity: sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA==} + + micromark-util-encode@1.1.0: + resolution: {integrity: sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw==} + + micromark-util-encode@2.0.0: + resolution: {integrity: sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==} + + micromark-util-events-to-acorn@1.2.3: + resolution: {integrity: sha512-ij4X7Wuc4fED6UoLWkmo0xJQhsktfNh1J0m8g4PbIMPlx+ek/4YdW5mvbye8z/aZvAPUoxgXHrwVlXAPKMRp1w==} + + micromark-util-html-tag-name@1.2.0: + resolution: {integrity: sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q==} + + micromark-util-html-tag-name@2.0.0: + resolution: {integrity: sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==} + + micromark-util-normalize-identifier@1.1.0: + resolution: {integrity: sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q==} + + micromark-util-normalize-identifier@2.0.0: + resolution: {integrity: sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==} + + micromark-util-resolve-all@1.1.0: + resolution: {integrity: sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA==} + + micromark-util-resolve-all@2.0.0: + resolution: {integrity: sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==} + + micromark-util-sanitize-uri@1.2.0: + resolution: {integrity: sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A==} + + micromark-util-sanitize-uri@2.0.0: + resolution: {integrity: sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==} + + micromark-util-subtokenize@1.1.0: + resolution: {integrity: sha512-kUQHyzRoxvZO2PuLzMt2P/dwVsTiivCK8icYTeR+3WgbuPqfHgPPy7nFKbeqRivBvn/3N3GBiNC+JRTMSxEC7A==} + + micromark-util-subtokenize@2.0.0: + resolution: {integrity: sha512-vc93L1t+gpR3p8jxeVdaYlbV2jTYteDje19rNSS/H5dlhxUYll5Fy6vJ2cDwP8RnsXi818yGty1ayP55y3W6fg==} + + micromark-util-symbol@1.1.0: + resolution: {integrity: sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==} + + micromark-util-symbol@2.0.0: + resolution: {integrity: sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==} + + micromark-util-types@1.1.0: + resolution: {integrity: sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==} + + micromark-util-types@2.0.0: + resolution: {integrity: sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==} + + micromark@2.11.4: + resolution: {integrity: sha512-+WoovN/ppKolQOFIAajxi7Lu9kInbPxFuTBVEavFcL8eAfVstoc5MocPmqBeAdBOJV00uaVjegzH4+MA0DN/uA==} + + micromark@3.2.0: + resolution: {integrity: sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA==} + + micromark@4.0.0: + resolution: {integrity: sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==} + + micromatch@4.0.5: + resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + engines: {node: '>=8.6'} + + mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + + mimic-fn@4.0.0: + resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} + engines: {node: '>=12'} + + min-indent@1.0.1: + resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} + engines: {node: '>=4'} + + minimalistic-assert@1.0.1: + resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} + + minimalistic-crypto-utils@1.0.1: + resolution: {integrity: sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==} + + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + minimatch@5.1.6: + resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} + engines: {node: '>=10'} + + minimatch@9.0.3: + resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} + engines: {node: '>=16 || 14 >=14.17'} + + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + minipass@7.0.4: + resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==} + engines: {node: '>=16 || 14 >=14.17'} + + mri@1.2.0: + resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} + engines: {node: '>=4'} + + ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + + nanoid@3.3.7: + resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + + next-mdx-remote@4.4.1: + resolution: {integrity: sha512-1BvyXaIou6xy3XoNF4yaMZUCb6vD2GTAa5ciOa6WoO+gAUTYsb1K4rI/HSC2ogAWLrb/7VSV52skz07vOzmqIQ==} + engines: {node: '>=14', npm: '>=7'} + peerDependencies: + react: '>=16.x <=18.x' + react-dom: '>=16.x <=18.x' + + next-seo@6.4.0: + resolution: {integrity: sha512-XQFxkOL2hw0YE+P100HbI3EAvcludlHPxuzMgaIjKb7kPK0CvjGvLFjd9hszZFEDc5oiQkGFA8+cuWcnip7eYA==} + peerDependencies: + next: ^8.1.1-canary.54 || >=9.0.0 + react: '>=16.0.0' + react-dom: '>=16.0.0' + + next-sitemap@4.2.3: + resolution: {integrity: sha512-vjdCxeDuWDzldhCnyFCQipw5bfpl4HmZA7uoo3GAaYGjGgfL4Cxb1CiztPuWGmS+auYs7/8OekRS8C2cjdAsjQ==} + engines: {node: '>=14.18'} + hasBin: true + peerDependencies: + next: '*' + + next-themes@0.2.1: + resolution: {integrity: sha512-B+AKNfYNIzh0vqQQKqQItTS8evEouKD7H5Hj3kmuPERwddR2TxvDSFZuTj6T7Jfn1oyeUyJMydPl1Bkxkh0W7A==} + peerDependencies: + next: '*' + react: '*' + react-dom: '*' + + next@14.2.10: + resolution: {integrity: sha512-sDDExXnh33cY3RkS9JuFEKaS4HmlWmDKP1VJioucCG6z5KuA008DPsDZOzi8UfqEk3Ii+2NCQSJrfbEWtZZfww==} + engines: {node: '>=18.17.0'} + hasBin: true + peerDependencies: + '@opentelemetry/api': ^1.1.0 + '@playwright/test': ^1.41.2 + react: ^18.2.0 + react-dom: ^18.2.0 + sass: ^1.3.0 + peerDependenciesMeta: + '@opentelemetry/api': + optional: true + '@playwright/test': + optional: true + sass: + optional: true + + nextra-theme-docs@2.13.2: + resolution: {integrity: sha512-yE4umXaImp1/kf/sFciPj2+EFrNSwd9Db26hi98sIIiujzGf3+9eUgAz45vF9CwBw50FSXxm1QGRcY+slQ4xQQ==} + peerDependencies: + next: '>=9.5.3' + nextra: 2.13.2 + react: '>=16.13.1' + react-dom: '>=16.13.1' + + nextra@2.13.2: + resolution: {integrity: sha512-pIgOSXNUqTz1laxV4ChFZOU7lzJAoDHHaBPj8L09PuxrLKqU1BU/iZtXAG6bQeKCx8EPdBsoXxEuENnL9QGnGA==} + engines: {node: '>=16'} + peerDependencies: + next: '>=9.5.3' + react: '>=16.13.1' + react-dom: '>=16.13.1' + + no-case@3.0.4: + resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} + + node-fetch@2.7.0: + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + + non-layered-tidy-tree-layout@2.0.2: + resolution: {integrity: sha512-gkXMxRzUH+PB0ax9dUN0yYF0S25BqeAYqhgMaLUFmpXLEk7Fcu8f4emJuOAY0V8kjDICxROIKsTAKsV/v355xw==} + + nopt@7.2.0: + resolution: {integrity: sha512-CVDtwCdhYIvnAzFoJ6NJ6dX3oga9/HyciQDnG1vQDjSLMeKLJ4A93ZqYKDrgYSr1FBY5/hMYC+2VCi24pgpkGA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + hasBin: true + + npm-normalize-package-bin@3.0.1: + resolution: {integrity: sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + npm-run-path@2.0.2: + resolution: {integrity: sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==} + engines: {node: '>=4'} + + npm-run-path@4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + + npm-run-path@5.1.0: + resolution: {integrity: sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + npm-to-yarn@2.1.0: + resolution: {integrity: sha512-2C1IgJLdJngq1bSER7K7CGFszRr9s2rijEwvENPEgI0eK9xlD3tNwDc0UJnRj7FIT2aydWm72jB88uVswAhXHA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + number-to-bn@1.7.0: + resolution: {integrity: sha512-wsJ9gfSz1/s4ZsJN01lyonwuxA1tml6X1yBDnfpMglypcBRFZZkus26EdPSlqS5GJfYddVZa22p3VNb3z5m5Ig==} + engines: {node: '>=6.5.0', npm: '>=3'} + + object-inspect@1.13.1: + resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} + + object-is@1.1.5: + resolution: {integrity: sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==} + engines: {node: '>= 0.4'} + + object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + + object.assign@4.1.4: + resolution: {integrity: sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==} + engines: {node: '>= 0.4'} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + + onetime@6.0.0: + resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} + engines: {node: '>=12'} + + open@9.1.0: + resolution: {integrity: sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==} + engines: {node: '>=14.16'} + + optionator@0.9.3: + resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} + engines: {node: '>= 0.8.0'} + + p-finally@1.0.0: + resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==} + engines: {node: '>=4'} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-limit@4.0.0: + resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + + p-locate@6.0.0: + resolution: {integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + param-case@3.0.4: + resolution: {integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==} + + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + parent-module@2.0.0: + resolution: {integrity: sha512-uo0Z9JJeWzv8BG+tRcapBKNJ0dro9cLyczGzulS6EfeyAdeC9sbojtW6XwvYxJkEne9En+J2XEl4zyglVeIwFg==} + engines: {node: '>=8'} + + parse-entities@2.0.0: + resolution: {integrity: sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==} + + parse-entities@4.0.1: + resolution: {integrity: sha512-SWzvYcSJh4d/SGLIOQfZ/CoNv6BTlI6YEQ7Nj82oDVnRpwe/Z/F1EMx42x3JAOwGBlCjeCH0BRJQbQ/opHL17w==} + + parse-json@6.0.2: + resolution: {integrity: sha512-SA5aMiaIjXkAiBrW/yPgLgQAQg42f7K3ACO+2l/zOvtQBwX58DMUsFJXelW2fx3yMBmWOVkR6j1MGsdSbCA4UA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + parse-numeric-range@1.3.0: + resolution: {integrity: sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ==} + + parse-path@7.0.0: + resolution: {integrity: sha512-Euf9GG8WT9CdqwuWJGdf3RkUcTBArppHABkO7Lm8IzRQp0e2r/kkFnmhu4TSK30Wcu5rVAZLmfPKSBBi9tWFog==} + + parse-url@8.1.0: + resolution: {integrity: sha512-xDvOoLU5XRrcOZvnI6b8zA6n9O9ejNk/GExuz1yBuWUGn9KA97GI6HTs6u02wKara1CeVmZhH+0TZFdWScR89w==} + + parse5@7.1.2: + resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} + + pascal-case@3.1.2: + resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==} + + path-case@3.0.4: + resolution: {integrity: sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg==} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-exists@5.0.0: + resolution: {integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + path-key@2.0.1: + resolution: {integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==} + engines: {node: '>=4'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-key@4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} + + path-scurry@1.10.1: + resolution: {integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==} + engines: {node: '>=16 || 14 >=14.17'} + + path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + + pathval@1.1.1: + resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} + + periscopic@3.1.0: + resolution: {integrity: sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==} + + picocolors@1.0.0: + resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + pluralize@8.0.0: + resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} + engines: {node: '>=4'} + + postcss@8.4.31: + resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} + engines: {node: ^10 || ^12 || >=14} + + prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + + pretty-format@27.5.1: + resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + + proc-log@3.0.0: + resolution: {integrity: sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + property-information@6.4.0: + resolution: {integrity: sha512-9t5qARVofg2xQqKtytzt+lZ4d1Qvj8t5B8fEwXK6qOfgRLgH/b13QlgEyDh033NOS31nXeFbYv7CLUDG1CeifQ==} + + protocols@2.0.1: + resolution: {integrity: sha512-/XJ368cyBJ7fzLMwLKv1e4vLxOju2MNAIokcr7meSaNcVbWz/CPcW22cP04mwxOErdA5mwjA8Q6w/cdAQxVn7Q==} + + pseudomap@1.0.2: + resolution: {integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + randombytes@2.1.0: + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + + react-dom@18.2.0: + resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==} + peerDependencies: + react: ^18.2.0 + + react-is@17.0.2: + resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} + + react@18.2.0: + resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==} + engines: {node: '>=0.10.0'} + + read-package-json-fast@3.0.2: + resolution: {integrity: sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + + reading-time@1.5.0: + resolution: {integrity: sha512-onYyVhBNr4CmAxFsKS7bz+uTLRakypIe4R+5A824vBSkQy/hB3fZepoVEf8OVAxzLvK+H/jm9TzpI3ETSm64Kg==} + + regenerator-runtime@0.14.0: + resolution: {integrity: sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==} + + regexp.prototype.flags@1.5.1: + resolution: {integrity: sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==} + engines: {node: '>= 0.4'} + + rehype-katex@7.0.0: + resolution: {integrity: sha512-h8FPkGE00r2XKU+/acgqwWUlyzve1IiOKwsEkg4pDL3k48PiE0Pt+/uLtVHDVkN1yA4iurZN6UES8ivHVEQV6Q==} + + rehype-pretty-code@0.9.11: + resolution: {integrity: sha512-Eq90eCYXQJISktfRZ8PPtwc5SUyH6fJcxS8XOMnHPUQZBtC6RYo67gGlley9X2nR8vlniPj0/7oCDEYHKQa/oA==} + engines: {node: '>=16'} + peerDependencies: + shiki: '*' + + rehype-raw@7.0.0: + resolution: {integrity: sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==} + + remark-code-import@1.2.0: + resolution: {integrity: sha512-fgwLruqlZbVOIhCJFjY+JDwPZhA4/eK3InJzN8Ox8UDdtudpG212JwtRj6la+lAzJU7JmSEyewZSukVZdknt3Q==} + engines: {node: '>= 12'} + + remark-frontmatter@5.0.0: + resolution: {integrity: sha512-XTFYvNASMe5iPN0719nPrdItC9aU0ssC4v14mH1BCi1u0n1gAocqcujWUrByftZTbLhRtiKRyjYTSIOcr69UVQ==} + + remark-gfm@3.0.1: + resolution: {integrity: sha512-lEFDoi2PICJyNrACFOfDD3JlLkuSbOa5Wd8EPt06HUdptv8Gn0bxYTdbU/XXQ3swAPkEaGxxPN9cbnMHvVu1Ig==} + + remark-lint-blockquote-indentation@3.1.2: + resolution: {integrity: sha512-5DOrFsZd5dXqA4p/VZvWSrqIWNFbBXjX7IV/FkVkxlNhNF/0FMf/4v8x1I2W3mzaZ7yDsWS/egpZnmligq1ckQ==} + + remark-lint-checkbox-character-style@4.1.2: + resolution: {integrity: sha512-5ITz+1cCuJ3Jv/Q7rKgDEucCOnIgjWDnSHPJA1tb4TI/D316h+ALbDhZIpP8gyfAm6sBAh3Pwz9XZJN2uJB5UQ==} + + remark-lint-code-block-style@3.1.2: + resolution: {integrity: sha512-3wsWmzzdyEsB9sOzBOf46TSkwwVKXN2JpTEQb6feN0Tl6Vg75F7T9MHqMz7aqk/56bOXSxUzdpXDscGBhziLRA==} + + remark-lint-emphasis-marker@3.1.2: + resolution: {integrity: sha512-hPZ8vxZrIfxmLA5B66bA8y3PdHjcCQuaLsySIqi5PM2DkpN6a7zAP3v1znyRSaYJ1ANVWcu00/0bNzuUjflGCA==} + + remark-lint-fenced-code-marker@3.1.2: + resolution: {integrity: sha512-6XNqjOuhT+0c7Q/22aCsMz61ne9g8HRpYF79EXQPdbzYa+PcfPXMiQKStONY3PfC8OE2/3WXI2zcs8w9x+8+VQ==} + + remark-lint-final-newline@2.1.2: + resolution: {integrity: sha512-K0FdPGPyEB94PwNgopwVJFE8oRWi7IhY2ycXFVAMReI51el7EHB8F1gX14tB6p6zyGy6mUh69bCVU9mMTNeOUg==} + + remark-lint-frontmatter-schema@3.15.4: + resolution: {integrity: sha512-egChkbtCCG4hw1F2qoipzSxp6Ea9z4pxaVkWYa36DnCZ9fn3GhCNyOUjbFSIvdhVcWN+AqvHdqPbXC9Pp81Hmg==} + + remark-lint-hard-break-spaces@3.1.2: + resolution: {integrity: sha512-HaW0xsl3TI7VFAqGWWcZtPqyz0NWu19KKjSO7OGFTUJU4S9YiRnhIxmSFM0ZLSsVAynE+dhzVKa8U7dOpWDcOg==} + + remark-lint-heading-style@3.1.2: + resolution: {integrity: sha512-0RkcRPV/H2bPFgeInzBkK1cWUwtFTm83I+Db/Z5tDY02GzKOosHLvxtJyj/1391/opAH1LYbHtHWffir99IUgw==} + + remark-lint-link-title-style@3.1.2: + resolution: {integrity: sha512-if4MahYJVvQUWlrXDF8GSv4b9VtLSgMSDHeikQp1/hGYlihLl9uGw3nlL5Lf9DqTN0qaT6RPbXOjuuzHlk38sg==} + + remark-lint-list-item-bullet-indent@4.1.2: + resolution: {integrity: sha512-WgU5nooqIEm6f35opcbHKBzWrdFJA3XcyTfB3nv/v0KX43/h6qFGmmMJ5kEiaFExuQp3dZSdatWuY0YZ9YRbUg==} + + remark-lint-list-item-content-indent@3.1.2: + resolution: {integrity: sha512-TB0pmrWiRaQW80Y/PILFQTnHDghRxXNzMwyawlP+DBF9gNom3pEBmb4ZlGQlN0aa3r8VWeIKdv1ylHrfXE0vqA==} + + remark-lint-list-item-indent@3.1.2: + resolution: {integrity: sha512-tkrra1pxZVE4OVJGfN435u/v0ljruXU+dHzWiKDYeifquD4aWhJxvSApu7+FbE098D/4usVXgMxwFkNhrpZcSQ==} + + remark-lint-no-blockquote-without-marker@5.1.2: + resolution: {integrity: sha512-QPbqsrt7EfpSWqTkZJ9tepabPIhBDlNqZkuxxMQYD0OQ2N+tHDUq3zE1JxI5ts1V9o/mWApgySocqGd3jlcKmQ==} + + remark-lint-no-duplicate-definitions@3.1.2: + resolution: {integrity: sha512-vi0nXA7p+pjQOorZOkr9E+QDhG74JAdbzqglWPrWWNI3z2rUYWYHTNSyWJbwEXaIIcev1ZAw8SCAOis5MNm+pA==} + + remark-lint-no-heading-content-indent@4.1.2: + resolution: {integrity: sha512-TTxFsm1f4ZHFxZQCuz7j0QK4RvP6oArTiwazKLr16yaZe1608ypogMek4A30j2xX8WuO9+2uBzLXCY5OBo5x5Q==} + + remark-lint-no-inline-padding@4.1.2: + resolution: {integrity: sha512-dGyhWsiqCZS3Slob0EVBUfsFBbdpMIBCvb56LlCgaHbnLsnNYx8PpF/wA5CgsN8BXIbXfRpyPB5cIJwIq5taYg==} + + remark-lint-no-literal-urls@3.1.2: + resolution: {integrity: sha512-4tV9JGLKxAMFSuWDMOqLozkFJ3HyRvhzgrPrxASoziaml23m7UXAozk5dkIrFny1cN2oG988Z8tORxX2FL1Ilw==} + + remark-lint-no-shortcut-reference-image@3.1.2: + resolution: {integrity: sha512-NX4XJFPyDeJJ77pmETxRj4oM/zayf7Lmn/O87HgExBkQIPz2NYbDeKD8QEyliLaV/oKA2rQufpzuFw55xa1Tww==} + + remark-lint-no-shortcut-reference-link@3.1.2: + resolution: {integrity: sha512-/9iPN7FLKaaIzw4tLWKu7Rx0wAP7E2EuzIeentQlkY0rO/mMHipmT3IlgiebsAInKagzTY6TNFoG1rq2VnaCcA==} + + remark-lint-no-undefined-references@4.2.1: + resolution: {integrity: sha512-HdNg5b2KiuNplcuVvRtsrUiROw557kAG1CiZYB7jQrrVWFgd86lKTa3bDiywe+87dGrGmHd3qQ28eZYTuHz2Nw==} + + remark-lint-no-unused-definitions@3.1.2: + resolution: {integrity: sha512-bOcaJAnjKxT3kASFquUA3fO9xem9wZhVqt8TbqjA84+G4n40qjaLXDs/4vq73aMsSde73K0f3j1u0pMe7et8yQ==} + + remark-lint-ordered-list-marker-style@3.1.2: + resolution: {integrity: sha512-62iVE/YQsA0Azaqt8yAJWPplWLS47kDLjXeC2PlRIAzCqbNt9qH3HId8vZ15QTSrp8rHmJwrCMdcqV6AZUi7gQ==} + + remark-lint-rule-style@3.1.2: + resolution: {integrity: sha512-0CsX2XcX9pIhAP5N7Y8mhYXp3/Ld+NvxXY1p0LHAq0NZu17UsZLuegvx/s25uFbQs08DcmSqyKnepU9qGGqmTQ==} + + remark-lint-strong-marker@3.1.2: + resolution: {integrity: sha512-U/g4wngmiI0Q6WBRQG6pZxnDS33Wt/0QYA3+KNFBDykoi1vXsDEorIqy3dEag9z6XHwcMvFDsff6VRUhaOJWQg==} + + remark-lint-table-cell-padding@4.1.3: + resolution: {integrity: sha512-N9xtnS6MG/H3srAMjqqaF26A7socr87pIgt64dr5rxoSbDRWRPChGQ8y7wKyV8VeyRNF37e3E5KB3bQVqjSYaQ==} + + remark-lint-table-pipe-alignment@3.1.3: + resolution: {integrity: sha512-bnE8WrB4kSrN+Yr+xN2GHWVgGukeSFU43qPMrpCzTyOSbzep366wORlFKqZmyFPEkIZ/uAUFS0Qm9DND66Yz/A==} + + remark-lint-table-pipes@4.1.2: + resolution: {integrity: sha512-Ex2cJDXA0hdD9CC5Nu0p3K5LP+AhzPvk4sIOSbevCTSRyCS/SkNk4CQ6pwWBxuPVuHQUkqXkT8lgu8wwr/9A3A==} + + remark-lint-unordered-list-marker-style@3.1.2: + resolution: {integrity: sha512-JFiyB4ZprJGGndCaFB8FssXd48m4Kh+CUqzNgu3lBLEiW8dEAGRlD9M2AzyyA+Q29WJP/FntDCbP22DeON91UA==} + + remark-lint@9.1.2: + resolution: {integrity: sha512-m9e/aPlh7tsvfJfj8tPxrQzD6oEdb9Foko+Ya/6OwUP9EoGMfehv1Qtv26W1DoH58Wn8rT8CD+KuprTWscMmIA==} + + remark-math@5.1.1: + resolution: {integrity: sha512-cE5T2R/xLVtfFI4cCePtiRn+e6jKMtFDR3P8V3qpv8wpKjwvHoBA4eJzvX+nVrnlNy0911bdGmuspCSwetfYHw==} + + remark-mdx@2.3.0: + resolution: {integrity: sha512-g53hMkpM0I98MU266IzDFMrTD980gNF3BJnkyFcmN+dD873mQeD5rdMO3Y2X+x8umQfbSE0PcoEDl7ledSA+2g==} + + remark-message-control@7.1.1: + resolution: {integrity: sha512-xKRWl1NTBOKed0oEtCd8BUfH5m4s8WXxFFSoo7uUwx6GW/qdCy4zov5LfPyw7emantDmhfWn5PdIZgcbVcWMDQ==} + + remark-parse@10.0.2: + resolution: {integrity: sha512-3ydxgHa/ZQzG8LvC7jTXccARYDcRld3VfcgIIFs7bI6vbRSxJJmzgLEIIoYKyrfhaY+ujuWaf/PJiMZXoiCXgw==} + + remark-parse@11.0.0: + resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==} + + remark-preset-lint-consistent@5.1.2: + resolution: {integrity: sha512-RQrWBFmyIkKfXtp9P1Fui7UbGSfXth9nuvRJUVnO0vfevBJe02iyMZWPokXSwkDOI/cM539wj0i3vrQupz+v5A==} + + remark-preset-lint-recommended@6.1.3: + resolution: {integrity: sha512-DGjbeP2TsFmQeJflUiIvJWAOs1PxJt7SG3WQyMxOppkRr/up+mxWVkuv+6AUuaR0EsuaaFGz7WmZM5TrSSFWJw==} + + remark-reading-time@2.0.1: + resolution: {integrity: sha512-fy4BKy9SRhtYbEHvp6AItbRTnrhiDGbqLQTSYVbQPGuRCncU1ubSsh9p/W5QZSxtYcUXv8KGL0xBgPLyNJA1xw==} + + remark-rehype@10.1.0: + resolution: {integrity: sha512-EFmR5zppdBp0WQeDVZ/b66CWJipB2q2VLNFMabzDSGR66Z2fQii83G5gTBbgGEnEEA0QRussvrFHxk1HWGJskw==} + + remark-stringify@10.0.3: + resolution: {integrity: sha512-koyOzCMYoUHudypbj4XpnAKFbkddRMYZHwghnxd7ue5210WzGw6kOBwauJTRUMq16jsovXx8dYNvSSWP89kZ3A==} + + remark-stringify@11.0.0: + resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==} + + remark@15.0.1: + resolution: {integrity: sha512-Eht5w30ruCXgFmxVUSlNWQ9iiimq07URKeFS3hNc8cUWy1llX4KDWfyEDZRycMc+znsN9Ux5/tJ/BFdgdOwA3A==} + + remove-accents@0.4.2: + resolution: {integrity: sha512-7pXIJqJOq5tFgG1A2Zxti3Ht8jJF337m4sowbuHsW30ZnkQFnDzy9qBNhgzX8ZLW4+UBcXiiR7SwR6pokHsxiA==} + + repeat-string@1.6.1: + resolution: {integrity: sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==} + engines: {node: '>=0.10'} + + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + + reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + hasBin: true + + rlp@2.2.7: + resolution: {integrity: sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ==} + hasBin: true + + robust-predicates@3.0.2: + resolution: {integrity: sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==} + + run-applescript@5.0.0: + resolution: {integrity: sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==} + engines: {node: '>=12'} + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + rw@1.3.3: + resolution: {integrity: sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==} + + sade@1.8.1: + resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} + engines: {node: '>=6'} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + scheduler@0.23.0: + resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==} + + scroll-into-view-if-needed@3.1.0: + resolution: {integrity: sha512-49oNpRjWRvnU8NyGVmUaYG4jtTkNonFZI86MmGRDqBphEK2EXT9gdEUoQPZhuBM8yWHxCWbobltqYO5M4XrUvQ==} + + scrypt-js@3.0.1: + resolution: {integrity: sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==} + + search-insights@2.15.0: + resolution: {integrity: sha512-ch2sPCUDD4sbPQdknVl9ALSi9H7VyoeVbsxznYz6QV55jJ8CI3EtwpO1i84keN4+hF5IeHWIeGvc08530JkVXQ==} + + section-matter@1.0.0: + resolution: {integrity: sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==} + engines: {node: '>=4'} + + semver@7.5.4: + resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} + engines: {node: '>=10'} + hasBin: true + + sentence-case@3.0.4: + resolution: {integrity: sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg==} + + set-function-length@1.1.1: + resolution: {integrity: sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==} + engines: {node: '>= 0.4'} + + set-function-name@2.0.1: + resolution: {integrity: sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==} + engines: {node: '>= 0.4'} + + shebang-command@1.2.0: + resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} + engines: {node: '>=0.10.0'} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@1.0.0: + resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==} + engines: {node: '>=0.10.0'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + shiki@0.14.5: + resolution: {integrity: sha512-1gCAYOcmCFONmErGTrS1fjzJLA7MGZmKzrBNX7apqSwhyITJg2O102uFzXUeBxNnEkDA9vHIKLyeKq0V083vIw==} + + side-channel@1.0.4: + resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} + + signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + + snake-case@3.0.4: + resolution: {integrity: sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==} + + sort-keys@5.0.0: + resolution: {integrity: sha512-Pdz01AvCAottHTPQGzndktFNdbRA75BgOfeT1hH+AMnJFv8lynkPi42rfeEhpx1saTEI3YNMWxfqu0sFD1G8pw==} + engines: {node: '>=12'} + + source-map-js@1.0.2: + resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} + engines: {node: '>=0.10.0'} + + source-map@0.7.4: + resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} + engines: {node: '>= 8'} + + space-separated-tokens@2.0.2: + resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} + + sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + + stop-iteration-iterator@1.0.0: + resolution: {integrity: sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==} + engines: {node: '>= 0.4'} + + streamsearch@1.1.0: + resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} + engines: {node: '>=10.0.0'} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + + stringify-entities@4.0.3: + resolution: {integrity: sha512-BP9nNHMhhfcMbiuQKCqMjhDP5yBCAxsPu4pHFFzJ6Alo9dZgY4VLDPutXqIjpRiMoKdp7Av85Gr73Q5uH9k7+g==} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + + strip-bom-string@1.0.0: + resolution: {integrity: sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==} + engines: {node: '>=0.10.0'} + + strip-eof@1.0.0: + resolution: {integrity: sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==} + engines: {node: '>=0.10.0'} + + strip-final-newline@2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + + strip-final-newline@3.0.0: + resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} + engines: {node: '>=12'} + + strip-hex-prefix@1.0.0: + resolution: {integrity: sha512-q8d4ue7JGEiVcypji1bALTos+0pWtyGlivAWyPuTkHzuTCJqrK9sWxYQZUq6Nq3cuyv3bm734IhHvHtGGURU6A==} + engines: {node: '>=6.5.0', npm: '>=3'} + + strip-indent@4.0.0: + resolution: {integrity: sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA==} + engines: {node: '>=12'} + + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + style-to-object@0.4.4: + resolution: {integrity: sha512-HYNoHZa2GorYNyqiCaBgsxvcJIn7OHq6inEga+E6Ke3m5JkoqpQbnFssk4jwe+K7AhGa2fcha4wSOf1Kn01dMg==} + + styled-jsx@5.1.1: + resolution: {integrity: sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==} + engines: {node: '>= 12.0.0'} + peerDependencies: + '@babel/core': '*' + babel-plugin-macros: '*' + react: '>= 16.8.0 || 17.x.x || ^18.0.0-0' + peerDependenciesMeta: + '@babel/core': + optional: true + babel-plugin-macros: + optional: true + + stylis@4.3.0: + resolution: {integrity: sha512-E87pIogpwUsUwXw7dNyU4QDjdgVMy52m+XEOPEKUn161cCzWjjhPSQhByfd1CcNvrOLnXQ6OnnZDwnJrz/Z4YQ==} + + supports-color@4.5.0: + resolution: {integrity: sha512-ycQR/UbvI9xIlEdQT1TQqwoXtEldExbCEAJgRo5YXlmSKjv6ThHnP9/vwGa1gr19Gfw+LkFd7KqYMhzrRC5JYw==} + engines: {node: '>=4'} + + supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + supports-color@9.4.0: + resolution: {integrity: sha512-VL+lNrEoIXww1coLPOmiEmK/0sGigko5COxI09KzHc2VJXJsQ37UaQ+8quuxjDeA7+KnLGTWRyOXSLLR2Wb4jw==} + engines: {node: '>=12'} + + synckit@0.8.5: + resolution: {integrity: sha512-L1dapNV6vu2s/4Sputv8xGsCdAVlb5nRDMFU/E27D44l5U6cw1g0dGd45uLc+OXjNMmF4ntiMdCimzcjFKQI8Q==} + engines: {node: ^14.18.0 || >=16.0.0} + + tabbable@6.2.0: + resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==} + + text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + + tinyurl@1.1.7: + resolution: {integrity: sha512-NCnyDkBTByS/pLH/Vrx/DPL8EciAUDoAvruaM/WnQLfX6Uame3D1nuWNy2Z9CXw7rcsok0tjuonRLolhmyz5rg==} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. + + title@3.5.3: + resolution: {integrity: sha512-20JyowYglSEeCvZv3EZ0nZ046vLarO37prvV0mbtQV7C8DJPGgN967r8SJkqd3XK3K3lD3/Iyfp3avjfil8Q2Q==} + hasBin: true + + titleize@1.0.0: + resolution: {integrity: sha512-TARUb7z1pGvlLxgPk++7wJ6aycXF3GJ0sNSBTAsTuJrQG5QuZlkUQP+zl+nbjAh4gMX9yDw9ZYklMd7vAfJKEw==} + engines: {node: '>=0.10.0'} + + titleize@3.0.0: + resolution: {integrity: sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==} + engines: {node: '>=12'} + + to-gatsby-remark-plugin@0.1.0: + resolution: {integrity: sha512-blmhJ/gIrytWnWLgPSRCkhCPeki6UBK2daa3k9mGahN7GjwHu8KrS7F70MvwlsG7IE794JLgwAdCbi4hU4faFQ==} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + to-vfile@6.1.0: + resolution: {integrity: sha512-BxX8EkCxOAZe+D/ToHdDsJcVI4HqQfmw0tCkp31zf3dNP/XWIAjU4CmeuSwsSoOzOTqHPOL0KUzyZqJplkD0Qw==} + + to-vfile@7.2.4: + resolution: {integrity: sha512-2eQ+rJ2qGbyw3senPI0qjuM7aut8IYXK6AEoOWb+fJx/mQYzviTckm1wDjq91QYHAPBTYzmdJXxMFA6Mk14mdw==} + + tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + + treeify@1.1.0: + resolution: {integrity: sha512-1m4RA7xVAJrSGrrXGs0L3YTwyvBs2S8PbRHaLZAkFw7JR8oIFwYtysxlBZhYIa7xSyiYJKZ3iGrrk55cGA3i9A==} + engines: {node: '>=0.6'} + + trim-lines@3.0.1: + resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} + + trough@2.1.0: + resolution: {integrity: sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g==} + + ts-dedent@2.2.0: + resolution: {integrity: sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==} + engines: {node: '>=6.10'} + + tslib@2.6.2: + resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} + + type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + + type-detect@4.0.8: + resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} + engines: {node: '>=4'} + + type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + + type-fest@1.4.0: + resolution: {integrity: sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==} + engines: {node: '>=10'} + + typedarray-to-buffer@3.1.5: + resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} + + typedarray@0.0.6: + resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} + + typescript@5.3.2: + resolution: {integrity: sha512-6l+RyNy7oAHDfxC4FzSJcz9vnjTKxrLpDG5M2Vu4SHRVNg6xzqZp6LYSR9zjqQTu8DU/f5xwxUdADOkbrIX2gQ==} + engines: {node: '>=14.17'} + hasBin: true + + unified-engine@10.1.0: + resolution: {integrity: sha512-5+JDIs4hqKfHnJcVCxTid1yBoI/++FfF/1PFdSMpaftZZZY+qg2JFruRbf7PaIwa9KgLotXQV3gSjtY0IdcFGQ==} + + unified-lint-rule@2.1.2: + resolution: {integrity: sha512-JWudPtRN7TLFHVLEVZ+Rm8FUb6kCAtHxEXFgBGDxRSdNMnGyTU5zyYvduHSF/liExlFB3vdFvsAHnNVE/UjAwA==} + + unified-message-control@4.0.0: + resolution: {integrity: sha512-1b92N+VkPHftOsvXNOtkJm4wHlr+UDmTBF2dUzepn40oy9NxanJ9xS1RwUBTjXJwqr2K0kMbEyv1Krdsho7+Iw==} + + unified@10.1.2: + resolution: {integrity: sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==} + + unified@11.0.4: + resolution: {integrity: sha512-apMPnyLjAX+ty4OrNap7yumyVAMlKx5IWU2wlzzUdYJO9A8f1p9m/gywF/GM2ZDFcjQPrx59Mc90KwmxsoklxQ==} + + unique-string@3.0.0: + resolution: {integrity: sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==} + engines: {node: '>=12'} + + unist-util-find-after@5.0.0: + resolution: {integrity: sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==} + + unist-util-generated@2.0.1: + resolution: {integrity: sha512-qF72kLmPxAw0oN2fwpWIqbXAVyEqUzDHMsbtPvOudIlUzXYFIeQIuxXQCRCFh22B7cixvU0MG7m3MW8FTq/S+A==} + + unist-util-inspect@7.0.2: + resolution: {integrity: sha512-Op0XnmHUl6C2zo/yJCwhXQSm/SmW22eDZdWP2qdf4WpGrgO1ZxFodq+5zFyeRGasFjJotAnLgfuD1jkcKqiH1Q==} + + unist-util-is@5.2.1: + resolution: {integrity: sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==} + + unist-util-is@6.0.0: + resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} + + unist-util-position-from-estree@1.1.2: + resolution: {integrity: sha512-poZa0eXpS+/XpoQwGwl79UUdea4ol2ZuCYguVaJS4qzIOMDzbqz8a3erUCOmubSZkaOuGamb3tX790iwOIROww==} + + unist-util-position@4.0.4: + resolution: {integrity: sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg==} + + unist-util-position@5.0.0: + resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} + + unist-util-remove-position@4.0.2: + resolution: {integrity: sha512-TkBb0HABNmxzAcfLf4qsIbFbaPDvMO6wa3b3j4VcEzFVaw1LBKwnW4/sRJ/atSLSzoIg41JWEdnE7N6DIhGDGQ==} + + unist-util-remove-position@5.0.0: + resolution: {integrity: sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==} + + unist-util-remove@4.0.0: + resolution: {integrity: sha512-b4gokeGId57UVRX/eVKej5gXqGlc9+trkORhFJpu9raqZkZhU0zm8Doi05+HaiBsMEIJowL+2WtQ5ItjsngPXg==} + + unist-util-stringify-position@2.0.3: + resolution: {integrity: sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==} + + unist-util-stringify-position@3.0.3: + resolution: {integrity: sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==} + + unist-util-stringify-position@4.0.0: + resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} + + unist-util-visit-parents@4.1.1: + resolution: {integrity: sha512-1xAFJXAKpnnJl8G7K5KgU7FY55y3GcLIXqkzUj5QF/QVP7biUm0K0O2oqVkYsdjzJKifYeWn9+o6piAK2hGSHw==} + + unist-util-visit-parents@5.1.3: + resolution: {integrity: sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==} + + unist-util-visit-parents@6.0.1: + resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==} + + unist-util-visit@3.1.0: + resolution: {integrity: sha512-Szoh+R/Ll68QWAyQyZZpQzZQm2UPbxibDvaY8Xc9SUtYgPsDzx5AWSk++UUt2hJuow8mvwR+rG+LQLw+KsuAKA==} + + unist-util-visit@4.1.2: + resolution: {integrity: sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==} + + unist-util-visit@5.0.0: + resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} + + untildify@4.0.0: + resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==} + engines: {node: '>=8'} + + upper-case-first@2.0.2: + resolution: {integrity: sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==} + + upper-case@2.0.2: + resolution: {integrity: sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg==} + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + utf8@3.0.0: + resolution: {integrity: sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ==} + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + uuid@9.0.1: + resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} + hasBin: true + + uvu@0.5.6: + resolution: {integrity: sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA==} + engines: {node: '>=8'} + hasBin: true + + vfile-location@4.1.0: + resolution: {integrity: sha512-YF23YMyASIIJXpktBa4vIGLJ5Gs88UB/XePgqPmTa7cDA+JeO3yclbpheQYCHjVHBn/yePzrXuygIL+xbvRYHw==} + + vfile-location@5.0.2: + resolution: {integrity: sha512-NXPYyxyBSH7zB5U6+3uDdd6Nybz6o6/od9rk8bp9H8GR3L+cm/fC0uUTbqBmUTnMCUDslAGBOIKNfvvb+gGlDg==} + + vfile-matter@3.0.1: + resolution: {integrity: sha512-CAAIDwnh6ZdtrqAuxdElUqQRQDQgbbIrYtDYI8gCjXS1qQ+1XdLoK8FIZWxJwn0/I+BkSSZpar3SOgjemQz4fg==} + + vfile-message@2.0.4: + resolution: {integrity: sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==} + + vfile-message@3.1.4: + resolution: {integrity: sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==} -packages: + vfile-message@4.0.2: + resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==} - /@aashutoshrathi/word-wrap@1.2.6: - resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} - engines: {node: '>=0.10.0'} - dev: true + vfile-reporter@7.0.5: + resolution: {integrity: sha512-NdWWXkv6gcd7AZMvDomlQbK3MqFWL1RlGzMn++/O2TI+68+nqxCPTvLugdOtfSzXmjh+xUyhp07HhlrbJjT+mw==} - /@adraffy/ens-normalize@1.10.0: - resolution: {integrity: sha512-nA9XHtlAkYfJxY7bce8DcN7eKxWWCWkU+1GR9d+U6MbNpfwQp8TI7vqOsBsMcHoT4mBu2kypKoSKnghEzOOq5Q==} - dev: false + vfile-sort@3.0.1: + resolution: {integrity: sha512-1os1733XY6y0D5x0ugqSeaVJm9lYgj0j5qdcZQFyxlZOSy1jYarL77lLyb5gK4Wqr1d5OxmuyflSO3zKyFnTFw==} - /@algolia/cache-browser-local-storage@4.23.3: - resolution: {integrity: sha512-vRHXYCpPlTDE7i6UOy2xE03zHF2C8MEFjPN2v7fRbqVpcOvAUQK81x3Kc21xyb5aSIpYCjWCZbYZuz8Glyzyyg==} + vfile-statistics@2.0.1: + resolution: {integrity: sha512-W6dkECZmP32EG/l+dp2jCLdYzmnDBIw6jwiLZSER81oR5AHRcVqL+k3Z+pfH1R73le6ayDkJRMk0sutj1bMVeg==} + + vfile@4.2.1: + resolution: {integrity: sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==} + + vfile@5.3.7: + resolution: {integrity: sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==} + + vfile@6.0.1: + resolution: {integrity: sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw==} + + viem@1.19.6: + resolution: {integrity: sha512-WSBHBMurWIWQk2yisOD8hqSA5S56cZu6onty3hzauVjiHMildtVWujF7YT0xjoU40GpFODvJASRR2RFdzgvUUg==} + peerDependencies: + typescript: '>=5.0.4' + peerDependenciesMeta: + typescript: + optional: true + + viem@2.21.37: + resolution: {integrity: sha512-JupwyttT4aJNnP9+kD7E8jorMS5VmgpC3hm3rl5zXsO8WNBTsP3JJqZUSg4AG6s2lTrmmpzS/qpmXMZu5gJw5Q==} + peerDependencies: + typescript: '>=5.0.4' + peerDependenciesMeta: + typescript: + optional: true + + vscode-languageserver-textdocument@1.0.11: + resolution: {integrity: sha512-X+8T3GoiwTVlJbicx/sIAF+yuJAqz8VvwJyoMVhwEMoEKE/fkDmrqUgDMyBECcM2A2frVZIUj5HI/ErRXCfOeA==} + + vscode-oniguruma@1.7.0: + resolution: {integrity: sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==} + + vscode-textmate@8.0.0: + resolution: {integrity: sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg==} + + vscode-uri@3.0.8: + resolution: {integrity: sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==} + + walk-up-path@3.0.1: + resolution: {integrity: sha512-9YlCL/ynK3CTlrSRrDxZvUauLzAswPCrsaCgilqFevUYpeEW0/3ScEjaa3kbW/T0ghhkEr7mv+fpjqn1Y1YuTA==} + + web-namespaces@2.0.1: + resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} + + web-worker@1.2.0: + resolution: {integrity: sha512-PgF341avzqyx60neE9DD+XS26MMNMoUQRz9NOZwW32nPQrF6p77f1htcnjBSEV8BGMKZ16choqUG4hyI0Hx7mA==} + + web3-utils@1.10.3: + resolution: {integrity: sha512-OqcUrEE16fDBbGoQtZXWdavsPzbGIDc5v3VrRTZ0XrIpefC/viZ1ZU9bGEemazyS0catk/3rkOOxpzTfY+XsyQ==} + engines: {node: '>=8.0.0'} + + webauthn-p256@0.0.10: + resolution: {integrity: sha512-EeYD+gmIT80YkSIDb2iWq0lq2zbHo1CxHlQTeJ+KkCILWpVy3zASH3ByD4bopzfk0uCwXxLqKGLqp2W4O28VFA==} + + webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + + whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + + which-boxed-primitive@1.0.2: + resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} + + which-collection@1.0.1: + resolution: {integrity: sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==} + + which-typed-array@1.1.13: + resolution: {integrity: sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==} + engines: {node: '>= 0.4'} + + which@1.3.1: + resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} + hasBin: true + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + write-file-atomic@3.0.3: + resolution: {integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==} + + ws@7.4.6: + resolution: {integrity: sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==} + engines: {node: '>=8.3.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + ws@8.13.0: + resolution: {integrity: sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + ws@8.18.0: + resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + xdg-basedir@5.1.0: + resolution: {integrity: sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ==} + engines: {node: '>=12'} + + yallist@2.1.2: + resolution: {integrity: sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==} + + yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + + yaml@2.3.3: + resolution: {integrity: sha512-zw0VAJxgeZ6+++/su5AFoqBbZbrEakwu+X0M5HmcwUiBL7AzcuPKjj5we4xfQLp78LkEMpD0cOnUhmgOVy3KdQ==} + engines: {node: '>= 14'} + + yaml@2.3.4: + resolution: {integrity: sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==} + engines: {node: '>= 14'} + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + + yocto-queue@1.0.0: + resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} + engines: {node: '>=12.20'} + + zod@3.22.4: + resolution: {integrity: sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==} + + zwitch@2.0.4: + resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} + +snapshots: + + '@aashutoshrathi/word-wrap@1.2.6': {} + + '@adraffy/ens-normalize@1.10.0': {} + + '@adraffy/ens-normalize@1.11.0': {} + + '@algolia/cache-browser-local-storage@4.23.3': dependencies: '@algolia/cache-common': 4.23.3 - dev: false - /@algolia/cache-common@4.23.3: - resolution: {integrity: sha512-h9XcNI6lxYStaw32pHpB1TMm0RuxphF+Ik4o7tcQiodEdpKK+wKufY6QXtba7t3k8eseirEMVB83uFFF3Nu54A==} - dev: false + '@algolia/cache-common@4.23.3': {} - /@algolia/cache-in-memory@4.23.3: - resolution: {integrity: sha512-yvpbuUXg/+0rbcagxNT7un0eo3czx2Uf0y4eiR4z4SD7SiptwYTpbuS0IHxcLHG3lq22ukx1T6Kjtk/rT+mqNg==} + '@algolia/cache-in-memory@4.23.3': dependencies: '@algolia/cache-common': 4.23.3 - dev: false - /@algolia/client-account@4.23.3: - resolution: {integrity: sha512-hpa6S5d7iQmretHHF40QGq6hz0anWEHGlULcTIT9tbUssWUriN9AUXIFQ8Ei4w9azD0hc1rUok9/DeQQobhQMA==} + '@algolia/client-account@4.23.3': dependencies: '@algolia/client-common': 4.23.3 '@algolia/client-search': 4.23.3 '@algolia/transporter': 4.23.3 - dev: false - /@algolia/client-analytics@4.23.3: - resolution: {integrity: sha512-LBsEARGS9cj8VkTAVEZphjxTjMVCci+zIIiRhpFun9jGDUlS1XmhCW7CTrnaWeIuCQS/2iPyRqSy1nXPjcBLRA==} + '@algolia/client-analytics@4.23.3': dependencies: '@algolia/client-common': 4.23.3 '@algolia/client-search': 4.23.3 '@algolia/requester-common': 4.23.3 '@algolia/transporter': 4.23.3 - dev: false - /@algolia/client-common@4.23.3: - resolution: {integrity: sha512-l6EiPxdAlg8CYhroqS5ybfIczsGUIAC47slLPOMDeKSVXYG1n0qGiz4RjAHLw2aD0xzh2EXZ7aRguPfz7UKDKw==} + '@algolia/client-common@4.23.3': dependencies: '@algolia/requester-common': 4.23.3 '@algolia/transporter': 4.23.3 - dev: false - /@algolia/client-personalization@4.23.3: - resolution: {integrity: sha512-3E3yF3Ocr1tB/xOZiuC3doHQBQ2zu2MPTYZ0d4lpfWads2WTKG7ZzmGnsHmm63RflvDeLK/UVx7j2b3QuwKQ2g==} + '@algolia/client-personalization@4.23.3': dependencies: '@algolia/client-common': 4.23.3 '@algolia/requester-common': 4.23.3 '@algolia/transporter': 4.23.3 - dev: false - /@algolia/client-search@4.23.3: - resolution: {integrity: sha512-P4VAKFHqU0wx9O+q29Q8YVuaowaZ5EM77rxfmGnkHUJggh28useXQdopokgwMeYw2XUht49WX5RcTQ40rZIabw==} + '@algolia/client-search@4.23.3': dependencies: '@algolia/client-common': 4.23.3 '@algolia/requester-common': 4.23.3 '@algolia/transporter': 4.23.3 - dev: false - /@algolia/logger-common@4.23.3: - resolution: {integrity: sha512-y9kBtmJwiZ9ZZ+1Ek66P0M68mHQzKRxkW5kAAXYN/rdzgDN0d2COsViEFufxJ0pb45K4FRcfC7+33YB4BLrZ+g==} - dev: false + '@algolia/logger-common@4.23.3': {} - /@algolia/logger-console@4.23.3: - resolution: {integrity: sha512-8xoiseoWDKuCVnWP8jHthgaeobDLolh00KJAdMe9XPrWPuf1by732jSpgy2BlsLTaT9m32pHI8CRfrOqQzHv3A==} + '@algolia/logger-console@4.23.3': dependencies: '@algolia/logger-common': 4.23.3 - dev: false - /@algolia/recommend@4.23.3: - resolution: {integrity: sha512-9fK4nXZF0bFkdcLBRDexsnGzVmu4TSYZqxdpgBW2tEyfuSSY54D4qSRkLmNkrrz4YFvdh2GM1gA8vSsnZPR73w==} + '@algolia/recommend@4.23.3': dependencies: '@algolia/cache-browser-local-storage': 4.23.3 '@algolia/cache-common': 4.23.3 @@ -230,80 +3881,53 @@ packages: '@algolia/requester-common': 4.23.3 '@algolia/requester-node-http': 4.23.3 '@algolia/transporter': 4.23.3 - dev: false - /@algolia/requester-browser-xhr@4.23.3: - resolution: {integrity: sha512-jDWGIQ96BhXbmONAQsasIpTYWslyjkiGu0Quydjlowe+ciqySpiDUrJHERIRfELE5+wFc7hc1Q5hqjGoV7yghw==} + '@algolia/requester-browser-xhr@4.23.3': dependencies: '@algolia/requester-common': 4.23.3 - dev: false - /@algolia/requester-common@4.23.3: - resolution: {integrity: sha512-xloIdr/bedtYEGcXCiF2muajyvRhwop4cMZo+K2qzNht0CMzlRkm8YsDdj5IaBhshqfgmBb3rTg4sL4/PpvLYw==} - dev: false + '@algolia/requester-common@4.23.3': {} - /@algolia/requester-node-http@4.23.3: - resolution: {integrity: sha512-zgu++8Uj03IWDEJM3fuNl34s746JnZOWn1Uz5taV1dFyJhVM/kTNw9Ik7YJWiUNHJQXcaD8IXD1eCb0nq/aByA==} + '@algolia/requester-node-http@4.23.3': dependencies: '@algolia/requester-common': 4.23.3 - dev: false - /@algolia/transporter@4.23.3: - resolution: {integrity: sha512-Wjl5gttqnf/gQKJA+dafnD0Y6Yw97yvfY8R9h0dQltX1GXTgNs1zWgvtWW0tHl1EgMdhAyw189uWiZMnL3QebQ==} + '@algolia/transporter@4.23.3': dependencies: '@algolia/cache-common': 4.23.3 '@algolia/logger-common': 4.23.3 '@algolia/requester-common': 4.23.3 - dev: false - /@apidevtools/json-schema-ref-parser@11.1.0: - resolution: {integrity: sha512-g/VW9ZQEFJAOwAyUb8JFf7MLiLy2uEB4rU270rGzDwICxnxMlPy0O11KVePSgS36K1NI29gSlK84n5INGhd4Ag==} - engines: {node: '>= 16'} + '@apidevtools/json-schema-ref-parser@11.1.0': dependencies: '@jsdevtools/ono': 7.1.3 '@types/json-schema': 7.0.15 '@types/lodash.clonedeep': 4.5.9 js-yaml: 4.1.0 lodash.clonedeep: 4.5.0 - dev: true - /@babel/code-frame@7.23.4: - resolution: {integrity: sha512-r1IONyb6Ia+jYR2vvIDhdWdlTGhqbBoFqLTQidzZ4kepUFH15ejXvFHxCVbtl7BOXIudsIubf4E81xeA3h3IXA==} - engines: {node: '>=6.9.0'} + '@babel/code-frame@7.23.4': dependencies: '@babel/highlight': 7.23.4 chalk: 2.4.2 - /@babel/helper-validator-identifier@7.22.20: - resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} - engines: {node: '>=6.9.0'} + '@babel/helper-validator-identifier@7.22.20': {} - /@babel/highlight@7.23.4: - resolution: {integrity: sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==} - engines: {node: '>=6.9.0'} + '@babel/highlight@7.23.4': dependencies: '@babel/helper-validator-identifier': 7.22.20 chalk: 2.4.2 js-tokens: 4.0.0 - /@babel/runtime@7.23.2: - resolution: {integrity: sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg==} - engines: {node: '>=6.9.0'} + '@babel/runtime@7.23.2': dependencies: regenerator-runtime: 0.14.0 - dev: false - /@braintree/sanitize-url@6.0.4: - resolution: {integrity: sha512-s3jaWicZd0pkP0jf5ysyHUI/RE7MHos6qlToFcGWXVp+ykHOy77OUMrfbgJ9it2C5bow7OIQwYYaHjk9XlBQ2A==} - dev: false + '@braintree/sanitize-url@6.0.4': {} - /@corex/deepmerge@4.0.43: - resolution: {integrity: sha512-N8uEMrMPL0cu/bdboEWpQYb/0i2K5Qn8eCsxzOmxSggJbbQte7ljMRoXm917AbntqTGOzdTu+vP3KOOzoC70HQ==} - dev: false + '@corex/deepmerge@4.0.43': {} - /@cspell/cspell-bundled-dicts@8.1.3: - resolution: {integrity: sha512-TwLyL2bCtetXGhMudjOIgFPAsWF2UkT0E7T+DAZG8aUBfHoC/eco/sTmR6UJVpi6Crjs0YOQkFUBGrQ2pxJPcA==} - engines: {node: '>=18'} + '@cspell/cspell-bundled-dicts@8.1.3': dependencies: '@cspell/dict-ada': 4.0.2 '@cspell/dict-aws': 4.0.0 @@ -353,281 +3977,147 @@ packages: '@cspell/dict-swift': 2.0.1 '@cspell/dict-typescript': 3.1.2 '@cspell/dict-vue': 3.0.0 - dev: true - /@cspell/cspell-json-reporter@8.1.3: - resolution: {integrity: sha512-9iOU0Y733XuF0cqC7xwzJkOKFdJ65rYGnHFdUHzr5lxEqeG9X/jhlkzyHuGGOhPxkUeFP1x9XoLhXo1isMDbKA==} - engines: {node: '>=18'} + '@cspell/cspell-json-reporter@8.1.3': dependencies: '@cspell/cspell-types': 8.1.3 - dev: true - /@cspell/cspell-pipe@8.1.3: - resolution: {integrity: sha512-/dcnyLDeyFuoX4seZv7VsDQyRpt3ZY0vjZiDpqFul8hPydM8czLyRPPMD6Za+Gqg6dZmh9+VsQWK52hVsqc0QA==} - engines: {node: '>=18'} - dev: true + '@cspell/cspell-pipe@8.1.3': {} - /@cspell/cspell-resolver@8.1.3: - resolution: {integrity: sha512-bGyJYqkHRilqhyKGL/NvODN5U+UvCuQo7kxgt0i3Vd7m7k6XYLsSLYZ4w6r1S5IQ/ybU8I5lh6/6fNqKwvo9eg==} - engines: {node: '>=18'} + '@cspell/cspell-resolver@8.1.3': dependencies: global-directory: 4.0.1 - dev: true - /@cspell/cspell-service-bus@8.1.3: - resolution: {integrity: sha512-8E5ZveQKneNfK+cuFMy0y6tDsho71UPppEHNoLZsEFDbIxDdtQcAfs0pk4nwEzxPBt+dBB+Yl8KExQ6x2FAYQw==} - engines: {node: '>=18'} - dev: true + '@cspell/cspell-service-bus@8.1.3': {} - /@cspell/cspell-types@8.1.3: - resolution: {integrity: sha512-j14FENj+DzWu6JjzTl+0X5/OJv9AEckpEp6Jaw9YglxirrBBzTkZGfoLePe/AWo/MlIYp0asl92C1UHEjgz+FQ==} - engines: {node: '>=18'} - dev: true + '@cspell/cspell-types@8.1.3': {} - /@cspell/dict-ada@4.0.2: - resolution: {integrity: sha512-0kENOWQeHjUlfyId/aCM/mKXtkEgV0Zu2RhUXCBr4hHo9F9vph+Uu8Ww2b0i5a4ZixoIkudGA+eJvyxrG1jUpA==} - dev: true + '@cspell/dict-ada@4.0.2': {} - /@cspell/dict-aws@4.0.0: - resolution: {integrity: sha512-1YkCMWuna/EGIDN/zKkW+j98/55mxigftrSFgsehXhPld+ZMJM5J9UuBA88YfL7+/ETvBdd7mwW6IwWsC+/ltQ==} - dev: true + '@cspell/dict-aws@4.0.0': {} - /@cspell/dict-bash@4.1.3: - resolution: {integrity: sha512-tOdI3QVJDbQSwPjUkOiQFhYcu2eedmX/PtEpVWg0aFps/r6AyjUQINtTgpqMYnYuq8O1QUIQqnpx21aovcgZCw==} - dev: true + '@cspell/dict-bash@4.1.3': {} - /@cspell/dict-companies@3.0.28: - resolution: {integrity: sha512-UinHkMYB/1pUkLKm1PGIm9PBFYxeAa6YvbB1Rq/RAAlrs0WDwiDBr3BAYdxydukG1IqqwT5z9WtU+8D/yV/5lw==} - dev: true + '@cspell/dict-companies@3.0.28': {} - /@cspell/dict-cpp@5.0.10: - resolution: {integrity: sha512-WCRuDrkFdpmeIR6uXQYKU9loMQKNFS4bUhtHdv5fu4qVyJSh3k/kgmtTm1h1BDTj8EwPRc/RGxS+9Z3b2mnabA==} - dev: true + '@cspell/dict-cpp@5.0.10': {} - /@cspell/dict-cryptocurrencies@4.0.0: - resolution: {integrity: sha512-EiZp91ATyRxTmauIQfOX9adLYCunKjHEh092rrM7o2eMXP9n7zpXAL9BK7LviL+LbB8VDOm21q+s83cKrrRrsg==} - dev: true + '@cspell/dict-cryptocurrencies@4.0.0': {} - /@cspell/dict-csharp@4.0.2: - resolution: {integrity: sha512-1JMofhLK+4p4KairF75D3A924m5ERMgd1GvzhwK2geuYgd2ZKuGW72gvXpIV7aGf52E3Uu1kDXxxGAiZ5uVG7g==} - dev: true + '@cspell/dict-csharp@4.0.2': {} - /@cspell/dict-css@4.0.12: - resolution: {integrity: sha512-vGBgPM92MkHQF5/2jsWcnaahOZ+C6OE/fPvd5ScBP72oFY9tn5GLuomcyO0z8vWCr2e0nUSX1OGimPtcQAlvSw==} - dev: true + '@cspell/dict-css@4.0.12': {} - /@cspell/dict-dart@2.0.3: - resolution: {integrity: sha512-cLkwo1KT5CJY5N5RJVHks2genFkNCl/WLfj+0fFjqNR+tk3tBI1LY7ldr9piCtSFSm4x9pO1x6IV3kRUY1lLiw==} - dev: true + '@cspell/dict-dart@2.0.3': {} - /@cspell/dict-data-science@1.0.11: - resolution: {integrity: sha512-TaHAZRVe0Zlcc3C23StZqqbzC0NrodRwoSAc8dis+5qLeLLnOCtagYQeROQvDlcDg3X/VVEO9Whh4W/z4PAmYQ==} - dev: true + '@cspell/dict-data-science@1.0.11': {} - /@cspell/dict-django@4.1.0: - resolution: {integrity: sha512-bKJ4gPyrf+1c78Z0Oc4trEB9MuhcB+Yg+uTTWsvhY6O2ncFYbB/LbEZfqhfmmuK/XJJixXfI1laF2zicyf+l0w==} - dev: true + '@cspell/dict-django@4.1.0': {} - /@cspell/dict-docker@1.1.7: - resolution: {integrity: sha512-XlXHAr822euV36GGsl2J1CkBIVg3fZ6879ZOg5dxTIssuhUOCiV2BuzKZmt6aIFmcdPmR14+9i9Xq+3zuxeX0A==} - dev: true + '@cspell/dict-docker@1.1.7': {} - /@cspell/dict-dotnet@5.0.0: - resolution: {integrity: sha512-EOwGd533v47aP5QYV8GlSSKkmM9Eq8P3G/eBzSpH3Nl2+IneDOYOBLEUraHuiCtnOkNsz0xtZHArYhAB2bHWAw==} - dev: true + '@cspell/dict-dotnet@5.0.0': {} - /@cspell/dict-elixir@4.0.3: - resolution: {integrity: sha512-g+uKLWvOp9IEZvrIvBPTr/oaO6619uH/wyqypqvwpmnmpjcfi8+/hqZH8YNKt15oviK8k4CkINIqNhyndG9d9Q==} - dev: true + '@cspell/dict-elixir@4.0.3': {} - /@cspell/dict-en-common-misspellings@1.0.2: - resolution: {integrity: sha512-jg7ZQZpZH7+aAxNBlcAG4tGhYF6Ksy+QS5Df73Oo+XyckBjC9QS+PrRwLTeYoFIgXy5j3ICParK5r3MSSoL4gw==} - dev: true + '@cspell/dict-en-common-misspellings@1.0.2': {} - /@cspell/dict-en-gb@1.1.33: - resolution: {integrity: sha512-tKSSUf9BJEV+GJQAYGw5e+ouhEe2ZXE620S7BLKe3ZmpnjlNG9JqlnaBhkIMxKnNFkLY2BP/EARzw31AZnOv4g==} - dev: true + '@cspell/dict-en-gb@1.1.33': {} - /@cspell/dict-en_us@4.3.12: - resolution: {integrity: sha512-1bsUxFjgxF30FTzcU5uvmCvH3lyqVKR9dbwsJhomBlUM97f0edrd6590SiYBXDm7ruE68m3lJd4vs0Ev2D6FtQ==} - dev: true + '@cspell/dict-en_us@4.3.12': {} - /@cspell/dict-filetypes@3.0.3: - resolution: {integrity: sha512-J9UP+qwwBLfOQ8Qg9tAsKtSY/WWmjj21uj6zXTI9hRLD1eG1uUOLcfVovAmtmVqUWziPSKMr87F6SXI3xmJXgw==} - dev: true + '@cspell/dict-filetypes@3.0.3': {} - /@cspell/dict-fonts@4.0.0: - resolution: {integrity: sha512-t9V4GeN/m517UZn63kZPUYP3OQg5f0OBLSd3Md5CU3eH1IFogSvTzHHnz4Wqqbv8NNRiBZ3HfdY/pqREZ6br3Q==} - dev: true + '@cspell/dict-fonts@4.0.0': {} - /@cspell/dict-fsharp@1.0.1: - resolution: {integrity: sha512-23xyPcD+j+NnqOjRHgW3IU7Li912SX9wmeefcY0QxukbAxJ/vAN4rBpjSwwYZeQPAn3fxdfdNZs03fg+UM+4yQ==} - dev: true + '@cspell/dict-fsharp@1.0.1': {} - /@cspell/dict-fullstack@3.1.5: - resolution: {integrity: sha512-6ppvo1dkXUZ3fbYn/wwzERxCa76RtDDl5Afzv2lijLoijGGUw5yYdLBKJnx8PJBGNLh829X352ftE7BElG4leA==} - dev: true + '@cspell/dict-fullstack@3.1.5': {} - /@cspell/dict-gaming-terms@1.0.4: - resolution: {integrity: sha512-hbDduNXlk4AOY0wFxcDMWBPpm34rpqJBeqaySeoUH70eKxpxm+dvjpoRLJgyu0TmymEICCQSl6lAHTHSDiWKZg==} - dev: true + '@cspell/dict-gaming-terms@1.0.4': {} - /@cspell/dict-git@2.0.0: - resolution: {integrity: sha512-n1AxyX5Kgxij/sZFkxFJlzn3K9y/sCcgVPg/vz4WNJ4K9YeTsUmyGLA2OQI7d10GJeiuAo2AP1iZf2A8j9aj2w==} - dev: true + '@cspell/dict-git@2.0.0': {} - /@cspell/dict-golang@6.0.5: - resolution: {integrity: sha512-w4mEqGz4/wV+BBljLxduFNkMrd3rstBNDXmoX5kD4UTzIb4Sy0QybWCtg2iVT+R0KWiRRA56QKOvBsgXiddksA==} - dev: true + '@cspell/dict-golang@6.0.5': {} - /@cspell/dict-haskell@4.0.1: - resolution: {integrity: sha512-uRrl65mGrOmwT7NxspB4xKXFUenNC7IikmpRZW8Uzqbqcu7ZRCUfstuVH7T1rmjRgRkjcIjE4PC11luDou4wEQ==} - dev: true + '@cspell/dict-haskell@4.0.1': {} - /@cspell/dict-html-symbol-entities@4.0.0: - resolution: {integrity: sha512-HGRu+48ErJjoweR5IbcixxETRewrBb0uxQBd6xFGcxbEYCX8CnQFTAmKI5xNaIt2PKaZiJH3ijodGSqbKdsxhw==} - dev: true + '@cspell/dict-html-symbol-entities@4.0.0': {} - /@cspell/dict-html@4.0.5: - resolution: {integrity: sha512-p0brEnRybzSSWi8sGbuVEf7jSTDmXPx7XhQUb5bgG6b54uj+Z0Qf0V2n8b/LWwIPJNd1GygaO9l8k3HTCy1h4w==} - dev: true + '@cspell/dict-html@4.0.5': {} - /@cspell/dict-java@5.0.6: - resolution: {integrity: sha512-kdE4AHHHrixyZ5p6zyms1SLoYpaJarPxrz8Tveo6gddszBVVwIUZ+JkQE1bWNLK740GWzIXdkznpUfw1hP9nXw==} - dev: true + '@cspell/dict-java@5.0.6': {} - /@cspell/dict-k8s@1.0.2: - resolution: {integrity: sha512-tLT7gZpNPnGa+IIFvK9SP1LrSpPpJ94a/DulzAPOb1Q2UBFwdpFd82UWhio0RNShduvKG/WiMZf/wGl98pn+VQ==} - dev: true + '@cspell/dict-k8s@1.0.2': {} - /@cspell/dict-latex@4.0.0: - resolution: {integrity: sha512-LPY4y6D5oI7D3d+5JMJHK/wxYTQa2lJMSNxps2JtuF8hbAnBQb3igoWEjEbIbRRH1XBM0X8dQqemnjQNCiAtxQ==} - dev: true + '@cspell/dict-latex@4.0.0': {} - /@cspell/dict-lorem-ipsum@4.0.0: - resolution: {integrity: sha512-1l3yjfNvMzZPibW8A7mQU4kTozwVZVw0AvFEdy+NcqtbxH+TvbSkNMqROOFWrkD2PjnKG0+Ea0tHI2Pi6Gchnw==} - dev: true + '@cspell/dict-lorem-ipsum@4.0.0': {} - /@cspell/dict-lua@4.0.3: - resolution: {integrity: sha512-lDHKjsrrbqPaea13+G9s0rtXjMO06gPXPYRjRYawbNmo4E/e3XFfVzeci3OQDQNDmf2cPOwt9Ef5lu2lDmwfJg==} - dev: true + '@cspell/dict-lua@4.0.3': {} - /@cspell/dict-makefile@1.0.0: - resolution: {integrity: sha512-3W9tHPcSbJa6s0bcqWo6VisEDTSN5zOtDbnPabF7rbyjRpNo0uHXHRJQF8gAbFzoTzBBhgkTmrfSiuyQm7vBUQ==} - dev: true + '@cspell/dict-makefile@1.0.0': {} - /@cspell/dict-node@4.0.3: - resolution: {integrity: sha512-sFlUNI5kOogy49KtPg8SMQYirDGIAoKBO3+cDLIwD4MLdsWy1q0upc7pzGht3mrjuyMiPRUV14Bb0rkVLrxOhg==} - dev: true + '@cspell/dict-node@4.0.3': {} - /@cspell/dict-npm@5.0.13: - resolution: {integrity: sha512-uPb3DlQA/FvlmzT5RjZoy7fy91mxMRZW1B+K3atVM5A/cmP1QlDaSW/iCtde5kHET1MOV7uxz+vy0Yha2OI5pQ==} - dev: true + '@cspell/dict-npm@5.0.13': {} - /@cspell/dict-php@4.0.4: - resolution: {integrity: sha512-fRlLV730fJbulDsLIouZxXoxHt3KIH6hcLFwxaupHL+iTXDg0lo7neRpbqD5MScr/J3idEr7i9G8XWzIikKFug==} - dev: true + '@cspell/dict-php@4.0.4': {} - /@cspell/dict-powershell@5.0.3: - resolution: {integrity: sha512-lEdzrcyau6mgzu1ie98GjOEegwVHvoaWtzQnm1ie4DyZgMr+N6D0Iyj1lzvtmt0snvsDFa5F2bsYzf3IMKcpcA==} - dev: true + '@cspell/dict-powershell@5.0.3': {} - /@cspell/dict-public-licenses@2.0.5: - resolution: {integrity: sha512-91HK4dSRri/HqzAypHgduRMarJAleOX5NugoI8SjDLPzWYkwZ1ftuCXSk+fy8DLc3wK7iOaFcZAvbjmnLhVs4A==} - dev: true + '@cspell/dict-public-licenses@2.0.5': {} - /@cspell/dict-python@4.1.10: - resolution: {integrity: sha512-ErF/Ohcu6Xk4QVNzFgo8p7CxkxvAKAmFszvso41qOOhu8CVpB35ikBRpGVDw9gsCUtZzi15Yl0izi4do6WcLkA==} + '@cspell/dict-python@4.1.10': dependencies: '@cspell/dict-data-science': 1.0.11 - dev: true - /@cspell/dict-r@2.0.1: - resolution: {integrity: sha512-KCmKaeYMLm2Ip79mlYPc8p+B2uzwBp4KMkzeLd5E6jUlCL93Y5Nvq68wV5fRLDRTf7N1LvofkVFWfDcednFOgA==} - dev: true + '@cspell/dict-r@2.0.1': {} - /@cspell/dict-ruby@5.0.1: - resolution: {integrity: sha512-rruTm7Emhty/BSYavSm8ZxRuVw0OBqzJkwIFXcV0cX7To8D1qbmS9HFHRuRg8IL11+/nJvtdDz+lMFBSmPUagQ==} - dev: true + '@cspell/dict-ruby@5.0.1': {} - /@cspell/dict-rust@4.0.1: - resolution: {integrity: sha512-xJSSzHDK2z6lSVaOmMxl3PTOtfoffaxMo7fTcbZUF+SCJzfKbO6vnN9TCGX2sx1RHFDz66Js6goz6SAZQdOwaw==} - dev: true + '@cspell/dict-rust@4.0.1': {} - /@cspell/dict-scala@5.0.0: - resolution: {integrity: sha512-ph0twaRoV+ylui022clEO1dZ35QbeEQaKTaV2sPOsdwIokABPIiK09oWwGK9qg7jRGQwVaRPEq0Vp+IG1GpqSQ==} - dev: true + '@cspell/dict-scala@5.0.0': {} - /@cspell/dict-software-terms@3.3.12: - resolution: {integrity: sha512-6aa4T9VqOMc0SFNBt6gxp0CWjvRqMg/uxvgpRbil+ToHWcU+Q+As0WKhPLaOniuTdCM85WWzRouD0O1XUGqg5Q==} - dev: true + '@cspell/dict-software-terms@3.3.12': {} - /@cspell/dict-sql@2.1.2: - resolution: {integrity: sha512-Pi0hAcvsSGtZZeyyAN1VfGtQJbrXos5x2QjJU0niAQKhmITSOrXU/1II1Gogk+FYDjWyV9wP2De0U2f7EWs6oQ==} - dev: true + '@cspell/dict-sql@2.1.2': {} - /@cspell/dict-svelte@1.0.2: - resolution: {integrity: sha512-rPJmnn/GsDs0btNvrRBciOhngKV98yZ9SHmg8qI6HLS8hZKvcXc0LMsf9LLuMK1TmS2+WQFAan6qeqg6bBxL2Q==} - dev: true + '@cspell/dict-svelte@1.0.2': {} - /@cspell/dict-swift@2.0.1: - resolution: {integrity: sha512-gxrCMUOndOk7xZFmXNtkCEeroZRnS2VbeaIPiymGRHj5H+qfTAzAKxtv7jJbVA3YYvEzWcVE2oKDP4wcbhIERw==} - dev: true + '@cspell/dict-swift@2.0.1': {} - /@cspell/dict-typescript@3.1.2: - resolution: {integrity: sha512-lcNOYWjLUvDZdLa0UMNd/LwfVdxhE9rKA+agZBGjL3lTA3uNvH7IUqSJM/IXhJoBpLLMVEOk8v1N9xi+vDuCdA==} - dev: true + '@cspell/dict-typescript@3.1.2': {} - /@cspell/dict-vue@3.0.0: - resolution: {integrity: sha512-niiEMPWPV9IeRBRzZ0TBZmNnkK3olkOPYxC1Ny2AX4TGlYRajcW0WUtoSHmvvjZNfWLSg2L6ruiBeuPSbjnG6A==} - dev: true + '@cspell/dict-vue@3.0.0': {} - /@cspell/dynamic-import@8.1.3: - resolution: {integrity: sha512-/lXFLa92v4oOcZ2PbdRpOqBvnqWlYmGaV7iCy8+QhIWlMdzi+7tBX3LVTm9Jzvt/rJseVHQQ6RvfTsSmhbUMFQ==} - engines: {node: '>=18.0'} + '@cspell/dynamic-import@8.1.3': dependencies: import-meta-resolve: 4.0.0 - dev: true - /@cspell/strong-weak-map@8.1.3: - resolution: {integrity: sha512-GhWyximzk8tumo0zhrDV3+nFYiETYefiTBWAEVbXJMibuvitFocVZwddqN85J0UdZ2M7q6tvBleEaI9ME/16gA==} - engines: {node: '>=18'} - dev: true + '@cspell/strong-weak-map@8.1.3': {} - /@double-great/alt-text@3.1.0: - resolution: {integrity: sha512-5gSW9AI0KUO2GQe9K+KjyiCisxl4xL0kesQCxUsko4T9s8zler/stW0qcH5XryUgtKebb293qX9sz1nCmQpdTw==} + '@double-great/alt-text@3.1.0': dependencies: emoji-regex: 10.3.0 github-slugger: 1.5.0 tinyurl: 1.1.7 - dev: true - /@double-great/remark-lint-alt-text@1.0.0: - resolution: {integrity: sha512-2FFjSX2VhT/USmsOEkcw40SiCHXXio2sWs4S7docKNFh+W7/z+bHYau+UHfrP4yDRVzfUVSV1MKnsxmigkhixg==} + '@double-great/remark-lint-alt-text@1.0.0': dependencies: '@double-great/alt-text': 3.1.0 unified-lint-rule: 2.1.2 unist-util-visit-parents: 5.1.3 - dev: true - /@eslint-community/eslint-utils@4.4.0(eslint@8.54.0): - resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + '@eslint-community/eslint-utils@4.4.0(eslint@8.54.0)': dependencies: eslint: 8.54.0 eslint-visitor-keys: 3.4.3 - dev: true - /@eslint-community/regexpp@4.10.0: - resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} - engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - dev: true + '@eslint-community/regexpp@4.10.0': {} - /@eslint/eslintrc@2.1.3: - resolution: {integrity: sha512-yZzuIG+jnVu6hNSzFEN07e8BxF3uAzYtQb6uDkaYZLo6oYZDCq454c5kB8zxnzfCYyP4MIuyBn10L0DqwujTmA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@eslint/eslintrc@2.1.3': dependencies: ajv: 6.12.6 debug: 4.3.4 @@ -635,52 +4125,31 @@ packages: globals: 13.23.0 ignore: 5.3.0 import-fresh: 3.3.0 - js-yaml: 4.1.0 - minimatch: 3.1.2 - strip-json-comments: 3.1.1 - transitivePeerDependencies: - - supports-color - dev: true - - /@eslint/js@8.54.0: - resolution: {integrity: sha512-ut5V+D+fOoWPgGGNj83GGjnntO39xDy6DWxO0wb7Jp3DcMX0TfIqdzHF85VTQkerdyGmuuMD9AKAo5KiNlf/AQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dev: true - - /@eth-optimism/contracts-bedrock@0.16.2: - resolution: {integrity: sha512-a2+f7soDbrd6jV74U02EpyMwQt2iZeDZ4c2ZwgkObcxXUZLZQ2ELt/VRFBf8TIL3wYcBOGpUa1aXAE2oHQ7oRA==} - requiresBuild: true - dev: true - - /@eth-optimism/contracts-ts@0.17.0(typescript@5.3.2): - resolution: {integrity: sha512-V4uJtS4ngAQ8tLSeIHWAK7ZNrz3a5Mf4YN3vf5U3u2/c+bKWIkGYgmD/GPQuyMmALOv67tJpFn3GRDTb9LgG1g==} - requiresBuild: true - peerDependencies: - '@wagmi/core': '>1.0.0' - wagmi: '>1.0.0' - peerDependenciesMeta: - '@wagmi/core': - optional: true - wagmi: - optional: true + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + + '@eslint/js@8.54.0': {} + + '@eth-optimism/contracts-bedrock@0.16.2': {} + + '@eth-optimism/contracts-ts@0.17.0(typescript@5.3.2)(zod@3.22.4)': dependencies: - '@testing-library/react': 14.1.2(react-dom@18.2.0)(react@18.2.0) + '@testing-library/react': 14.1.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@types/change-case': 2.3.1 change-case: 4.1.2 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - viem: 1.19.6(typescript@5.3.2) + viem: 1.19.6(typescript@5.3.2)(zod@3.22.4) transitivePeerDependencies: - bufferutil - typescript - utf-8-validate - zod - dev: false - /@eth-optimism/contracts@0.6.0(ethers@5.7.2): - resolution: {integrity: sha512-vQ04wfG9kMf1Fwy3FEMqH2QZbgS0gldKhcBeBUPfO8zu68L61VI97UDXmsMQXzTsEAxK8HnokW3/gosl4/NW3w==} - peerDependencies: - ethers: ^5 + '@eth-optimism/contracts@0.6.0(ethers@5.7.2)': dependencies: '@eth-optimism/core-utils': 0.12.0 '@ethersproject/abstract-provider': 5.7.0 @@ -689,10 +4158,8 @@ packages: transitivePeerDependencies: - bufferutil - utf-8-validate - dev: true - /@eth-optimism/core-utils@0.12.0: - resolution: {integrity: sha512-qW+7LZYCz7i8dRa7SRlUKIo1VBU8lvN0HeXCxJR+z+xtMzMQpPds20XJNCMclszxYQHkXY00fOT6GvFw9ZL6nw==} + '@eth-optimism/core-utils@0.12.0': dependencies: '@ethersproject/abi': 5.7.0 '@ethersproject/abstract-provider': 5.7.0 @@ -713,11 +4180,8 @@ packages: transitivePeerDependencies: - bufferutil - utf-8-validate - dev: true - /@eth-optimism/core-utils@0.13.1: - resolution: {integrity: sha512-1FvzbUmCEy9zSKPG1QWg2VfA2Cy90xBA9Wkp11lXXrz91zUPCNCNSRTujXWYIC86ketNsZp7p4njSf6lTycHCw==} - requiresBuild: true + '@eth-optimism/core-utils@0.13.1': dependencies: '@ethersproject/abi': 5.7.0 '@ethersproject/abstract-provider': 5.7.0 @@ -737,13 +4201,8 @@ packages: - bufferutil - encoding - utf-8-validate - dev: true - /@eth-optimism/sdk@3.1.6(ethers@5.7.2): - resolution: {integrity: sha512-YU3Sx4jPFfdXW4gs0PvnFDFPrJjbsaFxAJrsqxDpkUH3fMC3MmQgECYdkj8y1xTO6CTHm9gWLNC2WQdYTdNJsQ==} - requiresBuild: true - peerDependencies: - ethers: ^5 + '@eth-optimism/sdk@3.1.6(ethers@5.7.2)': dependencies: '@eth-optimism/contracts': 0.6.0(ethers@5.7.2) '@eth-optimism/contracts-bedrock': 0.16.2 @@ -756,29 +4215,18 @@ packages: - bufferutil - encoding - utf-8-validate - dev: true - /@eth-optimism/tokenlist@9.0.9: - resolution: {integrity: sha512-Wz0ZbvJKBUIikZpAjX1dqXYlSq0mHCnVXfGST+rZOhpCnY9Qwf9PEpSEK9kMeUz2ySDVV1mqtXtLgVjZb6z3Pg==} - dev: false + '@eth-optimism/tokenlist@9.0.9': {} - /@ethereumjs/rlp@4.0.1: - resolution: {integrity: sha512-tqsQiBQDQdmPWE1xkkBq4rlSW5QZpLOUJ5RJh2/9fug+q9tnUhuZoVLk7s0scUIKTOzEtR72DFBXI4WiZcMpvw==} - engines: {node: '>=14'} - hasBin: true - dev: true + '@ethereumjs/rlp@4.0.1': {} - /@ethereumjs/util@8.1.0: - resolution: {integrity: sha512-zQ0IqbdX8FZ9aw11vP+dZkKDkS+kgIvQPHnSAXzP9pLu+Rfu3D3XEeLbicvoXJTYnhZiPmsZUxgdzXwNKxRPbA==} - engines: {node: '>=14'} + '@ethereumjs/util@8.1.0': dependencies: '@ethereumjs/rlp': 4.0.1 ethereum-cryptography: 2.1.2 micro-ftch: 0.3.1 - dev: true - /@ethersproject/abi@5.7.0: - resolution: {integrity: sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA==} + '@ethersproject/abi@5.7.0': dependencies: '@ethersproject/address': 5.7.0 '@ethersproject/bignumber': 5.7.0 @@ -789,10 +4237,8 @@ packages: '@ethersproject/logger': 5.7.0 '@ethersproject/properties': 5.7.0 '@ethersproject/strings': 5.7.0 - dev: true - /@ethersproject/abstract-provider@5.7.0: - resolution: {integrity: sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw==} + '@ethersproject/abstract-provider@5.7.0': dependencies: '@ethersproject/bignumber': 5.7.0 '@ethersproject/bytes': 5.7.0 @@ -801,63 +4247,47 @@ packages: '@ethersproject/properties': 5.7.0 '@ethersproject/transactions': 5.7.0 '@ethersproject/web': 5.7.1 - dev: true - /@ethersproject/abstract-signer@5.7.0: - resolution: {integrity: sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ==} + '@ethersproject/abstract-signer@5.7.0': dependencies: '@ethersproject/abstract-provider': 5.7.0 '@ethersproject/bignumber': 5.7.0 '@ethersproject/bytes': 5.7.0 '@ethersproject/logger': 5.7.0 '@ethersproject/properties': 5.7.0 - dev: true - /@ethersproject/address@5.7.0: - resolution: {integrity: sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==} + '@ethersproject/address@5.7.0': dependencies: '@ethersproject/bignumber': 5.7.0 '@ethersproject/bytes': 5.7.0 '@ethersproject/keccak256': 5.7.0 '@ethersproject/logger': 5.7.0 '@ethersproject/rlp': 5.7.0 - dev: true - /@ethersproject/base64@5.7.0: - resolution: {integrity: sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ==} + '@ethersproject/base64@5.7.0': dependencies: '@ethersproject/bytes': 5.7.0 - dev: true - /@ethersproject/basex@5.7.0: - resolution: {integrity: sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw==} + '@ethersproject/basex@5.7.0': dependencies: '@ethersproject/bytes': 5.7.0 '@ethersproject/properties': 5.7.0 - dev: true - /@ethersproject/bignumber@5.7.0: - resolution: {integrity: sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw==} + '@ethersproject/bignumber@5.7.0': dependencies: '@ethersproject/bytes': 5.7.0 '@ethersproject/logger': 5.7.0 bn.js: 5.2.1 - dev: true - /@ethersproject/bytes@5.7.0: - resolution: {integrity: sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A==} + '@ethersproject/bytes@5.7.0': dependencies: '@ethersproject/logger': 5.7.0 - dev: true - /@ethersproject/constants@5.7.0: - resolution: {integrity: sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA==} + '@ethersproject/constants@5.7.0': dependencies: '@ethersproject/bignumber': 5.7.0 - dev: true - /@ethersproject/contracts@5.7.0: - resolution: {integrity: sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg==} + '@ethersproject/contracts@5.7.0': dependencies: '@ethersproject/abi': 5.7.0 '@ethersproject/abstract-provider': 5.7.0 @@ -869,10 +4299,8 @@ packages: '@ethersproject/logger': 5.7.0 '@ethersproject/properties': 5.7.0 '@ethersproject/transactions': 5.7.0 - dev: true - /@ethersproject/hash@5.7.0: - resolution: {integrity: sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g==} + '@ethersproject/hash@5.7.0': dependencies: '@ethersproject/abstract-signer': 5.7.0 '@ethersproject/address': 5.7.0 @@ -883,10 +4311,8 @@ packages: '@ethersproject/logger': 5.7.0 '@ethersproject/properties': 5.7.0 '@ethersproject/strings': 5.7.0 - dev: true - /@ethersproject/hdnode@5.7.0: - resolution: {integrity: sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg==} + '@ethersproject/hdnode@5.7.0': dependencies: '@ethersproject/abstract-signer': 5.7.0 '@ethersproject/basex': 5.7.0 @@ -900,10 +4326,8 @@ packages: '@ethersproject/strings': 5.7.0 '@ethersproject/transactions': 5.7.0 '@ethersproject/wordlists': 5.7.0 - dev: true - /@ethersproject/json-wallets@5.7.0: - resolution: {integrity: sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g==} + '@ethersproject/json-wallets@5.7.0': dependencies: '@ethersproject/abstract-signer': 5.7.0 '@ethersproject/address': 5.7.0 @@ -918,40 +4342,28 @@ packages: '@ethersproject/transactions': 5.7.0 aes-js: 3.0.0 scrypt-js: 3.0.1 - dev: true - /@ethersproject/keccak256@5.7.0: - resolution: {integrity: sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg==} + '@ethersproject/keccak256@5.7.0': dependencies: '@ethersproject/bytes': 5.7.0 js-sha3: 0.8.0 - dev: true - /@ethersproject/logger@5.7.0: - resolution: {integrity: sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig==} - dev: true + '@ethersproject/logger@5.7.0': {} - /@ethersproject/networks@5.7.1: - resolution: {integrity: sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ==} + '@ethersproject/networks@5.7.1': dependencies: '@ethersproject/logger': 5.7.0 - dev: true - /@ethersproject/pbkdf2@5.7.0: - resolution: {integrity: sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw==} + '@ethersproject/pbkdf2@5.7.0': dependencies: '@ethersproject/bytes': 5.7.0 '@ethersproject/sha2': 5.7.0 - dev: true - /@ethersproject/properties@5.7.0: - resolution: {integrity: sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw==} + '@ethersproject/properties@5.7.0': dependencies: '@ethersproject/logger': 5.7.0 - dev: true - /@ethersproject/providers@5.7.2: - resolution: {integrity: sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg==} + '@ethersproject/providers@5.7.2': dependencies: '@ethersproject/abstract-provider': 5.7.0 '@ethersproject/abstract-signer': 5.7.0 @@ -976,32 +4388,24 @@ packages: transitivePeerDependencies: - bufferutil - utf-8-validate - dev: true - /@ethersproject/random@5.7.0: - resolution: {integrity: sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ==} + '@ethersproject/random@5.7.0': dependencies: '@ethersproject/bytes': 5.7.0 '@ethersproject/logger': 5.7.0 - dev: true - /@ethersproject/rlp@5.7.0: - resolution: {integrity: sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w==} + '@ethersproject/rlp@5.7.0': dependencies: '@ethersproject/bytes': 5.7.0 '@ethersproject/logger': 5.7.0 - dev: true - /@ethersproject/sha2@5.7.0: - resolution: {integrity: sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw==} + '@ethersproject/sha2@5.7.0': dependencies: '@ethersproject/bytes': 5.7.0 '@ethersproject/logger': 5.7.0 hash.js: 1.1.7 - dev: true - /@ethersproject/signing-key@5.7.0: - resolution: {integrity: sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q==} + '@ethersproject/signing-key@5.7.0': dependencies: '@ethersproject/bytes': 5.7.0 '@ethersproject/logger': 5.7.0 @@ -1009,10 +4413,8 @@ packages: bn.js: 5.2.1 elliptic: 6.5.4 hash.js: 1.1.7 - dev: true - /@ethersproject/solidity@5.7.0: - resolution: {integrity: sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA==} + '@ethersproject/solidity@5.7.0': dependencies: '@ethersproject/bignumber': 5.7.0 '@ethersproject/bytes': 5.7.0 @@ -1020,18 +4422,14 @@ packages: '@ethersproject/logger': 5.7.0 '@ethersproject/sha2': 5.7.0 '@ethersproject/strings': 5.7.0 - dev: true - /@ethersproject/strings@5.7.0: - resolution: {integrity: sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg==} + '@ethersproject/strings@5.7.0': dependencies: '@ethersproject/bytes': 5.7.0 '@ethersproject/constants': 5.7.0 '@ethersproject/logger': 5.7.0 - dev: true - /@ethersproject/transactions@5.7.0: - resolution: {integrity: sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ==} + '@ethersproject/transactions@5.7.0': dependencies: '@ethersproject/address': 5.7.0 '@ethersproject/bignumber': 5.7.0 @@ -1042,18 +4440,14 @@ packages: '@ethersproject/properties': 5.7.0 '@ethersproject/rlp': 5.7.0 '@ethersproject/signing-key': 5.7.0 - dev: true - /@ethersproject/units@5.7.0: - resolution: {integrity: sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg==} + '@ethersproject/units@5.7.0': dependencies: '@ethersproject/bignumber': 5.7.0 '@ethersproject/constants': 5.7.0 '@ethersproject/logger': 5.7.0 - dev: true - /@ethersproject/wallet@5.7.0: - resolution: {integrity: sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA==} + '@ethersproject/wallet@5.7.0': dependencies: '@ethersproject/abstract-provider': 5.7.0 '@ethersproject/abstract-signer': 5.7.0 @@ -1070,148 +4464,94 @@ packages: '@ethersproject/signing-key': 5.7.0 '@ethersproject/transactions': 5.7.0 '@ethersproject/wordlists': 5.7.0 - dev: true - /@ethersproject/web@5.7.1: - resolution: {integrity: sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w==} + '@ethersproject/web@5.7.1': dependencies: '@ethersproject/base64': 5.7.0 '@ethersproject/bytes': 5.7.0 '@ethersproject/logger': 5.7.0 '@ethersproject/properties': 5.7.0 '@ethersproject/strings': 5.7.0 - dev: true - /@ethersproject/wordlists@5.7.0: - resolution: {integrity: sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA==} + '@ethersproject/wordlists@5.7.0': dependencies: '@ethersproject/bytes': 5.7.0 '@ethersproject/hash': 5.7.0 '@ethersproject/logger': 5.7.0 '@ethersproject/properties': 5.7.0 '@ethersproject/strings': 5.7.0 - dev: true - /@feelback/js@0.3.4: - resolution: {integrity: sha512-xr7gTqSJcVUYQlELs1TntYovCBjMcYUr/hGKTnDoF64/lig5CbX4bOmqLoF50IImCy5q3oIwg9w+TSFvtBwsIA==} - dev: false + '@feelback/js@0.3.4': {} - /@feelback/react@0.3.4(react@18.2.0): - resolution: {integrity: sha512-ZWzUQAmPwl4nYR2olzBKddHzoLtGW/2pb8TiesiJCirxhaDW2E/XBx2ZaB4fL5TGXtjBt4eYq/qZxJZ0fIE0kg==} - engines: {node: '>=14'} - peerDependencies: - react: '>=17' + '@feelback/react@0.3.4(react@18.2.0)': dependencies: '@feelback/js': 0.3.4 react: 18.2.0 - dev: false - /@floating-ui/core@1.6.8: - resolution: {integrity: sha512-7XJ9cPU+yI2QeLS+FCSlqNFZJq8arvswefkZrYI1yQBbftw6FyrZOxYSh+9S7z7TpeWlRt9zJ5IhM1WIL334jA==} + '@floating-ui/core@1.6.8': dependencies: '@floating-ui/utils': 0.2.8 - dev: false - /@floating-ui/dom@1.6.11: - resolution: {integrity: sha512-qkMCxSR24v2vGkhYDo/UzxfJN3D4syqSjyuTFz6C7XcpU1pASPRieNI0Kj5VP3/503mOfYiGY891ugBX1GlABQ==} + '@floating-ui/dom@1.6.11': dependencies: '@floating-ui/core': 1.6.8 '@floating-ui/utils': 0.2.8 - dev: false - /@floating-ui/react-dom@2.1.2(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-06okr5cgPzMNBy+Ycse2A6udMi4bqwW/zgBF/rwjcNqWkyr82Mcg8b0vjX8OJpZFy/FKjJmw6wV7t44kK6kW7A==} - peerDependencies: - react: '>=16.8.0' - react-dom: '>=16.8.0' + '@floating-ui/react-dom@2.1.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@floating-ui/dom': 1.6.11 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - dev: false - /@floating-ui/react@0.26.25(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-hZOmgN0NTOzOuZxI1oIrDu3Gcl8WViIkvPMpB4xdd4QD6xAMtwgwr3VPoiyH/bLtRcS1cDnhxLSD1NsMJmwh/A==} - peerDependencies: - react: '>=16.8.0' - react-dom: '>=16.8.0' + '@floating-ui/react@0.26.25(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: - '@floating-ui/react-dom': 2.1.2(react-dom@18.2.0)(react@18.2.0) + '@floating-ui/react-dom': 2.1.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@floating-ui/utils': 0.2.8 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) tabbable: 6.2.0 - dev: false - /@floating-ui/utils@0.2.8: - resolution: {integrity: sha512-kym7SodPp8/wloecOpcmSnWJsK7M0E5Wg8UcFA+uO4B9s5d0ywXOEro/8HM9x0rW+TljRzul/14UYz3TleT3ig==} - dev: false + '@floating-ui/utils@0.2.8': {} - /@headlessui/react@1.7.17(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-4am+tzvkqDSSgiwrsEpGWqgGo9dz8qU5M3znCkC4PgkpY4HcCZzEDEvozltGGGHIKl9jbXbZPSH5TWn4sWJdow==} - engines: {node: '>=10'} - peerDependencies: - react: ^16 || ^17 || ^18 - react-dom: ^16 || ^17 || ^18 + '@headlessui/react@1.7.17(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: client-only: 0.0.1 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - dev: false - /@headlessui/react@2.1.8(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-uajqVkAcVG/wHwG9Fh5PFMcFpf2VxM4vNRNKxRjuK009kePVur8LkuuygHfIE+2uZ7z7GnlTtYsyUe6glPpTLg==} - engines: {node: '>=10'} - peerDependencies: - react: ^18 - react-dom: ^18 + '@headlessui/react@2.1.8(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: - '@floating-ui/react': 0.26.25(react-dom@18.2.0)(react@18.2.0) + '@floating-ui/react': 0.26.25(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@react-aria/focus': 3.18.4(react@18.2.0) '@react-aria/interactions': 3.22.4(react@18.2.0) - '@tanstack/react-virtual': 3.10.8(react-dom@18.2.0)(react@18.2.0) + '@tanstack/react-virtual': 3.10.8(react-dom@18.2.0(react@18.2.0))(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - dev: false - /@humanwhocodes/config-array@0.11.13: - resolution: {integrity: sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==} - engines: {node: '>=10.10.0'} + '@humanwhocodes/config-array@0.11.13': dependencies: '@humanwhocodes/object-schema': 2.0.1 debug: 4.3.4 minimatch: 3.1.2 transitivePeerDependencies: - supports-color - dev: true - /@humanwhocodes/module-importer@1.0.1: - resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} - engines: {node: '>=12.22'} - dev: true + '@humanwhocodes/module-importer@1.0.1': {} - /@humanwhocodes/object-schema@2.0.1: - resolution: {integrity: sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==} - dev: true + '@humanwhocodes/object-schema@2.0.1': {} - /@isaacs/cliui@8.0.2: - resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} - engines: {node: '>=12'} + '@isaacs/cliui@8.0.2': dependencies: string-width: 5.1.2 - string-width-cjs: /string-width@4.2.3 + string-width-cjs: string-width@4.2.3 strip-ansi: 7.1.0 - strip-ansi-cjs: /strip-ansi@6.0.1 + strip-ansi-cjs: strip-ansi@6.0.1 wrap-ansi: 8.1.0 - wrap-ansi-cjs: /wrap-ansi@7.0.0 - dev: true + wrap-ansi-cjs: wrap-ansi@7.0.0 - /@jsdevtools/ono@7.1.3: - resolution: {integrity: sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==} - dev: true + '@jsdevtools/ono@7.1.3': {} - /@mdx-js/mdx@2.3.0: - resolution: {integrity: sha512-jLuwRlz8DQfQNiUCJR50Y09CGPq3fLtmtUQfVrj79E0JWu3dvsVcxVIcfhR5h0iXu+/z++zDrYeiJqifRynJkA==} + '@mdx-js/mdx@2.3.0': dependencies: '@types/estree-jsx': 1.0.3 '@types/mdx': 2.0.9 @@ -1232,120 +4572,47 @@ packages: vfile: 5.3.7 transitivePeerDependencies: - supports-color - dev: false - /@mdx-js/react@2.3.0(react@18.2.0): - resolution: {integrity: sha512-zQH//gdOmuu7nt2oJR29vFhDv88oGPmVw6BggmrHeMI+xgEkp1B2dX9/bMBSYtK0dyLX/aOmesKS09g222K1/g==} - peerDependencies: - react: '>=16' + '@mdx-js/react@2.3.0(react@18.2.0)': dependencies: '@types/mdx': 2.0.9 '@types/react': 18.2.36 react: 18.2.0 - dev: false - /@napi-rs/simple-git-android-arm-eabi@0.1.9: - resolution: {integrity: sha512-9D4JnfePMpgL4pg9aMUX7/TIWEUQ+Tgx8n3Pf8TNCMGjUbImJyYsDSLJzbcv9wH7srgn4GRjSizXFJHAPjzEug==} - engines: {node: '>= 10'} - cpu: [arm] - os: [android] - requiresBuild: true - dev: false + '@napi-rs/simple-git-android-arm-eabi@0.1.9': optional: true - /@napi-rs/simple-git-android-arm64@0.1.9: - resolution: {integrity: sha512-Krilsw0gPrrASZzudNEl9pdLuNbhoTK0j7pUbfB8FRifpPdFB/zouwuEm0aSnsDXN4ftGrmGG82kuiR/2MeoPg==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [android] - requiresBuild: true - dev: false + '@napi-rs/simple-git-android-arm64@0.1.9': optional: true - /@napi-rs/simple-git-darwin-arm64@0.1.9: - resolution: {integrity: sha512-H/F09nDgYjv4gcFrZBgdTKkZEepqt0KLYcCJuUADuxkKupmjLdecMhypXLk13AzvLW4UQI7NlLTLDXUFLyr2BA==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: false + '@napi-rs/simple-git-darwin-arm64@0.1.9': optional: true - /@napi-rs/simple-git-darwin-x64@0.1.9: - resolution: {integrity: sha512-jBR2xS9nVPqmHv0TWz874W0m/d453MGrMeLjB+boK5IPPLhg3AWIZj0aN9jy2Je1BGVAa0w3INIQJtBBeB6kFA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: false + '@napi-rs/simple-git-darwin-x64@0.1.9': optional: true - /@napi-rs/simple-git-linux-arm-gnueabihf@0.1.9: - resolution: {integrity: sha512-3n0+VpO4YfZxndZ0sCvsHIvsazd+JmbSjrlTRBCnJeAU1/sfos3skNZtKGZksZhjvd+3o+/GFM8L7Xnv01yggA==} - engines: {node: '>= 10'} - cpu: [arm] - os: [linux] - requiresBuild: true - dev: false + '@napi-rs/simple-git-linux-arm-gnueabihf@0.1.9': optional: true - /@napi-rs/simple-git-linux-arm64-gnu@0.1.9: - resolution: {integrity: sha512-lIzf0KHU2SKC12vMrWwCtysG2Sdt31VHRPMUiz9lD9t3xwVn8qhFSTn5yDkTeG3rgX6o0p5EKalfQN5BXsJq2w==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: false + '@napi-rs/simple-git-linux-arm64-gnu@0.1.9': optional: true - /@napi-rs/simple-git-linux-arm64-musl@0.1.9: - resolution: {integrity: sha512-KQozUoNXrxrB8k741ncWXSiMbjl1AGBGfZV21PANzUM8wH4Yem2bg3kfglYS/QIx3udspsT35I9abu49n7D1/w==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: false + '@napi-rs/simple-git-linux-arm64-musl@0.1.9': optional: true - /@napi-rs/simple-git-linux-x64-gnu@0.1.9: - resolution: {integrity: sha512-O/Niui5mnHPcK3iYC3ui8wgERtJWsQ3Y74W/09t0bL/3dgzGMl4oQt0qTj9dWCsnoGsIEYHPzwCBp/2vqYp/pw==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: false + '@napi-rs/simple-git-linux-x64-gnu@0.1.9': optional: true - /@napi-rs/simple-git-linux-x64-musl@0.1.9: - resolution: {integrity: sha512-L9n+e8Wn3hKr3RsIdY8GaB+ry4xZ4BaGwyKExgoB8nDGQuRUY9oP6p0WA4hWfJvJnU1H6hvo36a5UFPReyBO7A==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: false + '@napi-rs/simple-git-linux-x64-musl@0.1.9': optional: true - /@napi-rs/simple-git-win32-arm64-msvc@0.1.9: - resolution: {integrity: sha512-Z6Ja/SZK+lMvRWaxj7wjnvSbAsGrH006sqZo8P8nxKUdZfkVvoCaAWr1r0cfkk2Z3aijLLtD+vKeXGlUPH6gGQ==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: false + '@napi-rs/simple-git-win32-arm64-msvc@0.1.9': optional: true - /@napi-rs/simple-git-win32-x64-msvc@0.1.9: - resolution: {integrity: sha512-VAZj1UvC+R2MjKOD3I/Y7dmQlHWAYy4omhReQJRpbCf+oGCBi9CWiIduGqeYEq723nLIKdxP7XjaO0wl1NnUww==} - engines: {node: '>= 10'} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: false + '@napi-rs/simple-git-win32-x64-msvc@0.1.9': optional: true - /@napi-rs/simple-git@0.1.9: - resolution: {integrity: sha512-qKzDS0+VjMvVyU28px+C6zlD1HKy83NIdYzfMQWa/g/V1iG/Ic8uwrS2ihHfm7mp7X0PPrmINLiTTi6ieUIKfw==} - engines: {node: '>= 10'} + '@napi-rs/simple-git@0.1.9': optionalDependencies: '@napi-rs/simple-git-android-arm-eabi': 0.1.9 '@napi-rs/simple-git-android-arm64': 0.1.9 @@ -1358,139 +4625,69 @@ packages: '@napi-rs/simple-git-linux-x64-musl': 0.1.9 '@napi-rs/simple-git-win32-arm64-msvc': 0.1.9 '@napi-rs/simple-git-win32-x64-msvc': 0.1.9 - dev: false - /@next/env@13.5.6: - resolution: {integrity: sha512-Yac/bV5sBGkkEXmAX5FWPS9Mmo2rthrOPRQQNfycJPkjUAUclomCPH7QFVCDQ4Mp2k2K1SSM6m0zrxYrOwtFQw==} - dev: false + '@next/env@13.5.6': {} - /@next/env@14.2.10: - resolution: {integrity: sha512-dZIu93Bf5LUtluBXIv4woQw2cZVZ2DJTjax5/5DOs3lzEOeKLy7GxRSr4caK9/SCPdaW6bCgpye6+n4Dh9oJPw==} - dev: false + '@next/env@14.2.10': {} - /@next/swc-darwin-arm64@14.2.10: - resolution: {integrity: sha512-V3z10NV+cvMAfxQUMhKgfQnPbjw+Ew3cnr64b0lr8MDiBJs3eLnM6RpGC46nhfMZsiXgQngCJKWGTC/yDcgrDQ==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: false + '@next/swc-darwin-arm64@14.2.10': optional: true - /@next/swc-darwin-x64@14.2.10: - resolution: {integrity: sha512-Y0TC+FXbFUQ2MQgimJ/7Ina2mXIKhE7F+GUe1SgnzRmwFY3hX2z8nyVCxE82I2RicspdkZnSWMn4oTjIKz4uzA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: false + '@next/swc-darwin-x64@14.2.10': optional: true - /@next/swc-linux-arm64-gnu@14.2.10: - resolution: {integrity: sha512-ZfQ7yOy5zyskSj9rFpa0Yd7gkrBnJTkYVSya95hX3zeBG9E55Z6OTNPn1j2BTFWvOVVj65C3T+qsjOyVI9DQpA==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: false + '@next/swc-linux-arm64-gnu@14.2.10': optional: true - /@next/swc-linux-arm64-musl@14.2.10: - resolution: {integrity: sha512-n2i5o3y2jpBfXFRxDREr342BGIQCJbdAUi/K4q6Env3aSx8erM9VuKXHw5KNROK9ejFSPf0LhoSkU/ZiNdacpQ==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: false + '@next/swc-linux-arm64-musl@14.2.10': optional: true - /@next/swc-linux-x64-gnu@14.2.10: - resolution: {integrity: sha512-GXvajAWh2woTT0GKEDlkVhFNxhJS/XdDmrVHrPOA83pLzlGPQnixqxD8u3bBB9oATBKB//5e4vpACnx5Vaxdqg==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: false + '@next/swc-linux-x64-gnu@14.2.10': optional: true - /@next/swc-linux-x64-musl@14.2.10: - resolution: {integrity: sha512-opFFN5B0SnO+HTz4Wq4HaylXGFV+iHrVxd3YvREUX9K+xfc4ePbRrxqOuPOFjtSuiVouwe6uLeDtabjEIbkmDA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: false + '@next/swc-linux-x64-musl@14.2.10': optional: true - /@next/swc-win32-arm64-msvc@14.2.10: - resolution: {integrity: sha512-9NUzZuR8WiXTvv+EiU/MXdcQ1XUvFixbLIMNQiVHuzs7ZIFrJDLJDaOF1KaqttoTujpcxljM/RNAOmw1GhPPQQ==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: false + '@next/swc-win32-arm64-msvc@14.2.10': optional: true - /@next/swc-win32-ia32-msvc@14.2.10: - resolution: {integrity: sha512-fr3aEbSd1GeW3YUMBkWAu4hcdjZ6g4NBl1uku4gAn661tcxd1bHs1THWYzdsbTRLcCKLjrDZlNp6j2HTfrw+Bg==} - engines: {node: '>= 10'} - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: false + '@next/swc-win32-ia32-msvc@14.2.10': optional: true - /@next/swc-win32-x64-msvc@14.2.10: - resolution: {integrity: sha512-UjeVoRGKNL2zfbcQ6fscmgjBAS/inHBh63mjIlfPg/NG8Yn2ztqylXt5qilYb6hoHIwaU2ogHknHWWmahJjgZQ==} - engines: {node: '>= 10'} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: false + '@next/swc-win32-x64-msvc@14.2.10': optional: true - /@noble/curves@1.1.0: - resolution: {integrity: sha512-091oBExgENk/kGj3AZmtBDMpxQPDtxQABR2B9lb1JbVTs6ytdzZNwvhxQ4MWasRNEzlbEH8jCWFCwhF/Obj5AA==} + '@noble/curves@1.1.0': dependencies: '@noble/hashes': 1.3.1 - dev: true - /@noble/curves@1.2.0: - resolution: {integrity: sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==} + '@noble/curves@1.2.0': dependencies: '@noble/hashes': 1.3.2 - dev: false - /@noble/hashes@1.3.1: - resolution: {integrity: sha512-EbqwksQwz9xDRGfDST86whPBgM65E0OH/pCgqW0GBVzO22bNE+NuIbeTb714+IfSjU3aRk47EUvXIb5bTsenKA==} - engines: {node: '>= 16'} + '@noble/curves@1.6.0': + dependencies: + '@noble/hashes': 1.5.0 - /@noble/hashes@1.3.2: - resolution: {integrity: sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==} - engines: {node: '>= 16'} - dev: false + '@noble/hashes@1.3.1': {} - /@nodelib/fs.scandir@2.1.5: - resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} - engines: {node: '>= 8'} + '@noble/hashes@1.3.2': {} + + '@noble/hashes@1.5.0': {} + + '@nodelib/fs.scandir@2.1.5': dependencies: '@nodelib/fs.stat': 2.0.5 run-parallel: 1.2.0 - /@nodelib/fs.stat@2.0.5: - resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} - engines: {node: '>= 8'} + '@nodelib/fs.stat@2.0.5': {} - /@nodelib/fs.walk@1.2.8: - resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} - engines: {node: '>= 8'} + '@nodelib/fs.walk@1.2.8': dependencies: '@nodelib/fs.scandir': 2.1.5 fastq: 1.15.0 - /@npmcli/config@6.4.0: - resolution: {integrity: sha512-/fQjIbuNVIT/PbXvw178Tm97bxV0E0nVUFKHivMKtSI2pcs8xKdaWkHJxf9dTI0G/y5hp/KuCvgcUu5HwAtI1w==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + '@npmcli/config@6.4.0': dependencies: '@npmcli/map-workspaces': 3.0.4 ci-info: 3.9.0 @@ -1500,33 +4697,20 @@ packages: read-package-json-fast: 3.0.2 semver: 7.5.4 walk-up-path: 3.0.1 - dev: true - /@npmcli/map-workspaces@3.0.4: - resolution: {integrity: sha512-Z0TbvXkRbacjFFLpVpV0e2mheCh+WzQpcqL+4xp49uNJOxOnIAPZyXtUxZ5Qn3QBTGKA11Exjd9a5411rBrhDg==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + '@npmcli/map-workspaces@3.0.4': dependencies: '@npmcli/name-from-folder': 2.0.0 glob: 10.3.10 minimatch: 9.0.3 read-package-json-fast: 3.0.2 - dev: true - /@npmcli/name-from-folder@2.0.0: - resolution: {integrity: sha512-pwK+BfEBZJbKdNYpHHRTNBwBoqrN/iIMO0AiGvYsp3Hoaq0WbgGSWQR6SCldZovoDpY3yje5lkFUe6gsDgJ2vg==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dev: true + '@npmcli/name-from-folder@2.0.0': {} - /@pkgjs/parseargs@0.11.0: - resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} - engines: {node: '>=14'} - requiresBuild: true - dev: true + '@pkgjs/parseargs@0.11.0': optional: true - /@pkgr/utils@2.4.2: - resolution: {integrity: sha512-POgTXhjrTfbTV63DiFXav4lBHiICLKKwDeaKn9Nphwj7WH6m0hMMCaJkMyRWjgtPFyRKRVoMXXjczsTQRDEhYw==} - engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + '@pkgr/utils@2.4.2': dependencies: cross-spawn: 7.0.3 fast-glob: 3.3.2 @@ -1534,16 +4718,10 @@ packages: open: 9.1.0 picocolors: 1.0.0 tslib: 2.6.2 - dev: true - /@popperjs/core@2.11.8: - resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==} - dev: false + '@popperjs/core@2.11.8': {} - /@react-aria/focus@3.18.4(react@18.2.0): - resolution: {integrity: sha512-91J35077w9UNaMK1cpMUEFRkNNz0uZjnSwiyBCFuRdaVuivO53wNC9XtWSDNDdcO5cGy87vfJRVAiyoCn/mjqA==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + '@react-aria/focus@3.18.4(react@18.2.0)': dependencies: '@react-aria/interactions': 3.22.4(react@18.2.0) '@react-aria/utils': 3.25.3(react@18.2.0) @@ -1551,34 +4729,21 @@ packages: '@swc/helpers': 0.5.2 clsx: 2.1.1 react: 18.2.0 - dev: false - /@react-aria/interactions@3.22.4(react@18.2.0): - resolution: {integrity: sha512-E0vsgtpItmknq/MJELqYJwib+YN18Qag8nroqwjk1qOnBa9ROIkUhWJerLi1qs5diXq9LHKehZDXRlwPvdEFww==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + '@react-aria/interactions@3.22.4(react@18.2.0)': dependencies: '@react-aria/ssr': 3.9.6(react@18.2.0) '@react-aria/utils': 3.25.3(react@18.2.0) '@react-types/shared': 3.25.0(react@18.2.0) '@swc/helpers': 0.5.2 react: 18.2.0 - dev: false - /@react-aria/ssr@3.9.6(react@18.2.0): - resolution: {integrity: sha512-iLo82l82ilMiVGy342SELjshuWottlb5+VefO3jOQqQRNYnJBFpUSadswDPbRimSgJUZuFwIEYs6AabkP038fA==} - engines: {node: '>= 12'} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + '@react-aria/ssr@3.9.6(react@18.2.0)': dependencies: '@swc/helpers': 0.5.2 react: 18.2.0 - dev: false - /@react-aria/utils@3.25.3(react@18.2.0): - resolution: {integrity: sha512-PR5H/2vaD8fSq0H/UB9inNbc8KDcVmW6fYAfSWkkn+OAdhTTMVKqXXrZuZBWyFfSD5Ze7VN6acr4hrOQm2bmrA==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + '@react-aria/utils@3.25.3(react@18.2.0)': dependencies: '@react-aria/ssr': 3.9.6(react@18.2.0) '@react-stately/utils': 3.10.4(react@18.2.0) @@ -1586,85 +4751,68 @@ packages: '@swc/helpers': 0.5.2 clsx: 2.1.1 react: 18.2.0 - dev: false - /@react-stately/utils@3.10.4(react@18.2.0): - resolution: {integrity: sha512-gBEQEIMRh5f60KCm7QKQ2WfvhB2gLUr9b72sqUdIZ2EG+xuPgaIlCBeSicvjmjBvYZwOjoOEnmIkcx2GHp/HWw==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + '@react-stately/utils@3.10.4(react@18.2.0)': dependencies: '@swc/helpers': 0.5.2 react: 18.2.0 - dev: false - /@react-types/shared@3.25.0(react@18.2.0): - resolution: {integrity: sha512-OZSyhzU6vTdW3eV/mz5i6hQwQUhkRs7xwY2d1aqPvTdMe0+2cY7Fwp45PAiwYLEj73i9ro2FxF9qC4DvHGSCgQ==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + '@react-types/shared@3.25.0(react@18.2.0)': dependencies: react: 18.2.0 - dev: false - /@scure/base@1.1.3: - resolution: {integrity: sha512-/+SgoRjLq7Xlf0CWuLHq2LUZeL/w65kfzAPG5NH9pcmBhs+nunQTn4gvdwgMTIXnt9b2C/1SeL2XiysZEyIC9Q==} + '@scure/base@1.1.3': {} - /@scure/bip32@1.3.1: - resolution: {integrity: sha512-osvveYtyzdEVbt3OfwwXFr4P2iVBL5u1Q3q4ONBfDY/UpOuXmOlbgwc1xECEboY8wIays8Yt6onaWMUdUbfl0A==} + '@scure/base@1.1.9': {} + + '@scure/bip32@1.3.1': dependencies: '@noble/curves': 1.1.0 - '@noble/hashes': 1.3.1 + '@noble/hashes': 1.3.2 '@scure/base': 1.1.3 - dev: true - /@scure/bip32@1.3.2: - resolution: {integrity: sha512-N1ZhksgwD3OBlwTv3R6KFEcPojl/W4ElJOeCZdi+vuI5QmTFwLq3OFf2zd2ROpKvxFdgZ6hUpb0dx9bVNEwYCA==} + '@scure/bip32@1.3.2': dependencies: '@noble/curves': 1.2.0 '@noble/hashes': 1.3.2 '@scure/base': 1.1.3 - dev: false - /@scure/bip39@1.2.1: - resolution: {integrity: sha512-Z3/Fsz1yr904dduJD0NpiyRHhRYHdcnyh73FZWiV+/qhWi83wNJ3NWolYqCEN+ZWsUz2TWwajJggcRE9r1zUYg==} + '@scure/bip32@1.5.0': dependencies: - '@noble/hashes': 1.3.1 + '@noble/curves': 1.6.0 + '@noble/hashes': 1.5.0 + '@scure/base': 1.1.9 + + '@scure/bip39@1.2.1': + dependencies: + '@noble/hashes': 1.3.2 '@scure/base': 1.1.3 - /@swc/counter@0.1.3: - resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} - dev: false + '@scure/bip39@1.4.0': + dependencies: + '@noble/hashes': 1.5.0 + '@scure/base': 1.1.9 - /@swc/helpers@0.5.2: - resolution: {integrity: sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==} + '@swc/counter@0.1.3': {} + + '@swc/helpers@0.5.2': dependencies: tslib: 2.6.2 - dev: false - /@swc/helpers@0.5.5: - resolution: {integrity: sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A==} + '@swc/helpers@0.5.5': dependencies: '@swc/counter': 0.1.3 tslib: 2.6.2 - dev: false - /@tanstack/react-virtual@3.10.8(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-VbzbVGSsZlQktyLrP5nxE+vE1ZR+U0NFAWPbJLoG2+DKPwd2D7dVICTVIIaYlJqX1ZCEnYDbaOpmMwbsyhBoIA==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + '@tanstack/react-virtual@3.10.8(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@tanstack/virtual-core': 3.10.8 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - dev: false - /@tanstack/virtual-core@3.10.8: - resolution: {integrity: sha512-PBu00mtt95jbKFi6Llk9aik8bnR3tR/oQP1o3TSi+iG//+Q2RTIzCEgKkHG8BB86kxMNW6O8wku+Lmi+QFR6jA==} - dev: false + '@tanstack/virtual-core@3.10.8': {} - /@testing-library/dom@9.3.3: - resolution: {integrity: sha512-fB0R+fa3AUqbLHWyxXa2kGVtf1Fe1ZZFr0Zp6AIbIAzXb2mKbEXl+PCQNUOaq5lbTab5tfctfXRNsWXxa2f7Aw==} - engines: {node: '>=14'} + '@testing-library/dom@9.3.3': dependencies: '@babel/code-frame': 7.23.4 '@babel/runtime': 7.23.2 @@ -1674,249 +4822,157 @@ packages: dom-accessibility-api: 0.5.16 lz-string: 1.5.0 pretty-format: 27.5.1 - dev: false - /@testing-library/react@14.1.2(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-z4p7DVBTPjKM5qDZ0t5ZjzkpSNb+fZy1u6bzO7kk8oeGagpPCAtgh4cx1syrfp7a+QWkM021jGqjJaxJJnXAZg==} - engines: {node: '>=14'} - peerDependencies: - react: ^18.0.0 - react-dom: ^18.0.0 + '@testing-library/react@14.1.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@babel/runtime': 7.23.2 '@testing-library/dom': 9.3.3 '@types/react-dom': 18.2.16 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - dev: false - /@theguild/remark-mermaid@0.0.5(react@18.2.0): - resolution: {integrity: sha512-e+ZIyJkEv9jabI4m7q29wZtZv+2iwPGsXJ2d46Zi7e+QcFudiyuqhLhHG/3gX3ZEB+hxTch+fpItyMS8jwbIcw==} - peerDependencies: - react: ^18.2.0 + '@theguild/remark-mermaid@0.0.5(react@18.2.0)': dependencies: mermaid: 10.6.1 react: 18.2.0 unist-util-visit: 5.0.0 transitivePeerDependencies: - supports-color - dev: false - /@theguild/remark-npm2yarn@0.2.1: - resolution: {integrity: sha512-jUTFWwDxtLEFtGZh/TW/w30ySaDJ8atKWH8dq2/IiQF61dPrGfETpl0WxD0VdBfuLOeU14/kop466oBSRO/5CA==} + '@theguild/remark-npm2yarn@0.2.1': dependencies: npm-to-yarn: 2.1.0 unist-util-visit: 5.0.0 - dev: false - /@types/acorn@4.0.6: - resolution: {integrity: sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ==} + '@types/acorn@4.0.6': dependencies: '@types/estree': 1.0.5 - /@types/aria-query@5.0.4: - resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==} - dev: false - - /@types/change-case@2.3.1: - resolution: {integrity: sha512-HYiGjhmGInNzJjtt6ciXEfl2s8ZQGUQpPiwgWSth1fycE69hXbV/RgWH7MvSq2QPhMBzi4SGhu1vE+cMx1xB8g==} - deprecated: This is a stub types definition for change-case (https://github.com/blakeembrey/change-case). change-case provides its own type definitions, so you don't need @types/change-case installed! + '@types/aria-query@5.0.4': {} + + '@types/change-case@2.3.1': dependencies: change-case: 4.1.2 - dev: false - /@types/concat-stream@2.0.3: - resolution: {integrity: sha512-3qe4oQAPNwVNwK4C9c8u+VJqv9kez+2MR4qJpoPFfXtgxxif1QbFusvXzK0/Wra2VX07smostI2VMmJNSpZjuQ==} + '@types/concat-stream@2.0.3': dependencies: '@types/node': 18.11.10 - dev: true - /@types/d3-scale-chromatic@3.0.1: - resolution: {integrity: sha512-Ob7OrwiTeQXY/WBBbRHGZBOn6rH1h7y3jjpTSKYqDEeqFjktql6k2XSgNwLrLDmAsXhEn8P9NHDY4VTuo0ZY1w==} - dev: false + '@types/d3-scale-chromatic@3.0.1': {} - /@types/d3-scale@4.0.7: - resolution: {integrity: sha512-/YEbMIOtqSFSELqUT8desdT3a7iybPkSQiIx/wN4CZ/5b7wrCvmyXWELTMUYB10k0N5rzHVu4f/OkhulG1b3Lw==} + '@types/d3-scale@4.0.7': dependencies: '@types/d3-time': 3.0.2 - dev: false - /@types/d3-time@3.0.2: - resolution: {integrity: sha512-kbdRXTmUgNfw5OTE3KZnFQn6XdIc4QGroN5UixgdrXATmYsdlPQS6pEut9tVlIojtzuFD4txs/L+Rq41AHtLpg==} - dev: false + '@types/d3-time@3.0.2': {} - /@types/debug@4.1.11: - resolution: {integrity: sha512-R2qflTjHDs4CL6D/6TkqBeIHr54WzZfIxN729xvCNlYIVp2LknlnCro5Yo3frNaX2E5gO9pZ3/QAPVdGmu+q9w==} + '@types/debug@4.1.11': dependencies: '@types/ms': 0.7.33 - /@types/estree-jsx@1.0.3: - resolution: {integrity: sha512-pvQ+TKeRHeiUGRhvYwRrQ/ISnohKkSJR14fT2yqyZ4e9K5vqc7hrtY2Y1Dw0ZwAzQ6DQsxsaCUuSIIi8v0Cq6w==} + '@types/estree-jsx@1.0.3': dependencies: '@types/estree': 1.0.5 - /@types/estree@1.0.5: - resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} + '@types/estree@1.0.5': {} - /@types/hast@2.3.7: - resolution: {integrity: sha512-EVLigw5zInURhzfXUM65eixfadfsHKomGKUakToXo84t8gGIJuTcD2xooM2See7GyQ7DRtYjhCHnSUQez8JaLw==} + '@types/hast@2.3.7': dependencies: '@types/unist': 2.0.9 - /@types/hast@3.0.2: - resolution: {integrity: sha512-B5hZHgHsXvfCoO3xgNJvBnX7N8p86TqQeGKXcokW4XXi+qY4vxxPSFYofytvVmpFxzPv7oxDQzjg5Un5m2/xiw==} + '@types/hast@3.0.2': dependencies: '@types/unist': 3.0.1 - dev: false - /@types/is-empty@1.2.3: - resolution: {integrity: sha512-4J1l5d79hoIvsrKh5VUKVRA1aIdsOb10Hu5j3J2VfP/msDnfTdGPmNp2E1Wg+vs97Bktzo+MZePFFXSGoykYJw==} - dev: true + '@types/is-empty@1.2.3': {} - /@types/js-yaml@4.0.8: - resolution: {integrity: sha512-m6jnPk1VhlYRiLFm3f8X9Uep761f+CK8mHyS65LutH2OhmBF0BeMEjHgg05usH8PLZMWWc/BUR9RPmkvpWnyRA==} - dev: false + '@types/js-yaml@4.0.8': {} - /@types/json-schema@7.0.15: - resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - dev: true + '@types/json-schema@7.0.15': {} - /@types/katex@0.16.5: - resolution: {integrity: sha512-DD2Y3xMlTQvAnN6d8803xdgnOeYZ+HwMglb7/9YCf49J9RkJL53azf9qKa40MkEYhqVwxZ1GS2+VlShnz4Z1Bw==} - dev: false + '@types/katex@0.16.5': {} - /@types/lodash.clonedeep@4.5.9: - resolution: {integrity: sha512-19429mWC+FyaAhOLzsS8kZUsI+/GmBAQ0HFiCPsKGU+7pBXOQWhyrY6xNNDwUSX8SMZMJvuFVMF9O5dQOlQK9Q==} + '@types/lodash.clonedeep@4.5.9': dependencies: '@types/lodash': 4.14.202 - dev: true - /@types/lodash@4.14.202: - resolution: {integrity: sha512-OvlIYQK9tNneDlS0VN54LLd5uiPCBOp7gS5Z0f1mjoJYBrtStzgmJBxONW3U6OZqdtNzZPmn9BS/7WI7BFFcFQ==} - dev: true + '@types/lodash@4.14.202': {} - /@types/mdast@3.0.14: - resolution: {integrity: sha512-gVZ04PGgw1qLZKsnWnyFv4ORnaJ+DXLdHTVSFbU8yX6xZ34Bjg4Q32yPkmveUP1yItXReKfB0Aknlh/3zxTKAw==} + '@types/mdast@3.0.14': dependencies: '@types/unist': 2.0.9 - /@types/mdast@4.0.2: - resolution: {integrity: sha512-tYR83EignvhYO9iU3kDg8V28M0jqyh9zzp5GV+EO+AYnyUl3P5ltkTeJuTiFZQFz670FSb3EwT/6LQdX+UdKfw==} + '@types/mdast@4.0.2': dependencies: '@types/unist': 3.0.1 - /@types/mdx@2.0.9: - resolution: {integrity: sha512-OKMdj17y8Cs+k1r0XFyp59ChSOwf8ODGtMQ4mnpfz5eFDk1aO41yN3pSKGuvVzmWAkFp37seubY1tzOVpwfWwg==} - dev: false + '@types/mdx@2.0.9': {} - /@types/ms@0.7.33: - resolution: {integrity: sha512-AuHIyzR5Hea7ij0P9q7vx7xu4z0C28ucwjAZC0ja7JhINyCnOw8/DnvAPQQ9TfOlCtZAmCERKQX9+o1mgQhuOQ==} + '@types/ms@0.7.33': {} - /@types/node@18.11.10: - resolution: {integrity: sha512-juG3RWMBOqcOuXC643OAdSA525V44cVgGV6dUDuiFtss+8Fk5x1hI93Rsld43VeJVIeqlP9I7Fn9/qaVqoEAuQ==} - dev: true + '@types/node@18.11.10': {} - /@types/prop-types@15.7.9: - resolution: {integrity: sha512-n1yyPsugYNSmHgxDFjicaI2+gCNjsBck8UX9kuofAKlc0h1bL+20oSF72KeNaW2DUlesbEVCFgyV2dPGTiY42g==} - dev: false + '@types/prop-types@15.7.9': {} - /@types/react-dom@18.2.16: - resolution: {integrity: sha512-766c37araZ9vxtYs25gvY2wNdFWsT2ZiUvOd0zMhTaoGj6B911N8CKQWgXXJoPMLF3J82thpRqQA7Rf3rBwyJw==} + '@types/react-dom@18.2.16': dependencies: '@types/react': 18.2.36 - dev: false - /@types/react@18.2.36: - resolution: {integrity: sha512-o9XFsHYLLZ4+sb9CWUYwHqFVoG61SesydF353vFMMsQziiyRu8np4n2OYMUSDZ8XuImxDr9c5tR7gidlH29Vnw==} + '@types/react@18.2.36': dependencies: '@types/prop-types': 15.7.9 '@types/scheduler': 0.16.5 csstype: 3.1.2 - dev: false - /@types/scheduler@0.16.5: - resolution: {integrity: sha512-s/FPdYRmZR8SjLWGMCuax7r3qCWQw9QKHzXVukAuuIJkXkDRwp+Pu5LMIVFi0Fxbav35WURicYr8u1QsoybnQw==} - dev: false + '@types/scheduler@0.16.5': {} - /@types/supports-color@8.1.3: - resolution: {integrity: sha512-Hy6UMpxhE3j1tLpl27exp1XqHD7n8chAiNPzWfz16LPZoMMoSc4dzLl6w9qijkEb/r5O1ozdu1CWGA2L83ZeZg==} - dev: true + '@types/supports-color@8.1.3': {} - /@types/unist@2.0.9: - resolution: {integrity: sha512-zC0iXxAv1C1ERURduJueYzkzZ2zaGyc+P2c95hgkikHPr3z8EdUZOlgEQ5X0DRmwDZn+hekycQnoeiiRVrmilQ==} + '@types/unist@2.0.9': {} - /@types/unist@3.0.1: - resolution: {integrity: sha512-ue/hDUpPjC85m+PM9OQDMZr3LywT+CT6mPsQq8OJtCLiERkGRcQUFvu9XASF5XWqyZFXbf15lvb3JFJ4dRLWPg==} + '@types/unist@3.0.1': {} - /@ungap/structured-clone@1.2.0: - resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} + '@ungap/structured-clone@1.2.0': {} - /abbrev@2.0.0: - resolution: {integrity: sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dev: true + abbrev@2.0.0: {} - /abitype@0.9.8(typescript@5.3.2): - resolution: {integrity: sha512-puLifILdm+8sjyss4S+fsUN09obiT1g2YW6CtcQF+QDzxR0euzgEB29MZujC6zMk2a6SVmtttq1fc6+YFA7WYQ==} - peerDependencies: - typescript: '>=5.0.4' - zod: ^3 >=3.19.1 - peerDependenciesMeta: - typescript: - optional: true - zod: - optional: true - dependencies: + abitype@0.9.8(typescript@5.3.2)(zod@3.22.4): + optionalDependencies: typescript: 5.3.2 - dev: false + zod: 3.22.4 - /acorn-jsx@5.3.2(acorn@8.11.2): - resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} - peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + abitype@1.0.6(typescript@5.3.2)(zod@3.22.4): + optionalDependencies: + typescript: 5.3.2 + zod: 3.22.4 + + acorn-jsx@5.3.2(acorn@8.11.2): dependencies: acorn: 8.11.2 - /acorn@8.11.2: - resolution: {integrity: sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==} - engines: {node: '>=0.4.0'} - hasBin: true + acorn@8.11.2: {} - /aes-js@3.0.0: - resolution: {integrity: sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==} - dev: true + aes-js@3.0.0: {} - /ajv-formats@2.1.1(ajv@8.12.0): - resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} - peerDependencies: - ajv: ^8.0.0 - peerDependenciesMeta: - ajv: - optional: true - dependencies: + ajv-formats@2.1.1(ajv@8.12.0): + optionalDependencies: ajv: 8.12.0 - dev: true - /ajv@6.12.6: - resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + ajv@6.12.6: dependencies: fast-deep-equal: 3.1.3 fast-json-stable-stringify: 2.1.0 json-schema-traverse: 0.4.1 uri-js: 4.4.1 - dev: true - /ajv@8.12.0: - resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} + ajv@8.12.0: dependencies: fast-deep-equal: 3.1.3 json-schema-traverse: 1.0.0 require-from-string: 2.0.2 uri-js: 4.4.1 - dev: true - /algoliasearch@4.23.3: - resolution: {integrity: sha512-Le/3YgNvjW9zxIQMRhUHuhiUjAlKY/zsdZpfq4dlLqg6mEm0nL6yk+7f2hDOtLpxsgE4jSzDmvHL7nXdBp5feg==} + algoliasearch@4.23.3: dependencies: '@algolia/cache-browser-local-storage': 4.23.3 '@algolia/cache-common': 4.23.3 @@ -1933,222 +4989,127 @@ packages: '@algolia/requester-common': 4.23.3 '@algolia/requester-node-http': 4.23.3 '@algolia/transporter': 4.23.3 - dev: false - /ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} + ansi-regex@5.0.1: {} - /ansi-regex@6.0.1: - resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} - engines: {node: '>=12'} - dev: true + ansi-regex@6.0.1: {} - /ansi-sequence-parser@1.1.1: - resolution: {integrity: sha512-vJXt3yiaUL4UU546s3rPXlsry/RnM730G1+HkpKE012AN0sx1eOrxSu95oKDIonskeLTijMgqWZ3uDEe3NFvyg==} - dev: false + ansi-sequence-parser@1.1.1: {} - /ansi-styles@3.2.1: - resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} - engines: {node: '>=4'} + ansi-styles@3.2.1: dependencies: color-convert: 1.9.3 - /ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} + ansi-styles@4.3.0: dependencies: color-convert: 2.0.1 - /ansi-styles@5.2.0: - resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} - engines: {node: '>=10'} - dev: false + ansi-styles@5.2.0: {} - /ansi-styles@6.2.1: - resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} - engines: {node: '>=12'} - dev: true + ansi-styles@6.2.1: {} - /arch@2.2.0: - resolution: {integrity: sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==} - dev: false + arch@2.2.0: {} - /arg@1.0.0: - resolution: {integrity: sha512-Wk7TEzl1KqvTGs/uyhmHO/3XLd3t1UeU4IstvPXVzGPM522cTjqjNZ99esCkcL52sjqjo8e8CTBcWhkxvGzoAw==} - dev: false + arg@1.0.0: {} - /argparse@1.0.10: - resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + argparse@1.0.10: dependencies: sprintf-js: 1.0.3 - /argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + argparse@2.0.1: {} - /aria-query@5.1.3: - resolution: {integrity: sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==} + aria-query@5.1.3: dependencies: deep-equal: 2.2.3 - dev: false - /array-buffer-byte-length@1.0.0: - resolution: {integrity: sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==} + array-buffer-byte-length@1.0.0: dependencies: call-bind: 1.0.5 is-array-buffer: 3.0.2 - dev: false - /array-timsort@1.0.3: - resolution: {integrity: sha512-/+3GRL7dDAGEfM6TseQk/U+mi18TU2Ms9I3UlLdUMhz2hbvGNTKdj9xniwXfUqgYhHxRx0+8UnKkvlNwVU+cWQ==} - dev: true + array-timsort@1.0.3: {} - /array-union@2.1.0: - resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} - engines: {node: '>=8'} - dev: true + array-union@2.1.0: {} - /assertion-error@1.1.0: - resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} - dev: true + assertion-error@1.1.0: {} - /astring@1.8.6: - resolution: {integrity: sha512-ISvCdHdlTDlH5IpxQJIex7BWBywFWgjJSVdwst+/iQCoEYnyOaQ95+X1JGshuBjGp6nxKUy1jMgE3zPqN7fQdg==} - hasBin: true - dev: false + astring@1.8.6: {} - /available-typed-arrays@1.0.5: - resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==} - engines: {node: '>= 0.4'} - dev: false + available-typed-arrays@1.0.5: {} - /bail@2.0.2: - resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} + bail@2.0.2: {} - /balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - dev: true + balanced-match@1.0.2: {} - /bech32@1.1.4: - resolution: {integrity: sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==} - dev: true + bech32@1.1.4: {} - /big-integer@1.6.52: - resolution: {integrity: sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==} - engines: {node: '>=0.6'} - dev: true + big-integer@1.6.52: {} - /bignumber.js@9.1.2: - resolution: {integrity: sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==} - dev: true + bignumber.js@9.1.2: {} - /bn.js@4.11.6: - resolution: {integrity: sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA==} - dev: true + bn.js@4.11.6: {} - /bn.js@4.12.0: - resolution: {integrity: sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==} - dev: true + bn.js@4.12.0: {} - /bn.js@5.2.1: - resolution: {integrity: sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==} - dev: true + bn.js@5.2.1: {} - /bplist-parser@0.2.0: - resolution: {integrity: sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==} - engines: {node: '>= 5.10.0'} + bplist-parser@0.2.0: dependencies: big-integer: 1.6.52 - dev: true - /brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + brace-expansion@1.1.11: dependencies: balanced-match: 1.0.2 concat-map: 0.0.1 - dev: true - /brace-expansion@2.0.1: - resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + brace-expansion@2.0.1: dependencies: balanced-match: 1.0.2 - dev: true - /braces@3.0.2: - resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} - engines: {node: '>=8'} + braces@3.0.2: dependencies: fill-range: 7.0.1 - /brorand@1.1.0: - resolution: {integrity: sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==} - dev: true + brorand@1.1.0: {} - /buffer-from@1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - dev: true + buffer-from@1.1.2: {} - /buffer-reverse@1.0.1: - resolution: {integrity: sha512-M87YIUBsZ6N924W57vDwT/aOu8hw7ZgdByz6ijksLjmHJELBASmYTTlNHRgjE+pTsT9oJXGaDSgqqwfdHotDUg==} - dev: true + buffer-reverse@1.0.1: {} - /bufio@1.2.1: - resolution: {integrity: sha512-9oR3zNdupcg/Ge2sSHQF3GX+kmvL/fTPvD0nd5AGLq8SjUYnTz+SlFjK/GXidndbZtIj+pVKXiWeR9w6e9wKCA==} - engines: {node: '>=14.0.0'} - dev: true + bufio@1.2.1: {} - /bundle-name@3.0.0: - resolution: {integrity: sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw==} - engines: {node: '>=12'} + bundle-name@3.0.0: dependencies: run-applescript: 5.0.0 - dev: true - /busboy@1.6.0: - resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} - engines: {node: '>=10.16.0'} + busboy@1.6.0: dependencies: streamsearch: 1.1.0 - dev: false - /call-bind@1.0.5: - resolution: {integrity: sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==} + call-bind@1.0.5: dependencies: function-bind: 1.1.2 get-intrinsic: 1.2.2 set-function-length: 1.1.1 - dev: false - /callsites@3.1.0: - resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} - engines: {node: '>=6'} - dev: true + callsites@3.1.0: {} - /camel-case@4.1.2: - resolution: {integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==} + camel-case@4.1.2: dependencies: pascal-case: 3.1.2 tslib: 2.6.2 - dev: false - /caniuse-lite@1.0.30001669: - resolution: {integrity: sha512-DlWzFDJqstqtIVx1zeSpIMLjunf5SmwOw0N2Ck/QSQdS8PLS4+9HrLaYei4w8BIAL7IB/UEDu889d8vhCTPA0w==} - dev: false + caniuse-lite@1.0.30001669: {} - /capital-case@1.0.4: - resolution: {integrity: sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==} + capital-case@1.0.4: dependencies: no-case: 3.0.4 tslib: 2.6.2 upper-case-first: 2.0.2 - dev: false - /ccount@2.0.1: - resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} + ccount@2.0.1: {} - /chai@4.3.10: - resolution: {integrity: sha512-0UXG04VuVbruMUYbJ6JctvH0YnC/4q3/AkT18q4NaITo91CUm0liMS9VqzT9vZhVQ/1eqPanMWjBM+Juhfb/9g==} - engines: {node: '>=4'} + chai@4.3.10: dependencies: assertion-error: 1.1.0 check-error: 1.0.3 @@ -2157,46 +5118,31 @@ packages: loupe: 2.3.7 pathval: 1.1.1 type-detect: 4.0.8 - dev: true - /chalk-template@1.1.0: - resolution: {integrity: sha512-T2VJbcDuZQ0Tb2EWwSotMPJjgpy1/tGee1BTpUNsGZ/qgNjV2t7Mvu+d4600U564nbLesN1x2dPL+xii174Ekg==} - engines: {node: '>=14.16'} + chalk-template@1.1.0: dependencies: chalk: 5.3.0 - dev: true - /chalk@2.3.0: - resolution: {integrity: sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==} - engines: {node: '>=4'} + chalk@2.3.0: dependencies: ansi-styles: 3.2.1 escape-string-regexp: 1.0.5 supports-color: 4.5.0 - dev: false - /chalk@2.4.2: - resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} - engines: {node: '>=4'} + chalk@2.4.2: dependencies: ansi-styles: 3.2.1 escape-string-regexp: 1.0.5 supports-color: 5.5.0 - /chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} + chalk@4.1.2: dependencies: ansi-styles: 4.3.0 supports-color: 7.2.0 - /chalk@5.3.0: - resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - dev: true + chalk@5.3.0: {} - /change-case@4.1.2: - resolution: {integrity: sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A==} + change-case@4.1.2: dependencies: camel-case: 4.1.2 capital-case: 1.0.4 @@ -2210,251 +5156,155 @@ packages: sentence-case: 3.0.4 snake-case: 3.0.4 tslib: 2.6.2 - dev: false - /character-entities-html4@2.1.0: - resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} + character-entities-html4@2.1.0: {} - /character-entities-legacy@1.1.4: - resolution: {integrity: sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==} - dev: true + character-entities-legacy@1.1.4: {} - /character-entities-legacy@3.0.0: - resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} + character-entities-legacy@3.0.0: {} - /character-entities@1.2.4: - resolution: {integrity: sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==} - dev: true + character-entities@1.2.4: {} - /character-entities@2.0.2: - resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} + character-entities@2.0.2: {} - /character-reference-invalid@1.1.4: - resolution: {integrity: sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==} - dev: true + character-reference-invalid@1.1.4: {} - /character-reference-invalid@2.0.1: - resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} + character-reference-invalid@2.0.1: {} - /check-error@1.0.3: - resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} + check-error@1.0.3: dependencies: get-func-name: 2.0.2 - dev: true - /ci-info@3.9.0: - resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} - engines: {node: '>=8'} - dev: true + ci-info@3.9.0: {} - /clear-module@4.1.2: - resolution: {integrity: sha512-LWAxzHqdHsAZlPlEyJ2Poz6AIs384mPeqLVCru2p0BrP9G/kVGuhNyZYClLO6cXlnuJjzC8xtsJIuMjKqLXoAw==} - engines: {node: '>=8'} + clear-module@4.1.2: dependencies: parent-module: 2.0.0 resolve-from: 5.0.0 - dev: true - /client-only@0.0.1: - resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} - dev: false + client-only@0.0.1: {} - /clipboardy@1.2.2: - resolution: {integrity: sha512-16KrBOV7bHmHdxcQiCvfUFYVFyEah4FI8vYT1Fr7CGSA4G+xBWMEfUEQJS1hxeHGtI9ju1Bzs9uXSbj5HZKArw==} - engines: {node: '>=4'} + clipboardy@1.2.2: dependencies: arch: 2.2.0 execa: 0.8.0 - dev: false - /clsx@2.1.1: - resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} - engines: {node: '>=6'} - dev: false + clsx@2.1.1: {} - /color-convert@1.9.3: - resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + color-convert@1.9.3: dependencies: color-name: 1.1.3 - /color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} + color-convert@2.0.1: dependencies: color-name: 1.1.4 - /color-name@1.1.3: - resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + color-name@1.1.3: {} - /color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + color-name@1.1.4: {} - /comma-separated-tokens@2.0.3: - resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} - dev: false + comma-separated-tokens@2.0.3: {} - /commander@11.1.0: - resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==} - engines: {node: '>=16'} - dev: true + commander@11.1.0: {} - /commander@7.2.0: - resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} - engines: {node: '>= 10'} - dev: false + commander@7.2.0: {} - /commander@8.3.0: - resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} - engines: {node: '>= 12'} - dev: false + commander@8.3.0: {} - /comment-json@4.2.3: - resolution: {integrity: sha512-SsxdiOf064DWoZLH799Ata6u7iV658A11PlWtZATDlXPpKGJnbJZ5Z24ybixAi+LUUqJ/GKowAejtC5GFUG7Tw==} - engines: {node: '>= 6'} + comment-json@4.2.3: dependencies: array-timsort: 1.0.3 core-util-is: 1.0.3 esprima: 4.0.1 has-own-prop: 2.0.0 repeat-string: 1.6.1 - dev: true - /compute-scroll-into-view@3.1.0: - resolution: {integrity: sha512-rj8l8pD4bJ1nx+dAkMhV1xB5RuZEyVysfxJqB1pRchh1KVvwOv9b7CGB8ZfjTImVv2oF+sYMUkMZq6Na5Ftmbg==} - dev: false + compute-scroll-into-view@3.1.0: {} - /concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - dev: true + concat-map@0.0.1: {} - /concat-stream@2.0.0: - resolution: {integrity: sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==} - engines: {'0': node >= 6.0} + concat-stream@2.0.0: dependencies: buffer-from: 1.1.2 inherits: 2.0.4 readable-stream: 3.6.2 typedarray: 0.0.6 - dev: true - /configstore@6.0.0: - resolution: {integrity: sha512-cD31W1v3GqUlQvbBCGcXmd2Nj9SvLDOP1oQ0YFuLETufzSPaKp11rYBsSOm7rCsW3OnIRAFM3OxRhceaXNYHkA==} - engines: {node: '>=12'} + configstore@6.0.0: dependencies: dot-prop: 6.0.1 graceful-fs: 4.2.11 unique-string: 3.0.0 write-file-atomic: 3.0.3 xdg-basedir: 5.1.0 - dev: true - /constant-case@3.0.4: - resolution: {integrity: sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ==} + constant-case@3.0.4: dependencies: no-case: 3.0.4 tslib: 2.6.2 upper-case: 2.0.2 - dev: false - /core-util-is@1.0.3: - resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} - dev: true + core-util-is@1.0.3: {} - /cose-base@1.0.3: - resolution: {integrity: sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg==} + cose-base@1.0.3: dependencies: layout-base: 1.0.2 - dev: false - /cose-base@2.2.0: - resolution: {integrity: sha512-AzlgcsCbUMymkADOJtQm3wO9S3ltPfYOFD5033keQn9NJzIbtnZj+UdBJe7DYml/8TdbtHJW3j58SOnKhWY/5g==} + cose-base@2.2.0: dependencies: layout-base: 2.0.1 - dev: false - /cross-spawn@5.1.0: - resolution: {integrity: sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==} + cross-spawn@5.1.0: dependencies: lru-cache: 4.1.5 shebang-command: 1.2.0 which: 1.3.1 - dev: false - /cross-spawn@7.0.3: - resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} - engines: {node: '>= 8'} + cross-spawn@7.0.3: dependencies: path-key: 3.1.1 shebang-command: 2.0.0 which: 2.0.2 - dev: true - /crypto-js@4.2.0: - resolution: {integrity: sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==} - dev: true + crypto-js@4.2.0: {} - /crypto-random-string@4.0.0: - resolution: {integrity: sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==} - engines: {node: '>=12'} + crypto-random-string@4.0.0: dependencies: type-fest: 1.4.0 - dev: true - /cspell-config-lib@8.1.3: - resolution: {integrity: sha512-whzJYxcxos3vnywn0alCFZ+Myc0K/C62pUurfOGhgvIba7ArmlXhNRaL2r5noBxWARtpBOtzz3vrzSBK7Lq6jg==} - engines: {node: '>=18'} + cspell-config-lib@8.1.3: dependencies: '@cspell/cspell-types': 8.1.3 comment-json: 4.2.3 yaml: 2.3.4 - dev: true - /cspell-dictionary@8.1.3: - resolution: {integrity: sha512-nkRQDPNnA6tw+hJFBqq26M0nK306q5rtyv/AUIWa8ZHhQkwzACnpMSpuJA7/DV5GVvPKltMK5M4A6vgfpoaFHw==} - engines: {node: '>=18'} + cspell-dictionary@8.1.3: dependencies: '@cspell/cspell-pipe': 8.1.3 '@cspell/cspell-types': 8.1.3 cspell-trie-lib: 8.1.3 fast-equals: 5.0.1 gensequence: 6.0.0 - dev: true - /cspell-gitignore@8.1.3: - resolution: {integrity: sha512-NHx5lg44eCKb6yJmUPOCz4prcuYowzoo5GJ5hOcCfbk7ZEBWV1E2/kDRuQMOK2W0y1hNGr45CSxO3UxWJlYg7w==} - engines: {node: '>=18'} - hasBin: true + cspell-gitignore@8.1.3: dependencies: cspell-glob: 8.1.3 find-up-simple: 1.0.0 - dev: true - /cspell-glob@8.1.3: - resolution: {integrity: sha512-Likr7UVUXBpthQnM5r6yao3X0YBNRbJ9AHWXTC2RJfzwZOFKF+pKPfeo3FU+Px8My96M4RC2bVMbrbZUwN5NJw==} - engines: {node: '>=18'} + cspell-glob@8.1.3: dependencies: micromatch: 4.0.5 - dev: true - /cspell-grammar@8.1.3: - resolution: {integrity: sha512-dTOwNq6a5wcVzOsi4xY5/tq2r2w/+wLVU+WfyySTsPe66Rjqx/QceFl4OinImks/ZMKF7Zyjd3WGyQ5TcSsJFQ==} - engines: {node: '>=18'} - hasBin: true + cspell-grammar@8.1.3: dependencies: '@cspell/cspell-pipe': 8.1.3 '@cspell/cspell-types': 8.1.3 - dev: true - /cspell-io@8.1.3: - resolution: {integrity: sha512-QkcFeYd79oIl7PgSqFSZyvwXnZQhXmdCI733n54IN2+iXDcf7W0mwptxoC/cE19RkEwAwEFLG81UAy6L/BXI6A==} - engines: {node: '>=18'} + cspell-io@8.1.3: dependencies: '@cspell/cspell-service-bus': 8.1.3 - dev: true - /cspell-lib@8.1.3: - resolution: {integrity: sha512-Kk8bpHVkDZO4MEiPkDvRf/LgJ0h5mufbKLTWModq6k0Ca8EkZ/qgQlZ0ve0rIivbleSqebuWjpJHKDM+IHmzHA==} - engines: {node: '>=18'} + cspell-lib@8.1.3: dependencies: '@cspell/cspell-bundled-dicts': 8.1.3 '@cspell/cspell-pipe': 8.1.3 @@ -2477,21 +5327,14 @@ packages: resolve-from: 5.0.0 vscode-languageserver-textdocument: 1.0.11 vscode-uri: 3.0.8 - dev: true - /cspell-trie-lib@8.1.3: - resolution: {integrity: sha512-EDSYU9MCtzPSJDrfvDrTKmc0rzl50Ehjg1c5rUCqn33p2LCRe/G8hW0FxXe0mxrZxrMO2b8l0PVSGlrCXCQ8RQ==} - engines: {node: '>=18'} + cspell-trie-lib@8.1.3: dependencies: '@cspell/cspell-pipe': 8.1.3 '@cspell/cspell-types': 8.1.3 gensequence: 6.0.0 - dev: true - /cspell@8.1.3: - resolution: {integrity: sha512-SU4Su6002bPoJYaiMeNV4wwLoS8TwaOgIwaTxhys3GDbJIxZV6CrDgwksezHcG7TZrC4yrveDVsdpnrzmQ7T5Q==} - engines: {node: '>=18'} - hasBin: true + cspell@8.1.3: dependencies: '@cspell/cspell-json-reporter': 8.1.3 '@cspell/cspell-pipe': 8.1.3 @@ -2511,253 +5354,142 @@ packages: semver: 7.5.4 strip-ansi: 7.1.0 vscode-uri: 3.0.8 - dev: true - /csstype@3.1.2: - resolution: {integrity: sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==} - dev: false + csstype@3.1.2: {} - /cytoscape-cose-bilkent@4.1.0(cytoscape@3.27.0): - resolution: {integrity: sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ==} - peerDependencies: - cytoscape: ^3.2.0 + cytoscape-cose-bilkent@4.1.0(cytoscape@3.27.0): dependencies: cose-base: 1.0.3 cytoscape: 3.27.0 - dev: false - /cytoscape-fcose@2.2.0(cytoscape@3.27.0): - resolution: {integrity: sha512-ki1/VuRIHFCzxWNrsshHYPs6L7TvLu3DL+TyIGEsRcvVERmxokbf5Gdk7mFxZnTdiGtnA4cfSmjZJMviqSuZrQ==} - peerDependencies: - cytoscape: ^3.2.0 + cytoscape-fcose@2.2.0(cytoscape@3.27.0): dependencies: cose-base: 2.2.0 cytoscape: 3.27.0 - dev: false - /cytoscape@3.27.0: - resolution: {integrity: sha512-pPZJilfX9BxESwujODz5pydeGi+FBrXq1rcaB1mfhFXXFJ9GjE6CNndAk+8jPzoXGD+16LtSS4xlYEIUiW4Abg==} - engines: {node: '>=0.10'} + cytoscape@3.27.0: dependencies: heap: 0.2.7 lodash: 4.17.21 - dev: false - /d3-array@2.12.1: - resolution: {integrity: sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==} + d3-array@2.12.1: dependencies: internmap: 1.0.1 - dev: false - /d3-array@3.2.4: - resolution: {integrity: sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==} - engines: {node: '>=12'} + d3-array@3.2.4: dependencies: internmap: 2.0.3 - dev: false - /d3-axis@3.0.0: - resolution: {integrity: sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==} - engines: {node: '>=12'} - dev: false + d3-axis@3.0.0: {} - /d3-brush@3.0.0: - resolution: {integrity: sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==} - engines: {node: '>=12'} + d3-brush@3.0.0: dependencies: d3-dispatch: 3.0.1 d3-drag: 3.0.0 d3-interpolate: 3.0.1 d3-selection: 3.0.0 d3-transition: 3.0.1(d3-selection@3.0.0) - dev: false - /d3-chord@3.0.1: - resolution: {integrity: sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==} - engines: {node: '>=12'} + d3-chord@3.0.1: dependencies: d3-path: 3.1.0 - dev: false - /d3-color@3.1.0: - resolution: {integrity: sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==} - engines: {node: '>=12'} - dev: false + d3-color@3.1.0: {} - /d3-contour@4.0.2: - resolution: {integrity: sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==} - engines: {node: '>=12'} + d3-contour@4.0.2: dependencies: d3-array: 3.2.4 - dev: false - /d3-delaunay@6.0.4: - resolution: {integrity: sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==} - engines: {node: '>=12'} + d3-delaunay@6.0.4: dependencies: delaunator: 5.0.0 - dev: false - /d3-dispatch@3.0.1: - resolution: {integrity: sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==} - engines: {node: '>=12'} - dev: false + d3-dispatch@3.0.1: {} - /d3-drag@3.0.0: - resolution: {integrity: sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==} - engines: {node: '>=12'} + d3-drag@3.0.0: dependencies: d3-dispatch: 3.0.1 d3-selection: 3.0.0 - dev: false - /d3-dsv@3.0.1: - resolution: {integrity: sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==} - engines: {node: '>=12'} - hasBin: true + d3-dsv@3.0.1: dependencies: commander: 7.2.0 iconv-lite: 0.6.3 rw: 1.3.3 - dev: false - /d3-ease@3.0.1: - resolution: {integrity: sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==} - engines: {node: '>=12'} - dev: false + d3-ease@3.0.1: {} - /d3-fetch@3.0.1: - resolution: {integrity: sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==} - engines: {node: '>=12'} + d3-fetch@3.0.1: dependencies: d3-dsv: 3.0.1 - dev: false - /d3-force@3.0.0: - resolution: {integrity: sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==} - engines: {node: '>=12'} + d3-force@3.0.0: dependencies: d3-dispatch: 3.0.1 d3-quadtree: 3.0.1 d3-timer: 3.0.1 - dev: false - /d3-format@3.1.0: - resolution: {integrity: sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==} - engines: {node: '>=12'} - dev: false + d3-format@3.1.0: {} - /d3-geo@3.1.0: - resolution: {integrity: sha512-JEo5HxXDdDYXCaWdwLRt79y7giK8SbhZJbFWXqbRTolCHFI5jRqteLzCsq51NKbUoX0PjBVSohxrx+NoOUujYA==} - engines: {node: '>=12'} + d3-geo@3.1.0: dependencies: d3-array: 3.2.4 - dev: false - /d3-hierarchy@3.1.2: - resolution: {integrity: sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==} - engines: {node: '>=12'} - dev: false + d3-hierarchy@3.1.2: {} - /d3-interpolate@3.0.1: - resolution: {integrity: sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==} - engines: {node: '>=12'} + d3-interpolate@3.0.1: dependencies: d3-color: 3.1.0 - dev: false - /d3-path@1.0.9: - resolution: {integrity: sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==} - dev: false + d3-path@1.0.9: {} - /d3-path@3.1.0: - resolution: {integrity: sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==} - engines: {node: '>=12'} - dev: false + d3-path@3.1.0: {} - /d3-polygon@3.0.1: - resolution: {integrity: sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==} - engines: {node: '>=12'} - dev: false + d3-polygon@3.0.1: {} - /d3-quadtree@3.0.1: - resolution: {integrity: sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==} - engines: {node: '>=12'} - dev: false + d3-quadtree@3.0.1: {} - /d3-random@3.0.1: - resolution: {integrity: sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==} - engines: {node: '>=12'} - dev: false + d3-random@3.0.1: {} - /d3-sankey@0.12.3: - resolution: {integrity: sha512-nQhsBRmM19Ax5xEIPLMY9ZmJ/cDvd1BG3UVvt5h3WRxKg5zGRbvnteTyWAbzeSvlh3tW7ZEmq4VwR5mB3tutmQ==} + d3-sankey@0.12.3: dependencies: d3-array: 2.12.1 d3-shape: 1.3.7 - dev: false - /d3-scale-chromatic@3.0.0: - resolution: {integrity: sha512-Lx9thtxAKrO2Pq6OO2Ua474opeziKr279P/TKZsMAhYyNDD3EnCffdbgeSYN5O7m2ByQsxtuP2CSDczNUIZ22g==} - engines: {node: '>=12'} + d3-scale-chromatic@3.0.0: dependencies: d3-color: 3.1.0 d3-interpolate: 3.0.1 - dev: false - /d3-scale@4.0.2: - resolution: {integrity: sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==} - engines: {node: '>=12'} + d3-scale@4.0.2: dependencies: d3-array: 3.2.4 d3-format: 3.1.0 d3-interpolate: 3.0.1 d3-time: 3.1.0 d3-time-format: 4.1.0 - dev: false - /d3-selection@3.0.0: - resolution: {integrity: sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==} - engines: {node: '>=12'} - dev: false + d3-selection@3.0.0: {} - /d3-shape@1.3.7: - resolution: {integrity: sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==} + d3-shape@1.3.7: dependencies: d3-path: 1.0.9 - dev: false - /d3-shape@3.2.0: - resolution: {integrity: sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==} - engines: {node: '>=12'} + d3-shape@3.2.0: dependencies: d3-path: 3.1.0 - dev: false - /d3-time-format@4.1.0: - resolution: {integrity: sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==} - engines: {node: '>=12'} + d3-time-format@4.1.0: dependencies: d3-time: 3.1.0 - dev: false - /d3-time@3.1.0: - resolution: {integrity: sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==} - engines: {node: '>=12'} + d3-time@3.1.0: dependencies: d3-array: 3.2.4 - dev: false - /d3-timer@3.0.1: - resolution: {integrity: sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==} - engines: {node: '>=12'} - dev: false + d3-timer@3.0.1: {} - /d3-transition@3.0.1(d3-selection@3.0.0): - resolution: {integrity: sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==} - engines: {node: '>=12'} - peerDependencies: - d3-selection: 2 - 3 + d3-transition@3.0.1(d3-selection@3.0.0): dependencies: d3-color: 3.1.0 d3-dispatch: 3.0.1 @@ -2765,22 +5497,16 @@ packages: d3-interpolate: 3.0.1 d3-selection: 3.0.0 d3-timer: 3.0.1 - dev: false - /d3-zoom@3.0.0: - resolution: {integrity: sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==} - engines: {node: '>=12'} + d3-zoom@3.0.0: dependencies: d3-dispatch: 3.0.1 d3-drag: 3.0.0 d3-interpolate: 3.0.1 d3-selection: 3.0.0 d3-transition: 3.0.1(d3-selection@3.0.0) - dev: false - /d3@7.8.5: - resolution: {integrity: sha512-JgoahDG51ncUfJu6wX/1vWQEqOflgXyl4MaHqlcSruTez7yhaRKR9i8VjjcQGeS2en/jnFivXuaIMnseMMt0XA==} - engines: {node: '>=12'} + d3@7.8.5: dependencies: d3-array: 3.2.4 d3-axis: 3.0.0 @@ -2812,45 +5538,27 @@ packages: d3-timer: 3.0.1 d3-transition: 3.0.1(d3-selection@3.0.0) d3-zoom: 3.0.0 - dev: false - /dagre-d3-es@7.0.10: - resolution: {integrity: sha512-qTCQmEhcynucuaZgY5/+ti3X/rnszKZhEQH/ZdWdtP1tA/y3VoHJzcVrO9pjjJCNpigfscAtoUB5ONcd2wNn0A==} + dagre-d3-es@7.0.10: dependencies: d3: 7.8.5 lodash-es: 4.17.21 - dev: false - /dayjs@1.11.10: - resolution: {integrity: sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==} - dev: false + dayjs@1.11.10: {} - /debug@4.3.4: - resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true + debug@4.3.4: dependencies: ms: 2.1.2 - /decode-named-character-reference@1.0.2: - resolution: {integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==} + decode-named-character-reference@1.0.2: dependencies: character-entities: 2.0.2 - /deep-eql@4.1.3: - resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} - engines: {node: '>=6'} + deep-eql@4.1.3: dependencies: type-detect: 4.0.8 - dev: true - /deep-equal@2.2.3: - resolution: {integrity: sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==} - engines: {node: '>= 0.4'} + deep-equal@2.2.3: dependencies: array-buffer-byte-length: 1.0.0 call-bind: 1.0.5 @@ -2870,118 +5578,73 @@ packages: which-boxed-primitive: 1.0.2 which-collection: 1.0.1 which-typed-array: 1.1.13 - dev: false - /deep-is@0.1.4: - resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} - dev: true + deep-is@0.1.4: {} - /default-browser-id@3.0.0: - resolution: {integrity: sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==} - engines: {node: '>=12'} + default-browser-id@3.0.0: dependencies: bplist-parser: 0.2.0 untildify: 4.0.0 - dev: true - /default-browser@4.0.0: - resolution: {integrity: sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA==} - engines: {node: '>=14.16'} + default-browser@4.0.0: dependencies: bundle-name: 3.0.0 default-browser-id: 3.0.0 execa: 7.2.0 titleize: 3.0.0 - dev: true - /define-data-property@1.1.1: - resolution: {integrity: sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==} - engines: {node: '>= 0.4'} + define-data-property@1.1.1: dependencies: get-intrinsic: 1.2.2 gopd: 1.0.1 has-property-descriptors: 1.0.1 - dev: false - /define-lazy-prop@3.0.0: - resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} - engines: {node: '>=12'} - dev: true + define-lazy-prop@3.0.0: {} - /define-properties@1.2.1: - resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} - engines: {node: '>= 0.4'} + define-properties@1.2.1: dependencies: define-data-property: 1.1.1 has-property-descriptors: 1.0.1 object-keys: 1.1.1 - dev: false - /delaunator@5.0.0: - resolution: {integrity: sha512-AyLvtyJdbv/U1GkiS6gUUzclRoAY4Gs75qkMygJJhU75LW4DNuSF2RMzpxs9jw9Oz1BobHjTdkG3zdP55VxAqw==} + delaunator@5.0.0: dependencies: robust-predicates: 3.0.2 - dev: false - /dequal@2.0.3: - resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} - engines: {node: '>=6'} + dequal@2.0.3: {} - /devlop@1.1.0: - resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + devlop@1.1.0: dependencies: dequal: 2.0.3 - /diff@5.1.0: - resolution: {integrity: sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==} - engines: {node: '>=0.3.1'} + diff@5.1.0: {} - /dir-glob@3.0.1: - resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} - engines: {node: '>=8'} + dir-glob@3.0.1: dependencies: path-type: 4.0.0 - dev: true - /doctrine@3.0.0: - resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} - engines: {node: '>=6.0.0'} + doctrine@3.0.0: dependencies: esutils: 2.0.3 - dev: true - /dom-accessibility-api@0.5.16: - resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==} - dev: false + dom-accessibility-api@0.5.16: {} - /dompurify@3.0.6: - resolution: {integrity: sha512-ilkD8YEnnGh1zJ240uJsW7AzE+2qpbOUYjacomn3AvJ6J4JhKGSZ2nh4wUIXPZrEPppaCLx5jFe8T89Rk8tQ7w==} - dev: false + dompurify@3.0.6: {} - /dot-case@3.0.4: - resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} + dot-case@3.0.4: dependencies: no-case: 3.0.4 tslib: 2.6.2 - dev: false - /dot-prop@6.0.1: - resolution: {integrity: sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==} - engines: {node: '>=10'} + dot-prop@6.0.1: dependencies: is-obj: 2.0.0 - dev: true - /eastasianwidth@0.2.0: - resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - dev: true + eastasianwidth@0.2.0: {} - /elkjs@0.8.2: - resolution: {integrity: sha512-L6uRgvZTH+4OF5NE/MBbzQx/WYpru1xCBE9respNj6qznEewGUIfhzmm7horWWxbNO2M0WckQypGctR8lH79xQ==} - dev: false + elkjs@0.8.2: {} - /elliptic@6.5.4: - resolution: {integrity: sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==} + elliptic@6.5.4: dependencies: bn.js: 4.12.0 brorand: 1.1.0 @@ -2990,33 +5653,20 @@ packages: inherits: 2.0.4 minimalistic-assert: 1.0.1 minimalistic-crypto-utils: 1.0.1 - dev: true - /emoji-regex@10.3.0: - resolution: {integrity: sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==} - dev: true + emoji-regex@10.3.0: {} - /emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - dev: true + emoji-regex@8.0.0: {} - /emoji-regex@9.2.2: - resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} - dev: true + emoji-regex@9.2.2: {} - /entities@4.5.0: - resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} - engines: {node: '>=0.12'} - dev: false + entities@4.5.0: {} - /error-ex@1.3.2: - resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + error-ex@1.3.2: dependencies: is-arrayish: 0.2.1 - dev: true - /es-get-iterator@1.1.3: - resolution: {integrity: sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==} + es-get-iterator@1.1.3: dependencies: call-bind: 1.0.5 get-intrinsic: 1.2.2 @@ -3027,26 +5677,14 @@ packages: is-string: 1.0.7 isarray: 2.0.5 stop-iteration-iterator: 1.0.0 - dev: false - /escape-string-regexp@1.0.5: - resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} - engines: {node: '>=0.8.0'} + escape-string-regexp@1.0.5: {} - /escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} - dev: true + escape-string-regexp@4.0.0: {} - /escape-string-regexp@5.0.0: - resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} - engines: {node: '>=12'} + escape-string-regexp@5.0.0: {} - /eslint-mdx@2.2.0(eslint@8.54.0): - resolution: {integrity: sha512-AriN6lCW6KhWQ9GEiXapR1DokKHefOUqKvCmHxnE9puCWYhWiycU2SNKH8jmrasDBreZ+RtJDLi+RcUNLJatjg==} - engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} - peerDependencies: - eslint: '>=8.0.0' + eslint-mdx@2.2.0(eslint@8.54.0): dependencies: acorn: 8.11.2 acorn-jsx: 5.3.2(acorn@8.11.2) @@ -3065,25 +5703,15 @@ packages: vfile: 5.3.7 transitivePeerDependencies: - supports-color - dev: true - /eslint-plugin-markdown@3.0.1(eslint@8.54.0): - resolution: {integrity: sha512-8rqoc148DWdGdmYF6WSQFT3uQ6PO7zXYgeBpHAOAakX/zpq+NvFYbDA/H7PYzHajwtmaOzAwfxyl++x0g1/N9A==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + eslint-plugin-markdown@3.0.1(eslint@8.54.0): dependencies: eslint: 8.54.0 mdast-util-from-markdown: 0.8.5 transitivePeerDependencies: - supports-color - dev: true - /eslint-plugin-mdx@2.2.0(eslint@8.54.0): - resolution: {integrity: sha512-OseoMXUIr8iy3E0me+wJLVAxuB0kxHP1plxuYAJDynzorzOj2OKv8Fhr+rIOJ32zfl3bnEWsqFnUiCnyznr1JQ==} - engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} - peerDependencies: - eslint: '>=8.0.0' + eslint-plugin-mdx@2.2.0(eslint@8.54.0): dependencies: eslint: 8.54.0 eslint-mdx: 2.2.0(eslint@8.54.0) @@ -3096,25 +5724,15 @@ packages: vfile: 5.3.7 transitivePeerDependencies: - supports-color - dev: true - /eslint-scope@7.2.2: - resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + eslint-scope@7.2.2: dependencies: esrecurse: 4.3.0 estraverse: 5.3.0 - dev: true - /eslint-visitor-keys@3.4.3: - resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dev: true + eslint-visitor-keys@3.4.3: {} - /eslint@8.54.0: - resolution: {integrity: sha512-NY0DfAkM8BIZDVl6PgSa1ttZbx3xHgJzSNJKYcQglem6CppHyMhRIQkBVSSMaSRnLhig3jsDbEzOjwCVt4AmmA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - hasBin: true + eslint@8.54.0: dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.54.0) '@eslint-community/regexpp': 4.10.0 @@ -3156,107 +5774,70 @@ packages: text-table: 0.2.0 transitivePeerDependencies: - supports-color - dev: true - /espree@9.6.1: - resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + espree@9.6.1: dependencies: acorn: 8.11.2 acorn-jsx: 5.3.2(acorn@8.11.2) eslint-visitor-keys: 3.4.3 - dev: true - /esprima@4.0.1: - resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} - engines: {node: '>=4'} - hasBin: true + esprima@4.0.1: {} - /esquery@1.5.0: - resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} - engines: {node: '>=0.10'} + esquery@1.5.0: dependencies: estraverse: 5.3.0 - dev: true - /esrecurse@4.3.0: - resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} - engines: {node: '>=4.0'} + esrecurse@4.3.0: dependencies: estraverse: 5.3.0 - dev: true - /estraverse@5.3.0: - resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} - engines: {node: '>=4.0'} - dev: true + estraverse@5.3.0: {} - /estree-util-attach-comments@2.1.1: - resolution: {integrity: sha512-+5Ba/xGGS6mnwFbXIuQiDPTbuTxuMCooq3arVv7gPZtYpjp+VXH/NkHAP35OOefPhNG/UGqU3vt/LTABwcHX0w==} + estree-util-attach-comments@2.1.1: dependencies: '@types/estree': 1.0.5 - dev: false - /estree-util-build-jsx@2.2.2: - resolution: {integrity: sha512-m56vOXcOBuaF+Igpb9OPAy7f9w9OIkb5yhjsZuaPm7HoGi4oTOQi0h2+yZ+AtKklYFZ+rPC4n0wYCJCEU1ONqg==} + estree-util-build-jsx@2.2.2: dependencies: '@types/estree-jsx': 1.0.3 estree-util-is-identifier-name: 2.1.0 estree-walker: 3.0.3 - dev: false - /estree-util-is-identifier-name@2.1.0: - resolution: {integrity: sha512-bEN9VHRyXAUOjkKVQVvArFym08BTWB0aJPppZZr0UNyAqWsLaVfAqP7hbaTJjzHifmB5ebnR8Wm7r7yGN/HonQ==} + estree-util-is-identifier-name@2.1.0: {} - /estree-util-to-js@1.2.0: - resolution: {integrity: sha512-IzU74r1PK5IMMGZXUVZbmiu4A1uhiPgW5hm1GjcOfr4ZzHaMPpLNJjR7HjXiIOzi25nZDrgFTobHTkV5Q6ITjA==} + estree-util-to-js@1.2.0: dependencies: '@types/estree-jsx': 1.0.3 astring: 1.8.6 source-map: 0.7.4 - dev: false - /estree-util-value-to-estree@1.3.0: - resolution: {integrity: sha512-Y+ughcF9jSUJvncXwqRageavjrNPAI+1M/L3BI3PyLp1nmgYTGUXU6t5z1Y7OWuThoDdhPME07bQU+d5LxdJqw==} - engines: {node: '>=12.0.0'} + estree-util-value-to-estree@1.3.0: dependencies: is-plain-obj: 3.0.0 - dev: false - /estree-util-visit@1.2.1: - resolution: {integrity: sha512-xbgqcrkIVbIG+lI/gzbvd9SGTJL4zqJKBFttUl5pP27KhAjtMKbX/mQXJ7qgyXpMgVy/zvpm0xoQQaGL8OloOw==} + estree-util-visit@1.2.1: dependencies: '@types/estree-jsx': 1.0.3 '@types/unist': 2.0.9 - /estree-walker@3.0.3: - resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + estree-walker@3.0.3: dependencies: '@types/estree': 1.0.5 - dev: false - /esutils@2.0.3: - resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} - engines: {node: '>=0.10.0'} - dev: true + esutils@2.0.3: {} - /ethereum-bloom-filters@1.0.10: - resolution: {integrity: sha512-rxJ5OFN3RwjQxDcFP2Z5+Q9ho4eIdEmSc2ht0fCu8Se9nbXjZ7/031uXoUYJ87KHCOdVeiUuwSnoS7hmYAGVHA==} + ethereum-bloom-filters@1.0.10: dependencies: js-sha3: 0.8.0 - dev: true - /ethereum-cryptography@2.1.2: - resolution: {integrity: sha512-Z5Ba0T0ImZ8fqXrJbpHcbpAvIswRte2wGNR/KePnu8GbbvgJ47lMxT/ZZPG6i9Jaht4azPDop4HaM00J0J59ug==} + ethereum-cryptography@2.1.2: dependencies: '@noble/curves': 1.1.0 '@noble/hashes': 1.3.1 '@scure/bip32': 1.3.1 '@scure/bip39': 1.2.1 - dev: true - /ethers@5.7.2: - resolution: {integrity: sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==} + ethers@5.7.2: dependencies: '@ethersproject/abi': 5.7.0 '@ethersproject/abstract-provider': 5.7.0 @@ -3291,19 +5872,13 @@ packages: transitivePeerDependencies: - bufferutil - utf-8-validate - dev: true - /ethjs-unit@0.1.6: - resolution: {integrity: sha512-/Sn9Y0oKl0uqQuvgFk/zQgR7aw1g36qX/jzSQ5lSwlO0GigPymk4eGQfeNTD03w1dPOqfz8V77Cy43jH56pagw==} - engines: {node: '>=6.5.0', npm: '>=3'} + ethjs-unit@0.1.6: dependencies: bn.js: 4.11.6 number-to-bn: 1.7.0 - dev: true - /execa@0.8.0: - resolution: {integrity: sha512-zDWS+Rb1E8BlqqhALSt9kUhss8Qq4nN3iof3gsOdyINksElaPyNBtKUMTR62qhvgVWR0CqCX7sdnKe4MnUbFEA==} - engines: {node: '>=4'} + execa@0.8.0: dependencies: cross-spawn: 5.1.0 get-stream: 3.0.0 @@ -3312,11 +5887,8 @@ packages: p-finally: 1.0.0 signal-exit: 3.0.7 strip-eof: 1.0.0 - dev: false - /execa@5.1.1: - resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} - engines: {node: '>=10'} + execa@5.1.1: dependencies: cross-spawn: 7.0.3 get-stream: 6.0.1 @@ -3327,11 +5899,8 @@ packages: onetime: 5.1.2 signal-exit: 3.0.7 strip-final-newline: 2.0.0 - dev: true - /execa@7.2.0: - resolution: {integrity: sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==} - engines: {node: ^14.18.0 || ^16.14.0 || >=18.0.0} + execa@7.2.0: dependencies: cross-spawn: 7.0.3 get-stream: 6.0.1 @@ -3342,29 +5911,18 @@ packages: onetime: 6.0.0 signal-exit: 3.0.7 strip-final-newline: 3.0.0 - dev: true - /extend-shallow@2.0.1: - resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} - engines: {node: '>=0.10.0'} + extend-shallow@2.0.1: dependencies: is-extendable: 0.1.1 - /extend@3.0.2: - resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + extend@3.0.2: {} - /fast-deep-equal@3.1.3: - resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - dev: true + fast-deep-equal@3.1.3: {} - /fast-equals@5.0.1: - resolution: {integrity: sha512-WF1Wi8PwwSY7/6Kx0vKXtw8RwuSGoM1bvDaJbu7MxDlR1vovZjIAKrnzyrThgAjm6JDTu0fVgWXDlMGspodfoQ==} - engines: {node: '>=6.0.0'} - dev: true + fast-equals@5.0.1: {} - /fast-glob@3.3.2: - resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} - engines: {node: '>=8.6.0'} + fast-glob@3.3.2: dependencies: '@nodelib/fs.stat': 2.0.5 '@nodelib/fs.walk': 1.2.8 @@ -3372,199 +5930,118 @@ packages: merge2: 1.4.1 micromatch: 4.0.5 - /fast-json-stable-stringify@2.1.0: - resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} - dev: true + fast-json-stable-stringify@2.1.0: {} - /fast-levenshtein@2.0.6: - resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - dev: true + fast-levenshtein@2.0.6: {} - /fastq@1.15.0: - resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} + fastq@1.15.0: dependencies: reusify: 1.0.4 - /fault@2.0.1: - resolution: {integrity: sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ==} + fault@2.0.1: dependencies: format: 0.2.2 - dev: true - /file-entry-cache@6.0.1: - resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} - engines: {node: ^10.12.0 || >=12.0.0} + file-entry-cache@6.0.1: dependencies: flat-cache: 3.2.0 - dev: true - /file-entry-cache@7.0.2: - resolution: {integrity: sha512-TfW7/1iI4Cy7Y8L6iqNdZQVvdXn0f8B4QcIXmkIbtTIe/Okm/nSlHb4IwGzRVOd3WfSieCgvf5cMzEfySAIl0g==} - engines: {node: '>=12.0.0'} + file-entry-cache@7.0.2: dependencies: flat-cache: 3.2.0 - dev: true - /fill-range@7.0.1: - resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} - engines: {node: '>=8'} + fill-range@7.0.1: dependencies: to-regex-range: 5.0.1 - /find-up-simple@1.0.0: - resolution: {integrity: sha512-q7Us7kcjj2VMePAa02hDAF6d+MzsdsAWEwYyOpwUtlerRBkOEPBCRZrAV4XfcSN8fHAgaD0hP7miwoay6DCprw==} - engines: {node: '>=18'} - dev: true + find-up-simple@1.0.0: {} - /find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} + find-up@5.0.0: dependencies: locate-path: 6.0.0 path-exists: 4.0.0 - dev: true - /find-up@6.3.0: - resolution: {integrity: sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + find-up@6.3.0: dependencies: locate-path: 7.2.0 path-exists: 5.0.0 - dev: true - /flat-cache@3.2.0: - resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} - engines: {node: ^10.12.0 || >=12.0.0} + flat-cache@3.2.0: dependencies: flatted: 3.2.9 keyv: 4.5.4 rimraf: 3.0.2 - dev: true - /flatted@3.2.9: - resolution: {integrity: sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==} - dev: true + flatted@3.2.9: {} - /flexsearch@0.7.31: - resolution: {integrity: sha512-XGozTsMPYkm+6b5QL3Z9wQcJjNYxp0CYn3U1gO7dwD6PAqU1SVWZxI9CCg3z+ml3YfqdPnrBehaBrnH2AGKbNA==} - dev: false + flexsearch@0.7.31: {} - /focus-visible@5.2.0: - resolution: {integrity: sha512-Rwix9pBtC1Nuy5wysTmKy+UjbDJpIfg8eHjw0rjZ1mX4GNLz1Bmd16uDpI3Gk1i70Fgcs8Csg2lPm8HULFg9DQ==} - dev: false + focus-visible@5.2.0: {} - /for-each@0.3.3: - resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} + for-each@0.3.3: dependencies: is-callable: 1.2.7 - dev: false - /foreground-child@3.1.1: - resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} - engines: {node: '>=14'} + foreground-child@3.1.1: dependencies: cross-spawn: 7.0.3 signal-exit: 4.1.0 - dev: true - /format@0.2.2: - resolution: {integrity: sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==} - engines: {node: '>=0.4.x'} - dev: true + format@0.2.2: {} - /fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - dev: true + fs.realpath@1.0.0: {} - /function-bind@1.1.2: - resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - dev: false + function-bind@1.1.2: {} - /functions-have-names@1.2.3: - resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} - dev: false + functions-have-names@1.2.3: {} - /gensequence@6.0.0: - resolution: {integrity: sha512-8WwuywE9pokJRAcg2QFR/plk3cVPebSUqRPzpGQh3WQ0wIiHAw+HyOQj5IuHyUTQBHpBKFoB2JUMu9zT3vJ16Q==} - engines: {node: '>=16'} - dev: true + gensequence@6.0.0: {} - /get-func-name@2.0.2: - resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} - dev: true + get-func-name@2.0.2: {} - /get-intrinsic@1.2.2: - resolution: {integrity: sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==} + get-intrinsic@1.2.2: dependencies: function-bind: 1.1.2 has-proto: 1.0.1 has-symbols: 1.0.3 hasown: 2.0.0 - dev: false - /get-stdin@9.0.0: - resolution: {integrity: sha512-dVKBjfWisLAicarI2Sf+JuBE/DghV4UzNAVe9yhEJuzeREd3JhOTE9cUaJTeSa77fsbQUK3pcOpJfM59+VKZaA==} - engines: {node: '>=12'} - dev: true + get-stdin@9.0.0: {} - /get-stream@3.0.0: - resolution: {integrity: sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==} - engines: {node: '>=4'} - dev: false + get-stream@3.0.0: {} - /get-stream@6.0.1: - resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} - engines: {node: '>=10'} - dev: true + get-stream@6.0.1: {} - /git-up@7.0.0: - resolution: {integrity: sha512-ONdIrbBCFusq1Oy0sC71F5azx8bVkvtZtMJAsv+a6lz5YAmbNnLD6HAB4gptHZVLPR8S2/kVN6Gab7lryq5+lQ==} + git-up@7.0.0: dependencies: is-ssh: 1.4.0 parse-url: 8.1.0 - dev: false - /git-url-parse@13.1.1: - resolution: {integrity: sha512-PCFJyeSSdtnbfhSNRw9Wk96dDCNx+sogTe4YNXeXSJxt7xz5hvXekuRn9JX7m+Mf4OscCu8h+mtAl3+h5Fo8lQ==} + git-url-parse@13.1.1: dependencies: git-up: 7.0.0 - dev: false - /github-slugger@1.5.0: - resolution: {integrity: sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw==} - dev: true + github-slugger@1.5.0: {} - /github-slugger@2.0.0: - resolution: {integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==} - dev: false + github-slugger@2.0.0: {} - /glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} + glob-parent@5.1.2: dependencies: is-glob: 4.0.3 - /glob-parent@6.0.2: - resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} - engines: {node: '>=10.13.0'} + glob-parent@6.0.2: dependencies: is-glob: 4.0.3 - dev: true - /glob@10.3.10: - resolution: {integrity: sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==} - engines: {node: '>=16 || 14 >=14.17'} - hasBin: true + glob@10.3.10: dependencies: foreground-child: 3.1.1 jackspeak: 2.3.6 minimatch: 9.0.3 minipass: 7.0.4 path-scurry: 1.10.1 - dev: true - /glob@7.2.3: - resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + glob@7.2.3: dependencies: fs.realpath: 1.0.0 inflight: 1.0.6 @@ -3572,36 +6049,24 @@ packages: minimatch: 3.1.2 once: 1.4.0 path-is-absolute: 1.0.1 - dev: true - /glob@8.1.0: - resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} - engines: {node: '>=12'} + glob@8.1.0: dependencies: fs.realpath: 1.0.0 inflight: 1.0.6 inherits: 2.0.4 minimatch: 5.1.6 once: 1.4.0 - dev: true - /global-directory@4.0.1: - resolution: {integrity: sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==} - engines: {node: '>=18'} + global-directory@4.0.1: dependencies: ini: 4.1.1 - dev: true - /globals@13.23.0: - resolution: {integrity: sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==} - engines: {node: '>=8'} + globals@13.23.0: dependencies: type-fest: 0.20.2 - dev: true - /globby@11.0.4: - resolution: {integrity: sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==} - engines: {node: '>=10'} + globby@11.0.4: dependencies: array-union: 2.1.0 dir-glob: 3.0.1 @@ -3609,117 +6074,73 @@ packages: ignore: 5.3.0 merge2: 1.4.1 slash: 3.0.0 - dev: true - /gopd@1.0.1: - resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + gopd@1.0.1: dependencies: get-intrinsic: 1.2.2 - dev: false - /graceful-fs@4.2.11: - resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + graceful-fs@4.2.11: {} - /graphemer@1.4.0: - resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} - dev: true + graphemer@1.4.0: {} - /gray-matter@4.0.3: - resolution: {integrity: sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==} - engines: {node: '>=6.0'} + gray-matter@4.0.3: dependencies: js-yaml: 3.14.1 kind-of: 6.0.3 section-matter: 1.0.0 strip-bom-string: 1.0.0 - /has-bigints@1.0.2: - resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} - dev: false + has-bigints@1.0.2: {} - /has-flag@2.0.0: - resolution: {integrity: sha512-P+1n3MnwjR/Epg9BBo1KT8qbye2g2Ou4sFumihwt6I4tsUX7jnLcX4BTOSKg/B1ZrIYMN9FcEnG4x5a7NB8Eng==} - engines: {node: '>=0.10.0'} - dev: false + has-flag@2.0.0: {} - /has-flag@3.0.0: - resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} - engines: {node: '>=4'} + has-flag@3.0.0: {} - /has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} + has-flag@4.0.0: {} - /has-own-prop@2.0.0: - resolution: {integrity: sha512-Pq0h+hvsVm6dDEa8x82GnLSYHOzNDt7f0ddFa3FqcQlgzEiptPqL+XrOJNavjOzSYiYWIrgeVYYgGlLmnxwilQ==} - engines: {node: '>=8'} - dev: true + has-own-prop@2.0.0: {} - /has-property-descriptors@1.0.1: - resolution: {integrity: sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==} + has-property-descriptors@1.0.1: dependencies: get-intrinsic: 1.2.2 - dev: false - /has-proto@1.0.1: - resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} - engines: {node: '>= 0.4'} - dev: false + has-proto@1.0.1: {} - /has-symbols@1.0.3: - resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} - engines: {node: '>= 0.4'} - dev: false + has-symbols@1.0.3: {} - /has-tostringtag@1.0.0: - resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==} - engines: {node: '>= 0.4'} + has-tostringtag@1.0.0: dependencies: has-symbols: 1.0.3 - dev: false - /hash-obj@4.0.0: - resolution: {integrity: sha512-FwO1BUVWkyHasWDW4S8o0ssQXjvyghLV2rfVhnN36b2bbcj45eGiuzdn9XOvOpjV3TKQD7Gm2BWNXdE9V4KKYg==} - engines: {node: '>=12'} + hash-obj@4.0.0: dependencies: is-obj: 3.0.0 sort-keys: 5.0.0 type-fest: 1.4.0 - dev: false - /hash.js@1.1.7: - resolution: {integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==} + hash.js@1.1.7: dependencies: inherits: 2.0.4 minimalistic-assert: 1.0.1 - dev: true - /hasown@2.0.0: - resolution: {integrity: sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==} - engines: {node: '>= 0.4'} + hasown@2.0.0: dependencies: function-bind: 1.1.2 - dev: false - /hast-util-from-dom@5.0.0: - resolution: {integrity: sha512-d6235voAp/XR3Hh5uy7aGLbM3S4KamdW0WEgOaU1YoewnuYw4HXb5eRtv9g65m/RFGEfUY1Mw4UqCc5Y8L4Stg==} + hast-util-from-dom@5.0.0: dependencies: '@types/hast': 3.0.2 hastscript: 8.0.0 web-namespaces: 2.0.1 - dev: false - /hast-util-from-html-isomorphic@2.0.0: - resolution: {integrity: sha512-zJfpXq44yff2hmE0XmwEOzdWin5xwH+QIhMLOScpX91e/NSGPsAzNCvLQDIEPyO2TXi+lBmU6hjLIhV8MwP2kw==} + hast-util-from-html-isomorphic@2.0.0: dependencies: '@types/hast': 3.0.2 hast-util-from-dom: 5.0.0 hast-util-from-html: 2.0.1 unist-util-remove-position: 5.0.0 - dev: false - /hast-util-from-html@2.0.1: - resolution: {integrity: sha512-RXQBLMl9kjKVNkJTIO6bZyb2n+cUH8LFaSSzo82jiLT6Tfc+Pt7VQCS+/h3YwG4jaNE2TA2sdJisGWR+aJrp0g==} + hast-util-from-html@2.0.1: dependencies: '@types/hast': 3.0.2 devlop: 1.1.0 @@ -3727,10 +6148,8 @@ packages: parse5: 7.1.2 vfile: 6.0.1 vfile-message: 4.0.2 - dev: false - /hast-util-from-parse5@8.0.1: - resolution: {integrity: sha512-Er/Iixbc7IEa7r/XLtuG52zoqn/b3Xng/w6aZQ0xGVxzhw5xUFxcRqdPzP6yFi/4HBYRaifaI5fQ1RH8n0ZeOQ==} + hast-util-from-parse5@8.0.1: dependencies: '@types/hast': 3.0.2 '@types/unist': 3.0.1 @@ -3740,22 +6159,16 @@ packages: vfile: 6.0.1 vfile-location: 5.0.2 web-namespaces: 2.0.1 - dev: false - /hast-util-is-element@3.0.0: - resolution: {integrity: sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==} + hast-util-is-element@3.0.0: dependencies: '@types/hast': 3.0.2 - dev: false - /hast-util-parse-selector@4.0.0: - resolution: {integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==} + hast-util-parse-selector@4.0.0: dependencies: '@types/hast': 3.0.2 - dev: false - /hast-util-raw@9.0.1: - resolution: {integrity: sha512-5m1gmba658Q+lO5uqL5YNGQWeh1MYWZbZmWrM5lncdcuiXuo5E2HT/CIOp0rLF8ksfSwiCVJ3twlgVRyTGThGA==} + hast-util-raw@9.0.1: dependencies: '@types/hast': 3.0.2 '@types/unist': 3.0.1 @@ -3770,10 +6183,8 @@ packages: vfile: 6.0.1 web-namespaces: 2.0.1 zwitch: 2.0.4 - dev: false - /hast-util-to-estree@2.3.3: - resolution: {integrity: sha512-ihhPIUPxN0v0w6M5+IiAZZrn0LH2uZomeWwhn7uP7avZC6TE7lIiEh2yBMPr5+zi1aUCXq6VoYRgs2Bw9xmycQ==} + hast-util-to-estree@2.3.3: dependencies: '@types/estree': 1.0.5 '@types/estree-jsx': 1.0.3 @@ -3792,10 +6203,8 @@ packages: zwitch: 2.0.4 transitivePeerDependencies: - supports-color - dev: false - /hast-util-to-parse5@8.0.0: - resolution: {integrity: sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==} + hast-util-to-parse5@8.0.0: dependencies: '@types/hast': 3.0.2 comma-separated-tokens: 2.0.3 @@ -3804,645 +6213,375 @@ packages: space-separated-tokens: 2.0.2 web-namespaces: 2.0.1 zwitch: 2.0.4 - dev: false - /hast-util-to-text@4.0.0: - resolution: {integrity: sha512-EWiE1FSArNBPUo1cKWtzqgnuRQwEeQbQtnFJRYV1hb1BWDgrAlBU0ExptvZMM/KSA82cDpm2sFGf3Dmc5Mza3w==} + hast-util-to-text@4.0.0: dependencies: '@types/hast': 3.0.2 '@types/unist': 3.0.1 hast-util-is-element: 3.0.0 unist-util-find-after: 5.0.0 - dev: false - /hast-util-whitespace@2.0.1: - resolution: {integrity: sha512-nAxA0v8+vXSBDt3AnRUNjyRIQ0rD+ntpbAp4LnPkumc5M9yUbSMa4XDU9Q6etY4f1Wp4bNgvc1yjiZtsTTrSng==} - dev: false + hast-util-whitespace@2.0.1: {} - /hastscript@8.0.0: - resolution: {integrity: sha512-dMOtzCEd3ABUeSIISmrETiKuyydk1w0pa+gE/uormcTpSYuaNJPbX1NU3JLyscSLjwAQM8bWMhhIlnCqnRvDTw==} + hastscript@8.0.0: dependencies: '@types/hast': 3.0.2 comma-separated-tokens: 2.0.3 hast-util-parse-selector: 4.0.0 property-information: 6.4.0 space-separated-tokens: 2.0.2 - dev: false - /header-case@2.0.4: - resolution: {integrity: sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q==} + header-case@2.0.4: dependencies: capital-case: 1.0.4 tslib: 2.6.2 - dev: false - /heap@0.2.7: - resolution: {integrity: sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==} - dev: false + heap@0.2.7: {} - /hmac-drbg@1.0.1: - resolution: {integrity: sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==} + hmac-drbg@1.0.1: dependencies: hash.js: 1.1.7 minimalistic-assert: 1.0.1 minimalistic-crypto-utils: 1.0.1 - dev: true - /html-void-elements@3.0.0: - resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} - dev: false + html-void-elements@3.0.0: {} - /human-signals@2.1.0: - resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} - engines: {node: '>=10.17.0'} - dev: true + human-signals@2.1.0: {} - /human-signals@4.3.1: - resolution: {integrity: sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==} - engines: {node: '>=14.18.0'} - dev: true + human-signals@4.3.1: {} - /iconv-lite@0.6.3: - resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} - engines: {node: '>=0.10.0'} + iconv-lite@0.6.3: dependencies: safer-buffer: 2.1.2 - dev: false - /ignore@5.3.0: - resolution: {integrity: sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==} - engines: {node: '>= 4'} - dev: true + ignore@5.3.0: {} - /import-fresh@3.3.0: - resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} - engines: {node: '>=6'} + import-fresh@3.3.0: dependencies: parent-module: 1.0.1 resolve-from: 4.0.0 - dev: true - /import-meta-resolve@2.2.2: - resolution: {integrity: sha512-f8KcQ1D80V7RnqVm+/lirO9zkOxjGxhaTC1IPrBGd3MEfNgmNG67tSUO9gTi2F3Blr2Az6g1vocaxzkVnWl9MA==} - dev: true + import-meta-resolve@2.2.2: {} - /import-meta-resolve@4.0.0: - resolution: {integrity: sha512-okYUR7ZQPH+efeuMJGlq4f8ubUgO50kByRPyt/Cy1Io4PSRsPjxME+YlVaCOx+NIToW7hCsZNFJyTPFFKepRSA==} - dev: true + import-meta-resolve@4.0.0: {} - /imurmurhash@0.1.4: - resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} - engines: {node: '>=0.8.19'} - dev: true + imurmurhash@0.1.4: {} - /inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + inflight@1.0.6: dependencies: once: 1.4.0 wrappy: 1.0.2 - dev: true - /inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - dev: true + inherits@2.0.4: {} - /ini@4.1.1: - resolution: {integrity: sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dev: true + ini@4.1.1: {} - /inline-style-parser@0.1.1: - resolution: {integrity: sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==} - dev: false + inline-style-parser@0.1.1: {} - /internal-slot@1.0.6: - resolution: {integrity: sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==} - engines: {node: '>= 0.4'} + internal-slot@1.0.6: dependencies: get-intrinsic: 1.2.2 hasown: 2.0.0 side-channel: 1.0.4 - dev: false - /internmap@1.0.1: - resolution: {integrity: sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==} - dev: false + internmap@1.0.1: {} - /internmap@2.0.3: - resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==} - engines: {node: '>=12'} - dev: false + internmap@2.0.3: {} - /intersection-observer@0.12.2: - resolution: {integrity: sha512-7m1vEcPCxXYI8HqnL8CKI6siDyD+eIWSwgB3DZA+ZTogxk9I4CDnj4wilt9x/+/QbHI4YG5YZNmC6458/e9Ktg==} - dev: false + intersection-observer@0.12.2: {} - /is-alphabetical@1.0.4: - resolution: {integrity: sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==} - dev: true + is-alphabetical@1.0.4: {} - /is-alphabetical@2.0.1: - resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==} + is-alphabetical@2.0.1: {} - /is-alphanumerical@1.0.4: - resolution: {integrity: sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==} + is-alphanumerical@1.0.4: dependencies: is-alphabetical: 1.0.4 is-decimal: 1.0.4 - dev: true - /is-alphanumerical@2.0.1: - resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==} + is-alphanumerical@2.0.1: dependencies: is-alphabetical: 2.0.1 is-decimal: 2.0.1 - /is-arguments@1.1.1: - resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} - engines: {node: '>= 0.4'} + is-arguments@1.1.1: dependencies: call-bind: 1.0.5 has-tostringtag: 1.0.0 - dev: false - /is-array-buffer@3.0.2: - resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==} + is-array-buffer@3.0.2: dependencies: call-bind: 1.0.5 get-intrinsic: 1.2.2 is-typed-array: 1.1.12 - dev: false - /is-arrayish@0.2.1: - resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} - dev: true + is-arrayish@0.2.1: {} - /is-bigint@1.0.4: - resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} + is-bigint@1.0.4: dependencies: has-bigints: 1.0.2 - dev: false - /is-boolean-object@1.1.2: - resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} - engines: {node: '>= 0.4'} + is-boolean-object@1.1.2: dependencies: call-bind: 1.0.5 has-tostringtag: 1.0.0 - dev: false - /is-buffer@2.0.5: - resolution: {integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==} - engines: {node: '>=4'} + is-buffer@2.0.5: {} - /is-callable@1.2.7: - resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} - engines: {node: '>= 0.4'} - dev: false + is-callable@1.2.7: {} - /is-date-object@1.0.5: - resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} - engines: {node: '>= 0.4'} + is-date-object@1.0.5: dependencies: has-tostringtag: 1.0.0 - dev: false - /is-decimal@1.0.4: - resolution: {integrity: sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==} - dev: true + is-decimal@1.0.4: {} - /is-decimal@2.0.1: - resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} + is-decimal@2.0.1: {} - /is-docker@2.2.1: - resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} - engines: {node: '>=8'} - hasBin: true - dev: true + is-docker@2.2.1: {} - /is-docker@3.0.0: - resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - hasBin: true - dev: true + is-docker@3.0.0: {} - /is-empty@1.2.0: - resolution: {integrity: sha512-F2FnH/otLNJv0J6wc73A5Xo7oHLNnqplYqZhUu01tD54DIPvxIRSTSLkrUB/M0nHO4vo1O9PDfN4KoTxCzLh/w==} - dev: true + is-empty@1.2.0: {} - /is-extendable@0.1.1: - resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} - engines: {node: '>=0.10.0'} + is-extendable@0.1.1: {} - /is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} + is-extglob@2.1.1: {} - /is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} - dev: true + is-fullwidth-code-point@3.0.0: {} - /is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} + is-glob@4.0.3: dependencies: is-extglob: 2.1.1 - /is-hex-prefixed@1.0.0: - resolution: {integrity: sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA==} - engines: {node: '>=6.5.0', npm: '>=3'} - dev: true + is-hex-prefixed@1.0.0: {} - /is-hexadecimal@1.0.4: - resolution: {integrity: sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==} - dev: true + is-hexadecimal@1.0.4: {} - /is-hexadecimal@2.0.1: - resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} + is-hexadecimal@2.0.1: {} - /is-inside-container@1.0.0: - resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} - engines: {node: '>=14.16'} - hasBin: true + is-inside-container@1.0.0: dependencies: is-docker: 3.0.0 - dev: true - /is-map@2.0.2: - resolution: {integrity: sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==} - dev: false + is-map@2.0.2: {} - /is-number-object@1.0.7: - resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} - engines: {node: '>= 0.4'} + is-number-object@1.0.7: dependencies: has-tostringtag: 1.0.0 - dev: false - /is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} + is-number@7.0.0: {} - /is-obj@2.0.0: - resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} - engines: {node: '>=8'} - dev: true + is-obj@2.0.0: {} - /is-obj@3.0.0: - resolution: {integrity: sha512-IlsXEHOjtKhpN8r/tRFj2nDyTmHvcfNeu/nrRIcXE17ROeatXchkojffa1SpdqW4cr/Fj6QkEf/Gn4zf6KKvEQ==} - engines: {node: '>=12'} - dev: false + is-obj@3.0.0: {} - /is-path-inside@3.0.3: - resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} - engines: {node: '>=8'} - dev: true + is-path-inside@3.0.3: {} - /is-plain-obj@3.0.0: - resolution: {integrity: sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==} - engines: {node: '>=10'} - dev: false + is-plain-obj@3.0.0: {} - /is-plain-obj@4.1.0: - resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} - engines: {node: '>=12'} + is-plain-obj@4.1.0: {} - /is-reference@3.0.2: - resolution: {integrity: sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==} + is-reference@3.0.2: dependencies: '@types/estree': 1.0.5 - dev: false - /is-regex@1.1.4: - resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} - engines: {node: '>= 0.4'} + is-regex@1.1.4: dependencies: call-bind: 1.0.5 has-tostringtag: 1.0.0 - dev: false - /is-set@2.0.2: - resolution: {integrity: sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==} - dev: false + is-set@2.0.2: {} - /is-shared-array-buffer@1.0.2: - resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==} + is-shared-array-buffer@1.0.2: dependencies: call-bind: 1.0.5 - dev: false - /is-ssh@1.4.0: - resolution: {integrity: sha512-x7+VxdxOdlV3CYpjvRLBv5Lo9OJerlYanjwFrPR9fuGPjCiNiCzFgAWpiLAohSbsnH4ZAys3SBh+hq5rJosxUQ==} + is-ssh@1.4.0: dependencies: protocols: 2.0.1 - dev: false - /is-stream@1.1.0: - resolution: {integrity: sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==} - engines: {node: '>=0.10.0'} - dev: false + is-stream@1.1.0: {} - /is-stream@2.0.1: - resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} - engines: {node: '>=8'} - dev: true + is-stream@2.0.1: {} - /is-stream@3.0.0: - resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dev: true + is-stream@3.0.0: {} - /is-string@1.0.7: - resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} - engines: {node: '>= 0.4'} + is-string@1.0.7: dependencies: has-tostringtag: 1.0.0 - dev: false - /is-symbol@1.0.4: - resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} - engines: {node: '>= 0.4'} + is-symbol@1.0.4: dependencies: has-symbols: 1.0.3 - dev: false - /is-typed-array@1.1.12: - resolution: {integrity: sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==} - engines: {node: '>= 0.4'} + is-typed-array@1.1.12: dependencies: which-typed-array: 1.1.13 - dev: false - /is-typedarray@1.0.0: - resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} - dev: true + is-typedarray@1.0.0: {} - /is-weakmap@2.0.1: - resolution: {integrity: sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==} - dev: false + is-weakmap@2.0.1: {} - /is-weakset@2.0.2: - resolution: {integrity: sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==} + is-weakset@2.0.2: dependencies: call-bind: 1.0.5 get-intrinsic: 1.2.2 - dev: false - /is-wsl@2.2.0: - resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} - engines: {node: '>=8'} + is-wsl@2.2.0: dependencies: is-docker: 2.2.1 - dev: true - /isarray@2.0.5: - resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} - dev: false + isarray@2.0.5: {} - /isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + isexe@2.0.0: {} - /isows@1.0.3(ws@8.13.0): - resolution: {integrity: sha512-2cKei4vlmg2cxEjm3wVSqn8pcoRF/LX/wpifuuNquFO4SQmPwarClT+SUCA2lt+l581tTeZIPIZuIDo2jWN1fg==} - peerDependencies: - ws: '*' + isows@1.0.3(ws@8.13.0): dependencies: ws: 8.13.0 - dev: false - /jackspeak@2.3.6: - resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} - engines: {node: '>=14'} + isows@1.0.6(ws@8.18.0): + dependencies: + ws: 8.18.0 + + jackspeak@2.3.6: dependencies: '@isaacs/cliui': 8.0.2 optionalDependencies: '@pkgjs/parseargs': 0.11.0 - dev: true - /js-sha3@0.8.0: - resolution: {integrity: sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==} - dev: true + js-sha3@0.8.0: {} - /js-tokens@4.0.0: - resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + js-tokens@4.0.0: {} - /js-yaml@3.14.1: - resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} - hasBin: true + js-yaml@3.14.1: dependencies: argparse: 1.0.10 esprima: 4.0.1 - /js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} - hasBin: true + js-yaml@4.1.0: dependencies: argparse: 2.0.1 - /json-buffer@3.0.1: - resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} - dev: true + json-buffer@3.0.1: {} - /json-parse-even-better-errors@2.3.1: - resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} - dev: true + json-parse-even-better-errors@2.3.1: {} - /json-parse-even-better-errors@3.0.0: - resolution: {integrity: sha512-iZbGHafX/59r39gPwVPRBGw0QQKnA7tte5pSMrhWOW7swGsVvVTjmfyAV9pNqk8YGT7tRCdxRu8uzcgZwoDooA==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dev: true + json-parse-even-better-errors@3.0.0: {} - /json-schema-traverse@0.4.1: - resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} - dev: true + json-schema-traverse@0.4.1: {} - /json-schema-traverse@1.0.0: - resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} - dev: true + json-schema-traverse@1.0.0: {} - /json-stable-stringify-without-jsonify@1.0.1: - resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} - dev: true + json-stable-stringify-without-jsonify@1.0.1: {} - /jsonc-parser@3.2.0: - resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} - dev: false + jsonc-parser@3.2.0: {} - /katex@0.16.9: - resolution: {integrity: sha512-fsSYjWS0EEOwvy81j3vRA8TEAhQhKiqO+FQaKWp0m39qwOzHVBgAUBIXWj1pB+O2W3fIpNa6Y9KSKCVbfPhyAQ==} - hasBin: true + katex@0.16.9: dependencies: commander: 8.3.0 - dev: false - /keyv@4.5.4: - resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + keyv@4.5.4: dependencies: json-buffer: 3.0.1 - dev: true - /khroma@2.1.0: - resolution: {integrity: sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw==} - dev: false + khroma@2.1.0: {} - /kind-of@6.0.3: - resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} - engines: {node: '>=0.10.0'} + kind-of@6.0.3: {} - /kleur@4.1.5: - resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} - engines: {node: '>=6'} + kleur@4.1.5: {} - /layout-base@1.0.2: - resolution: {integrity: sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==} - dev: false + layout-base@1.0.2: {} - /layout-base@2.0.1: - resolution: {integrity: sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg==} - dev: false + layout-base@2.0.1: {} - /levn@0.4.1: - resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} - engines: {node: '>= 0.8.0'} + levn@0.4.1: dependencies: prelude-ls: 1.2.1 type-check: 0.4.0 - dev: true - /lines-and-columns@2.0.4: - resolution: {integrity: sha512-wM1+Z03eypVAVUCE7QdSqpVIvelbOakn1M0bPDoA4SGWPx3sNDVUiMo3L6To6WWGClB7VyXnhQ4Sn7gxiJbE6A==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dev: true + lines-and-columns@2.0.4: {} - /load-plugin@5.1.0: - resolution: {integrity: sha512-Lg1CZa1CFj2CbNaxijTL6PCbzd4qGTlZov+iH2p5Xwy/ApcZJh+i6jMN2cYePouTfjJfrNu3nXFdEw8LvbjPFQ==} + load-plugin@5.1.0: dependencies: '@npmcli/config': 6.4.0 import-meta-resolve: 2.2.2 - dev: true - /locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} + locate-path@6.0.0: dependencies: p-locate: 5.0.0 - dev: true - /locate-path@7.2.0: - resolution: {integrity: sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + locate-path@7.2.0: dependencies: p-locate: 6.0.0 - dev: true - /lodash-es@4.17.21: - resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} - dev: false + lodash-es@4.17.21: {} - /lodash.clonedeep@4.5.0: - resolution: {integrity: sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==} - dev: true + lodash.clonedeep@4.5.0: {} - /lodash.get@4.4.2: - resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} - dev: false + lodash.get@4.4.2: {} - /lodash.merge@4.6.2: - resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} - dev: true + lodash.merge@4.6.2: {} - /lodash@4.17.21: - resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + lodash@4.17.21: {} - /longest-streak@3.1.0: - resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} + longest-streak@3.1.0: {} - /loose-envify@1.4.0: - resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} - hasBin: true + loose-envify@1.4.0: dependencies: js-tokens: 4.0.0 - dev: false - /loupe@2.3.7: - resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} + loupe@2.3.7: dependencies: get-func-name: 2.0.2 - dev: true - /lower-case@2.0.2: - resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} + lower-case@2.0.2: dependencies: tslib: 2.6.2 - dev: false - /lru-cache@10.0.3: - resolution: {integrity: sha512-B7gr+F6MkqB3uzINHXNctGieGsRTMwIBgxkp0yq/5BwcuDzD4A8wQpHQW6vDAm1uKSLQghmRdD9sKqf2vJ1cEg==} - engines: {node: 14 || >=16.14} - dev: true + lru-cache@10.0.3: {} - /lru-cache@4.1.5: - resolution: {integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==} + lru-cache@4.1.5: dependencies: pseudomap: 1.0.2 yallist: 2.1.2 - dev: false - /lru-cache@6.0.0: - resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} - engines: {node: '>=10'} + lru-cache@6.0.0: dependencies: yallist: 4.0.0 - dev: true - /lz-string@1.5.0: - resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} - hasBin: true - dev: false + lz-string@1.5.0: {} - /markdown-extensions@1.1.1: - resolution: {integrity: sha512-WWC0ZuMzCyDHYCasEGs4IPvLyTGftYwh6wIEOULOF0HXcqZlhwRzrK0w2VUlxWA98xnvb/jszw4ZSkJ6ADpM6Q==} - engines: {node: '>=0.10.0'} - dev: false + markdown-extensions@1.1.1: {} - /markdown-table@3.0.3: - resolution: {integrity: sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==} + markdown-table@3.0.3: {} - /match-sorter@6.3.1: - resolution: {integrity: sha512-mxybbo3pPNuA+ZuCUhm5bwNkXrJTbsk5VWbR5wiwz/GC6LIiegBGn2w3O08UG/jdbYLinw51fSQ5xNU1U3MgBw==} + match-sorter@6.3.1: dependencies: '@babel/runtime': 7.23.2 remove-accents: 0.4.2 - dev: false - /mdast-comment-marker@2.1.2: - resolution: {integrity: sha512-HED3ezseRVkBzZ0uK4q6RJMdufr/2p3VfVZstE3H1N9K8bwtspztWo6Xd7rEatuGNoCXaBna8oEqMwUn0Ve1bw==} + mdast-comment-marker@2.1.2: dependencies: '@types/mdast': 3.0.14 mdast-util-mdx-expression: 1.3.2 transitivePeerDependencies: - supports-color - dev: true - /mdast-util-definitions@5.1.2: - resolution: {integrity: sha512-8SVPMuHqlPME/z3gqVwWY4zVXn8lqKv/pAhC57FuJ40ImXyBpmO5ukh98zB2v7Blql2FiHjHv9LVztSIqjY+MA==} + mdast-util-definitions@5.1.2: dependencies: '@types/mdast': 3.0.14 '@types/unist': 2.0.9 unist-util-visit: 4.1.2 - dev: false - /mdast-util-find-and-replace@2.2.2: - resolution: {integrity: sha512-MTtdFRz/eMDHXzeK6W3dO7mXUlF82Gom4y0oOgvHhh/HXZAGvIQDUvQ0SuUx+j2tv44b8xTHOm8K/9OoRFnXKw==} + mdast-util-find-and-replace@2.2.2: dependencies: '@types/mdast': 3.0.14 escape-string-regexp: 5.0.0 unist-util-is: 5.2.1 unist-util-visit-parents: 5.1.3 - /mdast-util-from-markdown@0.8.5: - resolution: {integrity: sha512-2hkTXtYYnr+NubD/g6KGBS/0mFmBcifAsI0yIWRiRo0PjVs6SSOSOdtzbp6kSGnShDN6G5aWZpKQ2lWRy27mWQ==} + mdast-util-from-markdown@0.8.5: dependencies: '@types/mdast': 3.0.14 mdast-util-to-string: 2.0.0 @@ -4451,10 +6590,8 @@ packages: unist-util-stringify-position: 2.0.3 transitivePeerDependencies: - supports-color - dev: true - /mdast-util-from-markdown@1.3.1: - resolution: {integrity: sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww==} + mdast-util-from-markdown@1.3.1: dependencies: '@types/mdast': 3.0.14 '@types/unist': 2.0.9 @@ -4471,8 +6608,7 @@ packages: transitivePeerDependencies: - supports-color - /mdast-util-from-markdown@2.0.0: - resolution: {integrity: sha512-n7MTOr/z+8NAX/wmhhDji8O3bRvPTV/U0oTCaZJkjhPSKTPhS3xufVhKGF8s1pJ7Ox4QgoIU7KHseh09S+9rTA==} + mdast-util-from-markdown@2.0.0: dependencies: '@types/mdast': 4.0.2 '@types/unist': 3.0.1 @@ -4488,10 +6624,8 @@ packages: unist-util-stringify-position: 4.0.0 transitivePeerDependencies: - supports-color - dev: true - /mdast-util-frontmatter@2.0.1: - resolution: {integrity: sha512-LRqI9+wdgC25P0URIJY9vwocIzCcksduHQ9OF2joxQoyTNVduwLAFUzjoopuRJbJAReaKrNQKAZKL3uCMugWJA==} + mdast-util-frontmatter@2.0.1: dependencies: '@types/mdast': 4.0.2 devlop: 1.1.0 @@ -4501,31 +6635,26 @@ packages: micromark-extension-frontmatter: 2.0.0 transitivePeerDependencies: - supports-color - dev: true - /mdast-util-gfm-autolink-literal@1.0.3: - resolution: {integrity: sha512-My8KJ57FYEy2W2LyNom4n3E7hKTuQk/0SES0u16tjA9Z3oFkF4RrC/hPAPgjlSpezsOvI8ObcXcElo92wn5IGA==} + mdast-util-gfm-autolink-literal@1.0.3: dependencies: '@types/mdast': 3.0.14 ccount: 2.0.1 mdast-util-find-and-replace: 2.2.2 micromark-util-character: 1.2.0 - /mdast-util-gfm-footnote@1.0.2: - resolution: {integrity: sha512-56D19KOGbE00uKVj3sgIykpwKL179QsVFwx/DCW0u/0+URsryacI4MAdNJl0dh+u2PSsD9FtxPFbHCzJ78qJFQ==} + mdast-util-gfm-footnote@1.0.2: dependencies: '@types/mdast': 3.0.14 mdast-util-to-markdown: 1.5.0 micromark-util-normalize-identifier: 1.1.0 - /mdast-util-gfm-strikethrough@1.0.3: - resolution: {integrity: sha512-DAPhYzTYrRcXdMjUtUjKvW9z/FNAMTdU0ORyMcbmkwYNbKocDpdk+PX1L1dQgOID/+vVs1uBQ7ElrBQfZ0cuiQ==} + mdast-util-gfm-strikethrough@1.0.3: dependencies: '@types/mdast': 3.0.14 mdast-util-to-markdown: 1.5.0 - /mdast-util-gfm-table@1.0.7: - resolution: {integrity: sha512-jjcpmNnQvrmN5Vx7y7lEc2iIOEytYv7rTvu+MeyAsSHTASGCCRA79Igg2uKssgOs1i1po8s3plW0sTu1wkkLGg==} + mdast-util-gfm-table@1.0.7: dependencies: '@types/mdast': 3.0.14 markdown-table: 3.0.3 @@ -4534,14 +6663,12 @@ packages: transitivePeerDependencies: - supports-color - /mdast-util-gfm-task-list-item@1.0.2: - resolution: {integrity: sha512-PFTA1gzfp1B1UaiJVyhJZA1rm0+Tzn690frc/L8vNX1Jop4STZgOE6bxUhnzdVSB+vm2GU1tIsuQcA9bxTQpMQ==} + mdast-util-gfm-task-list-item@1.0.2: dependencies: '@types/mdast': 3.0.14 mdast-util-to-markdown: 1.5.0 - /mdast-util-gfm@2.0.2: - resolution: {integrity: sha512-qvZ608nBppZ4icQlhQQIAdc6S3Ffj9RGmzwUKUWuEICFnd1LVkN3EktF7ZHAgfcEdvZB5owU9tQgt99e2TlLjg==} + mdast-util-gfm@2.0.2: dependencies: mdast-util-from-markdown: 1.3.1 mdast-util-gfm-autolink-literal: 1.0.3 @@ -4553,22 +6680,17 @@ packages: transitivePeerDependencies: - supports-color - /mdast-util-heading-style@2.0.1: - resolution: {integrity: sha512-0L5rthU4xKDVbw+UQ7D8Y8xOEsX4JXZvemWoEAsL+WAaeSH+TvVVwFnTb3G/OrjyP4VYQULoNWU+PdZfkmNu4A==} + mdast-util-heading-style@2.0.1: dependencies: '@types/mdast': 3.0.14 - dev: true - /mdast-util-math@2.0.2: - resolution: {integrity: sha512-8gmkKVp9v6+Tgjtq6SYx9kGPpTf6FVYRa53/DLh479aldR9AyP48qeVOgNZ5X7QUK7nOy4yw7vg6mbiGcs9jWQ==} + mdast-util-math@2.0.2: dependencies: '@types/mdast': 3.0.14 longest-streak: 3.1.0 mdast-util-to-markdown: 1.5.0 - dev: false - /mdast-util-mdx-expression@1.3.2: - resolution: {integrity: sha512-xIPmR5ReJDu/DHH1OoIT1HkuybIfRGYRywC+gJtI7qHjCJp/M9jrmBEJW22O8lskDWm562BX2W8TiAwRTb0rKA==} + mdast-util-mdx-expression@1.3.2: dependencies: '@types/estree-jsx': 1.0.3 '@types/hast': 2.3.7 @@ -4578,8 +6700,7 @@ packages: transitivePeerDependencies: - supports-color - /mdast-util-mdx-jsx@2.1.4: - resolution: {integrity: sha512-DtMn9CmVhVzZx3f+optVDF8yFgQVt7FghCRNdlIaS3X5Bnym3hZwPbg/XW86vdpKjlc1PVj26SpnLGeJBXD3JA==} + mdast-util-mdx-jsx@2.1.4: dependencies: '@types/estree-jsx': 1.0.3 '@types/hast': 2.3.7 @@ -4596,8 +6717,7 @@ packages: transitivePeerDependencies: - supports-color - /mdast-util-mdx@2.0.1: - resolution: {integrity: sha512-38w5y+r8nyKlGvNjSEqWrhG0w5PmnRA+wnBvm+ulYCct7nsGYhFVb0lljS9bQav4psDAS1eGkP2LMVcZBi/aqw==} + mdast-util-mdx@2.0.1: dependencies: mdast-util-from-markdown: 1.3.1 mdast-util-mdx-expression: 1.3.2 @@ -4607,8 +6727,7 @@ packages: transitivePeerDependencies: - supports-color - /mdast-util-mdxjs-esm@1.3.1: - resolution: {integrity: sha512-SXqglS0HrEvSdUEfoXFtcg7DRl7S2cwOXc7jkuusG472Mmjag34DUDeOJUZtl+BVnyeO1frIgVpHlNRWc2gk/w==} + mdast-util-mdxjs-esm@1.3.1: dependencies: '@types/estree-jsx': 1.0.3 '@types/hast': 2.3.7 @@ -4618,21 +6737,17 @@ packages: transitivePeerDependencies: - supports-color - /mdast-util-phrasing@3.0.1: - resolution: {integrity: sha512-WmI1gTXUBJo4/ZmSk79Wcb2HcjPJBzM1nlI/OUWA8yk2X9ik3ffNbBGsU+09BFmXaL1IBb9fiuvq6/KMiNycSg==} + mdast-util-phrasing@3.0.1: dependencies: '@types/mdast': 3.0.14 unist-util-is: 5.2.1 - /mdast-util-phrasing@4.0.0: - resolution: {integrity: sha512-xadSsJayQIucJ9n053dfQwVu1kuXg7jCTdYsMK8rqzKZh52nLfSH/k0sAxE0u+pj/zKZX+o5wB+ML5mRayOxFA==} + mdast-util-phrasing@4.0.0: dependencies: '@types/mdast': 4.0.2 unist-util-is: 6.0.0 - dev: true - /mdast-util-to-hast@12.3.0: - resolution: {integrity: sha512-pits93r8PhnIoU4Vy9bjW39M2jJ6/tdHyja9rrot9uujkN7UTU9SDnE6WNJz/IGyQk3XHX6yNNtrBH6cQzm8Hw==} + mdast-util-to-hast@12.3.0: dependencies: '@types/hast': 2.3.7 '@types/mdast': 3.0.14 @@ -4642,10 +6757,8 @@ packages: unist-util-generated: 2.0.1 unist-util-position: 4.0.4 unist-util-visit: 4.1.2 - dev: false - /mdast-util-to-hast@13.0.2: - resolution: {integrity: sha512-U5I+500EOOw9e3ZrclN3Is3fRpw8c19SMyNZlZ2IS+7vLsNzb2Om11VpIVOR+/0137GhZsFEF6YiKD5+0Hr2Og==} + mdast-util-to-hast@13.0.2: dependencies: '@types/hast': 3.0.2 '@types/mdast': 4.0.2 @@ -4655,10 +6768,8 @@ packages: trim-lines: 3.0.1 unist-util-position: 5.0.0 unist-util-visit: 5.0.0 - dev: false - /mdast-util-to-markdown@1.5.0: - resolution: {integrity: sha512-bbv7TPv/WC49thZPg3jXuqzuvI45IL2EVAr/KxF0BSdHsU0ceFHOmwQn6evxAh1GaoK/6GQ1wp4R4oW2+LFL/A==} + mdast-util-to-markdown@1.5.0: dependencies: '@types/mdast': 3.0.14 '@types/unist': 2.0.9 @@ -4669,8 +6780,7 @@ packages: unist-util-visit: 4.1.2 zwitch: 2.0.4 - /mdast-util-to-markdown@2.1.0: - resolution: {integrity: sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ==} + mdast-util-to-markdown@2.1.0: dependencies: '@types/mdast': 4.0.2 '@types/unist': 3.0.1 @@ -4680,44 +6790,30 @@ packages: micromark-util-decode-string: 2.0.0 unist-util-visit: 5.0.0 zwitch: 2.0.4 - dev: true - /mdast-util-to-string@2.0.0: - resolution: {integrity: sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==} - dev: true + mdast-util-to-string@2.0.0: {} - /mdast-util-to-string@3.2.0: - resolution: {integrity: sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg==} + mdast-util-to-string@3.2.0: dependencies: '@types/mdast': 3.0.14 - /mdast-util-to-string@4.0.0: - resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} + mdast-util-to-string@4.0.0: dependencies: '@types/mdast': 4.0.2 - dev: true - /merge-stream@2.0.0: - resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} - dev: true + merge-stream@2.0.0: {} - /merge2@1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} - engines: {node: '>= 8'} + merge2@1.4.1: {} - /merkletreejs@0.3.11: - resolution: {integrity: sha512-LJKTl4iVNTndhL+3Uz/tfkjD0klIWsHlUzgtuNnNrsf7bAlXR30m+xYB7lHr5Z/l6e/yAIsr26Dabx6Buo4VGQ==} - engines: {node: '>= 7.6.0'} + merkletreejs@0.3.11: dependencies: bignumber.js: 9.1.2 buffer-reverse: 1.0.1 crypto-js: 4.2.0 treeify: 1.1.0 web3-utils: 1.10.3 - dev: true - /mermaid@10.6.1: - resolution: {integrity: sha512-Hky0/RpOw/1il9X8AvzOEChfJtVvmXm+y7JML5C//ePYMy0/9jCEmW1E1g86x9oDfW9+iVEdTV/i+M6KWRNs4A==} + mermaid@10.6.1: dependencies: '@braintree/sanitize-url': 6.0.4 '@types/d3-scale': 4.0.7 @@ -4741,14 +6837,10 @@ packages: web-worker: 1.2.0 transitivePeerDependencies: - supports-color - dev: false - /micro-ftch@0.3.1: - resolution: {integrity: sha512-/0LLxhzP0tfiR5hcQebtudP56gUurs2CLkGarnCiB/OqEyUFQ6U3paQi/tgLv0hBJYt2rnr9MNpxz4fiiugstg==} - dev: true + micro-ftch@0.3.1: {} - /micromark-core-commonmark@1.1.0: - resolution: {integrity: sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw==} + micromark-core-commonmark@1.1.0: dependencies: decode-named-character-reference: 1.0.2 micromark-factory-destination: 1.1.0 @@ -4767,8 +6859,7 @@ packages: micromark-util-types: 1.1.0 uvu: 0.5.6 - /micromark-core-commonmark@2.0.0: - resolution: {integrity: sha512-jThOz/pVmAYUtkroV3D5c1osFXAMv9e0ypGDOIZuCeAe91/sD6BoE2Sjzt30yuXtwOYUmySOhMas/PVyh02itA==} + micromark-core-commonmark@2.0.0: dependencies: decode-named-character-reference: 1.0.2 devlop: 1.1.0 @@ -4786,27 +6877,22 @@ packages: micromark-util-subtokenize: 2.0.0 micromark-util-symbol: 2.0.0 micromark-util-types: 2.0.0 - dev: true - /micromark-extension-frontmatter@2.0.0: - resolution: {integrity: sha512-C4AkuM3dA58cgZha7zVnuVxBhDsbttIMiytjgsM2XbHAB2faRVaHRle40558FBN+DJcrLNCoqG5mlrpdU4cRtg==} + micromark-extension-frontmatter@2.0.0: dependencies: fault: 2.0.1 micromark-util-character: 2.0.1 micromark-util-symbol: 2.0.0 micromark-util-types: 2.0.0 - dev: true - /micromark-extension-gfm-autolink-literal@1.0.5: - resolution: {integrity: sha512-z3wJSLrDf8kRDOh2qBtoTRD53vJ+CWIyo7uyZuxf/JAbNJjiHsOpG1y5wxk8drtv3ETAHutCu6N3thkOOgueWg==} + micromark-extension-gfm-autolink-literal@1.0.5: dependencies: micromark-util-character: 1.2.0 micromark-util-sanitize-uri: 1.2.0 micromark-util-symbol: 1.1.0 micromark-util-types: 1.1.0 - /micromark-extension-gfm-footnote@1.1.2: - resolution: {integrity: sha512-Yxn7z7SxgyGWRNa4wzf8AhYYWNrwl5q1Z8ii+CSTTIqVkmGZF1CElX2JI8g5yGoM3GAman9/PVCUFUSJ0kB/8Q==} + micromark-extension-gfm-footnote@1.1.2: dependencies: micromark-core-commonmark: 1.1.0 micromark-factory-space: 1.1.0 @@ -4817,8 +6903,7 @@ packages: micromark-util-types: 1.1.0 uvu: 0.5.6 - /micromark-extension-gfm-strikethrough@1.0.7: - resolution: {integrity: sha512-sX0FawVE1o3abGk3vRjOH50L5TTLr3b5XMqnP9YDRb34M0v5OoZhG+OHFz1OffZ9dlwgpTBKaT4XW/AsUVnSDw==} + micromark-extension-gfm-strikethrough@1.0.7: dependencies: micromark-util-chunked: 1.1.0 micromark-util-classify-character: 1.1.0 @@ -4827,8 +6912,7 @@ packages: micromark-util-types: 1.1.0 uvu: 0.5.6 - /micromark-extension-gfm-table@1.0.7: - resolution: {integrity: sha512-3ZORTHtcSnMQEKtAOsBQ9/oHp9096pI/UvdPtN7ehKvrmZZ2+bbWhi0ln+I9drmwXMt5boocn6OlwQzNXeVeqw==} + micromark-extension-gfm-table@1.0.7: dependencies: micromark-factory-space: 1.1.0 micromark-util-character: 1.2.0 @@ -4836,13 +6920,11 @@ packages: micromark-util-types: 1.1.0 uvu: 0.5.6 - /micromark-extension-gfm-tagfilter@1.0.2: - resolution: {integrity: sha512-5XWB9GbAUSHTn8VPU8/1DBXMuKYT5uOgEjJb8gN3mW0PNW5OPHpSdojoqf+iq1xo7vWzw/P8bAHY0n6ijpXF7g==} + micromark-extension-gfm-tagfilter@1.0.2: dependencies: micromark-util-types: 1.1.0 - /micromark-extension-gfm-task-list-item@1.0.5: - resolution: {integrity: sha512-RMFXl2uQ0pNQy6Lun2YBYT9g9INXtWJULgbt01D/x8/6yJ2qpKyzdZD3pi6UIkzF++Da49xAelVKUeUMqd5eIQ==} + micromark-extension-gfm-task-list-item@1.0.5: dependencies: micromark-factory-space: 1.1.0 micromark-util-character: 1.2.0 @@ -4850,8 +6932,7 @@ packages: micromark-util-types: 1.1.0 uvu: 0.5.6 - /micromark-extension-gfm@2.0.3: - resolution: {integrity: sha512-vb9OoHqrhCmbRidQv/2+Bc6pkP0FrtlhurxZofvOEy5o8RtuuvTq+RQ1Vw5ZDNrVraQZu3HixESqbG+0iKk/MQ==} + micromark-extension-gfm@2.0.3: dependencies: micromark-extension-gfm-autolink-literal: 1.0.5 micromark-extension-gfm-footnote: 1.1.2 @@ -4862,8 +6943,7 @@ packages: micromark-util-combine-extensions: 1.1.0 micromark-util-types: 1.1.0 - /micromark-extension-math@2.1.2: - resolution: {integrity: sha512-es0CcOV89VNS9wFmyn+wyFTKweXGW4CEvdaAca6SWRWPyYCbBisnjaHLjWO4Nszuiud84jCpkHsqAJoa768Pvg==} + micromark-extension-math@2.1.2: dependencies: '@types/katex': 0.16.5 katex: 0.16.9 @@ -4872,10 +6952,8 @@ packages: micromark-util-symbol: 1.1.0 micromark-util-types: 1.1.0 uvu: 0.5.6 - dev: false - /micromark-extension-mdx-expression@1.0.8: - resolution: {integrity: sha512-zZpeQtc5wfWKdzDsHRBY003H2Smg+PUi2REhqgIhdzAa5xonhP03FcXxqFSerFiNUr5AWmHpaNPQTBVOS4lrXw==} + micromark-extension-mdx-expression@1.0.8: dependencies: '@types/estree': 1.0.5 micromark-factory-mdx-expression: 1.0.9 @@ -4886,8 +6964,7 @@ packages: micromark-util-types: 1.1.0 uvu: 0.5.6 - /micromark-extension-mdx-jsx@1.0.5: - resolution: {integrity: sha512-gPH+9ZdmDflbu19Xkb8+gheqEDqkSpdCEubQyxuz/Hn8DOXiXvrXeikOoBA71+e8Pfi0/UYmU3wW3H58kr7akA==} + micromark-extension-mdx-jsx@1.0.5: dependencies: '@types/acorn': 4.0.6 '@types/estree': 1.0.5 @@ -4900,13 +6977,11 @@ packages: uvu: 0.5.6 vfile-message: 3.1.4 - /micromark-extension-mdx-md@1.0.1: - resolution: {integrity: sha512-7MSuj2S7xjOQXAjjkbjBsHkMtb+mDGVW6uI2dBL9snOBCbZmoNgDAeZ0nSn9j3T42UE/g2xVNMn18PJxZvkBEA==} + micromark-extension-mdx-md@1.0.1: dependencies: micromark-util-types: 1.1.0 - /micromark-extension-mdxjs-esm@1.0.5: - resolution: {integrity: sha512-xNRBw4aoURcyz/S69B19WnZAkWJMxHMT5hE36GtDAyhoyn/8TuAeqjFJQlwk+MKQsUD7b3l7kFX+vlfVWgcX1w==} + micromark-extension-mdxjs-esm@1.0.5: dependencies: '@types/estree': 1.0.5 micromark-core-commonmark: 1.1.0 @@ -4918,8 +6993,7 @@ packages: uvu: 0.5.6 vfile-message: 3.1.4 - /micromark-extension-mdxjs@1.0.1: - resolution: {integrity: sha512-7YA7hF6i5eKOfFUzZ+0z6avRG52GpWR8DL+kN47y3f2KhxbBZMhmxe7auOeaTBrW2DenbbZTf1ea9tA2hDpC2Q==} + micromark-extension-mdxjs@1.0.1: dependencies: acorn: 8.11.2 acorn-jsx: 5.3.2(acorn@8.11.2) @@ -4930,40 +7004,33 @@ packages: micromark-util-combine-extensions: 1.1.0 micromark-util-types: 1.1.0 - /micromark-factory-destination@1.1.0: - resolution: {integrity: sha512-XaNDROBgx9SgSChd69pjiGKbV+nfHGDPVYFs5dOoDd7ZnMAE+Cuu91BCpsY8RT2NP9vo/B8pds2VQNCLiu0zhg==} + micromark-factory-destination@1.1.0: dependencies: micromark-util-character: 1.2.0 micromark-util-symbol: 1.1.0 micromark-util-types: 1.1.0 - /micromark-factory-destination@2.0.0: - resolution: {integrity: sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==} + micromark-factory-destination@2.0.0: dependencies: micromark-util-character: 2.0.1 micromark-util-symbol: 2.0.0 micromark-util-types: 2.0.0 - dev: true - /micromark-factory-label@1.1.0: - resolution: {integrity: sha512-OLtyez4vZo/1NjxGhcpDSbHQ+m0IIGnT8BoPamh+7jVlzLJBH98zzuCoUeMxvM6WsNeh8wx8cKvqLiPHEACn0w==} + micromark-factory-label@1.1.0: dependencies: micromark-util-character: 1.2.0 micromark-util-symbol: 1.1.0 micromark-util-types: 1.1.0 uvu: 0.5.6 - /micromark-factory-label@2.0.0: - resolution: {integrity: sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==} + micromark-factory-label@2.0.0: dependencies: devlop: 1.1.0 micromark-util-character: 2.0.1 micromark-util-symbol: 2.0.0 micromark-util-types: 2.0.0 - dev: true - /micromark-factory-mdx-expression@1.0.9: - resolution: {integrity: sha512-jGIWzSmNfdnkJq05c7b0+Wv0Kfz3NJ3N4cBjnbO4zjXIlxJr+f8lk+5ZmwFvqdAbUy2q6B5rCY//g0QAAaXDWA==} + micromark-factory-mdx-expression@1.0.9: dependencies: '@types/estree': 1.0.5 micromark-util-character: 1.2.0 @@ -4974,140 +7041,111 @@ packages: uvu: 0.5.6 vfile-message: 3.1.4 - /micromark-factory-space@1.1.0: - resolution: {integrity: sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==} + micromark-factory-space@1.1.0: dependencies: micromark-util-character: 1.2.0 micromark-util-types: 1.1.0 - /micromark-factory-space@2.0.0: - resolution: {integrity: sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==} + micromark-factory-space@2.0.0: dependencies: micromark-util-character: 2.0.1 micromark-util-types: 2.0.0 - dev: true - /micromark-factory-title@1.1.0: - resolution: {integrity: sha512-J7n9R3vMmgjDOCY8NPw55jiyaQnH5kBdV2/UXCtZIpnHH3P6nHUKaH7XXEYuWwx/xUJcawa8plLBEjMPU24HzQ==} + micromark-factory-title@1.1.0: dependencies: micromark-factory-space: 1.1.0 micromark-util-character: 1.2.0 micromark-util-symbol: 1.1.0 micromark-util-types: 1.1.0 - /micromark-factory-title@2.0.0: - resolution: {integrity: sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A==} + micromark-factory-title@2.0.0: dependencies: micromark-factory-space: 2.0.0 micromark-util-character: 2.0.1 micromark-util-symbol: 2.0.0 micromark-util-types: 2.0.0 - dev: true - /micromark-factory-whitespace@1.1.0: - resolution: {integrity: sha512-v2WlmiymVSp5oMg+1Q0N1Lxmt6pMhIHD457whWM7/GUlEks1hI9xj5w3zbc4uuMKXGisksZk8DzP2UyGbGqNsQ==} + micromark-factory-whitespace@1.1.0: dependencies: micromark-factory-space: 1.1.0 micromark-util-character: 1.2.0 micromark-util-symbol: 1.1.0 micromark-util-types: 1.1.0 - /micromark-factory-whitespace@2.0.0: - resolution: {integrity: sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==} + micromark-factory-whitespace@2.0.0: dependencies: micromark-factory-space: 2.0.0 micromark-util-character: 2.0.1 micromark-util-symbol: 2.0.0 micromark-util-types: 2.0.0 - dev: true - /micromark-util-character@1.2.0: - resolution: {integrity: sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==} + micromark-util-character@1.2.0: dependencies: micromark-util-symbol: 1.1.0 micromark-util-types: 1.1.0 - /micromark-util-character@2.0.1: - resolution: {integrity: sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==} + micromark-util-character@2.0.1: dependencies: micromark-util-symbol: 2.0.0 micromark-util-types: 2.0.0 - /micromark-util-chunked@1.1.0: - resolution: {integrity: sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ==} + micromark-util-chunked@1.1.0: dependencies: micromark-util-symbol: 1.1.0 - /micromark-util-chunked@2.0.0: - resolution: {integrity: sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==} + micromark-util-chunked@2.0.0: dependencies: micromark-util-symbol: 2.0.0 - dev: true - /micromark-util-classify-character@1.1.0: - resolution: {integrity: sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw==} + micromark-util-classify-character@1.1.0: dependencies: micromark-util-character: 1.2.0 micromark-util-symbol: 1.1.0 micromark-util-types: 1.1.0 - /micromark-util-classify-character@2.0.0: - resolution: {integrity: sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==} + micromark-util-classify-character@2.0.0: dependencies: micromark-util-character: 2.0.1 micromark-util-symbol: 2.0.0 micromark-util-types: 2.0.0 - dev: true - /micromark-util-combine-extensions@1.1.0: - resolution: {integrity: sha512-Q20sp4mfNf9yEqDL50WwuWZHUrCO4fEyeDCnMGmG5Pr0Cz15Uo7KBs6jq+dq0EgX4DPwwrh9m0X+zPV1ypFvUA==} + micromark-util-combine-extensions@1.1.0: dependencies: micromark-util-chunked: 1.1.0 micromark-util-types: 1.1.0 - /micromark-util-combine-extensions@2.0.0: - resolution: {integrity: sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ==} + micromark-util-combine-extensions@2.0.0: dependencies: micromark-util-chunked: 2.0.0 micromark-util-types: 2.0.0 - dev: true - /micromark-util-decode-numeric-character-reference@1.1.0: - resolution: {integrity: sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw==} + micromark-util-decode-numeric-character-reference@1.1.0: dependencies: micromark-util-symbol: 1.1.0 - /micromark-util-decode-numeric-character-reference@2.0.1: - resolution: {integrity: sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ==} + micromark-util-decode-numeric-character-reference@2.0.1: dependencies: micromark-util-symbol: 2.0.0 - dev: true - /micromark-util-decode-string@1.1.0: - resolution: {integrity: sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ==} + micromark-util-decode-string@1.1.0: dependencies: decode-named-character-reference: 1.0.2 micromark-util-character: 1.2.0 micromark-util-decode-numeric-character-reference: 1.1.0 micromark-util-symbol: 1.1.0 - /micromark-util-decode-string@2.0.0: - resolution: {integrity: sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA==} + micromark-util-decode-string@2.0.0: dependencies: decode-named-character-reference: 1.0.2 micromark-util-character: 2.0.1 micromark-util-decode-numeric-character-reference: 2.0.1 micromark-util-symbol: 2.0.0 - dev: true - /micromark-util-encode@1.1.0: - resolution: {integrity: sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw==} + micromark-util-encode@1.1.0: {} - /micromark-util-encode@2.0.0: - resolution: {integrity: sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==} + micromark-util-encode@2.0.0: {} - /micromark-util-events-to-acorn@1.2.3: - resolution: {integrity: sha512-ij4X7Wuc4fED6UoLWkmo0xJQhsktfNh1J0m8g4PbIMPlx+ek/4YdW5mvbye8z/aZvAPUoxgXHrwVlXAPKMRp1w==} + micromark-util-events-to-acorn@1.2.3: dependencies: '@types/acorn': 4.0.6 '@types/estree': 1.0.5 @@ -5118,89 +7156,68 @@ packages: uvu: 0.5.6 vfile-message: 3.1.4 - /micromark-util-html-tag-name@1.2.0: - resolution: {integrity: sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q==} + micromark-util-html-tag-name@1.2.0: {} - /micromark-util-html-tag-name@2.0.0: - resolution: {integrity: sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==} - dev: true + micromark-util-html-tag-name@2.0.0: {} - /micromark-util-normalize-identifier@1.1.0: - resolution: {integrity: sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q==} + micromark-util-normalize-identifier@1.1.0: dependencies: micromark-util-symbol: 1.1.0 - /micromark-util-normalize-identifier@2.0.0: - resolution: {integrity: sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==} + micromark-util-normalize-identifier@2.0.0: dependencies: micromark-util-symbol: 2.0.0 - dev: true - /micromark-util-resolve-all@1.1.0: - resolution: {integrity: sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA==} + micromark-util-resolve-all@1.1.0: dependencies: micromark-util-types: 1.1.0 - /micromark-util-resolve-all@2.0.0: - resolution: {integrity: sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==} + micromark-util-resolve-all@2.0.0: dependencies: micromark-util-types: 2.0.0 - dev: true - /micromark-util-sanitize-uri@1.2.0: - resolution: {integrity: sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A==} + micromark-util-sanitize-uri@1.2.0: dependencies: micromark-util-character: 1.2.0 micromark-util-encode: 1.1.0 micromark-util-symbol: 1.1.0 - /micromark-util-sanitize-uri@2.0.0: - resolution: {integrity: sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==} + micromark-util-sanitize-uri@2.0.0: dependencies: micromark-util-character: 2.0.1 micromark-util-encode: 2.0.0 micromark-util-symbol: 2.0.0 - /micromark-util-subtokenize@1.1.0: - resolution: {integrity: sha512-kUQHyzRoxvZO2PuLzMt2P/dwVsTiivCK8icYTeR+3WgbuPqfHgPPy7nFKbeqRivBvn/3N3GBiNC+JRTMSxEC7A==} + micromark-util-subtokenize@1.1.0: dependencies: micromark-util-chunked: 1.1.0 micromark-util-symbol: 1.1.0 micromark-util-types: 1.1.0 uvu: 0.5.6 - /micromark-util-subtokenize@2.0.0: - resolution: {integrity: sha512-vc93L1t+gpR3p8jxeVdaYlbV2jTYteDje19rNSS/H5dlhxUYll5Fy6vJ2cDwP8RnsXi818yGty1ayP55y3W6fg==} + micromark-util-subtokenize@2.0.0: dependencies: devlop: 1.1.0 micromark-util-chunked: 2.0.0 micromark-util-symbol: 2.0.0 micromark-util-types: 2.0.0 - dev: true - /micromark-util-symbol@1.1.0: - resolution: {integrity: sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==} + micromark-util-symbol@1.1.0: {} - /micromark-util-symbol@2.0.0: - resolution: {integrity: sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==} + micromark-util-symbol@2.0.0: {} - /micromark-util-types@1.1.0: - resolution: {integrity: sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==} + micromark-util-types@1.1.0: {} - /micromark-util-types@2.0.0: - resolution: {integrity: sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==} + micromark-util-types@2.0.0: {} - /micromark@2.11.4: - resolution: {integrity: sha512-+WoovN/ppKolQOFIAajxi7Lu9kInbPxFuTBVEavFcL8eAfVstoc5MocPmqBeAdBOJV00uaVjegzH4+MA0DN/uA==} + micromark@2.11.4: dependencies: debug: 4.3.4 parse-entities: 2.0.0 transitivePeerDependencies: - supports-color - dev: true - /micromark@3.2.0: - resolution: {integrity: sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA==} + micromark@3.2.0: dependencies: '@types/debug': 4.1.11 debug: 4.3.4 @@ -5222,8 +7239,7 @@ packages: transitivePeerDependencies: - supports-color - /micromark@4.0.0: - resolution: {integrity: sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==} + micromark@4.0.0: dependencies: '@types/debug': 4.1.11 debug: 4.3.4 @@ -5244,90 +7260,47 @@ packages: micromark-util-types: 2.0.0 transitivePeerDependencies: - supports-color - dev: true - /micromatch@4.0.5: - resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} - engines: {node: '>=8.6'} + micromatch@4.0.5: dependencies: braces: 3.0.2 picomatch: 2.3.1 - /mimic-fn@2.1.0: - resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} - engines: {node: '>=6'} - dev: true + mimic-fn@2.1.0: {} - /mimic-fn@4.0.0: - resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} - engines: {node: '>=12'} - dev: true + mimic-fn@4.0.0: {} - /min-indent@1.0.1: - resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} - engines: {node: '>=4'} - dev: true + min-indent@1.0.1: {} - /minimalistic-assert@1.0.1: - resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} - dev: true + minimalistic-assert@1.0.1: {} - /minimalistic-crypto-utils@1.0.1: - resolution: {integrity: sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==} - dev: true + minimalistic-crypto-utils@1.0.1: {} - /minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + minimatch@3.1.2: dependencies: brace-expansion: 1.1.11 - dev: true - /minimatch@5.1.6: - resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} - engines: {node: '>=10'} + minimatch@5.1.6: dependencies: brace-expansion: 2.0.1 - dev: true - /minimatch@9.0.3: - resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} - engines: {node: '>=16 || 14 >=14.17'} + minimatch@9.0.3: dependencies: brace-expansion: 2.0.1 - dev: true - /minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - dev: false + minimist@1.2.8: {} - /minipass@7.0.4: - resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==} - engines: {node: '>=16 || 14 >=14.17'} - dev: true + minipass@7.0.4: {} - /mri@1.2.0: - resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} - engines: {node: '>=4'} + mri@1.2.0: {} - /ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + ms@2.1.2: {} - /nanoid@3.3.7: - resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - dev: false + nanoid@3.3.7: {} - /natural-compare@1.4.0: - resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - dev: true + natural-compare@1.4.0: {} - /next-mdx-remote@4.4.1(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-1BvyXaIou6xy3XoNF4yaMZUCb6vD2GTAa5ciOa6WoO+gAUTYsb1K4rI/HSC2ogAWLrb/7VSV52skz07vOzmqIQ==} - engines: {node: '>=14', npm: '>=7'} - peerDependencies: - react: '>=16.x <=18.x' - react-dom: '>=16.x <=18.x' + next-mdx-remote@4.4.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: '@mdx-js/mdx': 2.3.0 '@mdx-js/react': 2.3.0(react@18.2.0) @@ -5337,63 +7310,28 @@ packages: vfile-matter: 3.0.1 transitivePeerDependencies: - supports-color - dev: false - /next-seo@6.4.0(next@14.2.10)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-XQFxkOL2hw0YE+P100HbI3EAvcludlHPxuzMgaIjKb7kPK0CvjGvLFjd9hszZFEDc5oiQkGFA8+cuWcnip7eYA==} - peerDependencies: - next: ^8.1.1-canary.54 || >=9.0.0 - react: '>=16.0.0' - react-dom: '>=16.0.0' + next-seo@6.4.0(next@14.2.10(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: - next: 14.2.10(react-dom@18.2.0)(react@18.2.0) + next: 14.2.10(react-dom@18.2.0(react@18.2.0))(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - dev: false - /next-sitemap@4.2.3(next@14.2.10): - resolution: {integrity: sha512-vjdCxeDuWDzldhCnyFCQipw5bfpl4HmZA7uoo3GAaYGjGgfL4Cxb1CiztPuWGmS+auYs7/8OekRS8C2cjdAsjQ==} - engines: {node: '>=14.18'} - hasBin: true - peerDependencies: - next: '*' + next-sitemap@4.2.3(next@14.2.10(react-dom@18.2.0(react@18.2.0))(react@18.2.0)): dependencies: '@corex/deepmerge': 4.0.43 '@next/env': 13.5.6 fast-glob: 3.3.2 minimist: 1.2.8 - next: 14.2.10(react-dom@18.2.0)(react@18.2.0) - dev: false + next: 14.2.10(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - /next-themes@0.2.1(next@14.2.10)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-B+AKNfYNIzh0vqQQKqQItTS8evEouKD7H5Hj3kmuPERwddR2TxvDSFZuTj6T7Jfn1oyeUyJMydPl1Bkxkh0W7A==} - peerDependencies: - next: '*' - react: '*' - react-dom: '*' + next-themes@0.2.1(next@14.2.10(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: - next: 14.2.10(react-dom@18.2.0)(react@18.2.0) + next: 14.2.10(react-dom@18.2.0(react@18.2.0))(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - dev: false - /next@14.2.10(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-sDDExXnh33cY3RkS9JuFEKaS4HmlWmDKP1VJioucCG6z5KuA008DPsDZOzi8UfqEk3Ii+2NCQSJrfbEWtZZfww==} - engines: {node: '>=18.17.0'} - hasBin: true - peerDependencies: - '@opentelemetry/api': ^1.1.0 - '@playwright/test': ^1.41.2 - react: ^18.2.0 - react-dom: ^18.2.0 - sass: ^1.3.0 - peerDependenciesMeta: - '@opentelemetry/api': - optional: true - '@playwright/test': - optional: true - sass: - optional: true + next@14.2.10(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: '@next/env': 14.2.10 '@swc/helpers': 0.5.5 @@ -5417,17 +7355,10 @@ packages: transitivePeerDependencies: - '@babel/core' - babel-plugin-macros - dev: false - /nextra-theme-docs@2.13.2(next@14.2.10)(nextra@2.13.2)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-yE4umXaImp1/kf/sFciPj2+EFrNSwd9Db26hi98sIIiujzGf3+9eUgAz45vF9CwBw50FSXxm1QGRcY+slQ4xQQ==} - peerDependencies: - next: '>=9.5.3' - nextra: 2.13.2 - react: '>=16.13.1' - react-dom: '>=16.13.1' + nextra-theme-docs@2.13.2(next@14.2.10(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(nextra@2.13.2(patch_hash=a4rp2hgojklggjmthmkiyqaek4)(next@14.2.10(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: - '@headlessui/react': 1.7.17(react-dom@18.2.0)(react@18.2.0) + '@headlessui/react': 1.7.17(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@popperjs/core': 2.11.8 clsx: 2.1.1 escape-string-regexp: 5.0.0 @@ -5436,25 +7367,18 @@ packages: git-url-parse: 13.1.1 intersection-observer: 0.12.2 match-sorter: 6.3.1 - next: 14.2.10(react-dom@18.2.0)(react@18.2.0) - next-seo: 6.4.0(next@14.2.10)(react-dom@18.2.0)(react@18.2.0) - next-themes: 0.2.1(next@14.2.10)(react-dom@18.2.0)(react@18.2.0) - nextra: 2.13.2(patch_hash=a4rp2hgojklggjmthmkiyqaek4)(next@14.2.10)(react-dom@18.2.0)(react@18.2.0) + next: 14.2.10(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + next-seo: 6.4.0(next@14.2.10(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + next-themes: 0.2.1(next@14.2.10(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + nextra: 2.13.2(patch_hash=a4rp2hgojklggjmthmkiyqaek4)(next@14.2.10(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) scroll-into-view-if-needed: 3.1.0 zod: 3.22.4 - dev: false - /nextra@2.13.2(patch_hash=a4rp2hgojklggjmthmkiyqaek4)(next@14.2.10)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-pIgOSXNUqTz1laxV4ChFZOU7lzJAoDHHaBPj8L09PuxrLKqU1BU/iZtXAG6bQeKCx8EPdBsoXxEuENnL9QGnGA==} - engines: {node: '>=16'} - peerDependencies: - next: '>=9.5.3' - react: '>=16.13.1' - react-dom: '>=16.13.1' + nextra@2.13.2(patch_hash=a4rp2hgojklggjmthmkiyqaek4)(next@14.2.10(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: - '@headlessui/react': 1.7.17(react-dom@18.2.0)(react@18.2.0) + '@headlessui/react': 1.7.17(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@mdx-js/mdx': 2.3.0 '@mdx-js/react': 2.3.0(react@18.2.0) '@napi-rs/simple-git': 0.1.9 @@ -5466,8 +7390,8 @@ packages: gray-matter: 4.0.3 katex: 0.16.9 lodash.get: 4.4.2 - next: 14.2.10(react-dom@18.2.0)(react@18.2.0) - next-mdx-remote: 4.4.1(react-dom@18.2.0)(react@18.2.0) + next: 14.2.10(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + next-mdx-remote: 4.4.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) p-limit: 3.1.0 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -5485,139 +7409,79 @@ packages: zod: 3.22.4 transitivePeerDependencies: - supports-color - dev: false - patched: true - /no-case@3.0.4: - resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} + no-case@3.0.4: dependencies: lower-case: 2.0.2 tslib: 2.6.2 - dev: false - /node-fetch@2.7.0: - resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} - engines: {node: 4.x || >=6.0.0} - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true + node-fetch@2.7.0: dependencies: whatwg-url: 5.0.0 - dev: true - /non-layered-tidy-tree-layout@2.0.2: - resolution: {integrity: sha512-gkXMxRzUH+PB0ax9dUN0yYF0S25BqeAYqhgMaLUFmpXLEk7Fcu8f4emJuOAY0V8kjDICxROIKsTAKsV/v355xw==} - dev: false + non-layered-tidy-tree-layout@2.0.2: {} - /nopt@7.2.0: - resolution: {integrity: sha512-CVDtwCdhYIvnAzFoJ6NJ6dX3oga9/HyciQDnG1vQDjSLMeKLJ4A93ZqYKDrgYSr1FBY5/hMYC+2VCi24pgpkGA==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - hasBin: true + nopt@7.2.0: dependencies: abbrev: 2.0.0 - dev: true - /npm-normalize-package-bin@3.0.1: - resolution: {integrity: sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dev: true + npm-normalize-package-bin@3.0.1: {} - /npm-run-path@2.0.2: - resolution: {integrity: sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==} - engines: {node: '>=4'} + npm-run-path@2.0.2: dependencies: path-key: 2.0.1 - dev: false - /npm-run-path@4.0.1: - resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} - engines: {node: '>=8'} + npm-run-path@4.0.1: dependencies: path-key: 3.1.1 - dev: true - /npm-run-path@5.1.0: - resolution: {integrity: sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + npm-run-path@5.1.0: dependencies: path-key: 4.0.0 - dev: true - /npm-to-yarn@2.1.0: - resolution: {integrity: sha512-2C1IgJLdJngq1bSER7K7CGFszRr9s2rijEwvENPEgI0eK9xlD3tNwDc0UJnRj7FIT2aydWm72jB88uVswAhXHA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dev: false + npm-to-yarn@2.1.0: {} - /number-to-bn@1.7.0: - resolution: {integrity: sha512-wsJ9gfSz1/s4ZsJN01lyonwuxA1tml6X1yBDnfpMglypcBRFZZkus26EdPSlqS5GJfYddVZa22p3VNb3z5m5Ig==} - engines: {node: '>=6.5.0', npm: '>=3'} + number-to-bn@1.7.0: dependencies: bn.js: 4.11.6 strip-hex-prefix: 1.0.0 - dev: true - /object-inspect@1.13.1: - resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} - dev: false + object-inspect@1.13.1: {} - /object-is@1.1.5: - resolution: {integrity: sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==} - engines: {node: '>= 0.4'} + object-is@1.1.5: dependencies: call-bind: 1.0.5 define-properties: 1.2.1 - dev: false - /object-keys@1.1.1: - resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} - engines: {node: '>= 0.4'} - dev: false + object-keys@1.1.1: {} - /object.assign@4.1.4: - resolution: {integrity: sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==} - engines: {node: '>= 0.4'} + object.assign@4.1.4: dependencies: call-bind: 1.0.5 define-properties: 1.2.1 has-symbols: 1.0.3 object-keys: 1.1.1 - dev: false - /once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + once@1.4.0: dependencies: wrappy: 1.0.2 - dev: true - /onetime@5.1.2: - resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} - engines: {node: '>=6'} + onetime@5.1.2: dependencies: mimic-fn: 2.1.0 - dev: true - /onetime@6.0.0: - resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} - engines: {node: '>=12'} + onetime@6.0.0: dependencies: mimic-fn: 4.0.0 - dev: true - /open@9.1.0: - resolution: {integrity: sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==} - engines: {node: '>=14.16'} + open@9.1.0: dependencies: default-browser: 4.0.0 define-lazy-prop: 3.0.0 is-inside-container: 1.0.0 is-wsl: 2.2.0 - dev: true - /optionator@0.9.3: - resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} - engines: {node: '>= 0.8.0'} + optionator@0.9.3: dependencies: '@aashutoshrathi/word-wrap': 1.2.6 deep-is: 0.1.4 @@ -5625,63 +7489,39 @@ packages: levn: 0.4.1 prelude-ls: 1.2.1 type-check: 0.4.0 - dev: true - /p-finally@1.0.0: - resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==} - engines: {node: '>=4'} - dev: false + p-finally@1.0.0: {} - /p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} + p-limit@3.1.0: dependencies: yocto-queue: 0.1.0 - /p-limit@4.0.0: - resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + p-limit@4.0.0: dependencies: yocto-queue: 1.0.0 - dev: true - /p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} + p-locate@5.0.0: dependencies: p-limit: 3.1.0 - dev: true - /p-locate@6.0.0: - resolution: {integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + p-locate@6.0.0: dependencies: p-limit: 4.0.0 - dev: true - /param-case@3.0.4: - resolution: {integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==} + param-case@3.0.4: dependencies: dot-case: 3.0.4 tslib: 2.6.2 - dev: false - /parent-module@1.0.1: - resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} - engines: {node: '>=6'} + parent-module@1.0.1: dependencies: callsites: 3.1.0 - dev: true - /parent-module@2.0.0: - resolution: {integrity: sha512-uo0Z9JJeWzv8BG+tRcapBKNJ0dro9cLyczGzulS6EfeyAdeC9sbojtW6XwvYxJkEne9En+J2XEl4zyglVeIwFg==} - engines: {node: '>=8'} + parent-module@2.0.0: dependencies: callsites: 3.1.0 - dev: true - /parse-entities@2.0.0: - resolution: {integrity: sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==} + parse-entities@2.0.0: dependencies: character-entities: 1.2.4 character-entities-legacy: 1.1.4 @@ -5689,10 +7529,8 @@ packages: is-alphanumerical: 1.0.4 is-decimal: 1.0.4 is-hexadecimal: 1.0.4 - dev: true - /parse-entities@4.0.1: - resolution: {integrity: sha512-SWzvYcSJh4d/SGLIOQfZ/CoNv6BTlI6YEQ7Nj82oDVnRpwe/Z/F1EMx42x3JAOwGBlCjeCH0BRJQbQ/opHL17w==} + parse-entities@4.0.1: dependencies: '@types/unist': 2.0.9 character-entities: 2.0.2 @@ -5703,230 +7541,134 @@ packages: is-decimal: 2.0.1 is-hexadecimal: 2.0.1 - /parse-json@6.0.2: - resolution: {integrity: sha512-SA5aMiaIjXkAiBrW/yPgLgQAQg42f7K3ACO+2l/zOvtQBwX58DMUsFJXelW2fx3yMBmWOVkR6j1MGsdSbCA4UA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + parse-json@6.0.2: dependencies: '@babel/code-frame': 7.23.4 error-ex: 1.3.2 json-parse-even-better-errors: 2.3.1 lines-and-columns: 2.0.4 - dev: true - /parse-numeric-range@1.3.0: - resolution: {integrity: sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ==} - dev: false + parse-numeric-range@1.3.0: {} - /parse-path@7.0.0: - resolution: {integrity: sha512-Euf9GG8WT9CdqwuWJGdf3RkUcTBArppHABkO7Lm8IzRQp0e2r/kkFnmhu4TSK30Wcu5rVAZLmfPKSBBi9tWFog==} + parse-path@7.0.0: dependencies: protocols: 2.0.1 - dev: false - /parse-url@8.1.0: - resolution: {integrity: sha512-xDvOoLU5XRrcOZvnI6b8zA6n9O9ejNk/GExuz1yBuWUGn9KA97GI6HTs6u02wKara1CeVmZhH+0TZFdWScR89w==} + parse-url@8.1.0: dependencies: parse-path: 7.0.0 - dev: false - /parse5@7.1.2: - resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} + parse5@7.1.2: dependencies: entities: 4.5.0 - dev: false - /pascal-case@3.1.2: - resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==} + pascal-case@3.1.2: dependencies: no-case: 3.0.4 tslib: 2.6.2 - dev: false - /path-case@3.0.4: - resolution: {integrity: sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg==} + path-case@3.0.4: dependencies: dot-case: 3.0.4 tslib: 2.6.2 - dev: false - /path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} - dev: true + path-exists@4.0.0: {} - /path-exists@5.0.0: - resolution: {integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dev: true + path-exists@5.0.0: {} - /path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} - dev: true + path-is-absolute@1.0.1: {} - /path-key@2.0.1: - resolution: {integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==} - engines: {node: '>=4'} - dev: false + path-key@2.0.1: {} - /path-key@3.1.1: - resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} - engines: {node: '>=8'} - dev: true + path-key@3.1.1: {} - /path-key@4.0.0: - resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} - engines: {node: '>=12'} - dev: true + path-key@4.0.0: {} - /path-scurry@1.10.1: - resolution: {integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==} - engines: {node: '>=16 || 14 >=14.17'} + path-scurry@1.10.1: dependencies: lru-cache: 10.0.3 minipass: 7.0.4 - dev: true - /path-type@4.0.0: - resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} - engines: {node: '>=8'} - dev: true + path-type@4.0.0: {} - /pathval@1.1.1: - resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} - dev: true + pathval@1.1.1: {} - /periscopic@3.1.0: - resolution: {integrity: sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==} + periscopic@3.1.0: dependencies: '@types/estree': 1.0.5 estree-walker: 3.0.3 is-reference: 3.0.2 - dev: false - /picocolors@1.0.0: - resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + picocolors@1.0.0: {} - /picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} + picomatch@2.3.1: {} - /pluralize@8.0.0: - resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} - engines: {node: '>=4'} - dev: true + pluralize@8.0.0: {} - /postcss@8.4.31: - resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} - engines: {node: ^10 || ^12 || >=14} + postcss@8.4.31: dependencies: nanoid: 3.3.7 picocolors: 1.0.0 source-map-js: 1.0.2 - dev: false - /prelude-ls@1.2.1: - resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} - engines: {node: '>= 0.8.0'} - dev: true + prelude-ls@1.2.1: {} - /pretty-format@27.5.1: - resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + pretty-format@27.5.1: dependencies: ansi-regex: 5.0.1 ansi-styles: 5.2.0 react-is: 17.0.2 - dev: false - /proc-log@3.0.0: - resolution: {integrity: sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dev: true + proc-log@3.0.0: {} - /property-information@6.4.0: - resolution: {integrity: sha512-9t5qARVofg2xQqKtytzt+lZ4d1Qvj8t5B8fEwXK6qOfgRLgH/b13QlgEyDh033NOS31nXeFbYv7CLUDG1CeifQ==} - dev: false + property-information@6.4.0: {} - /protocols@2.0.1: - resolution: {integrity: sha512-/XJ368cyBJ7fzLMwLKv1e4vLxOju2MNAIokcr7meSaNcVbWz/CPcW22cP04mwxOErdA5mwjA8Q6w/cdAQxVn7Q==} - dev: false + protocols@2.0.1: {} - /pseudomap@1.0.2: - resolution: {integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==} - dev: false + pseudomap@1.0.2: {} - /punycode@2.3.1: - resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} - engines: {node: '>=6'} - dev: true + punycode@2.3.1: {} - /queue-microtask@1.2.3: - resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + queue-microtask@1.2.3: {} - /randombytes@2.1.0: - resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + randombytes@2.1.0: dependencies: safe-buffer: 5.2.1 - dev: true - /react-dom@18.2.0(react@18.2.0): - resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==} - peerDependencies: - react: ^18.2.0 + react-dom@18.2.0(react@18.2.0): dependencies: loose-envify: 1.4.0 react: 18.2.0 scheduler: 0.23.0 - dev: false - /react-is@17.0.2: - resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} - dev: false + react-is@17.0.2: {} - /react@18.2.0: - resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==} - engines: {node: '>=0.10.0'} + react@18.2.0: dependencies: loose-envify: 1.4.0 - dev: false - /read-package-json-fast@3.0.2: - resolution: {integrity: sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + read-package-json-fast@3.0.2: dependencies: json-parse-even-better-errors: 3.0.0 npm-normalize-package-bin: 3.0.1 - dev: true - /readable-stream@3.6.2: - resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} - engines: {node: '>= 6'} + readable-stream@3.6.2: dependencies: inherits: 2.0.4 string_decoder: 1.3.0 util-deprecate: 1.0.2 - dev: true - /reading-time@1.5.0: - resolution: {integrity: sha512-onYyVhBNr4CmAxFsKS7bz+uTLRakypIe4R+5A824vBSkQy/hB3fZepoVEf8OVAxzLvK+H/jm9TzpI3ETSm64Kg==} - dev: false + reading-time@1.5.0: {} - /regenerator-runtime@0.14.0: - resolution: {integrity: sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==} - dev: false + regenerator-runtime@0.14.0: {} - /regexp.prototype.flags@1.5.1: - resolution: {integrity: sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==} - engines: {node: '>= 0.4'} + regexp.prototype.flags@1.5.1: dependencies: call-bind: 1.0.5 define-properties: 1.2.1 set-function-name: 2.0.1 - dev: false - /rehype-katex@7.0.0: - resolution: {integrity: sha512-h8FPkGE00r2XKU+/acgqwWUlyzve1IiOKwsEkg4pDL3k48PiE0Pt+/uLtVHDVkN1yA4iurZN6UES8ivHVEQV6Q==} + rehype-katex@7.0.0: dependencies: '@types/hast': 3.0.2 '@types/katex': 0.16.5 @@ -5935,40 +7677,27 @@ packages: katex: 0.16.9 unist-util-visit-parents: 6.0.1 vfile: 6.0.1 - dev: false - /rehype-pretty-code@0.9.11(shiki@0.14.5): - resolution: {integrity: sha512-Eq90eCYXQJISktfRZ8PPtwc5SUyH6fJcxS8XOMnHPUQZBtC6RYo67gGlley9X2nR8vlniPj0/7oCDEYHKQa/oA==} - engines: {node: '>=16'} - peerDependencies: - shiki: '*' + rehype-pretty-code@0.9.11(shiki@0.14.5): dependencies: '@types/hast': 2.3.7 hash-obj: 4.0.0 parse-numeric-range: 1.3.0 shiki: 0.14.5 - dev: false - /rehype-raw@7.0.0: - resolution: {integrity: sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==} + rehype-raw@7.0.0: dependencies: '@types/hast': 3.0.2 hast-util-raw: 9.0.1 vfile: 6.0.1 - dev: false - /remark-code-import@1.2.0(patch_hash=heylvfasxh3ubj2edns2svea2m): - resolution: {integrity: sha512-fgwLruqlZbVOIhCJFjY+JDwPZhA4/eK3InJzN8Ox8UDdtudpG212JwtRj6la+lAzJU7JmSEyewZSukVZdknt3Q==} - engines: {node: '>= 12'} + remark-code-import@1.2.0(patch_hash=heylvfasxh3ubj2edns2svea2m): dependencies: strip-indent: 4.0.0 to-gatsby-remark-plugin: 0.1.0 unist-util-visit: 4.1.2 - dev: true - patched: true - /remark-frontmatter@5.0.0: - resolution: {integrity: sha512-XTFYvNASMe5iPN0719nPrdItC9aU0ssC4v14mH1BCi1u0n1gAocqcujWUrByftZTbLhRtiKRyjYTSIOcr69UVQ==} + remark-frontmatter@5.0.0: dependencies: '@types/mdast': 4.0.2 mdast-util-frontmatter: 2.0.1 @@ -5976,10 +7705,8 @@ packages: unified: 11.0.4 transitivePeerDependencies: - supports-color - dev: true - /remark-gfm@3.0.1: - resolution: {integrity: sha512-lEFDoi2PICJyNrACFOfDD3JlLkuSbOa5Wd8EPt06HUdptv8Gn0bxYTdbU/XXQ3swAPkEaGxxPN9cbnMHvVu1Ig==} + remark-gfm@3.0.1: dependencies: '@types/mdast': 3.0.14 mdast-util-gfm: 2.0.2 @@ -5988,8 +7715,7 @@ packages: transitivePeerDependencies: - supports-color - /remark-lint-blockquote-indentation@3.1.2: - resolution: {integrity: sha512-5DOrFsZd5dXqA4p/VZvWSrqIWNFbBXjX7IV/FkVkxlNhNF/0FMf/4v8x1I2W3mzaZ7yDsWS/egpZnmligq1ckQ==} + remark-lint-blockquote-indentation@3.1.2: dependencies: '@types/mdast': 3.0.14 pluralize: 8.0.0 @@ -5998,20 +7724,16 @@ packages: unist-util-generated: 2.0.1 unist-util-position: 4.0.4 unist-util-visit: 4.1.2 - dev: true - /remark-lint-checkbox-character-style@4.1.2: - resolution: {integrity: sha512-5ITz+1cCuJ3Jv/Q7rKgDEucCOnIgjWDnSHPJA1tb4TI/D316h+ALbDhZIpP8gyfAm6sBAh3Pwz9XZJN2uJB5UQ==} + remark-lint-checkbox-character-style@4.1.2: dependencies: '@types/mdast': 3.0.14 unified: 10.1.2 unified-lint-rule: 2.1.2 unist-util-position: 4.0.4 unist-util-visit: 4.1.2 - dev: true - /remark-lint-code-block-style@3.1.2: - resolution: {integrity: sha512-3wsWmzzdyEsB9sOzBOf46TSkwwVKXN2JpTEQb6feN0Tl6Vg75F7T9MHqMz7aqk/56bOXSxUzdpXDscGBhziLRA==} + remark-lint-code-block-style@3.1.2: dependencies: '@types/mdast': 3.0.14 unified: 10.1.2 @@ -6019,38 +7741,30 @@ packages: unist-util-generated: 2.0.1 unist-util-position: 4.0.4 unist-util-visit: 4.1.2 - dev: true - /remark-lint-emphasis-marker@3.1.2: - resolution: {integrity: sha512-hPZ8vxZrIfxmLA5B66bA8y3PdHjcCQuaLsySIqi5PM2DkpN6a7zAP3v1znyRSaYJ1ANVWcu00/0bNzuUjflGCA==} + remark-lint-emphasis-marker@3.1.2: dependencies: '@types/mdast': 3.0.14 unified: 10.1.2 unified-lint-rule: 2.1.2 unist-util-position: 4.0.4 unist-util-visit: 4.1.2 - dev: true - /remark-lint-fenced-code-marker@3.1.2: - resolution: {integrity: sha512-6XNqjOuhT+0c7Q/22aCsMz61ne9g8HRpYF79EXQPdbzYa+PcfPXMiQKStONY3PfC8OE2/3WXI2zcs8w9x+8+VQ==} + remark-lint-fenced-code-marker@3.1.2: dependencies: '@types/mdast': 3.0.14 unified: 10.1.2 unified-lint-rule: 2.1.2 unist-util-position: 4.0.4 unist-util-visit: 4.1.2 - dev: true - /remark-lint-final-newline@2.1.2: - resolution: {integrity: sha512-K0FdPGPyEB94PwNgopwVJFE8oRWi7IhY2ycXFVAMReI51el7EHB8F1gX14tB6p6zyGy6mUh69bCVU9mMTNeOUg==} + remark-lint-final-newline@2.1.2: dependencies: '@types/mdast': 3.0.14 unified: 10.1.2 unified-lint-rule: 2.1.2 - dev: true - /remark-lint-frontmatter-schema@3.15.4(patch_hash=jaxvkozlhcbn7zjsiti5ocoubi): - resolution: {integrity: sha512-egChkbtCCG4hw1F2qoipzSxp6Ea9z4pxaVkWYa36DnCZ9fn3GhCNyOUjbFSIvdhVcWN+AqvHdqPbXC9Pp81Hmg==} + remark-lint-frontmatter-schema@3.15.4(patch_hash=jaxvkozlhcbn7zjsiti5ocoubi): dependencies: '@apidevtools/json-schema-ref-parser': 11.1.0 ajv: 8.12.0 @@ -6059,11 +7773,8 @@ packages: minimatch: 9.0.3 unified-lint-rule: 2.1.2 yaml: 2.3.3 - dev: true - patched: true - /remark-lint-hard-break-spaces@3.1.2: - resolution: {integrity: sha512-HaW0xsl3TI7VFAqGWWcZtPqyz0NWu19KKjSO7OGFTUJU4S9YiRnhIxmSFM0ZLSsVAynE+dhzVKa8U7dOpWDcOg==} + remark-lint-hard-break-spaces@3.1.2: dependencies: '@types/mdast': 3.0.14 unified: 10.1.2 @@ -6071,10 +7782,8 @@ packages: unist-util-generated: 2.0.1 unist-util-position: 4.0.4 unist-util-visit: 4.1.2 - dev: true - /remark-lint-heading-style@3.1.2: - resolution: {integrity: sha512-0RkcRPV/H2bPFgeInzBkK1cWUwtFTm83I+Db/Z5tDY02GzKOosHLvxtJyj/1391/opAH1LYbHtHWffir99IUgw==} + remark-lint-heading-style@3.1.2: dependencies: '@types/mdast': 3.0.14 mdast-util-heading-style: 2.0.1 @@ -6082,10 +7791,8 @@ packages: unified-lint-rule: 2.1.2 unist-util-generated: 2.0.1 unist-util-visit: 4.1.2 - dev: true - /remark-lint-link-title-style@3.1.2: - resolution: {integrity: sha512-if4MahYJVvQUWlrXDF8GSv4b9VtLSgMSDHeikQp1/hGYlihLl9uGw3nlL5Lf9DqTN0qaT6RPbXOjuuzHlk38sg==} + remark-lint-link-title-style@3.1.2: dependencies: '@types/mdast': 3.0.14 unified: 10.1.2 @@ -6093,20 +7800,16 @@ packages: unist-util-position: 4.0.4 unist-util-visit: 4.1.2 vfile-location: 4.1.0 - dev: true - /remark-lint-list-item-bullet-indent@4.1.2: - resolution: {integrity: sha512-WgU5nooqIEm6f35opcbHKBzWrdFJA3XcyTfB3nv/v0KX43/h6qFGmmMJ5kEiaFExuQp3dZSdatWuY0YZ9YRbUg==} + remark-lint-list-item-bullet-indent@4.1.2: dependencies: '@types/mdast': 3.0.14 pluralize: 8.0.0 unified: 10.1.2 unified-lint-rule: 2.1.2 unist-util-visit: 4.1.2 - dev: true - /remark-lint-list-item-content-indent@3.1.2: - resolution: {integrity: sha512-TB0pmrWiRaQW80Y/PILFQTnHDghRxXNzMwyawlP+DBF9gNom3pEBmb4ZlGQlN0aa3r8VWeIKdv1ylHrfXE0vqA==} + remark-lint-list-item-content-indent@3.1.2: dependencies: '@types/mdast': 3.0.14 pluralize: 8.0.0 @@ -6114,10 +7817,8 @@ packages: unified-lint-rule: 2.1.2 unist-util-position: 4.0.4 unist-util-visit: 4.1.2 - dev: true - /remark-lint-list-item-indent@3.1.2: - resolution: {integrity: sha512-tkrra1pxZVE4OVJGfN435u/v0ljruXU+dHzWiKDYeifquD4aWhJxvSApu7+FbE098D/4usVXgMxwFkNhrpZcSQ==} + remark-lint-list-item-indent@3.1.2: dependencies: '@types/mdast': 3.0.14 pluralize: 8.0.0 @@ -6126,10 +7827,8 @@ packages: unist-util-generated: 2.0.1 unist-util-position: 4.0.4 unist-util-visit: 4.1.2 - dev: true - /remark-lint-no-blockquote-without-marker@5.1.2: - resolution: {integrity: sha512-QPbqsrt7EfpSWqTkZJ9tepabPIhBDlNqZkuxxMQYD0OQ2N+tHDUq3zE1JxI5ts1V9o/mWApgySocqGd3jlcKmQ==} + remark-lint-no-blockquote-without-marker@5.1.2: dependencies: '@types/mdast': 3.0.14 unified: 10.1.2 @@ -6138,10 +7837,8 @@ packages: unist-util-position: 4.0.4 unist-util-visit: 4.1.2 vfile-location: 4.1.0 - dev: true - /remark-lint-no-duplicate-definitions@3.1.2: - resolution: {integrity: sha512-vi0nXA7p+pjQOorZOkr9E+QDhG74JAdbzqglWPrWWNI3z2rUYWYHTNSyWJbwEXaIIcev1ZAw8SCAOis5MNm+pA==} + remark-lint-no-duplicate-definitions@3.1.2: dependencies: '@types/mdast': 3.0.14 unified: 10.1.2 @@ -6150,10 +7847,8 @@ packages: unist-util-position: 4.0.4 unist-util-stringify-position: 3.0.3 unist-util-visit: 4.1.2 - dev: true - /remark-lint-no-heading-content-indent@4.1.2: - resolution: {integrity: sha512-TTxFsm1f4ZHFxZQCuz7j0QK4RvP6oArTiwazKLr16yaZe1608ypogMek4A30j2xX8WuO9+2uBzLXCY5OBo5x5Q==} + remark-lint-no-heading-content-indent@4.1.2: dependencies: '@types/mdast': 3.0.14 mdast-util-heading-style: 2.0.1 @@ -6163,10 +7858,8 @@ packages: unist-util-generated: 2.0.1 unist-util-position: 4.0.4 unist-util-visit: 4.1.2 - dev: true - /remark-lint-no-inline-padding@4.1.2: - resolution: {integrity: sha512-dGyhWsiqCZS3Slob0EVBUfsFBbdpMIBCvb56LlCgaHbnLsnNYx8PpF/wA5CgsN8BXIbXfRpyPB5cIJwIq5taYg==} + remark-lint-no-inline-padding@4.1.2: dependencies: '@types/mdast': 3.0.14 mdast-util-to-string: 3.2.0 @@ -6174,10 +7867,8 @@ packages: unified-lint-rule: 2.1.2 unist-util-generated: 2.0.1 unist-util-visit: 4.1.2 - dev: true - /remark-lint-no-literal-urls@3.1.2: - resolution: {integrity: sha512-4tV9JGLKxAMFSuWDMOqLozkFJ3HyRvhzgrPrxASoziaml23m7UXAozk5dkIrFny1cN2oG988Z8tORxX2FL1Ilw==} + remark-lint-no-literal-urls@3.1.2: dependencies: '@types/mdast': 3.0.14 mdast-util-to-string: 3.2.0 @@ -6186,30 +7877,24 @@ packages: unist-util-generated: 2.0.1 unist-util-position: 4.0.4 unist-util-visit: 4.1.2 - dev: true - /remark-lint-no-shortcut-reference-image@3.1.2: - resolution: {integrity: sha512-NX4XJFPyDeJJ77pmETxRj4oM/zayf7Lmn/O87HgExBkQIPz2NYbDeKD8QEyliLaV/oKA2rQufpzuFw55xa1Tww==} + remark-lint-no-shortcut-reference-image@3.1.2: dependencies: '@types/mdast': 3.0.14 unified: 10.1.2 unified-lint-rule: 2.1.2 unist-util-generated: 2.0.1 unist-util-visit: 4.1.2 - dev: true - /remark-lint-no-shortcut-reference-link@3.1.2: - resolution: {integrity: sha512-/9iPN7FLKaaIzw4tLWKu7Rx0wAP7E2EuzIeentQlkY0rO/mMHipmT3IlgiebsAInKagzTY6TNFoG1rq2VnaCcA==} + remark-lint-no-shortcut-reference-link@3.1.2: dependencies: '@types/mdast': 3.0.14 unified: 10.1.2 unified-lint-rule: 2.1.2 unist-util-generated: 2.0.1 unist-util-visit: 4.1.2 - dev: true - /remark-lint-no-undefined-references@4.2.1: - resolution: {integrity: sha512-HdNg5b2KiuNplcuVvRtsrUiROw557kAG1CiZYB7jQrrVWFgd86lKTa3bDiywe+87dGrGmHd3qQ28eZYTuHz2Nw==} + remark-lint-no-undefined-references@4.2.1: dependencies: '@types/mdast': 3.0.14 micromark-util-normalize-identifier: 1.1.0 @@ -6219,20 +7904,16 @@ packages: unist-util-position: 4.0.4 unist-util-visit: 4.1.2 vfile-location: 4.1.0 - dev: true - /remark-lint-no-unused-definitions@3.1.2: - resolution: {integrity: sha512-bOcaJAnjKxT3kASFquUA3fO9xem9wZhVqt8TbqjA84+G4n40qjaLXDs/4vq73aMsSde73K0f3j1u0pMe7et8yQ==} + remark-lint-no-unused-definitions@3.1.2: dependencies: '@types/mdast': 3.0.14 unified: 10.1.2 unified-lint-rule: 2.1.2 unist-util-generated: 2.0.1 unist-util-visit: 4.1.2 - dev: true - /remark-lint-ordered-list-marker-style@3.1.2: - resolution: {integrity: sha512-62iVE/YQsA0Azaqt8yAJWPplWLS47kDLjXeC2PlRIAzCqbNt9qH3HId8vZ15QTSrp8rHmJwrCMdcqV6AZUi7gQ==} + remark-lint-ordered-list-marker-style@3.1.2: dependencies: '@types/mdast': 3.0.14 unified: 10.1.2 @@ -6240,30 +7921,24 @@ packages: unist-util-generated: 2.0.1 unist-util-position: 4.0.4 unist-util-visit: 4.1.2 - dev: true - /remark-lint-rule-style@3.1.2: - resolution: {integrity: sha512-0CsX2XcX9pIhAP5N7Y8mhYXp3/Ld+NvxXY1p0LHAq0NZu17UsZLuegvx/s25uFbQs08DcmSqyKnepU9qGGqmTQ==} + remark-lint-rule-style@3.1.2: dependencies: '@types/mdast': 3.0.14 unified: 10.1.2 unified-lint-rule: 2.1.2 unist-util-position: 4.0.4 unist-util-visit: 4.1.2 - dev: true - /remark-lint-strong-marker@3.1.2: - resolution: {integrity: sha512-U/g4wngmiI0Q6WBRQG6pZxnDS33Wt/0QYA3+KNFBDykoi1vXsDEorIqy3dEag9z6XHwcMvFDsff6VRUhaOJWQg==} + remark-lint-strong-marker@3.1.2: dependencies: '@types/mdast': 3.0.14 unified: 10.1.2 unified-lint-rule: 2.1.2 unist-util-position: 4.0.4 unist-util-visit: 4.1.2 - dev: true - /remark-lint-table-cell-padding@4.1.3: - resolution: {integrity: sha512-N9xtnS6MG/H3srAMjqqaF26A7socr87pIgt64dr5rxoSbDRWRPChGQ8y7wKyV8VeyRNF37e3E5KB3bQVqjSYaQ==} + remark-lint-table-cell-padding@4.1.3: dependencies: '@types/mdast': 3.0.14 '@types/unist': 2.0.9 @@ -6271,30 +7946,24 @@ packages: unified-lint-rule: 2.1.2 unist-util-position: 4.0.4 unist-util-visit: 4.1.2 - dev: true - /remark-lint-table-pipe-alignment@3.1.3: - resolution: {integrity: sha512-bnE8WrB4kSrN+Yr+xN2GHWVgGukeSFU43qPMrpCzTyOSbzep366wORlFKqZmyFPEkIZ/uAUFS0Qm9DND66Yz/A==} + remark-lint-table-pipe-alignment@3.1.3: dependencies: '@types/mdast': 3.0.14 unified: 10.1.2 unified-lint-rule: 2.1.2 unist-util-position: 4.0.4 unist-util-visit: 4.1.2 - dev: true - /remark-lint-table-pipes@4.1.2: - resolution: {integrity: sha512-Ex2cJDXA0hdD9CC5Nu0p3K5LP+AhzPvk4sIOSbevCTSRyCS/SkNk4CQ6pwWBxuPVuHQUkqXkT8lgu8wwr/9A3A==} + remark-lint-table-pipes@4.1.2: dependencies: '@types/mdast': 3.0.14 unified: 10.1.2 unified-lint-rule: 2.1.2 unist-util-position: 4.0.4 unist-util-visit: 4.1.2 - dev: true - /remark-lint-unordered-list-marker-style@3.1.2: - resolution: {integrity: sha512-JFiyB4ZprJGGndCaFB8FssXd48m4Kh+CUqzNgu3lBLEiW8dEAGRlD9M2AzyyA+Q29WJP/FntDCbP22DeON91UA==} + remark-lint-unordered-list-marker-style@3.1.2: dependencies: '@types/mdast': 3.0.14 unified: 10.1.2 @@ -6302,37 +7971,30 @@ packages: unist-util-generated: 2.0.1 unist-util-position: 4.0.4 unist-util-visit: 4.1.2 - dev: true - /remark-lint@9.1.2: - resolution: {integrity: sha512-m9e/aPlh7tsvfJfj8tPxrQzD6oEdb9Foko+Ya/6OwUP9EoGMfehv1Qtv26W1DoH58Wn8rT8CD+KuprTWscMmIA==} + remark-lint@9.1.2: dependencies: '@types/mdast': 3.0.14 remark-message-control: 7.1.1 unified: 10.1.2 transitivePeerDependencies: - supports-color - dev: true - /remark-math@5.1.1: - resolution: {integrity: sha512-cE5T2R/xLVtfFI4cCePtiRn+e6jKMtFDR3P8V3qpv8wpKjwvHoBA4eJzvX+nVrnlNy0911bdGmuspCSwetfYHw==} + remark-math@5.1.1: dependencies: '@types/mdast': 3.0.14 mdast-util-math: 2.0.2 micromark-extension-math: 2.1.2 unified: 10.1.2 - dev: false - /remark-mdx@2.3.0: - resolution: {integrity: sha512-g53hMkpM0I98MU266IzDFMrTD980gNF3BJnkyFcmN+dD873mQeD5rdMO3Y2X+x8umQfbSE0PcoEDl7ledSA+2g==} + remark-mdx@2.3.0: dependencies: mdast-util-mdx: 2.0.1 micromark-extension-mdxjs: 1.0.1 transitivePeerDependencies: - supports-color - /remark-message-control@7.1.1: - resolution: {integrity: sha512-xKRWl1NTBOKed0oEtCd8BUfH5m4s8WXxFFSoo7uUwx6GW/qdCy4zov5LfPyw7emantDmhfWn5PdIZgcbVcWMDQ==} + remark-message-control@7.1.1: dependencies: '@types/mdast': 3.0.14 mdast-comment-marker: 2.1.2 @@ -6341,10 +8003,8 @@ packages: vfile: 5.3.7 transitivePeerDependencies: - supports-color - dev: true - /remark-parse@10.0.2: - resolution: {integrity: sha512-3ydxgHa/ZQzG8LvC7jTXccARYDcRld3VfcgIIFs7bI6vbRSxJJmzgLEIIoYKyrfhaY+ujuWaf/PJiMZXoiCXgw==} + remark-parse@10.0.2: dependencies: '@types/mdast': 3.0.14 mdast-util-from-markdown: 1.3.1 @@ -6352,8 +8012,7 @@ packages: transitivePeerDependencies: - supports-color - /remark-parse@11.0.0: - resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==} + remark-parse@11.0.0: dependencies: '@types/mdast': 4.0.2 mdast-util-from-markdown: 2.0.0 @@ -6361,10 +8020,8 @@ packages: unified: 11.0.4 transitivePeerDependencies: - supports-color - dev: true - /remark-preset-lint-consistent@5.1.2: - resolution: {integrity: sha512-RQrWBFmyIkKfXtp9P1Fui7UbGSfXth9nuvRJUVnO0vfevBJe02iyMZWPokXSwkDOI/cM539wj0i3vrQupz+v5A==} + remark-preset-lint-consistent@5.1.2: dependencies: '@types/mdast': 3.0.14 remark-lint: 9.1.2 @@ -6383,10 +8040,8 @@ packages: unified: 10.1.2 transitivePeerDependencies: - supports-color - dev: true - /remark-preset-lint-recommended@6.1.3: - resolution: {integrity: sha512-DGjbeP2TsFmQeJflUiIvJWAOs1PxJt7SG3WQyMxOppkRr/up+mxWVkuv+6AUuaR0EsuaaFGz7WmZM5TrSSFWJw==} + remark-preset-lint-recommended@6.1.3: dependencies: '@types/mdast': 3.0.14 remark-lint: 9.1.2 @@ -6407,44 +8062,34 @@ packages: unified: 10.1.2 transitivePeerDependencies: - supports-color - dev: true - /remark-reading-time@2.0.1: - resolution: {integrity: sha512-fy4BKy9SRhtYbEHvp6AItbRTnrhiDGbqLQTSYVbQPGuRCncU1ubSsh9p/W5QZSxtYcUXv8KGL0xBgPLyNJA1xw==} + remark-reading-time@2.0.1: dependencies: estree-util-is-identifier-name: 2.1.0 estree-util-value-to-estree: 1.3.0 reading-time: 1.5.0 unist-util-visit: 3.1.0 - dev: false - /remark-rehype@10.1.0: - resolution: {integrity: sha512-EFmR5zppdBp0WQeDVZ/b66CWJipB2q2VLNFMabzDSGR66Z2fQii83G5gTBbgGEnEEA0QRussvrFHxk1HWGJskw==} + remark-rehype@10.1.0: dependencies: '@types/hast': 2.3.7 '@types/mdast': 3.0.14 mdast-util-to-hast: 12.3.0 unified: 10.1.2 - dev: false - /remark-stringify@10.0.3: - resolution: {integrity: sha512-koyOzCMYoUHudypbj4XpnAKFbkddRMYZHwghnxd7ue5210WzGw6kOBwauJTRUMq16jsovXx8dYNvSSWP89kZ3A==} + remark-stringify@10.0.3: dependencies: '@types/mdast': 3.0.14 mdast-util-to-markdown: 1.5.0 unified: 10.1.2 - dev: true - /remark-stringify@11.0.0: - resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==} + remark-stringify@11.0.0: dependencies: '@types/mdast': 4.0.2 mdast-util-to-markdown: 2.1.0 unified: 11.0.4 - dev: true - /remark@15.0.1: - resolution: {integrity: sha512-Eht5w30ruCXgFmxVUSlNWQ9iiimq07URKeFS3hNc8cUWy1llX4KDWfyEDZRycMc+znsN9Ux5/tJ/BFdgdOwA3A==} + remark@15.0.1: dependencies: '@types/mdast': 4.0.2 remark-parse: 11.0.0 @@ -6452,504 +8097,284 @@ packages: unified: 11.0.4 transitivePeerDependencies: - supports-color - dev: true - /remove-accents@0.4.2: - resolution: {integrity: sha512-7pXIJqJOq5tFgG1A2Zxti3Ht8jJF337m4sowbuHsW30ZnkQFnDzy9qBNhgzX8ZLW4+UBcXiiR7SwR6pokHsxiA==} - dev: false + remove-accents@0.4.2: {} - /repeat-string@1.6.1: - resolution: {integrity: sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==} - engines: {node: '>=0.10'} - dev: true + repeat-string@1.6.1: {} - /require-from-string@2.0.2: - resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} - engines: {node: '>=0.10.0'} - dev: true + require-from-string@2.0.2: {} - /resolve-from@4.0.0: - resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} - engines: {node: '>=4'} - dev: true + resolve-from@4.0.0: {} - /resolve-from@5.0.0: - resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} - engines: {node: '>=8'} - dev: true + resolve-from@5.0.0: {} - /reusify@1.0.4: - resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} - engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + reusify@1.0.4: {} - /rimraf@3.0.2: - resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} - hasBin: true + rimraf@3.0.2: dependencies: glob: 7.2.3 - dev: true - /rlp@2.2.7: - resolution: {integrity: sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ==} - hasBin: true + rlp@2.2.7: dependencies: bn.js: 5.2.1 - dev: true - /robust-predicates@3.0.2: - resolution: {integrity: sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==} - dev: false + robust-predicates@3.0.2: {} - /run-applescript@5.0.0: - resolution: {integrity: sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==} - engines: {node: '>=12'} + run-applescript@5.0.0: dependencies: execa: 5.1.1 - dev: true - /run-parallel@1.2.0: - resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + run-parallel@1.2.0: dependencies: queue-microtask: 1.2.3 - /rw@1.3.3: - resolution: {integrity: sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==} - dev: false + rw@1.3.3: {} - /sade@1.8.1: - resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} - engines: {node: '>=6'} + sade@1.8.1: dependencies: mri: 1.2.0 - /safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - dev: true + safe-buffer@5.2.1: {} - /safer-buffer@2.1.2: - resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - dev: false + safer-buffer@2.1.2: {} - /scheduler@0.23.0: - resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==} + scheduler@0.23.0: dependencies: loose-envify: 1.4.0 - dev: false - /scroll-into-view-if-needed@3.1.0: - resolution: {integrity: sha512-49oNpRjWRvnU8NyGVmUaYG4jtTkNonFZI86MmGRDqBphEK2EXT9gdEUoQPZhuBM8yWHxCWbobltqYO5M4XrUvQ==} + scroll-into-view-if-needed@3.1.0: dependencies: compute-scroll-into-view: 3.1.0 - dev: false - /scrypt-js@3.0.1: - resolution: {integrity: sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==} - dev: true + scrypt-js@3.0.1: {} - /search-insights@2.15.0: - resolution: {integrity: sha512-ch2sPCUDD4sbPQdknVl9ALSi9H7VyoeVbsxznYz6QV55jJ8CI3EtwpO1i84keN4+hF5IeHWIeGvc08530JkVXQ==} - dev: false + search-insights@2.15.0: {} - /section-matter@1.0.0: - resolution: {integrity: sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==} - engines: {node: '>=4'} + section-matter@1.0.0: dependencies: extend-shallow: 2.0.1 kind-of: 6.0.3 - /semver@7.5.4: - resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} - engines: {node: '>=10'} - hasBin: true + semver@7.5.4: dependencies: lru-cache: 6.0.0 - dev: true - /sentence-case@3.0.4: - resolution: {integrity: sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg==} + sentence-case@3.0.4: dependencies: no-case: 3.0.4 tslib: 2.6.2 upper-case-first: 2.0.2 - dev: false - /set-function-length@1.1.1: - resolution: {integrity: sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==} - engines: {node: '>= 0.4'} + set-function-length@1.1.1: dependencies: define-data-property: 1.1.1 get-intrinsic: 1.2.2 gopd: 1.0.1 has-property-descriptors: 1.0.1 - dev: false - /set-function-name@2.0.1: - resolution: {integrity: sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==} - engines: {node: '>= 0.4'} + set-function-name@2.0.1: dependencies: define-data-property: 1.1.1 functions-have-names: 1.2.3 has-property-descriptors: 1.0.1 - dev: false - /shebang-command@1.2.0: - resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} - engines: {node: '>=0.10.0'} + shebang-command@1.2.0: dependencies: shebang-regex: 1.0.0 - dev: false - /shebang-command@2.0.0: - resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} - engines: {node: '>=8'} + shebang-command@2.0.0: dependencies: shebang-regex: 3.0.0 - dev: true - /shebang-regex@1.0.0: - resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==} - engines: {node: '>=0.10.0'} - dev: false + shebang-regex@1.0.0: {} - /shebang-regex@3.0.0: - resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} - engines: {node: '>=8'} - dev: true + shebang-regex@3.0.0: {} - /shiki@0.14.5: - resolution: {integrity: sha512-1gCAYOcmCFONmErGTrS1fjzJLA7MGZmKzrBNX7apqSwhyITJg2O102uFzXUeBxNnEkDA9vHIKLyeKq0V083vIw==} + shiki@0.14.5: dependencies: ansi-sequence-parser: 1.1.1 jsonc-parser: 3.2.0 vscode-oniguruma: 1.7.0 vscode-textmate: 8.0.0 - dev: false - /side-channel@1.0.4: - resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} + side-channel@1.0.4: dependencies: call-bind: 1.0.5 get-intrinsic: 1.2.2 object-inspect: 1.13.1 - dev: false - /signal-exit@3.0.7: - resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + signal-exit@3.0.7: {} - /signal-exit@4.1.0: - resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} - engines: {node: '>=14'} - dev: true + signal-exit@4.1.0: {} - /slash@3.0.0: - resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} - engines: {node: '>=8'} + slash@3.0.0: {} - /snake-case@3.0.4: - resolution: {integrity: sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==} + snake-case@3.0.4: dependencies: dot-case: 3.0.4 tslib: 2.6.2 - dev: false - /sort-keys@5.0.0: - resolution: {integrity: sha512-Pdz01AvCAottHTPQGzndktFNdbRA75BgOfeT1hH+AMnJFv8lynkPi42rfeEhpx1saTEI3YNMWxfqu0sFD1G8pw==} - engines: {node: '>=12'} + sort-keys@5.0.0: dependencies: is-plain-obj: 4.1.0 - dev: false - /source-map-js@1.0.2: - resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} - engines: {node: '>=0.10.0'} - dev: false + source-map-js@1.0.2: {} - /source-map@0.7.4: - resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} - engines: {node: '>= 8'} - dev: false + source-map@0.7.4: {} - /space-separated-tokens@2.0.2: - resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} - dev: false + space-separated-tokens@2.0.2: {} - /sprintf-js@1.0.3: - resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + sprintf-js@1.0.3: {} - /stop-iteration-iterator@1.0.0: - resolution: {integrity: sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==} - engines: {node: '>= 0.4'} + stop-iteration-iterator@1.0.0: dependencies: internal-slot: 1.0.6 - dev: false - /streamsearch@1.1.0: - resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} - engines: {node: '>=10.0.0'} - dev: false + streamsearch@1.1.0: {} - /string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} + string-width@4.2.3: dependencies: emoji-regex: 8.0.0 is-fullwidth-code-point: 3.0.0 strip-ansi: 6.0.1 - dev: true - /string-width@5.1.2: - resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} - engines: {node: '>=12'} + string-width@5.1.2: dependencies: eastasianwidth: 0.2.0 emoji-regex: 9.2.2 strip-ansi: 7.1.0 - dev: true - /string_decoder@1.3.0: - resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + string_decoder@1.3.0: dependencies: safe-buffer: 5.2.1 - dev: true - /stringify-entities@4.0.3: - resolution: {integrity: sha512-BP9nNHMhhfcMbiuQKCqMjhDP5yBCAxsPu4pHFFzJ6Alo9dZgY4VLDPutXqIjpRiMoKdp7Av85Gr73Q5uH9k7+g==} + stringify-entities@4.0.3: dependencies: character-entities-html4: 2.1.0 character-entities-legacy: 3.0.0 - /strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} + strip-ansi@6.0.1: dependencies: ansi-regex: 5.0.1 - dev: true - /strip-ansi@7.1.0: - resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} - engines: {node: '>=12'} + strip-ansi@7.1.0: dependencies: ansi-regex: 6.0.1 - dev: true - /strip-bom-string@1.0.0: - resolution: {integrity: sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==} - engines: {node: '>=0.10.0'} + strip-bom-string@1.0.0: {} - /strip-eof@1.0.0: - resolution: {integrity: sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==} - engines: {node: '>=0.10.0'} - dev: false + strip-eof@1.0.0: {} - /strip-final-newline@2.0.0: - resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} - engines: {node: '>=6'} - dev: true + strip-final-newline@2.0.0: {} - /strip-final-newline@3.0.0: - resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} - engines: {node: '>=12'} - dev: true + strip-final-newline@3.0.0: {} - /strip-hex-prefix@1.0.0: - resolution: {integrity: sha512-q8d4ue7JGEiVcypji1bALTos+0pWtyGlivAWyPuTkHzuTCJqrK9sWxYQZUq6Nq3cuyv3bm734IhHvHtGGURU6A==} - engines: {node: '>=6.5.0', npm: '>=3'} + strip-hex-prefix@1.0.0: dependencies: is-hex-prefixed: 1.0.0 - dev: true - /strip-indent@4.0.0: - resolution: {integrity: sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA==} - engines: {node: '>=12'} + strip-indent@4.0.0: dependencies: min-indent: 1.0.1 - dev: true - /strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} - dev: true + strip-json-comments@3.1.1: {} - /style-to-object@0.4.4: - resolution: {integrity: sha512-HYNoHZa2GorYNyqiCaBgsxvcJIn7OHq6inEga+E6Ke3m5JkoqpQbnFssk4jwe+K7AhGa2fcha4wSOf1Kn01dMg==} + style-to-object@0.4.4: dependencies: inline-style-parser: 0.1.1 - dev: false - /styled-jsx@5.1.1(react@18.2.0): - resolution: {integrity: sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==} - engines: {node: '>= 12.0.0'} - peerDependencies: - '@babel/core': '*' - babel-plugin-macros: '*' - react: '>= 16.8.0 || 17.x.x || ^18.0.0-0' - peerDependenciesMeta: - '@babel/core': - optional: true - babel-plugin-macros: - optional: true + styled-jsx@5.1.1(react@18.2.0): dependencies: client-only: 0.0.1 react: 18.2.0 - dev: false - /stylis@4.3.0: - resolution: {integrity: sha512-E87pIogpwUsUwXw7dNyU4QDjdgVMy52m+XEOPEKUn161cCzWjjhPSQhByfd1CcNvrOLnXQ6OnnZDwnJrz/Z4YQ==} - dev: false + stylis@4.3.0: {} - /supports-color@4.5.0: - resolution: {integrity: sha512-ycQR/UbvI9xIlEdQT1TQqwoXtEldExbCEAJgRo5YXlmSKjv6ThHnP9/vwGa1gr19Gfw+LkFd7KqYMhzrRC5JYw==} - engines: {node: '>=4'} + supports-color@4.5.0: dependencies: has-flag: 2.0.0 - dev: false - /supports-color@5.5.0: - resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} - engines: {node: '>=4'} + supports-color@5.5.0: dependencies: has-flag: 3.0.0 - /supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} + supports-color@7.2.0: dependencies: has-flag: 4.0.0 - /supports-color@9.4.0: - resolution: {integrity: sha512-VL+lNrEoIXww1coLPOmiEmK/0sGigko5COxI09KzHc2VJXJsQ37UaQ+8quuxjDeA7+KnLGTWRyOXSLLR2Wb4jw==} - engines: {node: '>=12'} - dev: true + supports-color@9.4.0: {} - /synckit@0.8.5: - resolution: {integrity: sha512-L1dapNV6vu2s/4Sputv8xGsCdAVlb5nRDMFU/E27D44l5U6cw1g0dGd45uLc+OXjNMmF4ntiMdCimzcjFKQI8Q==} - engines: {node: ^14.18.0 || >=16.0.0} + synckit@0.8.5: dependencies: '@pkgr/utils': 2.4.2 tslib: 2.6.2 - dev: true - /tabbable@6.2.0: - resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==} - dev: false + tabbable@6.2.0: {} - /text-table@0.2.0: - resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} - dev: true + text-table@0.2.0: {} - /tinyurl@1.1.7: - resolution: {integrity: sha512-NCnyDkBTByS/pLH/Vrx/DPL8EciAUDoAvruaM/WnQLfX6Uame3D1nuWNy2Z9CXw7rcsok0tjuonRLolhmyz5rg==} - deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. - dev: true + tinyurl@1.1.7: {} - /title@3.5.3: - resolution: {integrity: sha512-20JyowYglSEeCvZv3EZ0nZ046vLarO37prvV0mbtQV7C8DJPGgN967r8SJkqd3XK3K3lD3/Iyfp3avjfil8Q2Q==} - hasBin: true + title@3.5.3: dependencies: arg: 1.0.0 chalk: 2.3.0 clipboardy: 1.2.2 titleize: 1.0.0 - dev: false - /titleize@1.0.0: - resolution: {integrity: sha512-TARUb7z1pGvlLxgPk++7wJ6aycXF3GJ0sNSBTAsTuJrQG5QuZlkUQP+zl+nbjAh4gMX9yDw9ZYklMd7vAfJKEw==} - engines: {node: '>=0.10.0'} - dev: false + titleize@1.0.0: {} - /titleize@3.0.0: - resolution: {integrity: sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==} - engines: {node: '>=12'} - dev: true + titleize@3.0.0: {} - /to-gatsby-remark-plugin@0.1.0: - resolution: {integrity: sha512-blmhJ/gIrytWnWLgPSRCkhCPeki6UBK2daa3k9mGahN7GjwHu8KrS7F70MvwlsG7IE794JLgwAdCbi4hU4faFQ==} + to-gatsby-remark-plugin@0.1.0: dependencies: to-vfile: 6.1.0 - dev: true - /to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} + to-regex-range@5.0.1: dependencies: is-number: 7.0.0 - /to-vfile@6.1.0: - resolution: {integrity: sha512-BxX8EkCxOAZe+D/ToHdDsJcVI4HqQfmw0tCkp31zf3dNP/XWIAjU4CmeuSwsSoOzOTqHPOL0KUzyZqJplkD0Qw==} + to-vfile@6.1.0: dependencies: is-buffer: 2.0.5 vfile: 4.2.1 - dev: true - /to-vfile@7.2.4: - resolution: {integrity: sha512-2eQ+rJ2qGbyw3senPI0qjuM7aut8IYXK6AEoOWb+fJx/mQYzviTckm1wDjq91QYHAPBTYzmdJXxMFA6Mk14mdw==} + to-vfile@7.2.4: dependencies: is-buffer: 2.0.5 vfile: 5.3.7 - dev: true - /tr46@0.0.3: - resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - dev: true + tr46@0.0.3: {} - /treeify@1.1.0: - resolution: {integrity: sha512-1m4RA7xVAJrSGrrXGs0L3YTwyvBs2S8PbRHaLZAkFw7JR8oIFwYtysxlBZhYIa7xSyiYJKZ3iGrrk55cGA3i9A==} - engines: {node: '>=0.6'} - dev: true + treeify@1.1.0: {} - /trim-lines@3.0.1: - resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} - dev: false + trim-lines@3.0.1: {} - /trough@2.1.0: - resolution: {integrity: sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g==} + trough@2.1.0: {} - /ts-dedent@2.2.0: - resolution: {integrity: sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==} - engines: {node: '>=6.10'} - dev: false + ts-dedent@2.2.0: {} - /tslib@2.6.2: - resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} + tslib@2.6.2: {} - /type-check@0.4.0: - resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} - engines: {node: '>= 0.8.0'} + type-check@0.4.0: dependencies: prelude-ls: 1.2.1 - dev: true - /type-detect@4.0.8: - resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} - engines: {node: '>=4'} - dev: true + type-detect@4.0.8: {} - /type-fest@0.20.2: - resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} - engines: {node: '>=10'} - dev: true + type-fest@0.20.2: {} - /type-fest@1.4.0: - resolution: {integrity: sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==} - engines: {node: '>=10'} + type-fest@1.4.0: {} - /typedarray-to-buffer@3.1.5: - resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} + typedarray-to-buffer@3.1.5: dependencies: is-typedarray: 1.0.0 - dev: true - /typedarray@0.0.6: - resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} - dev: true + typedarray@0.0.6: {} - /typescript@5.3.2: - resolution: {integrity: sha512-6l+RyNy7oAHDfxC4FzSJcz9vnjTKxrLpDG5M2Vu4SHRVNg6xzqZp6LYSR9zjqQTu8DU/f5xwxUdADOkbrIX2gQ==} - engines: {node: '>=14.17'} - hasBin: true + typescript@5.3.2: {} - /unified-engine@10.1.0: - resolution: {integrity: sha512-5+JDIs4hqKfHnJcVCxTid1yBoI/++FfF/1PFdSMpaftZZZY+qg2JFruRbf7PaIwa9KgLotXQV3gSjtY0IdcFGQ==} + unified-engine@10.1.0: dependencies: '@types/concat-stream': 2.0.3 '@types/debug': 4.1.11 @@ -6975,19 +8400,15 @@ packages: yaml: 2.3.4 transitivePeerDependencies: - supports-color - dev: true - /unified-lint-rule@2.1.2: - resolution: {integrity: sha512-JWudPtRN7TLFHVLEVZ+Rm8FUb6kCAtHxEXFgBGDxRSdNMnGyTU5zyYvduHSF/liExlFB3vdFvsAHnNVE/UjAwA==} + unified-lint-rule@2.1.2: dependencies: '@types/unist': 2.0.9 trough: 2.1.0 unified: 10.1.2 vfile: 5.3.7 - dev: true - /unified-message-control@4.0.0: - resolution: {integrity: sha512-1b92N+VkPHftOsvXNOtkJm4wHlr+UDmTBF2dUzepn40oy9NxanJ9xS1RwUBTjXJwqr2K0kMbEyv1Krdsho7+Iw==} + unified-message-control@4.0.0: dependencies: '@types/unist': 2.0.9 unist-util-is: 5.2.1 @@ -6995,10 +8416,8 @@ packages: vfile: 5.3.7 vfile-location: 4.1.0 vfile-message: 3.1.4 - dev: true - /unified@10.1.2: - resolution: {integrity: sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==} + unified@10.1.2: dependencies: '@types/unist': 2.0.9 bail: 2.0.2 @@ -7008,8 +8427,7 @@ packages: trough: 2.1.0 vfile: 5.3.7 - /unified@11.0.4: - resolution: {integrity: sha512-apMPnyLjAX+ty4OrNap7yumyVAMlKx5IWU2wlzzUdYJO9A8f1p9m/gywF/GM2ZDFcjQPrx59Mc90KwmxsoklxQ==} + unified@11.0.4: dependencies: '@types/unist': 3.0.1 bail: 2.0.2 @@ -7018,222 +8436,162 @@ packages: is-plain-obj: 4.1.0 trough: 2.1.0 vfile: 6.0.1 - dev: true - /unique-string@3.0.0: - resolution: {integrity: sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==} - engines: {node: '>=12'} + unique-string@3.0.0: dependencies: crypto-random-string: 4.0.0 - dev: true - /unist-util-find-after@5.0.0: - resolution: {integrity: sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==} + unist-util-find-after@5.0.0: dependencies: '@types/unist': 3.0.1 unist-util-is: 6.0.0 - dev: false - /unist-util-generated@2.0.1: - resolution: {integrity: sha512-qF72kLmPxAw0oN2fwpWIqbXAVyEqUzDHMsbtPvOudIlUzXYFIeQIuxXQCRCFh22B7cixvU0MG7m3MW8FTq/S+A==} + unist-util-generated@2.0.1: {} - /unist-util-inspect@7.0.2: - resolution: {integrity: sha512-Op0XnmHUl6C2zo/yJCwhXQSm/SmW22eDZdWP2qdf4WpGrgO1ZxFodq+5zFyeRGasFjJotAnLgfuD1jkcKqiH1Q==} + unist-util-inspect@7.0.2: dependencies: '@types/unist': 2.0.9 - dev: true - /unist-util-is@5.2.1: - resolution: {integrity: sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==} + unist-util-is@5.2.1: dependencies: '@types/unist': 2.0.9 - /unist-util-is@6.0.0: - resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} + unist-util-is@6.0.0: dependencies: '@types/unist': 3.0.1 - /unist-util-position-from-estree@1.1.2: - resolution: {integrity: sha512-poZa0eXpS+/XpoQwGwl79UUdea4ol2ZuCYguVaJS4qzIOMDzbqz8a3erUCOmubSZkaOuGamb3tX790iwOIROww==} + unist-util-position-from-estree@1.1.2: dependencies: '@types/unist': 2.0.9 - /unist-util-position@4.0.4: - resolution: {integrity: sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg==} + unist-util-position@4.0.4: dependencies: '@types/unist': 2.0.9 - /unist-util-position@5.0.0: - resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} + unist-util-position@5.0.0: dependencies: '@types/unist': 3.0.1 - dev: false - /unist-util-remove-position@4.0.2: - resolution: {integrity: sha512-TkBb0HABNmxzAcfLf4qsIbFbaPDvMO6wa3b3j4VcEzFVaw1LBKwnW4/sRJ/atSLSzoIg41JWEdnE7N6DIhGDGQ==} + unist-util-remove-position@4.0.2: dependencies: '@types/unist': 2.0.9 unist-util-visit: 4.1.2 - /unist-util-remove-position@5.0.0: - resolution: {integrity: sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==} + unist-util-remove-position@5.0.0: dependencies: '@types/unist': 3.0.1 unist-util-visit: 5.0.0 - dev: false - /unist-util-remove@4.0.0: - resolution: {integrity: sha512-b4gokeGId57UVRX/eVKej5gXqGlc9+trkORhFJpu9raqZkZhU0zm8Doi05+HaiBsMEIJowL+2WtQ5ItjsngPXg==} + unist-util-remove@4.0.0: dependencies: '@types/unist': 3.0.1 unist-util-is: 6.0.0 unist-util-visit-parents: 6.0.1 - dev: false - /unist-util-stringify-position@2.0.3: - resolution: {integrity: sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==} + unist-util-stringify-position@2.0.3: dependencies: '@types/unist': 2.0.9 - dev: true - /unist-util-stringify-position@3.0.3: - resolution: {integrity: sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==} + unist-util-stringify-position@3.0.3: dependencies: '@types/unist': 2.0.9 - /unist-util-stringify-position@4.0.0: - resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} + unist-util-stringify-position@4.0.0: dependencies: '@types/unist': 3.0.1 - /unist-util-visit-parents@4.1.1: - resolution: {integrity: sha512-1xAFJXAKpnnJl8G7K5KgU7FY55y3GcLIXqkzUj5QF/QVP7biUm0K0O2oqVkYsdjzJKifYeWn9+o6piAK2hGSHw==} + unist-util-visit-parents@4.1.1: dependencies: '@types/unist': 2.0.9 unist-util-is: 5.2.1 - /unist-util-visit-parents@5.1.3: - resolution: {integrity: sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==} + unist-util-visit-parents@5.1.3: dependencies: '@types/unist': 2.0.9 unist-util-is: 5.2.1 - /unist-util-visit-parents@6.0.1: - resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==} + unist-util-visit-parents@6.0.1: dependencies: '@types/unist': 3.0.1 unist-util-is: 6.0.0 - /unist-util-visit@3.1.0: - resolution: {integrity: sha512-Szoh+R/Ll68QWAyQyZZpQzZQm2UPbxibDvaY8Xc9SUtYgPsDzx5AWSk++UUt2hJuow8mvwR+rG+LQLw+KsuAKA==} + unist-util-visit@3.1.0: dependencies: '@types/unist': 2.0.9 unist-util-is: 5.2.1 unist-util-visit-parents: 4.1.1 - /unist-util-visit@4.1.2: - resolution: {integrity: sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==} + unist-util-visit@4.1.2: dependencies: '@types/unist': 2.0.9 unist-util-is: 5.2.1 unist-util-visit-parents: 5.1.3 - /unist-util-visit@5.0.0: - resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} + unist-util-visit@5.0.0: dependencies: '@types/unist': 3.0.1 unist-util-is: 6.0.0 unist-util-visit-parents: 6.0.1 - /untildify@4.0.0: - resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==} - engines: {node: '>=8'} - dev: true + untildify@4.0.0: {} - /upper-case-first@2.0.2: - resolution: {integrity: sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==} + upper-case-first@2.0.2: dependencies: tslib: 2.6.2 - dev: false - /upper-case@2.0.2: - resolution: {integrity: sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg==} + upper-case@2.0.2: dependencies: tslib: 2.6.2 - dev: false - /uri-js@4.4.1: - resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + uri-js@4.4.1: dependencies: punycode: 2.3.1 - dev: true - /utf8@3.0.0: - resolution: {integrity: sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ==} - dev: true + utf8@3.0.0: {} - /util-deprecate@1.0.2: - resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - dev: true + util-deprecate@1.0.2: {} - /uuid@9.0.1: - resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} - hasBin: true - dev: false + uuid@9.0.1: {} - /uvu@0.5.6: - resolution: {integrity: sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA==} - engines: {node: '>=8'} - hasBin: true + uvu@0.5.6: dependencies: dequal: 2.0.3 diff: 5.1.0 kleur: 4.1.5 sade: 1.8.1 - /vfile-location@4.1.0: - resolution: {integrity: sha512-YF23YMyASIIJXpktBa4vIGLJ5Gs88UB/XePgqPmTa7cDA+JeO3yclbpheQYCHjVHBn/yePzrXuygIL+xbvRYHw==} + vfile-location@4.1.0: dependencies: '@types/unist': 2.0.9 vfile: 5.3.7 - dev: true - /vfile-location@5.0.2: - resolution: {integrity: sha512-NXPYyxyBSH7zB5U6+3uDdd6Nybz6o6/od9rk8bp9H8GR3L+cm/fC0uUTbqBmUTnMCUDslAGBOIKNfvvb+gGlDg==} + vfile-location@5.0.2: dependencies: '@types/unist': 3.0.1 vfile: 6.0.1 - dev: false - /vfile-matter@3.0.1: - resolution: {integrity: sha512-CAAIDwnh6ZdtrqAuxdElUqQRQDQgbbIrYtDYI8gCjXS1qQ+1XdLoK8FIZWxJwn0/I+BkSSZpar3SOgjemQz4fg==} + vfile-matter@3.0.1: dependencies: '@types/js-yaml': 4.0.8 is-buffer: 2.0.5 js-yaml: 4.1.0 - dev: false - /vfile-message@2.0.4: - resolution: {integrity: sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==} + vfile-message@2.0.4: dependencies: '@types/unist': 2.0.9 unist-util-stringify-position: 2.0.3 - dev: true - /vfile-message@3.1.4: - resolution: {integrity: sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==} + vfile-message@3.1.4: dependencies: '@types/unist': 2.0.9 unist-util-stringify-position: 3.0.3 - /vfile-message@4.0.2: - resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==} + vfile-message@4.0.2: dependencies: '@types/unist': 3.0.1 unist-util-stringify-position: 4.0.0 - /vfile-reporter@7.0.5: - resolution: {integrity: sha512-NdWWXkv6gcd7AZMvDomlQbK3MqFWL1RlGzMn++/O2TI+68+nqxCPTvLugdOtfSzXmjh+xUyhp07HhlrbJjT+mw==} + vfile-reporter@7.0.5: dependencies: '@types/supports-color': 8.1.3 string-width: 5.1.2 @@ -7243,100 +8601,87 @@ packages: vfile-message: 3.1.4 vfile-sort: 3.0.1 vfile-statistics: 2.0.1 - dev: true - /vfile-sort@3.0.1: - resolution: {integrity: sha512-1os1733XY6y0D5x0ugqSeaVJm9lYgj0j5qdcZQFyxlZOSy1jYarL77lLyb5gK4Wqr1d5OxmuyflSO3zKyFnTFw==} + vfile-sort@3.0.1: dependencies: vfile: 5.3.7 vfile-message: 3.1.4 - dev: true - /vfile-statistics@2.0.1: - resolution: {integrity: sha512-W6dkECZmP32EG/l+dp2jCLdYzmnDBIw6jwiLZSER81oR5AHRcVqL+k3Z+pfH1R73le6ayDkJRMk0sutj1bMVeg==} + vfile-statistics@2.0.1: dependencies: vfile: 5.3.7 vfile-message: 3.1.4 - dev: true - /vfile@4.2.1: - resolution: {integrity: sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==} + vfile@4.2.1: dependencies: '@types/unist': 2.0.9 is-buffer: 2.0.5 unist-util-stringify-position: 2.0.3 vfile-message: 2.0.4 - dev: true - /vfile@5.3.7: - resolution: {integrity: sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==} + vfile@5.3.7: dependencies: '@types/unist': 2.0.9 is-buffer: 2.0.5 unist-util-stringify-position: 3.0.3 vfile-message: 3.1.4 - /vfile@6.0.1: - resolution: {integrity: sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw==} + vfile@6.0.1: dependencies: '@types/unist': 3.0.1 unist-util-stringify-position: 4.0.0 vfile-message: 4.0.2 - /viem@1.19.6(typescript@5.3.2): - resolution: {integrity: sha512-WSBHBMurWIWQk2yisOD8hqSA5S56cZu6onty3hzauVjiHMildtVWujF7YT0xjoU40GpFODvJASRR2RFdzgvUUg==} - peerDependencies: - typescript: '>=5.0.4' - peerDependenciesMeta: - typescript: - optional: true + viem@1.19.6(typescript@5.3.2)(zod@3.22.4): dependencies: '@adraffy/ens-normalize': 1.10.0 '@noble/curves': 1.2.0 '@noble/hashes': 1.3.2 '@scure/bip32': 1.3.2 '@scure/bip39': 1.2.1 - abitype: 0.9.8(typescript@5.3.2) + abitype: 0.9.8(typescript@5.3.2)(zod@3.22.4) isows: 1.0.3(ws@8.13.0) - typescript: 5.3.2 ws: 8.13.0 + optionalDependencies: + typescript: 5.3.2 transitivePeerDependencies: - bufferutil - utf-8-validate - zod - dev: false - /vscode-languageserver-textdocument@1.0.11: - resolution: {integrity: sha512-X+8T3GoiwTVlJbicx/sIAF+yuJAqz8VvwJyoMVhwEMoEKE/fkDmrqUgDMyBECcM2A2frVZIUj5HI/ErRXCfOeA==} - dev: true + viem@2.21.37(typescript@5.3.2)(zod@3.22.4): + dependencies: + '@adraffy/ens-normalize': 1.11.0 + '@noble/curves': 1.6.0 + '@noble/hashes': 1.5.0 + '@scure/bip32': 1.5.0 + '@scure/bip39': 1.4.0 + abitype: 1.0.6(typescript@5.3.2)(zod@3.22.4) + isows: 1.0.6(ws@8.18.0) + webauthn-p256: 0.0.10 + ws: 8.18.0 + optionalDependencies: + typescript: 5.3.2 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + - zod - /vscode-oniguruma@1.7.0: - resolution: {integrity: sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==} - dev: false + vscode-languageserver-textdocument@1.0.11: {} - /vscode-textmate@8.0.0: - resolution: {integrity: sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg==} - dev: false + vscode-oniguruma@1.7.0: {} - /vscode-uri@3.0.8: - resolution: {integrity: sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==} - dev: true + vscode-textmate@8.0.0: {} - /walk-up-path@3.0.1: - resolution: {integrity: sha512-9YlCL/ynK3CTlrSRrDxZvUauLzAswPCrsaCgilqFevUYpeEW0/3ScEjaa3kbW/T0ghhkEr7mv+fpjqn1Y1YuTA==} - dev: true + vscode-uri@3.0.8: {} - /web-namespaces@2.0.1: - resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} - dev: false + walk-up-path@3.0.1: {} - /web-worker@1.2.0: - resolution: {integrity: sha512-PgF341avzqyx60neE9DD+XS26MMNMoUQRz9NOZwW32nPQrF6p77f1htcnjBSEV8BGMKZ16choqUG4hyI0Hx7mA==} - dev: false + web-namespaces@2.0.1: {} - /web3-utils@1.10.3: - resolution: {integrity: sha512-OqcUrEE16fDBbGoQtZXWdavsPzbGIDc5v3VrRTZ0XrIpefC/viZ1ZU9bGEemazyS0catk/3rkOOxpzTfY+XsyQ==} - engines: {node: '>=8.0.0'} + web-worker@1.2.0: {} + + web3-utils@1.10.3: dependencies: '@ethereumjs/util': 8.1.0 bn.js: 5.2.1 @@ -7346,156 +8691,91 @@ packages: number-to-bn: 1.7.0 randombytes: 2.1.0 utf8: 3.0.0 - dev: true - /webidl-conversions@3.0.1: - resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} - dev: true + webauthn-p256@0.0.10: + dependencies: + '@noble/curves': 1.6.0 + '@noble/hashes': 1.5.0 - /whatwg-url@5.0.0: - resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + webidl-conversions@3.0.1: {} + + whatwg-url@5.0.0: dependencies: tr46: 0.0.3 webidl-conversions: 3.0.1 - dev: true - /which-boxed-primitive@1.0.2: - resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} + which-boxed-primitive@1.0.2: dependencies: is-bigint: 1.0.4 is-boolean-object: 1.1.2 is-number-object: 1.0.7 is-string: 1.0.7 is-symbol: 1.0.4 - dev: false - /which-collection@1.0.1: - resolution: {integrity: sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==} + which-collection@1.0.1: dependencies: is-map: 2.0.2 is-set: 2.0.2 is-weakmap: 2.0.1 is-weakset: 2.0.2 - dev: false - /which-typed-array@1.1.13: - resolution: {integrity: sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==} - engines: {node: '>= 0.4'} + which-typed-array@1.1.13: dependencies: available-typed-arrays: 1.0.5 call-bind: 1.0.5 for-each: 0.3.3 gopd: 1.0.1 has-tostringtag: 1.0.0 - dev: false - /which@1.3.1: - resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} - hasBin: true + which@1.3.1: dependencies: isexe: 2.0.0 - dev: false - /which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true + which@2.0.2: dependencies: isexe: 2.0.0 - dev: true - /wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} + wrap-ansi@7.0.0: dependencies: ansi-styles: 4.3.0 string-width: 4.2.3 strip-ansi: 6.0.1 - dev: true - /wrap-ansi@8.1.0: - resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} - engines: {node: '>=12'} + wrap-ansi@8.1.0: dependencies: ansi-styles: 6.2.1 string-width: 5.1.2 strip-ansi: 7.1.0 - dev: true - /wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - dev: true + wrappy@1.0.2: {} - /write-file-atomic@3.0.3: - resolution: {integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==} + write-file-atomic@3.0.3: dependencies: imurmurhash: 0.1.4 is-typedarray: 1.0.0 signal-exit: 3.0.7 typedarray-to-buffer: 3.1.5 - dev: true - /ws@7.4.6: - resolution: {integrity: sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==} - engines: {node: '>=8.3.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - dev: true + ws@7.4.6: {} - /ws@8.13.0: - resolution: {integrity: sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - dev: false + ws@8.13.0: {} - /xdg-basedir@5.1.0: - resolution: {integrity: sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ==} - engines: {node: '>=12'} - dev: true + ws@8.18.0: {} - /yallist@2.1.2: - resolution: {integrity: sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==} - dev: false + xdg-basedir@5.1.0: {} - /yallist@4.0.0: - resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - dev: true + yallist@2.1.2: {} - /yaml@2.3.3: - resolution: {integrity: sha512-zw0VAJxgeZ6+++/su5AFoqBbZbrEakwu+X0M5HmcwUiBL7AzcuPKjj5we4xfQLp78LkEMpD0cOnUhmgOVy3KdQ==} - engines: {node: '>= 14'} - dev: true + yallist@4.0.0: {} - /yaml@2.3.4: - resolution: {integrity: sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==} - engines: {node: '>= 14'} - dev: true + yaml@2.3.3: {} - /yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} + yaml@2.3.4: {} - /yocto-queue@1.0.0: - resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} - engines: {node: '>=12.20'} - dev: true + yocto-queue@0.1.0: {} - /zod@3.22.4: - resolution: {integrity: sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==} - dev: false + yocto-queue@1.0.0: {} - /zwitch@2.0.4: - resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} + zod@3.22.4: {} + + zwitch@2.0.4: {} diff --git a/words.txt b/words.txt index a6b8416f1..1e416b27d 100644 --- a/words.txt +++ b/words.txt @@ -11,7 +11,6 @@ Allocs allocs altda ANDI -Ankr Apeworx Arweave authrpc @@ -60,7 +59,6 @@ Chugsplash Clabby codebases collateralized -complie compr COMPUTEPENDINGBLOCK computependingblock @@ -149,13 +147,11 @@ Holesky holesky IGNOREPRICE ignoreprice -Immunefi implicity Inator inator INFLUXDBV influxdbv -initally initcode IPCDISABLE ipcdisable @@ -199,7 +195,6 @@ minsuggestedpriorityfee Mintable Mintplex MIPSEVM -Mitigations Monitorism Moralis Mordor @@ -293,8 +288,6 @@ Protip Proxied proxyd pseudorandomly -Pyth -Pyth's QRNG Quicknode quicknode @@ -328,10 +321,6 @@ safedb Schnorr secp SELFDESTRUCT -Sendrawtransactionconditional -SEPOLIA -Sepolia -sepolia seqnr SEQUENCERHTTP sequencerhttp @@ -400,7 +389,6 @@ VMDEBUG vmdebug VMODULE vmodule -voxel wagmi Warpcast xlarge From 42a42892b7d320080ac1d16c3a2bce9823e2f2e3 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Wed, 30 Oct 2024 11:50:59 +0100 Subject: [PATCH 338/565] fixed lint issues --- words.txt | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/words.txt b/words.txt index 1e416b27d..376553b4f 100644 --- a/words.txt +++ b/words.txt @@ -1,5 +1,5 @@ -ACCOUNTQUEUE accountqueue +ACCOUNTQUEUE ACCOUNTSLOTS accountslots ADDI @@ -11,6 +11,7 @@ Allocs allocs altda ANDI +Ankr Apeworx Arweave authrpc @@ -28,8 +29,8 @@ BLOBPOOL blobpool blobspace blockhash -blocklists BLOCKLOGS +blocklists blocklogs BLOCKPROFILERATE blockprofilerate @@ -147,6 +148,7 @@ Holesky holesky IGNOREPRICE ignoreprice +Immunefi implicity Inator inator @@ -195,6 +197,7 @@ minsuggestedpriorityfee Mintable Mintplex MIPSEVM +Mitigations Monitorism Moralis Mordor @@ -288,6 +291,8 @@ Protip Proxied proxyd pseudorandomly +Pyth +Pyth's QRNG Quicknode quicknode @@ -321,6 +326,7 @@ safedb Schnorr secp SELFDESTRUCT +Sepolia seqnr SEQUENCERHTTP sequencerhttp @@ -384,11 +390,11 @@ VHOSTS vhosts Viem viem -Viem's VMDEBUG vmdebug VMODULE vmodule +voxel wagmi Warpcast xlarge @@ -397,4 +403,4 @@ xtensibility ZKPs ZKVM Zora -zora +zora \ No newline at end of file From 483c5a6c05c7a2cd64433939df34ccb53a3fc97c Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Wed, 30 Oct 2024 11:54:53 +0100 Subject: [PATCH 339/565] Update pages/stack/interop/message-passing.mdx Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> --- pages/stack/interop/message-passing.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/stack/interop/message-passing.mdx b/pages/stack/interop/message-passing.mdx index 97b3cb01c..f1ad2b9a3 100644 --- a/pages/stack/interop/message-passing.mdx +++ b/pages/stack/interop/message-passing.mdx @@ -257,5 +257,5 @@ The cross-chain messaging process follows a specific lifecycle: * More questions? Read our guide on the anatomy of a [cross-chain message](cross-chain-message) * Use [Supersim](supersim), a local dev environment that simulates Superchain interop for testing applications against a local version of the Superchain. -* Use [viem bindings/actions](https://supersim.pages.dev/guides/interop/relay-using-viem.html)the guide will show you how to use viem bindings/actions to fetch identifiers and relay messages. +* Use [viem bindings/actions](https://supersim.pages.dev/guides/interop/relay-using-viem.html) - The guide shows how to use viem bindings/actions to fetch identifiers and relay messages. * Read how to manually [relay interop messages](https://supersim.pages.dev/guides/interop/manually-relaying-interop-messages-cast) with cast and `L2ToL2CrossDomainMessenger` From d883e5a10146614fe485f87d3836aa24f87e6eeb Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Wed, 30 Oct 2024 12:03:26 +0100 Subject: [PATCH 340/565] fix lint issues --- .../tutorials/send-tx-from-eth.mdx | 112 ++++++++---------- words.txt | 9 ++ 2 files changed, 61 insertions(+), 60 deletions(-) diff --git a/pages/builders/app-developers/tutorials/send-tx-from-eth.mdx b/pages/builders/app-developers/tutorials/send-tx-from-eth.mdx index 1e219b140..9f20aebfc 100644 --- a/pages/builders/app-developers/tutorials/send-tx-from-eth.mdx +++ b/pages/builders/app-developers/tutorials/send-tx-from-eth.mdx @@ -8,7 +8,7 @@ import { Callout, Steps } from 'nextra/components' # Triggering OP Mainnet Transactions from Ethereum using Viem -OP Mainnet currently uses a single-Sequencer block production model. +OP Mainnet currently uses a single-Sequencer block production model. This means that there is only one Sequencer active on the network at any given time. Single-Sequencer models are simpler than their highly decentralized counterparts but they are also more vulnerable to potential downtime. Sequencer downtime must not be able to prevent users from transacting on the network. As a result, OP Mainnet includes a mechanism for "forcing" transactions to be included in the blockchain. This mechanism involves triggering a transaction on OP Mainnet by sending a transaction on Ethereum. @@ -16,39 +16,37 @@ In this tutorial you'll learn how to trigger a transaction on OP Mainnet from Et ## Dependencies -* [node](https://nodejs.org/en/) -* [pnpm](https://pnpm.io/installation) +* [node](https://nodejs.org/en/) +* [pnpm](https://pnpm.io/installation) ## Create a Demo Project You're going to use the `viem` package for this tutorial. Since Viem is a [Node.js](https://nodejs.org/en/) library, you'll need to create a Node.js project to use it. + {

    Make a Project Folder

    } -{

    Make a Project Folder

    } + ```bash + mkdir trigger-transaction + cd trigger-transaction + ``` -```bash -mkdir trigger-transaction -cd trigger-transaction -``` - -{

    Initialize the Project

    } + {

    Initialize the Project

    } -```bash -pnpm init -``` + ```bash + pnpm init + ``` -{

    Install Viem

    } - -```bash -pnpm add viem -``` + {

    Install Viem

    } + ```bash + pnpm add viem + ```
    -Want to create a new wallet for this tutorial? -If you have [`cast`](https://book.getfoundry.sh/getting-started/installation) installed you can run `cast wallet new` in your terminal to create a new wallet and get the private key. + Want to create a new wallet for this tutorial? + If you have [`cast`](https://book.getfoundry.sh/getting-started/installation) installed you can run `cast wallet new` in your terminal to create a new wallet and get the private key. ## Get ETH on Sepolia and OP Sepolia @@ -56,14 +54,14 @@ If you have [`cast`](https://book.getfoundry.sh/getting-started/installation) in This tutorial explains how to bridge tokens from Sepolia to OP Sepolia. You will need to get some ETH on both of these testnets. -You can use [this faucet](https://sepoliafaucet.com) to get ETH on Sepolia. -You can use the [Superchain Faucet](https://console.optimism.io/faucet?utm_source=docs) to get ETH on OP Sepolia. + You can use [this faucet](https://sepoliafaucet.com) to get ETH on Sepolia. + You can use the [Superchain Faucet](https://console.optimism.io/faucet?utm_source=docs) to get ETH on OP Sepolia. ## Add a Private Key to Your Environment -You need a private key in order to sign transactions. -Set your private key as an environment variable with the `export` command. +You need a private key in order to sign transactions. +Set your private key as an environment variable with the `export` command. Make sure this private key corresponds to an address that has ETH on both Sepolia and OP Sepolia. ```bash @@ -72,7 +70,7 @@ export TUTORIAL_PRIVATE_KEY=0x... ## Start the Node REPL -You're going to use the Node REPL to interact with Viem. +You're going to use the Node REPL to interact with Viem. To start the Node REPL run the following command in your terminal: ```bash @@ -86,12 +84,10 @@ This will bring up a Node REPL prompt that allows you to run javascript code. You need to import some dependencies into your Node REPL session. + {

    Import Viem

    } -{

    Import Viem

    } - -```js file=/public/tutorials/send-tx-from-eth.js#L3-L6 hash=1e06dede41cb7ba0bd9414a8962521c6 -``` - + ```js file=/public/tutorials/send-tx-from-eth.js#L3-L6 hash=1e06dede41cb7ba0bd9414a8962521c6 + ```
    ## Set Session Variables @@ -99,17 +95,15 @@ You need to import some dependencies into your Node REPL session. You'll need a few variables throughout this tutorial. Let's set those up now. + {

    Load your private key

    } -{

    Load your private key

    } + ```js file=/public/tutorials/send-tx-from-eth.js#L8-L9 hash=46ba01375a5d8844b2315f0e579dfac3 + ``` -```js file=/public/tutorials/send-tx-from-eth.js#L8-L9 hash=46ba01375a5d8844b2315f0e579dfac3 -``` - -{

    Create the RPC providers and wallets

    } - -```js file=/public/tutorials/send-tx-from-eth.js#L11-L13 hash=d5a5a1252f4b6ff026cd58de8e6ae7f1 -``` + {

    Create the RPC providers and wallets

    } + ```js file=/public/tutorials/send-tx-from-eth.js#L11-L13 hash=d5a5a1252f4b6ff026cd58de8e6ae7f1 + ```
    ## Check Your Initial Balance @@ -124,40 +118,38 @@ You'll be sending a small amount of ETH as part of this tutorial. Quickly check Now you'll use the `OptimismPortal` contract to trigger a transaction on OP Sepolia by sending a transaction on Sepolia. + {

    Create the OptimismPortal object

    } -{

    Create the OptimismPortal object

    } + ```js file=/public/tutorials/send-tx-from-eth.js#L20-L31 hash=b062257111aacc2f3a985542e451269c + ``` -```js file=/public/tutorials/send-tx-from-eth.js#L20-L31 hash=b062257111aacc2f3a985542e451269c -``` + {

    Estimate the required gas

    } -{

    Estimate the required gas

    } + When sending transactions via the `OptimismPortal` contract it's important to always include a gas buffer. This is because the `OptimismPortal` charges a variable amount of gas depending on the current demand for L2 transactions triggered via L1. If you do not include a gas buffer, your transactions may fail. -When sending transactions via the `OptimismPortal` contract it's important to always include a gas buffer. This is because the `OptimismPortal` charges a variable amount of gas depending on the current demand for L2 transactions triggered via L1. If you do not include a gas buffer, your transactions may fail. + ```js file=/public/tutorials/send-tx-from-eth.js#L33-L45 hash=f5d0d92f161514a3359997143804af0b + ``` -```js file=/public/tutorials/send-tx-from-eth.js#L33-L45 hash=f5d0d92f161514a3359997143804af0b -``` + {

    Send the transaction

    } -{

    Send the transaction

    } + Now you'll send the transaction. Note that you are including a buffer of 20% on top of the gas estimate. -Now you'll send the transaction. Note that you are including a buffer of 20% on top of the gas estimate. + ```js file=/public/tutorials/send-tx-from-eth.js#L50-L61 hash=59e3ee527809087e9e615f28caa49083 + ``` -```js file=/public/tutorials/send-tx-from-eth.js#L50-L61 hash=59e3ee527809087e9e615f28caa49083 -``` - -{

    Wait for the L1 transaction

    } + {

    Wait for the L1 transaction

    } -First you'll need to wait for the L1 transaction to be mined. + First you'll need to wait for the L1 transaction to be mined. -```js file=/public/tutorials/send-tx-from-eth.js#L60 hash=0efd9bd3369de7f5f36ea5540a5d8078 -``` + ```js file=/public/tutorials/send-tx-from-eth.js#L60 hash=0efd9bd3369de7f5f36ea5540a5d8078 + ``` -{

    Wait for the L2 transaction

    } + {

    Wait for the L2 transaction

    } -Now you'll need to wait for the corresponding L2 transaction to be included in a block. This transaction is automatically created as a result of your L1 transaction. Here you'll determine the hash of the L2 transaction and then wait for that transaction to be included in the L2 blockchain. - -```js file=/public/tutorials/send-tx-from-eth.js#L67-L73 hash=bf903509fb370c2b4e85dbfbf05650ee -``` + Now you'll need to wait for the corresponding L2 transaction to be included in a block. This transaction is automatically created as a result of your L1 transaction. Here you'll determine the hash of the L2 transaction and then wait for that transaction to be included in the L2 blockchain. + ```js file=/public/tutorials/send-tx-from-eth.js#L67-L73 hash=bf903509fb370c2b4e85dbfbf05650ee + ```
    ## Check Your Updated Balance @@ -174,4 +166,4 @@ Make sure that the difference is equal to the amount you were expecting to send. ## Next Steps -You've successfully triggered a transaction on OP Sepolia by sending a transaction on Sepolia using Viem. Although this tutorial demonstrated the simple example of sending a basic ETH transfer from your L2 address via the OptimismPortal contract, you can use this same technique to trigger any transaction you want. You can trigger smart contracts, send ERC-20 tokens, and more. \ No newline at end of file +You've successfully triggered a transaction on OP Sepolia by sending a transaction on Sepolia using Viem. Although this tutorial demonstrated the simple example of sending a basic ETH transfer from your L2 address via the OptimismPortal contract, you can use this same technique to trigger any transaction you want. You can trigger smart contracts, send ERC-20 tokens, and more. diff --git a/words.txt b/words.txt index 90467007b..142a34158 100644 --- a/words.txt +++ b/words.txt @@ -10,6 +10,7 @@ Allnodes Allocs allocs ANDI +Ankr Apeworx Arweave authrpc @@ -138,6 +139,7 @@ Holesky holesky IGNOREPRICE ignoreprice +Immunefi implicity Inator inator @@ -187,6 +189,7 @@ minsuggestedpriorityfee Mintable Mintplex MIPSEVM +Mitigations Moralis Mordor mountpoint @@ -274,6 +277,8 @@ Protip Proxied proxyd pseudorandomly +Pyth +Pyth's QRNG Quicknode quicknode @@ -304,6 +309,9 @@ RWAs Schnorr secp SELFDESTRUCT +SEPOLIA +Sepolia +sepolia seqnr SEQUENCERHTTP sequencerhttp @@ -366,6 +374,7 @@ VMDEBUG vmdebug VMODULE vmodule +voxel wagmi Warpcast XORI From fcdbea958f27bcc1a000f2d9806418e963bfb1fe Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Wed, 30 Oct 2024 12:06:58 +0100 Subject: [PATCH 341/565] fix merge conflict --- words.txt | 39 ++++++++++++++++++++++++++++++--------- 1 file changed, 30 insertions(+), 9 deletions(-) diff --git a/words.txt b/words.txt index 142a34158..376553b4f 100644 --- a/words.txt +++ b/words.txt @@ -1,5 +1,5 @@ -ACCOUNTQUEUE accountqueue +ACCOUNTQUEUE ACCOUNTSLOTS accountslots ADDI @@ -9,6 +9,7 @@ airgap Allnodes Allocs allocs +altda ANDI Ankr Apeworx @@ -16,6 +17,7 @@ Arweave authrpc Badgeholder's Badgeholders +badgeholders basefee BGEZ BGTZ @@ -27,8 +29,8 @@ BLOBPOOL blobpool blobspace blockhash -blocklists BLOCKLOGS +blocklists blocklogs BLOCKPROFILERATE blockprofilerate @@ -38,7 +40,6 @@ blocktime BLOOMFILTER bloomfilter BLTZ -Bluesweep Bootcamp BOOTNODES Bootnodes @@ -65,6 +66,8 @@ computependingblock confs corsdomain counterfactually +Crosschain +crosschain Crossmint daserver DATACAP @@ -83,6 +86,8 @@ Discv discv DIVU Drand +dripcheck +Drippie Eigen ENABLEDEPRECATEDPERSONAL enabledeprecatedpersonal @@ -96,15 +101,19 @@ ETHSTATS ethstats EVMTIMEOUT evmtimeout +executability +exfiltrate EXITWHENSYNCED exitwhensynced EXTRADATA extradata Farcaster farcaster +Faultproof FDLIMIT fdlimit featureset +Flashbots forkable forkchoice FPVM @@ -164,7 +173,6 @@ leveldb lightkdf logfile logfmt -marketshare MAXAGE maxage MAXBACKUPS @@ -190,6 +198,7 @@ Mintable Mintplex MIPSEVM Mitigations +Monitorism Moralis Mordor mountpoint @@ -199,6 +208,7 @@ MTHI MTLO MULT multiaddr +multichain multiclient multisigs MULTU @@ -230,9 +240,12 @@ nosyncserve Numba Offchain offchain +OPCM +opcm Openfort oplabs opnode's +opstack Opti pausable pcscdpath @@ -252,6 +265,7 @@ POAPs PPROF pprof preconfigured +Predeploy predeploy Predeployed predeployed @@ -291,10 +305,10 @@ rejournal REMOTEDB remotedb replayability -reproven +replayor REQUIREDBLOCKS requiredblocks -Rollouts +rollouts Rollups rollups Routescan @@ -305,13 +319,14 @@ rpcs RPGF Rpgf rpgf +Runbooks +runbooks RWAs +safedb Schnorr secp SELFDESTRUCT -SEPOLIA Sepolia -sepolia seqnr SEQUENCERHTTP sequencerhttp @@ -337,12 +352,15 @@ subcomponents subgame subheaders SUBU +Sunnyside SUPERCHAIN Superchain superchain Superchain's Superchains Superscan +Supersim +supersim SYNCMODE syncmode SYNCTARGET @@ -358,8 +376,10 @@ trustlessly trustrpc txfeecap txmgr +txns TXPOOL txpool +txproxy uncountered Unprotect unsubmitted @@ -377,9 +397,10 @@ vmodule voxel wagmi Warpcast +xlarge XORI xtensibility ZKPs ZKVM Zora -zora +zora \ No newline at end of file From e7556191a82a114d4652933d20460b5ab2f201c2 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Wed, 30 Oct 2024 13:14:50 +0100 Subject: [PATCH 342/565] Update pages/stack/transactions/transaction-finality.mdx Co-authored-by: smartcontracts --- pages/stack/transactions/transaction-finality.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/stack/transactions/transaction-finality.mdx b/pages/stack/transactions/transaction-finality.mdx index 4f7a8ec8c..5fb2d121b 100644 --- a/pages/stack/transactions/transaction-finality.mdx +++ b/pages/stack/transactions/transaction-finality.mdx @@ -46,7 +46,7 @@ The reality is the OP Stack transaction finality takes minutes, not over a week. ### Reorgs and finality Once a transaction is included in a finalized Ethereum block, it cannot be reorganized. -If an Ethereum reorganization (reorg) occurs: +If an Ethereum reorganization (reorg) were to occur *before* finality: 1. L2 nodes detect the L1 reorg. 2. Affected `safe` L2 blocks revert to an `unsafe` status. From f9a4bb0917d444c482f02ae26b5abf543dfb618e Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Wed, 30 Oct 2024 14:44:07 +0100 Subject: [PATCH 343/565] updated text --- .../transactions/transaction-finality.mdx | 43 ++++++++++++------- words.txt | 9 ++++ 2 files changed, 37 insertions(+), 15 deletions(-) diff --git a/pages/stack/transactions/transaction-finality.mdx b/pages/stack/transactions/transaction-finality.mdx index 834f7f8b7..4423a504a 100644 --- a/pages/stack/transactions/transaction-finality.mdx +++ b/pages/stack/transactions/transaction-finality.mdx @@ -17,45 +17,45 @@ The OP Stack derives its security from Ethereum by utilizing Ethereum's consensu In the OP Stack, transaction finality progresses through three key stages: -1. **Unsafe:** The sequencer creates a block containing the transaction, but the transaction data has not yet been posted to Ethereum (L1). The block is circulated within the L2 network for speed. +1. **Unsafe:** The Sequencer creates a block containing the transaction, but the transaction data has not yet been posted to Ethereum (L1). The block is circulated within the L2 network for speed. -2. **Safe:** The batcher posts the transaction data to L1. At this point, any L2 node can derive the transaction. +2. **Safe:** The Sequencer posts the transaction data to L1. At this point, any L2 node can derive the transaction. -3. **Finalized:** Transactions are finalized once more than 65 Ethereum blocks (approximately 10-15 minutes) have passed, ensuring that the L1 data is secure and cannot be reorganized. +3. **Finalized:** Transactions are generally finalized on Ethereum when 2/3 of validators sign off on two consecutive checkpoints. This typically occurs within approximately two epochs, or around 65 blocks (10-15 minutes), but may take longer under adverse network conditions. This ensures that L1 data remains secure and unlikely to be reorganized. Transaction Finality Diagram. ### Transaction validity -When a transaction is submitted to the network, it is either valid or invalid. If the transaction is valid, the sequencer puts it in a block. If it is invalid, the transaction is discarded. There is no way the sequencer can write an invalid transaction to a new block. +When a transaction is submitted to the network, it undergoes validation. If the transaction is valid, the Sequencer includes it in a block. If it is invalid, it may still be proposed by the Sequencer, but the rest of the network will reject the block containing the invalid transaction, ensuring only valid transactions are finalized. ## Sequencer trust assumptions -The sequencer operates with the following trust assumptions: +The Sequencer operates with the following trust assumptions: * It can temporarily withhold transactions. * It may attempt to reorder transactions before L1 publication. -* Once transactions are published on L1, the sequencer cannot modify or censor them. -* The sequencer cannot affect finalized transactions. +* Once transactions are published on L1 and finality is reached, the Sequencer cannot modify or censor them. However, until finality, transactions are theoretically subject to reorgs. ## Common misconceptions -The biggest misconception about transaction finality is that a transaction needs to wait for the entire challenge window to become finalized. +The biggest misconception about transaction finality is that a transaction needs to wait for the entire challenge window to become finalized. The reality is the OP Stack transaction finality takes minutes, not over a week. This section explains transaction finality and the Fault Proof System's challenge mechanism. ### Reorgs and finality -Once a transaction is included in a finalized Ethereum block, it cannot be reorganized. -If an Ethereum reorganization (reorg) occurs: +Once a transaction is included in a finalized Ethereum block, it cannot be reorganized. -1. L2 nodes detect the L1 reorg. -2. Affected L2 blocks revert to an "unsafe" status. -3. The sequencer typically republishes the same transactions. -4. The system returns to a consistent state after reprocessing. +If an Ethereum reorganization (reorg) occurs, it affects applications on the OP Stack, such as the Optimism bridge, which uses the OP Stack's proof system to ensure transaction integrity: + +1. Detection: L2 nodes detect the L1 reorg, flagging the Optimism bridge's related transactions for re-evaluation. +2. State Adjustment: The L2 blocks impacted by the reorg revert to an "unsafe" status. +3. Transaction Re-publication: The Sequencer typically republishes the same transactions for the bridge, using the proof system to re-establish transaction validity. +4. System Restoration: After reprocessing, the system stabilizes, restoring a consistent state for bridge-related operations without impacting the rollup's core finalized state.1 ### The role of proof system -The Fault Proof System is designed to ensure the accuracy of certain claims about the transaction state on the L2. It provides a way to prove messages from L2 to L1 are correct. It does not have to do with transaction finality. +The Fault Proof System is used by bridge contracts on L1 to verify claims that users make about the state of L2 for the purpose of facilitating user withdrawals of certain bridged assets from L2 to L1. A claim in the context of OP Stack is a statement asserting the state of the system at a specific block height. For instance, a claim might assert that at block 1,000,000 a certain address has all of the ether on the entire L2. If other participants believe this claim to be incorrect, they can challenge it. @@ -67,13 +67,26 @@ Although OP Stack finalizes transactions quickly (within 20 minutes), the 7-day 1. It allows time to dispute the correctness of output state roots posted to Ethereum by the proposer. 2. It provides a security period for withdrawal processing, ensuring the integrity of cross-chain operations. +During this 7-day period: + +* If no challenge is raised: The posted state root is confirmed as valid, and users can proceed with their withdrawals or related transactions on Ethereum, completing the cross-chain process smoothly. + +* If a successful challenge occurs: The claim on the state root is invalidated, blocking any withdrawals based on that incorrect state root. This ensures that any invalid state does not impact the L2 chain's integrity or user assets. + Notably, this challenge mechanism is app-level and does not trigger reorganization or alter the core L2 chain's finalized state. + ### Withdrawal delays vs. finality One common misconception is confusing withdrawal delays with transaction finality: * Transaction finality occurs in approximately 20 minutes. + +* Withdrawal delays are an application-level security feature specific to the Optimism bridge. These delays impact only L1 withdrawals and do not affect the L2 protocol's transaction finality. + This distinction ensures that the core protocol maintains efficiency and quick finalization for Layer 2 transactions. + * Withdrawal delays (often 7 days) are separate from transaction finality. + * Withdrawal delays are application-level security features. + * These delays affect only L1 withdrawals, not L2 transaction finality. ### Bridge independence diff --git a/words.txt b/words.txt index b86d09017..608ea2b89 100644 --- a/words.txt +++ b/words.txt @@ -11,6 +11,7 @@ Allocs allocs altda ANDI +Ankr Apeworx Arweave authrpc @@ -146,6 +147,7 @@ Holesky holesky IGNOREPRICE ignoreprice +Immunefi implicity Inator inator @@ -194,6 +196,7 @@ minsuggestedpriorityfee Mintable Mintplex MIPSEVM +Mitigations Monitorism Moralis Mordor @@ -287,6 +290,8 @@ Protip Proxied proxyd pseudorandomly +Pyth +Pyth's QRNG Quicknode quicknode @@ -318,6 +323,9 @@ safedb Schnorr secp SELFDESTRUCT +SEPOLIA +Sepolia +sepolia seqnr SEQUENCERHTTP sequencerhttp @@ -383,6 +391,7 @@ VMDEBUG vmdebug VMODULE vmodule +voxel wagmi Warpcast XORI From 8b21235a3219c3d3017bbc7aa78992f7d216184c Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Wed, 30 Oct 2024 14:56:42 +0100 Subject: [PATCH 344/565] Update pages/stack/interop/message-passing.mdx Co-authored-by: Skeletor Spaceman <92943766+skeletor-spaceman@users.noreply.github.com> --- pages/stack/interop/message-passing.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/stack/interop/message-passing.mdx b/pages/stack/interop/message-passing.mdx index f1ad2b9a3..d7eb199fc 100644 --- a/pages/stack/interop/message-passing.mdx +++ b/pages/stack/interop/message-passing.mdx @@ -77,7 +77,7 @@ The cross-chain messaging process follows a specific lifecycle: ### Prepare message sending - The [CrossChainMessenger](https://github.com/ethereum-optimism/optimism/blob/92ed64e171c6eb9c6a080c626640e8836f0653cc/packages/contracts-bedrock/src/L2/L2ToL2CrossDomainMessenger.sol) contract serves as the primary interface for cross-chain communication. + The [CrossDomainMessenger](https://github.com/ethereum-optimism/optimism/blob/92ed64e171c6eb9c6a080c626640e8836f0653cc/packages/contracts-bedrock/src/L2/L2ToL2CrossDomainMessenger.sol) contract serves as the primary interface for cross-chain communication. It initializes the connection to the L2 messenger contract and provides the base functionality for sending messages across chains. Key components: From adb1b7db11ebc9daecbc5a81979847ffb17a70c5 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Wed, 30 Oct 2024 15:53:18 +0100 Subject: [PATCH 345/565] fix file import paths issues --- next-env.d.ts | 2 +- .../tutorials/cross-dom-solidity.mdx | 64 +++++++++---------- public/tutorials/cross-dom-solidity.js | 14 +--- words.txt | 10 ++- 4 files changed, 42 insertions(+), 48 deletions(-) diff --git a/next-env.d.ts b/next-env.d.ts index 4f11a03dc..a4a7b3f5c 100644 --- a/next-env.d.ts +++ b/next-env.d.ts @@ -2,4 +2,4 @@ /// // NOTE: This file should not be edited -// see https://nextjs.org/docs/basic-features/typescript for more information. +// see https://nextjs.org/docs/pages/building-your-application/configuring/typescript for more information. diff --git a/pages/builders/app-developers/tutorials/cross-dom-solidity.mdx b/pages/builders/app-developers/tutorials/cross-dom-solidity.mdx index 1d086f678..ebdb5778c 100644 --- a/pages/builders/app-developers/tutorials/cross-dom-solidity.mdx +++ b/pages/builders/app-developers/tutorials/cross-dom-solidity.mdx @@ -1,34 +1,34 @@ --- -title: Communicating Between OP Mainnet and Ethereum in Solidity +title: Communicating Between OP Stack and Ethereum in Solidity lang: en-US -description: Learn how to write Solidity contracts on OP Mainnet and Ethereum that can talk to each other. +description: Learn how to write Solidity contracts on OP Stack and Ethereum that can talk to each other. --- import { Steps, Callout, Tabs } from 'nextra/components' -# Communicating Between OP Mainnet and Ethereum in Solidity +# Communicating Between OP Stack and Ethereum in Solidity -This tutorial explains how to write Solidity contracts on OP Mainnet and Ethereum that can talk to each other. -Here you'll use a contract on OP Mainnet that can set a "greeting" variable on a contract on Ethereum, and vice-versa. +This tutorial explains how to write Solidity contracts on OP Stack and Ethereum that can talk to each other. +Here you'll use a contract on OP Stack that can set a "greeting" variable on a contract on Ethereum, and vice-versa. This is a simple example, but the same technique can be used to send any kind of message between the two chains. You won't actually be deploying any smart contracts as part of this tutorial. -Instead, you'll reuse existing contracts that have already been deployed to OP Mainnet and Ethereum. +Instead, you'll reuse existing contracts that have already been deployed to OP Stack and Ethereum. Later in the tutorial you'll learn exactly how these contracts work so you can follow the same pattern to deploy your own contracts. -Just looking to bridge tokens between OP Mainnet and Ethereum? -Check out the tutorial on [Bridging ERC-20 Tokens to OP Mainnet With the Optimism SDK](./cross-dom-bridge-erc20). +Just looking to bridge tokens between OP Stack and Ethereum? +Check out the tutorial on [Bridging ERC-20 Tokens to OP Stack With the viem](./cross-dom-bridge-erc20). ## Message Passing Basics -OP Mainnet uses a smart contract called the `CrossDomainMessenger` to pass messages between OP Mainnet and Ethereum. +OP Stack uses a smart contract called the `CrossDomainMessenger` to pass messages between OP Stack and Ethereum. Both chains have a version of this contract (the `L1CrossDomainMessenger` and the `L2CrossDomainMessenger`). -Messages sent from Ethereum to OP Mainnet are automatically relayed behind the scenes. -Messages sent from OP Mainnet to Ethereum must be explicitly relayed with a second transaction on Ethereum. +Messages sent from Ethereum to OP Stack are automatically relayed behind the scenes. +Messages sent from OP Stack to Ethereum must be explicitly relayed with a second transaction on Ethereum. Read more about message passing in the guide to [Sending Data Between L1 and L2](/builders/app-developers/bridging/messaging). ## Dependencies @@ -127,15 +127,14 @@ Feel free to keep this tab open so you can easily copy the transaction hash late {

    Create a demo project folder

    } -You're going to use the Optimism SDK to prove and relay your message to L1. -Since the Optimism SDK is a [Node.js](https://nodejs.org/en/) library, you'll need to create a Node.js project to use it. +You're going to use the viem to prove and relay your message to L1. ```bash -mkdir op-sample-project -cd op-sample-project +mkdir cross-dom +cd cross-dom ``` -{

    Initialize the Project

    } +{

    Initialize the project

    } Set up the project as a basic Node.js project with `pnpm` or your favorite package manager. @@ -143,7 +142,7 @@ Set up the project as a basic Node.js project with `pnpm` or your favorite packa pnpm init ``` -{

    Install Viem

    } +{

    Install viem

    } Install Viem with `pnpm` or your favorite package manager. @@ -181,22 +180,17 @@ node {

    Import Viem

    } -```js file=/public/tutorials/cross-dom-solidity.js#L3-L5 hash=ed24e2f752f8c16ded84de74af10589d -``` - -{

    Load your private key

    } - -```js file=/public/tutorials/cross-dom-solidity.js#L7 hash=f5211d75b2d19d7fd6da17ef02449e4b +```js file=/public/tutorials/cross-dom-solidity.js#L3-L5 hash=65b9a5ad5b634bc2e424f5664e6e1f84 ``` {

    Load your transaction hash

    } -```js file=/public/tutorials/cross-dom-solidity.js#L9 hash=320cd4f397d7bed8d914d4be0c99f8dc +```js file=/public/tutorials/cross-dom-solidity.js#L7 hash=320cd4f397d7bed8d914d4be0c99f8dc ``` {

    Create the RPC providers and wallets

    } -```js file=/public/tutorials/cross-dom-solidity.js#L11-L12 hash=cedcc56e3200a039274dda506a897cb6 +```js file=/public/tutorials/cross-dom-solidity.js#L8-L9 hash=d47e4991c5153e1e1dc55de5047a8a3e ``` {

    Wait until the message is ready to prove

    } @@ -204,7 +198,7 @@ node Next, you will send messages from L2 to L1 is to prove that the message was sent on L2. You first need to wait until the message is ready to prove. -```js file=/public/tutorials/cross-dom-solidity.js#L17-L20 hash=be084e2a13c2cad44f6354feeb2bcbcb +```js file=/public/tutorials/cross-dom-solidity.js#L12-L16 hash=df275e659d954eb72b8c5765d9baf6de ``` @@ -216,34 +210,34 @@ Feel free to take a quick break while you wait. Once the message is ready to be proven, you'll send an L1 transaction to prove that the message was sent on L2. -```js file=/public/tutorials/cross-dom-solidity.js#L23-L27 hash=1af494e8b4c1533bc9d1ce981f7ec88c +```js file=/public/tutorials/cross-dom-solidity.js#L18-L23 hash=e4d608ac2c2ceb5a744c8474679bd8cb ``` {

    Wait until the message is ready for relay

    } The final step to sending messages from L2 to L1 is to relay the messages on L1. This can only happen after the fault proof period has elapsed. -On OP Mainnet, this takes 7 days. +On OP Stack, this takes 7 days. We're currently testing fault proofs on OP Sepolia, so withdrawal times reflect Mainnet times. -```js file=/public/tutorials/cross-dom-solidity.js#L30-L33 hash=ef3598d29f837b59cfb89e7bbbc0645d +```js file=/public/tutorials/cross-dom-solidity.js#L25-L29 hash=88cec1db2fde515ea9008eaa1bbdfd73 ``` {

    Relay the message on L1

    } Once the withdrawal is ready to be relayed you can finally complete the message sending process. -```js file=/public/tutorials/cross-dom-solidity.js#L36-L40 hash=c3e5c5d15c048c231397aebcb92eef2c +```js file=/public/tutorials/cross-dom-solidity.js#L31-L33 hash=d7e47c9787d92e2140622a6bdcc6d7bb ``` {

    Wait until the message is relayed

    } Now you simply wait until the message is relayed. -```js file=/public/tutorials/cross-dom-solidity.js#L43-L46 hash=e9da5a2b27185b0b948ac45b2d42a7f9 +```js file=/public/tutorials/cross-dom-solidity.js#L35-L36 hash=4ff3cdc48f17cfd7de4a6ef2d2671dc2 ``` {

    Check the L1 Greeter

    } @@ -326,10 +320,10 @@ You can follow a similar pattern in your own smart contracts. ## Conclusion You just learned how you can write Solidity contracts on Sepolia and OP Sepolia that can talk to each other. -You can follow the same pattern to write contracts that can talk to each other on Ethereum and OP Mainnet. +You can follow the same pattern to write contracts that can talk to each other on Ethereum and OP Stack. This sort of cross-chain communication is useful for a variety of reasons. -For example, the [Standard Bridge](/builders/app-developers/bridging/standard-bridge) contracts use this same system to bridge ETH and ERC-20 tokens between Ethereum and OP Mainnet. +For example, the [Standard Bridge](/builders/app-developers/bridging/standard-bridge) contracts use this same system to bridge ETH and ERC-20 tokens between Ethereum and OP Stack. -One cool way to take advantage of cross-chain communication is to do most of your heavy lifting on OP Mainnet and then send a message to Ethereum only when you have important results to share. -This way you can take advantage of the low gas costs on OP Mainnet while still being able to use Ethereum when you need it. +One cool way to take advantage of cross-chain communication is to do most of your heavy lifting on OP Stack and then send a message to Ethereum only when you have important results to share. +This way you can take advantage of the low gas costs on OP Stack while still being able to use Ethereum when you need it. diff --git a/public/tutorials/cross-dom-solidity.js b/public/tutorials/cross-dom-solidity.js index fba881ebd..c4368c9e5 100644 --- a/public/tutorials/cross-dom-solidity.js +++ b/public/tutorials/cross-dom-solidity.js @@ -2,9 +2,7 @@ const { createPublicClient, http } = require('viem'); const { optimismSepolia } = require('viem/chains'); -const { publicActionsL2 } = require('viem/op-stack'); - -const privateKey = process.env.TUTORIAL_PRIVATE_KE +const { publicActionsL1, publicActionsL2} = require('viem/op-stack'); const transactionHash = process.env.TUTORIAL_TRANSACTION_HASH @@ -32,16 +30,10 @@ await l1Provider.getWithdrawalStatus({ console.log('Relaying message...') const [message] = getWithdrawals(receipt) -await l1Provider.waitToFinalize({ - withdrawalHash: message.withdrawalHash, - targetChain: l2Provider.chain -}) +await l1Provider.waitToFinalize({ withdrawalHash: message.withdrawalHash, targetChain: l2Provider.chain }) console.log('Waiting for message to be relayed...') -await l1Provider.getWithdrawalStatus({ - receipt, - targetChain: l2Provider.chain, -}) +await l1Provider.getWithdrawalStatus({ receipt, targetChain: l2Provider.chain }) })() diff --git a/words.txt b/words.txt index f325c6327..b65cb58a7 100644 --- a/words.txt +++ b/words.txt @@ -9,8 +9,8 @@ airgap Allnodes Allocs allocs -altda ANDI +Ankr Apeworx Arweave authrpc @@ -145,6 +145,7 @@ Holesky holesky IGNOREPRICE ignoreprice +Immunefi implicity Inator inator @@ -194,6 +195,7 @@ minsuggestedpriorityfee Mintable Mintplex MIPSEVM +Mitigations Monitorism Moralis Mordor @@ -286,6 +288,8 @@ Protip Proxied proxyd pseudorandomly +Pyth +Pyth's QRNG Quicknode quicknode @@ -317,6 +321,9 @@ safedb Schnorr secp SELFDESTRUCT +SEPOLIA +Sepolia +sepolia seqnr SEQUENCERHTTP sequencerhttp @@ -382,6 +389,7 @@ VMDEBUG vmdebug VMODULE vmodule +voxel wagmi Warpcast XORI From 491a34dffa62e117902c39bd0f1d533165ec1a89 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Wed, 30 Oct 2024 15:53:58 +0100 Subject: [PATCH 346/565] updated word.txt --- words.txt | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/words.txt b/words.txt index b65cb58a7..376553b4f 100644 --- a/words.txt +++ b/words.txt @@ -1,5 +1,5 @@ -ACCOUNTQUEUE accountqueue +ACCOUNTQUEUE ACCOUNTSLOTS accountslots ADDI @@ -9,6 +9,7 @@ airgap Allnodes Allocs allocs +altda ANDI Ankr Apeworx @@ -16,6 +17,7 @@ Arweave authrpc Badgeholder's Badgeholders +badgeholders basefee BGEZ BGTZ @@ -27,8 +29,8 @@ BLOBPOOL blobpool blobspace blockhash -blocklists BLOCKLOGS +blocklists blocklogs BLOCKPROFILERATE blockprofilerate @@ -38,7 +40,6 @@ blocktime BLOOMFILTER bloomfilter BLTZ -Bluesweep Bootcamp BOOTNODES Bootnodes @@ -65,6 +66,8 @@ computependingblock confs corsdomain counterfactually +Crosschain +crosschain Crossmint daserver DATACAP @@ -170,7 +173,6 @@ leveldb lightkdf logfile logfmt -marketshare MAXAGE maxage MAXBACKUPS @@ -206,7 +208,7 @@ MTHI MTLO MULT multiaddr -Multichain +multichain multiclient multisigs MULTU @@ -263,6 +265,7 @@ POAPs PPROF pprof preconfigured +Predeploy predeploy Predeployed predeployed @@ -302,10 +305,10 @@ rejournal REMOTEDB remotedb replayability -reproven +replayor REQUIREDBLOCKS requiredblocks -Rollouts +rollouts Rollups rollups Routescan @@ -316,14 +319,14 @@ rpcs RPGF Rpgf rpgf +Runbooks +runbooks RWAs safedb Schnorr secp SELFDESTRUCT -SEPOLIA Sepolia -sepolia seqnr SEQUENCERHTTP sequencerhttp @@ -349,6 +352,7 @@ subcomponents subgame subheaders SUBU +Sunnyside SUPERCHAIN Superchain superchain @@ -372,6 +376,7 @@ trustlessly trustrpc txfeecap txmgr +txns TXPOOL txpool txproxy @@ -392,9 +397,10 @@ vmodule voxel wagmi Warpcast +xlarge XORI xtensibility ZKPs ZKVM Zora -zora +zora \ No newline at end of file From 5555c6cf12123556e906792fe64549b3ba32513d Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Wed, 30 Oct 2024 16:57:09 +0100 Subject: [PATCH 347/565] Added a guide on how to transfer a SuperchainERC20 --- pages/stack/interop/_meta.json | 3 +- .../interop/transfer-superchainERC20.mdx | 128 ++++++++++++++++++ words.txt | 8 +- 3 files changed, 135 insertions(+), 4 deletions(-) create mode 100644 pages/stack/interop/transfer-superchainERC20.mdx diff --git a/pages/stack/interop/_meta.json b/pages/stack/interop/_meta.json index 0fad31024..1b77774f6 100644 --- a/pages/stack/interop/_meta.json +++ b/pages/stack/interop/_meta.json @@ -2,5 +2,6 @@ "explainer": "Interop explainer", "cross-chain-message": "Anatomy of cross-chain message", "supersim": "Supersim Multichain Development Environment", - "superchain-erc20": "SuperchainERC20 token standard" + "superchain-erc20": "SuperchainERC20 token standard", + "transfer-superchainERC20": "How to transfer a SuperchainERC20" } \ No newline at end of file diff --git a/pages/stack/interop/transfer-superchainERC20.mdx b/pages/stack/interop/transfer-superchainERC20.mdx new file mode 100644 index 000000000..085537284 --- /dev/null +++ b/pages/stack/interop/transfer-superchainERC20.mdx @@ -0,0 +1,128 @@ +--- +title: How to transfer a SuperchainERC20 +lang: en-US +description: Learn how to transfer a SuperchainERC20 between chains using L2ToL2CrossDomainMessenger. +--- + +import { Callout, Steps } from 'nextra/components' + +# How to transfer a SuperchainERC20 + +This guide walks you through transferring SuperchainERC20 tokens between chains using the `L2ToL2CrossDomainMessenger` contract. + +## Prerequisites + +Before you begin, ensure you have: + +* Access to source and destination chain RPC endpoints +* A private key with funds on both chains +* The `cast` command-line tool installed + + + All commands in this guide use the `cast` CLI tool. Make sure you have it properly configured with your RPC endpoints. + + +## Contract addresses + +The following contracts are used in this guide: + +* L2NativeSuperchainERC20: `0x420beeF000000000000000000000000000000001` +* L2ToL2CrossDomainMessenger: `0x4200000000000000000000000000000000000023` + +## How it works + +Transferring tokens involves two main phases: + +1. **Source chain operations**: Mint tokens and initiate the transfer +2. **Destination chain operations**: Relay the message to complete the transfer + + + Always verify your addresses and amounts before sending transactions. Cross-chain transfers cannot be reversed. + + + + +### Step 1: Mint tokens + +First, mint tokens on the source chain: + +```bash +cast send 0x420beeF000000000000000000000000000000001 \ +"mint(address _to, uint256 _amount)" \ +YOUR_ADDRESS 1000 \ +--rpc-url SOURCE_CHAIN_RPC \ +--private-key YOUR_PRIVATE_KEY +``` + + + Replace `YOUR_ADDRESS`, `SOURCE_CHAIN_RPC`, and `YOUR_PRIVATE_KEY` with your actual values. + + +### Step 2: Initiate transfer + +After minting, initiate the bridge transfer: + +```bash +cast send 0x4200000000000000000000000000000000000028 \ +"sendERC20(address _token, address _to, uint256 _amount, uint256 _chainId)" \ +0x420beeF000000000000000000000000000000001 \ +RECIPIENT_ADDRESS 1000 DESTINATION_CHAIN_ID \ +--rpc-url SOURCE_CHAIN_RPC \ +--private-key YOUR_PRIVATE_KEY +``` + + + The transfer isn't complete until you relay the message on the destination chain. + + +### Step 3: Get message details + +Retrieve the message details from the L2ToL2CrossDomainMessenger: + +```bash +cast logs \ +--address 0x4200000000000000000000000000000000000023 \ +--rpc-url SOURCE_CHAIN_RPC +``` + + + Note down the `blockNumber`, `logIndex`, and timestamp - you'll need these for relaying. + + +### Step 4: Relay the message + +Complete the transfer by relaying the message on the destination chain: + +```bash +cast send 0x4200000000000000000000000000000000000023 \ +--gas-limit 200000 \ +"relayMessage((address, uint256, uint256, uint256, uint256), bytes)" \ +"(0x4200000000000000000000000000000000000023, BLOCK_NUMBER, LOG_INDEX, TIMESTAMP, SOURCE_CHAIN_ID)" \ +MESSAGE_PAYLOAD \ +--rpc-url DESTINATION_CHAIN_RPC \ +--private-key YOUR_PRIVATE_KEY +``` + +### Step 5: Verify transfer + +Check the balance on the destination chain: + +```bash +cast balance \ +--erc20 0x420beeF000000000000000000000000000000001 \ +RECIPIENT_ADDRESS \ +--rpc-url DESTINATION_CHAIN_RPC +``` + + +## Alternative methods + +You can also use: + +* `supersim --interop.autorelay` for development environments +* [viem bindings/actions](https://supersim.pages.dev/guides/interop/relay-using-viem) for TypeScript integration + +## Next steps + +* Read the [Superchain Interop Explainer](/stack/interop/explainer#faqs) or check out this [Superchain interop design video walk-thru](https://www.youtube.com/watch?v=FKc5RgjtGes). +* Use [Supersim](supersim), a local dev environment that simulates Superchain interop for testing applications against a local version of the Superchain. diff --git a/words.txt b/words.txt index 5ce846b7a..5be79af1c 100644 --- a/words.txt +++ b/words.txt @@ -1,5 +1,5 @@ -accountqueue ACCOUNTQUEUE +accountqueue ACCOUNTSLOTS accountslots ADDI @@ -29,8 +29,8 @@ BLOBPOOL blobpool blobspace blockhash -BLOCKLOGS blocklists +BLOCKLOGS blocklogs BLOCKPROFILERATE blockprofilerate @@ -326,7 +326,9 @@ safedb Schnorr secp SELFDESTRUCT +SEPOLIA Sepolia +sepolia seqnr SEQUENCERHTTP sequencerhttp @@ -404,4 +406,4 @@ xtensibility ZKPs ZKVM Zora -zora \ No newline at end of file +zora From 6048f9cfbba1a0a75d9da0c02b54f817ce5303dd Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Wed, 30 Oct 2024 17:04:15 +0100 Subject: [PATCH 348/565] updated text --- pages/stack/interop/transfer-superchainERC20.mdx | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/pages/stack/interop/transfer-superchainERC20.mdx b/pages/stack/interop/transfer-superchainERC20.mdx index 085537284..a5ac331d2 100644 --- a/pages/stack/interop/transfer-superchainERC20.mdx +++ b/pages/stack/interop/transfer-superchainERC20.mdx @@ -14,9 +14,9 @@ This guide walks you through transferring SuperchainERC20 tokens between chains Before you begin, ensure you have: -* Access to source and destination chain RPC endpoints -* A private key with funds on both chains -* The `cast` command-line tool installed +* Access to source and destination chain RPC endpoints. +* A private key with funds on both chains. +* The `cast` command-line tool installed. All commands in this guide use the `cast` CLI tool. Make sure you have it properly configured with your RPC endpoints. @@ -33,8 +33,8 @@ The following contracts are used in this guide: Transferring tokens involves two main phases: -1. **Source chain operations**: Mint tokens and initiate the transfer -2. **Destination chain operations**: Relay the message to complete the transfer +1. **Source chain operations**: Mint tokens and initiate the transfer. +2. **Destination chain operations**: Relay the message to complete the transfer. Always verify your addresses and amounts before sending transactions. Cross-chain transfers cannot be reversed. From 65200a5ed30acdfb50dc15986469ce9273c16642 Mon Sep 17 00:00:00 2001 From: soyboy <85043086+sbvegan@users.noreply.github.com> Date: Wed, 30 Oct 2024 10:46:16 -0600 Subject: [PATCH 349/565] uniform capitilization of Fault Proof System --- nouns.txt | 1 + pages/builders/chain-operators/hacks/settlement.mdx | 2 +- pages/builders/chain-operators/tools/op-challenger.mdx | 2 +- .../tutorials/adding-derivation-attributes.mdx | 2 +- pages/stack/explainer.mdx | 4 ++-- pages/stack/fault-proofs/challenger.mdx | 2 +- pages/stack/fault-proofs/explainer.mdx | 6 +++--- pages/stack/fault-proofs/fp-components.mdx | 6 +++--- pages/stack/fault-proofs/fp-security.mdx | 2 +- pages/stack/security/faq.mdx | 2 +- pages/stack/smart-contracts.mdx | 2 +- 11 files changed, 16 insertions(+), 15 deletions(-) diff --git a/nouns.txt b/nouns.txt index 6fd4a3cab..fc2ef774d 100644 --- a/nouns.txt +++ b/nouns.txt @@ -16,3 +16,4 @@ Granite Holocene Monitorism Kubernetes +Fault Proof System \ No newline at end of file diff --git a/pages/builders/chain-operators/hacks/settlement.mdx b/pages/builders/chain-operators/hacks/settlement.mdx index f86fe1d06..2b96be231 100644 --- a/pages/builders/chain-operators/hacks/settlement.mdx +++ b/pages/builders/chain-operators/hacks/settlement.mdx @@ -34,7 +34,7 @@ One simple modification to the Settlement Layer is to tweak the parameters of th ### Custom proofs -Settlement Layer modules use a proof system to verify the correctness of the state of your OP Stack chain as proposed on the third-party chain. In general, these proofs are either Optimistic proofs that require a withdrawal delay or Validity proofs that use a mathematical proof system to assert the validity of the proposal. The current Attestation Proof Optimistic Settlement module could be replaced with a fault proof system. +Settlement Layer modules use a proof system to verify the correctness of the state of your OP Stack chain as proposed on the third-party chain. In general, these proofs are either Optimistic proofs that require a withdrawal delay or Validity proofs that use a mathematical proof system to assert the validity of the proposal. The current Attestation Proof Optimistic Settlement module could be replaced with a Fault Proof System. ### Multiple modules diff --git a/pages/builders/chain-operators/tools/op-challenger.mdx b/pages/builders/chain-operators/tools/op-challenger.mdx index 7a3cc27d6..9c27d7c64 100644 --- a/pages/builders/chain-operators/tools/op-challenger.mdx +++ b/pages/builders/chain-operators/tools/op-challenger.mdx @@ -195,7 +195,7 @@ This guide provides a walkthrough of setting up the configuration and monitoring ### Test and debug challenger (optional) - This is an optional step to use `op-challenger` subcommands, which allow chain operators to interact with the fault proof system onchain for testing and debugging purposes. For example, it is possible to test and explore the system in the following ways: + This is an optional step to use `op-challenger` subcommands, which allow chain operators to interact with the Fault Proof System onchain for testing and debugging purposes. For example, it is possible to test and explore the system in the following ways: * create games yourself, and it doesn't matter if the games are valid or invalid. * perform moves in games and then claim and resolve things. diff --git a/pages/builders/chain-operators/tutorials/adding-derivation-attributes.mdx b/pages/builders/chain-operators/tutorials/adding-derivation-attributes.mdx index cfbc718ad..1bb3c9864 100644 --- a/pages/builders/chain-operators/tutorials/adding-derivation-attributes.mdx +++ b/pages/builders/chain-operators/tutorials/adding-derivation-attributes.mdx @@ -271,6 +271,6 @@ cast call "total()" | cast --from-wei ## Conclusion -With just a few tiny changes to the `op-node`, you were just able to implement a change to the OP Stack that allows you to keep track of the L1 ETH burn on L2. With a live Cannon fault proof system, you should not only be able to track the L1 burn on L2, you should be able to *prove* the burn to contracts back on L1. That's crazy! +With just a few tiny changes to the `op-node`, you were just able to implement a change to the OP Stack that allows you to keep track of the L1 ETH burn on L2. With a live Cannon Fault Proof System, you should not only be able to track the L1 burn on L2, you should be able to *prove* the burn to contracts back on L1. That's crazy! The OP Stack is an extremely powerful platform that allows you to perform a large amount of computation trustlessly. It's a superpower for smart contracts. Tracking the L1 burn is just one of the many, many wild things you can do with the OP Stack. If you're looking for inspiration or you want to see what others are building on the OP Stack, check out the OP Stack Hacks page. Maybe you'll find a project you want to work on, or maybe you'll get the inspiration you need to build the next killer smart contract. diff --git a/pages/stack/explainer.mdx b/pages/stack/explainer.mdx index 7390e26ee..fee75d83c 100644 --- a/pages/stack/explainer.mdx +++ b/pages/stack/explainer.mdx @@ -148,7 +148,7 @@ In order to address these issues, we can introduce two features: We can enable these two features first by introducing a permissionless proof system to the Optimism bridge contracts. With the modular proof design introduced in Bedrock, proofs may come in the form of fault proofs or validity proofs (e.g. zero knowledge proofs). However, until validity proofs are productionized, we assume withdrawals will use a fault proof system. -In the envisioned fault proof system, anyone can submit a withdrawal claim, and these withdrawal claims can be submitted at any time. Submitting withdrawal claims can be permissionless when claims come with bonds attached to them, as these bonds act as collateral if the claim is proven to be invalid. If a challenger successfully challenges the claim, the bond is paid out to the challenger for their participation in securing the system, thereby preventing spam even within this permissionless system. Additionally, there is no need to submit them at a regular interval because the fault proof game can efficiently prove the entire history of the chain since genesis. +In the envisioned Fault Proof System, anyone can submit a withdrawal claim, and these withdrawal claims can be submitted at any time. Submitting withdrawal claims can be permissionless when claims come with bonds attached to them, as these bonds act as collateral if the claim is proven to be invalid. If a challenger successfully challenges the claim, the bond is paid out to the challenger for their participation in securing the system, thereby preventing spam even within this permissionless system. Additionally, there is no need to submit them at a regular interval because the fault proof game can efficiently prove the entire history of the chain since genesis. The fault proof implementation may initially rely on a trusted set of chain attestors to be the final arbiter of disputes. Challengers must request attestations from a large number of chain attestors and combine these attestations into a single transaction called an attestation proof. The attestation proof is then used to challenge invalid claims. @@ -290,7 +290,7 @@ A generic Plasma protocol is able to scale beyond what is possible on L1 because * If the DA Provider does not send the proof to the user, the user may submit a DA challenge. This forces the DA Provider to post the transaction data onchain. If the DA Provider does not submit the proof onchain, the hash is deleted. This ensures the user can always (after the challenge period) sync the Plasma chain. * DA challenge periods may be extended in case of heavy L1 congestion. * The user may also submit an L1 transaction to withdraw from the Plasma chain in order to switch their DA Provider. -* Settlement of Plasma chains use a near identical fault proof system to Rollup chains with the only difference being that additional data is derived from the chain using the hashes that are finalized in the Plasma Contract. +* Settlement of Plasma chains use a near identical Fault Proof System to Rollup chains with the only difference being that additional data is derived from the chain using the hashes that are finalized in the Plasma Contract. Because of the ability for hashes to reduce arbitrary size data into a constant size commitment, and the ability to parallelize transaction data hashing, it is possible to achieve near-perfect horizontal scalability of data commitments using Plasma DA. This means that it is possible to put massively scalable applications such as games or social media on Plasma chains. diff --git a/pages/stack/fault-proofs/challenger.mdx b/pages/stack/fault-proofs/challenger.mdx index a70f022e1..17be766d5 100644 --- a/pages/stack/fault-proofs/challenger.mdx +++ b/pages/stack/fault-proofs/challenger.mdx @@ -1,7 +1,7 @@ --- title: OP-Challenger explainer lang: en-US -description: Learn about OP-Challenger and how it operates within the OP Stack's fault proof system. +description: Learn about OP-Challenger and how it operates within the OP Stack's Fault Proof System. --- import { Callout } from 'nextra/components' diff --git a/pages/stack/fault-proofs/explainer.mdx b/pages/stack/fault-proofs/explainer.mdx index df6c46ecb..b22ce591a 100644 --- a/pages/stack/fault-proofs/explainer.mdx +++ b/pages/stack/fault-proofs/explainer.mdx @@ -1,7 +1,7 @@ --- title: Fault proofs explainer lang: en-US -description: Learn about the OP Stack's fault proof system. +description: Learn about the OP Stack's Fault Proof System. --- import { Callout } from 'nextra/components' @@ -45,7 +45,7 @@ Any user can run a node for the OP Stack chain in question and use the `op-chall ## Modular design and multi-layer security -The OP Stack Fault Proof system is [modular in design](/stack/fault-proofs/fp-components#system-design--modularity) and lays the groundwork for achieving a "multi-proof" system. This allows the OP Stack to support multiple proof systems alongside the initial [Cannon](/stack/fault-proofs/cannon) proof system. +The OP Stack Fault Proof System is [modular in design](/stack/fault-proofs/fp-components#system-design--modularity) and lays the groundwork for achieving a "multi-proof" system. This allows the OP Stack to support multiple proof systems alongside the initial [Cannon](/stack/fault-proofs/cannon) proof system. With multiple proof systems in place, the OP Stack can be more resilient to potential attacks and bugs in any one proof system. Additionally, the following [security safeguards](/stack/fault-proofs/fp-security) have been built around the game, as follows: @@ -78,7 +78,7 @@ It's not expected that normal users run `op-proposer` to regularly propose outpu Users would generally just propose a single output root if they need to withdraw and the chain operator isn't proposing outputs for them via direct calls to the `DisputeGameFactory` via Etherscan or using the [`create-game`](https://github.com/ethereum-optimism/optimism/tree/develop/op-challenger#create-game) subcommand of `op-challenger`. Documentation for `op-challenger` is forthcoming. -### How much ETH should a chain operator put aside to operate the fault proof system? +### How much ETH should a chain operator put aside to operate the Fault Proof System? The nominal operating cost of running FPs (i.e., assuming no invalid proposals or malicious actors) will depend on the initial bond set for the `FaultDisputeGame` and the frequency of posting proposals. Assuming OP Mainnet parameters, where proposals will be posted hourly, that's 0.08 ETH per hour. diff --git a/pages/stack/fault-proofs/fp-components.mdx b/pages/stack/fault-proofs/fp-components.mdx index 558ed7372..d3132d21e 100644 --- a/pages/stack/fault-proofs/fp-components.mdx +++ b/pages/stack/fault-proofs/fp-components.mdx @@ -1,7 +1,7 @@ --- title: FP System components lang: en-US -description: Learn about fault proof system components and how they work together to enhance decentralization in the Optimism ecosystem. +description: Learn about Fault Proof System components and how they work together to enhance decentralization in the Optimism ecosystem. --- import Image from 'next/image' @@ -13,7 +13,7 @@ This page explains the fault proof system components and how they work together The Fault Proof System is comprised of three main components: a Fault Proof Program (FPP), a Fault Proof Virtual Machine (FPVM), and a dispute game protocol. The system is designed to eventually enable secure bridging without central fallback. -The modular design of the fault proof system lays the foundation for a multi-proof future, inclusive of ZK proofs, and significantly increases the opportunities for ecosystem contributors to build alternative fault proof components to secure the system. +The modular design of the Fault Proof System lays the foundation for a multi-proof future, inclusive of ZK proofs, and significantly increases the opportunities for ecosystem contributors to build alternative fault proof components to secure the system. Visit the [Immunefi bug bounty page](https://immunefi.com/bounty/optimism/) for details on testing and helping to build a robust fault proof system. @@ -30,7 +30,7 @@ See the video below for a full technical walkthrough of the OP Stack's first fau The OP Stack's unique, modular design allows the decoupling of the FPP and FPVM, resulting in the following: * development of multiple proof systems, unique dispute games, and a variety of FPVMs in the future. -* custom-built fault proof systems comprised of any combination of these isolated components—including validity proofs, attestation proofs, or ZKVM. +* custom-built Fault Proof Systems comprised of any combination of these isolated components—including validity proofs, attestation proofs, or ZKVM. * dispute games in the dispute protocol backed by multiple security mechanisms. ## Fault proof program diff --git a/pages/stack/fault-proofs/fp-security.mdx b/pages/stack/fault-proofs/fp-security.mdx index 453f8d93d..6f070fb06 100644 --- a/pages/stack/fault-proofs/fp-security.mdx +++ b/pages/stack/fault-proofs/fp-security.mdx @@ -55,7 +55,7 @@ The `FaultDisputeGame` contracts store bonds within a `DelayedWETH` contract tha ### Cumulative security impact As with the original system, the cumulative effect of these security capabilities is that the `Guardian` role provides fast response capabilities while the `SystemOwner` can always step in to resolve all classes of bugs that could result in a loss of funds. -The most significant change in security model with the introduction of Fault Proof Mainnet is that `SystemOwner` can take a more passive role as invalid proposals will generally be rejected by the Fault Proof system while the `Guardian` can act as a backstop only in case of a failure in the fault proof game. +The most significant change in security model with the introduction of Fault Proof Mainnet is that `SystemOwner` can take a more passive role as invalid proposals will generally be rejected by the Fault Proof System while the `Guardian` can act as a backstop only in case of a failure in the fault proof game. ## Next steps diff --git a/pages/stack/security/faq.mdx b/pages/stack/security/faq.mdx index 31b892758..def6ace78 100644 --- a/pages/stack/security/faq.mdx +++ b/pages/stack/security/faq.mdx @@ -32,7 +32,7 @@ As with anything, modify the OP Stack at your own risk. There is no guarantee th ### Can I use fault proofs? -**Not yet.** The OP Stack does not currently have a fault proof system. **Note that fault proofs do not meaningfully improve the security of a system if that system can be upgraded within the 7 day challenge window ("fast upgrade keys")**. A system with fast upgrade keys is fully dependent on the upgrade keys for security. +**Not yet.** The OP Stack does not currently have a Fault Proof System. **Note that fault proofs do not meaningfully improve the security of a system if that system can be upgraded within the 7 day challenge window ("fast upgrade keys")**. A system with fast upgrade keys is fully dependent on the upgrade keys for security. Fault proofs are a key milestone and top priority for the OP Stack. In the meantime, the OP Stack can be shipped with several other excellent security options for systems that want to improve security before fault proofs are available in production. diff --git a/pages/stack/smart-contracts.mdx b/pages/stack/smart-contracts.mdx index 973821f2a..bb6a29f5d 100644 --- a/pages/stack/smart-contracts.mdx +++ b/pages/stack/smart-contracts.mdx @@ -37,7 +37,7 @@ Contract releases have a component name of `op-contracts` and therefore are tagg The release fixes security vulnerabilities found in Fault Proof contracts. They were made in response to security vulnerabilities identified during a series of third-party security audits by Spearbit, Cantina, and Code4rena. None of the vulnerabilities have been exploited, and user assets are not and were never at risk. -The upgrade was coupled with the [Granite network upgrade](/builders/node-operators/network-upgrades#granite) to improve the stability and performance of the fault proof system. In addition, the capabilities of the Guardian and DeputyGuardian have been extended to set the anchor state for the fault proof system in order to prevent referencing invalid anchor states. +The upgrade was coupled with the [Granite network upgrade](/builders/node-operators/network-upgrades#granite) to improve the stability and performance of the Fault Proof System. In addition, the capabilities of the Guardian and DeputyGuardian have been extended to set the anchor state for the Fault Proof System in order to prevent referencing invalid anchor states. * [Official - Fault Proof Fixes Release](https://github.com/ethereum-optimism/optimism/releases/tag/op-contracts%2Fv1.6.0) * [Governance Post](https://gov.optimism.io/t/upgrade-proposal-10-granite-network-upgrade/8733) From c3567842040466d98bf60e55603d2645e1d68d3f Mon Sep 17 00:00:00 2001 From: soyboy <85043086+sbvegan@users.noreply.github.com> Date: Wed, 30 Oct 2024 11:05:51 -0600 Subject: [PATCH 350/565] missed one --- pages/stack/explainer.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/stack/explainer.mdx b/pages/stack/explainer.mdx index fee75d83c..a1fb71bef 100644 --- a/pages/stack/explainer.mdx +++ b/pages/stack/explainer.mdx @@ -146,7 +146,7 @@ In order to address these issues, we can introduce two features: A claim about the state of one chain made on another chain. For instance, I can claim that in OP Mainnet I have burned my tokens with the intent to withdraw those tokens back to L1. -We can enable these two features first by introducing a permissionless proof system to the Optimism bridge contracts. With the modular proof design introduced in Bedrock, proofs may come in the form of fault proofs or validity proofs (e.g. zero knowledge proofs). However, until validity proofs are productionized, we assume withdrawals will use a fault proof system. +We can enable these two features first by introducing a permissionless proof system to the Optimism bridge contracts. With the modular proof design introduced in Bedrock, proofs may come in the form of fault proofs or validity proofs (e.g. zero knowledge proofs). However, until validity proofs are productionized, we assume withdrawals will use a Fault Proof System. In the envisioned Fault Proof System, anyone can submit a withdrawal claim, and these withdrawal claims can be submitted at any time. Submitting withdrawal claims can be permissionless when claims come with bonds attached to them, as these bonds act as collateral if the claim is proven to be invalid. If a challenger successfully challenges the claim, the bond is paid out to the challenger for their participation in securing the system, thereby preventing spam even within this permissionless system. Additionally, there is no need to submit them at a regular interval because the fault proof game can efficiently prove the entire history of the chain since genesis. From eb0e74ed163931ac8cc963b94c0003c8acc27143 Mon Sep 17 00:00:00 2001 From: cpengilly <29023967+cpengilly@users.noreply.github.com> Date: Wed, 30 Oct 2024 11:00:07 -0700 Subject: [PATCH 351/565] feedback addresssed --- pages/stack/interop/_meta.json | 3 +- pages/stack/interop/op-supervisor.mdx | 44 +++++++++++++-------------- 2 files changed, 24 insertions(+), 23 deletions(-) diff --git a/pages/stack/interop/_meta.json b/pages/stack/interop/_meta.json index 0fad31024..8cfbc2599 100644 --- a/pages/stack/interop/_meta.json +++ b/pages/stack/interop/_meta.json @@ -2,5 +2,6 @@ "explainer": "Interop explainer", "cross-chain-message": "Anatomy of cross-chain message", "supersim": "Supersim Multichain Development Environment", - "superchain-erc20": "SuperchainERC20 token standard" + "superchain-erc20": "SuperchainERC20", + "op-supervisor": "OP Supervisor" } \ No newline at end of file diff --git a/pages/stack/interop/op-supervisor.mdx b/pages/stack/interop/op-supervisor.mdx index 32ff4a68c..100f29533 100644 --- a/pages/stack/interop/op-supervisor.mdx +++ b/pages/stack/interop/op-supervisor.mdx @@ -1,63 +1,63 @@ --- -title: OP-Supervisor +title: OP Supervisor lang: en-US description: Learn the basics of OP-Supervisor. --- import { Callout, Tabs, Steps } from 'nextra/components' -# OP-Supervisor +# OP Supervisor Interop is currently in active development and not yet ready for production use. The information provided here may change. Check back regularly for the most up-to-date information. -`op-supervisor` is a critical service designed to verify cross-chain messages and manage the safety of interoperability between different chains in the OP Stack. It acts as a hub for indexing data that every `op-node` needs to cross-verify with other chains. - -## Features and benefits +OP Supervisor is a critical service designed to verify cross-chain messages and manage the safety of interoperability between different chains in the OP Stack. It acts as a hub for indexing data that every `op-node` needs to cross-verify with other chains. +Some features and benefits include: * Enables secure cross-chain message passing on the Superchain * Provides a centralized point for managing interoperability data -* Reduces the complexity and cost of operating individual nodes * Supports multiple networks simultaneously * Offers potential for public endpoints to aid in node synchronization -## Major components - -### Cross-chain message verification +## Cross-chain message verification -Verifies messages between different chains in the OP Stack, reducing the risk of invalid or malicious cross-chain interactions.⁠ It centralizes the verification process, which reduces the complexity and cost of operating individual nodes⁠.⁠ +Verifies messages between different chains in the OP Stack, reducing the risk of invalid or malicious cross-chain interactions.⁠ It centralizes the verification process, which reduces the complexity of operating individual nodes⁠.⁠ -* `op-geth`: queries `op-supervisor` during block-building to verify if a message is sufficiently safe to include. This process involves checking each executing message and potentially undoing transactions if conflicts or unknown states are encountered. +* `op-geth`: queries `op-supervisor` during block-building to verify if a message is sufficiently safe to include. This process involves checking each executing message and potentially undoing transactions if conflicts or unknown states are encountered. `op-geth` also queries `op-supervisor` when taking new items into the mempool as an [early filter mechanism](https://github.com/ethereum-optimism/op-geth/pull/422). * `op-node`: queries cross-chain safety information and coordinates safety updates between OP stack nodes and `op-supervisor`. It uses the API provided by `op-supervisor` to perform actions like: * Updating and retrieving various safety levels * Checking and returning the `cross-unsafe` head for a given chain * Attempting to promote a block to `cross-safe` status * Attempting to finalize an L2 block based on L1 finality -### Safe data indexing and management +## Log data indexing and management Acts as a hub for indexing data that every `op-node` needs to cross-verify with other chains, centralizing the process of managing interoperability data. Maintains the integrity of cross-chain interactions by tracking safety changes⁠ across the Superchain, ensuring consistent application of invalid dependency resolutions. ⁠ `op-supervisor` indexes two types of cross-chain dependencies: -* Interop messages (events): `op-supervisor`maintains an events-index per L2 chain, which determines message-dependencies to check if blocks are safe -* L1 DA (data availability) batches: `op-supervisor`maintains a DA safety-index per L2 chain, which helps determine how to rewind L2 chains to resolve invalid dependencies +* Interop messages (events): `op-supervisor` maintains an events-index per L2 chain, which determines message-dependencies to check if blocks are safe +* L1 DA (data availability): `op-supervisor` tracks the L1 DA for L2 blocks and maintains a DA safety-index per L2 chain, which helps determine how to rewind L2 chains to resolve invalid dependencies -### API for cross-chain safety +## API for cross-chain safety Provides an interface for `op-node` to query cross-chain safety information and coordinate safety updates between OP stack nodes and `op-supervisor⁠⁠`. OP-Supervisor uses a global read API to determine **message safety** and **block safety,** utilizing both the events index and the safety index (See op-supervisor's [safe data indexing](#safe-data-indexing-and-management)). The API is designed to handle potential L1 reorgs that can affect the validity of cross-chain messages⁠. Key API methods include: -| Method | Description | -| -------------------- | ---------------------------------------------------------------------------------------- | -| `ExchangeSyncStatus` | Updates and retrieves various safety levels (LocalUnsafe, CrossUnsafe, LocalSafe, etc.)⁠ | -| `TryCrossUnsafe` | Checks and returns the cross-unsafe head for a given chain⁠⁠​ | -| `TryCrossSafe` | Attempts to promote a block to cross-safe status⁠⁠​ | -| `TryFinalize` | Attempts to finalize an L2 block based on L1 finality⁠ | +| Method | Description | +| ----------------------------------------- | ------------------------------------------------------------------------------------- | +| `UnsafeView` and `SafeView` | Returns the Local and Cross heads for their respective levels | +| `DerivedFrom` | OP Nodes use to check the L1 source of the Supervisor (needed for Safe Head tracking) | +| `UpdateLocalSafe` and `UpdateLocalUnsafe` | Tells the Supervisor when the Node's heads change | +| `Finalized` | Returns the Finalized Head | +| `UpdateFinalizedL1` | Signals to the Supervisor new finality signals | +| `CheckMessage` | Checks logs in the DB directly in tests, can also use `CheckMessages` in geth | + +For a full listing of API names, see the [`op-supervisor` client](https://github.com/ethereum-optimism/optimism/blob/develop/op-service/sources/supervisor_client.go). -### RPC access to all chains +## RPC access to all chains The `op-supervisor` requires RPC access to all chains in the dependency set. This allows `op-supervisor` to verify cross-chain messages and sync data across multiple networks simultaneously, such as OP Mainnet and Base nodes using the same instance. From e3c0a063a975294de36ccf7f12abfd860d277095 Mon Sep 17 00:00:00 2001 From: cpengilly <29023967+cpengilly@users.noreply.github.com> Date: Wed, 30 Oct 2024 11:08:17 -0700 Subject: [PATCH 352/565] Update op-supervisor.mdx --- pages/stack/interop/op-supervisor.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/stack/interop/op-supervisor.mdx b/pages/stack/interop/op-supervisor.mdx index 100f29533..832cb27d1 100644 --- a/pages/stack/interop/op-supervisor.mdx +++ b/pages/stack/interop/op-supervisor.mdx @@ -24,7 +24,7 @@ Some features and benefits include: Verifies messages between different chains in the OP Stack, reducing the risk of invalid or malicious cross-chain interactions.⁠ It centralizes the verification process, which reduces the complexity of operating individual nodes⁠.⁠ -* `op-geth`: queries `op-supervisor` during block-building to verify if a message is sufficiently safe to include. This process involves checking each executing message and potentially undoing transactions if conflicts or unknown states are encountered. `op-geth` also queries `op-supervisor` when taking new items into the mempool as an [early filter mechanism](https://github.com/ethereum-optimism/op-geth/pull/422). +* `op-geth`: queries `op-supervisor` during block-building to verify if a message is sufficiently safe to include. This process involves checking each executing message and potentially undoing transactions if conflicts or unknown states are encountered. * `op-node`: queries cross-chain safety information and coordinates safety updates between OP stack nodes and `op-supervisor`. It uses the API provided by `op-supervisor` to perform actions like: * Updating and retrieving various safety levels * Checking and returning the `cross-unsafe` head for a given chain From afb3125a336705ebc142ed47ecdd8158beb458fd Mon Sep 17 00:00:00 2001 From: cpengilly <29023967+cpengilly@users.noreply.github.com> Date: Wed, 30 Oct 2024 11:21:56 -0700 Subject: [PATCH 353/565] updates --- pages/stack/interop/op-supervisor.mdx | 11 +++++------ words.txt | 8 +++++--- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/pages/stack/interop/op-supervisor.mdx b/pages/stack/interop/op-supervisor.mdx index 832cb27d1..0b958af2f 100644 --- a/pages/stack/interop/op-supervisor.mdx +++ b/pages/stack/interop/op-supervisor.mdx @@ -22,7 +22,7 @@ Some features and benefits include: ## Cross-chain message verification -Verifies messages between different chains in the OP Stack, reducing the risk of invalid or malicious cross-chain interactions.⁠ It centralizes the verification process, which reduces the complexity of operating individual nodes⁠.⁠ +OP Supervisor verifies messages between different chains in the OP Stack, reducing the risk of invalid or malicious cross-chain interactions.⁠ It centralizes the verification process, which reduces the complexity of operating individual nodes⁠.⁠ * `op-geth`: queries `op-supervisor` during block-building to verify if a message is sufficiently safe to include. This process involves checking each executing message and potentially undoing transactions if conflicts or unknown states are encountered. * `op-node`: queries cross-chain safety information and coordinates safety updates between OP stack nodes and `op-supervisor`. It uses the API provided by `op-supervisor` to perform actions like: @@ -33,7 +33,7 @@ Verifies messages between different chains in the OP Stack, reducing the risk of ## Log data indexing and management -Acts as a hub for indexing data that every `op-node` needs to cross-verify with other chains, centralizing the process of managing interoperability data. Maintains the integrity of cross-chain interactions by tracking safety changes⁠ across the Superchain, ensuring consistent application of invalid dependency resolutions. ⁠ +OP Supervisor acts as a hub for indexing data that every `op-node` needs to cross-verify with other chains, centralizing the process of managing interoperability data. Maintains the integrity of cross-chain interactions by tracking safety changes⁠ across the Superchain, ensuring consistent application of invalid dependency resolutions. ⁠ `op-supervisor` indexes two types of cross-chain dependencies: @@ -42,7 +42,7 @@ Acts as a hub for indexing data that every `op-node` needs to cross-verify with ## API for cross-chain safety -Provides an interface for `op-node` to query cross-chain safety information and coordinate safety updates between OP stack nodes and `op-supervisor⁠⁠`. OP-Supervisor uses a global read API to determine **message safety** and **block safety,** utilizing both the events index and the safety index (See op-supervisor's [safe data indexing](#safe-data-indexing-and-management)). The API is designed to handle potential L1 reorgs that can affect the validity of cross-chain messages⁠. +OP Supervisor provides an interface for `op-node` to query cross-chain safety information and coordinate safety updates between OP stack nodes and `op-supervisor⁠⁠`. OP-Supervisor uses a global read API to determine **message safety** and **block safety,** utilizing both the events index and the safety index (See op-supervisor's [safe data indexing](#safe-data-indexing-and-management)). The API is designed to handle potential L1 reorgs that can affect the validity of cross-chain messages⁠. Key API methods include: @@ -53,17 +53,16 @@ Key API methods include: | `UpdateLocalSafe` and `UpdateLocalUnsafe` | Tells the Supervisor when the Node's heads change | | `Finalized` | Returns the Finalized Head | | `UpdateFinalizedL1` | Signals to the Supervisor new finality signals | -| `CheckMessage` | Checks logs in the DB directly in tests, can also use `CheckMessages` in geth | +| `CheckMessage` | Checks logs in the DB directly in tests | For a full listing of API names, see the [`op-supervisor` client](https://github.com/ethereum-optimism/optimism/blob/develop/op-service/sources/supervisor_client.go). ## RPC access to all chains -The `op-supervisor` requires RPC access to all chains in the dependency set. This allows `op-supervisor` to verify cross-chain messages and sync data across multiple networks simultaneously, such as OP Mainnet and Base nodes using the same instance. +OP Supervisor requires RPC access to all chains in the dependency set. This allows `op-supervisor` to verify cross-chain messages and sync data across multiple networks simultaneously, such as OP Mainnet and Base nodes using the same instance. Benefits of this approach: -* Cost-effective: Running `op-supervisor` is cheaper than running a full node for each chain in the dependency set. * Scalability: As the number of chains in the Superchain grows, `op-supervisor` can handle the increasing complexity of cross-chain interactions. * Improved reliability: It enables a more redundant setup, which is good for stability in the growing ecosystem. diff --git a/words.txt b/words.txt index 5ce846b7a..5be79af1c 100644 --- a/words.txt +++ b/words.txt @@ -1,5 +1,5 @@ -accountqueue ACCOUNTQUEUE +accountqueue ACCOUNTSLOTS accountslots ADDI @@ -29,8 +29,8 @@ BLOBPOOL blobpool blobspace blockhash -BLOCKLOGS blocklists +BLOCKLOGS blocklogs BLOCKPROFILERATE blockprofilerate @@ -326,7 +326,9 @@ safedb Schnorr secp SELFDESTRUCT +SEPOLIA Sepolia +sepolia seqnr SEQUENCERHTTP sequencerhttp @@ -404,4 +406,4 @@ xtensibility ZKPs ZKVM Zora -zora \ No newline at end of file +zora From fdb6866a1b0b5a3df1f20e4faba445446e9a8339 Mon Sep 17 00:00:00 2001 From: cpengilly <29023967+cpengilly@users.noreply.github.com> Date: Wed, 30 Oct 2024 11:28:27 -0700 Subject: [PATCH 354/565] fix internal link --- pages/stack/interop/op-supervisor.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/stack/interop/op-supervisor.mdx b/pages/stack/interop/op-supervisor.mdx index 0b958af2f..7dba942ce 100644 --- a/pages/stack/interop/op-supervisor.mdx +++ b/pages/stack/interop/op-supervisor.mdx @@ -42,7 +42,7 @@ OP Supervisor acts as a hub for indexing data that every `op-node` needs to cros ## API for cross-chain safety -OP Supervisor provides an interface for `op-node` to query cross-chain safety information and coordinate safety updates between OP stack nodes and `op-supervisor⁠⁠`. OP-Supervisor uses a global read API to determine **message safety** and **block safety,** utilizing both the events index and the safety index (See op-supervisor's [safe data indexing](#safe-data-indexing-and-management)). The API is designed to handle potential L1 reorgs that can affect the validity of cross-chain messages⁠. +OP Supervisor provides an interface for `op-node` to query cross-chain safety information and coordinate safety updates between OP stack nodes and `op-supervisor⁠⁠`. OP-Supervisor uses a global read API to determine **message safety** and **block safety,** utilizing both the events index and the safety index (See op-supervisor's [log data indexing](#log-data-indexing-and-management)). The API is designed to handle potential L1 reorgs that can affect the validity of cross-chain messages⁠. Key API methods include: From 5493b773a9dc212a39eb488732e1f519f8467d6d Mon Sep 17 00:00:00 2001 From: Bradley Camacho <42678939+bradleycamacho@users.noreply.github.com> Date: Wed, 30 Oct 2024 14:18:58 -0700 Subject: [PATCH 355/565] Draft Deploy assets using SuperchainERC20 --- .../interop/deploy-superchain-erc20.mdx.mdx | 89 +++++++++++++++++++ 1 file changed, 89 insertions(+) create mode 100644 pages/stack/interop/deploy-superchain-erc20.mdx.mdx diff --git a/pages/stack/interop/deploy-superchain-erc20.mdx.mdx b/pages/stack/interop/deploy-superchain-erc20.mdx.mdx new file mode 100644 index 000000000..e7aedcab9 --- /dev/null +++ b/pages/stack/interop/deploy-superchain-erc20.mdx.mdx @@ -0,0 +1,89 @@ +--- +title: Deploy assets using SuperchainERC20 +lang: en-US +description: Learn about the basic details of deploying assets on SuperchainERC20 +--- + +import { Callout } from 'nextra/components' + +# Issuing new assets with SuperchainERC20 + +## Overview + +This guide explains how to issue new assets with the `SuperchainERC20` standard and bridge them effectively using the `SuperchainERC20Bridge`. If you want more information about the `SuperchainERC20 standard`, see our [`SuperchainERC20` standard explainer](/stack/interop/superchain-erc20) + +An important thing to note, is that bridging assets through the Superchain using SuperchainERC20 never affects the supply of your asset. Supply is always fixed; bridging and moving your asset across the superchain only affects which chain its located on. + + +## Steps to issue and bridge assets + + +### Deploy the `SuperchainERC20` Token Contract + +To ensure fungibility across chains, the SuperchainERC20 assets need to have the same contract address on all chains. Achieving this requires deterministic deployment methods, such as: + +`Create2Deployer`: A smart contract that enables deploying contracts with predictable addresses. +`OptimismSuperchainERC20Factory`: A factory contract designed for L1-native tokens to ensure uniform deployments across chains. + +There are [many ways to do this](https://github.com/Arachnid/deterministic-deployment-proxy), but here's an example smart contract to start: + +```solidity +// Example token deployment using Create2Deployer +bytes32 salt = keccak256(abi.encodePacked("SuperchainToken")); +address tokenAddress = Create2Deployer.deploy(salt, bytecode, constructorArgs); +``` + +By deploying assets at identical addresses across multiple chains, we abstract away the complexity of cross-chain validation. + +### Implement the ICrosschainERC20 interface + +Ensure that your token contract conforms to the ICrosschainERC20 interface to support cross-chain minting and burning. + +```solidity +interface ICrosschainERC20 { + function crosschainMint(address _account, uint256 _amount) external; /// Mints _amount of token to address _account. + function crosschainBurn(address _account, uint256 _amount) external; /// Burns _amount of token from address _account. + + event CrosschainMint(address indexed _to, uint256 _amount); /// MUST trigger when crosschainMint is called + event CrosschainBurn(address indexed _from, uint256 _amount); /// MUST trigger when crosschainBurn is called +} +``` + +### Use the `SuperchainERC20Bridge` for cross-chain transfers + +The `SuperchainERC20Bridge` relies on the `L2ToL2CrossDomainMessenger` to securely relay messages between chains and provide replay protection, domain binding and access to additional message information. + +We'll use two function for bridging: + +* `sendERC20`: initializes a cross-chain transfer of a `SuperchainERC20` by burning the tokens locally and sending a message to the `SuperchainERC20Bridge` on the target chain using the `L2toL2CrossDomainMessenger`. This ensures that asset supply never changes; sending an asset moves it from one chain to another, it does not "create" an additional asset in regards to supply. +* `relayERC20`: process incoming messages from the L2toL2CrossDomainMessenger and mints the corresponding amount of the SuperchainERC20. + +Here's an example implementation of the `SuperchainERC20Bridge` + +```solidity +function sendERC20(SuperchainERC20 _token, address _to, uint256 _amount, uint256 _chainId) external returns (bytes32 msgHash_) { + _token.crosschainBurn(msg.sender, _amount); + + bytes memory _message = abi.encodeCall(this.relayERC20, (_token, msg.sender, _to, _amount)); + + msgHash_ = L2ToL2CrossDomainMessenger.sendMessage(_chainId, address(this), _message); + + emit SentERC20(address(_token), msg.sender, _to, _amount, _chainId); +} + +function relayERC20(SuperchainERC20 _token, address _from, address _to, uint256 _amount) external { + require(msg.sender == address(L2ToL2CrossChainMessenger)); + require(L2ToL2CrossChainMessenger.crossDomainMessageSender() == address(this)); + + uint256 _source = L2ToL2CrossChainMessenger.crossDomainMessageSource(); + + _token.crosschainMint(_to, _amount); + + emit RelayedERC20(address(_token), _from, _to, _amount, _source); +} +``` + +## Next steps +* Explore the [SuperchainERC20 specifications](https://specs.optimism.io/interop/token-bridging.html) for in-depth implementation details. +* Watch the [Superchain interop design video walkthrough](https://www.youtube.com/watch?v=FKc5RgjtGes) for a visual explanation of the concepts. +* Review the [Superchain Interop Explainer](explainer) for answers to common questions about interoperability. From d7e9154334d947af76f3056acb6d3497379a32ce Mon Sep 17 00:00:00 2001 From: Bradley Camacho <42678939+bradleycamacho@users.noreply.github.com> Date: Wed, 30 Oct 2024 14:24:06 -0700 Subject: [PATCH 356/565] Nav and various fixes --- pages/stack/interop/_meta.json | 3 ++- ...ain-erc20.mdx.mdx => deploy-superchain-erc20.mdx} | 12 ++++++++---- pages/stack/interop/superchain-erc20.mdx | 2 ++ 3 files changed, 12 insertions(+), 5 deletions(-) rename pages/stack/interop/{deploy-superchain-erc20.mdx.mdx => deploy-superchain-erc20.mdx} (87%) diff --git a/pages/stack/interop/_meta.json b/pages/stack/interop/_meta.json index 304ddf4a7..8af79e2c9 100644 --- a/pages/stack/interop/_meta.json +++ b/pages/stack/interop/_meta.json @@ -2,5 +2,6 @@ "explainer": "Interop explainer", "cross-chain-message": "Anatomy of cross-chain message", "supersim": "Supersim Multichain Development Environment", - "superchain-erc20": "SuperchainERC20" + "superchain-erc20": "SuperchainERC20", + "deploy-superchain-erc20": "Deploy assets using SuperchainERC20" } \ No newline at end of file diff --git a/pages/stack/interop/deploy-superchain-erc20.mdx.mdx b/pages/stack/interop/deploy-superchain-erc20.mdx similarity index 87% rename from pages/stack/interop/deploy-superchain-erc20.mdx.mdx rename to pages/stack/interop/deploy-superchain-erc20.mdx index e7aedcab9..9f373d471 100644 --- a/pages/stack/interop/deploy-superchain-erc20.mdx.mdx +++ b/pages/stack/interop/deploy-superchain-erc20.mdx @@ -5,10 +5,13 @@ description: Learn about the basic details of deploying assets on SuperchainERC2 --- import { Callout } from 'nextra/components' +import { Steps } from 'nextra/components' # Issuing new assets with SuperchainERC20 -## Overview + + Interop is currently in active development and not yet ready for production use. The information provided here may change. Check back regularly for the most up-to-date information. + This guide explains how to issue new assets with the `SuperchainERC20` standard and bridge them effectively using the `SuperchainERC20Bridge`. If you want more information about the `SuperchainERC20 standard`, see our [`SuperchainERC20` standard explainer](/stack/interop/superchain-erc20) @@ -22,8 +25,8 @@ An important thing to note, is that bridging assets through the Superchain using To ensure fungibility across chains, the SuperchainERC20 assets need to have the same contract address on all chains. Achieving this requires deterministic deployment methods, such as: -`Create2Deployer`: A smart contract that enables deploying contracts with predictable addresses. -`OptimismSuperchainERC20Factory`: A factory contract designed for L1-native tokens to ensure uniform deployments across chains. +* `Create2Deployer`: A smart contract that enables deploying contracts with predictable addresses. +* `OptimismSuperchainERC20Factory`: A factory contract designed for L1-native tokens to ensure uniform deployments across chains. There are [many ways to do this](https://github.com/Arachnid/deterministic-deployment-proxy), but here's an example smart contract to start: @@ -37,7 +40,7 @@ By deploying assets at identical addresses across multiple chains, we abstract a ### Implement the ICrosschainERC20 interface -Ensure that your token contract conforms to the ICrosschainERC20 interface to support cross-chain minting and burning. +Ensure that your token contract conforms to the `ICrosschainERC20` interface to support cross-chain minting and burning. ```solidity interface ICrosschainERC20 { @@ -82,6 +85,7 @@ function relayERC20(SuperchainERC20 _token, address _from, address _to, uint256 emit RelayedERC20(address(_token), _from, _to, _amount, _source); } ``` + ## Next steps * Explore the [SuperchainERC20 specifications](https://specs.optimism.io/interop/token-bridging.html) for in-depth implementation details. diff --git a/pages/stack/interop/superchain-erc20.mdx b/pages/stack/interop/superchain-erc20.mdx index 6542f6ae5..4959e9525 100644 --- a/pages/stack/interop/superchain-erc20.mdx +++ b/pages/stack/interop/superchain-erc20.mdx @@ -79,6 +79,8 @@ Application developers must do two things to make their tokens `SuperchainERC20` For now, application developers should view `SuperchainERC20`as ERC20 tokens with additional built-in functions that allow cross-chain asset movement that will be enabled once Interop goes live. +For step-by-step information on implementing SuperchainERC20, see [Deploy assets using SuperchainERC20](/stack/interop/deploy-superchain-erc20) + To enable asset interoperability, `SuperchainERC20` must give access to the address where the future `SuperchainERC20Bridge` will live. From db9b8e3838aa0bb013724245a3372897a817da7b Mon Sep 17 00:00:00 2001 From: Bradley Camacho <42678939+bradleycamacho@users.noreply.github.com> Date: Wed, 30 Oct 2024 14:41:29 -0700 Subject: [PATCH 357/565] Clarify supply considerations --- pages/stack/interop/superchain-erc20.mdx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pages/stack/interop/superchain-erc20.mdx b/pages/stack/interop/superchain-erc20.mdx index 6542f6ae5..52c079e16 100644 --- a/pages/stack/interop/superchain-erc20.mdx +++ b/pages/stack/interop/superchain-erc20.mdx @@ -28,6 +28,8 @@ Additional features: * **Token Burning**: Initiating message where token is **burned** on the source chain. A user initiates a transfer of token from one blockchain to another and specifies the recipient wallet address on the destination chain. A specified amount of token is burned on the source chain. * **Token Minting**: Executing message where token is **minted** on the destination chain. The specified amount of token is minted on the destination chain directly to the recipient wallet address. +An important thing to note is using `crosschainBurn` and `crosschainMint` on the `SuperchainERC20` to move your asset across the Superchain only affects which chain your asset is located on and does not change the overall supply of the token. This keeps the token’s total amount the same across all networks, ensuring its value stays stable during the move and that the `SuperchainERC20` retains a unified, global supply count. + ```mermaid sequenceDiagram box rgba(255, 4, 32, 0.1) ChainA From 79a3924b29f2d9ffc0bd68b1349aa638b5879064 Mon Sep 17 00:00:00 2001 From: Bradley Camacho <42678939+bradleycamacho@users.noreply.github.com> Date: Wed, 30 Oct 2024 14:42:38 -0700 Subject: [PATCH 358/565] Clarift supply considerations --- pages/stack/interop/deploy-superchain-erc20.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/stack/interop/deploy-superchain-erc20.mdx b/pages/stack/interop/deploy-superchain-erc20.mdx index 9f373d471..9c79577a0 100644 --- a/pages/stack/interop/deploy-superchain-erc20.mdx +++ b/pages/stack/interop/deploy-superchain-erc20.mdx @@ -15,7 +15,7 @@ import { Steps } from 'nextra/components' This guide explains how to issue new assets with the `SuperchainERC20` standard and bridge them effectively using the `SuperchainERC20Bridge`. If you want more information about the `SuperchainERC20 standard`, see our [`SuperchainERC20` standard explainer](/stack/interop/superchain-erc20) -An important thing to note, is that bridging assets through the Superchain using SuperchainERC20 never affects the supply of your asset. Supply is always fixed; bridging and moving your asset across the superchain only affects which chain its located on. +An important thing to note is using `crosschainBurn` and `crosschainMint` on the `SuperchainERC20` to move your asset across the Superchain only affects which chain your asset is located on and does not change the overall supply of the token. This keeps the token’s total amount the same across all networks, ensuring its value stays stable during the move and that the `SuperchainERC20` retains a unified, global supply count. ## Steps to issue and bridge assets From d653ee1765e05f7683c3b6eb74e404c252d65a5d Mon Sep 17 00:00:00 2001 From: cpengilly <29023967+cpengilly@users.noreply.github.com> Date: Wed, 30 Oct 2024 16:58:55 -0700 Subject: [PATCH 359/565] address comments --- pages/stack/interop/superchain-weth.mdx | 23 ++++++++++++----------- words.txt | 9 ++++++--- 2 files changed, 18 insertions(+), 14 deletions(-) diff --git a/pages/stack/interop/superchain-weth.mdx b/pages/stack/interop/superchain-weth.mdx index f2547d687..544198cb2 100644 --- a/pages/stack/interop/superchain-weth.mdx +++ b/pages/stack/interop/superchain-weth.mdx @@ -1,7 +1,7 @@ --- title: SuperchainWETH (Interoperable ETH) lang: en-US -description: Learn basic details about the SuperchainWETH or Interoperable ETH. +description: Learn basic details about SuperchainWETH or Interoperable ETH. --- import { Callout } from 'nextra/components' @@ -17,22 +17,23 @@ Superchain WETH or Interoperable ETH is a specialized version of the standard WE ## Features and benefits * Enables seamless ETH transfers across different chains in the Superchain -* Minimizes protocol complexity by treating ETH as an ERC-20 token * Maintains fungibility of ETH across the Superchain * Provides liquidity for cross-chain transactions -* Supports interoperability between chains with different native assets (i.e., gas tokens) * Improves user experience by abstracting complex bridging processes - - `SuperchainWETH` requires `SuperchainTokenBridge` integration for full interoperable, cross-chain functionality. - - ## How it works -Interoperable ETH (Superchain WETH) facilitates secure movement of ETH across the Superchain via `crosschainBurn` and `crosschainMint`. +Superchain WETH (Interoperable ETH) facilitates secure movement of ETH across the Superchain via `crosschainBurn` and `crosschainMint`. -* **`crosschainBurn`**: Facilitates cross-chain transfers by **burning** WETH. The user sends ETH to the `SuperchainWETH` contract. `SuperchainWETH` interacts with `ETHLiquidity` to burn the ETH and sends a cross-chain message via the `L2ToL2CrossDomainMessenger` to the destination chain. -* **`crosschainMint`**: Mints WETH on the destination chain after a cross-chain transfer. The user receives ETH or WETH on the destination chain. If the destination is a non-custom gas token chain, ETH is sourced from the `ETHLiquidity` contract. +* **`crosschainBurn`**: Facilitates cross-chain transfers by **burning** WETH. The cross-chain message is created using the `SendERC20` function on `SuperchainTokenBridge`. + * In the deposit step, the user sends their ETH to the `SuperchainWETH` contract, which calls the deposit function on `SuperchainWETH`. This results in the user being given the amount of `SuperchainWETH` equivalent to the amount of ETH they sent (this step is also known as "wrapping" your ETH). + * After depositing, the user can call `SuperchainTokenBridge#SendERC20` to transfer any amount of `SuperchainWETH` (within their SuperchainWETH balance) to a recipient on the destination chain. + * In `SendERC20`, the `SuperchainTokenBridge` calls `crosschainBurn` and sends a cross-chain message via the `L2ToL2CrossDomainMessenger` to the destination chain. +* **`crosschainMint`**: Mints WETH on the destination chain after a cross-chain transfer. User first receives WETH then will need to unwrap to standard ETH through a manual call or more automatically using a wrapper contract. After the cross-chain message is processed on the destination chain, `crosschainMint` is called which provides the recipient with `SuperchainWETH` on the destination chain. If the destination is a non-custom gas token chain, ETH is sourced from the `ETHLiquidity` contract. + + + `crosschainBurn` and `crosschainMint`can only be called by the `SuperchainTokenBridge`. + ```mermaid sequenceDiagram @@ -62,7 +63,7 @@ This contract implements the core functionality for wrapping, unwrapping, and cr ### `ETHLiquidity` Contract -A predeploy contract with a large pool of ETH that provides liquidity for cross-chain transfers. It allows "burning" and "minting" of ETH for cross-chain transfers. +A predeploy contract with a large pool of ETH that provides liquidity for cross-chain transfers. It allows "burning" and "minting" of ETH for cross-chain transfers. ETH is associated with bridge ETH from the L1 lockbox, making ETH available to interop chains through a shared lockbox rather than fragemented amongst the existing portal contracts. * Contract address: `0x4200000000000000000000000000000000000025` ### `L2ToL2CrossDomainMessenger` Contract diff --git a/words.txt b/words.txt index 5ce846b7a..b395973a2 100644 --- a/words.txt +++ b/words.txt @@ -1,5 +1,5 @@ -accountqueue ACCOUNTQUEUE +accountqueue ACCOUNTSLOTS accountslots ADDI @@ -29,8 +29,8 @@ BLOBPOOL blobpool blobspace blockhash -BLOCKLOGS blocklists +BLOCKLOGS blocklogs BLOCKPROFILERATE blockprofilerate @@ -118,6 +118,7 @@ forkable forkchoice FPVM FPVMs +fragemented Fraxtal Funct gameplay @@ -326,7 +327,9 @@ safedb Schnorr secp SELFDESTRUCT +SEPOLIA Sepolia +sepolia seqnr SEQUENCERHTTP sequencerhttp @@ -404,4 +407,4 @@ xtensibility ZKPs ZKVM Zora -zora \ No newline at end of file +zora From 9cffc2e6ef87adef9cf2928fb59dd14daae47023 Mon Sep 17 00:00:00 2001 From: cpengilly <29023967+cpengilly@users.noreply.github.com> Date: Wed, 30 Oct 2024 18:05:43 -0700 Subject: [PATCH 360/565] Update superchain-weth.mdx --- pages/stack/interop/superchain-weth.mdx | 32 ++++++------------------- 1 file changed, 7 insertions(+), 25 deletions(-) diff --git a/pages/stack/interop/superchain-weth.mdx b/pages/stack/interop/superchain-weth.mdx index 544198cb2..ee437c326 100644 --- a/pages/stack/interop/superchain-weth.mdx +++ b/pages/stack/interop/superchain-weth.mdx @@ -23,37 +23,19 @@ Superchain WETH or Interoperable ETH is a specialized version of the standard WE ## How it works -Superchain WETH (Interoperable ETH) facilitates secure movement of ETH across the Superchain via `crosschainBurn` and `crosschainMint`. +Currently, L2-to-L2 ETH transfers between two interoperable chains require four separate transactions: -* **`crosschainBurn`**: Facilitates cross-chain transfers by **burning** WETH. The cross-chain message is created using the `SendERC20` function on `SuperchainTokenBridge`. - * In the deposit step, the user sends their ETH to the `SuperchainWETH` contract, which calls the deposit function on `SuperchainWETH`. This results in the user being given the amount of `SuperchainWETH` equivalent to the amount of ETH they sent (this step is also known as "wrapping" your ETH). - * After depositing, the user can call `SuperchainTokenBridge#SendERC20` to transfer any amount of `SuperchainWETH` (within their SuperchainWETH balance) to a recipient on the destination chain. - * In `SendERC20`, the `SuperchainTokenBridge` calls `crosschainBurn` and sends a cross-chain message via the `L2ToL2CrossDomainMessenger` to the destination chain. -* **`crosschainMint`**: Mints WETH on the destination chain after a cross-chain transfer. User first receives WETH then will need to unwrap to standard ETH through a manual call or more automatically using a wrapper contract. After the cross-chain message is processed on the destination chain, `crosschainMint` is called which provides the recipient with `SuperchainWETH` on the destination chain. If the destination is a non-custom gas token chain, ETH is sourced from the `ETHLiquidity` contract. +1. Wrap `ETH` to `SuperchainWETH`. +2. Call `SuperchainTokenBridge#SendERC20` to burn `SuperchainWETH` on source chain and relay a message to the destination chain that mints `SuperchainWETH` to the recipient (`crosschainBurn` is used). +3. Execute the message on the destination chain, triggering `SuperchainTokenBridge#RelayERC20` to mint `SuperchainWETH` to the recipient (`crosschainMint` is used). If the destination is a non-custom gas token chain, ETH is sourced from the `ETHLiquidity` contract. +4. Unwrap the received `SuperchainWETH` to `ETH`. + +Abstraction is a possible future consideration to reduce this process to two transactions, which can be followed in the [design docs](https://github.com/ethereum-optimism/design-docs/pull/146/files). `crosschainBurn` and `crosschainMint`can only be called by the `SuperchainTokenBridge`. -```mermaid -sequenceDiagram - participant User - participant SuperchainWETH - participant ETHLiquidity - participant L2ToL2CrossDomainMessenger - participant DestinationChain - - User->>SuperchainWETH: Send ETH - SuperchainWETH->>ETHLiquidity: Burn ETH - SuperchainWETH->>L2ToL2CrossDomainMessenger: Send cross-chain message - L2ToL2CrossDomainMessenger->>DestinationChain: Relay message - DestinationChain->>SuperchainWETH: Call relayETH/relayERC20 - SuperchainWETH->>ETHLiquidity: Source ETH (if non-custom gas token chain) - SuperchainWETH->>User: Receive ETH/WETH on destination chain -``` - -This diagram illustrates the process where the user sends ETH to the `SuperchainWETH` contract which burns the ETH and sends a cross-chain message to the destination chain, enabling seamless cross-chain ETH transfers without the need for asset wrapping. - ## Major components ### `SuperchainWETH` Contract From 2370c7d8adc8be5269ace229b58a97269af87dba Mon Sep 17 00:00:00 2001 From: cpengilly <29023967+cpengilly@users.noreply.github.com> Date: Wed, 30 Oct 2024 18:12:45 -0700 Subject: [PATCH 361/565] Update superchain-weth.mdx --- pages/stack/interop/superchain-weth.mdx | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/pages/stack/interop/superchain-weth.mdx b/pages/stack/interop/superchain-weth.mdx index ee437c326..8d1e7a680 100644 --- a/pages/stack/interop/superchain-weth.mdx +++ b/pages/stack/interop/superchain-weth.mdx @@ -25,10 +25,10 @@ Superchain WETH or Interoperable ETH is a specialized version of the standard WE Currently, L2-to-L2 ETH transfers between two interoperable chains require four separate transactions: -1. Wrap `ETH` to `SuperchainWETH`. -2. Call `SuperchainTokenBridge#SendERC20` to burn `SuperchainWETH` on source chain and relay a message to the destination chain that mints `SuperchainWETH` to the recipient (`crosschainBurn` is used). -3. Execute the message on the destination chain, triggering `SuperchainTokenBridge#RelayERC20` to mint `SuperchainWETH` to the recipient (`crosschainMint` is used). If the destination is a non-custom gas token chain, ETH is sourced from the `ETHLiquidity` contract. -4. Unwrap the received `SuperchainWETH` to `ETH`. +1. Wrap `ETH` to `SuperchainWETH`. +2. Call `SuperchainTokenBridge#SendERC20` to burn `SuperchainWETH` on source chain and relay a message to the destination chain that mints `SuperchainWETH` to the recipient (`crosschainBurn` is used). +3. Execute the message on the destination chain, triggering `SuperchainTokenBridge#RelayERC20` to mint `SuperchainWETH` to the recipient (`crosschainMint` is used). If the destination is a non-custom gas token chain, ETH is sourced from the `ETHLiquidity` contract. +4. Unwrap the received `SuperchainWETH` to `ETH`. Abstraction is a possible future consideration to reduce this process to two transactions, which can be followed in the [design docs](https://github.com/ethereum-optimism/design-docs/pull/146/files). @@ -40,17 +40,20 @@ Abstraction is a possible future consideration to reduce this process to two tra ### `SuperchainWETH` Contract -This contract implements the core functionality for wrapping, unwrapping, and cross-chain transfer of ETH. It integrates with the `SuperchainTokenBridge` for interoperable actions. +This contract implements the core functionality for wrapping, unwrapping, and cross-chain transfer of ETH. It integrates with the `SuperchainTokenBridge` for interoperable actions. + * Contract address: `0x4200000000000000000000000000000000000024` ### `ETHLiquidity` Contract A predeploy contract with a large pool of ETH that provides liquidity for cross-chain transfers. It allows "burning" and "minting" of ETH for cross-chain transfers. ETH is associated with bridge ETH from the L1 lockbox, making ETH available to interop chains through a shared lockbox rather than fragemented amongst the existing portal contracts. + * Contract address: `0x4200000000000000000000000000000000000025` ### `L2ToL2CrossDomainMessenger` Contract -This predeploy contract facilitates general message passing between different chains in the Superchain. It also securely transfers ERC20 tokens between L2 chains. +This predeploy contract facilitates general message passing between different chains in the Superchain. It also securely transfers ERC20 tokens between L2 chains. + * Contract address: `0x4200000000000000000000000000000000000023` From fb499632985c4f5163d2908323ed03d7eff934b5 Mon Sep 17 00:00:00 2001 From: cpengilly <29023967+cpengilly@users.noreply.github.com> Date: Wed, 30 Oct 2024 18:31:50 -0700 Subject: [PATCH 362/565] Update superchain-weth.mdx --- pages/stack/interop/superchain-weth.mdx | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/pages/stack/interop/superchain-weth.mdx b/pages/stack/interop/superchain-weth.mdx index 8d1e7a680..abeb86e0e 100644 --- a/pages/stack/interop/superchain-weth.mdx +++ b/pages/stack/interop/superchain-weth.mdx @@ -30,7 +30,23 @@ Currently, L2-to-L2 ETH transfers between two interoperable chains require four 3. Execute the message on the destination chain, triggering `SuperchainTokenBridge#RelayERC20` to mint `SuperchainWETH` to the recipient (`crosschainMint` is used). If the destination is a non-custom gas token chain, ETH is sourced from the `ETHLiquidity` contract. 4. Unwrap the received `SuperchainWETH` to `ETH`. + Abstraction is a possible future consideration to reduce this process to two transactions, which can be followed in the [design docs](https://github.com/ethereum-optimism/design-docs/pull/146/files). + + +```mermaid +sequenceDiagram + participant User + participant Source Chain + participant Cross-Chain Messenger + participant Destination Chain + + User->>Source Chain: 1. Wrap ETH to SuperchainWETH + Source Chain->>Cross-Chain Messenger: 2. Burn SuperchainWETH and relay message + Cross-Chain Messenger->>Destination Chain: 3. Mint SuperchainWETH to recipient + User->>Destination Chain: 4. Unwrap SuperchainWETH to ETH +``` +_Figure 1: Superchain WETH Transfer Process between two interoperable L2 chains._ `crosschainBurn` and `crosschainMint`can only be called by the `SuperchainTokenBridge`. From 46c29ad6d6206bd0f89863ee58493f44ce6c51ee Mon Sep 17 00:00:00 2001 From: Kezia Date: Thu, 31 Oct 2024 16:58:12 +0700 Subject: [PATCH 363/565] Update rpc-providers.mdx Added Blockdaemon to the RPC & Node providers list. --- pages/builders/tools/connect/rpc-providers.mdx | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/pages/builders/tools/connect/rpc-providers.mdx b/pages/builders/tools/connect/rpc-providers.mdx index e896b1a4e..6517876a8 100644 --- a/pages/builders/tools/connect/rpc-providers.mdx +++ b/pages/builders/tools/connect/rpc-providers.mdx @@ -38,6 +38,18 @@ Moreover, Ankr offers access to developer tooling on OP Mainnet (and testnets) l * OP Mainnet * OP Sepolia +## Blockdaemon + +### Description and pricing + +Blockdaemon provides institutional-grade blockchain infrastructure, including node, staking, and API solutions, with premium RPC services optimized for [Optimism](https://docs.blockdaemon.com/reference/how-to-access-optimism-api). With free and enhanced options, Blockdaemon’s RPC API allows developers to securely interact with on-chain data, broadcast transactions, and build dApps with minimal setup, offering streamlined access to enriched blockchain data and 99.9% uptime reliability to meet diverse needs. + +[Sign up for a free Blockdaemon account here](https://app.blockdaemon.com/signin/register) + +### Supported networks + +* OP Mainnet + ## Chainstack ### Description and pricing From 393bda8113f4269e270dd1ffeb35a012fa259d1e Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Thu, 31 Oct 2024 13:28:18 +0100 Subject: [PATCH 364/565] Updated the SuperchainERC20 description --- pages/stack/interop/superchain-erc20.mdx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pages/stack/interop/superchain-erc20.mdx b/pages/stack/interop/superchain-erc20.mdx index 092af2cb4..e30d9cdb0 100644 --- a/pages/stack/interop/superchain-erc20.mdx +++ b/pages/stack/interop/superchain-erc20.mdx @@ -12,14 +12,14 @@ import { Callout } from 'nextra/components' Interop is currently in active development and not yet ready for production use. The information provided here may change. Check back regularly for the most up-to-date information. -`SuperchainERC20` is a token standard designed to enable asset interoperability in the Superchain. +`SuperchainERC20` is an implementation of [ERC-7802](https://ethereum-magicians.org/t/erc-xxxx-crosschain-token-interface/21508) designed to enable asset interoperability in the Superchain. Asset interoperability allows for tokens to securely move across chains without asset wrapping or liquidity pools for maximal capital efficiency, thus unifying liquidity and simplifying the user experience. Additional features: * **Simplified deployments**: Provides a consistent, unified standard for tokens across all Superchain-compatible networks and a common crosschain interface for the EVM ecosystem at large. * **Permissionless propagation**: Easily clone an existing token contract to a new OP Stack chain using `create2` without requiring the original owner, which enables movement of assets to the new chain once Interop goes live. Importantly, permissionless propagation retains the integrity of the original owner on the contract and preserves security but proliferates the contract's availability to new chains. -* **Ethereum-aligned**: Intentionally designed to be generic and supported as an Ethereum-wide standard (RIP coming soon). +* **Ethereum-aligned**: Implements ERC-7802, a unified interface that can be used across all of Ethereum to enable cross-chain mint/burn functionality. ## How it works @@ -63,7 +63,7 @@ This diagram illustrates the process where tokens are burned on the source chain `SuperchainERC20` differs from other token standards in its focus and implementation: -* `SuperchainERC20` has minimal differentiation from a standard ERC20 deployment, only requiring a minimal crosschain mint/burn interface, which aims to be a common pattern for the EVM ecosystem (RIP coming soon). +* `SuperchainERC20` implements ERC-7802, which provides a minimal crosschain mint/burn interface designed to be a common pattern for the EVM ecosystem. * `SuperchainERC20` shares trust assumptions across all chains in the Superchain, such that custom assumptions around security and latency are not required to account for when executing transfers. From 431328782b12aaa65a24521ebe72c627cac93ee2 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Thu, 31 Oct 2024 14:23:22 +0100 Subject: [PATCH 365/565] updated link --- pages/stack/interop/superchain-erc20.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/stack/interop/superchain-erc20.mdx b/pages/stack/interop/superchain-erc20.mdx index eed809dd0..ac6e45482 100644 --- a/pages/stack/interop/superchain-erc20.mdx +++ b/pages/stack/interop/superchain-erc20.mdx @@ -12,7 +12,7 @@ import { Callout } from 'nextra/components' Interop is currently in active development and not yet ready for production use. The information provided here may change. Check back regularly for the most up-to-date information. -`SuperchainERC20` is an implementation of [ERC-7802](https://ethereum-magicians.org/t/erc-xxxx-crosschain-token-interface/21508) designed to enable asset interoperability in the Superchain. +`SuperchainERC20` is an implementation of [ERC-7802](https://ethereum-magicians.org/t/erc-7802-crosschain-token-interface/21508) designed to enable asset interoperability in the Superchain. Asset interoperability allows for tokens to securely move across chains without asset wrapping or liquidity pools for maximal capital efficiency, thus unifying liquidity and simplifying the user experience. Additional features: From 9ec7d869ebcf2b2a81ef853855734b590c8958a5 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Thu, 31 Oct 2024 14:55:40 +0100 Subject: [PATCH 366/565] updated the content --- pages/stack/interop/superchain-erc20.mdx | 2 +- .../interop/transfer-superchainERC20.mdx | 113 ++++-------------- 2 files changed, 27 insertions(+), 88 deletions(-) diff --git a/pages/stack/interop/superchain-erc20.mdx b/pages/stack/interop/superchain-erc20.mdx index ac6e45482..3a9fc57a4 100644 --- a/pages/stack/interop/superchain-erc20.mdx +++ b/pages/stack/interop/superchain-erc20.mdx @@ -17,7 +17,7 @@ Asset interoperability allows for tokens to securely move across chains without Additional features: -* **Simplified deployments**: Provides a consistent, unified implementation for tokens across all Superchain-compatible networks and a common crosschain interface for the EVM ecosystem at large. +* **Simplified deployments**: 0-infrastructure cost to make your token cross-chain. Provides a consistent, unified implementation for tokens across all Superchain-compatible networks and a common cross-chain interface for the EVM ecosystem at large. * **Permissionless propagation**: Easily clone an existing token contract to a new OP Stack chain using `create2` without requiring the original owner, which enables movement of assets to the new chain once Interop goes live. Importantly, permissionless propagation retains the integrity of the original owner on the contract and preserves security but proliferates the contract's availability to new chains. * **Ethereum-aligned**: Implements ERC-7802, a unified interface that can be used across all of Ethereum to enable cross-chain mint/burn functionality. diff --git a/pages/stack/interop/transfer-superchainERC20.mdx b/pages/stack/interop/transfer-superchainERC20.mdx index a5ac331d2..1849040f9 100644 --- a/pages/stack/interop/transfer-superchainERC20.mdx +++ b/pages/stack/interop/transfer-superchainERC20.mdx @@ -8,113 +8,52 @@ import { Callout, Steps } from 'nextra/components' # How to transfer a SuperchainERC20 -This guide walks you through transferring SuperchainERC20 tokens between chains using the `L2ToL2CrossDomainMessenger` contract. - -## Prerequisites - -Before you begin, ensure you have: - -* Access to source and destination chain RPC endpoints. -* A private key with funds on both chains. -* The `cast` command-line tool installed. - - - All commands in this guide use the `cast` CLI tool. Make sure you have it properly configured with your RPC endpoints. + + Interop is currently in active development and not yet ready for production use. The information provided here may change. Check back regularly for the most up-to-date information. -## Contract addresses - -The following contracts are used in this guide: +This guide provides an overview of transferring SuperchainERC20 tokens between chains. For detailed technical steps and commands, see the [technical reference guide](https://supersim.pages.dev/guides/interop/manually-relaying-interop-messages-cast). -* L2NativeSuperchainERC20: `0x420beeF000000000000000000000000000000001` -* L2ToL2CrossDomainMessenger: `0x4200000000000000000000000000000000000023` +## Overview -## How it works +Transferring SuperchainERC20 tokens between chains involves two main phases: -Transferring tokens involves two main phases: - -1. **Source chain operations**: Mint tokens and initiate the transfer. -2. **Destination chain operations**: Relay the message to complete the transfer. +1. **Source Chain Operations** + - Mint tokens if needed + - Initiate the transfer using the bridge + +2. **Destination Chain Operations** + - Relay the transfer message + - Verify the transfer completion Always verify your addresses and amounts before sending transactions. Cross-chain transfers cannot be reversed. - - -### Step 1: Mint tokens - -First, mint tokens on the source chain: - -```bash -cast send 0x420beeF000000000000000000000000000000001 \ -"mint(address _to, uint256 _amount)" \ -YOUR_ADDRESS 1000 \ ---rpc-url SOURCE_CHAIN_RPC \ ---private-key YOUR_PRIVATE_KEY -``` - - - Replace `YOUR_ADDRESS`, `SOURCE_CHAIN_RPC`, and `YOUR_PRIVATE_KEY` with your actual values. - - -### Step 2: Initiate transfer - -After minting, initiate the bridge transfer: - -```bash -cast send 0x4200000000000000000000000000000000000028 \ -"sendERC20(address _token, address _to, uint256 _amount, uint256 _chainId)" \ -0x420beeF000000000000000000000000000000001 \ -RECIPIENT_ADDRESS 1000 DESTINATION_CHAIN_ID \ ---rpc-url SOURCE_CHAIN_RPC \ ---private-key YOUR_PRIVATE_KEY -``` - - - The transfer isn't complete until you relay the message on the destination chain. - +## How it works -### Step 3: Get message details + -Retrieve the message details from the L2ToL2CrossDomainMessenger: +### Step 1: Prepare your tokens -```bash -cast logs \ ---address 0x4200000000000000000000000000000000000023 \ ---rpc-url SOURCE_CHAIN_RPC -``` +First, ensure you have tokens on the source chain. You can mint new tokens if needed using the [L2NativeSuperchainERC20](https://github.com/ethereum-optimism/supersim/blob/main/contracts/src/L2NativeSuperchainERC20.sol) contract. - - Note down the `blockNumber`, `logIndex`, and timestamp - you'll need these for relaying. - +### Step 2: Initiate the transfer -### Step 4: Relay the message +Use the bridge contract to start the transfer process. This will lock or burn your tokens on the source chain. -Complete the transfer by relaying the message on the destination chain: +### Step 3: Complete the transfer -```bash -cast send 0x4200000000000000000000000000000000000023 \ ---gas-limit 200000 \ -"relayMessage((address, uint256, uint256, uint256, uint256), bytes)" \ -"(0x4200000000000000000000000000000000000023, BLOCK_NUMBER, LOG_INDEX, TIMESTAMP, SOURCE_CHAIN_ID)" \ -MESSAGE_PAYLOAD \ ---rpc-url DESTINATION_CHAIN_RPC \ ---private-key YOUR_PRIVATE_KEY -``` +Relay the transfer message on the destination chain to complete the process. This will mint or unlock your tokens. -### Step 5: Verify transfer +### Step 4: Verify completion -Check the balance on the destination chain: +Check your balance on the destination chain to confirm the transfer was successful. -```bash -cast balance \ ---erc20 0x420beeF000000000000000000000000000000001 \ -RECIPIENT_ADDRESS \ ---rpc-url DESTINATION_CHAIN_RPC -``` +For detailed technical instructions including contract addresses, specific commands, and message relaying details, refer to our [technical reference guide](https://supersim.pages.dev/guides/interop/manually-relaying-interop-messages-cast). + ## Alternative methods You can also use: @@ -124,5 +63,5 @@ You can also use: ## Next steps -* Read the [Superchain Interop Explainer](/stack/interop/explainer#faqs) or check out this [Superchain interop design video walk-thru](https://www.youtube.com/watch?v=FKc5RgjtGes). -* Use [Supersim](supersim), a local dev environment that simulates Superchain interop for testing applications against a local version of the Superchain. +* Read the [Superchain Interop Explainer](/stack/interop/explainer#faqs) or check out this [Superchain interop design video walk-thru](https://www.youtube.com/watch?v=FKc5RgjtGes) +* Use [Supersim](supersim), a local dev environment that simulates Superchain interop for testing applications against a local version of the Superchain \ No newline at end of file From 37cc2bc83820c03b37fff20ad2fa36157aa12545 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Thu, 31 Oct 2024 15:02:24 +0100 Subject: [PATCH 367/565] Added a mermaid diagram --- .../interop/transfer-superchainERC20.mdx | 79 +++++++++++++++---- 1 file changed, 63 insertions(+), 16 deletions(-) diff --git a/pages/stack/interop/transfer-superchainERC20.mdx b/pages/stack/interop/transfer-superchainERC20.mdx index 1849040f9..57e471ca6 100644 --- a/pages/stack/interop/transfer-superchainERC20.mdx +++ b/pages/stack/interop/transfer-superchainERC20.mdx @@ -18,13 +18,12 @@ This guide provides an overview of transferring SuperchainERC20 tokens between c Transferring SuperchainERC20 tokens between chains involves two main phases: -1. **Source Chain Operations** - - Mint tokens if needed - - Initiate the transfer using the bridge - -2. **Destination Chain Operations** - - Relay the transfer message - - Verify the transfer completion +1. **Source Chain Operations** + * Mint tokens if needed + * Initiate the transfer using the bridge +2. **Destination Chain Operations** + * Relay the transfer message + * Verify the transfer completion Always verify your addresses and amounts before sending transactions. Cross-chain transfers cannot be reversed. @@ -32,24 +31,72 @@ Transferring SuperchainERC20 tokens between chains involves two main phases: ## How it works +```mermaid +sequenceDiagram + actor User + participant SourceChain + participant Bridge as L2ToL2CrossDomainMessenger + participant DestChain + + Note over User,DestChain: Step 1: Prepare Tokens + User->>SourceChain: Check token balance + alt Needs tokens + User->>SourceChain: Mint or acquire tokens + end + + Note over User,DestChain: Step 2: Initiate Transfer + User->>SourceChain: Approve bridge contract + User->>Bridge: Call sendERC20 + Bridge->>SourceChain: Burn tokens + Bridge-->>Bridge: Emit transfer message + + Note over User,DestChain: Step 3: Complete Transfer + User->>Bridge: Get message details + User->>Bridge: Relay message on destination + Bridge->>DestChain: Mint tokens to recipient + + Note over User,DestChain: Step 4: Verify + User->>DestChain: Check token balance +``` + + ### Step 1: Prepare your tokens + + Ensure you have tokens on the source chain using one of these methods: + + * Use existing tokens you already own + * Mint new tokens using the [L2NativeSuperchainERC20](https://github.com/ethereum-optimism/supersim/blob/main/contracts/src/L2NativeSuperchainERC20.sol) contract if you have minting permissions + * Acquire tokens through a supported exchange or transfer + + ### Step 2: Initiate the transfer -### Step 1: Prepare your tokens + To start the transfer: -First, ensure you have tokens on the source chain. You can mint new tokens if needed using the [L2NativeSuperchainERC20](https://github.com/ethereum-optimism/supersim/blob/main/contracts/src/L2NativeSuperchainERC20.sol) contract. + 1. Choose the destination chain where you want to receive the tokens + 2. Specify the recipient address and the amount to transfer + 3. Call the bridge contract, which will: + * Lock or burn your tokens on the source chain + * Emit a message that will be used to mint tokens on the destination chain -### Step 2: Initiate the transfer + ### Step 3: Complete the transfer -Use the bridge contract to start the transfer process. This will lock or burn your tokens on the source chain. + To finalize the transfer on the destination chain: -### Step 3: Complete the transfer + 1. Get the message details from the source chain event + 2. Use the L2ToL2CrossDomainMessenger contract to relay the message + 3. The message relay will trigger the minting of tokens on the destination chain -Relay the transfer message on the destination chain to complete the process. This will mint or unlock your tokens. + + The transfer isn't complete until the message is successfully relayed on the destination chain. See the [technical reference guide](https://supersim.pages.dev/guides/interop/manually-relaying-interop-messages-cast) for specific relay instructions. + -### Step 4: Verify completion + ### Step 4: Verify completion -Check your balance on the destination chain to confirm the transfer was successful. + After relaying the message: + 1. Check your token balance on the destination chain + 2. Confirm the transferred amount matches what you sent + 3. The tokens should now be available for use on the destination chain For detailed technical instructions including contract addresses, specific commands, and message relaying details, refer to our [technical reference guide](https://supersim.pages.dev/guides/interop/manually-relaying-interop-messages-cast). @@ -64,4 +111,4 @@ You can also use: ## Next steps * Read the [Superchain Interop Explainer](/stack/interop/explainer#faqs) or check out this [Superchain interop design video walk-thru](https://www.youtube.com/watch?v=FKc5RgjtGes) -* Use [Supersim](supersim), a local dev environment that simulates Superchain interop for testing applications against a local version of the Superchain \ No newline at end of file +* Use [Supersim](supersim), a local dev environment that simulates Superchain interop for testing applications against a local version of the Superchain From f6f41bb6b4cc4c0d1a747220c6b4fdd0b91a3021 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Thu, 31 Oct 2024 15:11:52 +0100 Subject: [PATCH 368/565] updated the description --- pages/stack/interop/transfer-superchainERC20.mdx | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/pages/stack/interop/transfer-superchainERC20.mdx b/pages/stack/interop/transfer-superchainERC20.mdx index 57e471ca6..fed6f9d81 100644 --- a/pages/stack/interop/transfer-superchainERC20.mdx +++ b/pages/stack/interop/transfer-superchainERC20.mdx @@ -31,6 +31,10 @@ Transferring SuperchainERC20 tokens between chains involves two main phases: ## How it works +This diagram illustrates the process of a SuperchainERC20 token transfer between chains. +Through the `L2ToL2CrossDomainMessenger` contract, tokens are burned on the source chain and a transfer message is emitted. +This message must then be relayed to the destination chain, where an equivalent amount of tokens will be minted to the specified recipient address - ensuring secure cross-chain transfers while maintaining the total token supply across all chains. + ```mermaid sequenceDiagram actor User @@ -40,7 +44,7 @@ sequenceDiagram Note over User,DestChain: Step 1: Prepare Tokens User->>SourceChain: Check token balance - alt Needs tokens + alt User->>SourceChain: Mint or acquire tokens end From 7a306cb89d505db7e25076f921c47fbacc74d070 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Thu, 31 Oct 2024 15:14:51 +0100 Subject: [PATCH 369/565] updated link --- pages/stack/interop/transfer-superchainERC20.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/stack/interop/transfer-superchainERC20.mdx b/pages/stack/interop/transfer-superchainERC20.mdx index fed6f9d81..11544796c 100644 --- a/pages/stack/interop/transfer-superchainERC20.mdx +++ b/pages/stack/interop/transfer-superchainERC20.mdx @@ -12,7 +12,7 @@ import { Callout, Steps } from 'nextra/components' Interop is currently in active development and not yet ready for production use. The information provided here may change. Check back regularly for the most up-to-date information. -This guide provides an overview of transferring SuperchainERC20 tokens between chains. For detailed technical steps and commands, see the [technical reference guide](https://supersim.pages.dev/guides/interop/manually-relaying-interop-messages-cast). +This guide provides an overview of transferring `SuperchainERC20` tokens between chains. ## Overview From b1cf7b60ebac42e31bd6109e6dc4aa530522ed73 Mon Sep 17 00:00:00 2001 From: Richard Gregory Date: Thu, 31 Oct 2024 15:23:36 +0100 Subject: [PATCH 370/565] Improve discoverability for gas limit --- pages/stack/transactions/fees.mdx | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/pages/stack/transactions/fees.mdx b/pages/stack/transactions/fees.mdx index 809137e54..387bfa809 100644 --- a/pages/stack/transactions/fees.mdx +++ b/pages/stack/transactions/fees.mdx @@ -6,6 +6,13 @@ description: Learn how transaction fees work on OP Mainnet. import { Callout } from 'nextra/components' + + The OP Stack maintains a distinct gas limit compared to the Ethereum mainnet.\ + While both chains use the same underlying transaction formats, Optimism's gas limits are tailored for optimal Layer 2 performance and scalability.\ + As a result, transactions on Optimism may behave differently from the mainnet regarding gas usage and fee estimation.\ + For a detailed comparison of gas limits between Optimism and Ethereum, see the [Optimism Chain Differences documentation](https://docs.optimism.io/chain/differences#transaction-fees). + + # Transaction fees on OP Mainnet OP Mainnet is designed to be [EVM equivalent](https://web.archive.org/web/20231127160757/https://medium.com/ethereum-optimism/introducing-evm-equivalence-5c2021deb306), which means it reuses the same Ethereum code you're already familiar with and behaves as much like Ethereum as possible. From 9ed470658a241252da29ed40455a25efb98d5fb0 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Thu, 31 Oct 2024 15:31:16 +0100 Subject: [PATCH 371/565] Updated the contents --- pages/stack/interop/message-passing.mdx | 282 ++++-------------------- words.txt | 8 +- 2 files changed, 52 insertions(+), 238 deletions(-) diff --git a/pages/stack/interop/message-passing.mdx b/pages/stack/interop/message-passing.mdx index 4184f309d..cec04983b 100644 --- a/pages/stack/interop/message-passing.mdx +++ b/pages/stack/interop/message-passing.mdx @@ -1,254 +1,66 @@ --- -title: 'Message Passing with Interop' +title: Interop Message Passing Overview lang: en-US -description: 'Learn how to implement cross-chain message passing using interop messaging.' +description: Learn about cross-chain message passing in the Superchain. --- -import { Steps } from 'nextra/components' +import { Callout, Steps } from 'nextra/components' -# Message passing with Interop +# Interop Message Passing Overview -This guide explains how to implement cross-chain message passing using interop messaging. -You'll learn the core concepts and implementation details independent of specific tooling. + + Interop is currently in active development and not yet ready for production use. The information provided here may change. Check back regularly for the most up-to-date information. + -## Message passing concepts +This guide provides an overview of cross-chain message passing in the Superchain. -Before diving into implementation, it's crucial to understand the core concepts of interop message passing: +## Overview -### Message structure +The Superchain uses a pull-based event system for cross-chain communication. Messages are sent through the `L2ToL2CrossDomainMessenger` contract, which provides a secure and standardized way to pass information between chains. -A message is a broadcast payload emitted from an identified source. It consists of: +## How it works -* **Message Payload**: Raw bytes representing a Log, created by concatenating topics and data -* **Unique Identifier**: A structure that points to a specific log emission -* **Execution Context**: Information about where and how the message should be processed +The following diagram illustrates how messages flow between chains through the `L2ToL2CrossDomainMessenger` contract, which acts as a bridge for cross-chain communication. When a contract on the source chain initiates a message, it's processed through several stages before reaching its destination, ensuring secure and reliable message delivery. -### Message payload construction - -```typescript -// Message payload is constructed by concatenating: -// 1. All event topics (each 32 bytes) -// 2. The event data -messagePayload = eventTopics.concat(eventData) +```mermaid +sequenceDiagram + participant Source as Source Chain + participant Messenger as L2ToL2CrossDomainMessenger + participant Dest as Destination Chain + + Note over Source,Dest: Message Creation + Source->>Messenger: Emit message event + Note over Source,Dest: Message Serialization + Messenger-->>Messenger: Convert to standard format + Note over Source,Dest: Identifier Creation + Messenger-->>Messenger: Generate unique ID + Note over Source,Dest: Message Execution + Messenger->>Dest: Process message ``` -### Message identifier components +Cross-chain messaging involves four main phases: -```solidity -struct Identifier { - address origin; // Contract that emitted the log - uint256 blockNumber; // Block number of emission - uint256 logIndex; // Position in block's logs array - uint256 timestamp; // Emission timestamp - uint256 chainId; // Chain identifier where message originated -} -``` +1. **Message Creation**: The source chain contract emits an event containing the message data and destination information. This event serves as the initiating message that will be relayed across chains. -## How It works - -### Message lifecycle - -The cross-chain messaging process follows a specific lifecycle: - -1. **Message Creation**: Events on source chain become initiating messages -2. **Message Serialization**: Converting log data into a standardized format -3. **Identifier Creation**: Generating unique identifiers for message tracking -4. **Message Execution**: Processing messages on destination chain - -### Message processing flow - -1. **Source chain**: - * Event emission triggers message creation - * System generates unique identifier - * Message is serialized and prepared for transmission - -2. **Cross-Chain transit**: - * Message payload is prepared for relay - * System validates message structure - * Cross-chain proof is generated - -3. **Destination chain**: - * Message receipt and validation - * Execution of message content - * Verification of successful processing - -## Implementation guide - - - ### Prepare message sending - - The [CrossDomainMessenger](https://github.com/ethereum-optimism/optimism/blob/92ed64e171c6eb9c6a080c626640e8836f0653cc/packages/contracts-bedrock/src/L2/L2ToL2CrossDomainMessenger.sol) contract serves as a standalone sender that emits an event. - - Key components: - - * L2\_MESSENGER: The address of the L2 cross-domain messenger contract - * sendCrossChainMessage: Function to initiate cross-chain message sending - - ```solidity - contract CrossChainMessenger { - address public immutable L2_MESSENGER = 0x4200000000000000000000000000000000000023; - - function sendCrossChainMessage( - address _target, // Destination contract address - bytes memory _message, // Message content to be sent - ) external { - IL2CrossDomainMessenger(L2_MESSENGER).sendMessage( - _target, - _message, - ); - } - } - ``` - - ### Send the message - - This function handles the actual transmission of your message to the destination chain. It manages: - - * Contract interaction with the messenger - * Gas limit settings for the transaction - * Error handling during transmission - * Returns the transaction hash for tracking - - ```typescript - async function sendMessage( - messenger: address, // Address of the messenger contract - target: address, // Destination contract address - message: bytes, // Message content to be transmitted - ): Promise { - // Send the message with appropriate gas settings - const tx = await contract.sendMessage( - target, - message, - ); - - return tx.hash; - } - ``` - - ### Create message identifier - - Creates a unique identifier for tracking your message across chains. This function: - - * Retrieves transaction details - * Locates the specific message event - * Constructs the identifier structure with: - * Origin address - * Block information - * Chain details - * Timing data - - ```typescript - async function createMessageIdentifier( - txHash: string, // Transaction hash of the sent message - provider: Provider // Network provider for accessing chain data - ): Promise { - // Get transaction and block information - const receipt = await provider.getTransactionReceipt(txHash); - const block = await provider.getBlock(receipt.blockNumber); - - // Find the message sent event - const sentEvent = receipt.logs.find(log => - log.address === L2_MESSENGER_ADDRESS && - log.topics[0] === SENT_MESSAGE_EVENT_SIGNATURE - ); - - if (!sentEvent) throw new Error("Message event not found"); - - // Construct and return the identifier - return { - origin: L2_MESSENGER_ADDRESS, - blockNumber: receipt.blockNumber, - logIndex: sentEvent.logIndex, - timestamp: block.timestamp, - chainId: provider.network.chainId - }; - } - ``` - - ### Construct message payload - - Assembles the complete message payload for transmission. This function: - - * Concatenates event topics and data - * Formats the payload for cross-chain transmission - * Ensures proper byte alignment - * Maintains data integrity - - ```typescript - function constructMessagePayload( - topics: string[], // Event topics to include - data: string // Additional message data - ): string { - // Combine topics and data into a single payload - return ethers.utils.hexConcat([ - ...topics, - data - ]); - } - ``` - - ### Relay the message - - Executes the message on the destination chain. This function: - - * Creates a messenger contract instance - * Sends the relay transaction - * Handles gas estimation - * Manages transaction confirmation - * Returns the transaction hash - - ```typescript - async function relayMessage( - identifier: Identifier, // Message identifier from source chain - payload: string, // Constructed message payload - provider: Provider // Network provider for destination chain - ): Promise { - // Initialize messenger contract - const messenger = new Contract( - L2_MESSENGER_ADDRESS, - L2_MESSENGER_ABI, - provider.getSigner() - ); - - // Send relay transaction with appropriate gas limit - const tx = await messenger.relayMessage( - identifier, - payload - ); - - return tx.hash; - } - ``` - - ### Verify message receipt - - Confirms that your message was successfully processed on the destination chain. This function: - - * Retrieves the transaction receipt - * Checks for the relay event - * Verifies processing status - * Returns success/failure status - - ```typescript - async function verifyMessageRelayed( - txHash: string, // Transaction hash of the relay transaction - provider: Provider // Network provider for destination chain - ): Promise { - // Get transaction receipt - const receipt = await provider.getTransactionReceipt(txHash); - - // Check for successful relay event - return receipt.logs.some(log => - log.address === L2_MESSENGER_ADDRESS && - log.topics[0] === RELAYED_MESSAGE_EVENT_SIGNATURE - ); - } - ``` - +2. **Message Serialization**: The messenger contract converts the event data into a standardized format that can be consistently processed across different chains in the Superchain. + +3. **Identifier Creation**: A unique identifier is generated for the message, containing information about its `origin`, `timestamp`, and other `metadata`. This identifier helps track and verify the message. + +4. **Message Execution**: The destination chain receives and processes the message, executing any associated actions or state changes specified in the original message. + +For detailed implementation steps and code examples, see our [message passing implementation guide](https://supersim.pages.dev/guides/interop/relay-using-viem.html). + +## Common Use Cases + +* Simple messages between identical contracts +* Complex multi-contract interactions +* Cross-chain state synchronization +* Token transfers and bridging + +For a practical example, see our [cross-chain ping pong tutorial](https://supersim.pages.dev/guides/interop/cross-chain-contract-via-l2cdm). ## Next steps -* More questions? Read our guide on the anatomy of a [cross-chain message](cross-chain-message) -* Use [Supersim](supersim), a local dev environment that simulates Superchain interop for testing applications against a local version of the Superchain. -* Use [viem bindings/actions](https://supersim.pages.dev/guides/interop/relay-using-viem.html) - The guide shows how to use viem bindings/actions to fetch identifiers and relay messages. -* Read how to manually [relay interop messages](https://supersim.pages.dev/guides/interop/manually-relaying-interop-messages-cast) with cast and `L2ToL2CrossDomainMessenger` +* Read about the [anatomy of a cross-chain message](/stack/interop/cross-chain-message) +* Try [Supersim](supersim) for testing cross-chain messages locally +* Learn about [manually relaying messages](https://supersim.pages.dev/guides/interop/manually-relaying-interop-messages-cast) diff --git a/words.txt b/words.txt index 5ce846b7a..5be79af1c 100644 --- a/words.txt +++ b/words.txt @@ -1,5 +1,5 @@ -accountqueue ACCOUNTQUEUE +accountqueue ACCOUNTSLOTS accountslots ADDI @@ -29,8 +29,8 @@ BLOBPOOL blobpool blobspace blockhash -BLOCKLOGS blocklists +BLOCKLOGS blocklogs BLOCKPROFILERATE blockprofilerate @@ -326,7 +326,9 @@ safedb Schnorr secp SELFDESTRUCT +SEPOLIA Sepolia +sepolia seqnr SEQUENCERHTTP sequencerhttp @@ -404,4 +406,4 @@ xtensibility ZKPs ZKVM Zora -zora \ No newline at end of file +zora From 2df47865b5ecc646c9026da982a3552e363bf125 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Thu, 31 Oct 2024 15:39:47 +0100 Subject: [PATCH 372/565] fix lint issues --- pages/stack/interop/message-passing.mdx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pages/stack/interop/message-passing.mdx b/pages/stack/interop/message-passing.mdx index cec04983b..02c7d8bf2 100644 --- a/pages/stack/interop/message-passing.mdx +++ b/pages/stack/interop/message-passing.mdx @@ -40,13 +40,13 @@ sequenceDiagram Cross-chain messaging involves four main phases: -1. **Message Creation**: The source chain contract emits an event containing the message data and destination information. This event serves as the initiating message that will be relayed across chains. +1. **Message Creation**: The source chain contract emits an event containing the message data and destination information. This event serves as the initiating message that will be relayed across chains. -2. **Message Serialization**: The messenger contract converts the event data into a standardized format that can be consistently processed across different chains in the Superchain. +2. **Message Serialization**: The messenger contract converts the event data into a standardized format that can be consistently processed across different chains in the Superchain. -3. **Identifier Creation**: A unique identifier is generated for the message, containing information about its `origin`, `timestamp`, and other `metadata`. This identifier helps track and verify the message. +3. **Identifier Creation**: A unique identifier is generated for the message, containing information about its `origin`, `timestamp`, and other `metadata`. This identifier helps track and verify the message. -4. **Message Execution**: The destination chain receives and processes the message, executing any associated actions or state changes specified in the original message. +4. **Message Execution**: The destination chain receives and processes the message, executing any associated actions or state changes specified in the original message. For detailed implementation steps and code examples, see our [message passing implementation guide](https://supersim.pages.dev/guides/interop/relay-using-viem.html). From 7679dbfe26814b535baef2041d16a93610e9f9ad Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Thu, 31 Oct 2024 15:42:48 +0100 Subject: [PATCH 373/565] fix lint issues --- pages/stack/interop/transfer-superchainERC20.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/stack/interop/transfer-superchainERC20.mdx b/pages/stack/interop/transfer-superchainERC20.mdx index 11544796c..4301dfba7 100644 --- a/pages/stack/interop/transfer-superchainERC20.mdx +++ b/pages/stack/interop/transfer-superchainERC20.mdx @@ -87,7 +87,7 @@ sequenceDiagram To finalize the transfer on the destination chain: 1. Get the message details from the source chain event - 2. Use the L2ToL2CrossDomainMessenger contract to relay the message + 2. Use the `L2ToL2CrossDomainMessenger` contract to relay the message 3. The message relay will trigger the minting of tokens on the destination chain From 89e9fb85b8ae82715f2f8c5d8c978e5f16caaf04 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Thu, 31 Oct 2024 16:24:08 +0100 Subject: [PATCH 374/565] update title --- pages/stack/interop/_meta.json | 2 +- pages/stack/interop/message-passing.mdx | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pages/stack/interop/_meta.json b/pages/stack/interop/_meta.json index 0b88cd36e..d2a17640a 100644 --- a/pages/stack/interop/_meta.json +++ b/pages/stack/interop/_meta.json @@ -3,5 +3,5 @@ "cross-chain-message": "Anatomy of cross-chain message", "supersim": "Supersim Multichain Development Environment", "superchain-erc20": "SuperchainERC20 token standard", - "message-passing": "General message passing with Interop" + "message-passing": "Interop message passing" } \ No newline at end of file diff --git a/pages/stack/interop/message-passing.mdx b/pages/stack/interop/message-passing.mdx index 02c7d8bf2..3be6ed39c 100644 --- a/pages/stack/interop/message-passing.mdx +++ b/pages/stack/interop/message-passing.mdx @@ -1,12 +1,12 @@ --- -title: Interop Message Passing Overview +title: Interop message passing overview lang: en-US description: Learn about cross-chain message passing in the Superchain. --- import { Callout, Steps } from 'nextra/components' -# Interop Message Passing Overview +# Interop message passing overview Interop is currently in active development and not yet ready for production use. The information provided here may change. Check back regularly for the most up-to-date information. From e43dd9597c5693bc89374d0b866138dda2fc5b6b Mon Sep 17 00:00:00 2001 From: cpengilly <29023967+cpengilly@users.noreply.github.com> Date: Thu, 31 Oct 2024 08:37:17 -0700 Subject: [PATCH 375/565] Update superchain-weth.mdx --- pages/stack/interop/superchain-weth.mdx | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/pages/stack/interop/superchain-weth.mdx b/pages/stack/interop/superchain-weth.mdx index abeb86e0e..6b6744425 100644 --- a/pages/stack/interop/superchain-weth.mdx +++ b/pages/stack/interop/superchain-weth.mdx @@ -49,7 +49,11 @@ sequenceDiagram _Figure 1: Superchain WETH Transfer Process between two interoperable L2 chains._ - `crosschainBurn` and `crosschainMint`can only be called by the `SuperchainTokenBridge`. + `crosschainBurn` and `crosschainMint`can only be called by the `SuperchainTokenBridge`. + + + +`SuperchainTokenBridge` only has the ability to rebalance the asset across chains. It cannot mint or increase/decrease the total circulating supply. ## Major components From 41b44b36a9731be0521a8f0cea7ead5894d34591 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Thu, 31 Oct 2024 16:38:42 +0100 Subject: [PATCH 376/565] updated content from coments --- pages/stack/interop/superchain-erc20.mdx | 2 +- pages/stack/interop/transfer-superchainERC20.mdx | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/pages/stack/interop/superchain-erc20.mdx b/pages/stack/interop/superchain-erc20.mdx index 3a9fc57a4..eaa150508 100644 --- a/pages/stack/interop/superchain-erc20.mdx +++ b/pages/stack/interop/superchain-erc20.mdx @@ -19,7 +19,7 @@ Additional features: * **Simplified deployments**: 0-infrastructure cost to make your token cross-chain. Provides a consistent, unified implementation for tokens across all Superchain-compatible networks and a common cross-chain interface for the EVM ecosystem at large. * **Permissionless propagation**: Easily clone an existing token contract to a new OP Stack chain using `create2` without requiring the original owner, which enables movement of assets to the new chain once Interop goes live. Importantly, permissionless propagation retains the integrity of the original owner on the contract and preserves security but proliferates the contract's availability to new chains. -* **Ethereum-aligned**: Implements ERC-7802, a unified interface that can be used across all of Ethereum to enable cross-chain mint/burn functionality. +* **Common standard**: Implements ERC-7802, a unified interface that can be used across all of Ethereum to enable cross-chain mint/burn functionality. ## How it works diff --git a/pages/stack/interop/transfer-superchainERC20.mdx b/pages/stack/interop/transfer-superchainERC20.mdx index 4301dfba7..e2c856b4f 100644 --- a/pages/stack/interop/transfer-superchainERC20.mdx +++ b/pages/stack/interop/transfer-superchainERC20.mdx @@ -109,7 +109,6 @@ For detailed technical instructions including contract addresses, specific comma You can also use: -* `supersim --interop.autorelay` for development environments * [viem bindings/actions](https://supersim.pages.dev/guides/interop/relay-using-viem) for TypeScript integration ## Next steps From b8dd458abb1f53846c89ca881c8c7808566b900b Mon Sep 17 00:00:00 2001 From: cpengilly <29023967+cpengilly@users.noreply.github.com> Date: Thu, 31 Oct 2024 08:39:38 -0700 Subject: [PATCH 377/565] Update words.txt --- words.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/words.txt b/words.txt index b395973a2..b9373b1dd 100644 --- a/words.txt +++ b/words.txt @@ -299,6 +299,7 @@ Quicknode quicknode quickstarts RANDAO +rebalance Regenesis regenesis REJOURNAL From 9a52fac977c659d9b283ba26e21330b1043c2b6a Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Thu, 31 Oct 2024 16:42:18 +0100 Subject: [PATCH 378/565] updated term --- pages/stack/interop/transfer-superchainERC20.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/stack/interop/transfer-superchainERC20.mdx b/pages/stack/interop/transfer-superchainERC20.mdx index e2c856b4f..18e9fa29a 100644 --- a/pages/stack/interop/transfer-superchainERC20.mdx +++ b/pages/stack/interop/transfer-superchainERC20.mdx @@ -69,7 +69,7 @@ sequenceDiagram Ensure you have tokens on the source chain using one of these methods: * Use existing tokens you already own - * Mint new tokens using the [L2NativeSuperchainERC20](https://github.com/ethereum-optimism/supersim/blob/main/contracts/src/L2NativeSuperchainERC20.sol) contract if you have minting permissions + * Mint new tokens using the [SuperchainERC20](https://github.com/ethereum-optimism/supersim/blob/main/contracts/src/L2NativeSuperchainERC20.sol) contract if you have minting permissions * Acquire tokens through a supported exchange or transfer ### Step 2: Initiate the transfer From 022489446ef535f505983587c87719b2edfd140a Mon Sep 17 00:00:00 2001 From: cpengilly <29023967+cpengilly@users.noreply.github.com> Date: Thu, 31 Oct 2024 09:01:47 -0700 Subject: [PATCH 379/565] language updates --- pages/stack/interop/superchain-weth.mdx | 2 +- words.txt | 4 ---- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/pages/stack/interop/superchain-weth.mdx b/pages/stack/interop/superchain-weth.mdx index 6b6744425..e66d1bf1d 100644 --- a/pages/stack/interop/superchain-weth.mdx +++ b/pages/stack/interop/superchain-weth.mdx @@ -66,7 +66,7 @@ This contract implements the core functionality for wrapping, unwrapping, and cr ### `ETHLiquidity` Contract -A predeploy contract with a large pool of ETH that provides liquidity for cross-chain transfers. It allows "burning" and "minting" of ETH for cross-chain transfers. ETH is associated with bridge ETH from the L1 lockbox, making ETH available to interop chains through a shared lockbox rather than fragemented amongst the existing portal contracts. +A predeploy contract with a large pool of ETH that provides liquidity for cross-chain transfers. It allows "burning" and "minting" of ETH for cross-chain transfers. ETH is associated with bridge ETH from the L1 lockbox, making ETH available to interop chains through a shared lockbox rather than fragmented amongst the existing portal contracts. * Contract address: `0x4200000000000000000000000000000000000025` diff --git a/words.txt b/words.txt index b9373b1dd..9820fdfc1 100644 --- a/words.txt +++ b/words.txt @@ -1,4 +1,3 @@ -ACCOUNTQUEUE accountqueue ACCOUNTSLOTS accountslots @@ -118,7 +117,6 @@ forkable forkchoice FPVM FPVMs -fragemented Fraxtal Funct gameplay @@ -328,7 +326,6 @@ safedb Schnorr secp SELFDESTRUCT -SEPOLIA Sepolia sepolia seqnr @@ -408,4 +405,3 @@ xtensibility ZKPs ZKVM Zora -zora From e4ad3be95dc34552ab842dc27e88b512154c4c80 Mon Sep 17 00:00:00 2001 From: Cardo Date: Thu, 31 Oct 2024 17:04:12 +0100 Subject: [PATCH 380/565] Update pages/stack/transactions/fees.mdx Co-authored-by: Blessing Krofegha --- pages/stack/transactions/fees.mdx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pages/stack/transactions/fees.mdx b/pages/stack/transactions/fees.mdx index 387bfa809..33e4e96be 100644 --- a/pages/stack/transactions/fees.mdx +++ b/pages/stack/transactions/fees.mdx @@ -7,9 +7,9 @@ description: Learn how transaction fees work on OP Mainnet. import { Callout } from 'nextra/components' - The OP Stack maintains a distinct gas limit compared to the Ethereum mainnet.\ - While both chains use the same underlying transaction formats, Optimism's gas limits are tailored for optimal Layer 2 performance and scalability.\ - As a result, transactions on Optimism may behave differently from the mainnet regarding gas usage and fee estimation.\ + The OP Stack maintains a distinct gas limit compared to the Ethereum mainnet. + While both chains use the same underlying transaction formats, Optimism's gas limits are tailored for optimal Layer 2 performance and scalability. + As a result, transactions on Optimism may behave differently from the mainnet regarding gas usage and fee estimation. For a detailed comparison of gas limits between Optimism and Ethereum, see the [Optimism Chain Differences documentation](https://docs.optimism.io/chain/differences#transaction-fees). From 20a61c88f9d4380b9a7cb80acb7190e10e67f3e4 Mon Sep 17 00:00:00 2001 From: cpengilly <29023967+cpengilly@users.noreply.github.com> Date: Thu, 31 Oct 2024 09:09:35 -0700 Subject: [PATCH 381/565] relocate superchaintokenbridge callout --- pages/stack/interop/superchain-weth.mdx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pages/stack/interop/superchain-weth.mdx b/pages/stack/interop/superchain-weth.mdx index e66d1bf1d..bf6740782 100644 --- a/pages/stack/interop/superchain-weth.mdx +++ b/pages/stack/interop/superchain-weth.mdx @@ -21,6 +21,10 @@ Superchain WETH or Interoperable ETH is a specialized version of the standard WE * Provides liquidity for cross-chain transactions * Improves user experience by abstracting complex bridging processes + +`SuperchainTokenBridge` only has the ability to rebalance the asset across chains. It cannot mint or increase/decrease the total circulating supply. + + ## How it works Currently, L2-to-L2 ETH transfers between two interoperable chains require four separate transactions: @@ -52,10 +56,6 @@ _Figure 1: Superchain WETH Transfer Process between two interoperable L2 chains. `crosschainBurn` and `crosschainMint`can only be called by the `SuperchainTokenBridge`. - -`SuperchainTokenBridge` only has the ability to rebalance the asset across chains. It cannot mint or increase/decrease the total circulating supply. - - ## Major components ### `SuperchainWETH` Contract From 337f95e00addabbcd2bfc362cd96314ec570c5d6 Mon Sep 17 00:00:00 2001 From: cpengilly <29023967+cpengilly@users.noreply.github.com> Date: Thu, 31 Oct 2024 09:47:58 -0700 Subject: [PATCH 382/565] Apply suggestions from code review Co-authored-by: Blessing Krofegha --- pages/stack/interop/op-supervisor.mdx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pages/stack/interop/op-supervisor.mdx b/pages/stack/interop/op-supervisor.mdx index 7dba942ce..3d13606d9 100644 --- a/pages/stack/interop/op-supervisor.mdx +++ b/pages/stack/interop/op-supervisor.mdx @@ -12,15 +12,15 @@ import { Callout, Tabs, Steps } from 'nextra/components' Interop is currently in active development and not yet ready for production use. The information provided here may change. Check back regularly for the most up-to-date information. -OP Supervisor is a critical service designed to verify cross-chain messages and manage the safety of interoperability between different chains in the OP Stack. It acts as a hub for indexing data that every `op-node` needs to cross-verify with other chains. +OP Supervisor is a service that verifies cross-chain messages and manages interoperability between chains in the OP Stack. It serves as a hub where each `op-node` can index the data needed for cross-chain verification. Some features and benefits include: * Enables secure cross-chain message passing on the Superchain -* Provides a centralized point for managing interoperability data +* Provides a unified point for managing interoperability data * Supports multiple networks simultaneously * Offers potential for public endpoints to aid in node synchronization -## Cross-chain message verification +## How cross-chain message verification works OP Supervisor verifies messages between different chains in the OP Stack, reducing the risk of invalid or malicious cross-chain interactions.⁠ It centralizes the verification process, which reduces the complexity of operating individual nodes⁠.⁠ @@ -61,7 +61,7 @@ For a full listing of API names, see the [`op-supervisor` client](https://github OP Supervisor requires RPC access to all chains in the dependency set. This allows `op-supervisor` to verify cross-chain messages and sync data across multiple networks simultaneously, such as OP Mainnet and Base nodes using the same instance. -Benefits of this approach: +Benefits: * Scalability: As the number of chains in the Superchain grows, `op-supervisor` can handle the increasing complexity of cross-chain interactions. * Improved reliability: It enables a more redundant setup, which is good for stability in the growing ecosystem. From a3767d52dda0d1404ca79f88e2a7aceed1d4416e Mon Sep 17 00:00:00 2001 From: cpengilly <29023967+cpengilly@users.noreply.github.com> Date: Thu, 31 Oct 2024 09:59:57 -0700 Subject: [PATCH 383/565] add expected audience --- pages/stack/interop/op-supervisor.mdx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pages/stack/interop/op-supervisor.mdx b/pages/stack/interop/op-supervisor.mdx index 3d13606d9..7afafb83b 100644 --- a/pages/stack/interop/op-supervisor.mdx +++ b/pages/stack/interop/op-supervisor.mdx @@ -1,7 +1,7 @@ --- title: OP Supervisor lang: en-US -description: Learn the basics of OP-Supervisor. +description: Learn the basics of OP Supervisor. --- import { Callout, Tabs, Steps } from 'nextra/components' @@ -12,7 +12,7 @@ import { Callout, Tabs, Steps } from 'nextra/components' Interop is currently in active development and not yet ready for production use. The information provided here may change. Check back regularly for the most up-to-date information. -OP Supervisor is a service that verifies cross-chain messages and manages interoperability between chains in the OP Stack. It serves as a hub where each `op-node` can index the data needed for cross-chain verification. +OP Supervisor is a service that verifies cross-chain messages and manages interoperability between chains in the OP Stack. It serves as a hub where each `op-node` can index the data needed for cross-chain verification. Chain operators and teams running full nodes like RPC providers are expected to run this service. Some features and benefits include: * Enables secure cross-chain message passing on the Superchain From 1b85cb93cd5b8c15b39194a737d08ec24a6779c9 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Thu, 31 Oct 2024 18:00:54 +0100 Subject: [PATCH 384/565] fix lint issues --- pages/stack/interop/superchain-erc20.mdx | 2 +- words.txt | 8 +++++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/pages/stack/interop/superchain-erc20.mdx b/pages/stack/interop/superchain-erc20.mdx index 52c079e16..d36933ee7 100644 --- a/pages/stack/interop/superchain-erc20.mdx +++ b/pages/stack/interop/superchain-erc20.mdx @@ -28,7 +28,7 @@ Additional features: * **Token Burning**: Initiating message where token is **burned** on the source chain. A user initiates a transfer of token from one blockchain to another and specifies the recipient wallet address on the destination chain. A specified amount of token is burned on the source chain. * **Token Minting**: Executing message where token is **minted** on the destination chain. The specified amount of token is minted on the destination chain directly to the recipient wallet address. -An important thing to note is using `crosschainBurn` and `crosschainMint` on the `SuperchainERC20` to move your asset across the Superchain only affects which chain your asset is located on and does not change the overall supply of the token. This keeps the token’s total amount the same across all networks, ensuring its value stays stable during the move and that the `SuperchainERC20` retains a unified, global supply count. +An important thing to note is using `crosschainBurn` and `crosschainMint` on the `SuperchainERC20` to move your asset across the Superchain only affects which chain your asset is located on and does not change the overall supply of the token. This keeps the token's total amount the same across all networks, ensuring its value stays stable during the move and that the `SuperchainERC20` retains a unified, global supply count. ```mermaid sequenceDiagram diff --git a/words.txt b/words.txt index 5ce846b7a..5be79af1c 100644 --- a/words.txt +++ b/words.txt @@ -1,5 +1,5 @@ -accountqueue ACCOUNTQUEUE +accountqueue ACCOUNTSLOTS accountslots ADDI @@ -29,8 +29,8 @@ BLOBPOOL blobpool blobspace blockhash -BLOCKLOGS blocklists +BLOCKLOGS blocklogs BLOCKPROFILERATE blockprofilerate @@ -326,7 +326,9 @@ safedb Schnorr secp SELFDESTRUCT +SEPOLIA Sepolia +sepolia seqnr SEQUENCERHTTP sequencerhttp @@ -404,4 +406,4 @@ xtensibility ZKPs ZKVM Zora -zora \ No newline at end of file +zora From 72dde8e70fbca62379375a574e1865cd1a19bd1d Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Thu, 31 Oct 2024 18:15:38 +0100 Subject: [PATCH 385/565] fix lint issues --- pages/builders/tools/connect/rpc-providers.mdx | 13 +++++++------ words.txt | 10 +++++++--- 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/pages/builders/tools/connect/rpc-providers.mdx b/pages/builders/tools/connect/rpc-providers.mdx index 6517876a8..2b2d13afa 100644 --- a/pages/builders/tools/connect/rpc-providers.mdx +++ b/pages/builders/tools/connect/rpc-providers.mdx @@ -11,7 +11,7 @@ import { Callout } from 'nextra/components' This reference guide lists different RPC and node providers to help you connect to an Optimism node. -This page includes providers that meet specific [inclusion criteria](#inclusion-criteria), as outlined below. Please visit the [community node providers page](https://github.com/ethereum-optimism/developers/blob/main/community/tools/node-providers.md) for an additional listing of third-party node providers. + This page includes providers that meet specific [inclusion criteria](#inclusion-criteria), as outlined below. Please visit the [community node providers page](https://github.com/ethereum-optimism/developers/blob/main/community/tools/node-providers.md) for an additional listing of third-party node providers. ## Ankr @@ -42,7 +42,7 @@ Moreover, Ankr offers access to developer tooling on OP Mainnet (and testnets) l ### Description and pricing -Blockdaemon provides institutional-grade blockchain infrastructure, including node, staking, and API solutions, with premium RPC services optimized for [Optimism](https://docs.blockdaemon.com/reference/how-to-access-optimism-api). With free and enhanced options, Blockdaemon’s RPC API allows developers to securely interact with on-chain data, broadcast transactions, and build dApps with minimal setup, offering streamlined access to enriched blockchain data and 99.9% uptime reliability to meet diverse needs. +Blockdaemon provides institutional-grade blockchain infrastructure, including node, staking, and API solutions, with premium RPC services optimized for [Optimism](https://docs.blockdaemon.com/reference/how-to-access-optimism-api). With free and enhanced options, Blockdaemon's RPC API allows developers to securely interact with on-chain data, broadcast transactions, and build dApps with minimal setup, offering streamlined access to enriched blockchain data and 99.9% uptime reliability to meet diverse needs. [Sign up for a free Blockdaemon account here](https://app.blockdaemon.com/signin/register) @@ -64,8 +64,9 @@ Blockdaemon provides institutional-grade blockchain infrastructure, including no ## dRPC ### Description and pricing -[dRPC](https://drpc.org) provides geo-distributed, auto-scalable OP Mainnet and OP Sepolia nodes. For more information, visit [dRPC's chainlist for Optimism](https://drpc.org/chainlist/optimism). dRPC supports Websocket and all methods, including debug and trace methods. -For early-stage startups, dRPC and Optimism Collective provide OP Mainnet nodes from 3 geo clusters without method restrictions and are totally free! + +[dRPC](https://drpc.org) provides geo-distributed, auto-scalable OP Mainnet and OP Sepolia nodes. For more information, visit [dRPC's chainlist for Optimism](https://drpc.org/chainlist/optimism). dRPC supports Websocket and all methods, including debug and trace methods. +For early-stage startups, dRPC and Optimism Collective provide OP Mainnet nodes from 3 geo clusters without method restrictions and are totally free! For commercial nodes, dRPC uses a pay-as-you-go model without hidden fees and rate limits. Feel free to try fast and reliable nodes. Supported Networks @@ -89,9 +90,9 @@ OP Sepolia ### Description and pricing -[Moralis](https://moralis.io/?utm_source=op-docs&utm_medium=partner-docs) is a popular Node and API provider for both real-time and indexed blockchain data. Moralis is the only major infrastructure provider in blockchain with a SOC2 Type 2 certification. You can use Moralis for free, or upgrade to a [paid plan](https://moralis.io/pricing/?utm_source=op-docs&utm_medium=partner-docs) for more features and benefits. +[Moralis](https://moralis.io/?utm_source=op-docs\&utm_medium=partner-docs) is a popular Node and API provider for both real-time and indexed blockchain data. Moralis is the only major infrastructure provider in blockchain with a SOC2 Type 2 certification. You can use Moralis for free, or upgrade to a [paid plan](https://moralis.io/pricing/?utm_source=op-docs\&utm_medium=partner-docs) for more features and benefits. -[Sign up for a free Moralis account here](https://admin.moralis.io/register/?utm_source=op-docs&utm_medium=partner-docs) +[Sign up for a free Moralis account here](https://admin.moralis.io/register/?utm_source=op-docs\&utm_medium=partner-docs) ### Supported networks diff --git a/words.txt b/words.txt index 5ce846b7a..a46ef0242 100644 --- a/words.txt +++ b/words.txt @@ -1,5 +1,5 @@ -accountqueue ACCOUNTQUEUE +accountqueue ACCOUNTSLOTS accountslots ADDI @@ -28,9 +28,11 @@ BLOBBASEFEE BLOBPOOL blobpool blobspace +Blockdaemon +Blockdaemon's blockhash -BLOCKLOGS blocklists +BLOCKLOGS blocklogs BLOCKPROFILERATE blockprofilerate @@ -326,7 +328,9 @@ safedb Schnorr secp SELFDESTRUCT +SEPOLIA Sepolia +sepolia seqnr SEQUENCERHTTP sequencerhttp @@ -404,4 +408,4 @@ xtensibility ZKPs ZKVM Zora -zora \ No newline at end of file +zora From 499d55d9227686866aae3f09aa2679a1742e14a4 Mon Sep 17 00:00:00 2001 From: cpengilly <29023967+cpengilly@users.noreply.github.com> Date: Thu, 31 Oct 2024 10:23:40 -0700 Subject: [PATCH 386/565] Apply suggestions from code review Co-authored-by: Blessing Krofegha --- pages/stack/interop/superchain-weth.mdx | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/pages/stack/interop/superchain-weth.mdx b/pages/stack/interop/superchain-weth.mdx index bf6740782..3799681ba 100644 --- a/pages/stack/interop/superchain-weth.mdx +++ b/pages/stack/interop/superchain-weth.mdx @@ -22,7 +22,7 @@ Superchain WETH or Interoperable ETH is a specialized version of the standard WE * Improves user experience by abstracting complex bridging processes -`SuperchainTokenBridge` only has the ability to rebalance the asset across chains. It cannot mint or increase/decrease the total circulating supply. + The `SuperchainTokenBridge` can only rebalance assets across chains. It cannot mint or increase/decrease the total circulating supply. ## How it works @@ -50,7 +50,7 @@ sequenceDiagram Cross-Chain Messenger->>Destination Chain: 3. Mint SuperchainWETH to recipient User->>Destination Chain: 4. Unwrap SuperchainWETH to ETH ``` -_Figure 1: Superchain WETH Transfer Process between two interoperable L2 chains._ +_Figure 1: Superchain WETH transfer process between two interoperable L2 chains._ `crosschainBurn` and `crosschainMint`can only be called by the `SuperchainTokenBridge`. @@ -58,19 +58,19 @@ _Figure 1: Superchain WETH Transfer Process between two interoperable L2 chains. ## Major components -### `SuperchainWETH` Contract +### `SuperchainWETH` contract This contract implements the core functionality for wrapping, unwrapping, and cross-chain transfer of ETH. It integrates with the `SuperchainTokenBridge` for interoperable actions. * Contract address: `0x4200000000000000000000000000000000000024` -### `ETHLiquidity` Contract +### `ETHLiquidity` contract A predeploy contract with a large pool of ETH that provides liquidity for cross-chain transfers. It allows "burning" and "minting" of ETH for cross-chain transfers. ETH is associated with bridge ETH from the L1 lockbox, making ETH available to interop chains through a shared lockbox rather than fragmented amongst the existing portal contracts. * Contract address: `0x4200000000000000000000000000000000000025` -### `L2ToL2CrossDomainMessenger` Contract +### `L2ToL2CrossDomainMessenger` contract This predeploy contract facilitates general message passing between different chains in the Superchain. It also securely transfers ERC20 tokens between L2 chains. From f940b26660084d593b9ca4d8936959a4cf92c03e Mon Sep 17 00:00:00 2001 From: Alex Date: Thu, 31 Oct 2024 22:15:59 +0300 Subject: [PATCH 387/565] corrected rude docs errors --- .../chain-operators/management/key-management.mdx | 2 +- .../chain-operators/management/troubleshooting.mdx | 2 +- .../chain-operators/tools/chain-monitoring.mdx | 10 +++++----- pages/builders/chain-operators/tools/op-challenger.mdx | 10 +++++----- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/pages/builders/chain-operators/management/key-management.mdx b/pages/builders/chain-operators/management/key-management.mdx index be6592825..870b0f4e9 100644 --- a/pages/builders/chain-operators/management/key-management.mdx +++ b/pages/builders/chain-operators/management/key-management.mdx @@ -21,7 +21,7 @@ are compromised, the system can be exploited. It is up to the chain operator to make the decision on how they want to manage these keys. One suggestion is to use a Hardware Security Module (HSM) to provide -a safer environment for key management. Cloud providers often times provide +a safer environment for key management. Cloud providers oftentimes provide Key Management Systems (KMS) that can work with your developer operations configurations. This can be used in conjunction with the `eth_signTransaction` RPC method. diff --git a/pages/builders/chain-operators/management/troubleshooting.mdx b/pages/builders/chain-operators/management/troubleshooting.mdx index e8a00a10d..05a0de551 100644 --- a/pages/builders/chain-operators/management/troubleshooting.mdx +++ b/pages/builders/chain-operators/management/troubleshooting.mdx @@ -33,7 +33,7 @@ export IMPL_SALT=$(openssl rand -hex 32) ## Failed to find the L2 Heads to start from -`op-node` fails to execute the derviation process with the following error: +`op-node` fails to execute the derivation process with the following error: ```text WARN [02-16|21:22:02.868] Derivation process temporary error attempts=14 err="stage 0 failed resetting: temp: failed to find the L2 Heads to start from: failed to fetch L2 block by hash 0x0000000000000000000000000000000000000000000000000000000000000000: failed to determine block-hash of hash 0x0000000000000000000000000000000000000000000000000000000000000000, could not get payload: not found" diff --git a/pages/builders/chain-operators/tools/chain-monitoring.mdx b/pages/builders/chain-operators/tools/chain-monitoring.mdx index 54a225a75..14da3c81b 100644 --- a/pages/builders/chain-operators/tools/chain-monitoring.mdx +++ b/pages/builders/chain-operators/tools/chain-monitoring.mdx @@ -19,12 +19,12 @@ Onchain monitoring services provide insights into the overall system, helping ch Monitorism is a tooling suite that supports monitoring and active remediation actions for the OP Stack chain. Monitorism uses monitors as passive security providing automated monitoring for the OP Stack. They are used to monitor the OP stack and alert on specific events that could be a sign of a security incident. -Currently. the list of monitors includes: +Currently, the list of monitors includes: Security integrity monitors: These are monitors necessary for making sure Bridges between L2 and L1 are safe and work as expected. These monitors are divided in two subgroups: * Pre-Faultproof Chain Monitors: - * Fault Monitor: checks for changes in output roots posted to the L2OutputOracle contract. When a change is detected, it reconstructs the output root from a trusted L2 source and looks for a match.. + * Fault Monitor: checks for changes in output roots posted to the L2OutputOracle contract. When a change is detected, it reconstructs the output root from a trusted L2 source and looks for a match. * Withdrawals Monitor: checks for new withdrawals that have been proven to the OptimismPortal contract. Each withdrawal is checked against the `L2ToL1MessagePasser` contract. * Faultproof chain monitors: * Faultproof Withdrawal: The Faultproof Withdrawal component monitors `ProvenWithdrawals` events on the `OptimismPortal` contract and performs checks to detect any violations of invariant conditions on the chain. If a violation is detected, the issue is logged, and a Prometheus metric is set for the event. This component is designed to work exclusively with chains that are already utilizing the Fault Proofs system. This is a new version of the deprecated `chain-mon`, `faultproof-wd-mon`. For detailed information on how the component works and the algorithms used, please refer to the component README. @@ -34,7 +34,7 @@ Security monitors: Those tools monitor other aspects of several contracts used i * Global Events Monitor: made for taking YAML rules as configuration and monitoring the events that are emitted on the chain. * Liveness Expiration Monitor: monitors the liveness expiration on Safes. * Balances Monitor: emits a metric reporting the balances for the configured accounts. -* Multisig Monitor: The multisig monitor reports the paused status of the OptimismPortal contract. "If set, reports the latest nonce of the configured Safe address and the latest presigned nonce stored in One Password.. The latest presigned nonce is identified by looking for items in the configured vault that follow a `ready-.json` name. The highest nonce of this item name format is reported. +* Multisig Monitor: The multisig monitor reports the paused status of the OptimismPortal contract. If set, reports the latest nonce of the configured Safe address and the latest presigned nonce stored in One Password.. The latest presigned nonce is identified by looking for items in the configured vault that follow a `ready-.json` name. The highest nonce of this item name format is reported. * Drippie Monitor: tracks the execution and executability of drips within a Drippie contract. * Secrets Monitor: takes a Drippie contract as a parameter and monitors for any drips within that contract that use the `CheckSecrets` dripcheck contract. `CheckSecrets` is a dripcheck that allows a drip to begin once a specific secret has been revealed (after a delay period) and cancels the drip if a second secret is revealed. Monitoring these secrets is important, as their revelation may indicate that the secret storage platform has been compromised and someone is attempting to exfiltrate the ETH controlled by the drip. @@ -76,9 +76,9 @@ Chain operators can easily create their grafana dashboard for Dispute Monitor us ## Offchain component monitoring Offchain monitoring allows chain operators to monitor the operation and behavior of nodes and other offchain components. Some of the more common components that you'll likely want to monitor include `op-node`, `op-geth`, `op-proposer`, `op-batcher`, and `op-challenger`. -The general steps for enabling offchain monitoring is pretty consistent for all the OP components: +The general steps for enabling offchain monitoring are pretty consistent for all the OP components: -1. Expose the monitoring port by enabling the `-—metrics.enabled` flag +1. Expose the monitoring port by enabling the `--metrics.enabled` flag 2. Customize the metrics port and address via the `--metrics.port` and `--metrics.addr` flags, respectively 3. Use [Prometheus](https://prometheus.io/) to scrape data from the metrics port 4. Save the data in `influxdb` diff --git a/pages/builders/chain-operators/tools/op-challenger.mdx b/pages/builders/chain-operators/tools/op-challenger.mdx index 9c27d7c64..ff1927eae 100644 --- a/pages/builders/chain-operators/tools/op-challenger.mdx +++ b/pages/builders/chain-operators/tools/op-challenger.mdx @@ -81,12 +81,12 @@ This guide provides a walkthrough of setting up the configuration and monitoring #### `--rollup-rpc` - * This needs to be an`op-node` archive node because challenger needs access to output roots from back when the games start. See below for important configuration details: + * This needs to be an `op-node` archive node because challenger needs access to output roots from back when the games start. See below for important configuration details: 1. Safe Head Database (SafeDB) Configuration for op-node: * The `op-node` behind the `op-conductor` must have the SafeDB enabled to ensure it is not stateless. - * To Enable SafeDB, set the `--safedb.path` value in your configuration. This specifies the file path used to persist safe head update data. + * To enable SafeDB, set the `--safedb.path` value in your configuration. This specifies the file path used to persist safe head update data. * Example Configuration: ``` @@ -138,7 +138,7 @@ This guide provides a walkthrough of setting up the configuration and monitoring # if you use the wrong one, you will lose the game # if you deploy your own contracts, you specify the hash, the root of the json file # op mainnet are tagged versions of op-program - # make reproducable prestate + # make reproducible prestate # challenger verifies that onchain --cannon-prestate ./op-program/bin/prestate.json \ # load the game factory address from system config or superchain registry @@ -164,7 +164,7 @@ This guide provides a walkthrough of setting up the configuration and monitoring * There are two ways to specify the prestate to use: * `--cannon-prestate`: specifies a path to a single Cannon pre-state Json file * `--cannon-prestates-url`: specifies a URL to load pre-states from. This enables participating in games that use different prestates, for example due to a network upgrade. The prestates are stored in this directory named by their hash. - * Example final Url for a prestate: + * Example final URL for a prestate: * [https://example.com/prestates/0x031e3b504740d0b1264e8cf72b6dde0d497184cfb3f98e451c6be8b33bd3f808.json](https://example.com/prestates/0x031e3b504740d0b1264e8cf72b6dde0d497184cfb3f98e451c6be8b33bd3f808.json) * This file contains the cannon memory state. @@ -212,7 +212,7 @@ This guide provides a walkthrough of setting up the configuration and monitoring | `resolve` | Resolves the specified dispute game if possible | | `resolve-claim` | Resolves the specified claim if possible | - Additionally, chain operators should consider running `op-dispute-mon`. It's an incredibly useful securities monitoring service to keep an eye on games, basically giving chain operators visibility into all the status of the games for the last 28 days. + Additionally, chain operators should consider running `op-dispute-mon`. It's an incredibly useful security monitoring service to keep an eye on games, basically giving chain operators visibility into all the status of the games for the last 28 days. Chain operators can easily create their grafana dashboard for Dispute Monitor using the following json file: [Download the Dispute Monitor JSON](/resources/grafana/dispute-monitor-1718214549035.json).
    From 2f00d335118759712044a136e3708e9819b2ca28 Mon Sep 17 00:00:00 2001 From: Davion Date: Fri, 1 Nov 2024 03:05:32 +0300 Subject: [PATCH 388/565] Edited the documentation to remove errors --- pages/builders/chain-operators/self-hosted.mdx | 2 +- pages/builders/chain-operators/tools/op-conductor.mdx | 4 ++-- pages/builders/chain-operators/tools/op-deployer.mdx | 2 +- .../builders/chain-operators/tutorials/adding-precompiles.mdx | 2 +- pages/builders/node-operators/management/metrics.mdx | 4 ++-- pages/builders/node-operators/tutorials/mainnet.mdx | 4 ++-- pages/builders/tools/monitor/regenesis-history.mdx | 2 +- 7 files changed, 10 insertions(+), 10 deletions(-) diff --git a/pages/builders/chain-operators/self-hosted.mdx b/pages/builders/chain-operators/self-hosted.mdx index a94ee4080..31dc22ac9 100644 --- a/pages/builders/chain-operators/self-hosted.mdx +++ b/pages/builders/chain-operators/self-hosted.mdx @@ -24,7 +24,7 @@ There are two main steps to get started building your own self-hosted OP Chain: blockchain to manage aspects of the Rollup. Each OP Stack chain has its own set of [L1 smart contracts](/stack/smart-contracts#layer-1-contracts), [L2 predeploy contracts](/stack/smart-contracts#layer-2-contracts-predeploys), - and [L2 preinstall contracts](/builders/chain-operators/features/preinstalls). + and [L2 preinstall contracts](/builders/chain-operators/features/preinstalls) that are deployed when the chain is created. * **Preinstalls**: OP Chains come with [preinstalled core contracts](/builders/chain-operators/features/preinstalls), making them usable as soon as a chain is initialized on the OP Stack. diff --git a/pages/builders/chain-operators/tools/op-conductor.mdx b/pages/builders/chain-operators/tools/op-conductor.mdx index 43dfaf4f1..8dc4b6695 100644 --- a/pages/builders/chain-operators/tools/op-conductor.mdx +++ b/pages/builders/chain-operators/tools/op-conductor.mdx @@ -153,7 +153,7 @@ This setup guide has the following assumptions: ```yaml OP_NODE_CONDUCTOR_ENABLED: "true" # this is what commits unsafe blocks to the raft logs - OP_NODE_RPC_ADMIN_STATE: "" # this flag cant be used with conductor + OP_NODE_RPC_ADMIN_STATE: "" # this flag can't be used with conductor ``` {

    Confirm sequencer switch was successful

    } @@ -192,7 +192,7 @@ This setup guide has the following assumptions: Confirm all conductors successfully resumed with [conductor_paused](#conductor_paused) - {

    Tranfer leadership

    } + {

    Transfer leadership

    } Trigger leadership transfer to `sequencer-0` using [conductor_transferLeaderToServer](#conductor_transferleadertoserver) diff --git a/pages/builders/chain-operators/tools/op-deployer.mdx b/pages/builders/chain-operators/tools/op-deployer.mdx index 274e782a6..6f5aba921 100644 --- a/pages/builders/chain-operators/tools/op-deployer.mdx +++ b/pages/builders/chain-operators/tools/op-deployer.mdx @@ -83,7 +83,7 @@ l2ContractsLocator = "tag://op-contracts/v1.7.0-beta.1+l2-contracts" # L2 smart [[chains]] # Your chain's ID, encoded as a 32-byte hex string id = "0x0000000000000000000000000000000000000000000000000000000000003039" - # Update the fee receipiant contract + # Update the fee recipient contract baseFeeVaultRecipient = "0x0000000000000000000000000000000000000000" l1FeeVaultRecipient = "0x0000000000000000000000000000000000000000" sequencerFeeVaultRecipient = "0x0000000000000000000000000000000000000000" diff --git a/pages/builders/chain-operators/tutorials/adding-precompiles.mdx b/pages/builders/chain-operators/tutorials/adding-precompiles.mdx index 70d8e678d..98b352c73 100644 --- a/pages/builders/chain-operators/tutorials/adding-precompiles.mdx +++ b/pages/builders/chain-operators/tutorials/adding-precompiles.mdx @@ -88,7 +88,7 @@ It means that for every precompile you need two functions: * `RequiredGas` which returns the gas cost for the call. This function takes an array of bytes as input, and returns a single value, the gas cost. * `Run` which runs the actual precompile. This function also takes an array of bytes, but it returns two values: the call's output (a byte array) and an error. -For every fork that changes the precompiles you have a [`map`](https://www.w3schools.com/go/go_maps.php)from addresses to the `PrecompiledContract` definitions: +For every fork that changes the precompiles you have a [`map`](https://www.w3schools.com/go/go_maps.php) from addresses to the `PrecompiledContract` definitions: ```go // PrecompiledContractsBerlin contains the default set of pre-compiled Ethereum diff --git a/pages/builders/node-operators/management/metrics.mdx b/pages/builders/node-operators/management/metrics.mdx index 022f44f64..b7aedea32 100644 --- a/pages/builders/node-operators/management/metrics.mdx +++ b/pages/builders/node-operators/management/metrics.mdx @@ -33,10 +33,10 @@ A complete list of available metrics is below: | op\_node\_default\_rpc\_client\_requests\_total | Total RPC requests initiated by the opnode's RPC client | method | counter | | op\_node\_default\_rpc\_client\_request\_duration\_seconds | Histogram of RPC client request durations | method | histogram | | op\_node\_default\_rpc\_client\_responses\_total | Total RPC request responses received by the opnode's RPC client | method,error | counter | -| op\_node\_default\_l1\_source\_cache\_size | L1 Source cache cache size | type | gauge | +| op\_node\_default\_l1\_source\_cache\_size | L1 Source cache size | type | gauge | | op\_node\_default\_l1\_source\_cache\_get | L1 Source cache lookups, hitting or not | type,hit | counter | | op\_node\_default\_l1\_source\_cache\_add | L1 Source cache additions, evicting previous values or not | type,evicted | counter | -| op\_node\_default\_l2\_source\_cache\_size | L2 Source cache cache size | type | gauge | +| op\_node\_default\_l2\_source\_cache\_size | L2 Source cache size | type | gauge | | op\_node\_default\_l2\_source\_cache\_get | L2 Source cache lookups, hitting or not | type,hit | counter | | op\_node\_default\_l2\_source\_cache\_add | L2 Source cache additions, evicting previous values or not | type,evicted | counter | | op\_node\_default\_derivation\_idle | 1 if the derivation pipeline is idle | | gauge | diff --git a/pages/builders/node-operators/tutorials/mainnet.mdx b/pages/builders/node-operators/tutorials/mainnet.mdx index b2906a723..4ae527e4e 100644 --- a/pages/builders/node-operators/tutorials/mainnet.mdx +++ b/pages/builders/node-operators/tutorials/mainnet.mdx @@ -273,7 +273,7 @@ In this section, you'll learn how to download and verify the pre-migrated databa {

    Download the Migrated Data Directory

    } Click the link below to find the latest publicly available database snapshots for OP Mainnet. - Snapshots are available for multiple dates and snapshots get larger as they get closer the current date. + Snapshots are available for multiple dates and snapshots get larger as they get closer to the current date. Snapshots are large files and may take some time to download. [OP Mainnet Snapshots](/builders/node-operators/management/snapshots#op-mainnet) @@ -293,7 +293,7 @@ In this section, you'll learn how to download and verify the pre-migrated databa sha256sum mainnet-bedrock.tar.zst ``` - You should see then following output: + You should see the following output: ```bash ec4baf47e309a14ffbd586dc85376833de640c0f2a8d7355cb8a9e64c38bfcd1 mainnet-bedrock.tar.zst diff --git a/pages/builders/tools/monitor/regenesis-history.mdx b/pages/builders/tools/monitor/regenesis-history.mdx index 0938a0b58..c262e7ae3 100644 --- a/pages/builders/tools/monitor/regenesis-history.mdx +++ b/pages/builders/tools/monitor/regenesis-history.mdx @@ -63,6 +63,6 @@ people who needed this data already retrieved it). ### Going forward We recognize the inconvenience this has caused some of our community and their -uses and we're sorry for the frustrations. In an effort to prevent similar +users and we're sorry for the frustrations. In an effort to prevent similar situations from happening again in the future, we are evaluating and updating existing processes and frameworks. From ce9b83601e360f5f14ec0f7018a9076be832a790 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Fri, 1 Nov 2024 10:54:54 +0100 Subject: [PATCH 389/565] Update pages/stack/interop/_meta.json Co-authored-by: cpengilly <29023967+cpengilly@users.noreply.github.com> --- pages/stack/interop/_meta.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/stack/interop/_meta.json b/pages/stack/interop/_meta.json index d2a17640a..fb30169f4 100644 --- a/pages/stack/interop/_meta.json +++ b/pages/stack/interop/_meta.json @@ -2,6 +2,6 @@ "explainer": "Interop explainer", "cross-chain-message": "Anatomy of cross-chain message", "supersim": "Supersim Multichain Development Environment", - "superchain-erc20": "SuperchainERC20 token standard", + "superchain-erc20": "SuperchainERC20", "message-passing": "Interop message passing" } \ No newline at end of file From 78ea50408919cfcd7dd54e0663460930bccedb63 Mon Sep 17 00:00:00 2001 From: Bradley Camacho <42678939+bradleycamacho@users.noreply.github.com> Date: Fri, 1 Nov 2024 07:17:05 -0700 Subject: [PATCH 390/565] Add new doc --- pages/stack/interop/_meta.json | 3 +- .../superchainerc20-best-practices.mdx | 47 +++++++++++++++++++ 2 files changed, 49 insertions(+), 1 deletion(-) create mode 100644 pages/stack/interop/superchainerc20-best-practices.mdx diff --git a/pages/stack/interop/_meta.json b/pages/stack/interop/_meta.json index 0c2da550c..888b70670 100644 --- a/pages/stack/interop/_meta.json +++ b/pages/stack/interop/_meta.json @@ -5,5 +5,6 @@ "superchain-erc20": "SuperchainERC20", "superchain-weth": "SuperchainWETH (Interoperable ETH)", "op-supervisor": "OP Supervisor", - "transfer-superchainERC20": "How to transfer a SuperchainERC20" + "transfer-superchainERC20": "How to transfer a SuperchainERC20", + "superchainERC20-best-practices": "SuperchainERC20 best practices" } \ No newline at end of file diff --git a/pages/stack/interop/superchainerc20-best-practices.mdx b/pages/stack/interop/superchainerc20-best-practices.mdx new file mode 100644 index 000000000..27d163e13 --- /dev/null +++ b/pages/stack/interop/superchainerc20-best-practices.mdx @@ -0,0 +1,47 @@ +--- +title: Best practices for deploying new assets with SuperchainERC20 +lang: en-US +description: Essential best practices for deploying and managing SuperchainERC20 assets across the Superchain +--- + +# Best practices for deploying new assets with SuperchainERC20 + +The following best practices are essential for deploying and managing `SuperchainERC20` assets across Superchain-compatible networks. These guidelines help ensure optimal cross-chain functionality, consistent metadata, and efficient resource utilization. + +## Consistent addressing across chains + +* Use predefined addresses: Assign and verify unique addresses for each `SuperchainERC20` instance on every chain. Predefined addresses reduce deployment conflicts and ensure tokens are accurately recognized across chains. + +## Token metadata consistency + +* Standardize token metadata: Use identical values for `name`, `symbol`, and `decimals` across all chain instances. Inconsistent metadata can lead to display errors and transaction rejections during cross-chain operations. + +* Implement metadata verification: Add checks to ensure that metadata (e.g., `decimals`) matches across chains. + +## Efficient cross-chain transfers with crosschainBurn and crosschainMint + +* Maintain supply consistency: Use `crosschainBurn` to decrement token balances on the originating chain and `crosschainMint` to increase balances on the destination chain. These functions should mirror asset movement across chains without altering the total supply. + +* Implement error handling in transfer functions: Validate addresses and amounts before initiating cross-chain transfers. Cross-chain transfers are irreversible, so checks help prevent unrecoverable asset loss. + +## Optimizing gas usage for high-volume transfers + +* Minimize storage access: Use memory variables instead of storage where possible in high-frequency functions. Reduced storage access lowers gas fees, improving efficiency for high-volume transactions. + +* Batch transfers within gas limits: For batch transfers, ensure that gas limits are optimized to accommodate transaction volumes. Where possible, split large transactions to prevent them from failing due to gas constraints. + +## Sequence for deployment and bridging + +* Deploy on the origin chain first: Start with deployment on the primary chain to serve as the authoritative ledger for total supply. Subsequent chain instances should use this origin to track and verify supply. + +* Bridge tokens sequentially: When deploying across multiple chains, bridge tokens in a consistent, sequential order from the origin chain. This helps prevent supply misalignment and ensures accurate tracking. + +## Comprehensive testing before mainnet deployment + +- **Test with production-like conditions**: Deploy to staging environments that simulate mainnet conditions, especially for functions like `crosschainBurn` and `crosschainMint`. Test under realistic transaction loads to validate performance. We recommend using [Supersim](https://supersim.pages.dev/introduction) as an easy way to simulate the Superchain and test your SuperchainERC20 deployment. + +## Next steps + +* Explore the [SuperchainERC20 specifications](https://specs.optimism.io/interop/token-bridging.html) for in-depth implementation details. +* Watch the [Superchain interop design video walkthrough](https://www.youtube.com/watch?v=FKc5RgjtGes) for a visual explanation of the concepts. +* Review the [Superchain Interop Explainer](explainer) for answers to common questions about interoperability. From d4cf07925eb788e0e19109b8d4a1f48525a75bd6 Mon Sep 17 00:00:00 2001 From: Bradley Camacho <42678939+bradleycamacho@users.noreply.github.com> Date: Fri, 1 Nov 2024 07:23:27 -0700 Subject: [PATCH 391/565] Fix docs --- .../superchainerc20-best-practices.mdx | 38 ++++++------------- 1 file changed, 11 insertions(+), 27 deletions(-) diff --git a/pages/stack/interop/superchainerc20-best-practices.mdx b/pages/stack/interop/superchainerc20-best-practices.mdx index 27d163e13..1c915fef1 100644 --- a/pages/stack/interop/superchainerc20-best-practices.mdx +++ b/pages/stack/interop/superchainerc20-best-practices.mdx @@ -1,47 +1,31 @@ --- -title: Best practices for deploying new assets with SuperchainERC20 +title: Best practices for managing SuperchainERC20 tokens lang: en-US -description: Essential best practices for deploying and managing SuperchainERC20 assets across the Superchain +description: Essential best practices for deploying and managing SuperchainERC20 assets across Superchain-compatible networks. --- -# Best practices for deploying new assets with SuperchainERC20 +# Best practices for managing SuperchainERC20 tokens -The following best practices are essential for deploying and managing `SuperchainERC20` assets across Superchain-compatible networks. These guidelines help ensure optimal cross-chain functionality, consistent metadata, and efficient resource utilization. +The following best practices are essential for deploying and managing `SuperchainERC20` assets across the Superchain. These guidelines help ensure optimal cross-chain functionality. + +Note that the total supply of your tokens never fluctuates across the Superchain. Cross-chain burning and minting only affects the location of a token across the Superchain. ## Consistent addressing across chains -* Use predefined addresses: Assign and verify unique addresses for each `SuperchainERC20` instance on every chain. Predefined addresses reduce deployment conflicts and ensure tokens are accurately recognized across chains. +* Use predefined addresses: Assign and verify the same address for each `SuperchainERC20` instance on every chain. Predefined addresses reduce deployment conflicts and ensure tokens are accurately recognized across chains. Otherwise, the SuperchainERC20Bridge would need a way to verify if the tokens they mint on destination correspond to the tokens that were burned on source. Consider using `Create2Deployer` or one of our [predeploys](https://specs.optimism.io/interop/predeploys.html) to ensure this. ## Token metadata consistency * Standardize token metadata: Use identical values for `name`, `symbol`, and `decimals` across all chain instances. Inconsistent metadata can lead to display errors and transaction rejections during cross-chain operations. - -* Implement metadata verification: Add checks to ensure that metadata (e.g., `decimals`) matches across chains. - -## Efficient cross-chain transfers with crosschainBurn and crosschainMint - -* Maintain supply consistency: Use `crosschainBurn` to decrement token balances on the originating chain and `crosschainMint` to increase balances on the destination chain. These functions should mirror asset movement across chains without altering the total supply. - -* Implement error handling in transfer functions: Validate addresses and amounts before initiating cross-chain transfers. Cross-chain transfers are irreversible, so checks help prevent unrecoverable asset loss. - -## Optimizing gas usage for high-volume transfers - -* Minimize storage access: Use memory variables instead of storage where possible in high-frequency functions. Reduced storage access lowers gas fees, improving efficiency for high-volume transactions. - -* Batch transfers within gas limits: For batch transfers, ensure that gas limits are optimized to accommodate transaction volumes. Where possible, split large transactions to prevent them from failing due to gas constraints. - -## Sequence for deployment and bridging - -* Deploy on the origin chain first: Start with deployment on the primary chain to serve as the authoritative ledger for total supply. Subsequent chain instances should use this origin to track and verify supply. - -* Bridge tokens sequentially: When deploying across multiple chains, bridge tokens in a consistent, sequential order from the origin chain. This helps prevent supply misalignment and ensures accurate tracking. ## Comprehensive testing before mainnet deployment -- **Test with production-like conditions**: Deploy to staging environments that simulate mainnet conditions, especially for functions like `crosschainBurn` and `crosschainMint`. Test under realistic transaction loads to validate performance. We recommend using [Supersim](https://supersim.pages.dev/introduction) as an easy way to simulate the Superchain and test your SuperchainERC20 deployment. +* Test with production-like conditions: Deploy to staging environments that simulate mainnet conditions, especially for functions like `crosschainBurn` and `crosschainMint`. Test under realistic transaction loads to validate performance. We recommend using [Supersim](https://supersim.pages.dev/introduction) as an easy way to simulate the Superchain and test your SuperchainERC20 deployment. + +* Validate transfer handling: Test edge cases such as maximum balance transfers and inter-chain latency to ensure asset reliability across different scenarios. ## Next steps * Explore the [SuperchainERC20 specifications](https://specs.optimism.io/interop/token-bridging.html) for in-depth implementation details. * Watch the [Superchain interop design video walkthrough](https://www.youtube.com/watch?v=FKc5RgjtGes) for a visual explanation of the concepts. -* Review the [Superchain Interop Explainer](explainer) for answers to common questions about interoperability. +* Review the [Superchain Interop Explainer](explainer) for answers to common questions about interoperability. \ No newline at end of file From 49c69292b288b980e17fcd3e66afcfb5c46d5f35 Mon Sep 17 00:00:00 2001 From: Bradley Camacho <42678939+bradleycamacho@users.noreply.github.com> Date: Fri, 1 Nov 2024 07:24:13 -0700 Subject: [PATCH 392/565] Apply linting --- .../interop/superchainerc20-best-practices.mdx | 16 ++++++++-------- words.txt | 12 +----------- 2 files changed, 9 insertions(+), 19 deletions(-) diff --git a/pages/stack/interop/superchainerc20-best-practices.mdx b/pages/stack/interop/superchainerc20-best-practices.mdx index 1c915fef1..4270e13a5 100644 --- a/pages/stack/interop/superchainerc20-best-practices.mdx +++ b/pages/stack/interop/superchainerc20-best-practices.mdx @@ -8,24 +8,24 @@ description: Essential best practices for deploying and managing SuperchainERC20 The following best practices are essential for deploying and managing `SuperchainERC20` assets across the Superchain. These guidelines help ensure optimal cross-chain functionality. -Note that the total supply of your tokens never fluctuates across the Superchain. Cross-chain burning and minting only affects the location of a token across the Superchain. +Note that the total supply of your tokens never fluctuates across the Superchain. Cross-chain burning and minting only affects the location of a token across the Superchain. ## Consistent addressing across chains -* Use predefined addresses: Assign and verify the same address for each `SuperchainERC20` instance on every chain. Predefined addresses reduce deployment conflicts and ensure tokens are accurately recognized across chains. Otherwise, the SuperchainERC20Bridge would need a way to verify if the tokens they mint on destination correspond to the tokens that were burned on source. Consider using `Create2Deployer` or one of our [predeploys](https://specs.optimism.io/interop/predeploys.html) to ensure this. +* Use predefined addresses: Assign and verify the same address for each `SuperchainERC20` instance on every chain. Predefined addresses reduce deployment conflicts and ensure tokens are accurately recognized across chains. Otherwise, the SuperchainERC20Bridge would need a way to verify if the tokens they mint on destination correspond to the tokens that were burned on source. Consider using `Create2Deployer` or one of our [predeploys](https://specs.optimism.io/interop/predeploys.html) to ensure this. ## Token metadata consistency -* Standardize token metadata: Use identical values for `name`, `symbol`, and `decimals` across all chain instances. Inconsistent metadata can lead to display errors and transaction rejections during cross-chain operations. +* Standardize token metadata: Use identical values for `name`, `symbol`, and `decimals` across all chain instances. Inconsistent metadata can lead to display errors and transaction rejections during cross-chain operations. ## Comprehensive testing before mainnet deployment -* Test with production-like conditions: Deploy to staging environments that simulate mainnet conditions, especially for functions like `crosschainBurn` and `crosschainMint`. Test under realistic transaction loads to validate performance. We recommend using [Supersim](https://supersim.pages.dev/introduction) as an easy way to simulate the Superchain and test your SuperchainERC20 deployment. +* Test with production-like conditions: Deploy to staging environments that simulate mainnet conditions, especially for functions like `crosschainBurn` and `crosschainMint`. Test under realistic transaction loads to validate performance. We recommend using [Supersim](https://supersim.pages.dev/introduction) as an easy way to simulate the Superchain and test your SuperchainERC20 deployment. -* Validate transfer handling: Test edge cases such as maximum balance transfers and inter-chain latency to ensure asset reliability across different scenarios. +* Validate transfer handling: Test edge cases such as maximum balance transfers and inter-chain latency to ensure asset reliability across different scenarios. ## Next steps -* Explore the [SuperchainERC20 specifications](https://specs.optimism.io/interop/token-bridging.html) for in-depth implementation details. -* Watch the [Superchain interop design video walkthrough](https://www.youtube.com/watch?v=FKc5RgjtGes) for a visual explanation of the concepts. -* Review the [Superchain Interop Explainer](explainer) for answers to common questions about interoperability. \ No newline at end of file +* Explore the [SuperchainERC20 specifications](https://specs.optimism.io/interop/token-bridging.html) for in-depth implementation details. +* Watch the [Superchain interop design video walkthrough](https://www.youtube.com/watch?v=FKc5RgjtGes) for a visual explanation of the concepts. +* Review the [Superchain Interop Explainer](explainer) for answers to common questions about interoperability. diff --git a/words.txt b/words.txt index 2e0d2c443..a1c2f1f8e 100644 --- a/words.txt +++ b/words.txt @@ -11,7 +11,6 @@ Allocs allocs altda ANDI -Ankr Apeworx Arweave authrpc @@ -77,7 +76,6 @@ datacap DATADIR datadir Dencun -derviation Devnet devnet Devnode @@ -150,7 +148,6 @@ Holesky holesky IGNOREPRICE ignoreprice -Immunefi implicity Inator inator @@ -199,7 +196,6 @@ minsuggestedpriorityfee Mintable Mintplex MIPSEVM -Mitigations Monitorism Moralis Mordor @@ -293,8 +289,6 @@ Protip Proxied proxyd pseudorandomly -Pyth -Pyth's QRNG Quicknode quicknode @@ -329,9 +323,6 @@ safedb Schnorr secp SELFDESTRUCT -SEPOLIA -Sepolia -sepolia seqnr SEQUENCERHTTP sequencerhttp @@ -400,7 +391,6 @@ VMDEBUG vmdebug VMODULE vmodule -voxel wagmi Warpcast xlarge @@ -409,4 +399,4 @@ xtensibility ZKPs ZKVM Zora -zora \ No newline at end of file +zora From ddf5ea9f29ad2c49c71b4a38266207c6c18e5290 Mon Sep 17 00:00:00 2001 From: Bradley Camacho <42678939+bradleycamacho@users.noreply.github.com> Date: Fri, 1 Nov 2024 07:26:52 -0700 Subject: [PATCH 393/565] Wording and style fixes --- .../interop/superchainerc20-best-practices.mdx | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/pages/stack/interop/superchainerc20-best-practices.mdx b/pages/stack/interop/superchainerc20-best-practices.mdx index 4270e13a5..2fb7f26d0 100644 --- a/pages/stack/interop/superchainerc20-best-practices.mdx +++ b/pages/stack/interop/superchainerc20-best-practices.mdx @@ -1,7 +1,7 @@ --- title: Best practices for managing SuperchainERC20 tokens lang: en-US -description: Essential best practices for deploying and managing SuperchainERC20 assets across Superchain-compatible networks. +description: Essential best practices for deploying and managing SuperchainERC20 assets across Superchain networks. --- # Best practices for managing SuperchainERC20 tokens @@ -10,19 +10,23 @@ The following best practices are essential for deploying and managing `Superchai Note that the total supply of your tokens never fluctuates across the Superchain. Cross-chain burning and minting only affects the location of a token across the Superchain. -## Consistent addressing across chains +## Consistent addresses across chains -* Use predefined addresses: Assign and verify the same address for each `SuperchainERC20` instance on every chain. Predefined addresses reduce deployment conflicts and ensure tokens are accurately recognized across chains. Otherwise, the SuperchainERC20Bridge would need a way to verify if the tokens they mint on destination correspond to the tokens that were burned on source. Consider using `Create2Deployer` or one of our [predeploys](https://specs.optimism.io/interop/predeploys.html) to ensure this. +Use predefined addresses: Assign and verify the same address for each `SuperchainERC20` instance on every chain. Predefined addresses reduce deployment conflicts and ensure tokens are accurately recognized across chains. Otherwise, the SuperchainERC20Bridge would need a way to verify if the tokens they mint on destination correspond to the tokens that were burned on source. + +Consider using `Create2Deployer` or one of our [predeploys](https://specs.optimism.io/interop/predeploys.html) to ensure this. ## Token metadata consistency -* Standardize token metadata: Use identical values for `name`, `symbol`, and `decimals` across all chain instances. Inconsistent metadata can lead to display errors and transaction rejections during cross-chain operations. +Standardize token metadata: Use identical values for `name`, `symbol`, and `decimals` across all chain instances. Inconsistent metadata can lead to display errors and transaction rejections during cross-chain operations. + +## Testing before mainnet deployment -## Comprehensive testing before mainnet deployment +Test with production-like conditions: Deploy to staging environments that simulate mainnet conditions, especially for functions like `crosschainBurn` and `crosschainMint`. Test under realistic transaction loads to validate performance. -* Test with production-like conditions: Deploy to staging environments that simulate mainnet conditions, especially for functions like `crosschainBurn` and `crosschainMint`. Test under realistic transaction loads to validate performance. We recommend using [Supersim](https://supersim.pages.dev/introduction) as an easy way to simulate the Superchain and test your SuperchainERC20 deployment. +We recommend using [Supersim](https://supersim.pages.dev/introduction) as an easy way to simulate the Superchain and test your SuperchainERC20 deployment. -* Validate transfer handling: Test edge cases such as maximum balance transfers and inter-chain latency to ensure asset reliability across different scenarios. +Test edge cases such as maximum balance transfers and inter-chain latency to ensure asset reliability across different scenarios. ## Next steps From f0d666c15a6437d369a6b5773b639bb0377b5e33 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Fri, 1 Nov 2024 15:31:09 +0100 Subject: [PATCH 394/565] update breadcrumb script --- pages/stack/beta-features/beta-features.mdx | 16 ++ pages/stack/fault-proofs/fault-proofs.mdx | 20 ++ pages/stack/features/features.mdx | 15 ++ pages/stack/interop/interop.mdx | 19 ++ pages/stack/research/research.mdx | 15 ++ pages/stack/rollup/rollup.mdx | 17 ++ pages/stack/security/security.mdx | 16 ++ pages/stack/transactions/transactions.mdx | 20 ++ utils/create-breadcrumbs.ts | 199 +++++++++++++++----- 9 files changed, 288 insertions(+), 49 deletions(-) create mode 100644 pages/stack/beta-features/beta-features.mdx create mode 100644 pages/stack/fault-proofs/fault-proofs.mdx create mode 100644 pages/stack/features/features.mdx create mode 100644 pages/stack/interop/interop.mdx create mode 100644 pages/stack/research/research.mdx create mode 100644 pages/stack/rollup/rollup.mdx create mode 100644 pages/stack/security/security.mdx create mode 100644 pages/stack/transactions/transactions.mdx diff --git a/pages/stack/beta-features/beta-features.mdx b/pages/stack/beta-features/beta-features.mdx new file mode 100644 index 000000000..bfdd3a164 --- /dev/null +++ b/pages/stack/beta-features/beta-features.mdx @@ -0,0 +1,16 @@ +--- +title: Beta Features +description: Documentation covering Alt Da Mode, Custom Gas Token in the Beta Features section of the OP Stack ecosystem. +lang: en-US +--- + +import { Card, Cards } from 'nextra/components' + +# Beta Features + +Documentation covering Alt Da Mode, Custom Gas Token in the Beta Features section of the OP Stack ecosystem. + + + + + \ No newline at end of file diff --git a/pages/stack/fault-proofs/fault-proofs.mdx b/pages/stack/fault-proofs/fault-proofs.mdx new file mode 100644 index 000000000..0f49365ab --- /dev/null +++ b/pages/stack/fault-proofs/fault-proofs.mdx @@ -0,0 +1,20 @@ +--- +title: Fault Proofs +description: Documentation covering Cannon, Challenger, Explainer, Fp Components, Fp Security, Mips in the Fault Proofs section of the OP Stack ecosystem. +lang: en-US +--- + +import { Card, Cards } from 'nextra/components' + +# Fault Proofs + +Documentation covering Cannon, Challenger, Explainer, Fp Components, Fp Security, Mips in the Fault Proofs section of the OP Stack ecosystem. + + + + + + + + + \ No newline at end of file diff --git a/pages/stack/features/features.mdx b/pages/stack/features/features.mdx new file mode 100644 index 000000000..7f5e479cd --- /dev/null +++ b/pages/stack/features/features.mdx @@ -0,0 +1,15 @@ +--- +title: Features +description: Documentation covering Send Raw Transaction Conditional in the Features section of the OP Stack ecosystem. +lang: en-US +--- + +import { Card, Cards } from 'nextra/components' + +# Features + +Documentation covering Send Raw Transaction Conditional in the Features section of the OP Stack ecosystem. + + + + \ No newline at end of file diff --git a/pages/stack/interop/interop.mdx b/pages/stack/interop/interop.mdx new file mode 100644 index 000000000..76d4d8a95 --- /dev/null +++ b/pages/stack/interop/interop.mdx @@ -0,0 +1,19 @@ +--- +title: Interop +description: Documentation covering Cross Chain Message, Explainer, Superchain Erc20, Supersim, Transfer Superchainerc20 in the Interop section of the OP Stack ecosystem. +lang: en-US +--- + +import { Card, Cards } from 'nextra/components' + +# Interop + +Documentation covering Cross Chain Message, Explainer, Superchain Erc20, Supersim, Transfer Superchainerc20 in the Interop section of the OP Stack ecosystem. + + + + + + + + \ No newline at end of file diff --git a/pages/stack/research/research.mdx b/pages/stack/research/research.mdx new file mode 100644 index 000000000..c530c1be8 --- /dev/null +++ b/pages/stack/research/research.mdx @@ -0,0 +1,15 @@ +--- +title: Research +description: Documentation covering Block Time Research in the Research section of the OP Stack ecosystem. +lang: en-US +--- + +import { Card, Cards } from 'nextra/components' + +# Research + +Documentation covering Block Time Research in the Research section of the OP Stack ecosystem. + + + + \ No newline at end of file diff --git a/pages/stack/rollup/rollup.mdx b/pages/stack/rollup/rollup.mdx new file mode 100644 index 000000000..15d96a31c --- /dev/null +++ b/pages/stack/rollup/rollup.mdx @@ -0,0 +1,17 @@ +--- +title: Rollup +description: The big idea that makes Optimism possible is the Optimistic Rollup. We'll go through a brief explainer of *how* Optimistic Rollups work at a high l... +lang: en-US +--- + +import { Card, Cards } from 'nextra/components' + +# Rollup + +The big idea that makes Optimism possible is the Optimistic Rollup. We'll go through a brief explainer of *how* Optimistic Rollups work at a high l... + + + + + + \ No newline at end of file diff --git a/pages/stack/security/security.mdx b/pages/stack/security/security.mdx new file mode 100644 index 000000000..d770098b3 --- /dev/null +++ b/pages/stack/security/security.mdx @@ -0,0 +1,16 @@ +--- +title: Security +description: Documentation covering Faq, Pause in the Security section of the OP Stack ecosystem. +lang: en-US +--- + +import { Card, Cards } from 'nextra/components' + +# Security + +Documentation covering Faq, Pause in the Security section of the OP Stack ecosystem. + + + + + \ No newline at end of file diff --git a/pages/stack/transactions/transactions.mdx b/pages/stack/transactions/transactions.mdx new file mode 100644 index 000000000..c084cfc8f --- /dev/null +++ b/pages/stack/transactions/transactions.mdx @@ -0,0 +1,20 @@ +--- +title: Transactions +description: Documentation covering Cross Domain, Deposit Flow, Fees, Forced Transaction, Transaction Flow, Withdrawal Flow in the Transactions section of the OP Stack ecosystem. +lang: en-US +--- + +import { Card, Cards } from 'nextra/components' + +# Transactions + +Documentation covering Cross Domain, Deposit Flow, Fees, Forced Transaction, Transaction Flow, Withdrawal Flow in the Transactions section of the OP Stack ecosystem. + + + + + + + + + \ No newline at end of file diff --git a/utils/create-breadcrumbs.ts b/utils/create-breadcrumbs.ts index 7bfab9804..b6f2cf11f 100644 --- a/utils/create-breadcrumbs.ts +++ b/utils/create-breadcrumbs.ts @@ -2,85 +2,186 @@ import * as fs from 'fs/promises'; import * as path from 'path'; import matter from 'gray-matter'; -const targetFolders: string[] = ['builders', 'chain', 'stack', 'connect']; const rootDir: string = path.join(__dirname, '..', 'pages'); interface FileInfo { title: string; url: string; + description?: string; + content: string; } -function updateOPTerminology(description: string): string { +function toTitleCase(str: string): string { + return str.split('-') + .map(word => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase()) + .join(' '); +} - if (description.includes('OP Stack')) { - return description; - } +function extractFirstParagraph(content: string): string { + // Remove frontmatter + content = content.replace(/^---[\s\S]*?---/, ''); + + // Remove import statements + content = content.replace(/^import[\s\S]*?\n/gm, ''); + + // Remove HTML/MDX tags + content = content.replace(/<[^>]+>/g, ' '); + + // Remove markdown links but keep text + content = content.replace(/\[([^\]]+)\]\([^)]+\)/g, '$1'); + + // Remove headers + content = content.replace(/^#.+$/gm, ''); - // Replace variations of "OP Mainnet" with "OP Stack" - return description - .replace(/\bOP Mainnet\b/gi, 'OP Stack') - .replace(/\bOptimism Mainnet\b/gi, 'OP Stack') - .replace(/\bOptimism mainnet\b/gi, 'OP Stack'); + const paragraphs = content.split(/\n\n+/); + const firstParagraph = paragraphs.find(p => { + const cleaned = p.trim(); + return cleaned.length > 30 && // Minimum length + !cleaned.startsWith('import') && + !cleaned.startsWith('export'); + }); + + if (firstParagraph) { + const cleaned = firstParagraph.replace(/\s+/g, ' ').trim(); + return cleaned.length > 150 ? cleaned.slice(0, 147) + '...' : cleaned; + } + + return ''; } -const updateBreadcrumbFile = async (filePath: string): Promise => { - try { - const content = await fs.readFile(filePath, 'utf-8'); - const { data: frontMatter, content: fileContent } = matter(content); +async function generateFolderDescription(files: FileInfo[]): Promise { + if (files.length === 0) { + return 'Documentation for this section is coming soon.'; + } - if (frontMatter.description && - frontMatter.description.match(/\bOP Mainnet\b|\bOptimism Mainnet\b/gi) && - !frontMatter.description.includes('OP Stack')) { + const overviewFile = files.find(file => + file.url.toLowerCase().includes('overview') || + file.url.toLowerCase().includes('introduction') + ); - frontMatter.description = updateOPTerminology(frontMatter.description); - + if (overviewFile && overviewFile.content) { + const desc = extractFirstParagraph(overviewFile.content); + if (desc) return desc; + } - const updatedContent = matter.stringify(fileContent, frontMatter); - await fs.writeFile(filePath, updatedContent); - console.log(`Updated description in breadcrumb file: ${filePath}`); + const folderName = toTitleCase(path.basename(path.dirname(files[0].url))); + const topics = files.map(file => toTitleCase(path.basename(file.url))).join(', '); + + return `Documentation covering ${topics} in the ${folderName} section of the OP Stack ecosystem.`; +} + +async function getContentFiles(folderPath: string): Promise { + const files = await fs.readdir(folderPath); + const fileInfos: FileInfo[] = []; + const folderName = path.basename(folderPath); + + for (const file of files) { + if (file.startsWith('_') || + file === `${folderName}.mdx` || + file.startsWith('.') || + file.endsWith('.tsx') || + file.endsWith('.json')) { + continue; + } + + const filePath = path.join(folderPath, file); + const stats = await fs.stat(filePath); + + if (!stats.isDirectory() && (file.endsWith('.md') || file.endsWith('.mdx'))) { + try { + const content = await fs.readFile(filePath, 'utf-8'); + const { data: frontMatter } = matter(content); + const fileName = path.basename(file, path.extname(file)); + const fileTitle = frontMatter.title || toTitleCase(fileName); + const relativeUrl = `/${path.relative(rootDir, filePath)}`.replace(/\.(md|mdx)$/, ''); + + fileInfos.push({ + title: fileTitle, + url: relativeUrl, + description: frontMatter.description, + content: content + }); + } catch (error) { + console.error(`Error processing file ${file}:`, error); + } } - } catch (error) { - console.error(`Error processing file ${filePath}:`, error); } -}; -const processFolder = async (folderPath: string): Promise => { + return fileInfos; +} + +async function createBreadcrumb(folderPath: string, folderName: string): Promise { + const files = await getContentFiles(folderPath); + const title = toTitleCase(folderName); + const description = await generateFolderDescription(files); + + let content = `--- +title: ${title} +description: ${description} +lang: en-US +--- + +import { Card, Cards } from 'nextra/components' + +# ${title} + +${description} + +`; + + if (files.length > 0) { + content += '\n'; + files.forEach(({ title: fileTitle, url }) => { + content += ` \n`; + }); + content += ''; + } else { + content += 'Documentation for this section is coming soon.'; + } + + return content; +} + +async function processStackSubfolders(stackPath: string): Promise { try { - const files = await fs.readdir(folderPath); + const entries = await fs.readdir(stackPath, { withFileTypes: true }); - for (const file of files) { - const filePath = path.join(folderPath, file); - const stats = await fs.stat(filePath); - - if (stats.isDirectory()) { - - const breadcrumbFile = path.join(folderPath, `${file}.mdx`); - try { - await fs.access(breadcrumbFile); - await updateBreadcrumbFile(breadcrumbFile); - } catch (error) { + for (const entry of entries) { + if (!entry.isDirectory() || entry.name.startsWith('_')) { + continue; + } - } - + const subfolderPath = path.join(stackPath, entry.name); + const breadcrumbPath = path.join(subfolderPath, `${entry.name}.mdx`); - await processFolder(filePath); + console.log(`Processing stack subfolder: ${entry.name}`); + + try { + const content = await createBreadcrumb(subfolderPath, entry.name); + await fs.writeFile(breadcrumbPath, content); + console.log(`Created/Updated breadcrumb for: ${entry.name}`); + } catch (error) { + console.error(`Error creating breadcrumb for ${entry.name}:`, error); } } } catch (error) { - console.error(`Error processing folder ${folderPath}:`, error); + console.error('Error processing stack subfolders:', error); } -}; +} const main = async (): Promise => { - console.log('Starting breadcrumb description update process...'); + console.log('Starting stack subfolder breadcrumb update process...'); console.log('Root directory:', rootDir); - for (const folder of targetFolders) { - const folderPath = path.join(rootDir, folder); - await processFolder(folderPath); + try { + const stackPath = path.join(rootDir, 'stack'); + await fs.access(stackPath); + await processStackSubfolders(stackPath); + console.log('Finished updating stack subfolder breadcrumbs.'); + } catch (error) { + console.error('Error in main process:', error); + process.exit(1); } - - console.log('Finished updating breadcrumb descriptions.'); }; main().catch(error => { From 2a8ea4971e3dc52ed75058e722a19a942c2e0254 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Fri, 1 Nov 2024 15:31:20 +0100 Subject: [PATCH 395/565] updated breadcrumb notes --- notes/breadcrumbs.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/notes/breadcrumbs.md b/notes/breadcrumbs.md index e30512e7f..da1007655 100644 --- a/notes/breadcrumbs.md +++ b/notes/breadcrumbs.md @@ -26,7 +26,7 @@ pnpm create-breadcrumbs 2. **After Running** * Review generated `.mdx` files in each folder - * Check updated descriptions + * Check updated descriptions, plese update the description. * Verify Card components and links ## Common Issues From 52b93cfd5349aaf890b8ccb633d621fdf3c9bc03 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Fri, 1 Nov 2024 15:40:59 +0100 Subject: [PATCH 396/565] Update notes/breadcrumbs.md Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> --- notes/breadcrumbs.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/notes/breadcrumbs.md b/notes/breadcrumbs.md index da1007655..e6f8b3b83 100644 --- a/notes/breadcrumbs.md +++ b/notes/breadcrumbs.md @@ -26,7 +26,7 @@ pnpm create-breadcrumbs 2. **After Running** * Review generated `.mdx` files in each folder - * Check updated descriptions, plese update the description. + * Check updated descriptions, please update the description. * Verify Card components and links ## Common Issues From 2595a8f06a4df3ecec2eba118885bd4a02fcb06d Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Fri, 1 Nov 2024 15:41:16 +0100 Subject: [PATCH 397/565] Update pages/stack/beta-features/beta-features.mdx Co-authored-by: Bradley Camacho <42678939+bradleycamacho@users.noreply.github.com> --- pages/stack/beta-features/beta-features.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/stack/beta-features/beta-features.mdx b/pages/stack/beta-features/beta-features.mdx index bfdd3a164..28cedff3b 100644 --- a/pages/stack/beta-features/beta-features.mdx +++ b/pages/stack/beta-features/beta-features.mdx @@ -6,7 +6,7 @@ lang: en-US import { Card, Cards } from 'nextra/components' -# Beta Features +# Beta features Documentation covering Alt Da Mode, Custom Gas Token in the Beta Features section of the OP Stack ecosystem. From 28bc2d904b5c6100f181abd603e8da7f0c78afb9 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Fri, 1 Nov 2024 15:46:34 +0100 Subject: [PATCH 398/565] add workflow --- .github/workflows/check-breadcrumbs.yml | 91 +++++++++++++++++++++ package.json | 1 + pages/stack/beta-features/beta-features.mdx | 3 +- pages/stack/fault-proofs/fault-proofs.mdx | 7 +- pages/stack/features/features.mdx | 2 +- pages/stack/interop/interop.mdx | 6 +- pages/stack/research/research.mdx | 2 +- pages/stack/rollup/rollup.mdx | 4 +- pages/stack/security/security.mdx | 3 +- pages/stack/transactions/transactions.mdx | 7 +- utils/check-breadcrumbs.ts | 0 words.txt | 1 + 12 files changed, 119 insertions(+), 8 deletions(-) create mode 100644 .github/workflows/check-breadcrumbs.yml create mode 100644 utils/check-breadcrumbs.ts diff --git a/.github/workflows/check-breadcrumbs.yml b/.github/workflows/check-breadcrumbs.yml new file mode 100644 index 000000000..d2e70713f --- /dev/null +++ b/.github/workflows/check-breadcrumbs.yml @@ -0,0 +1,91 @@ +```yaml +name: Check Breadcrumbs + +on: + push: + branches: [ main ] + pull_request: + branches: [ main ] + paths: + - 'pages/**/*.mdx' + - 'pages/**/*.md' + +jobs: + check-breadcrumbs: + runs-on: ubuntu-latest + + steps: + - name: Check out code + uses: actions/checkout@v2 + + - name: Set up Node.js + uses: actions/setup-node@v2 + with: + node-version: '20.x' + + - name: Install pnpm + run: npm install -g pnpm + + - name: Install dependencies + run: pnpm install + + - name: Create check-breadcrumbs script + run: | + cat > utils/check-breadcrumbs.ts << 'EOL' + import * as fs from 'fs/promises'; + import * as path from 'path'; + + const rootDir = path.join(process.cwd(), 'pages'); + const errors: string[] = []; + + async function checkDirectory(dirPath: string): Promise { + const entries = await fs.readdir(dirPath, { withFileTypes: true }); + + for (const entry of entries) { + if (entry.name.startsWith('_') || entry.name.startsWith('.')) continue; + + const fullPath = path.join(dirPath, entry.name); + + if (entry.isDirectory()) { + // Skip if it's the root directory + if (fullPath === rootDir) continue; + + // Check if breadcrumb file exists for this directory + const breadcrumbFile = path.join(dirPath, `${entry.name}.mdx`); + try { + await fs.access(breadcrumbFile); + } catch { + const relativePath = path.relative(rootDir, dirPath); + errors.push(`Missing breadcrumb file for directory: ${relativePath}/${entry.name}`); + } + + // Recursively check subdirectories + await checkDirectory(fullPath); + } + } + } + + async function main() { + try { + await checkDirectory(rootDir); + + if (errors.length > 0) { + console.error('Breadcrumb check failed:'); + errors.forEach(error => console.error(`- ${error}`)); + process.exit(1); + } else { + console.log('All directories have breadcrumb files.'); + } + } catch (error) { + console.error('Error checking breadcrumbs:', error); + process.exit(1); + } + } + + main(); + EOL + + - name: Run breadcrumb check + run: pnpm ts-node utils/check-breadcrumbs.ts + +``` \ No newline at end of file diff --git a/package.json b/package.json index 6f0b17b6a..868eb0a41 100644 --- a/package.json +++ b/package.json @@ -9,6 +9,7 @@ "spellcheck:fix": "cspell --words-only --unique \"**/*.mdx\" | sort --ignore-case | uniq > words.txt", "linkcheck": "lychee --config ./lychee.toml --quiet \"./pages\"", "create-breadcrumbs":"npx ts-node --skip-project utils/create-breadcrumbs.ts", + "check-breadcrumbs":"npx ts-node --skip-project utils/check-breadcrumbs.ts", "index:docs": "npx ts-node --skip-project utils/algolia-indexer.ts", "dev": "next dev", "build": "next build", diff --git a/pages/stack/beta-features/beta-features.mdx b/pages/stack/beta-features/beta-features.mdx index bfdd3a164..24257e8e3 100644 --- a/pages/stack/beta-features/beta-features.mdx +++ b/pages/stack/beta-features/beta-features.mdx @@ -12,5 +12,6 @@ Documentation covering Alt Da Mode, Custom Gas Token in the Beta Features sectio + - \ No newline at end of file + diff --git a/pages/stack/fault-proofs/fault-proofs.mdx b/pages/stack/fault-proofs/fault-proofs.mdx index 0f49365ab..4da08bb26 100644 --- a/pages/stack/fault-proofs/fault-proofs.mdx +++ b/pages/stack/fault-proofs/fault-proofs.mdx @@ -12,9 +12,14 @@ Documentation covering Cannon, Challenger, Explainer, Fp Components, Fp Security + + + + + - \ No newline at end of file + diff --git a/pages/stack/features/features.mdx b/pages/stack/features/features.mdx index 7f5e479cd..84cad55a4 100644 --- a/pages/stack/features/features.mdx +++ b/pages/stack/features/features.mdx @@ -12,4 +12,4 @@ Documentation covering Send Raw Transaction Conditional in the Features section - \ No newline at end of file + diff --git a/pages/stack/interop/interop.mdx b/pages/stack/interop/interop.mdx index 76d4d8a95..952e51872 100644 --- a/pages/stack/interop/interop.mdx +++ b/pages/stack/interop/interop.mdx @@ -12,8 +12,12 @@ Documentation covering Cross Chain Message, Explainer, Superchain Erc20, Supersi + + + + - \ No newline at end of file + diff --git a/pages/stack/research/research.mdx b/pages/stack/research/research.mdx index c530c1be8..1a485ee0f 100644 --- a/pages/stack/research/research.mdx +++ b/pages/stack/research/research.mdx @@ -12,4 +12,4 @@ Documentation covering Block Time Research in the Research section of the OP Sta - \ No newline at end of file + diff --git a/pages/stack/rollup/rollup.mdx b/pages/stack/rollup/rollup.mdx index 15d96a31c..ca95c2564 100644 --- a/pages/stack/rollup/rollup.mdx +++ b/pages/stack/rollup/rollup.mdx @@ -12,6 +12,8 @@ The big idea that makes Optimism possible is the Optimistic Rollup. We'll go thr + + - \ No newline at end of file + diff --git a/pages/stack/security/security.mdx b/pages/stack/security/security.mdx index d770098b3..fbf62b199 100644 --- a/pages/stack/security/security.mdx +++ b/pages/stack/security/security.mdx @@ -12,5 +12,6 @@ Documentation covering Faq, Pause in the Security section of the OP Stack ecosys + - \ No newline at end of file + diff --git a/pages/stack/transactions/transactions.mdx b/pages/stack/transactions/transactions.mdx index c084cfc8f..02d703c69 100644 --- a/pages/stack/transactions/transactions.mdx +++ b/pages/stack/transactions/transactions.mdx @@ -12,9 +12,14 @@ Documentation covering Cross Domain, Deposit Flow, Fees, Forced Transaction, Tra + + + + + - \ No newline at end of file + diff --git a/utils/check-breadcrumbs.ts b/utils/check-breadcrumbs.ts new file mode 100644 index 000000000..e69de29bb diff --git a/words.txt b/words.txt index 5be79af1c..82aba8f3d 100644 --- a/words.txt +++ b/words.txt @@ -359,6 +359,7 @@ SUPERCHAIN Superchain superchain Superchain's +Superchainerc Superchains Superscan Supersim From cac24589f20225c0a8f48afaafc4576159b8409d Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Fri, 1 Nov 2024 15:48:54 +0100 Subject: [PATCH 399/565] fix code issues --- .github/workflows/check-breadcrumbs.yml | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/.github/workflows/check-breadcrumbs.yml b/.github/workflows/check-breadcrumbs.yml index d2e70713f..b1a7895a5 100644 --- a/.github/workflows/check-breadcrumbs.yml +++ b/.github/workflows/check-breadcrumbs.yml @@ -1,4 +1,4 @@ -```yaml + name: Check Breadcrumbs on: @@ -86,6 +86,4 @@ jobs: EOL - name: Run breadcrumb check - run: pnpm ts-node utils/check-breadcrumbs.ts - -``` \ No newline at end of file + run: pnpm ts-node utils/check-breadcrumbs.ts \ No newline at end of file From a3d3a4cff26d11855b0e5acd80345be441a04297 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Fri, 1 Nov 2024 15:54:40 +0100 Subject: [PATCH 400/565] updated the workflow file --- .github/workflows/check-breadcrumbs.yml | 59 +------------------------ 1 file changed, 1 insertion(+), 58 deletions(-) diff --git a/.github/workflows/check-breadcrumbs.yml b/.github/workflows/check-breadcrumbs.yml index b1a7895a5..a077cf137 100644 --- a/.github/workflows/check-breadcrumbs.yml +++ b/.github/workflows/check-breadcrumbs.yml @@ -1,4 +1,3 @@ - name: Check Breadcrumbs on: @@ -29,61 +28,5 @@ jobs: - name: Install dependencies run: pnpm install - - name: Create check-breadcrumbs script - run: | - cat > utils/check-breadcrumbs.ts << 'EOL' - import * as fs from 'fs/promises'; - import * as path from 'path'; - - const rootDir = path.join(process.cwd(), 'pages'); - const errors: string[] = []; - - async function checkDirectory(dirPath: string): Promise { - const entries = await fs.readdir(dirPath, { withFileTypes: true }); - - for (const entry of entries) { - if (entry.name.startsWith('_') || entry.name.startsWith('.')) continue; - - const fullPath = path.join(dirPath, entry.name); - - if (entry.isDirectory()) { - // Skip if it's the root directory - if (fullPath === rootDir) continue; - - // Check if breadcrumb file exists for this directory - const breadcrumbFile = path.join(dirPath, `${entry.name}.mdx`); - try { - await fs.access(breadcrumbFile); - } catch { - const relativePath = path.relative(rootDir, dirPath); - errors.push(`Missing breadcrumb file for directory: ${relativePath}/${entry.name}`); - } - - // Recursively check subdirectories - await checkDirectory(fullPath); - } - } - } - - async function main() { - try { - await checkDirectory(rootDir); - - if (errors.length > 0) { - console.error('Breadcrumb check failed:'); - errors.forEach(error => console.error(`- ${error}`)); - process.exit(1); - } else { - console.log('All directories have breadcrumb files.'); - } - } catch (error) { - console.error('Error checking breadcrumbs:', error); - process.exit(1); - } - } - - main(); - EOL - - name: Run breadcrumb check - run: pnpm ts-node utils/check-breadcrumbs.ts \ No newline at end of file + run: pnpm check-breadcrumbs \ No newline at end of file From 4dcdd47683118b7a3170149918e282689128cd68 Mon Sep 17 00:00:00 2001 From: soyboy <85043086+sbvegan@users.noreply.github.com> Date: Fri, 1 Nov 2024 09:01:08 -0600 Subject: [PATCH 401/565] Update monthly-issue-metircs.yml automatically add the monthly-report metrics label --- .github/workflows/monthly-issue-metircs.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/monthly-issue-metircs.yml b/.github/workflows/monthly-issue-metircs.yml index a8abad4f4..97b6ed183 100644 --- a/.github/workflows/monthly-issue-metircs.yml +++ b/.github/workflows/monthly-issue-metircs.yml @@ -41,6 +41,8 @@ jobs: token: ${{ secrets.GITHUB_TOKEN }} content-filepath: ./issue_metrics.md assignees: sbvegan + labels: | + monthly-report - name: Run issue-metrics tool for issues last month uses: github/issue-metrics@v2 From 8c54927748d97105bc184e3f7d7b04088f2579c3 Mon Sep 17 00:00:00 2001 From: Kelvin Fichter Date: Sat, 2 Nov 2024 01:08:32 +0700 Subject: [PATCH 402/565] feat: miscellanous improvements to finality doc Basically a rewrite. --- .../transactions/transaction-finality.mdx | 95 ++++++++----------- 1 file changed, 39 insertions(+), 56 deletions(-) diff --git a/pages/stack/transactions/transaction-finality.mdx b/pages/stack/transactions/transaction-finality.mdx index faa30642d..3c74c9853 100644 --- a/pages/stack/transactions/transaction-finality.mdx +++ b/pages/stack/transactions/transaction-finality.mdx @@ -1,7 +1,7 @@ --- title: Transaction Finality lang: en-US -description: Learn about finality in OP Stack and the steps to achieve transaction settlement. +description: Learn when transactions on OP Stack chains can be considered finalized. --- import Image from 'next/image' @@ -9,94 +9,77 @@ import { Callout } from 'nextra/components' # Transaction finality -This guide explains how transaction finality works in the OP Stack and addresses common misconceptions around transaction finality and the Fault Proof System. +This page explains when transactions on OP Stack chains can be considered "finalized" and addresses common misconceptions about transaction finality on the OP Stack. -The OP Stack derives its security from Ethereum by utilizing Ethereum's consensus mechanism. Instead of running an entirely separate consensus protocol, the OP Stack derives a L2 blockchain by reading the finalized state on Ethereum. +## Basics of finality -## Transaction finality states +Transaction "finality" is a term used to describe the point at which a transaction is irreversible under certain assumptions. For example, Ethereum transactions are considered finalized when certain conditions in Ethereum's consensus mechanism are met. Many applications built on top of Ethereum make use of this property when making certain decisions, like crediting a user's account when the user makes a deposit to an exchange. -In the OP Stack, transaction finality progresses through three key stages: +## OP Stack finality -1. **Unsafe:** The Sequencer creates a block containing the transaction, but the transaction data has not yet been posted to Ethereum (L1). The block is circulated within the L2 network for speed. +OP Stack chains in the Standard Configuration are Rollups that utilize Ethereum's consensus mechanism to order and finalize transactions instead of running an entirely separate consensus protocol. As a result, chains using the OP Stack inherit the ordering and finality properties of Ethereum. -2. **Safe:** The Sequencer posts the transaction data to L1. At this point, any L2 node can derive the transaction. +## Steps to finality -3. **Finalized:** Transactions are generally finalized on Ethereum when 2/3 of validators sign off on two consecutive checkpoints. This typically occurs within approximately two epochs, or around 65 blocks (10-15 minutes), but may take longer under adverse network conditions. This ensures that L1 data remains secure and unlikely to be reorganized. +Transactions on OP Stack chains follow a simple process to finality: -Transaction Finality Diagram. - -### Transaction validity - -When a transaction is submitted to the network, it undergoes validation. If the transaction is valid, the Sequencer includes it in a block. If it is invalid, it may still be proposed by the Sequencer, but the rest of the network will reject the block containing the invalid transaction, ensuring only valid transactions are finalized. +1. A user submits a transaction to the network, which is forwarded to the Sequencer. +1. The Sequencer includes the transaction in a block and distributes the block over a public p2p network. The user's transaction is now considered to be in a known but **"unsafe"** state. Here, "unsafe" is a technical term used to describe the fact that the transaction has been included in a block whose data has not yet been posted to Ethereum. This typically takes just a few seconds. +1. The Sequencer publishes the data for this block to Ethereum either as [blob data](https://www.eip4844.com/) or as calldata attached to a standard Ethereum transaction. Once this transaction is included in an Ethereum block, the user's transaction is considered to be in a **"safe"** state. This step typically takes 5-10 minutes. +1. The Ethereum block containing the Sequencer's transaction is finalized. At this point, the user's transaction is considered to be in a **"finalized"** state. Ethereum finalization typically takes ~65 Ethereum blocks or ~13 minutes but may take longer under certain network conditions. Finality here is entirely dependent on [Ethereum's consensus mechanism](https://ethereum.org/en/developers/docs/consensus-mechanisms/pos/#finality). -## Sequencer trust assumptions +TODO: Fix this so it has the right numbers -The Sequencer operates with the following trust assumptions: - -* It can temporarily withhold transactions. -* It may attempt to reorder transactions before L1 publication. -* Once transactions are published on L1 and finality is reached, the Sequencer cannot modify or censor them. However, until finality, transactions are theoretically subject to reorgs. +Transaction Finality Diagram. ## Common misconceptions -The biggest misconception about transaction finality is that a transaction needs to wait for the entire challenge window to become finalized. -The reality is the OP Stack transaction finality takes minutes, not over a week. This section explains transaction finality and the Fault Proof System's challenge mechanism. - -### Reorgs and finality +### Misconception: transactions take 7 days to finalize -Once a transaction is included in a finalized Ethereum block, it cannot be reorganized. +It's common to hear that transactions on OP Stack chains take 7 days to finalize. **This is incorrect.** Transactions on OP Stack chains become finalized when their data is included in a finalized Ethereum block. This typically takes ~20-30 minutes from the time the transaction is submitted. To reorg a finalized OP Stack chain transaction, you would have to be able to reorg the finalized Ethereum block that transaction's data is included within. -If an Ethereum reorganization (reorg) occurs, it affects applications on the OP Stack, such as the Optimism bridge, which uses the OP Stack's proof system to ensure transaction integrity: +Confusion about this fact commonly stems from the OP Stack's Standard Bridge design which includes a 7 day delay on *withdrawals* of ETH and other ERC-20 tokens from the bridge. This means that it takes a minimum of 7 days to move tokens from an OP Stack chain to Ethereum when using the Standard Bridge. The 7 day withdrawal delay applies to only to these withdrawals and has no impact the speed of finality on the OP Stack chain. -1. Detection: L2 nodes detect the L1 reorg, flagging the Optimism bridge's related transactions for re-evaluation. -2. State Adjustment: The L2 blocks impacted by the reorg revert to an "unsafe" status. -3. Transaction Re-publication: The Sequencer typically republishes the same transactions for the bridge, using the proof system to re-establish transaction validity. -4. System Restoration: After reprocessing, the system stabilizes, restoring a consistent state for bridge-related operations without impacting the rollup's core finalized state.1 +### Misconception: challenges in the Standard Bridge can cause a chain reorg -### The role of proof system +Another common misconception related to the misconception that [finalization takes 7 days](#misconception-transactions-take-7-days-to-finalize) is the idea that **Fault Proof challenges** created in response to withdrawals within the Standard Bridge can cause an OP Stack chain to reorganize itself (reorg). **This is not correct.** OP Stack transactions are never reorganized in response to any Fault Proof challenge. -The Fault Proof System is used by bridge contracts on L1 to verify claims that users make about the state of L2 for the purpose of facilitating user withdrawals of certain bridged assets from L2 to L1. +The Standard Bridge is a bridge application that is included by default with any OP Stack chain and connects the chain to its "parent" blockchain (usually Ethereum). The Standard Bridge takes advantage of the special relationship between a Rollup and its parent blockchain to be able to provide a high level of security for any ETH and ERC-20 tokens moved through the bridge. -A claim in the context of OP Stack is a statement asserting the state of the system at a specific block height. For instance, a claim might assert that at block 1,000,000 a certain address has all of the ether on the entire L2. If other participants believe this claim to be incorrect, they can challenge it. +Users that want to send ETH or ERC-20 tokens from the OP Stack chain to Ethereum through the Standard Bridge must first *burn* these ETH or ERC-20 tokens on the OP Stack chain. The user can then create a **withdrawal claim** on Ethereum that *claims* that they have indeed burned these tokens on the OP Stack chain. -Challenges focus on proving whether a given claim is valid. The outcome of a challenge does not impact the underlying chain. For example, if a claim about a certain address owning all the ether on the L2 is proven wrong, that address would not be able to move the ether from L2 to their address on L1. +Since the Standard Bridge is a smart contract on Ethereum and smart contracts can't run a whole node for an OP Stack chain, it has no way to immediately determine if a given withdrawal claim actually corresponds to real tokens being burned on the OP Stack chain. Instead, the Standard Bridge delays a claim by 7 days to allow time for the OP Stack Fault Proof system to filter out any "bad" withdrawal claims. -The challenge period provides time for challenges to be raised and resolved. -Although OP Stack finalizes transactions quickly (within 20 minutes), the 7-day challenge window serves two critical purposes: +Anyone can make any sort of withdrawal claim at any time because the bridge has no way to immediately distinguish a good claim from a bad one. Challenges simply remove a bad withdrawal claim without any other impact to the Standard Bridge or the underlying OP Stack chain. -1. It allows time to dispute the correctness of output state roots posted to Ethereum by the proposer. -2. It provides a security period for withdrawal processing, ensuring the integrity of cross-chain operations. +TODO: It'd be really fun to have a button that (for the bond cost of 0.08 ETH) creates a bad withdrawal claim for all of the ETH in the bridge. Users would be able to see first hand how their claim gets deleted and nothing else happens. -During this 7-day period: +### Misconception: the Sequencer can always reorg the chain -* If no challenge is raised: The posted state root is confirmed as valid, and users can proceed with their withdrawals or related transactions on Ethereum, completing the cross-chain process smoothly. +Sequencers play an important role in an OP Stack chain. The Sequencer acts as the block producer for the chain and quickly creates blocks as it receives user transactions. Here we'll address the common misconception that the Sequencer can cause reorganizations of the OP Stack chain over long periods of time. -* If a successful challenge occurs: The claim on the state root is invalidated, blocking any withdrawals based on that incorrect state root. This ensures that any invalid state does not impact the L2 chain's integrity or user assets. - Notably, this challenge mechanism is app-level and does not trigger reorganization or alter the core L2 chain's finalized state. +The OP Stack expects the Sequencer to produce a block every 1 or 2 seconds depending on the configuration of the chain. Since this 1 or 2 second block time is less than Ethereum's 12 second block time, there will always be some time before a Sequencer's block can be published to Ethereum. -### Withdrawal delays vs. finality +Sequencers **can** reorganize blocks *before* they are published to Ethereum, which is why OP Stack chain nodes consider these blocks to be **"unsafe"**. Although "unsafe" blocks are typically not reorganized, it is important for applications to understand that a reorganization is always possible. Reorgs of "unsafe" blocks *have* previously occurred during temporary Sequencer outages. -One common misconception is confusing withdrawal delays with transaction finality: +Reorganization becomes significantly more difficult once the Sequencer publishes block data to Ethereum. At this point, the Sequencer would have to *intentionally* cause a reorg of Ethereum itself. Given the difficulty required to trigger such a reorg, OP Stack nodes are programmed to consider transactions to be **"safe"** when this condition is reached. -* Transaction finality occurs in approximately 20 minutes. +Once block data for the OP Stack chain is included in a finalized Ethereum block, the Sequencer **cannot** cause a reorganization of the OP Stack chain without violating finality in Ethereum itself. Applications built on top of Ethereum typically operate under the assumption that such a violation is not possible. -* Withdrawal delays are an application-level security feature specific to the Optimism bridge. +In summary: -* These delays impact only L1 withdrawals and do not affect the L2 protocol's transaction finality. - -* This distinction ensures that the core protocol maintains efficiency and quick finalization for L2 transactions. +* The Sequencer **can** cause a reorganization of **"unsafe"** blocks that have not yet been published to Ethereum (within ~5-10 minutes). +* The Sequencer **could** cause a reorgnization of **"safe** blocks that have been published to Ethereum but not yet included in a finalized Ethereum block (within ~15-30 minutes). To do this, the Sequencer would need to be able to intentionally cause a reorganization of Ethereum itself. +* The Sequencer **cannot** cause a reorganizaton of **"finalized"** blocks that have been included in a finalized Ethereum block (after ~15-30 minutes) without violating Ethereum's finality guarantees. -### Bridge independence +### Misconception: Ethereum reorgs will cause reorgs on the OP Stack chain -Key aspects of bridge systems include: +When we touched on the misconception that the [Sequencer can always reorganize the chain](#misconception-the-sequencer-can-always-reorganize-the-chain) above we noted that transactions that are **"unsafe"** or **"safe"** could be impacted by reorganizations of Ethereum itself. Although it's unlikely for the Sequencer to be able to affect such a reorganization intentionally, Ethereum reorganizations *do* occur from time to time. -* Bridges are application-level constructs. -* They operate independently of the core OP Stack protocol. -* Bridge security does not affect the validity of L2 transactions. -* Bridge failures do not cause L2 reorgs or state changes. +When a reorganization occurs on Ethereum, assuming that the Sequencer is not intentionally triggering this reorg, the OP Stack chain will attempt to gracefully recover. OP Stack nodes will automatically downgrade **"safe"** transactions back into **"unsafe"** transactions if necessary. At the same time, the Sequencer will begin the process of publishing transaction data again to re-establish the original chain. -For example, a custom bridge might be developed to allow ERC-20 tokens to move between layers. However, this bridge is application-level and not native to the OP Stack. If there is an issue with the bridge, such as incorrect proof validation, it does not impact the protocol itself but affects the subjective value of the bridged assets. +Graceful handling of Ethereum reorgs means that an OP Stack chain will typically recover without experiencing any sort of reorganization itself. In rare cases, extreme Ethereum network conditions *could* cause reorganizations of an OP Stack chain, but **"finalized"** OP Stack chain transactions can **never** be reorganized. ## Conclusion -Transaction finality in the OP Stack relies on Ethereum's consensus mechanism. The OP Stack inherits Ethereum's finality guarantees, while the proof system adds a layer of validation for app-level functionality. +Transaction finality in the OP Stack is a lot simpler than it seems. OP Stack chains utilize Ethereum for consensus and inherit Ethereum's finality guarantees as a result. Once your node reports an OP Stack chain transaction as **"finalized"**, it can't be reversed. From 476d473339b646ee48bcc780ed9587a3b53fe3dd Mon Sep 17 00:00:00 2001 From: Sean O'Connor Date: Fri, 1 Nov 2024 13:55:23 -0600 Subject: [PATCH 403/565] Update oracles.mdx Per conversation with Marine at the foundation we are adding blocknative to the list of gas providers --- pages/builders/tools/build/oracles.mdx | 3 +++ 1 file changed, 3 insertions(+) diff --git a/pages/builders/tools/build/oracles.mdx b/pages/builders/tools/build/oracles.mdx index f69f07fac..77ba3a07f 100644 --- a/pages/builders/tools/build/oracles.mdx +++ b/pages/builders/tools/build/oracles.mdx @@ -57,6 +57,9 @@ This is a push Oracle. OP Mainnet (and the testnets) updates the gas price parameters onchain whenever those parameters change. The L1 gas price, which can be volatile, is only pushed once every 5 minutes, and each time can change only by up to 20%. +* [Blocknative](https://docs.blocknative.com/gas-prediction) provides real-time gas estimation powered by predictive modeling to forecast gas price distribution for select OP Stack chains, including OP Mainnet and Base. The [API](https://docs.blocknative.com/gas-prediction) is also available on Ethereum Mainnet to estimate base fee costs. + + ### API3 The [API3 Market](https://market.api3.org/optimism) provides access to 200+ price feeds on [Optimism Mainnet](https://market.api3.org/optimism) and [Testnet](https://market.api3.org/optimism-sepolia-testnet). The price feeds operate as a native push oracle and can be activated instantly via the Market UI. From 9fd44facb811976cc570371faba3d6d3f268aa6f Mon Sep 17 00:00:00 2001 From: cpengilly <29023967+cpengilly@users.noreply.github.com> Date: Fri, 1 Nov 2024 13:01:47 -0700 Subject: [PATCH 404/565] viem updates - fix meta json file - add Viem as proper noun - update tutorial page to reflect --- nouns.txt | 3 ++- pages/builders/app-developers/tutorials/_meta.json | 2 +- .../app-developers/tutorials/cross-dom-bridge-eth.mdx | 8 ++++---- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/nouns.txt b/nouns.txt index fc2ef774d..be98afea6 100644 --- a/nouns.txt +++ b/nouns.txt @@ -16,4 +16,5 @@ Granite Holocene Monitorism Kubernetes -Fault Proof System \ No newline at end of file +Fault Proof System +Viem \ No newline at end of file diff --git a/pages/builders/app-developers/tutorials/_meta.json b/pages/builders/app-developers/tutorials/_meta.json index f98a8dbd1..45ddaf362 100644 --- a/pages/builders/app-developers/tutorials/_meta.json +++ b/pages/builders/app-developers/tutorials/_meta.json @@ -1,7 +1,7 @@ { "first-contract": "Deploying your first contract on OP Mainnet", "cross-dom-solidity": "Communicating between chains in Solidity", - "cross-dom-bridge-eth": "Bridging ETH with the Optimism SDK", + "cross-dom-bridge-eth": "Bridging ETH with Viem", "cross-dom-bridge-erc20": "Bridging ERC-20 tokens with the Optimism SDK", "standard-bridge-custom-token": "Bridging your custom ERC-20 token to OP Mainnet", "standard-bridge-standard-token": "Bridging your standard ERC-20 token to OP Mainnet", diff --git a/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx b/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx index 129d1f698..4d5e6a95c 100644 --- a/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx +++ b/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx @@ -1,12 +1,12 @@ --- -title: Bridging ETH with viem +title: Bridging ETH with Viem lang: en-US description: Learn how to use Viem to transfer ETH between Layer 1 (Ethereum or Sepolia) and Layer 2 (OP Mainnet or OP Sepolia). --- import { Callout, Steps, Tabs } from 'nextra/components' -# Bridging ETH to OP Mainnet with viem +# Bridging ETH to OP Mainnet with Viem This tutorial explains how you can use [Viem](https://viem.sh) to bridge ETH from L1 (Ethereum or Sepolia) to L2 (OP Mainnet or OP Sepolia). Viem is a TypeScript interface for Ethereum that provides low-level stateless primitives for interacting with Ethereum. @@ -45,7 +45,7 @@ Since Viem is a [Node.js](https://nodejs.org/en/) library, you'll need to create pnpm init ``` - {

    Install the viem library

    } + {

    Install the Viem library

    } ```bash pnpm add viem @@ -92,7 +92,7 @@ This will bring up a Node REPL prompt that allows you to run JavaScript code. You need to import some dependencies into your Node REPL session. -{

    Import viem and other packages

    } +{

    Import Viem and other packages

    } ```js file=/public/tutorials/cross-dom-bridge-eth.js#L3-L6 hash=88319dda3322e76accb9e50222d30abc ``` From 056d0b4444770e005b1fde55a9b38d262fbd9b01 Mon Sep 17 00:00:00 2001 From: cpengilly <29023967+cpengilly@users.noreply.github.com> Date: Fri, 1 Nov 2024 13:09:32 -0700 Subject: [PATCH 405/565] remove-wip-callout --- pages/builders/app-developers/tutorials/send-tx-from-eth.mdx | 2 -- 1 file changed, 2 deletions(-) diff --git a/pages/builders/app-developers/tutorials/send-tx-from-eth.mdx b/pages/builders/app-developers/tutorials/send-tx-from-eth.mdx index b971a8417..543de2792 100644 --- a/pages/builders/app-developers/tutorials/send-tx-from-eth.mdx +++ b/pages/builders/app-developers/tutorials/send-tx-from-eth.mdx @@ -5,9 +5,7 @@ description: Learn how to force transaction inclusion without the OP Stack Seque --- import { Callout, Steps } from 'nextra/components' -import { WipCallout } from '@/components/WipCallout' - # Triggering OP Stack transactions from Ethereum OP Stack currently uses a single-Sequencer block production model. From 51082cdd4b32380634f0262d9b499065d542281e Mon Sep 17 00:00:00 2001 From: soyboy <85043086+sbvegan@users.noreply.github.com> Date: Fri, 1 Nov 2024 16:20:47 -0600 Subject: [PATCH 406/565] update audit issue template --- .github/ISSUE_TEMPLATE/docs_audit_results.md | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/.github/ISSUE_TEMPLATE/docs_audit_results.md b/.github/ISSUE_TEMPLATE/docs_audit_results.md index 02e332e46..1bcbdc9c5 100644 --- a/.github/ISSUE_TEMPLATE/docs_audit_results.md +++ b/.github/ISSUE_TEMPLATE/docs_audit_results.md @@ -9,7 +9,25 @@ labels: 'docs-audit-2024-Q4,op-labs' ## Description of the updates required -> Write a description of the current state of the page. + + +### Acceptance criteria + + + +### Resources + + + +### Action items + + ## Github issue label criteria From 2e47a6014cfff36ee520237c850e1a23117bf678 Mon Sep 17 00:00:00 2001 From: soyboy <85043086+sbvegan@users.noreply.github.com> Date: Fri, 1 Nov 2024 21:33:57 -0600 Subject: [PATCH 407/565] porting changes over to OP Stack section --- pages/stack/differences.mdx | 32 ++++++++++++++++++++++++++++---- 1 file changed, 28 insertions(+), 4 deletions(-) diff --git a/pages/stack/differences.mdx b/pages/stack/differences.mdx index 85e10a265..4f925b6d2 100644 --- a/pages/stack/differences.mdx +++ b/pages/stack/differences.mdx @@ -11,6 +11,16 @@ import { Callout } from 'nextra/components' OP Stack chains are designed to be [EVM equivalent](https://web.archive.org/web/20231127160757/https://medium.com/ethereum-optimism/introducing-evm-equivalence-5c2021deb306) and introduces as few changes as possible to the Ethereum protocol. However, there are some minor differences between the behavior of Ethereum and OP Stack chains that developers should be aware of. +## Bridging + +### Bridging - Deposit Transactions + +Deposit transactions don't exist on L1's, and are how transactions on an L2 can be initiated from the L1. Importantly, this is how bridge applications can get L1 ETH or tokens into an L2 OP-Stack chain. You can read more on deposit transactions [here](/stack/protocol/rollup/deposit-flow). + +### Bridging - Withdrawal Transactions and Fault Proofs + +Withdrawal transactions are how the state of the L2 rollup can be proven to the L1. Often this involves users withdrawing tokens or ETH to the L1. Fault proofs are the mechanism by which withdrawal transactions are currently proven to the L1. You can read more about fault proofs [here](/stack/protocol/fault-proofs/explainer). + ## Opcodes | Opcode | Solidity Equivalent | Behavior | @@ -55,13 +65,27 @@ In all other cases, the transaction sender address is set according to the same Transactions on OP Stack chains must pay for an [L1 data fee](/stack/transactions/fees#the-l1-data-fee) on top of the standard [execution gas fee](/stack/transactions/fees#execution-gas-fee) you would expect on Ethereum. Refer to the guide on [OP Stack Transaction Fees](/stack/transactions/fees) for more information. -### EIP-1559 Parameters +You can use the [JS library viem](https://viem.sh/op-stack) to estimate the entire transaction gas costs, including the L1 Data Fee. + +### EIP-1559 parameters The base fee on OP Stack is, like Ethereum, computed via the [EIP-1559](https://notes.ethereum.org/@vbuterin/eip-1559-faq) mechanism. The EIP-1559 parameters used by OP Stack differ per chain. ### Mempool rules -By default, OP Stack chains do not have a large public mempool like Ethereum. -OP Stack mempools are typically only visible to the Sequencer of the given chain and transactions are generally executed in priority fee order (highest fee first). -This is not a required behavior and certain chains may choose to have a public mempool. +Unlike Ethereum, OP Stack chains do not have a public mempool. +The OP Stack mempool is currently only visible to the Sequencer. +The Sequencer executes transactions from the mempool in priority fee order (highest fee first). + +## Chain Finality + +Unlike L1s such as Ethereum OP-Stack chains have Unsafe, Safe, and Finalized Heads which indicate the state of finality for a given L2 block. Fault proofs do not impact the finalization of the L2 rollup, only the finalization of withdrawal transactions to the L1. You can read more about these [in the docs glossary](/resources/glossary#unsafe-l2-block). + +## What's Next + +There are various useful tools linked above. Here are a few more tools and links you may want to check out: + +* [OP-viem](https://viem.sh/op-stack): JS framework that can handle many of these unique functions on OP-Chains. It is similar to Ethers.js for op-stack chains. + +* [Specs](https://specs.optimism.io/root.html): For more in-depth technical explanations and examples. From f05971bc6561e9139e984f0e28e8d4124b2fe269 Mon Sep 17 00:00:00 2001 From: soyboy <85043086+sbvegan@users.noreply.github.com> Date: Fri, 1 Nov 2024 21:35:54 -0600 Subject: [PATCH 408/565] adding tag --- pages/stack/differences.mdx | 1 + 1 file changed, 1 insertion(+) diff --git a/pages/stack/differences.mdx b/pages/stack/differences.mdx index 4f925b6d2..dd9f4e70f 100644 --- a/pages/stack/differences.mdx +++ b/pages/stack/differences.mdx @@ -1,6 +1,7 @@ --- title: Differences between Ethereum and OP Stack Chains lang: en-US +tags: ["eng-protocol"] description: Learn the minor differences between the behavior of Ethereum and OP Stack chains. --- From bbc01e960f89374630b3f4cf4f0afb84842a7999 Mon Sep 17 00:00:00 2001 From: soyboy <85043086+sbvegan@users.noreply.github.com> Date: Fri, 1 Nov 2024 21:39:03 -0600 Subject: [PATCH 409/565] removing OPM diff page and adding redirect --- pages/chain/differences.mdx | 101 ------------------------------------ public/_redirects | 3 +- 2 files changed, 2 insertions(+), 102 deletions(-) delete mode 100644 pages/chain/differences.mdx diff --git a/pages/chain/differences.mdx b/pages/chain/differences.mdx deleted file mode 100644 index 4e1a0088f..000000000 --- a/pages/chain/differences.mdx +++ /dev/null @@ -1,101 +0,0 @@ ---- -title: Differences between Ethereum and OP Mainnet -lang: en-US -description: Learn the minor differences between the behavior of OP Mainnet and Ethereum. ---- - -import { Callout } from 'nextra/components' - -# Differences between Ethereum and OP Mainnet - -OP Mainnet is designed to be [EVM equivalent](https://web.archive.org/web/20231127160757/https://medium.com/ethereum-optimism/introducing-evm-equivalence-5c2021deb306) and introduces as few changes as possible to the Ethereum protocol. -However, there are some minor differences between the behavior of Ethereum and OP Mainnet that developers should be aware of. - -## Bridging - -### Bridging - Deposit Transactions - -Deposit transactions don't exist on L1's, and are how transactions on an L2 can be initiated from the L1. Importantly, this is how bridge applications can get L1 ETH or tokens into an L2 OP-Stack chain. You can read more on deposit transactions [here](/stack/protocol/rollup/deposit-flow). - -### Bridging - Withdrawal Transactions and Fault Proofs - -Withdrawal transactions are how the state of the L2 rollup can be proven to the L1. Often this involves users withdrawing tokens or ETH to the L1. Fault proofs are the mechanism by which withdrawal transactions are currently proven to the L1. You can read more about fault proofs [here](/stack/protocol/fault-proofs/explainer). - -## Opcodes - -| Opcode | Solidity Equivalent | Behavior | -| ------------ | ------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `COINBASE` | `block.coinbase` | Returns the address of the current Sequencer's fee wallet. Effectively the same as Ethereum with the caveat the value typically does not change from block to block. | -| `PREVRANDAO` | `block.prevrandao` | Set **pseudorandomly** for each block by the Sequencer as opposed to the stronger guarantees provided by [RANDAO](https://eips.ethereum.org/EIPS/eip-4399) on Ethereum. | -| `ORIGIN` | `tx.origin` | If the transaction is an L1 ⇒ L2 transaction triggered by a smart contract on L1, then `tx.origin` is set to the [aliased address](#address-aliasing) of the address that triggered the L1 ⇒ L2 transaction. Otherwise, this opcode behaves normally. | -| `CALLER` | `msg.sender` | If the transaction is an L1 ⇒ L2 transaction triggered by a smart contract on L1, and this is the first call frame (rather than an internal transaction from one contract to another), the same [address aliasing](#address-aliasing) behavior applies. | - -### Address aliasing - - - Address aliasing is an important security feature that impacts the behavior of transactions sent from L1 to L2 by smart contracts. - Make sure to read this section carefully if you are working with cross-chain transactions. - Note that the `CrossChainMessenger` contracts will handle address aliasing internally on your behalf. - - -When transactions are sent from L1 to L2 by an Externally Owned Account, the address of the sender of the transaction on L2 will be set to the address of the sender of the transaction on L1. -**However, the address of the sender of a transaction on L2 will be different if the transaction was triggered by a smart contract on L1**. - -Because of the behavior of the `CREATE` opcode, it is possible to create a contract on both L1 and on L2 that share the same address but have different bytecode. -Even though these contracts share the same address, they are fundamentally two different smart contracts and cannot be treated as the same contract. -As a result, the sender of a transaction sent from L1 to L2 by a smart contract cannot be the address of the smart contract on L1 or the smart contract on L1 could act as if it were the smart contract on L2 (because the two contracts share the same address). - -To prevent this sort of impersonation, the sender of a transaction is slightly modified when a transaction is sent from L1 to L2 by a smart contract. -Instead of appearing to be sent from the actual L1 contract address, the L2 transaction appears to be sent from an "aliased" version of the L1 contract address. -This aliased address is a constant offset from the actual L1 contract address such that the aliased address will never conflict with any other address on L2 and the original L1 address can easily be recovered from the aliased address. - -This change in sender address is only applied to L2 transactions sent by L1 smart contracts. -In all other cases, the transaction sender address is set according to the same rules used by Ethereum. - -| Transaction Source | Sender Address | -| ------------------------------------------------------- | ------------------------------------------------------------------ | -| L2 user (Externally Owned Account) | The user's address (same as in Ethereum) | -| L1 user (Externally Owned Account) | The user's address (same as in Ethereum) | -| L1 contract (using `OptimismPortal.depositTransaction`) | `L1_contract_address + 0x1111000000000000000000000000000000001111` | - -## Transactions - -### Transaction fees - -Transactions on OP Mainnet must pay for an [L1 data fee](/stack/transactions/fees#the-l1-data-fee) on top of the standard [execution gas fee](/stack/transactions/fees#execution-gas-fee) you would expect on Ethereum. -Refer to the guide on [OP Mainnet Transaction Fees](/stack/transactions/fees) for more information. - -You can use the [JS library viem](https://viem.sh/op-stack) to estimate the entire transaction gas costs, including the L1 Data Fee. - -### EIP-1559 parameters - -The base fee on OP Mainnet is, like Ethereum, computed via the [EIP-1559](https://notes.ethereum.org/@vbuterin/eip-1559-faq) mechanism. -The EIP-1559 parameters used by OP Mainnet differ from those used by Ethereum as follows. - -| Parameter | OP Mainnet value | Ethereum value (for reference) | -| ------------------------------------- | ---------------: | -----------------------------: | -| Block gas limit | 30,000,000 gas | 30,000,000 gas | -| Block gas target | 5,000,000 gas | 15,000,000 gas | -| EIP-1559 elasticity multiplier | 6 | 2 | -| EIP-1559 denominator | 250 | 8 | -| Maximum base fee increase (per block) | 2% | 12.5% | -| Maximum base fee decrease (per block) | 0.4% | 12.5% | -| Block time in seconds | 2 | 12 | - -### Mempool rules - -Unlike Ethereum, OP Mainnet does not have a large public mempool. -The OP Mainnet Sequencer mempool is currently only visible to the Sequencer. -The Sequencer executes transactions from the mempool in priority fee order (highest fee first). - -## Chain Finality - -Unlike L1s such as Ethereum OP-Stack chains have Unsafe, Safe, and Finalized Heads which indicate the state of finality for a given L2 block. Fault proofs do not impact the finalization of the L2 rollup, only the finalization of withdrawal transactions to the L1. You can read more about these [in the docs glossary](/resources/glossary#unsafe-l2-block). - -## What's Next - -There are various useful tools linked above. Here are a few more tools and links you may want to check out: - -* [OP-viem](https://viem.sh/op-stack): JS framework that can handle many of these unique functions on OP-Chains. It is similar to Ethers.js for op-stack chains. - -* [Specs](https://specs.optimism.io/root.html): For more in-depth technical explanations and examples. diff --git a/public/_redirects b/public/_redirects index 55ee480e3..3eb5cb69c 100644 --- a/public/_redirects +++ b/public/_redirects @@ -103,4 +103,5 @@ /stack/operators/features/op-txproxy /builders/chain-operators/tools/op-txproxy /stack/operators/features/proxyd /builders/chain-operators/tools/proxyd /builders/notices/granite-changes https://github.com/ethereum-optimism/docs/blob/ef619668ae44276edecdfd657157254b9809e2d6/pages/builders/notices/granite-changes.mdx -/builders/notices/fp-changes https://github.com/ethereum-optimism/docs/blob/ef619668ae44276edecdfd657157254b9809e2d6/pages/builders/notices/fp-changes.mdx \ No newline at end of file +/builders/notices/fp-changes https://github.com/ethereum-optimism/docs/blob/ef619668ae44276edecdfd657157254b9809e2d6/pages/builders/notices/fp-changes.mdx +/chain/differences /stack/differences \ No newline at end of file From 0b87d150d1b97ba1bdc4f55a7ed47ce16a404dc5 Mon Sep 17 00:00:00 2001 From: soyboy <85043086+sbvegan@users.noreply.github.com> Date: Fri, 1 Nov 2024 21:44:32 -0600 Subject: [PATCH 410/565] removing nav link --- pages/chain/_meta.json | 1 - 1 file changed, 1 deletion(-) diff --git a/pages/chain/_meta.json b/pages/chain/_meta.json index 26c4d8459..6c45f77d2 100644 --- a/pages/chain/_meta.json +++ b/pages/chain/_meta.json @@ -1,6 +1,5 @@ { "getting-started": "Getting started: OP Mainnet", - "differences": "Differences between Ethereum and OP Mainnet", "networks": "Networks and RPC Endpoints", "addresses": "Contract addresses", "tokenlist": "Bridged token addresses", From 1816ac8767cbfc2e45200c3cc1035c77e38b44ca Mon Sep 17 00:00:00 2001 From: soyboy <85043086+sbvegan@users.noreply.github.com> Date: Fri, 1 Nov 2024 21:48:05 -0600 Subject: [PATCH 411/565] removing hyphens --- pages/stack/differences.mdx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pages/stack/differences.mdx b/pages/stack/differences.mdx index dd9f4e70f..9d6e6250c 100644 --- a/pages/stack/differences.mdx +++ b/pages/stack/differences.mdx @@ -16,7 +16,7 @@ However, there are some minor differences between the behavior of Ethereum and O ### Bridging - Deposit Transactions -Deposit transactions don't exist on L1's, and are how transactions on an L2 can be initiated from the L1. Importantly, this is how bridge applications can get L1 ETH or tokens into an L2 OP-Stack chain. You can read more on deposit transactions [here](/stack/protocol/rollup/deposit-flow). +Deposit transactions don't exist on L1's, and are how transactions on an L2 can be initiated from the L1. Importantly, this is how bridge applications can get L1 ETH or tokens into an L2 OP Stack chain. You can read more on deposit transactions [here](/stack/protocol/rollup/deposit-flow). ### Bridging - Withdrawal Transactions and Fault Proofs @@ -81,12 +81,12 @@ The Sequencer executes transactions from the mempool in priority fee order (high ## Chain Finality -Unlike L1s such as Ethereum OP-Stack chains have Unsafe, Safe, and Finalized Heads which indicate the state of finality for a given L2 block. Fault proofs do not impact the finalization of the L2 rollup, only the finalization of withdrawal transactions to the L1. You can read more about these [in the docs glossary](/resources/glossary#unsafe-l2-block). +Unlike L1s such as Ethereum, OP Stack chains have Unsafe, Safe, and Finalized Heads which indicate the state of finality for a given L2 block. Fault proofs do not impact the finalization of the L2 rollup, only the finalization of withdrawal transactions to the L1. You can read more about these [in the docs glossary](/resources/glossary#unsafe-l2-block). ## What's Next There are various useful tools linked above. Here are a few more tools and links you may want to check out: -* [OP-viem](https://viem.sh/op-stack): JS framework that can handle many of these unique functions on OP-Chains. It is similar to Ethers.js for op-stack chains. +* [OP-viem](https://viem.sh/op-stack): JS framework that can handle many of these unique functions on OP Chains. It is similar to Ethers.js for OP Stack chains. * [Specs](https://specs.optimism.io/root.html): For more in-depth technical explanations and examples. From 2d1ec2c5db44cd1694647f74eaea3babd9b18be2 Mon Sep 17 00:00:00 2001 From: soyboy <85043086+sbvegan@users.noreply.github.com> Date: Fri, 1 Nov 2024 22:09:44 -0600 Subject: [PATCH 412/565] adding bedrocks activation time --- pages/builders/node-operators/network-upgrades.mdx | 7 ++++++- words.txt | 4 +--- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/pages/builders/node-operators/network-upgrades.mdx b/pages/builders/node-operators/network-upgrades.mdx index 40f2c38f5..21eb14257 100644 --- a/pages/builders/node-operators/network-upgrades.mdx +++ b/pages/builders/node-operators/network-upgrades.mdx @@ -28,10 +28,11 @@ that are pending governance approval. | [Ecotone](https://specs.optimism.io/protocol/ecotone/overview.html) | [approved](https://gov.optimism.io/t/upgrade-proposal-5-ecotone-network-upgrade/7669) | Thu Mar 14 00:00:01 UTC 2024 (`1710374401`) around block `117387812` | Wed Feb 21 17:00:00 UTC 2024 (`1708534800`) around block `8366130` | | [Delta](https://specs.optimism.io/protocol/delta/overview.html) | [approved](https://gov.optimism.io/t/final-upgrade-proposal-3-delta-network-upgrade/7310) | Thu Feb 22 00:00:00 UTC 2024 (`1708560000`) around block `116480612` | Fri Dec 22 00:00:00 UTC 2023 (`1703203200`) around block `5700330` | | [Canyon](https://specs.optimism.io/protocol/canyon/overview.html) | [approved](https://gov.optimism.io/t/final-upgrade-proposal-2-canyon-network-upgrade/7088) | Thu Jan 11 17:00:01 UTC 2024 (`1704992401`) around block `114696812` | Tue Nov 14 17:00:00 UTC 2023 (`1699981200`) around block `4089330` | +| Bedrock | [approved](https://gov.optimism.io/t/final-upgrade-1-bedrock-protocol-upgrade-v2/5548) | Tu Jun 06 2023 04:28:23 PM (`1686079703`) at block `105235063` | N/A | ## Summary of changes -These are the summaries of each network upgrade changes ordered by the most +These are the summaries of each network upgrade changes ordered by the most recent activation. These are a reflection of the [Superchain Upgrades Specifications](https://specs.optimism.io/protocol/superchain-upgrades.html) ### [Granite](https://specs.optimism.io/protocol/granite/overview.html) @@ -112,6 +113,10 @@ The Canyon upgrade uses a *L2 block-timestamp* activation-rule, and is specified rollup-node (`canyon_time`) and execution engine (`config.canyonTime`). Shanghai time in the execution engine should be set to the same time as the Canyon time. +### Bedrock + +The Bedrock upgrade transitioned the OP Stack from its legacy design to a modern modular architecture. This new design separates the OP Stack into distinct consensus, execution, and settlement layers, enabling more efficient integration of future improvements and facilitating the growth of a Superchain ecosystem. + ## Upgrade process Network upgrades follow this general process in which the features included in diff --git a/words.txt b/words.txt index 2e0d2c443..bb3b5f541 100644 --- a/words.txt +++ b/words.txt @@ -9,7 +9,6 @@ airgap Allnodes Allocs allocs -altda ANDI Ankr Apeworx @@ -77,7 +76,6 @@ datacap DATADIR datadir Dencun -derviation Devnet devnet Devnode @@ -409,4 +407,4 @@ xtensibility ZKPs ZKVM Zora -zora \ No newline at end of file +zora From 69ee5d3b6ce87395d4dccd117f426a2253eb410e Mon Sep 17 00:00:00 2001 From: krofax Date: Mon, 4 Nov 2024 13:56:47 +0100 Subject: [PATCH 413/565] fix lint issues --- .../builders/node-operators/management/metrics.mdx | 4 ++-- words.txt | 13 +------------ 2 files changed, 3 insertions(+), 14 deletions(-) diff --git a/pages/builders/node-operators/management/metrics.mdx b/pages/builders/node-operators/management/metrics.mdx index b7aedea32..85fbebb2c 100644 --- a/pages/builders/node-operators/management/metrics.mdx +++ b/pages/builders/node-operators/management/metrics.mdx @@ -33,10 +33,10 @@ A complete list of available metrics is below: | op\_node\_default\_rpc\_client\_requests\_total | Total RPC requests initiated by the opnode's RPC client | method | counter | | op\_node\_default\_rpc\_client\_request\_duration\_seconds | Histogram of RPC client request durations | method | histogram | | op\_node\_default\_rpc\_client\_responses\_total | Total RPC request responses received by the opnode's RPC client | method,error | counter | -| op\_node\_default\_l1\_source\_cache\_size | L1 Source cache size | type | gauge | +| op\_node\_default\_l1\_source\_cache\_size | L1 Source cache size | type | gauge | | op\_node\_default\_l1\_source\_cache\_get | L1 Source cache lookups, hitting or not | type,hit | counter | | op\_node\_default\_l1\_source\_cache\_add | L1 Source cache additions, evicting previous values or not | type,evicted | counter | -| op\_node\_default\_l2\_source\_cache\_size | L2 Source cache size | type | gauge | +| op\_node\_default\_l2\_source\_cache\_size | L2 Source cache size | type | gauge | | op\_node\_default\_l2\_source\_cache\_get | L2 Source cache lookups, hitting or not | type,hit | counter | | op\_node\_default\_l2\_source\_cache\_add | L2 Source cache additions, evicting previous values or not | type,evicted | counter | | op\_node\_default\_derivation\_idle | 1 if the derivation pipeline is idle | | gauge | diff --git a/words.txt b/words.txt index 2e0d2c443..b1249fcf6 100644 --- a/words.txt +++ b/words.txt @@ -11,7 +11,6 @@ Allocs allocs altda ANDI -Ankr Apeworx Arweave authrpc @@ -77,7 +76,6 @@ datacap DATADIR datadir Dencun -derviation Devnet devnet Devnode @@ -150,7 +148,6 @@ Holesky holesky IGNOREPRICE ignoreprice -Immunefi implicity Inator inator @@ -199,7 +196,6 @@ minsuggestedpriorityfee Mintable Mintplex MIPSEVM -Mitigations Monitorism Moralis Mordor @@ -293,8 +289,6 @@ Protip Proxied proxyd pseudorandomly -Pyth -Pyth's QRNG Quicknode quicknode @@ -329,9 +323,6 @@ safedb Schnorr secp SELFDESTRUCT -SEPOLIA -Sepolia -sepolia seqnr SEQUENCERHTTP sequencerhttp @@ -376,7 +367,6 @@ Thirdweb threadcreate tility timeseries -Tranfer trustlessly trustrpc txfeecap @@ -400,7 +390,6 @@ VMDEBUG vmdebug VMODULE vmodule -voxel wagmi Warpcast xlarge @@ -409,4 +398,4 @@ xtensibility ZKPs ZKVM Zora -zora \ No newline at end of file +zora From 479804cdc84855fe2dfe06396142e85d4366abba Mon Sep 17 00:00:00 2001 From: krofax Date: Mon, 4 Nov 2024 14:03:25 +0100 Subject: [PATCH 414/565] updated word --- words.txt | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/words.txt b/words.txt index b1249fcf6..2e0d2c443 100644 --- a/words.txt +++ b/words.txt @@ -11,6 +11,7 @@ Allocs allocs altda ANDI +Ankr Apeworx Arweave authrpc @@ -76,6 +77,7 @@ datacap DATADIR datadir Dencun +derviation Devnet devnet Devnode @@ -148,6 +150,7 @@ Holesky holesky IGNOREPRICE ignoreprice +Immunefi implicity Inator inator @@ -196,6 +199,7 @@ minsuggestedpriorityfee Mintable Mintplex MIPSEVM +Mitigations Monitorism Moralis Mordor @@ -289,6 +293,8 @@ Protip Proxied proxyd pseudorandomly +Pyth +Pyth's QRNG Quicknode quicknode @@ -323,6 +329,9 @@ safedb Schnorr secp SELFDESTRUCT +SEPOLIA +Sepolia +sepolia seqnr SEQUENCERHTTP sequencerhttp @@ -367,6 +376,7 @@ Thirdweb threadcreate tility timeseries +Tranfer trustlessly trustrpc txfeecap @@ -390,6 +400,7 @@ VMDEBUG vmdebug VMODULE vmodule +voxel wagmi Warpcast xlarge @@ -398,4 +409,4 @@ xtensibility ZKPs ZKVM Zora -zora +zora \ No newline at end of file From 5ced9a3525f56a13f08d49a1bd8f8438e643fea3 Mon Sep 17 00:00:00 2001 From: krofax Date: Mon, 4 Nov 2024 14:28:04 +0100 Subject: [PATCH 415/565] updated check breadcrumb script --- .github/workflows/breadcrumbs.yml | 32 +++++++++++++++++++++ package.json | 2 +- pages/stack/beta-features/beta-features.mdx | 5 ++-- pages/stack/fault-proofs/fault-proofs.mdx | 7 +---- pages/stack/features/features.mdx | 2 +- pages/stack/interop/interop.mdx | 6 +--- pages/stack/research/research.mdx | 2 +- pages/stack/rollup/rollup.mdx | 4 +-- pages/stack/security/security.mdx | 3 +- pages/stack/transactions/transactions.mdx | 7 +---- 10 files changed, 42 insertions(+), 28 deletions(-) create mode 100644 .github/workflows/breadcrumbs.yml diff --git a/.github/workflows/breadcrumbs.yml b/.github/workflows/breadcrumbs.yml new file mode 100644 index 000000000..a077cf137 --- /dev/null +++ b/.github/workflows/breadcrumbs.yml @@ -0,0 +1,32 @@ +name: Check Breadcrumbs + +on: + push: + branches: [ main ] + pull_request: + branches: [ main ] + paths: + - 'pages/**/*.mdx' + - 'pages/**/*.md' + +jobs: + check-breadcrumbs: + runs-on: ubuntu-latest + + steps: + - name: Check out code + uses: actions/checkout@v2 + + - name: Set up Node.js + uses: actions/setup-node@v2 + with: + node-version: '20.x' + + - name: Install pnpm + run: npm install -g pnpm + + - name: Install dependencies + run: pnpm install + + - name: Run breadcrumb check + run: pnpm check-breadcrumbs \ No newline at end of file diff --git a/package.json b/package.json index 868eb0a41..708767dc9 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,7 @@ "spellcheck:lint": "cspell lint \"**/*.mdx\"", "spellcheck:fix": "cspell --words-only --unique \"**/*.mdx\" | sort --ignore-case | uniq > words.txt", "linkcheck": "lychee --config ./lychee.toml --quiet \"./pages\"", - "create-breadcrumbs":"npx ts-node --skip-project utils/create-breadcrumbs.ts", + "breadcrumbs":"npx ts-node --skip-project utils/create-breadcrumbs.ts", "check-breadcrumbs":"npx ts-node --skip-project utils/check-breadcrumbs.ts", "index:docs": "npx ts-node --skip-project utils/algolia-indexer.ts", "dev": "next dev", diff --git a/pages/stack/beta-features/beta-features.mdx b/pages/stack/beta-features/beta-features.mdx index 011c86b66..bfdd3a164 100644 --- a/pages/stack/beta-features/beta-features.mdx +++ b/pages/stack/beta-features/beta-features.mdx @@ -6,12 +6,11 @@ lang: en-US import { Card, Cards } from 'nextra/components' -# Beta features +# Beta Features Documentation covering Alt Da Mode, Custom Gas Token in the Beta Features section of the OP Stack ecosystem. - - + \ No newline at end of file diff --git a/pages/stack/fault-proofs/fault-proofs.mdx b/pages/stack/fault-proofs/fault-proofs.mdx index 4da08bb26..0f49365ab 100644 --- a/pages/stack/fault-proofs/fault-proofs.mdx +++ b/pages/stack/fault-proofs/fault-proofs.mdx @@ -12,14 +12,9 @@ Documentation covering Cannon, Challenger, Explainer, Fp Components, Fp Security - - - - - - + \ No newline at end of file diff --git a/pages/stack/features/features.mdx b/pages/stack/features/features.mdx index 84cad55a4..7f5e479cd 100644 --- a/pages/stack/features/features.mdx +++ b/pages/stack/features/features.mdx @@ -12,4 +12,4 @@ Documentation covering Send Raw Transaction Conditional in the Features section - + \ No newline at end of file diff --git a/pages/stack/interop/interop.mdx b/pages/stack/interop/interop.mdx index 952e51872..76d4d8a95 100644 --- a/pages/stack/interop/interop.mdx +++ b/pages/stack/interop/interop.mdx @@ -12,12 +12,8 @@ Documentation covering Cross Chain Message, Explainer, Superchain Erc20, Supersi - - - - - + \ No newline at end of file diff --git a/pages/stack/research/research.mdx b/pages/stack/research/research.mdx index 1a485ee0f..c530c1be8 100644 --- a/pages/stack/research/research.mdx +++ b/pages/stack/research/research.mdx @@ -12,4 +12,4 @@ Documentation covering Block Time Research in the Research section of the OP Sta - + \ No newline at end of file diff --git a/pages/stack/rollup/rollup.mdx b/pages/stack/rollup/rollup.mdx index ca95c2564..15d96a31c 100644 --- a/pages/stack/rollup/rollup.mdx +++ b/pages/stack/rollup/rollup.mdx @@ -12,8 +12,6 @@ The big idea that makes Optimism possible is the Optimistic Rollup. We'll go thr - - - + \ No newline at end of file diff --git a/pages/stack/security/security.mdx b/pages/stack/security/security.mdx index fbf62b199..d770098b3 100644 --- a/pages/stack/security/security.mdx +++ b/pages/stack/security/security.mdx @@ -12,6 +12,5 @@ Documentation covering Faq, Pause in the Security section of the OP Stack ecosys - - + \ No newline at end of file diff --git a/pages/stack/transactions/transactions.mdx b/pages/stack/transactions/transactions.mdx index 02d703c69..c084cfc8f 100644 --- a/pages/stack/transactions/transactions.mdx +++ b/pages/stack/transactions/transactions.mdx @@ -12,14 +12,9 @@ Documentation covering Cross Domain, Deposit Flow, Fees, Forced Transaction, Tra - - - - - - + \ No newline at end of file From f782dab6e38de309f9a1694f21324eb2efc2f1d3 Mon Sep 17 00:00:00 2001 From: krofax Date: Mon, 4 Nov 2024 14:30:18 +0100 Subject: [PATCH 416/565] updated script --- .github/workflows/check-breadcrumbs.yml | 32 ---------------- package.json | 2 +- utils/breadcrumbs.ts | 51 +++++++++++++++++++++++++ utils/check-breadcrumbs.ts | 0 4 files changed, 52 insertions(+), 33 deletions(-) delete mode 100644 .github/workflows/check-breadcrumbs.yml create mode 100644 utils/breadcrumbs.ts delete mode 100644 utils/check-breadcrumbs.ts diff --git a/.github/workflows/check-breadcrumbs.yml b/.github/workflows/check-breadcrumbs.yml deleted file mode 100644 index a077cf137..000000000 --- a/.github/workflows/check-breadcrumbs.yml +++ /dev/null @@ -1,32 +0,0 @@ -name: Check Breadcrumbs - -on: - push: - branches: [ main ] - pull_request: - branches: [ main ] - paths: - - 'pages/**/*.mdx' - - 'pages/**/*.md' - -jobs: - check-breadcrumbs: - runs-on: ubuntu-latest - - steps: - - name: Check out code - uses: actions/checkout@v2 - - - name: Set up Node.js - uses: actions/setup-node@v2 - with: - node-version: '20.x' - - - name: Install pnpm - run: npm install -g pnpm - - - name: Install dependencies - run: pnpm install - - - name: Run breadcrumb check - run: pnpm check-breadcrumbs \ No newline at end of file diff --git a/package.json b/package.json index 708767dc9..2e9eabf66 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,7 @@ "spellcheck:fix": "cspell --words-only --unique \"**/*.mdx\" | sort --ignore-case | uniq > words.txt", "linkcheck": "lychee --config ./lychee.toml --quiet \"./pages\"", "breadcrumbs":"npx ts-node --skip-project utils/create-breadcrumbs.ts", - "check-breadcrumbs":"npx ts-node --skip-project utils/check-breadcrumbs.ts", + "check-breadcrumbs":"npx ts-node --skip-project utils/breadcrumbs.ts", "index:docs": "npx ts-node --skip-project utils/algolia-indexer.ts", "dev": "next dev", "build": "next build", diff --git a/utils/breadcrumbs.ts b/utils/breadcrumbs.ts new file mode 100644 index 000000000..175eeedcd --- /dev/null +++ b/utils/breadcrumbs.ts @@ -0,0 +1,51 @@ +import * as fs from 'fs/promises'; +import * as path from 'path'; + +const rootDir = path.join(process.cwd(), 'pages'); +const errors: string[] = []; + +async function checkDirectory(dirPath: string): Promise { + const entries = await fs.readdir(dirPath, { withFileTypes: true }); + + for (const entry of entries) { + if (entry.name.startsWith('_') || entry.name.startsWith('.')) continue; + + const fullPath = path.join(dirPath, entry.name); + + if (entry.isDirectory()) { + // Skip if it's the root directory + if (fullPath === rootDir) continue; + + // Check if breadcrumb file exists for this directory + const breadcrumbFile = path.join(dirPath, `${entry.name}.mdx`); + try { + await fs.access(breadcrumbFile); + } catch { + const relativePath = path.relative(rootDir, dirPath); + errors.push(`Missing breadcrumb file for directory: ${relativePath}/${entry.name}`); + } + + // Recursively check subdirectories + await checkDirectory(fullPath); + } + } +} + +async function main() { + try { + await checkDirectory(rootDir); + + if (errors.length > 0) { + console.error('Breadcrumb check failed:'); + errors.forEach(error => console.error(`- ${error}`)); + process.exit(1); + } else { + console.log('All directories have breadcrumb files.'); + } + } catch (error) { + console.error('Error checking breadcrumbs:', error); + process.exit(1); + } +} + +main(); \ No newline at end of file diff --git a/utils/check-breadcrumbs.ts b/utils/check-breadcrumbs.ts deleted file mode 100644 index e69de29bb..000000000 From 66d7e38975739a169838b5cff793ba3dabe2c02c Mon Sep 17 00:00:00 2001 From: krofax Date: Mon, 4 Nov 2024 14:38:31 +0100 Subject: [PATCH 417/565] updated breadcrumbs script --- utils/breadcrumbs.ts | 59 ++++++++++++++++++++++++++++++++++---------- 1 file changed, 46 insertions(+), 13 deletions(-) diff --git a/utils/breadcrumbs.ts b/utils/breadcrumbs.ts index 175eeedcd..13efab02f 100644 --- a/utils/breadcrumbs.ts +++ b/utils/breadcrumbs.ts @@ -1,32 +1,65 @@ import * as fs from 'fs/promises'; import * as path from 'path'; +import matter from 'gray-matter'; const rootDir = path.join(process.cwd(), 'pages'); const errors: string[] = []; +interface PageInfo { + title: string; + url: string; +} + +async function getReferencedPages(breadcrumbContent: string): Promise { + // Extract URLs from Card components in the breadcrumb file + const cardRegex = /]*href="([^"]+)"[^>]*>/g; + const urls: string[] = []; + let match; + + while ((match = cardRegex.exec(breadcrumbContent)) !== null) { + urls.push(match[1]); + } + + return urls; +} + async function checkDirectory(dirPath: string): Promise { const entries = await fs.readdir(dirPath, { withFileTypes: true }); + // First, find the breadcrumb file for this directory + const dirName = path.basename(dirPath); + const breadcrumbFile = path.join(dirPath, `${dirName}.mdx`); + let referencedPages: string[] = []; + + try { + const breadcrumbContent = await fs.readFile(breadcrumbFile, 'utf-8'); + referencedPages = await getReferencedPages(breadcrumbContent); + } catch (error) { + // Only check for missing references if not in root directory + if (dirPath !== rootDir) { + errors.push(`Missing breadcrumb file for directory: ${path.relative(rootDir, dirPath)}`); + return; + } + } + + // Check each entry in the directory for (const entry of entries) { if (entry.name.startsWith('_') || entry.name.startsWith('.')) continue; const fullPath = path.join(dirPath, entry.name); if (entry.isDirectory()) { - // Skip if it's the root directory - if (fullPath === rootDir) continue; - - // Check if breadcrumb file exists for this directory - const breadcrumbFile = path.join(dirPath, `${entry.name}.mdx`); - try { - await fs.access(breadcrumbFile); - } catch { - const relativePath = path.relative(rootDir, dirPath); - errors.push(`Missing breadcrumb file for directory: ${relativePath}/${entry.name}`); - } - // Recursively check subdirectories await checkDirectory(fullPath); + } else if ((entry.name.endsWith('.md') || entry.name.endsWith('.mdx')) && + entry.name !== `${dirName}.mdx`) { + // Check if this page is referenced in the breadcrumb + const relativePath = '/' + path.relative(rootDir, fullPath) + .replace(/\.(md|mdx)$/, ''); + + if (!referencedPages.includes(relativePath)) { + errors.push(`Page not referenced in breadcrumb: ${relativePath}`); + } } } } @@ -40,7 +73,7 @@ async function main() { errors.forEach(error => console.error(`- ${error}`)); process.exit(1); } else { - console.log('All directories have breadcrumb files.'); + console.log('All pages are properly referenced in breadcrumb navigation.'); } } catch (error) { console.error('Error checking breadcrumbs:', error); From 6633952ee6ad07317885dbec2fda637d61565e8b Mon Sep 17 00:00:00 2001 From: krofax Date: Mon, 4 Nov 2024 15:16:10 +0100 Subject: [PATCH 418/565] updated script file --- package.json | 2 +- utils/breadcrumbs.ts | 107 +++++++++++++++++++----------------- utils/create-breadcrumbs.ts | 10 +--- words.txt | 9 --- 4 files changed, 61 insertions(+), 67 deletions(-) diff --git a/package.json b/package.json index 2e9eabf66..8d3429ef8 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "description": "Optimism Docs", "scripts": { "lint": "eslint . --ext mdx --max-warnings 0 && pnpm spellcheck:lint", - "fix": "eslint . --ext mdx --fix && pnpm spellcheck:fix", + "fix": "eslint . --ext mdx --fix && pnpm spellcheck:fix && pnpm check-breadcrumbs", "spellcheck:lint": "cspell lint \"**/*.mdx\"", "spellcheck:fix": "cspell --words-only --unique \"**/*.mdx\" | sort --ignore-case | uniq > words.txt", "linkcheck": "lychee --config ./lychee.toml --quiet \"./pages\"", diff --git a/utils/breadcrumbs.ts b/utils/breadcrumbs.ts index 13efab02f..f93225dc7 100644 --- a/utils/breadcrumbs.ts +++ b/utils/breadcrumbs.ts @@ -3,63 +3,70 @@ import * as path from 'path'; import matter from 'gray-matter'; const rootDir = path.join(process.cwd(), 'pages'); -const errors: string[] = []; +const warnings: string[] = []; -interface PageInfo { - title: string; - url: string; -} +// ANSI color codes +const YELLOW = '\x1b[33m'; +const RESET = '\x1b[0m'; +const BOLD = '\x1b[1m'; -async function getReferencedPages(breadcrumbContent: string): Promise { - // Extract URLs from Card components in the breadcrumb file - const cardRegex = /]*href="([^"]+)"[^>]*>/g; - const urls: string[] = []; - let match; - - while ((match = cardRegex.exec(breadcrumbContent)) !== null) { - urls.push(match[1]); +// Pages to exclude from checks +const excludedPages = [ + '400.mdx', + '500.mdx', + 'index.mdx', + '404.mdx' +]; + +async function getReferencedPagesFromBreadcrumb(breadcrumbPath: string): Promise { + try { + const content = await fs.readFile(breadcrumbPath, 'utf-8'); + const cardMatches = content.match(/]*href="([^"]+)"[^>]*>/g) || []; + return cardMatches.map(match => { + const hrefMatch = match.match(/href="([^"]+)"/); + return hrefMatch ? hrefMatch[1] : ''; + }).filter(Boolean); + } catch (error) { + return []; } - - return urls; } async function checkDirectory(dirPath: string): Promise { const entries = await fs.readdir(dirPath, { withFileTypes: true }); + const currentDir = path.basename(dirPath); - // First, find the breadcrumb file for this directory - const dirName = path.basename(dirPath); - const breadcrumbFile = path.join(dirPath, `${dirName}.mdx`); - let referencedPages: string[] = []; - - try { - const breadcrumbContent = await fs.readFile(breadcrumbFile, 'utf-8'); - referencedPages = await getReferencedPages(breadcrumbContent); - } catch (error) { - // Only check for missing references if not in root directory - if (dirPath !== rootDir) { - errors.push(`Missing breadcrumb file for directory: ${path.relative(rootDir, dirPath)}`); - return; + // Skip the root directory check + if (dirPath !== rootDir) { + const breadcrumbPath = path.join(dirPath, `${currentDir}.mdx`); + const referencedPages = await getReferencedPagesFromBreadcrumb(breadcrumbPath); + + // Check all .mdx and .md files in the current directory + for (const entry of entries) { + if (entry.isFile() && + (entry.name.endsWith('.mdx') || entry.name.endsWith('.md')) && + !excludedPages.includes(entry.name) && + entry.name !== `${currentDir}.mdx`) { + + const pageName = entry.name.replace(/\.(md|mdx)$/, ''); + const relativePath = `/stack/${path.relative(rootDir, dirPath)}/${pageName}`.replace(/\\/g, '/'); + + if (!referencedPages.includes(relativePath)) { + const humanReadableName = pageName.split('-') + .map(word => word.charAt(0).toUpperCase() + word.slice(1)) + .join(' '); + + warnings.push( + `Page "${humanReadableName}" at path "${relativePath}" is not listed in the breadcrumb navigation of ${currentDir}.mdx` + ); + } + } } } - // Check each entry in the directory + // Process subdirectories for (const entry of entries) { - if (entry.name.startsWith('_') || entry.name.startsWith('.')) continue; - - const fullPath = path.join(dirPath, entry.name); - - if (entry.isDirectory()) { - // Recursively check subdirectories - await checkDirectory(fullPath); - } else if ((entry.name.endsWith('.md') || entry.name.endsWith('.mdx')) && - entry.name !== `${dirName}.mdx`) { - // Check if this page is referenced in the breadcrumb - const relativePath = '/' + path.relative(rootDir, fullPath) - .replace(/\.(md|mdx)$/, ''); - - if (!referencedPages.includes(relativePath)) { - errors.push(`Page not referenced in breadcrumb: ${relativePath}`); - } + if (entry.isDirectory() && !entry.name.startsWith('_') && !entry.name.startsWith('.')) { + await checkDirectory(path.join(dirPath, entry.name)); } } } @@ -68,15 +75,15 @@ async function main() { try { await checkDirectory(rootDir); - if (errors.length > 0) { - console.error('Breadcrumb check failed:'); - errors.forEach(error => console.error(`- ${error}`)); + if (warnings.length > 0) { + console.log(`${YELLOW}${BOLD}Missing pages in breadcrumb navigation:${RESET}`); + warnings.forEach(warning => console.log(`${YELLOW}- ${warning}${RESET}`)); process.exit(1); } else { - console.log('All pages are properly referenced in breadcrumb navigation.'); + console.log('All pages are properly listed in their respective breadcrumb navigation files.'); } } catch (error) { - console.error('Error checking breadcrumbs:', error); + console.log(`${YELLOW}${BOLD}Error checking breadcrumbs:${RESET}`, error); process.exit(1); } } diff --git a/utils/create-breadcrumbs.ts b/utils/create-breadcrumbs.ts index b6f2cf11f..c57c66ff4 100644 --- a/utils/create-breadcrumbs.ts +++ b/utils/create-breadcrumbs.ts @@ -18,19 +18,15 @@ function toTitleCase(str: string): string { } function extractFirstParagraph(content: string): string { - // Remove frontmatter + content = content.replace(/^---[\s\S]*?---/, ''); - // Remove import statements content = content.replace(/^import[\s\S]*?\n/gm, ''); - - // Remove HTML/MDX tags + content = content.replace(/<[^>]+>/g, ' '); - - // Remove markdown links but keep text + content = content.replace(/\[([^\]]+)\]\([^)]+\)/g, '$1'); - // Remove headers content = content.replace(/^#.+$/gm, ''); const paragraphs = content.split(/\n\n+/); diff --git a/words.txt b/words.txt index 82aba8f3d..d8b872516 100644 --- a/words.txt +++ b/words.txt @@ -11,7 +11,6 @@ Allocs allocs altda ANDI -Ankr Apeworx Arweave authrpc @@ -148,7 +147,6 @@ Holesky holesky IGNOREPRICE ignoreprice -Immunefi implicity Inator inator @@ -197,7 +195,6 @@ minsuggestedpriorityfee Mintable Mintplex MIPSEVM -Mitigations Monitorism Moralis Mordor @@ -291,8 +288,6 @@ Protip Proxied proxyd pseudorandomly -Pyth -Pyth's QRNG Quicknode quicknode @@ -326,9 +321,6 @@ safedb Schnorr secp SELFDESTRUCT -SEPOLIA -Sepolia -sepolia seqnr SEQUENCERHTTP sequencerhttp @@ -398,7 +390,6 @@ VMDEBUG vmdebug VMODULE vmodule -voxel wagmi Warpcast xlarge From cce0f5f6e0f333ce56c8141ccbaaf4418a0a0060 Mon Sep 17 00:00:00 2001 From: Veronica <42095633+Nicca42@users.noreply.github.com> Date: Mon, 4 Nov 2024 15:21:08 +0100 Subject: [PATCH 419/565] Update style-guide.mdx The American formatting of dates is incredibly confusing to the international audience. I highly recommend we update to the more accessible `yyyy/mm/dd` which also has the added benefit of automatically sorting any dated files by recent to oldest. --- pages/connect/contribute/style-guide.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/connect/contribute/style-guide.mdx b/pages/connect/contribute/style-guide.mdx index 786ddee81..dbca6be12 100644 --- a/pages/connect/contribute/style-guide.mdx +++ b/pages/connect/contribute/style-guide.mdx @@ -481,7 +481,7 @@ Please use `*` instead of `-` for items in a list. This maintains consistency ac * Use the full month, day, year format for dates whenever possible. Do not abbreviate the month. In a form or when space is limited, use slashes in the format of month/day/year without any leading zeros. - **Examples**: `January 10, 2014` or `1/10/2014` + **Examples**: `January 10, 2014` or `2024/01/10` * Spell out all numbers under 10. For numbers 10 and above, use the numeral. From dc924824475e08946febe1fb27609ba678640bc1 Mon Sep 17 00:00:00 2001 From: krofax Date: Mon, 4 Nov 2024 15:42:43 +0100 Subject: [PATCH 420/565] updated breadcrumbs --- .../stack/{beta-features => }/beta-features.mdx | 0 pages/stack/{fault-proofs => }/fault-proofs.mdx | 0 pages/stack/{features => }/features.mdx | 0 pages/stack/{interop => }/interop.mdx | 7 +++++-- pages/stack/{research => }/research.mdx | 0 pages/stack/{rollup => }/rollup.mdx | 0 pages/stack/security.mdx | 9 ++++----- pages/stack/security/security.mdx | 16 ---------------- pages/stack/transactions.mdx | 11 ++++++++--- utils/breadcrumbs.ts | 4 +++- words.txt | 4 +--- 11 files changed, 21 insertions(+), 30 deletions(-) rename pages/stack/{beta-features => }/beta-features.mdx (100%) rename pages/stack/{fault-proofs => }/fault-proofs.mdx (100%) rename pages/stack/{features => }/features.mdx (100%) rename pages/stack/{interop => }/interop.mdx (50%) rename pages/stack/{research => }/research.mdx (100%) rename pages/stack/{rollup => }/rollup.mdx (100%) delete mode 100644 pages/stack/security/security.mdx diff --git a/pages/stack/beta-features/beta-features.mdx b/pages/stack/beta-features.mdx similarity index 100% rename from pages/stack/beta-features/beta-features.mdx rename to pages/stack/beta-features.mdx diff --git a/pages/stack/fault-proofs/fault-proofs.mdx b/pages/stack/fault-proofs.mdx similarity index 100% rename from pages/stack/fault-proofs/fault-proofs.mdx rename to pages/stack/fault-proofs.mdx diff --git a/pages/stack/features/features.mdx b/pages/stack/features.mdx similarity index 100% rename from pages/stack/features/features.mdx rename to pages/stack/features.mdx diff --git a/pages/stack/interop/interop.mdx b/pages/stack/interop.mdx similarity index 50% rename from pages/stack/interop/interop.mdx rename to pages/stack/interop.mdx index 76d4d8a95..c16130077 100644 --- a/pages/stack/interop/interop.mdx +++ b/pages/stack/interop.mdx @@ -1,6 +1,6 @@ --- title: Interop -description: Documentation covering Cross Chain Message, Explainer, Superchain Erc20, Supersim, Transfer Superchainerc20 in the Interop section of the OP Stack ecosystem. +description: Documentation covering Cross Chain Message, Explainer, Message Passing, Op Supervisor, Superchain Erc20, Superchain Weth, Supersim, Transfer Superchainerc20 in the Interop section of the OP Stack ecosystem. lang: en-US --- @@ -8,12 +8,15 @@ import { Card, Cards } from 'nextra/components' # Interop -Documentation covering Cross Chain Message, Explainer, Superchain Erc20, Supersim, Transfer Superchainerc20 in the Interop section of the OP Stack ecosystem. +Documentation covering Cross Chain Message, Explainer, Message Passing, Op Supervisor, Superchain Erc20, Superchain Weth, Supersim, Transfer Superchainerc20 in the Interop section of the OP Stack ecosystem. + + + \ No newline at end of file diff --git a/pages/stack/research/research.mdx b/pages/stack/research.mdx similarity index 100% rename from pages/stack/research/research.mdx rename to pages/stack/research.mdx diff --git a/pages/stack/rollup/rollup.mdx b/pages/stack/rollup.mdx similarity index 100% rename from pages/stack/rollup/rollup.mdx rename to pages/stack/rollup.mdx diff --git a/pages/stack/security.mdx b/pages/stack/security.mdx index 11e8a0d7c..d770098b3 100644 --- a/pages/stack/security.mdx +++ b/pages/stack/security.mdx @@ -1,6 +1,6 @@ --- title: Security -description: This section provides information on op stack security faqs and pausing the bridge. +description: Documentation covering Faq, Pause in the Security section of the OP Stack ecosystem. lang: en-US --- @@ -8,10 +8,9 @@ import { Card, Cards } from 'nextra/components' # Security -This section provides information on op stack security faqs and pausing the bridge. +Documentation covering Faq, Pause in the Security section of the OP Stack ecosystem. - - + - + \ No newline at end of file diff --git a/pages/stack/security/security.mdx b/pages/stack/security/security.mdx deleted file mode 100644 index d770098b3..000000000 --- a/pages/stack/security/security.mdx +++ /dev/null @@ -1,16 +0,0 @@ ---- -title: Security -description: Documentation covering Faq, Pause in the Security section of the OP Stack ecosystem. -lang: en-US ---- - -import { Card, Cards } from 'nextra/components' - -# Security - -Documentation covering Faq, Pause in the Security section of the OP Stack ecosystem. - - - - - \ No newline at end of file diff --git a/pages/stack/transactions.mdx b/pages/stack/transactions.mdx index 929eea7c7..4d96e5736 100644 --- a/pages/stack/transactions.mdx +++ b/pages/stack/transactions.mdx @@ -8,8 +8,13 @@ import { Card, Cards } from 'nextra/components' # Transactions -This section provides information on . You'll find reference to help you understand and work with these topics. +This section provides information on transactions fees. - - + + + + + + + \ No newline at end of file diff --git a/utils/breadcrumbs.ts b/utils/breadcrumbs.ts index f93225dc7..d433df892 100644 --- a/utils/breadcrumbs.ts +++ b/utils/breadcrumbs.ts @@ -48,7 +48,9 @@ async function checkDirectory(dirPath: string): Promise { entry.name !== `${currentDir}.mdx`) { const pageName = entry.name.replace(/\.(md|mdx)$/, ''); - const relativePath = `/stack/${path.relative(rootDir, dirPath)}/${pageName}`.replace(/\\/g, '/'); + // Dynamically construct the path relative to the pages directory + const relativePath = '/' + path.relative(rootDir, path.join(dirPath, pageName)) + .replace(/\\/g, '/'); if (!referencedPages.includes(relativePath)) { const humanReadableName = pageName.split('-') diff --git a/words.txt b/words.txt index 3c944eadb..f4e2c979a 100644 --- a/words.txt +++ b/words.txt @@ -9,7 +9,6 @@ airgap Allnodes Allocs allocs -altda ANDI Apeworx Arweave @@ -76,7 +75,6 @@ datacap DATADIR datadir Dencun -derviation Devnet devnet Devnode @@ -401,4 +399,4 @@ xtensibility ZKPs ZKVM Zora -zora \ No newline at end of file +zora From 8d26531a1d73489bee49123bc03be28378c93675 Mon Sep 17 00:00:00 2001 From: krofax Date: Mon, 4 Nov 2024 16:30:31 +0100 Subject: [PATCH 421/565] updated creadcrumbs --- pages/builders/app-developers.mdx | 25 +++---- pages/builders/cex-wallet-developers.mdx | 17 ++--- pages/builders/chain-operators.mdx | 20 ++--- pages/builders/node-operators.mdx | 19 ++--- pages/builders/notices.mdx | 8 +- pages/builders/tools.mdx | 13 +--- pages/chain/identity.mdx | 17 ++--- pages/chain/security.mdx | 14 ++-- pages/chain/testing.mdx | 11 +-- pages/connect/contribute.mdx | 14 ++-- pages/connect/resources.mdx | 6 +- pages/stack/transactions.mdx | 12 +-- utils/create-breadcrumbs.ts | 95 +++++++++++++++--------- 13 files changed, 124 insertions(+), 147 deletions(-) diff --git a/pages/builders/app-developers.mdx b/pages/builders/app-developers.mdx index 4bf0f90ce..cd64c14c0 100644 --- a/pages/builders/app-developers.mdx +++ b/pages/builders/app-developers.mdx @@ -1,28 +1,21 @@ --- title: App Developers +description: If you're a developer looking to build on OP Stack, you've come to the right place. In this area of the Optimism Docs you'll find everything you ... lang: en-US -description: Essential resources for app developers building on the OP Stack, including guides for deploying contracts, handling transactions, and cross-chain messaging. --- import { Card, Cards } from 'nextra/components' # App Developers -Welcome to the App Developers section, where you'll find essential resources for deploying contracts, handling transactions, cross-chain messaging, and more. -Access quick-start guides, tutorials, and tools to help you build applications on the OP Stack efficiently +If you're a developer looking to build on OP Mainnet, you've come to the right place. In this area of the Optimism Docs you'll find everything you ... - - - - - - - - - - - - - + + + + + + + \ No newline at end of file diff --git a/pages/builders/cex-wallet-developers.mdx b/pages/builders/cex-wallet-developers.mdx index 0ac230932..60be92c71 100644 --- a/pages/builders/cex-wallet-developers.mdx +++ b/pages/builders/cex-wallet-developers.mdx @@ -1,19 +1,16 @@ --- -title: CEX Wallet Developers -description: >- - This section provides information on supporting OP Stack in your exchange and - supporting OP Stack in your wallet. You'll find guide to help you... +title: Cex Wallet Developers +description: Documentation covering Cex Support, Wallet Support in the Cex Wallet Developers section of the OP Stack ecosystem. lang: en-US --- import { Card, Cards } from 'nextra/components' -# CEX Wallet Developers +# Cex Wallet Developers -This section provides information on supporting op mainnet in your exchange and supporting op mainnet in your wallet. You'll find guide to help you understand and work with these topics. +Documentation covering Cex Support, Wallet Support in the Cex Wallet Developers section of the OP Stack ecosystem. - - - - + + + \ No newline at end of file diff --git a/pages/builders/chain-operators.mdx b/pages/builders/chain-operators.mdx index 872c69d26..281d53ae1 100644 --- a/pages/builders/chain-operators.mdx +++ b/pages/builders/chain-operators.mdx @@ -1,31 +1,23 @@ --- title: Chain Operators +description: Documentation covering Architecture, Configuration, Deploy, Features, Hacks, Management, Self Hosted, Tools, Tutorials in the Chain Operators section of the OP Stack ecosystem. lang: en-US -description: Information on chain architecture, configuration, deployment, and management for OP Stack chain operators. --- import { Card, Cards } from 'nextra/components' -# Chain operators +# Chain Operators -This section provides information on chain architecture, configuration, deployment, features, hacks, management, and how to start a self-hosted chain. You'll also find tools, APIs, overviews, guides, and introductions to help you understand and work with these topics. +Documentation covering Architecture, Configuration, Deploy, Features, Hacks, Management, Self Hosted, Tools, Tutorials in the Chain Operators section of the OP Stack ecosystem. - - - - + - - - - - + - - + \ No newline at end of file diff --git a/pages/builders/node-operators.mdx b/pages/builders/node-operators.mdx index bd2ffdeba..7a7a73fc1 100644 --- a/pages/builders/node-operators.mdx +++ b/pages/builders/node-operators.mdx @@ -1,6 +1,6 @@ --- title: Node Operators -description: This section provides information on node architecture, configuration, json rpc api, management, network upgrades, node software releases, how to run... +description: Documentation covering Architecture, Configuration, Json Rpc, Management, Network Upgrades, Releases, Rollup Node, Tutorials in the Node Operators section of the OP Stack ecosystem. lang: en-US --- @@ -8,22 +8,15 @@ import { Card, Cards } from 'nextra/components' # Node Operators -This section provides information on node architecture, configuration, json rpc api, management, network upgrades, node software releases, how to run a node in the superchain and tutorials. You'll find api, guide, overview to help you understand and work with these topics. +Documentation covering Architecture, Configuration, Json Rpc, Management, Network Upgrades, Releases, Rollup Node, Tutorials in the Node Operators section of the OP Stack ecosystem. - - - - + - - - - - - + + - + \ No newline at end of file diff --git a/pages/builders/notices.mdx b/pages/builders/notices.mdx index 53ca1701f..075fd792f 100644 --- a/pages/builders/notices.mdx +++ b/pages/builders/notices.mdx @@ -1,6 +1,6 @@ --- title: Notices -description: This section provides information on preparing for fault proofs breaking changes, preparing for granite breaking changes and deprecation of the... +description: Documentation covering Sdk Deprecation in the Notices section of the OP Stack ecosystem. lang: en-US --- @@ -8,8 +8,8 @@ import { Card, Cards } from 'nextra/components' # Notices -This section offers essential information for builders to stay up-to-date with the latest changes in the OP Stack. +Documentation covering Sdk Deprecation in the Notices section of the OP Stack ecosystem. - - + + \ No newline at end of file diff --git a/pages/builders/tools.mdx b/pages/builders/tools.mdx index 4541d4cd8..e363145df 100644 --- a/pages/builders/tools.mdx +++ b/pages/builders/tools.mdx @@ -1,6 +1,6 @@ --- title: Tools -description: This section provides information on build, connect, fjord fee parameter calculator, monitor, op tools and developer tools. You'll find guide, tool,... +description: Welcome to the Optimism developer tools! lang: en-US --- @@ -8,18 +8,13 @@ import { Card, Cards } from 'nextra/components' # Tools -This section provides information on build, connect, fjord fee parameter calculator, monitor, op tools and developer tools. You'll find guide, tool, overview to help you understand and work with these topics. +Welcome to the Optimism developer tools! - - - - - - + - + \ No newline at end of file diff --git a/pages/chain/identity.mdx b/pages/chain/identity.mdx index 2f9a23ac9..169a444a8 100644 --- a/pages/chain/identity.mdx +++ b/pages/chain/identity.mdx @@ -1,6 +1,6 @@ --- title: Identity -description: This section provides information on about attestations, attestation apps, contracts (eas), individual identity, organizations, identity overview,... +description: This guide explains the role of decentralized identity in the Optimism Collective and its key components. lang: en-US --- @@ -8,22 +8,15 @@ import { Card, Cards } from 'nextra/components' # Identity -This section provides information on about attestations, attestation apps, contracts (eas), individual identity, organizations, identity overview, projects and schemas. You'll find guide, reference, overview to help you understand and work with these topics. +This guide explains the role of decentralized identity in the Optimism Collective and its key components. - - - - - + + - - - - - + \ No newline at end of file diff --git a/pages/chain/security.mdx b/pages/chain/security.mdx index b1a09682c..1bea1f9b1 100644 --- a/pages/chain/security.mdx +++ b/pages/chain/security.mdx @@ -1,8 +1,6 @@ --- title: Security -description: >- - This section provides information on OP Stack security model, privileged roles - in OP Stack and security policy and bug bounty program. +description: Documentation covering Faq, Privileged Roles, Security Policy in the Security section of the OP Stack ecosystem. lang: en-US --- @@ -10,12 +8,10 @@ import { Card, Cards } from 'nextra/components' # Security -This section provides information on op mainnet security model, privileged roles in op mainnet and security policy and bug bounty program. +Documentation covering Faq, Privileged Roles, Security Policy in the Security section of the OP Stack ecosystem. - - - - + + - + \ No newline at end of file diff --git a/pages/chain/testing.mdx b/pages/chain/testing.mdx index 923766e11..237a2d39d 100644 --- a/pages/chain/testing.mdx +++ b/pages/chain/testing.mdx @@ -1,8 +1,6 @@ --- title: Testing -description: >- - This section provides information on running a local development environment - and testing apps for OP Stack. You'll find tutorial, guide to help you... +description: Documentation covering Dev Node, Testing Apps in the Testing section of the OP Stack ecosystem. lang: en-US --- @@ -10,10 +8,9 @@ import { Card, Cards } from 'nextra/components' # Testing -This section provides information on running a local development environment and testing apps for op mainnet. You'll find tutorial, guide to help you understand and work with these topics. +Documentation covering Dev Node, Testing Apps in the Testing section of the OP Stack ecosystem. - - - + + \ No newline at end of file diff --git a/pages/connect/contribute.mdx b/pages/connect/contribute.mdx index 8ef9eb298..3ff89aeac 100644 --- a/pages/connect/contribute.mdx +++ b/pages/connect/contribute.mdx @@ -1,6 +1,6 @@ --- title: Contribute -description: This section provides information on ways to contribute to optimism docs, contribute to the op stack and optimism docs style guide. You'll find... +description: Documentation covering Docs Contribute, Stack Contribute, Style Guide in the Contribute section of the OP Stack ecosystem. lang: en-US --- @@ -8,12 +8,10 @@ import { Card, Cards } from 'nextra/components' # Contribute -This section provides information on ways to contribute to optimism docs, contribute to the op stack and optimism docs style guide. You'll find tutorial, overview, guide to help you understand and work with these topics. +Documentation covering Docs Contribute, Stack Contribute, Style Guide in the Contribute section of the OP Stack ecosystem. - - - - - - + + + + \ No newline at end of file diff --git a/pages/connect/resources.mdx b/pages/connect/resources.mdx index 80b083fe7..659f350e7 100644 --- a/pages/connect/resources.mdx +++ b/pages/connect/resources.mdx @@ -1,6 +1,6 @@ --- title: Resources -description: This section provides information on . You'll find concept to help you understand and work with these topics. +description: Documentation covering Glossary in the Resources section of the OP Stack ecosystem. lang: en-US --- @@ -8,8 +8,8 @@ import { Card, Cards } from 'nextra/components' # Resources -This section provides information on . You'll find concept to help you understand and work with these topics. +Documentation covering Glossary in the Resources section of the OP Stack ecosystem. - + \ No newline at end of file diff --git a/pages/stack/transactions.mdx b/pages/stack/transactions.mdx index 4d96e5736..2656226da 100644 --- a/pages/stack/transactions.mdx +++ b/pages/stack/transactions.mdx @@ -1,6 +1,6 @@ --- title: Transactions -description: This section provides information on . You'll find reference to help you understand and work with these topics. +description: Documentation covering Cross Domain, Deposit Flow, Fees, Forced Transaction, Transaction Flow, Transactions, Withdrawal Flow in the Transactions section of the OP Stack ecosystem. lang: en-US --- @@ -8,13 +8,13 @@ import { Card, Cards } from 'nextra/components' # Transactions -This section provides information on transactions fees. +Documentation covering Cross Domain, Deposit Flow, Fees, Forced Transaction, Transaction Flow, Transactions, Withdrawal Flow in the Transactions section of the OP Stack ecosystem. - - + - + - + + \ No newline at end of file diff --git a/utils/create-breadcrumbs.ts b/utils/create-breadcrumbs.ts index c57c66ff4..59f2c9cdc 100644 --- a/utils/create-breadcrumbs.ts +++ b/utils/create-breadcrumbs.ts @@ -11,6 +11,17 @@ interface FileInfo { content: string; } +// Pages to exclude +const excludedPages = [ + '400.mdx', + '500.mdx', + 'index.mdx', + '404.mdx', + '_app.tsx', + '_document.tsx', + '_meta.json' +]; + function toTitleCase(str: string): string { return str.split('-') .map(word => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase()) @@ -18,23 +29,27 @@ function toTitleCase(str: string): string { } function extractFirstParagraph(content: string): string { - + // Remove frontmatter content = content.replace(/^---[\s\S]*?---/, ''); + // Remove import statements content = content.replace(/^import[\s\S]*?\n/gm, ''); + // Remove HTML/MDX tags content = content.replace(/<[^>]+>/g, ' '); + // Remove markdown links but keep text content = content.replace(/\[([^\]]+)\]\([^)]+\)/g, '$1'); + // Remove headers content = content.replace(/^#.+$/gm, ''); const paragraphs = content.split(/\n\n+/); const firstParagraph = paragraphs.find(p => { const cleaned = p.trim(); return cleaned.length > 30 && // Minimum length - !cleaned.startsWith('import') && - !cleaned.startsWith('export'); + !cleaned.startsWith('import') && + !cleaned.startsWith('export'); }); if (firstParagraph) { @@ -45,11 +60,12 @@ function extractFirstParagraph(content: string): string { return ''; } -async function generateFolderDescription(files: FileInfo[]): Promise { +async function generateFolderDescription(folderName: string, files: FileInfo[]): Promise { if (files.length === 0) { - return 'Documentation for this section is coming soon.'; + return `Documentation for ${toTitleCase(folderName)} is coming soon.`; } + // Try to find overview or introduction file const overviewFile = files.find(file => file.url.toLowerCase().includes('overview') || file.url.toLowerCase().includes('introduction') @@ -60,34 +76,30 @@ async function generateFolderDescription(files: FileInfo[]): Promise { if (desc) return desc; } - const folderName = toTitleCase(path.basename(path.dirname(files[0].url))); + // Generate description from files if no overview is found const topics = files.map(file => toTitleCase(path.basename(file.url))).join(', '); - - return `Documentation covering ${topics} in the ${folderName} section of the OP Stack ecosystem.`; + return `Documentation covering ${topics} in the ${toTitleCase(folderName)} section of the OP Stack ecosystem.`; } async function getContentFiles(folderPath: string): Promise { - const files = await fs.readdir(folderPath); + const files = await fs.readdir(folderPath, { withFileTypes: true }); const fileInfos: FileInfo[] = []; const folderName = path.basename(folderPath); for (const file of files) { - if (file.startsWith('_') || - file === `${folderName}.mdx` || - file.startsWith('.') || - file.endsWith('.tsx') || - file.endsWith('.json')) { + if (file.name.startsWith('_') || + file.name.startsWith('.') || + excludedPages.includes(file.name)) { continue; } - const filePath = path.join(folderPath, file); - const stats = await fs.stat(filePath); + const filePath = path.join(folderPath, file.name); - if (!stats.isDirectory() && (file.endsWith('.md') || file.endsWith('.mdx'))) { + if (file.isFile() && (file.name.endsWith('.md') || file.name.endsWith('.mdx'))) { try { const content = await fs.readFile(filePath, 'utf-8'); const { data: frontMatter } = matter(content); - const fileName = path.basename(file, path.extname(file)); + const fileName = path.basename(file.name, path.extname(file.name)); const fileTitle = frontMatter.title || toTitleCase(fileName); const relativeUrl = `/${path.relative(rootDir, filePath)}`.replace(/\.(md|mdx)$/, ''); @@ -98,7 +110,7 @@ async function getContentFiles(folderPath: string): Promise { content: content }); } catch (error) { - console.error(`Error processing file ${file}:`, error); + console.error(`Error processing file ${file.name}:`, error); } } } @@ -106,10 +118,11 @@ async function getContentFiles(folderPath: string): Promise { return fileInfos; } -async function createBreadcrumb(folderPath: string, folderName: string): Promise { +async function createBreadcrumb(parentPath: string, folderName: string): Promise { + const folderPath = path.join(parentPath, folderName); const files = await getContentFiles(folderPath); const title = toTitleCase(folderName); - const description = await generateFolderDescription(files); + const description = await generateFolderDescription(folderName, files); let content = `--- title: ${title} @@ -138,42 +151,52 @@ ${description} return content; } -async function processStackSubfolders(stackPath: string): Promise { +async function processSubfolders(parentPath: string): Promise { try { - const entries = await fs.readdir(stackPath, { withFileTypes: true }); + const entries = await fs.readdir(parentPath, { withFileTypes: true }); for (const entry of entries) { + // Skip if not a directory or starts with underscore if (!entry.isDirectory() || entry.name.startsWith('_')) { continue; } - const subfolderPath = path.join(stackPath, entry.name); - const breadcrumbPath = path.join(subfolderPath, `${entry.name}.mdx`); - - console.log(`Processing stack subfolder: ${entry.name}`); + const folderName = entry.name; + console.log(`Processing folder: ${folderName}`); try { - const content = await createBreadcrumb(subfolderPath, entry.name); + // Create breadcrumb file at the same level as the folder + const breadcrumbPath = path.join(parentPath, `${folderName}.mdx`); + const content = await createBreadcrumb(parentPath, folderName); await fs.writeFile(breadcrumbPath, content); - console.log(`Created/Updated breadcrumb for: ${entry.name}`); + console.log(`Created/Updated breadcrumb for: ${folderName}`); } catch (error) { - console.error(`Error creating breadcrumb for ${entry.name}:`, error); + console.error(`Error creating breadcrumb for ${folderName}:`, error); } } } catch (error) { - console.error('Error processing stack subfolders:', error); + console.error('Error processing folders:', error); } } const main = async (): Promise => { - console.log('Starting stack subfolder breadcrumb update process...'); + console.log('Starting breadcrumb update process...'); console.log('Root directory:', rootDir); try { - const stackPath = path.join(rootDir, 'stack'); - await fs.access(stackPath); - await processStackSubfolders(stackPath); - console.log('Finished updating stack subfolder breadcrumbs.'); + // Process main sections: builders, chain, connect, stack + const mainSections = ['builders', 'chain', 'connect', 'stack']; + for (const section of mainSections) { + const sectionPath = path.join(rootDir, section); + try { + await fs.access(sectionPath); + await processSubfolders(sectionPath); + console.log(`Completed processing ${section} section`); + } catch (error) { + console.log(`Skipping ${section} - directory not found`); + } + } + console.log('Finished updating all breadcrumbs.'); } catch (error) { console.error('Error in main process:', error); process.exit(1); From fc50d54aa5edcd920d12961c5127a264bcfb9377 Mon Sep 17 00:00:00 2001 From: soyboy <85043086+sbvegan@users.noreply.github.com> Date: Mon, 4 Nov 2024 08:12:54 -0800 Subject: [PATCH 422/565] Update pages/builders/node-operators/network-upgrades.mdx Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> --- pages/builders/node-operators/network-upgrades.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/builders/node-operators/network-upgrades.mdx b/pages/builders/node-operators/network-upgrades.mdx index 21eb14257..c358e3782 100644 --- a/pages/builders/node-operators/network-upgrades.mdx +++ b/pages/builders/node-operators/network-upgrades.mdx @@ -28,7 +28,7 @@ that are pending governance approval. | [Ecotone](https://specs.optimism.io/protocol/ecotone/overview.html) | [approved](https://gov.optimism.io/t/upgrade-proposal-5-ecotone-network-upgrade/7669) | Thu Mar 14 00:00:01 UTC 2024 (`1710374401`) around block `117387812` | Wed Feb 21 17:00:00 UTC 2024 (`1708534800`) around block `8366130` | | [Delta](https://specs.optimism.io/protocol/delta/overview.html) | [approved](https://gov.optimism.io/t/final-upgrade-proposal-3-delta-network-upgrade/7310) | Thu Feb 22 00:00:00 UTC 2024 (`1708560000`) around block `116480612` | Fri Dec 22 00:00:00 UTC 2023 (`1703203200`) around block `5700330` | | [Canyon](https://specs.optimism.io/protocol/canyon/overview.html) | [approved](https://gov.optimism.io/t/final-upgrade-proposal-2-canyon-network-upgrade/7088) | Thu Jan 11 17:00:01 UTC 2024 (`1704992401`) around block `114696812` | Tue Nov 14 17:00:00 UTC 2023 (`1699981200`) around block `4089330` | -| Bedrock | [approved](https://gov.optimism.io/t/final-upgrade-1-bedrock-protocol-upgrade-v2/5548) | Tu Jun 06 2023 04:28:23 PM (`1686079703`) at block `105235063` | N/A | +| Bedrock | (https://gov.optimism.io/t/final-upgrade-1-bedrock-protocol-upgrade-v2/5548) | Tue Jun 06 2023 16:28:23 UTC (`1686079703`) at block `105235063` | N/A | ## Summary of changes From 3ac9f4266c28cf017d3407fde4167552a96723a0 Mon Sep 17 00:00:00 2001 From: krofax Date: Mon, 4 Nov 2024 17:22:40 +0100 Subject: [PATCH 423/565] fix lint issues --- pages/builders/app-developers.mdx | 8 +- pages/builders/cex-wallet-developers.mdx | 3 +- pages/builders/chain-operators.mdx | 10 +- pages/builders/node-operators.mdx | 9 +- pages/builders/notices.mdx | 2 +- pages/builders/tools.mdx | 7 +- pages/chain/identity.mdx | 9 +- pages/chain/security.mdx | 4 +- pages/chain/testing.mdx | 3 +- pages/connect/contribute.mdx | 2 +- pages/connect/resources.mdx | 2 +- pages/stack/beta-features.mdx | 3 +- pages/stack/fault-proofs.mdx | 7 +- pages/stack/features.mdx | 2 +- pages/stack/features/_meta.json | 3 +- pages/stack/features/test.mdx | 63 +++++++++++ pages/stack/interop.mdx | 9 +- pages/stack/research.mdx | 2 +- pages/stack/rollup.mdx | 4 +- pages/stack/security.mdx | 3 +- pages/stack/transactions.mdx | 7 +- pages/stack/transactions/transactions.mdx | 7 +- utils/breadcrumbs.ts | 127 +++++++++++++++++----- utils/create-breadcrumbs.ts | 94 ++++++++++++---- 24 files changed, 317 insertions(+), 73 deletions(-) create mode 100644 pages/stack/features/test.mdx diff --git a/pages/builders/app-developers.mdx b/pages/builders/app-developers.mdx index cd64c14c0..c5dc109d2 100644 --- a/pages/builders/app-developers.mdx +++ b/pages/builders/app-developers.mdx @@ -12,10 +12,16 @@ If you're a developer looking to build on OP Mainnet, you've come to the right p + + + + + + - \ No newline at end of file + diff --git a/pages/builders/cex-wallet-developers.mdx b/pages/builders/cex-wallet-developers.mdx index 60be92c71..aedc0e7eb 100644 --- a/pages/builders/cex-wallet-developers.mdx +++ b/pages/builders/cex-wallet-developers.mdx @@ -12,5 +12,6 @@ Documentation covering Cex Support, Wallet Support in the Cex Wallet Developers + - \ No newline at end of file + diff --git a/pages/builders/chain-operators.mdx b/pages/builders/chain-operators.mdx index 281d53ae1..73c0e4bb9 100644 --- a/pages/builders/chain-operators.mdx +++ b/pages/builders/chain-operators.mdx @@ -12,12 +12,20 @@ Documentation covering Architecture, Configuration, Deploy, Features, Hacks, Man + + + + + + + + - \ No newline at end of file + diff --git a/pages/builders/node-operators.mdx b/pages/builders/node-operators.mdx index 7a7a73fc1..9d25972cb 100644 --- a/pages/builders/node-operators.mdx +++ b/pages/builders/node-operators.mdx @@ -12,11 +12,18 @@ Documentation covering Architecture, Configuration, Json Rpc, Management, Networ + + + + + + + - \ No newline at end of file + diff --git a/pages/builders/notices.mdx b/pages/builders/notices.mdx index 075fd792f..27aaaa0ab 100644 --- a/pages/builders/notices.mdx +++ b/pages/builders/notices.mdx @@ -12,4 +12,4 @@ Documentation covering Sdk Deprecation in the Notices section of the OP Stack ec - \ No newline at end of file + diff --git a/pages/builders/tools.mdx b/pages/builders/tools.mdx index e363145df..354ca94dd 100644 --- a/pages/builders/tools.mdx +++ b/pages/builders/tools.mdx @@ -12,9 +12,14 @@ Welcome to the Optimism developer tools! + + + + + - \ No newline at end of file + diff --git a/pages/chain/identity.mdx b/pages/chain/identity.mdx index 169a444a8..87c4b79e5 100644 --- a/pages/chain/identity.mdx +++ b/pages/chain/identity.mdx @@ -12,11 +12,18 @@ This guide explains the role of decentralized identity in the Optimism Collectiv + + + + + + + - \ No newline at end of file + diff --git a/pages/chain/security.mdx b/pages/chain/security.mdx index 1bea1f9b1..e4f10a998 100644 --- a/pages/chain/security.mdx +++ b/pages/chain/security.mdx @@ -12,6 +12,8 @@ Documentation covering Faq, Privileged Roles, Security Policy in the Security se + + - \ No newline at end of file + diff --git a/pages/chain/testing.mdx b/pages/chain/testing.mdx index 237a2d39d..fc2af6d47 100644 --- a/pages/chain/testing.mdx +++ b/pages/chain/testing.mdx @@ -12,5 +12,6 @@ Documentation covering Dev Node, Testing Apps in the Testing section of the OP S + - \ No newline at end of file + diff --git a/pages/connect/contribute.mdx b/pages/connect/contribute.mdx index 3ff89aeac..a7cf78027 100644 --- a/pages/connect/contribute.mdx +++ b/pages/connect/contribute.mdx @@ -14,4 +14,4 @@ Documentation covering Docs Contribute, Stack Contribute, Style Guide in the Con - \ No newline at end of file + diff --git a/pages/connect/resources.mdx b/pages/connect/resources.mdx index 659f350e7..a4ae2c526 100644 --- a/pages/connect/resources.mdx +++ b/pages/connect/resources.mdx @@ -12,4 +12,4 @@ Documentation covering Glossary in the Resources section of the OP Stack ecosyst - \ No newline at end of file + diff --git a/pages/stack/beta-features.mdx b/pages/stack/beta-features.mdx index bfdd3a164..24257e8e3 100644 --- a/pages/stack/beta-features.mdx +++ b/pages/stack/beta-features.mdx @@ -12,5 +12,6 @@ Documentation covering Alt Da Mode, Custom Gas Token in the Beta Features sectio + - \ No newline at end of file + diff --git a/pages/stack/fault-proofs.mdx b/pages/stack/fault-proofs.mdx index 0f49365ab..4da08bb26 100644 --- a/pages/stack/fault-proofs.mdx +++ b/pages/stack/fault-proofs.mdx @@ -12,9 +12,14 @@ Documentation covering Cannon, Challenger, Explainer, Fp Components, Fp Security + + + + + - \ No newline at end of file + diff --git a/pages/stack/features.mdx b/pages/stack/features.mdx index 7f5e479cd..84cad55a4 100644 --- a/pages/stack/features.mdx +++ b/pages/stack/features.mdx @@ -12,4 +12,4 @@ Documentation covering Send Raw Transaction Conditional in the Features section - \ No newline at end of file + diff --git a/pages/stack/features/_meta.json b/pages/stack/features/_meta.json index 1d8a795f7..7b2121ed1 100644 --- a/pages/stack/features/_meta.json +++ b/pages/stack/features/_meta.json @@ -1,3 +1,4 @@ { - "send-raw-transaction-conditional": "SendRawTransactionConditional" + "send-raw-transaction-conditional": "SendRawTransactionConditional", + "test": "Test" } diff --git a/pages/stack/features/test.mdx b/pages/stack/features/test.mdx new file mode 100644 index 000000000..9602e95ef --- /dev/null +++ b/pages/stack/features/test.mdx @@ -0,0 +1,63 @@ +--- +title: Test +lang: en-US +description: Learn about the eth_sendRawTransactionConditional RPC method for conditional transaction inclusion on the OP Stack. +--- + +import { Callout } from 'nextra/components' + +# Test + +A sequencer rpc, `eth_sendRawTransactionConditional`, allowing callers to conditionally include a transaction based on a set of provided options. + +This feature is meant to unblock use cases that require atomic inclusion, otherwise possible on Ethereum through specialized block builders like Flashbots. Some examples: + +* 4337 Bundlers utilizing a shared mempool of UserOperations. Reverted transactions due to conflicting UserOperations would make it too costly for bundlers to operate on L2, forcing the use of private mempools. + +## Specification + +This endpoint is an extension of `eth_sendRawTransaction`, with an extra parameter of "options" with the following structure: + +``` +{ + "knownAccounts": [optional] A map of accounts with expected storage. The key is account address + If the value is hex string, it is the known storage root hash of that account. + If the value is an object, then each member is in the format of "slot": "value", which are explicit slot values within that account storage. + "blockNumberMin": [optional] minimal block number for inclusion + "blockNumberMax": [optional] maximum block number for inclusion + "timestampMin": [optional] minimum block timestamp for inclusion + "timestampMax": [optional] maximum block timestamp for inclusion +} +``` + +The "cost" of a given conditional is *approximately* determined by the number of storage lookups that would be incurred by validating this conditional. There's a predefined max of `1000` that is allowed to prevent DoS. + + + Since the sequencer is not compensated for the additional state checks, otherwise through the GAS of the transaction, a configured rate limit is applied to this cost. + + To also disincentive the use of this endpoint for MEV in comparison to `eth_sendRawTransaction`, the conditional is checked against the parent of the latest block. + + +This conditional is checked once at the RPC layer prior to mempool submission. If rejected against chain state, the RPC will return an error with the following spec + +* error code `-32003` (transaction rejected) with a reason string as to the specific failed check +* error code `-32005` (conditional cost) with a reason string if the conditional cost exceeded the maximum OR the cost was rate limited due to network conditions. + +Successful submission does **NOT** guarantee inclusion! The caller must observe the chain for a receipt with some timeout to determine non-inclusion. The conditional is also re-checked in the block building phase to handle intra-block conflicts. + + + Conditional transactions are tied to the block builder they are submitted to. This means that these transactions **are not gossiped between configured peers!!!** + + If you are running an active/passive setup with replicas that gossip txs to an active sequencer, this endpoint should be fronted by a proxy that can broadcast the request to all replicas. + + +## How to enable + +This feature can be enabled with the addition of a flag to op-geth. + +* `--rollup.sequencertxconditionalenabled` (default: false) a boolean flag which enables the rpc. +* `--rollup.sequencertxconditionalcostratelimit` (default: 5000) an integer flag that sets the rate limit for cost observable per second. + + + It is not advised to publicly expose this sequencer endpoint due to DoS concerns. This supplemental proxy, [op-txproxy](/stack/operators/features/op-txproxy), should be used to apply additional constraints on this endpoint prior to passing through to the sequencer. + diff --git a/pages/stack/interop.mdx b/pages/stack/interop.mdx index c16130077..b7823d3b7 100644 --- a/pages/stack/interop.mdx +++ b/pages/stack/interop.mdx @@ -12,11 +12,18 @@ Documentation covering Cross Chain Message, Explainer, Message Passing, Op Super + + + + + + + - \ No newline at end of file + diff --git a/pages/stack/research.mdx b/pages/stack/research.mdx index c530c1be8..1a485ee0f 100644 --- a/pages/stack/research.mdx +++ b/pages/stack/research.mdx @@ -12,4 +12,4 @@ Documentation covering Block Time Research in the Research section of the OP Sta - \ No newline at end of file + diff --git a/pages/stack/rollup.mdx b/pages/stack/rollup.mdx index 15d96a31c..ca95c2564 100644 --- a/pages/stack/rollup.mdx +++ b/pages/stack/rollup.mdx @@ -12,6 +12,8 @@ The big idea that makes Optimism possible is the Optimistic Rollup. We'll go thr + + - \ No newline at end of file + diff --git a/pages/stack/security.mdx b/pages/stack/security.mdx index d770098b3..fbf62b199 100644 --- a/pages/stack/security.mdx +++ b/pages/stack/security.mdx @@ -12,5 +12,6 @@ Documentation covering Faq, Pause in the Security section of the OP Stack ecosys + - \ No newline at end of file + diff --git a/pages/stack/transactions.mdx b/pages/stack/transactions.mdx index 2656226da..2543d4ed0 100644 --- a/pages/stack/transactions.mdx +++ b/pages/stack/transactions.mdx @@ -12,9 +12,14 @@ Documentation covering Cross Domain, Deposit Flow, Fees, Forced Transaction, Tra + + + + + - \ No newline at end of file + diff --git a/pages/stack/transactions/transactions.mdx b/pages/stack/transactions/transactions.mdx index c084cfc8f..02d703c69 100644 --- a/pages/stack/transactions/transactions.mdx +++ b/pages/stack/transactions/transactions.mdx @@ -12,9 +12,14 @@ Documentation covering Cross Domain, Deposit Flow, Fees, Forced Transaction, Tra + + + + + - \ No newline at end of file + diff --git a/utils/breadcrumbs.ts b/utils/breadcrumbs.ts index d433df892..71201bfca 100644 --- a/utils/breadcrumbs.ts +++ b/utils/breadcrumbs.ts @@ -15,9 +15,79 @@ const excludedPages = [ '400.mdx', '500.mdx', 'index.mdx', - '404.mdx' + '404.mdx', + 'console', + 'block-explorer', + 'bridge', + 'sdk', + 'faucet', + 'gas', + 'bug-bounty', + 'live-support', + 'governance', + 'changelog', + 'experimental' ]; +// Paths to exclude from checks (full paths) +const excludedPaths = [ + '/builders/app-developers/tools/console', + '/builders/tools/op-tools/block-explorer', + '/builders/tools/op-tools/bridge', + '/builders/tools/op-tools/sdk', + '/builders/tools/op-tools/faucet', + '/builders/tools/op-tools/console', + '/builders/tools/op-tools/gas', + '/chain/security/bug-bounty', + '/connect/live-support', + '/connect/governance', + '/connect/resources/changelog', + '/stack/--- Experimental' +]; + +interface MetaJson { + [key: string]: { + title?: string; + display?: string; + } | string; +} + +function shouldExcludePage(pageName: string, fullPath: string): boolean { + // Check if the page name is in excludedPages + if (excludedPages.includes(pageName)) { + return true; + } + + // Check if the full path is in excludedPaths + if (excludedPaths.includes(fullPath)) { + return true; + } + + // Skip pages with special characters or patterns + if (pageName.includes('---') || pageName.startsWith('_')) { + return true; + } + + return false; +} + +async function getMetaJsonPages(dirPath: string): Promise { + try { + const metaPath = path.join(dirPath, '_meta.json'); + const metaContent = await fs.readFile(metaPath, 'utf-8'); + const meta: MetaJson = JSON.parse(metaContent); + + return Object.keys(meta).filter(key => + !excludedPages.includes(key) && + !key.startsWith('_') && + !key.includes('---') && + typeof meta[key] !== 'string' + ); + } catch (error) { + return []; + } +} + async function getReferencedPagesFromBreadcrumb(breadcrumbPath: string): Promise { try { const content = await fs.readFile(breadcrumbPath, 'utf-8'); @@ -33,42 +103,36 @@ async function getReferencedPagesFromBreadcrumb(breadcrumbPath: string): Promise async function checkDirectory(dirPath: string): Promise { const entries = await fs.readdir(dirPath, { withFileTypes: true }); - const currentDir = path.basename(dirPath); - // Skip the root directory check - if (dirPath !== rootDir) { - const breadcrumbPath = path.join(dirPath, `${currentDir}.mdx`); - const referencedPages = await getReferencedPagesFromBreadcrumb(breadcrumbPath); - - // Check all .mdx and .md files in the current directory - for (const entry of entries) { - if (entry.isFile() && - (entry.name.endsWith('.mdx') || entry.name.endsWith('.md')) && - !excludedPages.includes(entry.name) && - entry.name !== `${currentDir}.mdx`) { - - const pageName = entry.name.replace(/\.(md|mdx)$/, ''); - // Dynamically construct the path relative to the pages directory - const relativePath = '/' + path.relative(rootDir, path.join(dirPath, pageName)) - .replace(/\\/g, '/'); + for (const entry of entries) { + if (entry.isDirectory() && !entry.name.startsWith('_') && !entry.name.startsWith('.')) { + const folderPath = path.join(dirPath, entry.name); + const breadcrumbPath = path.join(dirPath, `${entry.name}.mdx`); + + const metaPages = await getMetaJsonPages(folderPath); + const referencedPages = await getReferencedPagesFromBreadcrumb(breadcrumbPath); + + for (const page of metaPages) { + const expectedPath = `/${path.relative(rootDir, folderPath)}/${page}`; + const normalizedExpectedPath = expectedPath.replace(/\\/g, '/'); - if (!referencedPages.includes(relativePath)) { - const humanReadableName = pageName.split('-') + // Skip if the page or path should be excluded + if (shouldExcludePage(page, normalizedExpectedPath)) { + continue; + } + + if (!referencedPages.some(ref => ref.endsWith(page))) { + const humanReadableName = page.split('-') .map(word => word.charAt(0).toUpperCase() + word.slice(1)) .join(' '); warnings.push( - `Page "${humanReadableName}" at path "${relativePath}" is not listed in the breadcrumb navigation of ${currentDir}.mdx` + `Page "${humanReadableName}" (${normalizedExpectedPath}) is in _meta.json but not referenced in the breadcrumb file ${entry.name}.mdx` ); } } - } - } - - // Process subdirectories - for (const entry of entries) { - if (entry.isDirectory() && !entry.name.startsWith('_') && !entry.name.startsWith('.')) { - await checkDirectory(path.join(dirPath, entry.name)); + + await checkDirectory(folderPath); } } } @@ -82,7 +146,7 @@ async function main() { warnings.forEach(warning => console.log(`${YELLOW}- ${warning}${RESET}`)); process.exit(1); } else { - console.log('All pages are properly listed in their respective breadcrumb navigation files.'); + console.log('All pages listed in _meta.json are properly referenced in their breadcrumb files.'); } } catch (error) { console.log(`${YELLOW}${BOLD}Error checking breadcrumbs:${RESET}`, error); @@ -90,4 +154,7 @@ async function main() { } } -main(); \ No newline at end of file +main().catch(error => { + console.error('Error in main process:', error); + process.exit(1); +}); diff --git a/utils/create-breadcrumbs.ts b/utils/create-breadcrumbs.ts index 59f2c9cdc..370e44bc4 100644 --- a/utils/create-breadcrumbs.ts +++ b/utils/create-breadcrumbs.ts @@ -118,13 +118,66 @@ async function getContentFiles(folderPath: string): Promise { return fileInfos; } -async function createBreadcrumb(parentPath: string, folderName: string): Promise { +async function getExistingBreadcrumbContent(breadcrumbPath: string): Promise<{ + existingContent: string; + existingCards: Set; +} | null> { + try { + const content = await fs.readFile(breadcrumbPath, 'utf-8'); + const cardMatches = content.match(/]*href="([^"]+)"[^>]*>/g) || []; + const existingCards = new Set( + cardMatches.map(match => { + const hrefMatch = match.match(/href="([^"]+)"/); + return hrefMatch ? hrefMatch[1] : ''; + }).filter(Boolean) + ); + return { existingContent: content, existingCards }; + } catch (error) { + return null; + } +} + +async function createOrUpdateBreadcrumb(parentPath: string, folderName: string): Promise { const folderPath = path.join(parentPath, folderName); + const breadcrumbPath = path.join(parentPath, `${folderName}.mdx`); + + // Get current files in the folder const files = await getContentFiles(folderPath); - const title = toTitleCase(folderName); - const description = await generateFolderDescription(folderName, files); - - let content = `--- + + // Check existing breadcrumb + const existing = await getExistingBreadcrumbContent(breadcrumbPath); + + if (existing) { + // If breadcrumb exists, only add new cards + const newCards: string[] = []; + let content = existing.existingContent; + + files.forEach(({ title: fileTitle, url }) => { + if (!existing.existingCards.has(url)) { + newCards.push(` `); + } + }); + + if (newCards.length > 0) { + // Find the closing tag and insert new cards before it + const cardsSectionEnd = content.lastIndexOf(''); + if (cardsSectionEnd !== -1) { + content = content.slice(0, cardsSectionEnd) + + '\n' + newCards.join('\n') + '\n' + + content.slice(cardsSectionEnd); + + await fs.writeFile(breadcrumbPath, content); + console.log(`Added ${newCards.length} new cards to: ${folderName}.mdx`); + } + } else { + console.log(`No new cards needed for: ${folderName}.mdx`); + } + } else { + // If breadcrumb doesn't exist, create new one + const title = toTitleCase(folderName); + const description = await generateFolderDescription(folderName, files); + + let content = `--- title: ${title} description: ${description} lang: en-US @@ -138,17 +191,19 @@ ${description} `; - if (files.length > 0) { - content += '\n'; - files.forEach(({ title: fileTitle, url }) => { - content += ` \n`; - }); - content += ''; - } else { - content += 'Documentation for this section is coming soon.'; + if (files.length > 0) { + content += '\n'; + files.forEach(({ title: fileTitle, url }) => { + content += ` \n`; + }); + content += ''; + } else { + content += 'Documentation for this section is coming soon.'; + } + + await fs.writeFile(breadcrumbPath, content); + console.log(`Created new breadcrumb file: ${folderName}.mdx`); } - - return content; } async function processSubfolders(parentPath: string): Promise { @@ -156,7 +211,6 @@ async function processSubfolders(parentPath: string): Promise { const entries = await fs.readdir(parentPath, { withFileTypes: true }); for (const entry of entries) { - // Skip if not a directory or starts with underscore if (!entry.isDirectory() || entry.name.startsWith('_')) { continue; } @@ -165,13 +219,9 @@ async function processSubfolders(parentPath: string): Promise { console.log(`Processing folder: ${folderName}`); try { - // Create breadcrumb file at the same level as the folder - const breadcrumbPath = path.join(parentPath, `${folderName}.mdx`); - const content = await createBreadcrumb(parentPath, folderName); - await fs.writeFile(breadcrumbPath, content); - console.log(`Created/Updated breadcrumb for: ${folderName}`); + await createOrUpdateBreadcrumb(parentPath, folderName); } catch (error) { - console.error(`Error creating breadcrumb for ${folderName}:`, error); + console.error(`Error processing breadcrumb for ${folderName}:`, error); } } } catch (error) { From e14923fd0b74a1b0be147c26c926a877b9372ff8 Mon Sep 17 00:00:00 2001 From: krofax Date: Mon, 4 Nov 2024 17:39:12 +0100 Subject: [PATCH 424/565] updated breadcrumb check script --- notes/breadcrumbs.md | 10 +- package.json | 2 +- pages/builders/app-developers/contracts.mdx | 2 + pages/builders/chain-operators/tools.mdx | 4 + pages/stack/features/_meta.json | 3 +- pages/stack/features/test.mdx | 63 -------- utils/breadcrumbs.ts | 154 ++++++++++---------- words.txt | 2 + 8 files changed, 92 insertions(+), 148 deletions(-) delete mode 100644 pages/stack/features/test.mdx diff --git a/notes/breadcrumbs.md b/notes/breadcrumbs.md index e6f8b3b83..c05467848 100644 --- a/notes/breadcrumbs.md +++ b/notes/breadcrumbs.md @@ -11,10 +11,16 @@ Quick guide on using our breadcrumbs automation script for the OP Stack document ## Using the Script -Breadcrumbs for the docs can be generated by running: +* Breadcrumbs for the docs can be generated by running: ```bash -pnpm create-breadcrumbs +pnpm breadcrumbs +``` + +* To check files with missing breadcrumbs, run: + +```bash +pnpm fix ``` ### What to Watch For diff --git a/package.json b/package.json index 8d3429ef8..b1690e4f0 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "version": "0.0.1", "description": "Optimism Docs", "scripts": { - "lint": "eslint . --ext mdx --max-warnings 0 && pnpm spellcheck:lint", + "lint": "eslint . --ext mdx --max-warnings 0 && pnpm spellcheck:lint && pnpm check-breadcrumbs", "fix": "eslint . --ext mdx --fix && pnpm spellcheck:fix && pnpm check-breadcrumbs", "spellcheck:lint": "cspell lint \"**/*.mdx\"", "spellcheck:fix": "cspell --words-only --unique \"**/*.mdx\" | sort --ignore-case | uniq > words.txt", diff --git a/pages/builders/app-developers/contracts.mdx b/pages/builders/app-developers/contracts.mdx index 6c01b91e2..f2836e72d 100644 --- a/pages/builders/app-developers/contracts.mdx +++ b/pages/builders/app-developers/contracts.mdx @@ -18,4 +18,6 @@ This section provides information on Solidity compatibility, contract optimizati + + diff --git a/pages/builders/chain-operators/tools.mdx b/pages/builders/chain-operators/tools.mdx index 1b8103c61..c8018d508 100644 --- a/pages/builders/chain-operators/tools.mdx +++ b/pages/builders/chain-operators/tools.mdx @@ -21,5 +21,9 @@ This section provides information on chain monitoring options, deploying a block + + + + diff --git a/pages/stack/features/_meta.json b/pages/stack/features/_meta.json index 7b2121ed1..1d8a795f7 100644 --- a/pages/stack/features/_meta.json +++ b/pages/stack/features/_meta.json @@ -1,4 +1,3 @@ { - "send-raw-transaction-conditional": "SendRawTransactionConditional", - "test": "Test" + "send-raw-transaction-conditional": "SendRawTransactionConditional" } diff --git a/pages/stack/features/test.mdx b/pages/stack/features/test.mdx deleted file mode 100644 index 9602e95ef..000000000 --- a/pages/stack/features/test.mdx +++ /dev/null @@ -1,63 +0,0 @@ ---- -title: Test -lang: en-US -description: Learn about the eth_sendRawTransactionConditional RPC method for conditional transaction inclusion on the OP Stack. ---- - -import { Callout } from 'nextra/components' - -# Test - -A sequencer rpc, `eth_sendRawTransactionConditional`, allowing callers to conditionally include a transaction based on a set of provided options. - -This feature is meant to unblock use cases that require atomic inclusion, otherwise possible on Ethereum through specialized block builders like Flashbots. Some examples: - -* 4337 Bundlers utilizing a shared mempool of UserOperations. Reverted transactions due to conflicting UserOperations would make it too costly for bundlers to operate on L2, forcing the use of private mempools. - -## Specification - -This endpoint is an extension of `eth_sendRawTransaction`, with an extra parameter of "options" with the following structure: - -``` -{ - "knownAccounts": [optional] A map of accounts with expected storage. The key is account address - If the value is hex string, it is the known storage root hash of that account. - If the value is an object, then each member is in the format of "slot": "value", which are explicit slot values within that account storage. - "blockNumberMin": [optional] minimal block number for inclusion - "blockNumberMax": [optional] maximum block number for inclusion - "timestampMin": [optional] minimum block timestamp for inclusion - "timestampMax": [optional] maximum block timestamp for inclusion -} -``` - -The "cost" of a given conditional is *approximately* determined by the number of storage lookups that would be incurred by validating this conditional. There's a predefined max of `1000` that is allowed to prevent DoS. - - - Since the sequencer is not compensated for the additional state checks, otherwise through the GAS of the transaction, a configured rate limit is applied to this cost. - - To also disincentive the use of this endpoint for MEV in comparison to `eth_sendRawTransaction`, the conditional is checked against the parent of the latest block. - - -This conditional is checked once at the RPC layer prior to mempool submission. If rejected against chain state, the RPC will return an error with the following spec - -* error code `-32003` (transaction rejected) with a reason string as to the specific failed check -* error code `-32005` (conditional cost) with a reason string if the conditional cost exceeded the maximum OR the cost was rate limited due to network conditions. - -Successful submission does **NOT** guarantee inclusion! The caller must observe the chain for a receipt with some timeout to determine non-inclusion. The conditional is also re-checked in the block building phase to handle intra-block conflicts. - - - Conditional transactions are tied to the block builder they are submitted to. This means that these transactions **are not gossiped between configured peers!!!** - - If you are running an active/passive setup with replicas that gossip txs to an active sequencer, this endpoint should be fronted by a proxy that can broadcast the request to all replicas. - - -## How to enable - -This feature can be enabled with the addition of a flag to op-geth. - -* `--rollup.sequencertxconditionalenabled` (default: false) a boolean flag which enables the rpc. -* `--rollup.sequencertxconditionalcostratelimit` (default: 5000) an integer flag that sets the rate limit for cost observable per second. - - - It is not advised to publicly expose this sequencer endpoint due to DoS concerns. This supplemental proxy, [op-txproxy](/stack/operators/features/op-txproxy), should be used to apply additional constraints on this endpoint prior to passing through to the sequencer. - diff --git a/utils/breadcrumbs.ts b/utils/breadcrumbs.ts index 71201bfca..ff00309d7 100644 --- a/utils/breadcrumbs.ts +++ b/utils/breadcrumbs.ts @@ -2,7 +2,7 @@ import * as fs from 'fs/promises'; import * as path from 'path'; import matter from 'gray-matter'; -const rootDir = path.join(process.cwd(), 'pages'); +const rootDir: string = path.join(__dirname, '..', 'pages'); const warnings: string[] = []; // ANSI color codes @@ -10,6 +10,13 @@ const YELLOW = '\x1b[33m'; const RESET = '\x1b[0m'; const BOLD = '\x1b[1m'; +interface FileInfo { + title: string; + url: string; + description?: string; + content: string; +} + // Pages to exclude from checks const excludedPages = [ '400.mdx', @@ -29,75 +36,55 @@ const excludedPages = [ 'experimental' ]; -// Paths to exclude from checks (full paths) -const excludedPaths = [ - '/builders/app-developers/tools/console', - '/builders/tools/op-tools/block-explorer', - '/builders/tools/op-tools/bridge', - '/builders/tools/op-tools/sdk', - '/builders/tools/op-tools/faucet', - '/builders/tools/op-tools/console', - '/builders/tools/op-tools/gas', - '/chain/security/bug-bounty', - '/connect/live-support', - '/connect/governance', - '/connect/resources/changelog', - '/stack/--- Experimental' -]; +async function getContentFiles(folderPath: string): Promise { + const files = await fs.readdir(folderPath, { withFileTypes: true }); + const fileInfos: FileInfo[] = []; + const folderName = path.basename(folderPath); -interface MetaJson { - [key: string]: { - title?: string; - display?: string; - } | string; -} + for (const file of files) { + if (file.name.startsWith('_') || + file.name.startsWith('.') || + excludedPages.includes(file.name)) { + continue; + } -function shouldExcludePage(pageName: string, fullPath: string): boolean { - // Check if the page name is in excludedPages - if (excludedPages.includes(pageName)) { - return true; - } + const filePath = path.join(folderPath, file.name); - // Check if the full path is in excludedPaths - if (excludedPaths.includes(fullPath)) { - return true; - } + if (file.isFile() && (file.name.endsWith('.md') || file.name.endsWith('.mdx'))) { + try { + const content = await fs.readFile(filePath, 'utf-8'); + const { data: frontMatter } = matter(content); + const fileName = path.basename(file.name, path.extname(file.name)); + const fileTitle = frontMatter.title || fileName; + const relativeUrl = `/${path.relative(rootDir, filePath)}`.replace(/\.(md|mdx)$/, ''); - // Skip pages with special characters or patterns - if (pageName.includes('---') || pageName.startsWith('_')) { - return true; + fileInfos.push({ + title: fileTitle, + url: relativeUrl, + description: frontMatter.description, + content: content + }); + } catch (error) { + console.error(`Error processing file ${file.name}:`, error); + } + } } - return false; -} - -async function getMetaJsonPages(dirPath: string): Promise { - try { - const metaPath = path.join(dirPath, '_meta.json'); - const metaContent = await fs.readFile(metaPath, 'utf-8'); - const meta: MetaJson = JSON.parse(metaContent); - - return Object.keys(meta).filter(key => - !excludedPages.includes(key) && - !key.startsWith('_') && - !key.includes('---') && - typeof meta[key] !== 'string' - ); - } catch (error) { - return []; - } + return fileInfos; } -async function getReferencedPagesFromBreadcrumb(breadcrumbPath: string): Promise { +async function getBreadcrumbCards(breadcrumbPath: string): Promise> { try { const content = await fs.readFile(breadcrumbPath, 'utf-8'); const cardMatches = content.match(/]*href="([^"]+)"[^>]*>/g) || []; - return cardMatches.map(match => { - const hrefMatch = match.match(/href="([^"]+)"/); - return hrefMatch ? hrefMatch[1] : ''; - }).filter(Boolean); + return new Set( + cardMatches.map(match => { + const hrefMatch = match.match(/href="([^"]+)"/); + return hrefMatch ? hrefMatch[1] : ''; + }).filter(Boolean) + ); } catch (error) { - return []; + return new Set(); } } @@ -108,45 +95,52 @@ async function checkDirectory(dirPath: string): Promise { if (entry.isDirectory() && !entry.name.startsWith('_') && !entry.name.startsWith('.')) { const folderPath = path.join(dirPath, entry.name); const breadcrumbPath = path.join(dirPath, `${entry.name}.mdx`); + + // Get all content files in the folder + const files = await getContentFiles(folderPath); - const metaPages = await getMetaJsonPages(folderPath); - const referencedPages = await getReferencedPagesFromBreadcrumb(breadcrumbPath); - - for (const page of metaPages) { - const expectedPath = `/${path.relative(rootDir, folderPath)}/${page}`; - const normalizedExpectedPath = expectedPath.replace(/\\/g, '/'); - - // Skip if the page or path should be excluded - if (shouldExcludePage(page, normalizedExpectedPath)) { - continue; - } + // Get existing cards in breadcrumb + const existingCards = await getBreadcrumbCards(breadcrumbPath); - if (!referencedPages.some(ref => ref.endsWith(page))) { - const humanReadableName = page.split('-') - .map(word => word.charAt(0).toUpperCase() + word.slice(1)) - .join(' '); - + // Check for missing pages + files.forEach(({ title, url }) => { + if (!existingCards.has(url)) { warnings.push( - `Page "${humanReadableName}" (${normalizedExpectedPath}) is in _meta.json but not referenced in the breadcrumb file ${entry.name}.mdx` + `Page "${title}" at ${url} needs to be added to the breadcrumb file ${entry.name}.mdx` ); } - } - + }); + + // Recursively check subdirectories await checkDirectory(folderPath); } } } async function main() { + console.log('Starting breadcrumb check process...'); + console.log('Root directory:', rootDir); + try { - await checkDirectory(rootDir); - + // Process main sections: builders, chain, connect, stack + const mainSections = ['builders', 'chain', 'connect', 'stack']; + for (const section of mainSections) { + const sectionPath = path.join(rootDir, section); + try { + await fs.access(sectionPath); + await checkDirectory(sectionPath); + console.log(`Completed checking ${section} section`); + } catch (error) { + console.log(`Skipping ${section} - directory not found`); + } + } + if (warnings.length > 0) { console.log(`${YELLOW}${BOLD}Missing pages in breadcrumb navigation:${RESET}`); warnings.forEach(warning => console.log(`${YELLOW}- ${warning}${RESET}`)); process.exit(1); } else { - console.log('All pages listed in _meta.json are properly referenced in their breadcrumb files.'); + console.log('All pages are properly referenced in breadcrumb files.'); } } catch (error) { console.log(`${YELLOW}${BOLD}Error checking breadcrumbs:${RESET}`, error); diff --git a/words.txt b/words.txt index f4e2c979a..632a83cdd 100644 --- a/words.txt +++ b/words.txt @@ -286,6 +286,7 @@ productionize productionized Protip Proxied +Proxyd proxyd pseudorandomly QRNG @@ -376,6 +377,7 @@ txns TXPOOL txpool txproxy +txproxyd uncountered Unprotect unsubmitted From c264bb423190c5685e7c88884d3fab85781bd0eb Mon Sep 17 00:00:00 2001 From: krofax Date: Mon, 4 Nov 2024 17:42:19 +0100 Subject: [PATCH 425/565] fix lint issues --- pages/stack/transactions.mdx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pages/stack/transactions.mdx b/pages/stack/transactions.mdx index 2543d4ed0..42bfac5a8 100644 --- a/pages/stack/transactions.mdx +++ b/pages/stack/transactions.mdx @@ -22,4 +22,6 @@ Documentation covering Cross Domain, Deposit Flow, Fees, Forced Transaction, Tra + + From 1fdff8cf4f1fc767259d0dadfc735a622212e4fe Mon Sep 17 00:00:00 2001 From: krofax Date: Mon, 4 Nov 2024 17:43:26 +0100 Subject: [PATCH 426/565] fix lint markdown issues --- words.txt | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/words.txt b/words.txt index 632a83cdd..2e0d2c443 100644 --- a/words.txt +++ b/words.txt @@ -9,7 +9,9 @@ airgap Allnodes Allocs allocs +altda ANDI +Ankr Apeworx Arweave authrpc @@ -75,6 +77,7 @@ datacap DATADIR datadir Dencun +derviation Devnet devnet Devnode @@ -147,6 +150,7 @@ Holesky holesky IGNOREPRICE ignoreprice +Immunefi implicity Inator inator @@ -195,6 +199,7 @@ minsuggestedpriorityfee Mintable Mintplex MIPSEVM +Mitigations Monitorism Moralis Mordor @@ -286,9 +291,10 @@ productionize productionized Protip Proxied -Proxyd proxyd pseudorandomly +Pyth +Pyth's QRNG Quicknode quicknode @@ -323,6 +329,9 @@ safedb Schnorr secp SELFDESTRUCT +SEPOLIA +Sepolia +sepolia seqnr SEQUENCERHTTP sequencerhttp @@ -353,7 +362,6 @@ SUPERCHAIN Superchain superchain Superchain's -Superchainerc Superchains Superscan Supersim @@ -377,7 +385,6 @@ txns TXPOOL txpool txproxy -txproxyd uncountered Unprotect unsubmitted @@ -393,6 +400,7 @@ VMDEBUG vmdebug VMODULE vmodule +voxel wagmi Warpcast xlarge @@ -401,4 +409,4 @@ xtensibility ZKPs ZKVM Zora -zora +zora \ No newline at end of file From be06f2d2533fa0f08b1637fbd722e0715f114fa6 Mon Sep 17 00:00:00 2001 From: krofax Date: Mon, 4 Nov 2024 17:49:36 +0100 Subject: [PATCH 427/565] fix lint issues --- words.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/words.txt b/words.txt index 2e0d2c443..a7c0cdb64 100644 --- a/words.txt +++ b/words.txt @@ -362,6 +362,7 @@ SUPERCHAIN Superchain superchain Superchain's +Superchainerc Superchains Superscan Supersim @@ -385,6 +386,7 @@ txns TXPOOL txpool txproxy +txproxyd uncountered Unprotect unsubmitted From eed6713ccad60fd45c0f7f1fcd1af12dc8ed11e7 Mon Sep 17 00:00:00 2001 From: soyboy <85043086+sbvegan@users.noreply.github.com> Date: Mon, 4 Nov 2024 16:21:41 -0800 Subject: [PATCH 428/565] fixing linter --- .../node-operators/network-upgrades.mdx | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/pages/builders/node-operators/network-upgrades.mdx b/pages/builders/node-operators/network-upgrades.mdx index c358e3782..290021c27 100644 --- a/pages/builders/node-operators/network-upgrades.mdx +++ b/pages/builders/node-operators/network-upgrades.mdx @@ -21,14 +21,14 @@ before the timestamp will cause a chain divergence. You will need to resync your node to reconcile the chain. Optimistic activation times refer to times that are pending governance approval. -| Upgrade | Governance Approval | [OP Mainnet Activations](https://github.com/ethereum-optimism/superchain-registry/blob/main/superchain/configs/mainnet/superchain.toml) | [OP Sepolia Activations](https://github.com/ethereum-optimism/superchain-registry/blob/main/superchain/configs/sepolia/superchain.toml) | -| ------------------------------------------------------------------- | ------------------------------------------------------------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------- | -| [Granite](https://specs.optimism.io/protocol/granite/overview.html) | [approved](https://gov.optimism.io/t/upgrade-proposal-10-granite-network-upgrade/8733) | Wed Sep 11 16:00:01 UTC 2024 (`1726070401`) around block `125235812` | Mon Aug 12 16:00:00 UTC 2024 (`1723478400`) around block `15837930` | -| [Fjord](https://specs.optimism.io/protocol/fjord/overview.html) | [approved](https://gov.optimism.io/t/upgrade-proposal-9-fjord-network-upgrade/8236) | Wed Jul 10 16:00:01 UTC 2024 (`1720627201`) around block `122514212` | Wed May 29 16:00:00 UTC 2024 (`1716998400`) around block `12597930` | -| [Ecotone](https://specs.optimism.io/protocol/ecotone/overview.html) | [approved](https://gov.optimism.io/t/upgrade-proposal-5-ecotone-network-upgrade/7669) | Thu Mar 14 00:00:01 UTC 2024 (`1710374401`) around block `117387812` | Wed Feb 21 17:00:00 UTC 2024 (`1708534800`) around block `8366130` | -| [Delta](https://specs.optimism.io/protocol/delta/overview.html) | [approved](https://gov.optimism.io/t/final-upgrade-proposal-3-delta-network-upgrade/7310) | Thu Feb 22 00:00:00 UTC 2024 (`1708560000`) around block `116480612` | Fri Dec 22 00:00:00 UTC 2023 (`1703203200`) around block `5700330` | -| [Canyon](https://specs.optimism.io/protocol/canyon/overview.html) | [approved](https://gov.optimism.io/t/final-upgrade-proposal-2-canyon-network-upgrade/7088) | Thu Jan 11 17:00:01 UTC 2024 (`1704992401`) around block `114696812` | Tue Nov 14 17:00:00 UTC 2023 (`1699981200`) around block `4089330` | -| Bedrock | (https://gov.optimism.io/t/final-upgrade-1-bedrock-protocol-upgrade-v2/5548) | Tue Jun 06 2023 16:28:23 UTC (`1686079703`) at block `105235063` | N/A | +| Upgrade | Governance Approval | [OP Mainnet Activations](https://github.com/ethereum-optimism/superchain-registry/blob/main/superchain/configs/mainnet/superchain.toml) | [OP Sepolia Activations](https://github.com/ethereum-optimism/superchain-registry/blob/main/superchain/configs/sepolia/superchain.toml) | +| ------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------- | +| [Granite](https://specs.optimism.io/protocol/granite/overview.html) | [approved](https://gov.optimism.io/t/upgrade-proposal-10-granite-network-upgrade/8733) | Wed Sep 11 16:00:01 UTC 2024 (`1726070401`) around block `125235812` | Mon Aug 12 16:00:00 UTC 2024 (`1723478400`) around block `15837930` | +| [Fjord](https://specs.optimism.io/protocol/fjord/overview.html) | [approved](https://gov.optimism.io/t/upgrade-proposal-9-fjord-network-upgrade/8236) | Wed Jul 10 16:00:01 UTC 2024 (`1720627201`) around block `122514212` | Wed May 29 16:00:00 UTC 2024 (`1716998400`) around block `12597930` | +| [Ecotone](https://specs.optimism.io/protocol/ecotone/overview.html) | [approved](https://gov.optimism.io/t/upgrade-proposal-5-ecotone-network-upgrade/7669) | Thu Mar 14 00:00:01 UTC 2024 (`1710374401`) around block `117387812` | Wed Feb 21 17:00:00 UTC 2024 (`1708534800`) around block `8366130` | +| [Delta](https://specs.optimism.io/protocol/delta/overview.html) | [approved](https://gov.optimism.io/t/final-upgrade-proposal-3-delta-network-upgrade/7310) | Thu Feb 22 00:00:00 UTC 2024 (`1708560000`) around block `116480612` | Fri Dec 22 00:00:00 UTC 2023 (`1703203200`) around block `5700330` | +| [Canyon](https://specs.optimism.io/protocol/canyon/overview.html) | [approved](https://gov.optimism.io/t/final-upgrade-proposal-2-canyon-network-upgrade/7088) | Thu Jan 11 17:00:01 UTC 2024 (`1704992401`) around block `114696812` | Tue Nov 14 17:00:00 UTC 2023 (`1699981200`) around block `4089330` | +| Bedrock | ([https://gov.optimism.io/t/final-upgrade-1-bedrock-protocol-upgrade-v2/5548](https://gov.optimism.io/t/final-upgrade-1-bedrock-protocol-upgrade-v2/5548)) | Tue Jun 06 2023 16:28:23 UTC (`1686079703`) at block `105235063` | N/A | ## Summary of changes @@ -113,7 +113,7 @@ The Canyon upgrade uses a *L2 block-timestamp* activation-rule, and is specified rollup-node (`canyon_time`) and execution engine (`config.canyonTime`). Shanghai time in the execution engine should be set to the same time as the Canyon time. -### Bedrock +### Bedrock The Bedrock upgrade transitioned the OP Stack from its legacy design to a modern modular architecture. This new design separates the OP Stack into distinct consensus, execution, and settlement layers, enabling more efficient integration of future improvements and facilitating the growth of a Superchain ecosystem. From ec72f70b723c6f9e3056962b180e22c71985434a Mon Sep 17 00:00:00 2001 From: Richard Gregory Date: Tue, 5 Nov 2024 10:29:19 +0100 Subject: [PATCH 429/565] Add caveat for the priority fee --- pages/stack/transactions/fees.mdx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pages/stack/transactions/fees.mdx b/pages/stack/transactions/fees.mdx index 33e4e96be..fa7a9c813 100644 --- a/pages/stack/transactions/fees.mdx +++ b/pages/stack/transactions/fees.mdx @@ -52,7 +52,8 @@ Read more about the base fee in the [Ethereum.org documentation](https://ethereu Just like on Ethereum, OP Mainnet transactions can specify a **priority fee**. This priority fee is a price per unit of gas that is paid on top of the base fee. For example, if the block base fee is 1 gwei and the transaction specifies a priority fee of 1 gwei, the total price per unit of gas is 2 gwei. -The priority fee is an optional component of the execution gas fee and can be set to 0. +The priority fee is an optional component of the execution gas fee and can technically be set to 0. +However, while EIP-1559 does not define a minimum priority fee, certain wallets and mempool implementations (like Geth) may enforce a minimum value. Geth, for example, typically hardcodes a minimum of 1 wei but defaults to a configurable minimum of around 1 gwei.. **The OP Mainnet sequencer will prioritize transactions with a higher priority fee** and execute them before any transactions with a lower priority fee. If transaction speed is important to your application, you may want to set a higher priority fee to ensure that your transaction is included more quickly. From aa0b7d0ee0228553fba790d302223f1fe08365d6 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Tue, 5 Nov 2024 16:50:40 +0100 Subject: [PATCH 430/565] Geth sets defaults to 1 gwei --- pages/stack/transactions/fees.mdx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pages/stack/transactions/fees.mdx b/pages/stack/transactions/fees.mdx index fa7a9c813..31340544a 100644 --- a/pages/stack/transactions/fees.mdx +++ b/pages/stack/transactions/fees.mdx @@ -52,8 +52,8 @@ Read more about the base fee in the [Ethereum.org documentation](https://ethereu Just like on Ethereum, OP Mainnet transactions can specify a **priority fee**. This priority fee is a price per unit of gas that is paid on top of the base fee. For example, if the block base fee is 1 gwei and the transaction specifies a priority fee of 1 gwei, the total price per unit of gas is 2 gwei. -The priority fee is an optional component of the execution gas fee and can technically be set to 0. -However, while EIP-1559 does not define a minimum priority fee, certain wallets and mempool implementations (like Geth) may enforce a minimum value. Geth, for example, typically hardcodes a minimum of 1 wei but defaults to a configurable minimum of around 1 gwei.. +The priority fee(tip) is an optional component of the execution gas fee and can technically be set to 0. +However, while EIP-1559 does not define a minimum priority fee, certain wallets and mempool implementations (like Geth) may enforce a minimum value. For instance, Geth typically defaults to a minimum priority fee of 1 gwei, but this can be configured to other values. **The OP Mainnet sequencer will prioritize transactions with a higher priority fee** and execute them before any transactions with a lower priority fee. If transaction speed is important to your application, you may want to set a higher priority fee to ensure that your transaction is included more quickly. From eda6ab755faec1e5a6bbdcc695280fa7067670d4 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Wed, 6 Nov 2024 11:56:30 +0100 Subject: [PATCH 431/565] Removed passive tones, and rephrased contents --- .../transactions/transaction-finality.mdx | 66 +++++++------------ words.txt | 9 ++- 2 files changed, 31 insertions(+), 44 deletions(-) diff --git a/pages/stack/transactions/transaction-finality.mdx b/pages/stack/transactions/transaction-finality.mdx index 3c74c9853..2ffbc8c6a 100644 --- a/pages/stack/transactions/transaction-finality.mdx +++ b/pages/stack/transactions/transaction-finality.mdx @@ -1,5 +1,5 @@ --- -title: Transaction Finality +title: Transaction finality lang: en-US description: Learn when transactions on OP Stack chains can be considered finalized. --- @@ -9,24 +9,24 @@ import { Callout } from 'nextra/components' # Transaction finality -This page explains when transactions on OP Stack chains can be considered "finalized" and addresses common misconceptions about transaction finality on the OP Stack. +This guide explains when transactions on OP Stack chains are considered finalized and addresses common misconceptions about transaction finality on the OP Stack. ## Basics of finality -Transaction "finality" is a term used to describe the point at which a transaction is irreversible under certain assumptions. For example, Ethereum transactions are considered finalized when certain conditions in Ethereum's consensus mechanism are met. Many applications built on top of Ethereum make use of this property when making certain decisions, like crediting a user's account when the user makes a deposit to an exchange. +Transaction finality refers to the point at which a transaction becomes irreversible under certain assumptions. For example, Ethereum transactions are considered finalized when specific conditions in Ethereum's consensus mechanism are met. Many applications built on Ethereum rely on this property when making decisions, such as crediting a user's account after they deposit funds. ## OP Stack finality -OP Stack chains in the Standard Configuration are Rollups that utilize Ethereum's consensus mechanism to order and finalize transactions instead of running an entirely separate consensus protocol. As a result, chains using the OP Stack inherit the ordering and finality properties of Ethereum. +OP Stack chains in the standard configuration are Rollups that use Ethereum's consensus mechanism to order and finalize transactions rather than running a separate consensus protocol. Therefore, OP Stack chains inherit Ethereum's ordering and finality properties. ## Steps to finality -Transactions on OP Stack chains follow a simple process to finality: +Transactions on OP Stack chains go through the following process to reach finality: -1. A user submits a transaction to the network, which is forwarded to the Sequencer. -1. The Sequencer includes the transaction in a block and distributes the block over a public p2p network. The user's transaction is now considered to be in a known but **"unsafe"** state. Here, "unsafe" is a technical term used to describe the fact that the transaction has been included in a block whose data has not yet been posted to Ethereum. This typically takes just a few seconds. -1. The Sequencer publishes the data for this block to Ethereum either as [blob data](https://www.eip4844.com/) or as calldata attached to a standard Ethereum transaction. Once this transaction is included in an Ethereum block, the user's transaction is considered to be in a **"safe"** state. This step typically takes 5-10 minutes. -1. The Ethereum block containing the Sequencer's transaction is finalized. At this point, the user's transaction is considered to be in a **"finalized"** state. Ethereum finalization typically takes ~65 Ethereum blocks or ~13 minutes but may take longer under certain network conditions. Finality here is entirely dependent on [Ethereum's consensus mechanism](https://ethereum.org/en/developers/docs/consensus-mechanisms/pos/#finality). +1. A user submits a transaction to the network, which forwards it to the Sequencer. +2. The Sequencer includes the transaction in a block and distributes it over a public peer-to-peer network. At this point, the transaction is considered **"unsafe"**. A technical term indicating that the transaction is in a block but its data has not yet been posted to Ethereum. This process typically takes only a few seconds. +3. The Sequencer publishes this block's data to Ethereum, either as [blob data](https://www.eip4844.com/) or as calldata attached to a standard Ethereum transaction. Once included in an Ethereum block, the transaction is **"safe"**. This step usually takes 5–10 minutes. +4. The Ethereum block containing the Sequencer's transaction is finalized. At this point, the transaction reaches a **"finalized"** state. Ethereum finalization typically takes about 65 Ethereum blocks, or approximately 13 minutes, but may take longer under certain network conditions. Finality depends entirely on [Ethereum's consensus mechanism](https://ethereum.org/en/developers/docs/consensus-mechanisms/pos/#finality). TODO: Fix this so it has the right numbers @@ -34,52 +34,36 @@ TODO: Fix this so it has the right numbers ## Common misconceptions -### Misconception: transactions take 7 days to finalize +### Transactions take 7 days to finalize -It's common to hear that transactions on OP Stack chains take 7 days to finalize. **This is incorrect.** Transactions on OP Stack chains become finalized when their data is included in a finalized Ethereum block. This typically takes ~20-30 minutes from the time the transaction is submitted. To reorg a finalized OP Stack chain transaction, you would have to be able to reorg the finalized Ethereum block that transaction's data is included within. +A common misconception is that transactions on OP Stack chains take 7 days to finalize. **This is incorrect.** Transactions on OP Stack chains become finalized when their data is included in a finalized Ethereum block, typically around 20–30 minutes after submission. To reorg a finalized OP Stack chain transaction, a reorg of the corresponding Ethereum block would be required. -Confusion about this fact commonly stems from the OP Stack's Standard Bridge design which includes a 7 day delay on *withdrawals* of ETH and other ERC-20 tokens from the bridge. This means that it takes a minimum of 7 days to move tokens from an OP Stack chain to Ethereum when using the Standard Bridge. The 7 day withdrawal delay applies to only to these withdrawals and has no impact the speed of finality on the OP Stack chain. +This misconception often arises due to the OP Stack's Standard Bridge, which includes a 7-day delay on *withdrawals* of ETH and ERC-20 tokens. Withdrawing tokens from an OP Stack chain to Ethereum using the Standard Bridge requires a minimum 7-day wait. This delay affects only withdrawals and does not impact transaction finality on the OP Stack chain. -### Misconception: challenges in the Standard Bridge can cause a chain reorg +### Challenges in the Standard Bridge can cause a chain reorg -Another common misconception related to the misconception that [finalization takes 7 days](#misconception-transactions-take-7-days-to-finalize) is the idea that **Fault Proof challenges** created in response to withdrawals within the Standard Bridge can cause an OP Stack chain to reorganize itself (reorg). **This is not correct.** OP Stack transactions are never reorganized in response to any Fault Proof challenge. +Another misconception related to the belief that [finalization takes 7 days](#misconception-transactions-take-7-days-to-finalize) is that **Fault Proof challenges** created in response to withdrawals in the Standard Bridge can reorganize the OP Stack chain. **This is incorrect.** OP Stack transactions are not reorganized in response to Fault Proof challenge. -The Standard Bridge is a bridge application that is included by default with any OP Stack chain and connects the chain to its "parent" blockchain (usually Ethereum). The Standard Bridge takes advantage of the special relationship between a Rollup and its parent blockchain to be able to provide a high level of security for any ETH and ERC-20 tokens moved through the bridge. +The [Standard Bridge](/builders/app-developers/bridging/standard-bridge) is a bridge application that is included by default with any OP Stack chain and connects the chain to its "parent" blockchain (usually Ethereum). It offers a high level of security for ETH and ERC-20 tokens moved through the bridge. -Users that want to send ETH or ERC-20 tokens from the OP Stack chain to Ethereum through the Standard Bridge must first *burn* these ETH or ERC-20 tokens on the OP Stack chain. The user can then create a **withdrawal claim** on Ethereum that *claims* that they have indeed burned these tokens on the OP Stack chain. +When using the Standard Bridge, users who send ETH or ERC-20 tokens to Ethereum must first burn those tokens on the OP Stack chain and then create a **withdrawal claim** on Ethereum. -Since the Standard Bridge is a smart contract on Ethereum and smart contracts can't run a whole node for an OP Stack chain, it has no way to immediately determine if a given withdrawal claim actually corresponds to real tokens being burned on the OP Stack chain. Instead, the Standard Bridge delays a claim by 7 days to allow time for the OP Stack Fault Proof system to filter out any "bad" withdrawal claims. - -Anyone can make any sort of withdrawal claim at any time because the bridge has no way to immediately distinguish a good claim from a bad one. Challenges simply remove a bad withdrawal claim without any other impact to the Standard Bridge or the underlying OP Stack chain. +Because the Standard Bridge cannot immediately verify withdrawal claims, it delays the claim by 7 days to allow the OP Stack Fault Proof system to filter out any invalid claims. Challenges only remove bad claims without affecting the Standard Bridge or the OP Stack chain. TODO: It'd be really fun to have a button that (for the bond cost of 0.08 ETH) creates a bad withdrawal claim for all of the ETH in the bridge. Users would be able to see first hand how their claim gets deleted and nothing else happens. -### Misconception: the Sequencer can always reorg the chain - -Sequencers play an important role in an OP Stack chain. The Sequencer acts as the block producer for the chain and quickly creates blocks as it receives user transactions. Here we'll address the common misconception that the Sequencer can cause reorganizations of the OP Stack chain over long periods of time. - -The OP Stack expects the Sequencer to produce a block every 1 or 2 seconds depending on the configuration of the chain. Since this 1 or 2 second block time is less than Ethereum's 12 second block time, there will always be some time before a Sequencer's block can be published to Ethereum. - -Sequencers **can** reorganize blocks *before* they are published to Ethereum, which is why OP Stack chain nodes consider these blocks to be **"unsafe"**. Although "unsafe" blocks are typically not reorganized, it is important for applications to understand that a reorganization is always possible. Reorgs of "unsafe" blocks *have* previously occurred during temporary Sequencer outages. - -Reorganization becomes significantly more difficult once the Sequencer publishes block data to Ethereum. At this point, the Sequencer would have to *intentionally* cause a reorg of Ethereum itself. Given the difficulty required to trigger such a reorg, OP Stack nodes are programmed to consider transactions to be **"safe"** when this condition is reached. - -Once block data for the OP Stack chain is included in a finalized Ethereum block, the Sequencer **cannot** cause a reorganization of the OP Stack chain without violating finality in Ethereum itself. Applications built on top of Ethereum typically operate under the assumption that such a violation is not possible. - -In summary: - -* The Sequencer **can** cause a reorganization of **"unsafe"** blocks that have not yet been published to Ethereum (within ~5-10 minutes). -* The Sequencer **could** cause a reorgnization of **"safe** blocks that have been published to Ethereum but not yet included in a finalized Ethereum block (within ~15-30 minutes). To do this, the Sequencer would need to be able to intentionally cause a reorganization of Ethereum itself. -* The Sequencer **cannot** cause a reorganizaton of **"finalized"** blocks that have been included in a finalized Ethereum block (after ~15-30 minutes) without violating Ethereum's finality guarantees. +### The Sequencer can always reorg the chain -### Misconception: Ethereum reorgs will cause reorgs on the OP Stack chain +A common misconception is that the Sequencer can trigger reorganizations of the OP Stack chain at any time. However, while the Sequencer can reorganize **"unsafe"** blocks (not yet published to Ethereum), reorganizations become more challenging once blocks are **"safe"** or **"finalized."** -When we touched on the misconception that the [Sequencer can always reorganize the chain](#misconception-the-sequencer-can-always-reorganize-the-chain) above we noted that transactions that are **"unsafe"** or **"safe"** could be impacted by reorganizations of Ethereum itself. Although it's unlikely for the Sequencer to be able to affect such a reorganization intentionally, Ethereum reorganizations *do* occur from time to time. +* **Unsafe blocks:** The Sequencer can reorganize these blocks (typically within \~5–10 minutes). +* **Safe blocks:** The Sequencer would need to trigger a reorg on Ethereum itself, which is complex and unlikely. +* **Finalized blocks:** Once blocks are included in a finalized Ethereum block (typically after \~15–30 minutes), the Sequencer cannot reorganize them without compromising Ethereum's finality guarantees. -When a reorganization occurs on Ethereum, assuming that the Sequencer is not intentionally triggering this reorg, the OP Stack chain will attempt to gracefully recover. OP Stack nodes will automatically downgrade **"safe"** transactions back into **"unsafe"** transactions if necessary. At the same time, the Sequencer will begin the process of publishing transaction data again to re-establish the original chain. +### Ethereum reorgs cause OP Stack chain reorgs -Graceful handling of Ethereum reorgs means that an OP Stack chain will typically recover without experiencing any sort of reorganization itself. In rare cases, extreme Ethereum network conditions *could* cause reorganizations of an OP Stack chain, but **"finalized"** OP Stack chain transactions can **never** be reorganized. +If Ethereum experiences a reorg, OP Stack chains will attempt a graceful recovery. OP Stack nodes will downgrade **"safe"** transactions to **"unsafe"** if needed, while the Sequencer republishes transaction data to maintain chain continuity. Although extreme Ethereum network conditions could potentially affect the OP Stack chain, **"finalized"** OP Stack transactions are protected from reorgs. ## Conclusion -Transaction finality in the OP Stack is a lot simpler than it seems. OP Stack chains utilize Ethereum for consensus and inherit Ethereum's finality guarantees as a result. Once your node reports an OP Stack chain transaction as **"finalized"**, it can't be reversed. +Transaction finality on the OP Stack is simpler than it may seem. OP Stack chains inherit Ethereum's finality guarantees, so once a transaction is **"finalized,"** it cannot be reversed. diff --git a/words.txt b/words.txt index 376553b4f..5be79af1c 100644 --- a/words.txt +++ b/words.txt @@ -1,5 +1,5 @@ -accountqueue ACCOUNTQUEUE +accountqueue ACCOUNTSLOTS accountslots ADDI @@ -29,8 +29,8 @@ BLOBPOOL blobpool blobspace blockhash -BLOCKLOGS blocklists +BLOCKLOGS blocklogs BLOCKPROFILERATE blockprofilerate @@ -326,7 +326,9 @@ safedb Schnorr secp SELFDESTRUCT +SEPOLIA Sepolia +sepolia seqnr SEQUENCERHTTP sequencerhttp @@ -390,6 +392,7 @@ VHOSTS vhosts Viem viem +Viem's VMDEBUG vmdebug VMODULE @@ -403,4 +406,4 @@ xtensibility ZKPs ZKVM Zora -zora \ No newline at end of file +zora From 4c88d3a485e8e0c9aad4d99dd3ea9e86521d2c91 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Wed, 6 Nov 2024 14:15:28 +0100 Subject: [PATCH 432/565] replaced image with a mermaid diagram --- .../transactions/transaction-finality.mdx | 22 ++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/pages/stack/transactions/transaction-finality.mdx b/pages/stack/transactions/transaction-finality.mdx index 2ffbc8c6a..02dbee8e3 100644 --- a/pages/stack/transactions/transaction-finality.mdx +++ b/pages/stack/transactions/transaction-finality.mdx @@ -30,8 +30,28 @@ Transactions on OP Stack chains go through the following process to reach finali TODO: Fix this so it has the right numbers -Transaction Finality Diagram. +```mermaid +sequenceDiagram + participant User + participant Network + participant Sequencer + participant Ethereum + + User->>Network: Submit transaction + Network->>Sequencer: Forward transaction + Sequencer->>Sequencer: Include transaction in block + Sequencer->>Network: Distribute block over P2P network + Note right of Sequencer: Transaction status: "unsafe"
    (block data not yet posted to Ethereum)
    ~a few seconds + + Sequencer->>Ethereum: Publish block data (as blob data
    or calldata) + Note right of Ethereum: Transaction status: "safe"
    (included in Ethereum block)
    ~5–10 minutes + + Ethereum->>Ethereum: Finalize block (~65 blocks or ~13 mins) + Note right of Ethereum: Transaction status: "finalized"
    ~13 minutes (may vary) + + +``` ## Common misconceptions ### Transactions take 7 days to finalize From 241c58733667574797b7f2f934a0bede0c629e35 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Wed, 6 Nov 2024 14:19:53 +0100 Subject: [PATCH 433/565] update meta.json --- pages/stack/transactions/_meta.json | 1 + 1 file changed, 1 insertion(+) diff --git a/pages/stack/transactions/_meta.json b/pages/stack/transactions/_meta.json index 25cae38ce..ebc6603e2 100644 --- a/pages/stack/transactions/_meta.json +++ b/pages/stack/transactions/_meta.json @@ -1,6 +1,7 @@ { "fees": "Transaction fees", "transaction-flow": "Transaction flow", + "transaction-finality" : "Transaction finality", "deposit-flow": "Deposit flow", "withdrawal-flow": "Withdrawal flow", "forced-transaction": "Forced transaction", From 378c27e3c62f95a66af5f7a7eb3446a359deff51 Mon Sep 17 00:00:00 2001 From: Cypher Pepe <125112044+cypherpepe@users.noreply.github.com> Date: Wed, 6 Nov 2024 17:08:01 +0300 Subject: [PATCH 434/565] typo corr optimization.mdx --- pages/builders/app-developers/contracts/optimization.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/builders/app-developers/contracts/optimization.mdx b/pages/builders/app-developers/contracts/optimization.mdx index d792cf4b1..534ba1c67 100644 --- a/pages/builders/app-developers/contracts/optimization.mdx +++ b/pages/builders/app-developers/contracts/optimization.mdx @@ -75,5 +75,5 @@ Custom argument encodings can be combined with stored data to further reduce cos For example, `address` arguments could potentially be replaced with a `uint64` pointer that performs a lookup in a stored mapping of `uint64 => address`. This would cut out a significant number of bytes with further reductions if the total number of addresses that need to be looked up is small (which would allow `uint64` to be reduced to `uint32` or less). -Custom encodings are typically less complex that general-purpose calldata compression libraries but carry additional complexity no matter what. +Custom encodings are typically less complex than general-purpose calldata compression libraries but carry additional complexity no matter what. When combined with stored data, application-specific custom encodings can be significantly more efficient than general-purpose compression mechanisms. From b7eaeae2ec5affc8d8c505e6255bc989cb829909 Mon Sep 17 00:00:00 2001 From: Cypher Pepe <125112044+cypherpepe@users.noreply.github.com> Date: Wed, 6 Nov 2024 17:27:06 +0300 Subject: [PATCH 435/565] typo corr estimates.mdx --- pages/builders/app-developers/transactions/estimates.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/builders/app-developers/transactions/estimates.mdx b/pages/builders/app-developers/transactions/estimates.mdx index 8fb70e326..62d3668f4 100644 --- a/pages/builders/app-developers/transactions/estimates.mdx +++ b/pages/builders/app-developers/transactions/estimates.mdx @@ -76,7 +76,7 @@ This means that the L1 data fee for your transaction may differ from your estima The L1 data fee is calculated based on the size of your serialized transaction in bytes. Most Ethereum tooling will provide a method for serializing a transaction. -For instance, Ethersjs provides the [`ethers.utils.serializeTransaction`](https://docs.ethers.org/v5/api/utils/transactions/#utils-serializeTransaction) method. +For instance, Ethers.js provides the [`ethers.utils.serializeTransaction`](https://docs.ethers.org/v5/api/utils/transactions/#utils-serializeTransaction) method. {

    Estimate the L1 data fee

    } From 6e032da4ddb715e28bf344bd233d51afe9c48d15 Mon Sep 17 00:00:00 2001 From: Cypher Pepe <125112044+cypherpepe@users.noreply.github.com> Date: Wed, 6 Nov 2024 17:30:04 +0300 Subject: [PATCH 436/565] typo corr troubleshooting.mdx --- pages/builders/app-developers/transactions/troubleshooting.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/builders/app-developers/transactions/troubleshooting.mdx b/pages/builders/app-developers/transactions/troubleshooting.mdx index 2953b8479..22a7e06e5 100644 --- a/pages/builders/app-developers/transactions/troubleshooting.mdx +++ b/pages/builders/app-developers/transactions/troubleshooting.mdx @@ -14,7 +14,7 @@ However, it still shrinks by only up to 12.5% in the same twelve second period ( If the maximum fee per gas specified by the transaction is less than the block base fee, it does not get included until the base fee drops to below the value in the transaction. When this happens, some users may see their transaction become stuck. -No ETH are lost, but the transaction does not clear on its own. +No ETH is lost, but the transaction does not clear on its own. We have a workaround that users and wallet operators can implement immediately, and we expect a protocol-level fix to be live by the end of Q4. From c8c3d52fc14f7d74701bdd8f0bf77c082b70b26e Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Wed, 6 Nov 2024 16:29:01 +0100 Subject: [PATCH 437/565] updated meta.json --- pages/stack/transactions.mdx | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/pages/stack/transactions.mdx b/pages/stack/transactions.mdx index 42bfac5a8..4f82dfc0f 100644 --- a/pages/stack/transactions.mdx +++ b/pages/stack/transactions.mdx @@ -11,17 +11,21 @@ import { Card, Cards } from 'nextra/components' Documentation covering Cross Domain, Deposit Flow, Fees, Forced Transaction, Transaction Flow, Transactions, Withdrawal Flow in the Transactions section of the OP Stack ecosystem. - - - + + + + + + + + - From f3ade02e08c5db7fc9aa1938784a25077023ade5 Mon Sep 17 00:00:00 2001 From: Cypher Pepe <125112044+cypherpepe@users.noreply.github.com> Date: Wed, 6 Nov 2024 18:30:29 +0300 Subject: [PATCH 438/565] typo corr custom-gas-token.mdx --- pages/builders/chain-operators/features/custom-gas-token.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/builders/chain-operators/features/custom-gas-token.mdx b/pages/builders/chain-operators/features/custom-gas-token.mdx index 599e43a6b..b62405f19 100644 --- a/pages/builders/chain-operators/features/custom-gas-token.mdx +++ b/pages/builders/chain-operators/features/custom-gas-token.mdx @@ -6,7 +6,7 @@ description: Learn how to run a custom gas token chain. import { Callout, Steps } from 'nextra/components' -# How torRun a custom gas token chain +# How to Run a custom gas token chain The Custom Gas Token feature is a Beta feature of the MIT licensed OP Stack. While it has received initial review from core contributors, it is still undergoing testing, and may have bugs or other issues. From 4ca73c3830e89bcb313e3e462929b15947f8d331 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Wed, 6 Nov 2024 16:32:15 +0100 Subject: [PATCH 439/565] Updated endpoint --- utils/calculator-helpers.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/utils/calculator-helpers.ts b/utils/calculator-helpers.ts index c6920a9c3..c2c9fcb26 100644 --- a/utils/calculator-helpers.ts +++ b/utils/calculator-helpers.ts @@ -1,11 +1,11 @@ import { transactionTypes } from "./transaction-types"; const L1GasBaseFee = - "https://static.optimism.io/op-analytics/reference_data/market_data/outputs/suggest_base_fee.txt"; // E76 + "https://raw.githubusercontent.com/ethereum-optimism/op-analytics/refs/heads/main/reference_data/market_data/outputs/suggest_base_fee.txt"; // E76 const ethToUsdRate = - "https://static.optimism.io/op-analytics/reference_data/market_data/outputs/ethusd.txt"; // E77 + "https://raw.githubusercontent.com/ethereum-optimism/op-analytics/refs/heads/main/reference_data/market_data/outputs/ethusd.txt"; // E77 const blobBaseFee = - "https://static.optimism.io/op-analytics/reference_data/market_data/outputs/blob_base_fee.txt"; // E78 + "https://raw.githubusercontent.com/ethereum-optimism/op-analytics/refs/heads/main/reference_data/market_data/outputs/blob_base_fee.txt"; // E78 // transactionsPerDay === E14: number // comparableTxnType === E15: string From d4442837bfb8813e66c7912fd7ae676cf3a73cd9 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Wed, 6 Nov 2024 16:35:59 +0100 Subject: [PATCH 440/565] updated text --- components/calculator/ResultsTable.tsx | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/components/calculator/ResultsTable.tsx b/components/calculator/ResultsTable.tsx index 07c4d812b..e20a0d7f8 100644 --- a/components/calculator/ResultsTable.tsx +++ b/components/calculator/ResultsTable.tsx @@ -108,13 +108,11 @@ export function ResultsTable({

    Note: This is an estimation,{" "} - see the Optimism Docs - {" "} - for steps on modifying parameters if needed once the chain is on - mainnet{" "} + read how to determine scalar values using blobs +

    C**AG=J}aSmVS>^ksYEK4P>wXVYD_Q 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

    ~}r6o!g5}JYyscCV@!x#h3Go&)MN8ULcG}qss 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

From 017f4e67702bf4f25ee6a44efab2610b246fabf2 Mon Sep 17 00:00:00 2001 From: Balraj Hariharan <100754149+BalrajHariharanA@users.noreply.github.com> Date: Wed, 6 Nov 2024 21:54:29 +0530 Subject: [PATCH 441/565] Deploy the L1 contract command path updated --- pages/builders/chain-operators/tutorials/create-l2-rollup.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/builders/chain-operators/tutorials/create-l2-rollup.mdx b/pages/builders/chain-operators/tutorials/create-l2-rollup.mdx index 52c7b5370..19bae6b04 100644 --- a/pages/builders/chain-operators/tutorials/create-l2-rollup.mdx +++ b/pages/builders/chain-operators/tutorials/create-l2-rollup.mdx @@ -418,7 +418,7 @@ Once you've configured your network, it's time to deploy the L1 contracts necess {

Deploy the L1 contracts

} ```bash -forge script scripts/deploy/Deploy.s.sol:Deploy --private-key $GS_ADMIN_PRIVATE_KEY --broadcast --rpc-url $L1_RPC_URL --slow +forge script scripts/Deploy.s.sol:Deploy --private-key $GS_ADMIN_PRIVATE_KEY --broadcast --rpc-url $L1_RPC_URL --slow ``` From 0b30cf195e082c1aed656a644d40c9ed3633a455 Mon Sep 17 00:00:00 2001 From: soyboy <85043086+sbvegan@users.noreply.github.com> Date: Wed, 6 Nov 2024 16:26:14 -0800 Subject: [PATCH 442/565] remove wallet & cex section --- pages/builders/_meta.json | 1 - pages/builders/cex-wallet-developers.mdx | 17 ----- .../builders/cex-wallet-developers/_meta.json | 4 -- .../cex-wallet-developers/cex-support.mdx | 62 ------------------- .../cex-wallet-developers/wallet-support.mdx | 56 ----------------- public/_redirects | 5 +- 6 files changed, 4 insertions(+), 141 deletions(-) delete mode 100644 pages/builders/cex-wallet-developers.mdx delete mode 100644 pages/builders/cex-wallet-developers/_meta.json delete mode 100644 pages/builders/cex-wallet-developers/cex-support.mdx delete mode 100644 pages/builders/cex-wallet-developers/wallet-support.mdx diff --git a/pages/builders/_meta.json b/pages/builders/_meta.json index b197dad8d..17ea9b121 100644 --- a/pages/builders/_meta.json +++ b/pages/builders/_meta.json @@ -3,6 +3,5 @@ "app-developers": "App developers", "chain-operators": "Chain operators", "node-operators": "Node operators", - "cex-wallet-developers": "Wallets & CEXs", "tools": "Developer tools" } diff --git a/pages/builders/cex-wallet-developers.mdx b/pages/builders/cex-wallet-developers.mdx deleted file mode 100644 index aedc0e7eb..000000000 --- a/pages/builders/cex-wallet-developers.mdx +++ /dev/null @@ -1,17 +0,0 @@ ---- -title: Cex Wallet Developers -description: Documentation covering Cex Support, Wallet Support in the Cex Wallet Developers section of the OP Stack ecosystem. -lang: en-US ---- - -import { Card, Cards } from 'nextra/components' - -# Cex Wallet Developers - -Documentation covering Cex Support, Wallet Support in the Cex Wallet Developers section of the OP Stack ecosystem. - - - - - - diff --git a/pages/builders/cex-wallet-developers/_meta.json b/pages/builders/cex-wallet-developers/_meta.json deleted file mode 100644 index f24a468fc..000000000 --- a/pages/builders/cex-wallet-developers/_meta.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "cex-support": "Guide for exchanges", - "wallet-support": "Guide for wallets" -} diff --git a/pages/builders/cex-wallet-developers/cex-support.mdx b/pages/builders/cex-wallet-developers/cex-support.mdx deleted file mode 100644 index b9bf2473c..000000000 --- a/pages/builders/cex-wallet-developers/cex-support.mdx +++ /dev/null @@ -1,62 +0,0 @@ ---- -title: Supporting OP Mainnet in your exchange -lang: en-US -description: Learn how to support OP Mainnet in your exchange. ---- - -import { Callout } from 'nextra/components' - -# Supporting OP Mainnet in your exchange - -Check out this guide to get an overview of everything you need to know to properly support OP Mainnet within your exchange. - -## Connecting to OP Mainnet - -OP Mainnet is designed to be [EVM equivalent](https://web.archive.org/web/20231127160757/https://medium.com/ethereum-optimism/introducing-evm-equivalence-5c2021deb306) and supports all of the same tooling as Ethereum. -You can use your favorite Ethereum libraries and tools to work with OP Mainnet. -Head over to the [Networks and RPC Endpoints](/chain/networks) page for network connection details and check out the [RPC Providers](/builders/tools/connect/rpc-providers) page for an updated list of RPC providers that support OP Mainnet. -If you need to run your own OP Mainnet node, head over to the [Node Operator](/builders/node-operators/rollup-node) guide. - -## Native gas token (ETH) - -OP Mainnet uses ETH as its native gas token. -Transactions are paid for in ETH and account balances are denominated in ETH. - -## Transaction fees - -OP Mainnet charges the standard gas fee for transactions, but also charges an additional L1 data fee for the cost of publishing transaction data to Ethereum. -Check out the [Transaction Fees](/stack/transactions/fees) page for more information about how transaction fees work on OP Mainnet. - -## Smart contracts - -Smart contracts on OP Mainnet function the same way they do on Ethereum. -This includes ERC-20 token contracts. -You can use your existing logic for managing withdrawals and deposits of ERC-20 tokens. - -## Token addresses - -The ERC-20 contract address for a token on OP Mainnet may differ from the address for the same token on Ethereum. -Make sure to reference the [Bridged Token Addresses](/chain/tokenlist) to confirm that you are using the correct token addresses in your application. - -## Bridging ETH and ERC-20s - -You may need to transfer ETH or ERC-20 tokens between OP Mainnet and Ethereum. -For instance, you may need to use this functionality to balance the supply of ETH on OP Mainnet and Ethereum depending on the demand for withdrawals and deposits on the two networks. -Refer to the [Basics of Bridging](/builders/app-developers/bridging/basics) and the [Standard Bridge](/builders/app-developers/bridging/standard-bridge) guides for more information about how to bridge ETH and ERC-20 tokens between OP Mainnet and Ethereum. - -## Transaction statuses - -OP Mainnet transactions have a number of different statuses during the transaction lifecycle. -Refer to the [Transaction Statuses](/builders/app-developers/transactions/statuses) page for more information about the different transaction statuses and how to handle them in your application. - - -Transaction statuses can be critical for the security of your application. -For instance, you may only want to credit a deposit if the transaction is finalized. -Make sure to understand the various transaction statuses to avoid security issues in your application. - - -## Audits and security reviews - -The OP Stack codebase upon which OP Mainnet is built has undergone a number of security reviews. -Visit [GitHub](https://github.com/ethereum-optimism/optimism/tree/develop/docs/security-reviews) for a full list of the most recent reports. -Additionally, refer to the [Security Model & FAQ](/chain/security/faq) page for more information about the security model of OP Mainnet. diff --git a/pages/builders/cex-wallet-developers/wallet-support.mdx b/pages/builders/cex-wallet-developers/wallet-support.mdx deleted file mode 100644 index ff0341390..000000000 --- a/pages/builders/cex-wallet-developers/wallet-support.mdx +++ /dev/null @@ -1,56 +0,0 @@ ---- -title: Supporting OP Mainnet in your wallet -lang: en-US -description: Learn how to support OP Mainnet in your wallet. ---- - -import { Callout } from 'nextra/components' - -# Supporting OP Mainnet in your wallet - -Check out this guide to get an overview of everything you need to know to properly support OP Mainnet within your wallet. - -## Connecting to OP Mainnet - -OP Mainnet is designed to be [EVM equivalent](https://web.archive.org/web/20231127160757/https://medium.com/ethereum-optimism/introducing-evm-equivalence-5c2021deb306) and supports all of the same tooling as Ethereum. -You can use your favorite Ethereum libraries and tools to work with OP Mainnet. -Head over to the [Networks and RPC Endpoints](/chain/networks) page for network connection details and check out the [RPC Providers](/builders/tools/connect/rpc-providers) page for an updated list of RPC providers that support OP Mainnet. -If you need to run your own OP Mainnet node, head over to the [Node Operator](/builders/node-operators/rollup-node) guide. - -## Native gas token (ETH) - -OP Mainnet uses ETH as its native gas token. -Transactions are paid for in ETH and account balances are denominated in ETH. - -## Transaction fees - -OP Mainnet charges the standard gas fee for transactions, but also charges an additional L1 data fee for the cost of publishing transaction data to Ethereum. -Check out the [Transaction Fees](/stack/transactions/fees) page for more information about how transaction fees work on OP Mainnet. - - -Transactions on OP Mainnet must pay for an additional "L1 data fee" that often heavily outweighs the standard gas fee. -Make sure that your wallet is configured to display this fee to your users so that they are aware of the total cost of their transaction. - - -## Smart contracts - -Smart contracts on OP Mainnet function the same way they do on Ethereum. -You can use your favorite Ethereum libraries and tools to interact with smart contracts on OP Mainnet. - -## Token addresses - -The ERC-20 contract address for a token on OP Mainnet may differ from the address for the same token on Ethereum. -Addresses for many common tokens will differ between OP Mainnet and Ethereum. -Make sure to reference the [Bridged Token Addresses](/chain/tokenlist) to confirm that you are using the correct token addresses in your application. - -## Bridging ETH and ERC-20s - -You may need to transfer ETH or ERC-20 tokens between OP Mainnet and Ethereum. -This is a useful feature for users who want to move tokens between the two networks. -Refer to the [Basics of Bridging](/builders/app-developers/bridging/basics) and the [Standard Bridge](/builders/app-developers/bridging/standard-bridge) guides for more information about how to bridge ETH and ERC-20 tokens between OP Mainnet and Ethereum. - -## Transaction statuses - -OP Mainnet transactions have a number of different statuses during the transaction lifecycle. -The status of a transaction can be useful for users. -Refer to the [Transaction Statuses](/builders/app-developers/transactions/statuses) page for more information about the different transaction statuses and how to handle them in your application. diff --git a/public/_redirects b/public/_redirects index 3eb5cb69c..43ad4e829 100644 --- a/public/_redirects +++ b/public/_redirects @@ -104,4 +104,7 @@ /stack/operators/features/proxyd /builders/chain-operators/tools/proxyd /builders/notices/granite-changes https://github.com/ethereum-optimism/docs/blob/ef619668ae44276edecdfd657157254b9809e2d6/pages/builders/notices/granite-changes.mdx /builders/notices/fp-changes https://github.com/ethereum-optimism/docs/blob/ef619668ae44276edecdfd657157254b9809e2d6/pages/builders/notices/fp-changes.mdx -/chain/differences /stack/differences \ No newline at end of file +/chain/differences /stack/differences +/builders/cex-wallet-developers/cex-support /builders/app-developers/overview +/builders/cex-wallet-developers/wallet-support /builders/app-developers/overview +/builders/cex-wallet-developers /builders/app-developers/overview \ No newline at end of file From 274b142e88521b93518a056a74bac7ba25c34de1 Mon Sep 17 00:00:00 2001 From: soyboy <85043086+sbvegan@users.noreply.github.com> Date: Wed, 6 Nov 2024 16:33:58 -0800 Subject: [PATCH 443/565] removing out of date files --- .../app-developers/contracts/_meta.json | 3 - .../contracts/compatibility.mdx | 24 -- .../app-developers/contracts/optimization.mdx | 79 ---- .../contracts/system-contracts.mdx | 100 ----- pages/builders/app-developers/tutorials.mdx | 2 - .../app-developers/tutorials/_meta.json | 1 - .../tutorials/first-contract.mdx | 367 ------------------ public/_redirects | 6 +- 8 files changed, 5 insertions(+), 577 deletions(-) delete mode 100644 pages/builders/app-developers/contracts/compatibility.mdx delete mode 100644 pages/builders/app-developers/contracts/optimization.mdx delete mode 100644 pages/builders/app-developers/contracts/system-contracts.mdx delete mode 100644 pages/builders/app-developers/tutorials/first-contract.mdx diff --git a/pages/builders/app-developers/contracts/_meta.json b/pages/builders/app-developers/contracts/_meta.json index c4b36699f..6e2ad3d2e 100644 --- a/pages/builders/app-developers/contracts/_meta.json +++ b/pages/builders/app-developers/contracts/_meta.json @@ -1,6 +1,3 @@ { - "compatibility": "Solidity compatibility", - "system-contracts": "System contracts", - "optimization": "Cost optimization", "superchain-erc20": "SuperchainERC20" } diff --git a/pages/builders/app-developers/contracts/compatibility.mdx b/pages/builders/app-developers/contracts/compatibility.mdx deleted file mode 100644 index 7133db286..000000000 --- a/pages/builders/app-developers/contracts/compatibility.mdx +++ /dev/null @@ -1,24 +0,0 @@ ---- -title: Solidity compatibility -lang: en-US -description: Learn about the differences between OP Mainnet and Ethereum when building Solidity contracts. ---- - -# Solidity compatibility - -OP Mainnet is designed to be [EVM equivalent](https://web.archive.org/web/20231127160757/https://medium.com/ethereum-optimism/introducing-evm-equivalence-5c2021deb306), which means OP Mainnet looks exactly like Ethereum in every way possible. -Almost all Ethereum tooling works out of the box on OP Mainnet, including the [Solidity](https://soliditylang.org/) smart contract language. -However, there are a few minor differences between OP Mainnet and Ethereum that you should be aware of when building Solidity contracts. - -## EVM/Opcode differences - -Most smart contracts will work on OP Mainnet without any changes. -Check out the [Differences Between Ethereum and OP Mainnet](/chain/differences#opcodes) page for a detailed list of the few differences you should know about. - -## Gas differences - -OP Mainnet uses the same gas costs as Ethereum. -However, OP Mainnet also charges an [L1 Data Fee](/stack/transactions/fees#l1-data-fee) for the cost of publishing an L2 transaction to L1. -This fee is charged based on the size of a transaction in bytes. -As a result, smart contract optimization techniques can differ slightly on OP Mainnet. -Refer to the [Contract Optimization guide](./optimization) for more information. diff --git a/pages/builders/app-developers/contracts/optimization.mdx b/pages/builders/app-developers/contracts/optimization.mdx deleted file mode 100644 index 534ba1c67..000000000 --- a/pages/builders/app-developers/contracts/optimization.mdx +++ /dev/null @@ -1,79 +0,0 @@ ---- -title: Contract optimization on OP Mainnet -lang: en-US -description: Learn how to optimize contracts for OP Mainnet and what to look out for when you do so. ---- - -import { Callout } from 'nextra/components' - -# Contract optimization on OP Mainnet - -OP Mainnet is designed to be [EVM equivalent](https://web.archive.org/web/20231127160757/https://medium.com/ethereum-optimism/introducing-evm-equivalence-5c2021deb306), which means OP Mainnet looks exactly like Ethereum in every way possible. -One large and mostly unavoidable discrepancy between OP Mainnet and Ethereum is a slight [difference in transaction fee models](/stack/transactions/fees). -This difference means that there are some opportunities to optimize OP Mainnet contracts to better take advantage of the OP Mainnet fee model. - -This guide explains the basic concepts that allow you to optimize OP Mainnet contracts and provides several examples of how you might take advantage of these concepts. -You'll also get a better understanding of the tradeoffs and risks involved with potential contract optimizations. -By the end of this guide you should have a clear understanding of how OP Mainnet contracts can be optimized and whether or not these optimizations make sense for your application. - - -Contract optimizations are powerful but can also create additional contract complexity. -Some types of optimizations may also become unnecessary as OP Mainnet evolves. -Make sure to read through all of the considerations on this page before committing to any optimizations. - - -## Fundamentals - -App developers might already be familiar with the concept of [gas optimization](https://github.com/0xisk/awesome-solidity-gas-optimization) to decrease the cost of interacting with smart contracts. -Gas optimization can reduce the amount of gas used by a contract and make your application cheaper (and therefore improve user experience). - -OP Mainnet contracts can be gas optimized to reduce overall transaction costs, just like contracts on Ethereum. -However, OP Mainnet transactions must also pay for another fee called the L1 Data Fee which accounts for the cost of publishing transaction data to Ethereum. -At the time this guide was written, this L1 Data Fee made up the majority of the cost of most transactions on OP Mainnet. - -Because the L1 Data Fee tends to be larger than the execution gas fee, **OP Mainnet contracts can be further optimized by increasing the amount of storage/execution used in order to decrease the amount of user-provided data in each transaction.** -This is the basic premise that makes OP Mainnet contract optimization slightly different than on Ethereum. - -## Considerations - -### Additional complexity - -Contract optimizations can create additional complexity, which can in turn create additional risk. -Developers should always consider whether this added complexity is worth the reduction in cost. - -### Changing economics - -Various potential upgrades to OP Mainnet may also make optimizations to the L1 Data Fee less relevant. -For instance, [EIP-4844](https://www.eip4844.com/), if adopted, should significantly reduce the cost of publishing data to Ethereum and would therefore also decrease the L1 Data Fee. - -OP Mainnet also uses an [EIP-1559](https://github.com/ethereum/EIPs/blob/master/EIPS/eip-1559.md) mechanism that automatically increases the base fee as chain usage increases. -Optimizations based on reducing the L1 Data Fee may become less relevant if the base fee becomes a larger part of the total transaction cost. - - -Generally speaking, **developers should assume that L1 Data Fee optimizations will become less useful as time goes on**. -If you expect your contracts to be used for long periods of time, you may wish to avoid optimizations that can potentially decrease long-term gas efficiency. -If you expect your contracts to be used mostly in the short term or you have the ability to upgrade contracts in the future, optimizations may be better suited for you. - - -## Techniques - -### Calldata compression - -Compressing user data on the client side and decompressing it on the contract side can be an effective way to decrease costs on OP Mainnet. -This technique decreases the amount of data provided by the user in exchange for a significant increase in onchain computation. - -Although several libraries exist to perform this calldata compression, none of these libraries have been audited as of the writing of this page. -As a result, links to these libraries have been explicitly omitted here to avoid encouraging developers from using potentially buggy software. -Most of these libraries can be found with a quick search online but, as always, be careful with code you find on the internet. - -### Custom encoding - -The [Solidity ABI encoding scheme](https://docs.soliditylang.org/en/v0.8.23/abi-spec.html#argument-encoding) is not particularly data efficient. -Contracts can often reduce the amount of calldata provided by defining a custom argument encoding protocol. - -Custom argument encodings can be combined with stored data to further reduce costs. -For example, `address` arguments could potentially be replaced with a `uint64` pointer that performs a lookup in a stored mapping of `uint64 => address`. -This would cut out a significant number of bytes with further reductions if the total number of addresses that need to be looked up is small (which would allow `uint64` to be reduced to `uint32` or less). - -Custom encodings are typically less complex than general-purpose calldata compression libraries but carry additional complexity no matter what. -When combined with stored data, application-specific custom encodings can be significantly more efficient than general-purpose compression mechanisms. diff --git a/pages/builders/app-developers/contracts/system-contracts.mdx b/pages/builders/app-developers/contracts/system-contracts.mdx deleted file mode 100644 index 4178a81a4..000000000 --- a/pages/builders/app-developers/contracts/system-contracts.mdx +++ /dev/null @@ -1,100 +0,0 @@ ---- -title: Using OP Mainnet system contracts -lang: en-US -description: Learn how to work with OP Mainnet contracts directly from other contracts and how to work with contracts from the client side. ---- - -import { Steps } from 'nextra/components' - -# Using OP Mainnet system contracts - -System contracts on Ethereum (L1) and OP Mainnet (L2) are an important part of the OP Mainnet ecosystem. -You may want to interact with these system contracts for any number of reasons, including: - -* Sending messages between L1 and L2 -* Sending tokens between L1 and L2 -* Querying information about the current [L1 data fee](/stack/transactions/fees#the-l1-data-fee) -* And lots more! - -In this tutorial, you'll learn how to work with OP Mainnet contracts directly from other contracts and how to work with them from the client side. - -## Before you begin - -You'll need to find the address of the particular contract that you want to interact with before you can actually interact with it. - -* Check out the [Networks and Connection Details page](/chain/networks) for links to public RPC endpoints and contract addresses. -* Find the addresses for all networks on the [Contract Addresses](/chain/addresses) page. -* Use the JSON file including contract addresses for all Superchain networks in the [Superchain Registry](https://github.com/ethereum-optimism/superchain-registry/blob/main/superchain/extra/addresses/addresses.json). - -## Using system contracts in Solidity - -All you need to interact with the OP Mainnet system contracts from another contract is an address and an interface. -You can follow [the instructions above](#finding-contract-addresses) to find the address of the contract you want to interact with. -Now you simply need to import the appropriate contracts. - - -### Installing via NPM - -You can use the [`@eth-optimism/contracts-bedrock`](https://www.npmjs.com/package/@eth-optimism/contracts-bedrock?activeTab=readme) npm package to import system contracts and their interfaces. -Install the package as follows: - -```bash -npm install @eth-optimism/contracts-bedrock -``` - -### Importing contracts - -Simply import the desired contract or interface from the `@eth-optimism/contracts-bedrock` package: - -```solidity -import { SomeOptimismContract } from "@eth-optimism/contracts-bedrock/path/to/SomeOptimismContract.sol"; -``` - -Please note that `path/to/SomeOptimismContract` is the path to the contract [within this folder](https://github.com/ethereum-optimism/optimism/blob/v1.1.4/packages/contracts-bedrock/src). -For example, if you wanted to import the [`L1CrossDomainMessenger`](https://github.com/ethereum-optimism/optimism/blob/v1.1.4/packages/contracts-bedrock/src/L1/L1CrossDomainMessenger.sol) contract, you would use the following import: - -```solidity -import { L1CrossDomainMessenger } from "@eth-optimism/contracts/L1/messaging/L1CrossDomainMessenger.sol"; -``` - -### Getting L2 contract addresses - -System contracts on L2 are "pre-deployed" to special addresses that are the same on most OP Stack chains. -You can find these addresses on the [Contract Addresses](/chain/addresses) page. -These addresses are also provided as constants in the [`Predeploys`](https://github.com/ethereum-optimism/optimism/blob/v1.1.4/packages/contracts-bedrock/src/libraries/Predeploys.sol) contract for use in Solidity. - - -## Using system contracts in JavaScript - -You can also interact with the OP Mainnet system contracts from the client side. - -### Installing via NPM - -You can use the [`@eth-optimism/contracts-ts`](https://www.npmjs.com/package/@eth-optimism/contracts-ts?activeTab=readme) npm package to import system contracts and their interfaces. -Install the package as follows: - -```bash -npm install @eth-optimism/contracts-ts -``` - -### Getting contract artifacts and interfaces - -You can use the `@eth-optimism/contracts-ts` package to easily access the address or ABI of any OP Mainnet contract. - -Here's an example of how you can grab the ABI and address of the `L2OutputOracleProxy` contract on OP Mainnet (chain ID 10): - -```ts -import { - l2OutputOracleProxyABI, - l2OutputOracleAddresses, -} from '@eth-optimism/contracts-ts' - -// Note that the address is keyed by chain ID! -console.log(l2OutputOracleAddresses[10], l2OutputOracleProxyABI) -``` -### Interacting with the contract -You can then feed this address and ABI into your favorite web3 library to interact with the contract. - -`@eth-optimism/contracts-ts` also exports [React hooks](https://wagmi.sh/cli/api/plugins/react) and [wagmi actions](https://wagmi.sh/react/api/actions) for interacting with OP Mainnet contracts. -Check out the full [README](https://github.com/ethereum-optimism/optimism/tree/v1.1.4/packages/contracts-ts#readme) for more information. - diff --git a/pages/builders/app-developers/tutorials.mdx b/pages/builders/app-developers/tutorials.mdx index 807686a51..9376b72b8 100644 --- a/pages/builders/app-developers/tutorials.mdx +++ b/pages/builders/app-developers/tutorials.mdx @@ -17,8 +17,6 @@ This section provides information on bridging erc 20 tokens to op mainnet with t - - diff --git a/pages/builders/app-developers/tutorials/_meta.json b/pages/builders/app-developers/tutorials/_meta.json index 45ddaf362..c3a3283a0 100644 --- a/pages/builders/app-developers/tutorials/_meta.json +++ b/pages/builders/app-developers/tutorials/_meta.json @@ -1,5 +1,4 @@ { - "first-contract": "Deploying your first contract on OP Mainnet", "cross-dom-solidity": "Communicating between chains in Solidity", "cross-dom-bridge-eth": "Bridging ETH with Viem", "cross-dom-bridge-erc20": "Bridging ERC-20 tokens with the Optimism SDK", diff --git a/pages/builders/app-developers/tutorials/first-contract.mdx b/pages/builders/app-developers/tutorials/first-contract.mdx deleted file mode 100644 index 03acec0c1..000000000 --- a/pages/builders/app-developers/tutorials/first-contract.mdx +++ /dev/null @@ -1,367 +0,0 @@ ---- -title: Deploying your first contract on OP Mainnet -lang: en-US -description: Learn how to write and deploy your first contract on OP Mainnet using the MetaMask browser extension. ---- - -import { Callout, Steps } from 'nextra/components' - -# Deploying your first contract on OP Mainnet - - -**This tutorial is meant for developers who are new to OP Mainnet and Solidity.** -If you're already familiar with Solidity, consider reading the [OP Mainnet Differences](/chain/differences) guide to understand how OP Mainnet differs from Ethereum. -OP Mainnet is designed to "just work" with existing Ethereum tooling, so you can use the tools you already know like [Hardhat](https://hardhat.org/) or [Foundry](https://getfoundry.sh) just like you would on Ethereum. - - -This tutorial walks you through the process of deploying your first smart contract to OP Mainnet using the [Remix](https://remix.ethereum.org) in-browser Solidity IDE. - -## Dependencies - -* Firefox or any Chromium-based browser (Chrome, Brave, Edge, etc.) - -## Wallet setup - -You'll need access to an [Ethereum wallet](https://ethereum.org/en/wallets/) if you want to deploy a smart contract. -This tutorial uses [MetaMask](https://metamask.io), a popular browser extension wallet, just to get you started. -MetaMask is also available as a mobile application, but it's typically easier to use the browser extension for development. -If you already have MetaMask installed, you can skip this section. - - -Browser-based wallets like MetaMask are convenient for development, but they're not the most secure option. -You should never store large amounts of ETH or ERC-20 tokens in a browser-based wallet. -If you're planning to store a significant amount of ETH or ERC-20 tokens, consider using a hardware wallet instead. - - - - -{

Install the MetaMask extension for your browser

} - -Head over to [metamask.io](https://metamask.io) and click the "Download" button. -You'll then be given an option to install the MetaMask extension for your browser. -If using a Chromium-based browser, you may be prompted to install the MetaMask extension from the Chrome Web Store. -An onboarding page will pop up once the extension is installed. - -![MetaMask download page.](/img/builders/app-developers/tutorials/first-contract/mm-install.png) - -{

Continue to create a new wallet

} - -MetaMask will ask you to accept their terms of service. -Read them carefully, then tick the box to accept them. -Once you've accepted the terms of service, you can create a new wallet by clicking the "Create a new wallet" button. - -![MetaMask wallet creation page.](/img/builders/app-developers/tutorials/first-contract/mm-start.png) - -{

Decide if you want to share usage data

} - -After starting the wallet creation process you'll be asked if you'd like to share usage data with MetaMask. -This is entirely up to you. -Select "I agree" or "No thanks" depending on your preference. - -{

Create a password

} - -You'll be asked to create a password for your wallet. -This password will be used to encrypt your wallet, so make sure it's a strong one that you won't forget. - -You'll be asked to confirm that you understand MetaMask cannot recover your password if you lose it. -You may want to store this password in a password manager. -Remember, browser-based wallets are great for development but are not the most secure option. -Consider looking into a hardware wallet if you're planning to store a significant amount of ETH or ERC-20 tokens. - -Once you've written down your password, click "Create a new wallet" to continue. - -![MetaMask password creation page.](/img/builders/app-developers/tutorials/first-contract/mm-password.png) - -{

Watch the short security video

} - -MetaMask will now show you a short video about wallet security. -If this is your first time using MetaMask or a browser-based wallet, it's recommended that you watch the video. - -{

Secure your wallet

} - -You'll be presented with the option to "Secure my wallet (recommended)" or "Remind me later (not recommended)". -It's strongly recommended to continue with the "Secure my wallet (recommended)" option. -This will prompt you to back up your wallet and might prevent you from losing access to your wallet down the line. - -![MetaMask security video page.](/img/builders/app-developers/tutorials/first-contract/mm-secure.png) - -{

Write down your secret recovery phrase

} - -After continuing with "Secure my wallet (recommended)", you'll be asked to write down a 12 word secret recovery phrase. -This phrase can be used to recover your wallet if you lose your password or the browser extension somehow becomes corrupted. -Write these words down somewhere safe and keep them secret. -For a development wallet, it's fine to keep the phrase in a password manager. -Just don't place too much importance in this wallet. - -![MetaMask recovery phrase page.](/img/builders/app-developers/tutorials/first-contract/mm-seed.png) - -{

Confirm your secret recovery phrase

} - -After writing down your secret recovery phrase, you'll be asked to confirm it. -This is to make sure you wrote it down correctly. -MetaMask will ask you to input a few of the words you wrote down. -Make sure to input them in the correct order. - -![MetaMask recovery confirmation page.](/img/builders/app-developers/tutorials/first-contract/mm-confirm.png) - -{

Complete the wallet creation process

} - -You're all done! -Read through the final page to get some more tips from MetaMask, then click "Got it!" when you're ready to continue. - -
- - -Want to explore wallets other than MetaMask? -There are many different kinds of wallets out there. -You can use [Ethereum.org's "Find a wallet" feature](https://ethereum.org/en/wallets/find-wallet/) to find one that works for you. - - -## Add OP Sepolia to MetaMask - -This tutorial will show you how to deploy a smart contract to OP Sepolia, the testnet for OP Mainnet. -Once you know how to deploy a smart contract to OP Sepolia, you'll be able to deploy a smart contract to OP Mainnet in exactly the same way. -In order to interact with OP Sepolia using MetaMask, you'll need to add it as a custom network. - - - -{

Open the OP Sepolia connection link

} - -Click [this link](https://chainid.link/?network=op-sepolia) to open the OP Sepolia connection link. -This link will show you the connection details for OP Sepolia and give you the option to add it to MetaMask. -Once you're ready to connect to OP Sepolia, click the "connect" button. - -![OP Sepolia connection website content.](/img/builders/app-developers/tutorials/first-contract/net-connect.png) - -{

Allow the site to add the network

} - -You'll be presented with a popup from MetaMask asking if you'd like to add the network. -Click "Approve" to add OP Sepolia to MetaMask. - -
-![MetaMask window with the network approval pane open.](/img/builders/app-developers/tutorials/first-contract/net-approve.png) -
- -{

Switch to the OP Sepolia network

} - -After you approve the network, MetaMask will automatically try to switch to the OP Sepolia network. -Click "Switch network" to continue. - -
-![MetaMask window with the network switching pane open.](/img/builders/app-developers/tutorials/first-contract/net-switch.png) -
- -
- -## Get ETH on OP Sepolia - -You'll need some ETH on OP Sepolia to pay for the [gas fees](https://ethereum.org/en/developers/docs/gas/) associated with deploying a smart contract. -You can use the [Optimism Superchain Faucet](https://console.optimism.io/faucet?utm_source=docs) to get some free ETH on OP Sepolia. - - -Having issues with the Optimism Superchain Faucet? -You can try using [other available OP Sepolia faucets](/builders/tools/build/faucets) instead. - - -## Check your wallet balance - -After you get some ETH on OP Sepolia, you can check your wallet balance in MetaMask. -Make sure that your balance has updated before continuing. -If you don't see any ETH in your wallet, double check that your MetaMask is connected to the OP Sepolia network. - -## Write your first contract - -The most popular smart contract development language today is [Solidity](https://docs.soliditylang.org/en/latest/). -In this tutorial, you'll be using a browser-based integrated development environment (IDE) called [Remix](https://remix.ethereum.org/). -Remix is a great tool for learning Solidity because it requires minimal setup and runs in your browser. - - - -{

Open Remix

} - -Head over to [remix.ethereum.org](https://remix.ethereum.org/) to open Remix. -You'll be presented with a welcome screen and a popup asking if you'd like to share usage data with Remix. -Accept or decline this request depending on your preferences. - -{

Step through the tutorial

} - -Remix has a small built-in tutorial that will walk you through the basics of the IDE. -Click the "Next" button to step through the tutorial. -Read through the tips to get a sense of the IDE. - -{

Create an empty contract file

} - -Click on the "File" icon in the left sidebar to create a new file. -Name the file "MyFirstContract.sol" and hit enter to create it. - -![Remix window displaying the empty MyFirstContract file.](/img/builders/app-developers/tutorials/first-contract/remix-empty.png) - -{

Write your first contract

} - -This tutorial will show you how to deploy a simple contract that has a storage variable you can read and write. -You'll be able to update this variable with a transaction and then retrieve the updated value. -This is just a simple example to get you started. -Solidity is a powerful language that can be used to write complex smart contracts, check out the [Next Steps](#next-steps) section below after you've finished this tutorial for some more advanced examples! - -Copy and paste the following code into the file you just created. -Remix will detect copy/pasted code and give you a warning about it. -This is meant to prevent you from accidentally running malicious code. -Always be careful when copy/pasting code from the internet! - -```solidity file=/public/tutorials/first-contract.sol#L1-L10 hash=a008d0629d499be56a6629495bc55910 -``` - -{

Compile your contract

} - -By default, Remix will automatically compile your contract when you save it. -You can also manually compile your contract by clicking the "Solidity Compiler" icon in the left sidebar and then clicking the "Compile" button. -It's usually easier to leave automatic compilation enabled. -You shouldn't see any compilation errors for this contract. - -![Remix window with the compilation tab highlighted.](/img/builders/app-developers/tutorials/first-contract/remix-compile.png) - -
- -## Deploy your contract - -Now that you've written your first contract, you can deploy it to OP Sepolia. -Deploying contracts with Remix is pretty straightforward. - - - -{

Open the Deploy tab

} - -Click on the "Deploy & run transactions" icon in the left sidebar to open the Deploy tab (it looks like an Ethereum logo with an arrow pointing to the right). -You'll see some deployment options and a list of contracts that are currently compiled. -Since you only have one contract, you should see a single contract called "MyFirstContract" in the list. - -![Remix window with the deployment tab highlighted.](/img/builders/app-developers/tutorials/first-contract/remix-deploytab.png) - -{

Change your environment

} - -By default, Remix will try to deploy your contract to a local, in-memory blockchain. -This is useful for testing, but you'll need to change your environment to deploy to OP Sepolia for this tutorial. -Click on the dropdown underneath the "Environment" heading and select "Injected Provider - MetaMask". - -![Remix window with the environment dropdown highlighted.](/img/builders/app-developers/tutorials/first-contract/remix-network.png) - -{

Accept the connection request

} - -Once you've selected the "Injected Provider - MetaMask" option, MetaMask will show you a popup asking if you'd like to connect to Remix. -Accept this request by clicking the "Connect" button. - -{

Deploy your contract

} - -You're now ready to deploy your contract! -Click the orange "Deploy" button to deploy your contract to OP Sepolia. -You'll be presented with another MetaMask popup asking you to confirm the transaction. -Click the "Confirm" button to continue. - -
-![MetaMask contract deployment approval popup.](/img/builders/app-developers/tutorials/first-contract/remix-deploy.png) -
- -{

Wait for your transaction to confirm

} - -OP Sepolia is relatively fast, so transactions should confirm within just a few seconds. -Remix will automatically detect when your transaction has confirmed and will show you your newly deployed contract under the "Deployed Contracts" heading within the Deploy tab. - -
- -## Interact with your contract - -Now that you've deployed your contract, you can interact with it. -Remix makes it easy to interact with your contract by providing a built-in user interface. -You can use this interface to call functions on your contract and read its state. - - - -{

Expand your contract

} - -Click on the arrow next to the name of your contract under the "Deployed Contracts" heading to expand it. -You should see a list of functions that you can call on your contract. - -![Remix window with the deployed contract area highlighted.](/img/builders/app-developers/tutorials/first-contract/remix-deployed.png) - -{

Call the setMessage function

} - -Now you'll update the message variable in your contract. -Type a message into the input box next to the orange "setMessage" button and click on the "setMessage" button. -Just like when you deployed your contract, you'll be presented with a MetaMask popup asking you to confirm the transaction. -Click the "Confirm" button to continue. - -![Remix window with the setMessage function button highlighted.](/img/builders/app-developers/tutorials/first-contract/remix-setmessage.png) - -{

Wait for your transaction to confirm

} - -Once again, Remix will automatically detect when your transaction has confirmed. -You'll see a green checkmark appear in the console at the bottom of the screen. - -{

Read the updated message variable

} - -Click on the "message" button to read the updated message variable. -You should see the message you set in the previous step appear underneath the "message" button. -Congrats, you've successfully deployed and interacted with your first smart contract on OP Sepolia! - -![Remix window with the message reading function button highlighted.](/img/builders/app-developers/tutorials/first-contract/remix-message.png) - -
- -## How your contract works - -Now that you've deployed your contract, you might be wondering how it works. -Let's take a closer look at the code you wrote. - -### License identifier - -The first line of most Solidity files is the license identifier. -This line is used to specify the license under which the code is released. -In this case, the code written is released under the [MIT license](https://opensource.org/licenses/MIT). - -```solidity file=/public/tutorials/first-contract.sol#L1 hash=8384d75c38c570f3edb87cf9f64f2ec2 -``` - -### Pragma directive - -The next line is a [pragma directive](https://docs.soliditylang.org/en/latest/layout-of-source-files.html#pragma). -This line tells the Solidity compiler which version of the Solidity language to use. -In this case, the code is written for Solidity version 0.8.0 or higher. - -```solidity file=/public/tutorials/first-contract.sol#L2 hash=70ebe002bc5488bb81baa0504de273c1 -``` - -### Contract definition - -The next line defines a contract called `MyFirstContract`. -A contract is a collection of code and data that is stored at a specific address on the blockchain. -You can think of a contract as a class in an object-oriented programming language. -The contract definition is followed by a pair of curly braces that contain the contract's code. - -```solidity file=/public/tutorials/first-contract.sol#L4 hash=8f3ace25e5f9ea06d8cb388eb3ab1775 -``` - -### Message variable - -The first thing you'll notice inside the contract definition is a variable called `message`. -This variable is declared as a `string`, which is a Solidity type that represents a string of characters. -The `public` keyword means that this variable can be read from outside the contract. - -```solidity file=/public/tutorials/first-contract.sol#L5 hash=42a1bdfe81e5b3bba6b99d3255ef4f2b -``` - -### Message update function - -The next thing you'll notice is a function called `setMessage`. -This function takes a single argument called `_message` of type `string`. -The `public` keyword means that this function can be called from outside the contract by anyone. -Since this function doesn't have any access control, anyone can update the `message` variable. - -```solidity file=/public/tutorials/first-contract.sol#L7-L9 hash=b7e5531c48425b183e794f9f251c5540 -``` - -## Next steps - -To learn more about Solidity, check out the [Solidity documentation](https://docs.soliditylang.org/en/latest/) for more information about the language itself. If you learn best by reading source code, check out [this annotated code for an ERC-20 token contract](https://ethereum.org/en/developers/tutorials/erc20-annotated-code/). - -Now that you know how to deploy a smart contract to OP Sepolia, you can deploy a smart contract to OP Mainnet in exactly the same way. -If you're up for a challenge, try [creating a token on Sepolia and OP Sepolia](./standard-bridge-standard-token) and then [using the Optimism SDK](./cross-dom-bridge-erc20) to bridge some tokens between the two networks. diff --git a/public/_redirects b/public/_redirects index 3eb5cb69c..536d0138a 100644 --- a/public/_redirects +++ b/public/_redirects @@ -104,4 +104,8 @@ /stack/operators/features/proxyd /builders/chain-operators/tools/proxyd /builders/notices/granite-changes https://github.com/ethereum-optimism/docs/blob/ef619668ae44276edecdfd657157254b9809e2d6/pages/builders/notices/granite-changes.mdx /builders/notices/fp-changes https://github.com/ethereum-optimism/docs/blob/ef619668ae44276edecdfd657157254b9809e2d6/pages/builders/notices/fp-changes.mdx -/chain/differences /stack/differences \ No newline at end of file +/chain/differences /stack/differences +/builders/app-developers/contracts/optimization /builders/app-developers/overview +/builders/app-developers/contracts/system-contracts /stack/smart-contracts +/builders/app-developers/contracts/compatibility /stack/differences +/builders/app-developers/tutorials/first-contract /builders/app-developers/overview \ No newline at end of file From 1601d038905b4e2fb16512407f146d8856685815 Mon Sep 17 00:00:00 2001 From: soyboy <85043086+sbvegan@users.noreply.github.com> Date: Wed, 6 Nov 2024 16:38:00 -0800 Subject: [PATCH 444/565] updating overview breadcrumb page --- pages/builders/app-developers/contracts.mdx | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/pages/builders/app-developers/contracts.mdx b/pages/builders/app-developers/contracts.mdx index f2836e72d..605fd529c 100644 --- a/pages/builders/app-developers/contracts.mdx +++ b/pages/builders/app-developers/contracts.mdx @@ -1,23 +1,15 @@ --- title: Contracts lang: en-US -description: >- - Information on Solidity compatibility, contract optimization, and system - contracts for OP Stack. +description: Information on the Superchain ERC-20 --- import { Card, Cards } from 'nextra/components' # Contracts -This section provides information on Solidity compatibility, contract optimization on OP Stack, and using OP Stack system contracts. You'll find guides and tutorials to help you understand and work with these topics. +This section provides information on the Superchain ERC-20. - - - - - - From 76396dfd29cfc0df39252bbbf913bf1415c4d8bd Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Thu, 7 Nov 2024 12:07:21 +0100 Subject: [PATCH 445/565] Update pages/stack/transactions/transaction-finality.mdx Co-authored-by: smartcontracts --- pages/stack/transactions/transaction-finality.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/stack/transactions/transaction-finality.mdx b/pages/stack/transactions/transaction-finality.mdx index 02dbee8e3..d90b6ccfd 100644 --- a/pages/stack/transactions/transaction-finality.mdx +++ b/pages/stack/transactions/transaction-finality.mdx @@ -25,7 +25,7 @@ Transactions on OP Stack chains go through the following process to reach finali 1. A user submits a transaction to the network, which forwards it to the Sequencer. 2. The Sequencer includes the transaction in a block and distributes it over a public peer-to-peer network. At this point, the transaction is considered **"unsafe"**. A technical term indicating that the transaction is in a block but its data has not yet been posted to Ethereum. This process typically takes only a few seconds. -3. The Sequencer publishes this block's data to Ethereum, either as [blob data](https://www.eip4844.com/) or as calldata attached to a standard Ethereum transaction. Once included in an Ethereum block, the transaction is **"safe"**. This step usually takes 5–10 minutes. +3. The Sequencer publishes this block's data to Ethereum, either as [blob data](https://www.eip4844.com/) or as calldata attached to a standard Ethereum transaction. Once included in an Ethereum block, the transaction is considered **"safe"**. This step usually takes 5–10 minutes. 4. The Ethereum block containing the Sequencer's transaction is finalized. At this point, the transaction reaches a **"finalized"** state. Ethereum finalization typically takes about 65 Ethereum blocks, or approximately 13 minutes, but may take longer under certain network conditions. Finality depends entirely on [Ethereum's consensus mechanism](https://ethereum.org/en/developers/docs/consensus-mechanisms/pos/#finality). TODO: Fix this so it has the right numbers From 47ad29d63ee48539d3475a5bce7d0ff91aaff7ee Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Thu, 7 Nov 2024 12:07:31 +0100 Subject: [PATCH 446/565] Update pages/stack/transactions/transaction-finality.mdx Co-authored-by: smartcontracts --- pages/stack/transactions/transaction-finality.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/stack/transactions/transaction-finality.mdx b/pages/stack/transactions/transaction-finality.mdx index d90b6ccfd..84594382a 100644 --- a/pages/stack/transactions/transaction-finality.mdx +++ b/pages/stack/transactions/transaction-finality.mdx @@ -58,7 +58,7 @@ sequenceDiagram A common misconception is that transactions on OP Stack chains take 7 days to finalize. **This is incorrect.** Transactions on OP Stack chains become finalized when their data is included in a finalized Ethereum block, typically around 20–30 minutes after submission. To reorg a finalized OP Stack chain transaction, a reorg of the corresponding Ethereum block would be required. -This misconception often arises due to the OP Stack's Standard Bridge, which includes a 7-day delay on *withdrawals* of ETH and ERC-20 tokens. Withdrawing tokens from an OP Stack chain to Ethereum using the Standard Bridge requires a minimum 7-day wait. This delay affects only withdrawals and does not impact transaction finality on the OP Stack chain. +This misconception often arises due to the OP Stack's Standard Bridge, which includes a 7-day delay on *withdrawals* of ETH and ERC-20 tokens. Withdrawing tokens from an OP Stack chain to Ethereum using the Standard Bridge requires a minimum 7-day wait. This delay affects only withdrawals through the Standard Bridge and does not impact transaction finality on the OP Stack chain. ### Challenges in the Standard Bridge can cause a chain reorg From 71774a72b0dea78757181e48a212f1b56276c5da Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Thu, 7 Nov 2024 12:07:39 +0100 Subject: [PATCH 447/565] Update pages/stack/transactions/transaction-finality.mdx Co-authored-by: smartcontracts --- pages/stack/transactions/transaction-finality.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/stack/transactions/transaction-finality.mdx b/pages/stack/transactions/transaction-finality.mdx index 84594382a..46ea62aeb 100644 --- a/pages/stack/transactions/transaction-finality.mdx +++ b/pages/stack/transactions/transaction-finality.mdx @@ -62,7 +62,7 @@ This misconception often arises due to the OP Stack's Standard Bridge, which inc ### Challenges in the Standard Bridge can cause a chain reorg -Another misconception related to the belief that [finalization takes 7 days](#misconception-transactions-take-7-days-to-finalize) is that **Fault Proof challenges** created in response to withdrawals in the Standard Bridge can reorganize the OP Stack chain. **This is incorrect.** OP Stack transactions are not reorganized in response to Fault Proof challenge. +Another misconception related to the belief that [finalization takes 7 days](#misconception-transactions-take-7-days-to-finalize) is that **Fault Proof challenges** created in response to withdrawals in the Standard Bridge can reorganize the OP Stack chain. **This is incorrect.** OP Stack transactions are not reorganized in response to Fault Proof challenges. The [Standard Bridge](/builders/app-developers/bridging/standard-bridge) is a bridge application that is included by default with any OP Stack chain and connects the chain to its "parent" blockchain (usually Ethereum). It offers a high level of security for ETH and ERC-20 tokens moved through the bridge. From 816ac381029f06c99e77b1c7bbf8c338d4e480d8 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Thu, 7 Nov 2024 12:07:55 +0100 Subject: [PATCH 448/565] Update pages/stack/transactions/transaction-finality.mdx Co-authored-by: smartcontracts --- pages/stack/transactions/transaction-finality.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/stack/transactions/transaction-finality.mdx b/pages/stack/transactions/transaction-finality.mdx index 46ea62aeb..a2af7d20b 100644 --- a/pages/stack/transactions/transaction-finality.mdx +++ b/pages/stack/transactions/transaction-finality.mdx @@ -74,7 +74,7 @@ TODO: It'd be really fun to have a button that (for the bond cost of 0.08 ETH) c ### The Sequencer can always reorg the chain -A common misconception is that the Sequencer can trigger reorganizations of the OP Stack chain at any time. However, while the Sequencer can reorganize **"unsafe"** blocks (not yet published to Ethereum), reorganizations become more challenging once blocks are **"safe"** or **"finalized."** +A common misconception is that the Sequencer can trigger reorganizations of the OP Stack chain at any time. However, while the Sequencer can reorganize **"unsafe"** blocks (not yet published to Ethereum), reorganizations become more challenging once blocks are **"safe"** and become effectively impossible once blocks are **"finalized."** * **Unsafe blocks:** The Sequencer can reorganize these blocks (typically within \~5–10 minutes). * **Safe blocks:** The Sequencer would need to trigger a reorg on Ethereum itself, which is complex and unlikely. From 45a324857947d6eff9be1658139b87ea5d2a40d3 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Thu, 7 Nov 2024 12:08:32 +0100 Subject: [PATCH 449/565] Update pages/stack/transactions/transaction-finality.mdx Co-authored-by: smartcontracts --- pages/stack/transactions/transaction-finality.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/stack/transactions/transaction-finality.mdx b/pages/stack/transactions/transaction-finality.mdx index a2af7d20b..ebeeb9433 100644 --- a/pages/stack/transactions/transaction-finality.mdx +++ b/pages/stack/transactions/transaction-finality.mdx @@ -24,7 +24,7 @@ OP Stack chains in the standard configuration are Rollups that use Ethereum's co Transactions on OP Stack chains go through the following process to reach finality: 1. A user submits a transaction to the network, which forwards it to the Sequencer. -2. The Sequencer includes the transaction in a block and distributes it over a public peer-to-peer network. At this point, the transaction is considered **"unsafe"**. A technical term indicating that the transaction is in a block but its data has not yet been posted to Ethereum. This process typically takes only a few seconds. +2. The Sequencer includes the transaction in a block and distributes it over a public peer-to-peer network. At this point, the transaction is considered **"unsafe"**, a technical term indicating that the transaction is in a block but its data has not yet been posted to Ethereum. This process typically takes only a few seconds. 3. The Sequencer publishes this block's data to Ethereum, either as [blob data](https://www.eip4844.com/) or as calldata attached to a standard Ethereum transaction. Once included in an Ethereum block, the transaction is considered **"safe"**. This step usually takes 5–10 minutes. 4. The Ethereum block containing the Sequencer's transaction is finalized. At this point, the transaction reaches a **"finalized"** state. Ethereum finalization typically takes about 65 Ethereum blocks, or approximately 13 minutes, but may take longer under certain network conditions. Finality depends entirely on [Ethereum's consensus mechanism](https://ethereum.org/en/developers/docs/consensus-mechanisms/pos/#finality). From 1186141503a583385f8d03ffde39d97aba3f73c3 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Thu, 7 Nov 2024 15:54:07 +0100 Subject: [PATCH 450/565] remove todo --- pages/stack/transactions/transaction-finality.mdx | 4 ---- 1 file changed, 4 deletions(-) diff --git a/pages/stack/transactions/transaction-finality.mdx b/pages/stack/transactions/transaction-finality.mdx index ebeeb9433..3aee2cfc2 100644 --- a/pages/stack/transactions/transaction-finality.mdx +++ b/pages/stack/transactions/transaction-finality.mdx @@ -28,8 +28,6 @@ Transactions on OP Stack chains go through the following process to reach finali 3. The Sequencer publishes this block's data to Ethereum, either as [blob data](https://www.eip4844.com/) or as calldata attached to a standard Ethereum transaction. Once included in an Ethereum block, the transaction is considered **"safe"**. This step usually takes 5–10 minutes. 4. The Ethereum block containing the Sequencer's transaction is finalized. At this point, the transaction reaches a **"finalized"** state. Ethereum finalization typically takes about 65 Ethereum blocks, or approximately 13 minutes, but may take longer under certain network conditions. Finality depends entirely on [Ethereum's consensus mechanism](https://ethereum.org/en/developers/docs/consensus-mechanisms/pos/#finality). -TODO: Fix this so it has the right numbers - ```mermaid sequenceDiagram @@ -70,8 +68,6 @@ When using the Standard Bridge, users who send ETH or ERC-20 tokens to Ethereum Because the Standard Bridge cannot immediately verify withdrawal claims, it delays the claim by 7 days to allow the OP Stack Fault Proof system to filter out any invalid claims. Challenges only remove bad claims without affecting the Standard Bridge or the OP Stack chain. -TODO: It'd be really fun to have a button that (for the bond cost of 0.08 ETH) creates a bad withdrawal claim for all of the ETH in the bridge. Users would be able to see first hand how their claim gets deleted and nothing else happens. - ### The Sequencer can always reorg the chain A common misconception is that the Sequencer can trigger reorganizations of the OP Stack chain at any time. However, while the Sequencer can reorganize **"unsafe"** blocks (not yet published to Ethereum), reorganizations become more challenging once blocks are **"safe"** and become effectively impossible once blocks are **"finalized."** From de5b2b6aee4ba702895c050f13fc1488307d9f01 Mon Sep 17 00:00:00 2001 From: soyboy Date: Thu, 7 Nov 2024 10:44:06 -0800 Subject: [PATCH 451/565] dropping OPM down --- pages/_meta.json | 20 ++++++++++---------- pages/stack/_meta.json | 4 ++-- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/pages/_meta.json b/pages/_meta.json index 48d92b504..fe5e52428 100644 --- a/pages/_meta.json +++ b/pages/_meta.json @@ -65,29 +65,29 @@ "display": "children" }, - "+++ OP MAINNET": { + "+++ OP STACK": { "title": "", "type": "separator" }, - "--- OP MAINNET": { - "title": "OP MAINNET", + "--- OP STACK": { + "title": "OP STACK", "type": "separator" }, - "chain": { - "title": "OP Mainnet", + "stack": { + "title": "OP Stack", "display": "children" }, - "+++ OP STACK": { + "+++ OP MAINNET": { "title": "", "type": "separator" }, - "--- OP STACK": { - "title": "OP STACK", + "--- OP MAINNET": { + "title": "OP MAINNET", "type": "separator" }, - "stack": { - "title": "OP Stack", + "chain": { + "title": "OP Mainnet", "display": "children" }, diff --git a/pages/stack/_meta.json b/pages/stack/_meta.json index db6bc1efe..fb6fe060f 100644 --- a/pages/stack/_meta.json +++ b/pages/stack/_meta.json @@ -10,8 +10,8 @@ "transactions": "Transactions", "features": "Features", "security": "Security", - "--- Experimental": { - "title": "Experimental", + "--- EXPERIMENTAL": { + "title": "EXPERIMENTAL", "type": "separator" }, "opcm": "OP Contracts Manager", From f56d7f538e23fce8f2e7cc4613e20fbcb3e91e09 Mon Sep 17 00:00:00 2001 From: soyboy Date: Thu, 7 Nov 2024 10:55:33 -0800 Subject: [PATCH 452/565] adding assets folder --- next-env.d.ts | 2 +- pages/builders/app-developers/_meta.json | 1 - pages/builders/app-developers/contracts.mdx | 15 --------------- .../builders/app-developers/contracts/_meta.json | 3 --- .../app-developers/contracts/superchain-erc20.mdx | 6 ------ pages/stack/interop/_meta.json | 4 +--- pages/stack/interop/assets/_meta.json | 5 +++++ .../interop/{ => assets}/superchain-erc20.mdx | 0 .../interop/{ => assets}/superchain-weth.mdx | 0 .../{ => assets}/transfer-superchainERC20.mdx | 0 public/_redirects | 4 ++++ 11 files changed, 11 insertions(+), 29 deletions(-) delete mode 100644 pages/builders/app-developers/contracts.mdx delete mode 100644 pages/builders/app-developers/contracts/_meta.json delete mode 100644 pages/builders/app-developers/contracts/superchain-erc20.mdx create mode 100644 pages/stack/interop/assets/_meta.json rename pages/stack/interop/{ => assets}/superchain-erc20.mdx (100%) rename pages/stack/interop/{ => assets}/superchain-weth.mdx (100%) rename pages/stack/interop/{ => assets}/transfer-superchainERC20.mdx (100%) diff --git a/next-env.d.ts b/next-env.d.ts index a4a7b3f5c..4f11a03dc 100644 --- a/next-env.d.ts +++ b/next-env.d.ts @@ -2,4 +2,4 @@ /// // NOTE: This file should not be edited -// see https://nextjs.org/docs/pages/building-your-application/configuring/typescript for more information. +// see https://nextjs.org/docs/basic-features/typescript for more information. diff --git a/pages/builders/app-developers/_meta.json b/pages/builders/app-developers/_meta.json index 70c7d2145..b2cbaa949 100644 --- a/pages/builders/app-developers/_meta.json +++ b/pages/builders/app-developers/_meta.json @@ -2,7 +2,6 @@ "overview": "Overview", "quick-start": "Superchain app quick start", "tutorials": "Tutorials", - "contracts": "Smart contracts", "transactions": "Transactions", "bridging": "Bridging", "tools": "App tools" diff --git a/pages/builders/app-developers/contracts.mdx b/pages/builders/app-developers/contracts.mdx deleted file mode 100644 index 605fd529c..000000000 --- a/pages/builders/app-developers/contracts.mdx +++ /dev/null @@ -1,15 +0,0 @@ ---- -title: Contracts -lang: en-US -description: Information on the Superchain ERC-20 ---- - -import { Card, Cards } from 'nextra/components' - -# Contracts - -This section provides information on the Superchain ERC-20. - - - - diff --git a/pages/builders/app-developers/contracts/_meta.json b/pages/builders/app-developers/contracts/_meta.json deleted file mode 100644 index 6e2ad3d2e..000000000 --- a/pages/builders/app-developers/contracts/_meta.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "superchain-erc20": "SuperchainERC20" -} diff --git a/pages/builders/app-developers/contracts/superchain-erc20.mdx b/pages/builders/app-developers/contracts/superchain-erc20.mdx deleted file mode 100644 index dfaf8f84e..000000000 --- a/pages/builders/app-developers/contracts/superchain-erc20.mdx +++ /dev/null @@ -1,6 +0,0 @@ ---- ---- - -import SuperchainERC20 from '@/pages/stack/interop/superchain-erc20.mdx' - - diff --git a/pages/stack/interop/_meta.json b/pages/stack/interop/_meta.json index 3a5a6bcbe..d42e969ce 100644 --- a/pages/stack/interop/_meta.json +++ b/pages/stack/interop/_meta.json @@ -2,9 +2,7 @@ "explainer": "Interop explainer", "cross-chain-message": "Anatomy of cross-chain message", "supersim": "Supersim Multichain Development Environment", - "superchain-erc20": "SuperchainERC20", "message-passing": "Interop message passing", - "superchain-weth": "SuperchainWETH (Interoperable ETH)", "op-supervisor": "OP Supervisor", - "transfer-superchainERC20": "How to transfer a SuperchainERC20" + "assets": "Assets" } \ No newline at end of file diff --git a/pages/stack/interop/assets/_meta.json b/pages/stack/interop/assets/_meta.json new file mode 100644 index 000000000..15677456d --- /dev/null +++ b/pages/stack/interop/assets/_meta.json @@ -0,0 +1,5 @@ +{ + "superchain-erc20": "SuperchainERC20", + "superchain-weth": "SuperchainWETH (Interoperable ETH)", + "transfer-superchainERC20": "How to transfer a SuperchainERC20" +} \ No newline at end of file diff --git a/pages/stack/interop/superchain-erc20.mdx b/pages/stack/interop/assets/superchain-erc20.mdx similarity index 100% rename from pages/stack/interop/superchain-erc20.mdx rename to pages/stack/interop/assets/superchain-erc20.mdx diff --git a/pages/stack/interop/superchain-weth.mdx b/pages/stack/interop/assets/superchain-weth.mdx similarity index 100% rename from pages/stack/interop/superchain-weth.mdx rename to pages/stack/interop/assets/superchain-weth.mdx diff --git a/pages/stack/interop/transfer-superchainERC20.mdx b/pages/stack/interop/assets/transfer-superchainERC20.mdx similarity index 100% rename from pages/stack/interop/transfer-superchainERC20.mdx rename to pages/stack/interop/assets/transfer-superchainERC20.mdx diff --git a/public/_redirects b/public/_redirects index 969d2a028..6d137da4f 100644 --- a/public/_redirects +++ b/public/_redirects @@ -112,3 +112,7 @@ /builders/cex-wallet-developers/cex-support /builders/app-developers/overview /builders/cex-wallet-developers/wallet-support /builders/app-developers/overview /builders/cex-wallet-developers /builders/app-developers/overview +/stack/interop/superchain-erc20 /stack/interop/assets/superchain-erc20 +/stack/interop/superchain-weth /stack/interop/assets/superchain-weth +/stack/interop/transfer-superchainERC20 /stack/interop/assets/transfer-superchainERC20 +/builders/app-developers/contracts/superchain-erc20 /stack/interop/assets/superchain-erc20 \ No newline at end of file From 0f67cb20e661f186cd8313aa4dcedb098fdac932 Mon Sep 17 00:00:00 2001 From: soyboy Date: Thu, 7 Nov 2024 11:05:59 -0800 Subject: [PATCH 453/565] fixing breadcrumbs --- pages/stack/interop.mdx | 6 +----- pages/stack/interop/assets.mdx | 19 +++++++++++++++++++ words.txt | 12 +----------- 3 files changed, 21 insertions(+), 16 deletions(-) create mode 100644 pages/stack/interop/assets.mdx diff --git a/pages/stack/interop.mdx b/pages/stack/interop.mdx index b7823d3b7..6df1e266c 100644 --- a/pages/stack/interop.mdx +++ b/pages/stack/interop.mdx @@ -19,11 +19,7 @@ Documentation covering Cross Chain Message, Explainer, Message Passing, Op Super - - - - - + diff --git a/pages/stack/interop/assets.mdx b/pages/stack/interop/assets.mdx new file mode 100644 index 000000000..f86a72a22 --- /dev/null +++ b/pages/stack/interop/assets.mdx @@ -0,0 +1,19 @@ +--- +title: Interop +description: Documentation covering Cross Chain Message, Explainer, Message Passing, Op Supervisor, Superchain Erc20, Superchain Weth, Supersim, Transfer Superchainerc20 in the Interop section of the OP Stack ecosystem. +lang: en-US +--- + +import { Card, Cards } from 'nextra/components' + +# Interop + +Documentation covering SuperchainERC20, Superchain WETH, Supersim, and how to transfer a SuperchainERC20. + + + + + + + + diff --git a/words.txt b/words.txt index 08c53d776..d80588652 100644 --- a/words.txt +++ b/words.txt @@ -10,7 +10,6 @@ Allnodes Allocs allocs ANDI -Ankr Apeworx Arweave authrpc @@ -148,7 +147,6 @@ Holesky holesky IGNOREPRICE ignoreprice -Immunefi implicity Inator inator @@ -197,7 +195,6 @@ minsuggestedpriorityfee Mintable Mintplex MIPSEVM -Mitigations Monitorism Moralis Mordor @@ -289,10 +286,9 @@ productionize productionized Protip Proxied +Proxyd proxyd pseudorandomly -Pyth -Pyth's QRNG Quicknode quicknode @@ -327,9 +323,6 @@ safedb Schnorr secp SELFDESTRUCT -SEPOLIA -Sepolia -sepolia seqnr SEQUENCERHTTP sequencerhttp @@ -375,7 +368,6 @@ Thirdweb threadcreate tility timeseries -Tranfer trustlessly trustrpc txfeecap @@ -400,8 +392,6 @@ VMDEBUG vmdebug VMODULE vmodule -voxel -wagmi Warpcast xlarge XORI From c4ffce8e3d95a7aa3e447d49239c329eb4bdc11f Mon Sep 17 00:00:00 2001 From: soyboy Date: Thu, 7 Nov 2024 11:30:00 -0800 Subject: [PATCH 454/565] fixing linter --- words.txt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/words.txt b/words.txt index d80588652..c81d219c4 100644 --- a/words.txt +++ b/words.txt @@ -195,6 +195,7 @@ minsuggestedpriorityfee Mintable Mintplex MIPSEVM +Mitigations Monitorism Moralis Mordor @@ -289,6 +290,8 @@ Proxied Proxyd proxyd pseudorandomly +Pyth +Pyth's QRNG Quicknode quicknode @@ -323,6 +326,7 @@ safedb Schnorr secp SELFDESTRUCT +Sepolia seqnr SEQUENCERHTTP sequencerhttp From 5f11ba9dab4b1b3483e4ff2d5ab91cf6dba4725c Mon Sep 17 00:00:00 2001 From: soyboy Date: Thu, 7 Nov 2024 11:35:47 -0800 Subject: [PATCH 455/565] fixing linter? --- words.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/words.txt b/words.txt index c81d219c4..7d59511f1 100644 --- a/words.txt +++ b/words.txt @@ -10,6 +10,7 @@ Allnodes Allocs allocs ANDI +Ankr Apeworx Arweave authrpc From 70f72b69f2d6c44d32defd658dcff91973b5fd3e Mon Sep 17 00:00:00 2001 From: soyboy Date: Thu, 7 Nov 2024 11:37:40 -0800 Subject: [PATCH 456/565] FIXING LINTER --- words.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/words.txt b/words.txt index 7d59511f1..090db3066 100644 --- a/words.txt +++ b/words.txt @@ -149,6 +149,7 @@ holesky IGNOREPRICE ignoreprice implicity +Immunefi Inator inator INFLUXDBV From 8f5002d63f1c811470ede5f93717ea0350324955 Mon Sep 17 00:00:00 2001 From: soyboy Date: Thu, 7 Nov 2024 12:00:41 -0800 Subject: [PATCH 457/565] last try --- words.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/words.txt b/words.txt index 090db3066..5d17e5318 100644 --- a/words.txt +++ b/words.txt @@ -394,6 +394,7 @@ vhosts Viem viem Viem's +voxel VMDEBUG vmdebug VMODULE From df0e197fe9993753c852d50b0cd17da1b765a530 Mon Sep 17 00:00:00 2001 From: Bradley Camacho <42678939+bradleycamacho@users.noreply.github.com> Date: Thu, 7 Nov 2024 12:19:22 -0800 Subject: [PATCH 458/565] Implement feedback --- .../stack/interop/deploy-superchain-erc20.mdx | 52 ++----------------- 1 file changed, 5 insertions(+), 47 deletions(-) diff --git a/pages/stack/interop/deploy-superchain-erc20.mdx b/pages/stack/interop/deploy-superchain-erc20.mdx index 9c79577a0..98cb08a62 100644 --- a/pages/stack/interop/deploy-superchain-erc20.mdx +++ b/pages/stack/interop/deploy-superchain-erc20.mdx @@ -13,7 +13,7 @@ import { Steps } from 'nextra/components' Interop is currently in active development and not yet ready for production use. The information provided here may change. Check back regularly for the most up-to-date information.
-This guide explains how to issue new assets with the `SuperchainERC20` standard and bridge them effectively using the `SuperchainERC20Bridge`. If you want more information about the `SuperchainERC20 standard`, see our [`SuperchainERC20` standard explainer](/stack/interop/superchain-erc20) +This guide explains how to issue new assets with the `SuperchainERC20` and bridge them effectively using the `SuperchainERC20Bridge`. If you want more information about the `SuperchainERC20 standard`, see our [`SuperchainERC20` standard explainer](/stack/interop/superchain-erc20) An important thing to note is using `crosschainBurn` and `crosschainMint` on the `SuperchainERC20` to move your asset across the Superchain only affects which chain your asset is located on and does not change the overall supply of the token. This keeps the token’s total amount the same across all networks, ensuring its value stays stable during the move and that the `SuperchainERC20` retains a unified, global supply count. @@ -28,63 +28,21 @@ To ensure fungibility across chains, the SuperchainERC20 assets need to have the * `Create2Deployer`: A smart contract that enables deploying contracts with predictable addresses. * `OptimismSuperchainERC20Factory`: A factory contract designed for L1-native tokens to ensure uniform deployments across chains. -There are [many ways to do this](https://github.com/Arachnid/deterministic-deployment-proxy), but here's an example smart contract to start: - -```solidity -// Example token deployment using Create2Deployer -bytes32 salt = keccak256(abi.encodePacked("SuperchainToken")); -address tokenAddress = Create2Deployer.deploy(salt, bytecode, constructorArgs); -``` +There are [many ways to do this](https://github.com/Arachnid/deterministic-deployment-proxy), but [here's an example smart contract to start](https://github.com/ethereum-optimism/superchainerc20-starter/blob/main/packages/contracts/src/L2NativeSuperchainERC20.sol) By deploying assets at identical addresses across multiple chains, we abstract away the complexity of cross-chain validation. -### Implement the ICrosschainERC20 interface - -Ensure that your token contract conforms to the `ICrosschainERC20` interface to support cross-chain minting and burning. - -```solidity -interface ICrosschainERC20 { - function crosschainMint(address _account, uint256 _amount) external; /// Mints _amount of token to address _account. - function crosschainBurn(address _account, uint256 _amount) external; /// Burns _amount of token from address _account. - - event CrosschainMint(address indexed _to, uint256 _amount); /// MUST trigger when crosschainMint is called - event CrosschainBurn(address indexed _from, uint256 _amount); /// MUST trigger when crosschainBurn is called -} -``` - -### Use the `SuperchainERC20Bridge` for cross-chain transfers +### Implement the IERC7802 interface -The `SuperchainERC20Bridge` relies on the `L2ToL2CrossDomainMessenger` to securely relay messages between chains and provide replay protection, domain binding and access to additional message information. +Implementations of `SuperchainERC2` will be required to implement the [IERC7802](https://specs.optimism.io/interop/token-bridging.html#ierc7802) interface, that includes two external functions and two events. We'll use two function for bridging: * `sendERC20`: initializes a cross-chain transfer of a `SuperchainERC20` by burning the tokens locally and sending a message to the `SuperchainERC20Bridge` on the target chain using the `L2toL2CrossDomainMessenger`. This ensures that asset supply never changes; sending an asset moves it from one chain to another, it does not "create" an additional asset in regards to supply. * `relayERC20`: process incoming messages from the L2toL2CrossDomainMessenger and mints the corresponding amount of the SuperchainERC20. -Here's an example implementation of the `SuperchainERC20Bridge` - -```solidity -function sendERC20(SuperchainERC20 _token, address _to, uint256 _amount, uint256 _chainId) external returns (bytes32 msgHash_) { - _token.crosschainBurn(msg.sender, _amount); - - bytes memory _message = abi.encodeCall(this.relayERC20, (_token, msg.sender, _to, _amount)); - - msgHash_ = L2ToL2CrossDomainMessenger.sendMessage(_chainId, address(this), _message); - - emit SentERC20(address(_token), msg.sender, _to, _amount, _chainId); -} - -function relayERC20(SuperchainERC20 _token, address _from, address _to, uint256 _amount) external { - require(msg.sender == address(L2ToL2CrossChainMessenger)); - require(L2ToL2CrossChainMessenger.crossDomainMessageSender() == address(this)); - - uint256 _source = L2ToL2CrossChainMessenger.crossDomainMessageSource(); - - _token.crosschainMint(_to, _amount); +[Here's an example implementation of the `SuperchainERC20Bridge`](https://specs.optimism.io/interop/token-bridging.html#implementation) - emit RelayedERC20(address(_token), _from, _to, _amount, _source); -} -``` ## Next steps From 2c5220d5b627cc7fb01bc107c74098285c9ee79a Mon Sep 17 00:00:00 2001 From: Bradley Camacho <42678939+bradleycamacho@users.noreply.github.com> Date: Thu, 7 Nov 2024 12:27:22 -0800 Subject: [PATCH 459/565] Apply feedback --- pages/stack/interop/superchainerc20-best-practices.mdx | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/pages/stack/interop/superchainerc20-best-practices.mdx b/pages/stack/interop/superchainerc20-best-practices.mdx index 2fb7f26d0..925a7891b 100644 --- a/pages/stack/interop/superchainerc20-best-practices.mdx +++ b/pages/stack/interop/superchainerc20-best-practices.mdx @@ -16,13 +16,9 @@ Use predefined addresses: Assign and verify the same address for each `Superchai Consider using `Create2Deployer` or one of our [predeploys](https://specs.optimism.io/interop/predeploys.html) to ensure this. -## Token metadata consistency +## Testing before mainnet deployment -Standardize token metadata: Use identical values for `name`, `symbol`, and `decimals` across all chain instances. Inconsistent metadata can lead to display errors and transaction rejections during cross-chain operations. - -## Testing before mainnet deployment - -Test with production-like conditions: Deploy to staging environments that simulate mainnet conditions, especially for functions like `crosschainBurn` and `crosschainMint`. Test under realistic transaction loads to validate performance. +Test with production-like conditions: Deploy to staging environments that simulate mainnet conditions, especially for functions like `crosschainBurn` and `crosschainMint`. Test under realistic transaction loads to validate performance. We recommend using [Supersim](https://supersim.pages.dev/introduction) as an easy way to simulate the Superchain and test your SuperchainERC20 deployment. From cc77c5753d7918f239a204cf339d0e81748becab Mon Sep 17 00:00:00 2001 From: soyboy Date: Thu, 7 Nov 2024 14:57:55 -0800 Subject: [PATCH 460/565] adding predeploys and making the callout closable --- components/WipCallout.tsx | 15 +++++++++-- pages/stack/interop/explainer.mdx | 42 +++++++++++++++++++++++++++++-- 2 files changed, 53 insertions(+), 4 deletions(-) diff --git a/components/WipCallout.tsx b/components/WipCallout.tsx index 72dd73d5c..2d0b96ccd 100644 --- a/components/WipCallout.tsx +++ b/components/WipCallout.tsx @@ -51,9 +51,14 @@ export function WipCallout({ context }: Props): ReactElement { ); } -export function InfoCallout({ context }: Props): ReactElement { +export function InteropCallout({ context }: Props): ReactElement { + const [closeCallout, setCloseCallout] = useState(false); return ( -
+
{context ? ( context @@ -69,6 +74,12 @@ export function InfoCallout({ context }: Props): ReactElement {
)}
+
); } diff --git a/pages/stack/interop/explainer.mdx b/pages/stack/interop/explainer.mdx index d054afc89..c5b7ba29f 100644 --- a/pages/stack/interop/explainer.mdx +++ b/pages/stack/interop/explainer.mdx @@ -7,9 +7,9 @@ description: Learn the basics of interoperability on the OP Stack. import { Callout } from 'nextra/components' import Image from 'next/image' -import { InfoCallout } from '@/components/WipCallout' +import { InteropCallout } from '@/components/WipCallout' - + # Interoperability explainer @@ -40,6 +40,44 @@ Chain operators can add or remove chains from the dependency set through the `Sy However, since the nature of defining a dependency is one way, it is impossible for a chain to know of all of the other chains that depend on it. +## New predeploys + +### CrossL2Inbox + +The `CrossL2Inbox` is the system predeploy for cross chain messaging. Anyone can trigger the execution or validation of cross chain messages, on behalf of any user. + +* **Address:** `0x4200000000000000000000000000000000000022` +* **Specs:** [CrossL2Inbox](https://specs.optimism.io/interop/predeploys.html#crossl2inbox) + +### L2ToL2CrossDomainMessenger + +The `L2ToL2CrossDomainMessenger` is a higher level abstraction on top of the `CrossL2Inbox` that provides general message passing, utilized for secure transfers ERC20 tokens between L2 chains. Messages sent through the `L2ToL2CrossDomainMessenger` on the source chain receive both replay protection as well as domain binding, ie the executing transaction can only be valid on a single chain. + +* **Address:** `0x4200000000000000000000000000000000000023` +* **Specs:** [CrossL2Inbox](https://specs.optimism.io/interop/predeploys.html#l2tol2crossdomainmessenger) + +### OptimismSuperchainERC20Factory + +The `OptimismSuperchainERC20Factory` creates ERC20 contracts that implements the SuperchainERC20 standard, grants mint-burn rights to the `L2StandardBridge` (`OptimismSuperchainERC20`) and include a remoteToken variable. These ERC20s are called `OptimismSuperchainERC20` and can be converted back and forth with `OptimismMintableERC20` tokens. The goal of the `OptimismSuperchainERC20` is to extend functionalities of the `OptimismMintableERC20` so that they are interop compatible. + +* **Address:** `0x4200000000000000000000000000000000000026` +* **Specs:** [OptimismSuperchainERC20Factory](https://specs.optimism.io/interop/predeploys.html#optimismsuperchainerc20factory) + + +### BeaconContract + +The `BeaconContract` predeploy gets called by the `OptimismSuperchainERC20` BeaconProxies deployed by the SuperchainERC20Factory. The Beacon Contract implements the interface defined in [EIP-1967](https://eips.ethereum.org/EIPS/eip-1967). + +* **Address:** `0x4200000000000000000000000000000000000027` +* **Specs:** [BeaconContract](https://specs.optimism.io/interop/predeploys.html#beaconcontract) + +### SuperchainERC20Bridge + +The `SuperchainERC20Bridge` is an abstraction on top of the `L2toL2CrossDomainMessenger` that facilitates token bridging using interop. It has mint and burn rights over `SuperchainERC20` tokens as described in the [token bridging spec](https://specs.optimism.io/interop/token-bridging.html). + +* **Address:** `0x4200000000000000000000000000000000000028` +* **Specs:** [SuperchainERC20Bridge](https://specs.optimism.io/interop/predeploys.html#superchainerc20bridge) + ## Considerations Chain operators will need to run additional infrastructure to be part of the interoperable set. * The Superchain-backend service, `op-supervisor`, will be a requirement for running an OP Stack chain that has interop enabled. From 48008e1330fd656543b6099185d1c7f2436999b7 Mon Sep 17 00:00:00 2001 From: soyboy Date: Thu, 7 Nov 2024 14:58:17 -0800 Subject: [PATCH 461/565] adding devnet information --- pages/stack/interop/_meta.json | 1 + pages/stack/interop/devnet.mdx | 45 ++++++++++++++++++++++++++++++++++ 2 files changed, 46 insertions(+) create mode 100644 pages/stack/interop/devnet.mdx diff --git a/pages/stack/interop/_meta.json b/pages/stack/interop/_meta.json index d42e969ce..14e3d1753 100644 --- a/pages/stack/interop/_meta.json +++ b/pages/stack/interop/_meta.json @@ -1,5 +1,6 @@ { "explainer": "Interop explainer", + "devnet": "Interop devnet", "cross-chain-message": "Anatomy of cross-chain message", "supersim": "Supersim Multichain Development Environment", "message-passing": "Interop message passing", diff --git a/pages/stack/interop/devnet.mdx b/pages/stack/interop/devnet.mdx new file mode 100644 index 000000000..b4e9c0abb --- /dev/null +++ b/pages/stack/interop/devnet.mdx @@ -0,0 +1,45 @@ +--- +title: Interop devnet +lang: en-US +description: Learn how to connect to the public interoperability devnet. +--- + +import { Callout, Tabs, Steps } from 'nextra/components' + +# Interop devnet + +The Interop Devnet is a temporary public network of two OP Stack Sepolia instances that supports SuperERC20 tokens, native cross-chain messaging, and cross-chain ETH transfers. This network will be deprecated once the next devnet is released. + +## Interop Devnet 0 + +| Parameter | Value | +| --------------------------- | ---------------------------------------------------------------------------------------------------- | +| Network Name | `Interop Devnet 0` | +| Chain ID | `11473209` | +| Currency Symbol1 | ETH | +| Explorer | [https://optimism-interop-devnet-0.blockscout.com](https://optimism-interop-devnet-0.blockscout.com) | +| Public RPC URL | [https://interop-devnet-0.optimism.io](https://interop-devnet-0.optimism.io) | +| Sequencer URL2 | [https://interop-devnet-0.optimism.io](https://interop-devnet-0.optimism.io) | +| OptimismPortal3 | `0xb081417d0578d70eb6bee7bfa646ef8c283eb35a` | + +## Interop Devnet 1 + +| Parameter | Value | +| --------------------------- | ---------------------------------------------------------------------------------------------------- | +| Network Name | `Interop Devnet 1` | +| Chain ID | `21473209` | +| Currency Symbol1 | ETH | +| Explorer | [https://optimism-interop-devnet-1.blockscout.com](https://optimism-interop-devnet-1.blockscout.com) | +| Public RPC URL | [https://interop-devnet-1.optimism.io](https://interop-devnet-1.optimism.io) | +| Sequencer URL2 | [https://interop-devnet-1.optimism.io](https://interop-devnet-1.optimism.io) | +| OptimismPortal3 | `0x85894f229575681130ac2f2365917cf156f8e75a` | + +1. The "currency symbol" is required by some wallets like MetaMask. +2. The sequencer URL is write only. +3. The OptimismPortal address is used for bridging ETH from Sepolia to the respective devnet. + +To get ETH on the Interop Devnets: + +1. Get Sepolia ETH from [console.optimism.io/faucet](https://console.optimism.io/faucet) +2. Transfer the Sepolia ETH to the OptimismPortal address of your desired devnet +3. Wait approximately 2 minutes for the bridging process to complete From cadec3666721739fc9b79a2834f297730570c493 Mon Sep 17 00:00:00 2001 From: Hamdi Allam Date: Fri, 8 Nov 2024 01:04:28 +0200 Subject: [PATCH 462/565] remove reference to auth --- pages/builders/chain-operators/tools/op-txproxy.mdx | 11 ----------- pages/builders/tools/build/account-abstraction.mdx | 2 +- 2 files changed, 1 insertion(+), 12 deletions(-) diff --git a/pages/builders/chain-operators/tools/op-txproxy.mdx b/pages/builders/chain-operators/tools/op-txproxy.mdx index 1433b2b68..83f7c7a97 100644 --- a/pages/builders/chain-operators/tools/op-txproxy.mdx +++ b/pages/builders/chain-operators/tools/op-txproxy.mdx @@ -20,16 +20,6 @@ A [passthrough proxy](https://github.com/ethereum-optimism/infra/tree/main/op-tx To safely expose this endpoint publicly, additional stateless constraints are applied. These constraints help scale validation rules horizontally and preemptively reject conditional transactions before they reach the sequencer. Various metrics are emitted to guide necessary adjustments. -#### Authentication - -The caller authenticates using any valid ECDSA-secp256k1 key, such as an Ethereum key. The signature is computed over the [EIP-191](https://eips.ethereum.org/EIPS/eip-191) hash of the request body. The calling address does **not need to hold an Ethereum balance**; it is simply used for identification. - -With the signature and signing address, the request is authenticated under the `X-Optimism-Signature` header with the value `: `. - -* Requests with a missing authentication header fail with the `-32003` (transaction rejected) json rpc error code. -* Requests with a mismatch in recovered signer and supplied public key will have the http request failed with status code `400 - Bad Request`. - -Currently, no authorization policies are implemented on this endpoint. However, the authentication mechanism is in place to allow for future implementation of policies such as allowlists, localized rate limits, and other potential restrictions. #### Runtime shutoff This service can be configured with a flag or environment variable to reject conditional transactions without needing to interrupt the execution engine. This feature is useful for diagnosing issues. @@ -59,7 +49,6 @@ When the request passes validation, it is passed through to the configured backe `--sendRawTxConditional.backend ($OP_TXPROXY_SENDRAWTXCONDITIONAL_BACKENDS)` - Per the [specification](/stack/features/send-raw-transaction-conditional), conditional transactions are not gossiped between peers. Thus, if you use replicas in an active/passive sequencer setup, this request must be broadcasted to all replicas. diff --git a/pages/builders/tools/build/account-abstraction.mdx b/pages/builders/tools/build/account-abstraction.mdx index 266286735..8b014756e 100644 --- a/pages/builders/tools/build/account-abstraction.mdx +++ b/pages/builders/tools/build/account-abstraction.mdx @@ -23,7 +23,7 @@ import { Callout } from 'nextra/components' The OP Stack includes support for the `eth_sendRawTransactionConditional` RPC method to assist bundlers on shared 4337 mempools. See the [specification](/stack/features/send-raw-transaction-conditional) for how this method is implemented in op-geth. -If enabled by the chain operator, also see the supplemental [op-txproxy](/builders/chain-operators/tools/op-txproxy) service, if applied, as this enforces request authentication for this method. +If used by the chain operator, also see the supplemental [op-txproxy](/builders/chain-operators/tools/op-txproxy) service which may apply additional restrictions prior to reaching the block builder. As of today, this endpoint is not enabled by default in the stack. The operator must explicitly configure this. From 05f040c20f057e41fdda611c00c229279282fb50 Mon Sep 17 00:00:00 2001 From: soyboy Date: Thu, 7 Nov 2024 15:21:17 -0800 Subject: [PATCH 463/565] adding blessing's work --- pages/stack/interop.mdx | 2 ++ pages/stack/interop/devnet.mdx | 31 ++++++++++++++++++++----------- words.txt | 8 +------- 3 files changed, 23 insertions(+), 18 deletions(-) diff --git a/pages/stack/interop.mdx b/pages/stack/interop.mdx index 6df1e266c..466533c36 100644 --- a/pages/stack/interop.mdx +++ b/pages/stack/interop.mdx @@ -22,4 +22,6 @@ Documentation covering Cross Chain Message, Explainer, Message Passing, Op Super + + diff --git a/pages/stack/interop/devnet.mdx b/pages/stack/interop/devnet.mdx index b4e9c0abb..a8ab40132 100644 --- a/pages/stack/interop/devnet.mdx +++ b/pages/stack/interop/devnet.mdx @@ -6,7 +6,7 @@ description: Learn how to connect to the public interoperability devnet. import { Callout, Tabs, Steps } from 'nextra/components' -# Interop devnet +# Interop devnet The Interop Devnet is a temporary public network of two OP Stack Sepolia instances that supports SuperERC20 tokens, native cross-chain messaging, and cross-chain ETH transfers. This network will be deprecated once the next devnet is released. @@ -19,8 +19,8 @@ The Interop Devnet is a temporary public network of two OP Stack Sepolia instanc | Currency Symbol1 | ETH | | Explorer | [https://optimism-interop-devnet-0.blockscout.com](https://optimism-interop-devnet-0.blockscout.com) | | Public RPC URL | [https://interop-devnet-0.optimism.io](https://interop-devnet-0.optimism.io) | -| Sequencer URL2 | [https://interop-devnet-0.optimism.io](https://interop-devnet-0.optimism.io) | -| OptimismPortal3 | `0xb081417d0578d70eb6bee7bfa646ef8c283eb35a` | +| Sequencer URL | [https://interop-devnet-0.optimism.io](https://interop-devnet-0.optimism.io) | +| OptimismPortal2 | `0xb081417d0578d70eb6bee7bfa646ef8c283eb35a` | ## Interop Devnet 1 @@ -31,15 +31,24 @@ The Interop Devnet is a temporary public network of two OP Stack Sepolia instanc | Currency Symbol1 | ETH | | Explorer | [https://optimism-interop-devnet-1.blockscout.com](https://optimism-interop-devnet-1.blockscout.com) | | Public RPC URL | [https://interop-devnet-1.optimism.io](https://interop-devnet-1.optimism.io) | -| Sequencer URL2 | [https://interop-devnet-1.optimism.io](https://interop-devnet-1.optimism.io) | -| OptimismPortal3 | `0x85894f229575681130ac2f2365917cf156f8e75a` | +| Sequencer URL | [https://interop-devnet-1.optimism.io](https://interop-devnet-1.optimism.io) | +| OptimismPortal2 | `0x85894f229575681130ac2f2365917cf156f8e75a` | 1. The "currency symbol" is required by some wallets like MetaMask. -2. The sequencer URL is write only. -3. The OptimismPortal address is used for bridging ETH from Sepolia to the respective devnet. +2. The OptimismPortal address is used for bridging ETH from Sepolia to the respective devnet. -To get ETH on the Interop Devnets: +## Sending ETH to the interop devnets -1. Get Sepolia ETH from [console.optimism.io/faucet](https://console.optimism.io/faucet) -2. Transfer the Sepolia ETH to the OptimismPortal address of your desired devnet -3. Wait approximately 2 minutes for the bridging process to complete + + ### Get Sepolia ETH + + You can utilize the [Superchain Faucet](https://console.optimism.io/faucet) to get ether on Sepolia. + + ### Send the Sepolia ETH to the devnet + + You can send ether directly to the `OptimismPortal` address and it will go to the same sender address on the devnet. + + ### Wait + + It'll take approximately 2 minutes for the bridging process to complete and the ether to appear in your wallet. + diff --git a/words.txt b/words.txt index 5d17e5318..18fa8261f 100644 --- a/words.txt +++ b/words.txt @@ -10,7 +10,6 @@ Allnodes Allocs allocs ANDI -Ankr Apeworx Arweave authrpc @@ -78,6 +77,7 @@ datadir Dencun Devnet devnet +devnets Devnode direnv DISABLETXPOOLGOSSIP @@ -149,7 +149,6 @@ holesky IGNOREPRICE ignoreprice implicity -Immunefi Inator inator INFLUXDBV @@ -197,7 +196,6 @@ minsuggestedpriorityfee Mintable Mintplex MIPSEVM -Mitigations Monitorism Moralis Mordor @@ -292,8 +290,6 @@ Proxied Proxyd proxyd pseudorandomly -Pyth -Pyth's QRNG Quicknode quicknode @@ -328,7 +324,6 @@ safedb Schnorr secp SELFDESTRUCT -Sepolia seqnr SEQUENCERHTTP sequencerhttp @@ -394,7 +389,6 @@ vhosts Viem viem Viem's -voxel VMDEBUG vmdebug VMODULE From e77304a326c35f5fee4d9ae200fb7682382dbf09 Mon Sep 17 00:00:00 2001 From: soyboy Date: Thu, 7 Nov 2024 15:24:17 -0800 Subject: [PATCH 464/565] adding not on the portal --- pages/stack/interop/devnet.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/stack/interop/devnet.mdx b/pages/stack/interop/devnet.mdx index a8ab40132..a5a3388b9 100644 --- a/pages/stack/interop/devnet.mdx +++ b/pages/stack/interop/devnet.mdx @@ -35,7 +35,7 @@ The Interop Devnet is a temporary public network of two OP Stack Sepolia instanc | OptimismPortal2 | `0x85894f229575681130ac2f2365917cf156f8e75a` | 1. The "currency symbol" is required by some wallets like MetaMask. -2. The OptimismPortal address is used for bridging ETH from Sepolia to the respective devnet. +2. The `OptimismPortal` is a low-level contract responsible for passing messages between L1 and L2. Messages sent directly to the `OptimismPortal` have no form of replayability. You can send ether directly to the portal to receive it to the sender address on the L2. ## Sending ETH to the interop devnets From 171ee15e6b626b6a440003b21c51d8dee7ccd4da Mon Sep 17 00:00:00 2001 From: soyboy Date: Thu, 7 Nov 2024 15:38:06 -0800 Subject: [PATCH 465/565] linter errors --- words.txt | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/words.txt b/words.txt index 18fa8261f..9730960b3 100644 --- a/words.txt +++ b/words.txt @@ -401,3 +401,10 @@ ZKPs ZKVM Zora zora +Sepolia +SEPOLIA +Immunefi +Mitigations +Pyth's +Pyth +voxel \ No newline at end of file From c1ed5eb89763561574f5d575a503b201eb4db6d1 Mon Sep 17 00:00:00 2001 From: soyboy <85043086+sbvegan@users.noreply.github.com> Date: Thu, 7 Nov 2024 15:39:54 -0800 Subject: [PATCH 466/565] Apply suggestions from code review Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> --- pages/stack/interop/explainer.mdx | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/pages/stack/interop/explainer.mdx b/pages/stack/interop/explainer.mdx index c5b7ba29f..daa2a1d3b 100644 --- a/pages/stack/interop/explainer.mdx +++ b/pages/stack/interop/explainer.mdx @@ -51,14 +51,14 @@ The `CrossL2Inbox` is the system predeploy for cross chain messaging. Anyone can ### L2ToL2CrossDomainMessenger -The `L2ToL2CrossDomainMessenger` is a higher level abstraction on top of the `CrossL2Inbox` that provides general message passing, utilized for secure transfers ERC20 tokens between L2 chains. Messages sent through the `L2ToL2CrossDomainMessenger` on the source chain receive both replay protection as well as domain binding, ie the executing transaction can only be valid on a single chain. +The `L2ToL2CrossDomainMessenger` is a higher level abstraction on top of the `CrossL2Inbox` that provides general message passing, utilized for secure transfers ERC20 tokens between L2 chains. Messages sent through the `L2ToL2CrossDomainMessenger` on the source chain receive both replay protection and domain binding, ie the executing transaction can only be valid on a single chain. * **Address:** `0x4200000000000000000000000000000000000023` * **Specs:** [CrossL2Inbox](https://specs.optimism.io/interop/predeploys.html#l2tol2crossdomainmessenger) ### OptimismSuperchainERC20Factory -The `OptimismSuperchainERC20Factory` creates ERC20 contracts that implements the SuperchainERC20 standard, grants mint-burn rights to the `L2StandardBridge` (`OptimismSuperchainERC20`) and include a remoteToken variable. These ERC20s are called `OptimismSuperchainERC20` and can be converted back and forth with `OptimismMintableERC20` tokens. The goal of the `OptimismSuperchainERC20` is to extend functionalities of the `OptimismMintableERC20` so that they are interop compatible. +The `OptimismSuperchainERC20Factory` creates ERC20 contracts that implement the SuperchainERC20 standard, grants mint-burn rights to the `L2StandardBridge` (`OptimismSuperchainERC20`) and include a remoteToken variable. These ERC20s are called `OptimismSuperchainERC20` and can be converted back and forth with `OptimismMintableERC20` tokens. The goal of the `OptimismSuperchainERC20` is to extend functionalities of the `OptimismMintableERC20` so that they are interop compatible. * **Address:** `0x4200000000000000000000000000000000000026` * **Specs:** [OptimismSuperchainERC20Factory](https://specs.optimism.io/interop/predeploys.html#optimismsuperchainerc20factory) @@ -73,11 +73,10 @@ The `BeaconContract` predeploy gets called by the `OptimismSuperchainERC20` Beac ### SuperchainERC20Bridge -The `SuperchainERC20Bridge` is an abstraction on top of the `L2toL2CrossDomainMessenger` that facilitates token bridging using interop. It has mint and burn rights over `SuperchainERC20` tokens as described in the [token bridging spec](https://specs.optimism.io/interop/token-bridging.html). +The `SuperchainERC20Bridge` is an abstraction on top of the `L2toL2CrossDomainMessenger` that facilitates token bridging using interop. It has mint and burn rights over `SuperchainERC20` tokens, as described in the [token bridging spec](https://specs.optimism.io/interop/token-bridging.html). * **Address:** `0x4200000000000000000000000000000000000028` * **Specs:** [SuperchainERC20Bridge](https://specs.optimism.io/interop/predeploys.html#superchainerc20bridge) - ## Considerations Chain operators will need to run additional infrastructure to be part of the interoperable set. * The Superchain-backend service, `op-supervisor`, will be a requirement for running an OP Stack chain that has interop enabled. From 9169d0f43f4502b05220e8a1bfc0e79867acd95e Mon Sep 17 00:00:00 2001 From: soyboy Date: Thu, 7 Nov 2024 15:42:23 -0800 Subject: [PATCH 467/565] fixing linter --- words.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/words.txt b/words.txt index 9730960b3..125b52fee 100644 --- a/words.txt +++ b/words.txt @@ -407,4 +407,5 @@ Immunefi Mitigations Pyth's Pyth -voxel \ No newline at end of file +voxel +Ankr \ No newline at end of file From efff8f5ca875098f7eeaa2f3b4c8364bc9f7dffc Mon Sep 17 00:00:00 2001 From: soyboy Date: Thu, 7 Nov 2024 15:44:27 -0800 Subject: [PATCH 468/565] updating description --- pages/stack/interop/devnet.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/stack/interop/devnet.mdx b/pages/stack/interop/devnet.mdx index a5a3388b9..a44b0f01b 100644 --- a/pages/stack/interop/devnet.mdx +++ b/pages/stack/interop/devnet.mdx @@ -1,7 +1,7 @@ --- title: Interop devnet lang: en-US -description: Learn how to connect to the public interoperability devnet. +description: Details on the public interoperability devnets. --- import { Callout, Tabs, Steps } from 'nextra/components' From 641f892439d3d83e88e9ba5e7335e8c10b60c40a Mon Sep 17 00:00:00 2001 From: soyboy Date: Thu, 7 Nov 2024 15:49:40 -0800 Subject: [PATCH 469/565] adding description of predeploys --- pages/stack/interop/explainer.mdx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pages/stack/interop/explainer.mdx b/pages/stack/interop/explainer.mdx index daa2a1d3b..dba879b48 100644 --- a/pages/stack/interop/explainer.mdx +++ b/pages/stack/interop/explainer.mdx @@ -42,6 +42,8 @@ However, since the nature of defining a dependency is one way, it is impossible ## New predeploys +The following predeploys have been added to enable interoperability. Predeployed smart contracts exist at predetermined addresses in the genesis state. They are similar to precompiles but instead run directly in the EVM instead of running native code outside the EVM. + ### CrossL2Inbox The `CrossL2Inbox` is the system predeploy for cross chain messaging. Anyone can trigger the execution or validation of cross chain messages, on behalf of any user. From e3aec424c97788e425f3df4f198fea97559ee2e3 Mon Sep 17 00:00:00 2001 From: soyboy <85043086+sbvegan@users.noreply.github.com> Date: Thu, 7 Nov 2024 15:55:38 -0800 Subject: [PATCH 470/565] Apply suggestions from code review Co-authored-by: cpengilly <29023967+cpengilly@users.noreply.github.com> --- pages/stack/interop/devnet.mdx | 6 +++--- pages/stack/interop/explainer.mdx | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/pages/stack/interop/devnet.mdx b/pages/stack/interop/devnet.mdx index a44b0f01b..4a3b202a6 100644 --- a/pages/stack/interop/devnet.mdx +++ b/pages/stack/interop/devnet.mdx @@ -10,7 +10,7 @@ import { Callout, Tabs, Steps } from 'nextra/components' The Interop Devnet is a temporary public network of two OP Stack Sepolia instances that supports SuperERC20 tokens, native cross-chain messaging, and cross-chain ETH transfers. This network will be deprecated once the next devnet is released. -## Interop Devnet 0 +## Interop devnet 0 | Parameter | Value | | --------------------------- | ---------------------------------------------------------------------------------------------------- | @@ -22,7 +22,7 @@ The Interop Devnet is a temporary public network of two OP Stack Sepolia instanc | Sequencer URL | [https://interop-devnet-0.optimism.io](https://interop-devnet-0.optimism.io) | | OptimismPortal2 | `0xb081417d0578d70eb6bee7bfa646ef8c283eb35a` | -## Interop Devnet 1 +## Interop devnet 1 | Parameter | Value | | --------------------------- | ---------------------------------------------------------------------------------------------------- | @@ -48,7 +48,7 @@ The Interop Devnet is a temporary public network of two OP Stack Sepolia instanc You can send ether directly to the `OptimismPortal` address and it will go to the same sender address on the devnet. - ### Wait + ### Wait for bridging to complete It'll take approximately 2 minutes for the bridging process to complete and the ether to appear in your wallet. diff --git a/pages/stack/interop/explainer.mdx b/pages/stack/interop/explainer.mdx index dba879b48..f9502b95c 100644 --- a/pages/stack/interop/explainer.mdx +++ b/pages/stack/interop/explainer.mdx @@ -81,7 +81,7 @@ The `SuperchainERC20Bridge` is an abstraction on top of the `L2toL2CrossDomainMe * **Specs:** [SuperchainERC20Bridge](https://specs.optimism.io/interop/predeploys.html#superchainerc20bridge) ## Considerations Chain operators will need to run additional infrastructure to be part of the interoperable set. -* The Superchain-backend service, `op-supervisor`, will be a requirement for running an OP Stack chain that has interop enabled. +* The Superchain-backend service, [`op-supervisor`](op-supervisor), will be a requirement for running an OP Stack chain that has interop enabled. `op-supervisor` is responsible for validating all cross-chain messages and will need to have an RPC configured for each chain in the dependency set. * In the future, to reduce infrastructure costs, `op-supervisor` will rely on the P2P network and cryptographic schemes for validating cross-chain messages. From 3fbbe7f7b6e657e8291fa0c5d1d3825f99d7c486 Mon Sep 17 00:00:00 2001 From: soyboy Date: Thu, 7 Nov 2024 15:57:03 -0800 Subject: [PATCH 471/565] fixing capitalization --- pages/stack/interop/devnet.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/stack/interop/devnet.mdx b/pages/stack/interop/devnet.mdx index 4a3b202a6..10fe2c954 100644 --- a/pages/stack/interop/devnet.mdx +++ b/pages/stack/interop/devnet.mdx @@ -8,7 +8,7 @@ import { Callout, Tabs, Steps } from 'nextra/components' # Interop devnet -The Interop Devnet is a temporary public network of two OP Stack Sepolia instances that supports SuperERC20 tokens, native cross-chain messaging, and cross-chain ETH transfers. This network will be deprecated once the next devnet is released. +The Interop devnet is a temporary public network of two OP Stack Sepolia instances that supports SuperERC20 tokens, native cross-chain messaging, and cross-chain ETH transfers. This network will be deprecated once the next devnet is released. ## Interop devnet 0 From 6d1a877fb9ae4a61ae6de86225096d7a71789ba3 Mon Sep 17 00:00:00 2001 From: soyboy <85043086+sbvegan@users.noreply.github.com> Date: Thu, 7 Nov 2024 16:06:32 -0800 Subject: [PATCH 472/565] Update pages/stack/interop/explainer.mdx Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> --- pages/stack/interop/explainer.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/stack/interop/explainer.mdx b/pages/stack/interop/explainer.mdx index f9502b95c..580de9dfe 100644 --- a/pages/stack/interop/explainer.mdx +++ b/pages/stack/interop/explainer.mdx @@ -56,7 +56,7 @@ The `CrossL2Inbox` is the system predeploy for cross chain messaging. Anyone can The `L2ToL2CrossDomainMessenger` is a higher level abstraction on top of the `CrossL2Inbox` that provides general message passing, utilized for secure transfers ERC20 tokens between L2 chains. Messages sent through the `L2ToL2CrossDomainMessenger` on the source chain receive both replay protection and domain binding, ie the executing transaction can only be valid on a single chain. * **Address:** `0x4200000000000000000000000000000000000023` -* **Specs:** [CrossL2Inbox](https://specs.optimism.io/interop/predeploys.html#l2tol2crossdomainmessenger) +* **Specs:** [L2ToL2CrossDomainMessenger](https://specs.optimism.io/interop/predeploys.html#l2tol2crossdomainmessenger) ### OptimismSuperchainERC20Factory From c2c0cdbd895dffc0249756b81012bde269317759 Mon Sep 17 00:00:00 2001 From: soyboy <85043086+sbvegan@users.noreply.github.com> Date: Thu, 7 Nov 2024 16:06:48 -0800 Subject: [PATCH 473/565] Update pages/stack/interop/explainer.mdx Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> --- pages/stack/interop/explainer.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/stack/interop/explainer.mdx b/pages/stack/interop/explainer.mdx index 580de9dfe..09611d7e5 100644 --- a/pages/stack/interop/explainer.mdx +++ b/pages/stack/interop/explainer.mdx @@ -60,7 +60,7 @@ The `L2ToL2CrossDomainMessenger` is a higher level abstraction on top of the `Cr ### OptimismSuperchainERC20Factory -The `OptimismSuperchainERC20Factory` creates ERC20 contracts that implement the SuperchainERC20 standard, grants mint-burn rights to the `L2StandardBridge` (`OptimismSuperchainERC20`) and include a remoteToken variable. These ERC20s are called `OptimismSuperchainERC20` and can be converted back and forth with `OptimismMintableERC20` tokens. The goal of the `OptimismSuperchainERC20` is to extend functionalities of the `OptimismMintableERC20` so that they are interop compatible. +The `OptimismSuperchainERC20Factory` creates ERC20 contracts that implement the SuperchainERC20 standard, grants mint-burn rights to the `L2StandardBridge` (`OptimismSuperchainERC20`), and includes a remoteToken variable. These ERC20s are called `OptimismSuperchainERC20` and can be converted back and forth with `OptimismMintableERC20` tokens. The goal of the `OptimismSuperchainERC20` is to extend functionalities of the `OptimismMintableERC20` so that they are interop compatible. * **Address:** `0x4200000000000000000000000000000000000026` * **Specs:** [OptimismSuperchainERC20Factory](https://specs.optimism.io/interop/predeploys.html#optimismsuperchainerc20factory) From 7d0b8c048f01a4a951a23be3cdd4f016733e92b1 Mon Sep 17 00:00:00 2001 From: soyboy Date: Thu, 7 Nov 2024 16:07:46 -0800 Subject: [PATCH 474/565] adding some next steps --- pages/stack/interop/_meta.json | 2 +- pages/stack/interop/devnet.mdx | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/pages/stack/interop/_meta.json b/pages/stack/interop/_meta.json index 14e3d1753..ac5d2f1f3 100644 --- a/pages/stack/interop/_meta.json +++ b/pages/stack/interop/_meta.json @@ -1,8 +1,8 @@ { "explainer": "Interop explainer", "devnet": "Interop devnet", - "cross-chain-message": "Anatomy of cross-chain message", "supersim": "Supersim Multichain Development Environment", + "cross-chain-message": "Anatomy of cross-chain message", "message-passing": "Interop message passing", "op-supervisor": "OP Supervisor", "assets": "Assets" diff --git a/pages/stack/interop/devnet.mdx b/pages/stack/interop/devnet.mdx index 10fe2c954..df2d5bb34 100644 --- a/pages/stack/interop/devnet.mdx +++ b/pages/stack/interop/devnet.mdx @@ -52,3 +52,9 @@ The Interop devnet is a temporary public network of two OP Stack Sepolia instanc It'll take approximately 2 minutes for the bridging process to complete and the ether to appear in your wallet. + +## Next steps + +* Want to start with local development? Use [Supersim](/stack/interop/supersim), a local dev environment that simulates interop for testing applications against a local version of the Superchain. +* Read about [interop message passing](/stack/interop/cross-chain-message) to see how you can implement it yourself on this devnet. + From 2fcb3c879d08d6678b9bcfddd94c0c8d75871ded Mon Sep 17 00:00:00 2001 From: Bradley Camacho <42678939+bradleycamacho@users.noreply.github.com> Date: Thu, 7 Nov 2024 16:23:13 -0800 Subject: [PATCH 475/565] Feedback additions --- pages/stack/interop/deploy-superchain-erc20.mdx | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/pages/stack/interop/deploy-superchain-erc20.mdx b/pages/stack/interop/deploy-superchain-erc20.mdx index 98cb08a62..3b6a03245 100644 --- a/pages/stack/interop/deploy-superchain-erc20.mdx +++ b/pages/stack/interop/deploy-superchain-erc20.mdx @@ -15,7 +15,8 @@ import { Steps } from 'nextra/components' This guide explains how to issue new assets with the `SuperchainERC20` and bridge them effectively using the `SuperchainERC20Bridge`. If you want more information about the `SuperchainERC20 standard`, see our [`SuperchainERC20` standard explainer](/stack/interop/superchain-erc20) -An important thing to note is using `crosschainBurn` and `crosschainMint` on the `SuperchainERC20` to move your asset across the Superchain only affects which chain your asset is located on and does not change the overall supply of the token. This keeps the token’s total amount the same across all networks, ensuring its value stays stable during the move and that the `SuperchainERC20` retains a unified, global supply count. + +Note that bridging assets through the Superchain using `SuperchainERC20` never affects the total supply of your asset. The supply remains fixed, and bridging only changes the chain on which your asset is located. This keeps the token’s total amount the same across all networks, ensuring its value stays stable during the move and that the `SuperchainERC20` retains a unified, global supply count. ## Steps to issue and bridge assets @@ -25,8 +26,8 @@ An important thing to note is using `crosschainBurn` and `crosschainMint` on the To ensure fungibility across chains, the SuperchainERC20 assets need to have the same contract address on all chains. Achieving this requires deterministic deployment methods, such as: -* `Create2Deployer`: A smart contract that enables deploying contracts with predictable addresses. -* `OptimismSuperchainERC20Factory`: A factory contract designed for L1-native tokens to ensure uniform deployments across chains. + * `Create2Deployer`: A smart contract that enables deploying contracts with predictable addresses. + * `OptimismSuperchainERC20Factory`: A factory contract designed for L1-native tokens to ensure uniform deployments across chains. There are [many ways to do this](https://github.com/Arachnid/deterministic-deployment-proxy), but [here's an example smart contract to start](https://github.com/ethereum-optimism/superchainerc20-starter/blob/main/packages/contracts/src/L2NativeSuperchainERC20.sol) @@ -34,12 +35,12 @@ By deploying assets at identical addresses across multiple chains, we abstract a ### Implement the IERC7802 interface -Implementations of `SuperchainERC2` will be required to implement the [IERC7802](https://specs.optimism.io/interop/token-bridging.html#ierc7802) interface, that includes two external functions and two events. +Implementations of `SuperchainERC20` will be required to implement the [IERC7802](https://specs.optimism.io/interop/token-bridging.html#ierc7802) interface, that includes two external functions and two events. -We'll use two function for bridging: +The interface defines two functions for bridging: -* `sendERC20`: initializes a cross-chain transfer of a `SuperchainERC20` by burning the tokens locally and sending a message to the `SuperchainERC20Bridge` on the target chain using the `L2toL2CrossDomainMessenger`. This ensures that asset supply never changes; sending an asset moves it from one chain to another, it does not "create" an additional asset in regards to supply. -* `relayERC20`: process incoming messages from the L2toL2CrossDomainMessenger and mints the corresponding amount of the SuperchainERC20. +* `sendERC20`: Initializes a cross-chain transfer of a `SuperchainERC20` by burning the tokens locally and sending a message to the `SuperchainERC20Bridge` on the target chain using the `L2toL2CrossDomainMessenger`. This ensures that asset supply remains constant, as sending an asset moves it from one chain to another without creating additional supply. +* `relayERC20`: Processes incoming messages from the L2toL2CrossDomainMessenger and mints the corresponding amount of the SuperchainERC20. [Here's an example implementation of the `SuperchainERC20Bridge`](https://specs.optimism.io/interop/token-bridging.html#implementation) From da9d202943a909a36cb274a54a9dd80867ea03b1 Mon Sep 17 00:00:00 2001 From: Bradley Camacho <42678939+bradleycamacho@users.noreply.github.com> Date: Thu, 7 Nov 2024 16:25:13 -0800 Subject: [PATCH 476/565] Fix nav files --- pages/stack/interop/_meta.json | 3 +-- pages/stack/interop/assets/_meta.json | 3 ++- pages/stack/interop/{ => assets}/deploy-superchain-erc20.mdx | 0 3 files changed, 3 insertions(+), 3 deletions(-) rename pages/stack/interop/{ => assets}/deploy-superchain-erc20.mdx (100%) diff --git a/pages/stack/interop/_meta.json b/pages/stack/interop/_meta.json index 204b397c5..d42e969ce 100644 --- a/pages/stack/interop/_meta.json +++ b/pages/stack/interop/_meta.json @@ -4,6 +4,5 @@ "supersim": "Supersim Multichain Development Environment", "message-passing": "Interop message passing", "op-supervisor": "OP Supervisor", - "assets": "Assets", - "deploy-superchain-erc20": "Deploy assets using SuperchainERC20" + "assets": "Assets" } \ No newline at end of file diff --git a/pages/stack/interop/assets/_meta.json b/pages/stack/interop/assets/_meta.json index 15677456d..9398906a4 100644 --- a/pages/stack/interop/assets/_meta.json +++ b/pages/stack/interop/assets/_meta.json @@ -1,5 +1,6 @@ { "superchain-erc20": "SuperchainERC20", "superchain-weth": "SuperchainWETH (Interoperable ETH)", - "transfer-superchainERC20": "How to transfer a SuperchainERC20" + "transfer-superchainERC20": "How to transfer a SuperchainERC20", + "deploy-superchain-erc20": "Deploy assets using SuperchainERC20" } \ No newline at end of file diff --git a/pages/stack/interop/deploy-superchain-erc20.mdx b/pages/stack/interop/assets/deploy-superchain-erc20.mdx similarity index 100% rename from pages/stack/interop/deploy-superchain-erc20.mdx rename to pages/stack/interop/assets/deploy-superchain-erc20.mdx From 1fe6af018f6c8866916179d232deb032a28db5cf Mon Sep 17 00:00:00 2001 From: Bradley Camacho <42678939+bradleycamacho@users.noreply.github.com> Date: Thu, 7 Nov 2024 16:33:52 -0800 Subject: [PATCH 477/565] Linting --- .../assets/deploy-superchain-erc20.mdx | 30 +++++++++---------- 1 file changed, 14 insertions(+), 16 deletions(-) diff --git a/pages/stack/interop/assets/deploy-superchain-erc20.mdx b/pages/stack/interop/assets/deploy-superchain-erc20.mdx index 3b6a03245..0379308cb 100644 --- a/pages/stack/interop/assets/deploy-superchain-erc20.mdx +++ b/pages/stack/interop/assets/deploy-superchain-erc20.mdx @@ -15,38 +15,36 @@ import { Steps } from 'nextra/components' This guide explains how to issue new assets with the `SuperchainERC20` and bridge them effectively using the `SuperchainERC20Bridge`. If you want more information about the `SuperchainERC20 standard`, see our [`SuperchainERC20` standard explainer](/stack/interop/superchain-erc20) - -Note that bridging assets through the Superchain using `SuperchainERC20` never affects the total supply of your asset. The supply remains fixed, and bridging only changes the chain on which your asset is located. This keeps the token’s total amount the same across all networks, ensuring its value stays stable during the move and that the `SuperchainERC20` retains a unified, global supply count. - +Note that bridging assets through the Superchain using `SuperchainERC20` never affects the total supply of your asset. The supply remains fixed, and bridging only changes the chain on which your asset is located. This keeps the token's total amount the same across all networks, ensuring its value stays stable during the move and that the `SuperchainERC20` retains a unified, global supply count. ## Steps to issue and bridge assets -### Deploy the `SuperchainERC20` Token Contract + ### Deploy the `SuperchainERC20` Token Contract -To ensure fungibility across chains, the SuperchainERC20 assets need to have the same contract address on all chains. Achieving this requires deterministic deployment methods, such as: + To ensure fungibility across chains, the SuperchainERC20 assets need to have the same contract address on all chains. Achieving this requires deterministic deployment methods, such as: - * `Create2Deployer`: A smart contract that enables deploying contracts with predictable addresses. - * `OptimismSuperchainERC20Factory`: A factory contract designed for L1-native tokens to ensure uniform deployments across chains. + * `Create2Deployer`: A smart contract that enables deploying contracts with predictable addresses. + * `OptimismSuperchainERC20Factory`: A factory contract designed for L1-native tokens to ensure uniform deployments across chains. -There are [many ways to do this](https://github.com/Arachnid/deterministic-deployment-proxy), but [here's an example smart contract to start](https://github.com/ethereum-optimism/superchainerc20-starter/blob/main/packages/contracts/src/L2NativeSuperchainERC20.sol) + There are [many ways to do this](https://github.com/Arachnid/deterministic-deployment-proxy), but [here's an example smart contract to start](https://github.com/ethereum-optimism/superchainerc20-starter/blob/main/packages/contracts/src/L2NativeSuperchainERC20.sol) -By deploying assets at identical addresses across multiple chains, we abstract away the complexity of cross-chain validation. + By deploying assets at identical addresses across multiple chains, we abstract away the complexity of cross-chain validation. -### Implement the IERC7802 interface + ### Implement the IERC7802 interface -Implementations of `SuperchainERC20` will be required to implement the [IERC7802](https://specs.optimism.io/interop/token-bridging.html#ierc7802) interface, that includes two external functions and two events. + Implementations of `SuperchainERC20` will be required to implement the [IERC7802](https://specs.optimism.io/interop/token-bridging.html#ierc7802) interface, that includes two external functions and two events. -The interface defines two functions for bridging: + The interface defines two functions for bridging: -* `sendERC20`: Initializes a cross-chain transfer of a `SuperchainERC20` by burning the tokens locally and sending a message to the `SuperchainERC20Bridge` on the target chain using the `L2toL2CrossDomainMessenger`. This ensures that asset supply remains constant, as sending an asset moves it from one chain to another without creating additional supply. -* `relayERC20`: Processes incoming messages from the L2toL2CrossDomainMessenger and mints the corresponding amount of the SuperchainERC20. - -[Here's an example implementation of the `SuperchainERC20Bridge`](https://specs.optimism.io/interop/token-bridging.html#implementation) + * `sendERC20`: Initializes a cross-chain transfer of a `SuperchainERC20` by burning the tokens locally and sending a message to the `SuperchainERC20Bridge` on the target chain using the `L2toL2CrossDomainMessenger`. This ensures that asset supply remains constant, as sending an asset moves it from one chain to another without creating additional supply. + * `relayERC20`: Processes incoming messages from the L2toL2CrossDomainMessenger and mints the corresponding amount of the SuperchainERC20. + [Here's an example implementation of the `SuperchainERC20Bridge`](https://specs.optimism.io/interop/token-bridging.html#implementation) ## Next steps + * Explore the [SuperchainERC20 specifications](https://specs.optimism.io/interop/token-bridging.html) for in-depth implementation details. * Watch the [Superchain interop design video walkthrough](https://www.youtube.com/watch?v=FKc5RgjtGes) for a visual explanation of the concepts. * Review the [Superchain Interop Explainer](explainer) for answers to common questions about interoperability. From dc3c05e47af543d5f5eb64a4fabc43f09ea794a1 Mon Sep 17 00:00:00 2001 From: Bradley Camacho <42678939+bradleycamacho@users.noreply.github.com> Date: Thu, 7 Nov 2024 16:40:16 -0800 Subject: [PATCH 478/565] Lint again --- pages/stack/interop/assets.mdx | 2 ++ words.txt | 8 +------- 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/pages/stack/interop/assets.mdx b/pages/stack/interop/assets.mdx index f86a72a22..7aa352c94 100644 --- a/pages/stack/interop/assets.mdx +++ b/pages/stack/interop/assets.mdx @@ -16,4 +16,6 @@ Documentation covering SuperchainERC20, Superchain WETH, Supersim, and how to tr + + diff --git a/words.txt b/words.txt index 5d17e5318..a46c5ae63 100644 --- a/words.txt +++ b/words.txt @@ -10,7 +10,6 @@ Allnodes Allocs allocs ANDI -Ankr Apeworx Arweave authrpc @@ -146,10 +145,10 @@ historicalrpctimeout HOLESKY Holesky holesky +IERC IGNOREPRICE ignoreprice implicity -Immunefi Inator inator INFLUXDBV @@ -197,7 +196,6 @@ minsuggestedpriorityfee Mintable Mintplex MIPSEVM -Mitigations Monitorism Moralis Mordor @@ -292,8 +290,6 @@ Proxied Proxyd proxyd pseudorandomly -Pyth -Pyth's QRNG Quicknode quicknode @@ -328,7 +324,6 @@ safedb Schnorr secp SELFDESTRUCT -Sepolia seqnr SEQUENCERHTTP sequencerhttp @@ -394,7 +389,6 @@ vhosts Viem viem Viem's -voxel VMDEBUG vmdebug VMODULE From 18cd436d09fe95f68dc36373906e71810d2f78ef Mon Sep 17 00:00:00 2001 From: Bradley Camacho <42678939+bradleycamacho@users.noreply.github.com> Date: Thu, 7 Nov 2024 16:45:25 -0800 Subject: [PATCH 479/565] Fix linter again :( --- words.txt | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/words.txt b/words.txt index a46c5ae63..ee47a71c4 100644 --- a/words.txt +++ b/words.txt @@ -1,3 +1,10 @@ +Ankr +Immunefi +Mitigations +Pyth +Pyth's +Sepolia +voxel ACCOUNTQUEUE accountqueue ACCOUNTSLOTS From 727ca2c4f2edd217c1253b5f46ac276d4d6bc4c1 Mon Sep 17 00:00:00 2001 From: Bradley Camacho <42678939+bradleycamacho@users.noreply.github.com> Date: Thu, 7 Nov 2024 16:54:12 -0800 Subject: [PATCH 480/565] Remove node squad and other codeowners --- .github/CODEOWNERS | 9 --------- 1 file changed, 9 deletions(-) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 4d868357f..ee4dfe8c5 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -1,16 +1,7 @@ * @ethereum-optimism/docs-reviewers -# Giving Node Squad review privileges to the following sections -/pages/builders/chain-operators/ @ethereum-optimism/docs-reviewers @ethereum-optimism/node-squad -/pages/chain/ @ethereum-optimism/docs-reviewers @ethereum-optimism/node-squad -/pages/stack/ @ethereum-optimism/docs-reviewers @ethereum-optimism/node-squad - # Giving Marine privileges to review RPC providers, account abstraction, oracles, alt-da, and block explorers /pages/builders/tools/connect/rpc-providers.mdx @ethereum-optimism/docs-reviewers @0xmariniere /pages/builders/tools/build/block-explorers.mdx @ethereum-optimism/docs-reviewers @0xmariniere /pages/builders/tools/build/oracles.mdx @ethereum-optimism/docs-reviewers @0xmariniere /pages/builders/chain-operators/features/alt-da-mode.mdx @ethereum-optimism/docs-reviewers @0xmariniere -/pages/builders/tools/build/account-abstraction.mdx @ethereum-optimism/docs-reviewers @0xmariniere - -# Giving Binji privileges to review NFT tools -/pages/builders/tools/build/nft-tools.mdx @ethereum-optimism/docs-reviewers @binjix23 From 40cf36e4eea520af0de357882459b2c0f06937b7 Mon Sep 17 00:00:00 2001 From: soyboy Date: Thu, 7 Nov 2024 16:56:26 -0800 Subject: [PATCH 481/565] deleting sdk page --- .../chain-operators/tutorials/_meta.json | 1 - .../chain-operators/tutorials/sdk.mdx | 159 ------------------ public/_redirects | 3 +- 3 files changed, 2 insertions(+), 161 deletions(-) delete mode 100644 pages/builders/chain-operators/tutorials/sdk.mdx diff --git a/pages/builders/chain-operators/tutorials/_meta.json b/pages/builders/chain-operators/tutorials/_meta.json index 8643c85ac..c1122f8cc 100644 --- a/pages/builders/chain-operators/tutorials/_meta.json +++ b/pages/builders/chain-operators/tutorials/_meta.json @@ -1,6 +1,5 @@ { "create-l2-rollup": "Creating your own rollup testnet", - "sdk": "Using the Optimism SDK", "adding-derivation-attributes": "Adding attributes to the derivation function", "adding-precompiles": "Adding a precompile", "modifying-predeploys": "Modifying predeployed contracts", diff --git a/pages/builders/chain-operators/tutorials/sdk.mdx b/pages/builders/chain-operators/tutorials/sdk.mdx deleted file mode 100644 index 207c244d5..000000000 --- a/pages/builders/chain-operators/tutorials/sdk.mdx +++ /dev/null @@ -1,159 +0,0 @@ ---- -title: Using the Optimism SDK -lang: en-US -description: Learn how to use the Optimism SDK to interact with your OP Stack chain. ---- - -import { Callout, Steps } from 'nextra/components' -import { WipCallout } from '@/components/WipCallout' - - -# Using the Optimism SDK - -This tutorial will walk you through the process of using the [Optimism SDK](https://sdk.optimism.io) to interact with your OP Stack chain. -The Optimism SDK **natively** supports various OP Chains including OP Mainnet and Base. -To check whether your OP Chain is already supported, [see the Optimism SDK docs](https://sdk.optimism.io/enums/l2chainid). - - -You will need to already have created your own OP Stack chain to follow this tutorial. -Check out the tutorial on [Creating Your Own L2 Rollup Testnet](./create-l2-rollup) if you haven't done so already. - - -## Dependencies - -* [node](https://nodejs.org/en/) -* [pnpm](https://pnpm.io/installation) -* [jq](https://github.com/jqlang/jq) - -## Find contract addresses - -You will need to find the addresses for a number of smart contracts that are part of your OP Stack chain in order to use the Optimism SDK. -If you followed the instructions in the [Creating Your Own L2 Rollup Testnet](./create-l2-rollup) tutorial, you can find the addresses by looking at the JSON artifacts within the directory `optimism/packages/contracts-bedrock/deployments/getting-started`. - -Simply run the following command from inside the directory `optimism/packages/contracts-bedrock` to print the list of addresses you'll need: - -```bash -./scripts/print-addresses.sh getting-started --sdk -``` - - -Make sure you have [`jq`](https://github.com/jqlang/jq) installed when running this command. - - -You should see output similar to the following: - -```text -AddressManager: 0x... -L1CrossDomainMessengerProxy: 0x... -L1StandardBridgeProxy: 0x... -L2OutputOracleProxy: 0x... -OptimismPortalProxy: 0x... -``` - -Save these addresses somewhere so you can use them in the next section. - -## Create a demo project - -You're going to use the Optimism SDK for this tutorial. -Since the Optimism SDK is a [Node.js](https://nodejs.org/en/) library, you'll need to create a Node.js project to use it. - - - -{

Make a Project Folder

} - -```bash -mkdir op-sdk-sample-project -cd op-sdk-sample-project -``` - -{

Initialize the Project

} - -```bash -pnpm init -``` - -{

Install the Optimism SDK

} - -```bash -pnpm add @eth-optimism/sdk -``` - -{

Install ethers.js

} - -```bash -pnpm add ethers@^5 -``` - -
- -## Start the Node REPL - -You're going to use the Node REPL to interact with the Optimism SDK. -To start the Node REPL run the following command in your terminal: - -```bash -node -``` - -This will bring up a Node REPL prompt that allows you to run javascript code. - -## Import dependencies - -You need to import some dependencies into your Node REPL session. - - - -{

Import the Optimism SDK

} - -```js file=/public/tutorials/sdk-stack.js#L3 hash=26b2fdb17dd6c8326a54ec51f0769528 -``` - -{

Import ethers.js

} - -```js file=/public/tutorials/sdk-stack.js#L4 hash=69a65ef97862612e4978b8563e6dbe3a -``` - -
- -## Set session variables - -You'll need a few variables throughout this tutorial. -Let's set those up now. - - - -{

Create the RPC providers

} - -```js file=/public/tutorials/sdk-stack.js#L6-L7 hash=53fc69364fffe9faa00ab558446cbe13 -``` - -{

Set the contract addresses

} - -Using the addresses you accessed earlier, set the contract addresses in the following variables: - -```js file=/public/tutorials/sdk-stack.js#L9-L13 hash=c32c35e3e6eebb1b3c9c68dece1cb93f -``` - -{

Set the chain IDs

} - -```js file=/public/tutorials/sdk-stack.js#L15-L16 hash=f33189a08efe81f43a03bbc4a6812a1a -``` - -
- -## Initialize the Optimism SDK - -You can now create an instance of the `CrossChainMessenger` object from the Optimism SDK. -This will allow you to easily handle cross-domain messages between L1 and L2. - -Simply create the object: - -```js file=/public/tutorials/sdk-stack.js#L18-L39 hash=216bd2437a5893704acfad2c768b9544 -``` - -Note that you've passed in the RPC providers you created earlier, the addresses of the smart contracts you deployed, and the chain ID of your OP Stack chain. - -## Next steps - -You can now use the SDK to interact with your OP Stack chain just like you would with other chains like OP Mainnet. -See existing tutorials, like the tutorial on [Bridging ETH With the Optimism SDK](/builders/app-developers/tutorials/cross-dom-bridge-eth) or [Bridging ERC-20 Tokens With the Optimism SDK](/builders/app-developers/tutorials/cross-dom-bridge-erc20), for examples of how to use the Optimism SDK. diff --git a/public/_redirects b/public/_redirects index 6d137da4f..a1f267aeb 100644 --- a/public/_redirects +++ b/public/_redirects @@ -115,4 +115,5 @@ /stack/interop/superchain-erc20 /stack/interop/assets/superchain-erc20 /stack/interop/superchain-weth /stack/interop/assets/superchain-weth /stack/interop/transfer-superchainERC20 /stack/interop/assets/transfer-superchainERC20 -/builders/app-developers/contracts/superchain-erc20 /stack/interop/assets/superchain-erc20 \ No newline at end of file +/builders/app-developers/contracts/superchain-erc20 /stack/interop/assets/superchain-erc20 +/builders/chain-operators/tutorials/sdk /builders/app-developers/overview \ No newline at end of file From f93a82809f599440518b3c5bec6ecdc0d9bcc75f Mon Sep 17 00:00:00 2001 From: Bradley Camacho <42678939+bradleycamacho@users.noreply.github.com> Date: Thu, 7 Nov 2024 16:59:08 -0800 Subject: [PATCH 482/565] Add marine back Co-authored-by: soyboy <85043086+sbvegan@users.noreply.github.com> --- .github/CODEOWNERS | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index ee4dfe8c5..a418fda56 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -5,3 +5,4 @@ /pages/builders/tools/build/block-explorers.mdx @ethereum-optimism/docs-reviewers @0xmariniere /pages/builders/tools/build/oracles.mdx @ethereum-optimism/docs-reviewers @0xmariniere /pages/builders/chain-operators/features/alt-da-mode.mdx @ethereum-optimism/docs-reviewers @0xmariniere +/pages/builders/tools/build/account-abstraction.mdx @ethereum-optimism/docs-reviewers @0xmariniere From 5a38888976e0aaece6dbe8e5895092fe66f9d84e Mon Sep 17 00:00:00 2001 From: Bradley Camacho <42678939+bradleycamacho@users.noreply.github.com> Date: Thu, 7 Nov 2024 17:03:10 -0800 Subject: [PATCH 483/565] Update pages/stack/interop/superchainerc20-best-practices.mdx Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> --- pages/stack/interop/superchainerc20-best-practices.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/stack/interop/superchainerc20-best-practices.mdx b/pages/stack/interop/superchainerc20-best-practices.mdx index 925a7891b..a483ce43c 100644 --- a/pages/stack/interop/superchainerc20-best-practices.mdx +++ b/pages/stack/interop/superchainerc20-best-practices.mdx @@ -22,7 +22,7 @@ Test with production-like conditions: Deploy to staging environments that simula We recommend using [Supersim](https://supersim.pages.dev/introduction) as an easy way to simulate the Superchain and test your SuperchainERC20 deployment. -Test edge cases such as maximum balance transfers and inter-chain latency to ensure asset reliability across different scenarios. +Test edge cases such as maximum balance transfers and interchain latency to ensure asset reliability across different scenarios. ## Next steps From 456d58f64efbe2732d43ff8fdc60e7d287e543ed Mon Sep 17 00:00:00 2001 From: Bradley Camacho <42678939+bradleycamacho@users.noreply.github.com> Date: Thu, 7 Nov 2024 17:06:25 -0800 Subject: [PATCH 484/565] Various linting and nav fixes --- pages/stack/interop/_meta.json | 1 - pages/stack/interop/assets.mdx | 2 ++ pages/stack/interop/assets/_meta.json | 5 +++-- .../interop/{ => assets}/superchainerc20-best-practices.mdx | 0 words.txt | 1 + 5 files changed, 6 insertions(+), 3 deletions(-) rename pages/stack/interop/{ => assets}/superchainerc20-best-practices.mdx (100%) diff --git a/pages/stack/interop/_meta.json b/pages/stack/interop/_meta.json index 008f51298..e81485a1a 100644 --- a/pages/stack/interop/_meta.json +++ b/pages/stack/interop/_meta.json @@ -5,5 +5,4 @@ "message-passing": "Interop message passing", "op-supervisor": "OP Supervisor", "assets": "Assets", - "superchainERC20-best-practices": "SuperchainERC20 best practices" } \ No newline at end of file diff --git a/pages/stack/interop/assets.mdx b/pages/stack/interop/assets.mdx index 7aa352c94..e6aff0bd0 100644 --- a/pages/stack/interop/assets.mdx +++ b/pages/stack/interop/assets.mdx @@ -18,4 +18,6 @@ Documentation covering SuperchainERC20, Superchain WETH, Supersim, and how to tr + + diff --git a/pages/stack/interop/assets/_meta.json b/pages/stack/interop/assets/_meta.json index 9398906a4..fb51b47ae 100644 --- a/pages/stack/interop/assets/_meta.json +++ b/pages/stack/interop/assets/_meta.json @@ -1,6 +1,7 @@ { "superchain-erc20": "SuperchainERC20", - "superchain-weth": "SuperchainWETH (Interoperable ETH)", "transfer-superchainERC20": "How to transfer a SuperchainERC20", - "deploy-superchain-erc20": "Deploy assets using SuperchainERC20" + "deploy-superchain-erc20": "Deploy assets using SuperchainERC20", + "superchainERC20-best-practices": "SuperchainERC20 best practices", + "superchain-weth": "SuperchainWETH (Interoperable ETH)" } \ No newline at end of file diff --git a/pages/stack/interop/superchainerc20-best-practices.mdx b/pages/stack/interop/assets/superchainerc20-best-practices.mdx similarity index 100% rename from pages/stack/interop/superchainerc20-best-practices.mdx rename to pages/stack/interop/assets/superchainerc20-best-practices.mdx diff --git a/words.txt b/words.txt index d61dc00ba..9b508946d 100644 --- a/words.txt +++ b/words.txt @@ -409,3 +409,4 @@ ZKPs ZKVM Zora zora +interchain \ No newline at end of file From d158eb8568bd76fb64ad36af6944970cfa100171 Mon Sep 17 00:00:00 2001 From: Bradley Camacho <42678939+bradleycamacho@users.noreply.github.com> Date: Thu, 7 Nov 2024 17:14:11 -0800 Subject: [PATCH 485/565] Fix subcategory title --- pages/stack/interop/assets.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/stack/interop/assets.mdx b/pages/stack/interop/assets.mdx index e6aff0bd0..4d287b5f9 100644 --- a/pages/stack/interop/assets.mdx +++ b/pages/stack/interop/assets.mdx @@ -1,5 +1,5 @@ --- -title: Interop +title: Assets description: Documentation covering Cross Chain Message, Explainer, Message Passing, Op Supervisor, Superchain Erc20, Superchain Weth, Supersim, Transfer Superchainerc20 in the Interop section of the OP Stack ecosystem. lang: en-US --- From a8e761b309f4305a74ff0f1e7c6d9d7664523d1e Mon Sep 17 00:00:00 2001 From: Bradley Camacho <42678939+bradleycamacho@users.noreply.github.com> Date: Thu, 7 Nov 2024 17:15:28 -0800 Subject: [PATCH 486/565] Remove stray comma --- pages/stack/interop/_meta.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/stack/interop/_meta.json b/pages/stack/interop/_meta.json index e81485a1a..d42e969ce 100644 --- a/pages/stack/interop/_meta.json +++ b/pages/stack/interop/_meta.json @@ -4,5 +4,5 @@ "supersim": "Supersim Multichain Development Environment", "message-passing": "Interop message passing", "op-supervisor": "OP Supervisor", - "assets": "Assets", + "assets": "Assets" } \ No newline at end of file From 4460b899d17308636c56deaf23706c5e89f9f404 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Fri, 8 Nov 2024 14:02:30 +0100 Subject: [PATCH 487/565] Update pages/stack/transactions/transaction-finality.mdx Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> --- pages/stack/transactions/transaction-finality.mdx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pages/stack/transactions/transaction-finality.mdx b/pages/stack/transactions/transaction-finality.mdx index 3aee2cfc2..5dd7d7528 100644 --- a/pages/stack/transactions/transaction-finality.mdx +++ b/pages/stack/transactions/transaction-finality.mdx @@ -24,9 +24,9 @@ OP Stack chains in the standard configuration are Rollups that use Ethereum's co Transactions on OP Stack chains go through the following process to reach finality: 1. A user submits a transaction to the network, which forwards it to the Sequencer. -2. The Sequencer includes the transaction in a block and distributes it over a public peer-to-peer network. At this point, the transaction is considered **"unsafe"**, a technical term indicating that the transaction is in a block but its data has not yet been posted to Ethereum. This process typically takes only a few seconds. -3. The Sequencer publishes this block's data to Ethereum, either as [blob data](https://www.eip4844.com/) or as calldata attached to a standard Ethereum transaction. Once included in an Ethereum block, the transaction is considered **"safe"**. This step usually takes 5–10 minutes. -4. The Ethereum block containing the Sequencer's transaction is finalized. At this point, the transaction reaches a **"finalized"** state. Ethereum finalization typically takes about 65 Ethereum blocks, or approximately 13 minutes, but may take longer under certain network conditions. Finality depends entirely on [Ethereum's consensus mechanism](https://ethereum.org/en/developers/docs/consensus-mechanisms/pos/#finality). +2. The Sequencer includes the transaction in a block and distributes it over a public peer-to-peer network. At this point, the transaction is considered **"unsafe"**, a technical term indicating that the transaction is in a block but its data has not yet been posted to Ethereum. This process typically takes a few seconds from transaction submission. +3. The Sequencer publishes this block's data to Ethereum, either as [blob data](https://www.eip4844.com/) or as calldata attached to a standard Ethereum transaction. Once included in an Ethereum block, the transaction is considered **"safe"**. This step usually takes 5–10 minutes from transaction submission. +4. The Ethereum block containing the Sequencer's transaction is finalized. At this point, the transaction reaches a **"finalized"** state. Ethereum finalization typically takes about 2 epochs (approximately 12.8 minutes from transaction submission) under normal network conditions, but may take longer during adverse conditions. Finality depends entirely on [Ethereum's consensus mechanism](https://ethereum.org/en/developers/docs/consensus-mechanisms/pos/#finality). ```mermaid From 1ab00e8b00313d063c3080e6d28e53c04406ea4d Mon Sep 17 00:00:00 2001 From: soyboy Date: Fri, 8 Nov 2024 07:08:47 -0800 Subject: [PATCH 488/565] adding additional description sentence --- pages/stack/interop/devnet.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/stack/interop/devnet.mdx b/pages/stack/interop/devnet.mdx index df2d5bb34..871a0c41e 100644 --- a/pages/stack/interop/devnet.mdx +++ b/pages/stack/interop/devnet.mdx @@ -8,7 +8,7 @@ import { Callout, Tabs, Steps } from 'nextra/components' # Interop devnet -The Interop devnet is a temporary public network of two OP Stack Sepolia instances that supports SuperERC20 tokens, native cross-chain messaging, and cross-chain ETH transfers. This network will be deprecated once the next devnet is released. +The Interop devnet is a temporary public network of two OP Stack Sepolia instances that supports SuperERC20 tokens, native cross-chain messaging, and cross-chain ETH transfers. This network will be deprecated once the next devnet is released. As we iterate on Superchain interop, these networks will be deprecated once the next devnets are released. ## Interop devnet 0 From be4d9929b9cc47b1f4025b3e225f833e5969d815 Mon Sep 17 00:00:00 2001 From: Zain Bacchus Date: Fri, 8 Nov 2024 09:23:47 -0600 Subject: [PATCH 489/565] Update devnet.mdx Remove extranous sentence --- pages/stack/interop/devnet.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/stack/interop/devnet.mdx b/pages/stack/interop/devnet.mdx index 871a0c41e..961889fd4 100644 --- a/pages/stack/interop/devnet.mdx +++ b/pages/stack/interop/devnet.mdx @@ -8,7 +8,7 @@ import { Callout, Tabs, Steps } from 'nextra/components' # Interop devnet -The Interop devnet is a temporary public network of two OP Stack Sepolia instances that supports SuperERC20 tokens, native cross-chain messaging, and cross-chain ETH transfers. This network will be deprecated once the next devnet is released. As we iterate on Superchain interop, these networks will be deprecated once the next devnets are released. +The Interop devnet is a temporary public network of two OP Stack Sepolia instances that supports SuperERC20 tokens, native cross-chain messaging, and cross-chain ETH transfers. As we iterate on Superchain interop, these networks will be deprecated once the next devnets are released. ## Interop devnet 0 From aa42a5951ec6d32d6519c0cef631f322377cdb52 Mon Sep 17 00:00:00 2001 From: Zain Bacchus Date: Fri, 8 Nov 2024 10:43:00 -0600 Subject: [PATCH 490/565] Add Devnet callout --- pages/stack/interop/devnet.mdx | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/pages/stack/interop/devnet.mdx b/pages/stack/interop/devnet.mdx index 961889fd4..57fb41dc6 100644 --- a/pages/stack/interop/devnet.mdx +++ b/pages/stack/interop/devnet.mdx @@ -8,6 +8,11 @@ import { Callout, Tabs, Steps } from 'nextra/components' # Interop devnet + +Interop devnet is currently in active development and may experience periods of instability, including potential outages, as the networks is regularly updated and improved. Developers should expect some level of unreliability when interacting with the devnet. The devnet is intended for testing and development purposes only, and should not be relied upon for mission-critical applications. + + + The Interop devnet is a temporary public network of two OP Stack Sepolia instances that supports SuperERC20 tokens, native cross-chain messaging, and cross-chain ETH transfers. As we iterate on Superchain interop, these networks will be deprecated once the next devnets are released. ## Interop devnet 0 From e71ebd4583a820a0d7538bc13e45f01f99bf5286 Mon Sep 17 00:00:00 2001 From: Bradley Camacho <42678939+bradleycamacho@users.noreply.github.com> Date: Fri, 8 Nov 2024 09:34:04 -0800 Subject: [PATCH 491/565] Add more spacing within content --- styles/theme.css | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/styles/theme.css b/styles/theme.css index c82741b6f..1f091d7ca 100644 --- a/styles/theme.css +++ b/styles/theme.css @@ -153,11 +153,11 @@ h4 { } .nextra-content h2 ~ p { - margin-top: .3rem + margin-top: .8rem } .nextra-content h3 ~ p { - margin-top: .3rem; + margin-top: .6rem; } From b47c2db02b8c48b40980aa61782a173673951074 Mon Sep 17 00:00:00 2001 From: Bradley Camacho <42678939+bradleycamacho@users.noreply.github.com> Date: Fri, 8 Nov 2024 09:41:10 -0800 Subject: [PATCH 492/565] Fix css --- pages/stack/interop/assets/_meta.json | 2 +- styles/global.css | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pages/stack/interop/assets/_meta.json b/pages/stack/interop/assets/_meta.json index fb51b47ae..1db8c901e 100644 --- a/pages/stack/interop/assets/_meta.json +++ b/pages/stack/interop/assets/_meta.json @@ -2,6 +2,6 @@ "superchain-erc20": "SuperchainERC20", "transfer-superchainERC20": "How to transfer a SuperchainERC20", "deploy-superchain-erc20": "Deploy assets using SuperchainERC20", - "superchainERC20-best-practices": "SuperchainERC20 best practices", + "superchainerc20-best-practices": "SuperchainERC20 best practices", "superchain-weth": "SuperchainWETH (Interoperable ETH)" } \ No newline at end of file diff --git a/styles/global.css b/styles/global.css index e419354cd..4a1dcb2af 100644 --- a/styles/global.css +++ b/styles/global.css @@ -7,7 +7,7 @@ /* Override Nextra so content gets more breathing room */ .nextra-content h2 ~ p, .nextra-content h3 ~ p { - margin-top: 1rem; + margin-bottom: 1.25rem; } /* Custom div that can contain Nextra images */ From e8c9f5c6644a89f25368aabef94303cdbe897769 Mon Sep 17 00:00:00 2001 From: Zain Bacchus Date: Fri, 8 Nov 2024 11:56:50 -0600 Subject: [PATCH 493/565] Add ref to SuperchainERC20 starter kit --- pages/stack/interop/assets/deploy-superchain-erc20.mdx | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/pages/stack/interop/assets/deploy-superchain-erc20.mdx b/pages/stack/interop/assets/deploy-superchain-erc20.mdx index 0379308cb..af506e238 100644 --- a/pages/stack/interop/assets/deploy-superchain-erc20.mdx +++ b/pages/stack/interop/assets/deploy-superchain-erc20.mdx @@ -27,7 +27,7 @@ Note that bridging assets through the Superchain using `SuperchainERC20` never a * `Create2Deployer`: A smart contract that enables deploying contracts with predictable addresses. * `OptimismSuperchainERC20Factory`: A factory contract designed for L1-native tokens to ensure uniform deployments across chains. - There are [many ways to do this](https://github.com/Arachnid/deterministic-deployment-proxy), but [here's an example smart contract to start](https://github.com/ethereum-optimism/superchainerc20-starter/blob/main/packages/contracts/src/L2NativeSuperchainERC20.sol) + There are [many ways to do this](https://github.com/Arachnid/deterministic-deployment-proxy), but [here's an example smart contract to start](https://github.com/ethereum-optimism/superchainerc20-starter/blob/main/packages/contracts/src/L2NativeSuperchainERC20.sol). For an in-depth guide on how to deploy a `SuperchainERC20` use the [SuperchainERC20 Starter Kit](https://console.optimism.io/build). By deploying assets at identical addresses across multiple chains, we abstract away the complexity of cross-chain validation. @@ -44,7 +44,6 @@ Note that bridging assets through the Superchain using `SuperchainERC20` never a ## Next steps - +* Use the [SuperchainERC20 Starter Kit](https://console.optimism.io/build) to deploy your token across the Superchain * Explore the [SuperchainERC20 specifications](https://specs.optimism.io/interop/token-bridging.html) for in-depth implementation details. -* Watch the [Superchain interop design video walkthrough](https://www.youtube.com/watch?v=FKc5RgjtGes) for a visual explanation of the concepts. * Review the [Superchain Interop Explainer](explainer) for answers to common questions about interoperability. From e60d19daaae61c76454d68c173f90a878806dceb Mon Sep 17 00:00:00 2001 From: Zain Bacchus Date: Fri, 8 Nov 2024 13:45:03 -0600 Subject: [PATCH 494/565] Update devnet.mdx --- pages/stack/interop/devnet.mdx | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/pages/stack/interop/devnet.mdx b/pages/stack/interop/devnet.mdx index 57fb41dc6..bd4b7d9f9 100644 --- a/pages/stack/interop/devnet.mdx +++ b/pages/stack/interop/devnet.mdx @@ -15,29 +15,31 @@ Interop devnet is currently in active development and may experience periods of The Interop devnet is a temporary public network of two OP Stack Sepolia instances that supports SuperERC20 tokens, native cross-chain messaging, and cross-chain ETH transfers. As we iterate on Superchain interop, these networks will be deprecated once the next devnets are released. +NOTE: The current Interop devnet has been deprecated. This page will be updated once the next Interop devnet is live. + ## Interop devnet 0 | Parameter | Value | | --------------------------- | ---------------------------------------------------------------------------------------------------- | -| Network Name | `Interop Devnet 0` | -| Chain ID | `11473209` | +| Network Name | `TBA` | +| Chain ID | `TBA` | | Currency Symbol1 | ETH | -| Explorer | [https://optimism-interop-devnet-0.blockscout.com](https://optimism-interop-devnet-0.blockscout.com) | -| Public RPC URL | [https://interop-devnet-0.optimism.io](https://interop-devnet-0.optimism.io) | -| Sequencer URL | [https://interop-devnet-0.optimism.io](https://interop-devnet-0.optimism.io) | -| OptimismPortal2 | `0xb081417d0578d70eb6bee7bfa646ef8c283eb35a` | +| Explorer | 'TBA' | +| Public RPC URL | 'TBA' | +| Sequencer URL | 'TBA' | +| OptimismPortal2 | `TBD` | ## Interop devnet 1 | Parameter | Value | | --------------------------- | ---------------------------------------------------------------------------------------------------- | -| Network Name | `Interop Devnet 1` | -| Chain ID | `21473209` | +| Network Name | `TBA` | +| Chain ID | `TBA` | | Currency Symbol1 | ETH | -| Explorer | [https://optimism-interop-devnet-1.blockscout.com](https://optimism-interop-devnet-1.blockscout.com) | -| Public RPC URL | [https://interop-devnet-1.optimism.io](https://interop-devnet-1.optimism.io) | -| Sequencer URL | [https://interop-devnet-1.optimism.io](https://interop-devnet-1.optimism.io) | -| OptimismPortal2 | `0x85894f229575681130ac2f2365917cf156f8e75a` | +| Explorer | 'TBA' | +| Public RPC URL | 'TBA' | +| Sequencer URL | 'TBA' | +| OptimismPortal2 | `TBD` | 1. The "currency symbol" is required by some wallets like MetaMask. 2. The `OptimismPortal` is a low-level contract responsible for passing messages between L1 and L2. Messages sent directly to the `OptimismPortal` have no form of replayability. You can send ether directly to the portal to receive it to the sender address on the L2. From 13a836e5da3343331a03a501823d578f794ea11e Mon Sep 17 00:00:00 2001 From: cpengilly <29023967+cpengilly@users.noreply.github.com> Date: Fri, 8 Nov 2024 11:58:50 -0800 Subject: [PATCH 495/565] lint fixes --- pages/stack/interop/devnet.mdx | 42 ++++++++++++++++------------------ words.txt | 28 +++++++++-------------- 2 files changed, 31 insertions(+), 39 deletions(-) diff --git a/pages/stack/interop/devnet.mdx b/pages/stack/interop/devnet.mdx index bd4b7d9f9..3edbca365 100644 --- a/pages/stack/interop/devnet.mdx +++ b/pages/stack/interop/devnet.mdx @@ -9,37 +9,36 @@ import { Callout, Tabs, Steps } from 'nextra/components' # Interop devnet -Interop devnet is currently in active development and may experience periods of instability, including potential outages, as the networks is regularly updated and improved. Developers should expect some level of unreliability when interacting with the devnet. The devnet is intended for testing and development purposes only, and should not be relied upon for mission-critical applications. + Interop devnet is currently in active development and may experience periods of instability, including potential outages, as the networks is regularly updated and improved. Developers should expect some level of unreliability when interacting with the devnet. The devnet is intended for testing and development purposes only, and should not be relied upon for mission-critical applications. - The Interop devnet is a temporary public network of two OP Stack Sepolia instances that supports SuperERC20 tokens, native cross-chain messaging, and cross-chain ETH transfers. As we iterate on Superchain interop, these networks will be deprecated once the next devnets are released. NOTE: The current Interop devnet has been deprecated. This page will be updated once the next Interop devnet is live. ## Interop devnet 0 -| Parameter | Value | -| --------------------------- | ---------------------------------------------------------------------------------------------------- | -| Network Name | `TBA` | -| Chain ID | `TBA` | -| Currency Symbol1 | ETH | -| Explorer | 'TBA' | -| Public RPC URL | 'TBA' | -| Sequencer URL | 'TBA' | -| OptimismPortal2 | `TBD` | +| Parameter | Value | +| --------------------------- | ----- | +| Network Name | `TBA` | +| Chain ID | `TBA` | +| Currency Symbol1 | ETH | +| Explorer | 'TBA' | +| Public RPC URL | 'TBA' | +| Sequencer URL | 'TBA' | +| OptimismPortal2 | `TBD` | ## Interop devnet 1 -| Parameter | Value | -| --------------------------- | ---------------------------------------------------------------------------------------------------- | -| Network Name | `TBA` | -| Chain ID | `TBA` | -| Currency Symbol1 | ETH | -| Explorer | 'TBA' | -| Public RPC URL | 'TBA' | -| Sequencer URL | 'TBA' | -| OptimismPortal2 | `TBD` | +| Parameter | Value | +| --------------------------- | ----- | +| Network Name | `TBA` | +| Chain ID | `TBA` | +| Currency Symbol1 | ETH | +| Explorer | 'TBA' | +| Public RPC URL | 'TBA' | +| Sequencer URL | 'TBA' | +| OptimismPortal2 | `TBD` | 1. The "currency symbol" is required by some wallets like MetaMask. 2. The `OptimismPortal` is a low-level contract responsible for passing messages between L1 and L2. Messages sent directly to the `OptimismPortal` have no form of replayability. You can send ether directly to the portal to receive it to the sender address on the L2. @@ -60,8 +59,7 @@ NOTE: The current Interop devnet has been deprecated. This page will be updated It'll take approximately 2 minutes for the bridging process to complete and the ether to appear in your wallet. -## Next steps +## Next steps * Want to start with local development? Use [Supersim](/stack/interop/supersim), a local dev environment that simulates interop for testing applications against a local version of the Superchain. * Read about [interop message passing](/stack/interop/cross-chain-message) to see how you can implement it yourself on this devnet. - diff --git a/words.txt b/words.txt index 0357fed0a..f5ae76fbc 100644 --- a/words.txt +++ b/words.txt @@ -1,10 +1,3 @@ -Ankr -Immunefi -Mitigations -Pyth -Pyth's -Sepolia -voxel ACCOUNTQUEUE accountqueue ACCOUNTSLOTS @@ -17,6 +10,7 @@ Allnodes Allocs allocs ANDI +Ankr Apeworx Arweave authrpc @@ -156,12 +150,14 @@ holesky IERC IGNOREPRICE ignoreprice +Immunefi implicity Inator inator INFLUXDBV influxdbv initcode +interchain IPCDISABLE ipcdisable ipcfile @@ -204,6 +200,7 @@ minsuggestedpriorityfee Mintable Mintplex MIPSEVM +Mitigations Monitorism Moralis Mordor @@ -298,6 +295,8 @@ Proxied Proxyd proxyd pseudorandomly +Pyth +Pyth's QRNG Quicknode quicknode @@ -332,6 +331,9 @@ safedb Schnorr secp SELFDESTRUCT +SEPOLIA +Sepolia +sepolia seqnr SEQUENCERHTTP sequencerhttp @@ -363,6 +365,7 @@ Superchain superchain Superchain's Superchainerc +superchainerc Superchains Superscan Supersim @@ -401,7 +404,7 @@ VMDEBUG vmdebug VMODULE vmodule -wagmi +voxel Warpcast xlarge XORI @@ -410,12 +413,3 @@ ZKPs ZKVM Zora zora -Sepolia -SEPOLIA -Immunefi -Mitigations -Pyth's -Pyth -voxel -Ankr -interchain From 08664ea0fd13b33d63902e64c4c92cef9fc4e250 Mon Sep 17 00:00:00 2001 From: Anonim Date: Sat, 9 Nov 2024 13:16:14 +0300 Subject: [PATCH 496/565] Updated docs files with errors --- pages/chain/security/security-policy.mdx | 2 +- pages/connect/contribute/style-guide.mdx | 8 ++++---- pages/connect/resources/glossary.mdx | 4 ++-- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/pages/chain/security/security-policy.mdx b/pages/chain/security/security-policy.mdx index 85a776ff4..661a510ab 100644 --- a/pages/chain/security/security-policy.mdx +++ b/pages/chain/security/security-policy.mdx @@ -53,4 +53,4 @@ Alongside this policy, maintainers also reserve the right to: * Bypass this policy and publish details on a shorter timeline. * Directly notify a subset of downstream users prior to making a public announcement. -This policy is based the [Geth](https://geth.ethereum.org/) team's [silent patch policy](https://geth.ethereum.org/docs/developers/geth-developer/disclosures#why-silent-patches). +This policy is based on the [Geth](https://geth.ethereum.org/) team's [silent patch policy](https://geth.ethereum.org/docs/developers/geth-developer/disclosures#why-silent-patches). diff --git a/pages/connect/contribute/style-guide.mdx b/pages/connect/contribute/style-guide.mdx index dbca6be12..2149e5add 100644 --- a/pages/connect/contribute/style-guide.mdx +++ b/pages/connect/contribute/style-guide.mdx @@ -10,7 +10,7 @@ import { Callout } from 'nextra/components' This Style Guide aims to assist Optimists in writing technical content with a consistent voice, tone, and style. See the [glossary](/connect/resources/glossary) for an alphabetical listing of commonly used words, terms, and concepts used throughout the technical docs and across the OP Collective. -This doc doesn't cover all questions or use-cases. Our guide is based off the [Microsoft Writing Style Guide](https://learn.microsoft.com/en-us/style-guide/welcome/). Please reference their guide for any use-case or situation we do not cover here. +This doc doesn't cover all questions or use-cases. Our guide is based on the [Microsoft Writing Style Guide](https://learn.microsoft.com/en-us/style-guide/welcome/). Please reference their guide for any use-case or situation we do not cover here. * For docs-related questions or comments, create an issue in the [docs repo](https://github.com/ethereum-optimism/docs/issues). * For support-related questions or comments, create an issue in the [developers repo](https://github.com/ethereum-optimism/developers/issues). @@ -178,7 +178,7 @@ We aim to use consistent organization that is also user-centered and accessible. ### Listing prerequisites (before you begin) * Add a "Before You Begin" section at the top of the document if there are tasks a user needs to complete before continuing with the current task, e.g. installing a module, downloading a software update, etc. -* Use the title "Before You Begin"and format as H2. It should follow the page overview/intro section or table of contents. +* Use the title "Before You Begin" and format as H2. It should follow the page overview/intro section or table of contents. * Include all the tasks the user needs to complete, including links to aid in usability. Use a bulleted list for more than 2 prerequisite items. **Example**:
@@ -501,7 +501,7 @@ Please use `*` instead of `-` for items in a list. This maintains consistency ac ### Punctuation -* **Ampersand (&)** Only use "&"in headings where items are grouped or in proper names. Do not use in sentences. +* **Ampersand (&)** Only use "&" in headings where items are grouped or in proper names. Do not use in sentences. * **Colon (:)** Use to introduce a list or series. @@ -523,4 +523,4 @@ Please use `*` instead of `-` for items in a list. This maintains consistency ac **Example**: `developer-focused product` or `company-wide holiday` -* **Slash (/)** Avoid using as the slash is reserved for file names (see above). Use "or," "and,"or "or both"instead. +* **Slash (/)** Avoid using as the slash is reserved for file names (see above). Use "or," "and," or "both" instead. diff --git a/pages/connect/resources/glossary.mdx b/pages/connect/resources/glossary.mdx index 9261933f2..e1c411053 100644 --- a/pages/connect/resources/glossary.mdx +++ b/pages/connect/resources/glossary.mdx @@ -33,7 +33,7 @@ block, and output block properties, which are derived after executing the block' #### Block time L2 block time is 2 seconds, meaning there is an L2 block at every 2s [time slot](#time-slot). -*Post-merge*, it could be said the that L1 block time is 12s as that is the L1 [time slot](#time-slot). However, in +*Post-merge*, it could be said that L1 block time is 12s as that is the L1 [time slot](#time-slot). However, in reality the block time is variable as some time slots might be skipped. Pre-merge, the L1 block time is variable, though it is on average 13s. #### Delegation @@ -335,7 +335,7 @@ a better compression rate, hence reducing data availability costs. #### Channel Frame Chunk of data belonging to a [channel](#channel). [Batcher transactions](#batcher-transaction) carry one or -multiple frames. The reason to split a channel into frames is that a channel might too large to include in a single +multiple frames. The reason to split a channel into frames is that a channel might be too large to include in a single batcher transaction. #### Channel Timeout From d007c73d48f5729f3c2b03e34c9b685e9e263393 Mon Sep 17 00:00:00 2001 From: Noisy <125606576+donatik27@users.noreply.github.com> Date: Sun, 10 Nov 2024 12:55:22 +0100 Subject: [PATCH 497/565] Improve Grammar and Consistency in Glossary Term Template Short Description of Changes: - Corrected grammatical errors in descriptions. - Fixed spelling of "copyrighted". - Corrected possessive form from "someones" to "someone's". --- .github/ISSUE_TEMPLATE/suggest_glossary_term.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/suggest_glossary_term.yaml b/.github/ISSUE_TEMPLATE/suggest_glossary_term.yaml index 0302b4e1a..b08efa08c 100644 --- a/.github/ISSUE_TEMPLATE/suggest_glossary_term.yaml +++ b/.github/ISSUE_TEMPLATE/suggest_glossary_term.yaml @@ -18,7 +18,7 @@ body: options: - label: This is a term not already found in the glossary (for similar terms, please consider the benefits of a new term vs updating an existing term) required: true - - label: This term/definition is not a product advertisement or contain other promotional content + - label: This term/definition is not a product advertisement and does not contain other promotional content required: true - label: This term/definition is directly relevant to Optimism required: true @@ -39,7 +39,7 @@ body: - type: textarea id: glossary_term_sources attributes: - label: Sources, if any (please do not submit copywrited content without appropriate approval) + label: Sources, if any (please do not submit copyrighted content without appropriate approval) description: Please list any sources utilized validations: required: false @@ -47,7 +47,7 @@ body: id: glossary_terms_optimismdotio_links attributes: label: Optimism.io links - description: If appropriate/available, please suggest an internal optimism.io link that would expand someones learning of this term + description: If appropriate/available, please suggest an internal optimism.io link that would expand someone's learning of this term - type: textarea id: glossary_term_additional_context attributes: From 0854328ba1b703ee449b3c7344bcb2e7ad4a2b82 Mon Sep 17 00:00:00 2001 From: Noisy <125606576+donatik27@users.noreply.github.com> Date: Sun, 10 Nov 2024 13:01:22 +0100 Subject: [PATCH 498/565] Update suggest_tutorial.yaml --- .github/ISSUE_TEMPLATE/suggest_tutorial.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/ISSUE_TEMPLATE/suggest_tutorial.yaml b/.github/ISSUE_TEMPLATE/suggest_tutorial.yaml index f8259e873..890af9b74 100644 --- a/.github/ISSUE_TEMPLATE/suggest_tutorial.yaml +++ b/.github/ISSUE_TEMPLATE/suggest_tutorial.yaml @@ -22,7 +22,7 @@ body: id: tutorial_description attributes: label: Tutorial description - description: Summarize what the user should be able to accomplish by following tutorial + description: Summarize what the user should be able to accomplish by following the tutorial validations: required: true - type: input From 8c2a4b87965f866c99d4a2fbfe434d5b996ebf2a Mon Sep 17 00:00:00 2001 From: Zain Bacchus Date: Mon, 11 Nov 2024 16:53:46 +0900 Subject: [PATCH 499/565] Update cross-chain-message.mdx Added context of being able to interop w/itself. eg interop works for uni->opm, opm->uni, but also opm->opm, uni->uni, etc. --- pages/stack/interop/cross-chain-message.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/stack/interop/cross-chain-message.mdx b/pages/stack/interop/cross-chain-message.mdx index 3d7d8d406..596ce5141 100644 --- a/pages/stack/interop/cross-chain-message.mdx +++ b/pages/stack/interop/cross-chain-message.mdx @@ -9,7 +9,7 @@ import Image from 'next/image' # Anatomy of a cross-chain message -A cross-chain message applies to any message sent across a chain. This applies to asset transfers using the [SuperchainERC20](superchain-erc20) token standard. +A cross-chain message applies to any message sent using Superchain interop - this includes sending across chains within an interop cluster but also chains interopping with itself. This functionality applies to asset transfers using the [SuperchainERC20](superchain-erc20) token standard. ## How it works From 5c31460bc26adafe01a05a4734456f361a2c70cb Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Mon, 11 Nov 2024 12:20:05 +0100 Subject: [PATCH 500/565] fix lint warning --- words.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/words.txt b/words.txt index f5ae76fbc..4fdf79dc5 100644 --- a/words.txt +++ b/words.txt @@ -158,6 +158,7 @@ INFLUXDBV influxdbv initcode interchain +interopping IPCDISABLE ipcdisable ipcfile From 646ff462718baa73b3ac139708e8f155c68c3f38 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Mon, 11 Nov 2024 12:22:52 +0100 Subject: [PATCH 501/565] Update pages/stack/interop/cross-chain-message.mdx Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> --- pages/stack/interop/cross-chain-message.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/stack/interop/cross-chain-message.mdx b/pages/stack/interop/cross-chain-message.mdx index 596ce5141..3352c5b17 100644 --- a/pages/stack/interop/cross-chain-message.mdx +++ b/pages/stack/interop/cross-chain-message.mdx @@ -9,7 +9,7 @@ import Image from 'next/image' # Anatomy of a cross-chain message -A cross-chain message applies to any message sent using Superchain interop - this includes sending across chains within an interop cluster but also chains interopping with itself. This functionality applies to asset transfers using the [SuperchainERC20](superchain-erc20) token standard. +A cross-chain message applies to any message sent using Superchain interop - this includes sending across chains within an interop cluster, but also chains interoperating with themselves. This functionality applies to asset transfers using the [SuperchainERC20](superchain-erc20) token standard. ## How it works From 119cb98c95917265ab4326a8b7857d84cc5bcc42 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Mon, 11 Nov 2024 12:23:27 +0100 Subject: [PATCH 502/565] remove word --- words.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/words.txt b/words.txt index 4fdf79dc5..f5ae76fbc 100644 --- a/words.txt +++ b/words.txt @@ -158,7 +158,6 @@ INFLUXDBV influxdbv initcode interchain -interopping IPCDISABLE ipcdisable ipcfile From 5ef1c728bf212931ba9b65c1da3303c5cf36a33f Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Mon, 11 Nov 2024 12:32:10 +0100 Subject: [PATCH 503/565] updated text --- pages/stack/interop/cross-chain-message.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/stack/interop/cross-chain-message.mdx b/pages/stack/interop/cross-chain-message.mdx index 3352c5b17..708d23cd3 100644 --- a/pages/stack/interop/cross-chain-message.mdx +++ b/pages/stack/interop/cross-chain-message.mdx @@ -9,7 +9,7 @@ import Image from 'next/image' # Anatomy of a cross-chain message -A cross-chain message applies to any message sent using Superchain interop - this includes sending across chains within an interop cluster, but also chains interoperating with themselves. This functionality applies to asset transfers using the [SuperchainERC20](superchain-erc20) token standard. +A cross-chain message refers to any communication sent using Superchain interop. This includes messages sent between different chains within an interop cluster, as well as messages sent on a single chain for interoperable functionality. This capability enables asset transfers that utilize the [SuperchainERC20](superchain-erc20) token standard. ## How it works From 89e6546e18d2f1a17c642476c15fbb8e3e66033b Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Mon, 11 Nov 2024 12:33:20 +0100 Subject: [PATCH 504/565] improved word --- pages/stack/interop/cross-chain-message.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/stack/interop/cross-chain-message.mdx b/pages/stack/interop/cross-chain-message.mdx index 708d23cd3..bd201b6e5 100644 --- a/pages/stack/interop/cross-chain-message.mdx +++ b/pages/stack/interop/cross-chain-message.mdx @@ -9,7 +9,7 @@ import Image from 'next/image' # Anatomy of a cross-chain message -A cross-chain message refers to any communication sent using Superchain interop. This includes messages sent between different chains within an interop cluster, as well as messages sent on a single chain for interoperable functionality. This capability enables asset transfers that utilize the [SuperchainERC20](superchain-erc20) token standard. +A cross-chain message refers to any communication sent using Superchain interop. This includes messages sent between different chains within an interop cluster, as well as messages sent on a single chain for interoperable. This functionality enables asset transfers that utilize the [SuperchainERC20](superchain-erc20) token standard. ## How it works From 4239878d6555ff12307c481025659e469445e1a9 Mon Sep 17 00:00:00 2001 From: soyboy Date: Tue, 12 Nov 2024 17:59:31 +0700 Subject: [PATCH 505/565] holocene notice draft --- pages/builders/notices/_meta.json | 1 + pages/builders/notices/holocene-changes.mdx | 77 +++++++++++++++++++++ 2 files changed, 78 insertions(+) create mode 100644 pages/builders/notices/holocene-changes.mdx diff --git a/pages/builders/notices/_meta.json b/pages/builders/notices/_meta.json index f75d9972e..4b21e6372 100644 --- a/pages/builders/notices/_meta.json +++ b/pages/builders/notices/_meta.json @@ -1,3 +1,4 @@ { + "holocene-changes": "Preparing for Holocene breaking changes", "sdk-deprecation": "Preparing for Optimism SDK deprecation" } diff --git a/pages/builders/notices/holocene-changes.mdx b/pages/builders/notices/holocene-changes.mdx new file mode 100644 index 000000000..639296f52 --- /dev/null +++ b/pages/builders/notices/holocene-changes.mdx @@ -0,0 +1,77 @@ +--- +title: Preparing for Holocene Breaking Changes +lang: en-US +description: Learn how to prepare for Holocene upgrade breaking changes. +--- + +import { Steps, Callout } from 'nextra/components' + +# Preparing for Holocene breaking changes + +This page outlines breaking changes related to the Holocene network upgrade for chain operators, and node operators. +If you experience difficulty at any stage of this process, please reach out to [developer support](https://github.com/ethereum-optimism/developers/discussions). + + +The Holocene upgrade for the Sepolia Superchain will be activated at **Tue Nov 26 at 15:00:00 UTC (unix timestamp** `1732633200`). + +The Holocene upgrade for the Mainnet Superchain is planned to happen on **Thu 9 Jan 2025 18:00:01 UTC**, [governance proposal link to be added](). + + +## What's Included in Holocene + +Holocene contains two changes: + +- **Holocene block derivation**: a set of changes that render the derivation pipeline stricter and simpler, improving worst-case scenarios for Fault Proofs and Interoperability. +- **EIP-1559 configurability**: The elasticity and denominator EIP-1559 parameters become configurable via the `SystemConfig` L1 contract, allowing the gas target and gas limit to be configured independently. + + For more information on the Holocene implementation details, please review [Holocene specification](https://specs.optimism.io/protocol/holocene/overview.html). + +## For Chain Operators + +Since the Holocene upgrade changes the execution and derivation rules, all chain and node operators, as for all hardforks, have to upgrade their nodes ahead of the activation times to a release that contains the Holocene changes and has the activation times for their chains baked in, or set the activation times manually via overrides, see below. + +Besides this, chain operators must upgrade their chain’s `SystemConfig` to the latest OP Contracts [v1.8.0-rc.1 release](https://github.com/ethereum-optimism/optimism/releases/tag/op-contracts%2Fv1.8.0-rc.1). The updated `SystemConfig` implementations are deployed at addresses + +- Sepolia: TBD +- Mainnet: TBD + +Chain operators need to update their proxy contracts to point to these new implementations. The following upgrade script can be used to facilitate the upgrade: https://github.com/ethereum-optimism/optimism/pull/12878 + + +### For fault proof enabled chains + + + +## For node operators + +Node operators will need to upgrade to a Holocene release before the activation date. For Sepolia, the op-node release [FIND CORRECT VERSION](todo: add link) and op-geth release [FIND CORRECT VERSION](todo: add link) contain these changes. + +These following steps are necessary for every node operator: + + + ### Update to the latest release + + * [`op-geth`](FIND_CORRECT_LINK) + * [`op-node`](FIND_CORRECT_LINK) + + ### Configure the Holocene activation date + + + If you are operating a node for an OP Chain that have opted into the [hardfork activation inheritance behavior](https://github.com/ethereum-optimism/superchain-registry/blob/main/docs/hardfork-activation-inheritance.md), the Holocene activation date is part of the `op-node` and `op-geth` nodes. So, no action is needed for the sequencer after upgrading to the latest release. Please skip to [Step 3: Verify Your Configuration](#verify-your-configuration). + + For Sepolia that is: `OP Sepolia`, `Base Sepolia`, `Mode Sepolia`, and `Zora Sepolia`. + + + For node operators of not included in the [hardfork activation inheritance behavior](https://github.com/ethereum-optimism/superchain-registry/blob/main/docs/hardfork-activation-inheritance.md), you will need to manually configure the [activation timestamp](https://github.com/ethereum-optimism/superchain-registry/blob/main/superchain/configs/mainnet/superchain.toml). This can be done one of two ways: + + * **Option 1:** Set the activation time in the `rollup.json` for `op-node`. You will still need to set the `override.granite` flag in `op-geth` if you use this option. + * **Option 2:** Set the activation time via overrides (CLI) in both `op-node` and `op-geth`. These will need to be set on `op-node` and `op-geth` for the sequencer and all other nodes. + + ### Verify Your Configuration + + Make the following checks to verify that your node is properly configured. + + * `op-node` and `op-geth` will log their configurations at startup + * Check that the Granite time is set to `activation-timestamp` in the op-node startup logs + * Check that the Granite time is set to `activation-timestamp` in the op-geth startup logs + \ No newline at end of file From a7c91339a4f0d0a9f970d2799bb298718afa30b8 Mon Sep 17 00:00:00 2001 From: Dmitry <98899785+mdqst@users.noreply.github.com> Date: Tue, 12 Nov 2024 15:17:20 +0300 Subject: [PATCH 506/565] Typo Update CONTRIBUTING.md The missing space between the quotation marks and the word "button". --- CONTRIBUTING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 26bf56263..b7e4cd152 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -73,7 +73,7 @@ To submit your contribution for review: 1. Create a new [pull request on GitHub](https://github.com/ethereum-optimism/docs/issues/new/choose). 2. Select a PR type from the list or choose **Open a blank issue** at the bottom of the page. 3. Complete the form as requested. For blank PR issues, please provide a clear title and accurate description/context. -4. Click the "Create pull request"button to create the pull request effectively. +4. Click the "Create pull request" button to create the pull request effectively. >If your pull request is not ready for review yet, choose the "[Create draft pull request](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/creating-a-pull-request)"in the dropdown. The Optimism documentation team will review your pull request only when you mark it as "[Ready for review](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/changing-the-stage-of-a-pull-request)". From dd75a38b927221d9a37ae87b11b3da287aa39f33 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Tue, 12 Nov 2024 15:49:44 +0100 Subject: [PATCH 507/565] replace the SDK link with viem --- .../app-developers/bridging/basics.mdx | 4 ++-- .../bridging/standard-bridge.mdx | 4 ++-- pages/builders/app-developers/overview.mdx | 22 +++++++++---------- pages/builders/app-developers/tutorials.mdx | 6 ++--- .../app-developers/tutorials/_meta.json | 4 ++-- .../standard-bridge-custom-token.mdx | 2 +- .../standard-bridge-standard-token.mdx | 2 +- pages/builders/chain-operators/tutorials.mdx | 4 ++-- pages/builders/tools/overview.mdx | 2 +- pages/connect/contribute/style-guide.mdx | 22 +++++++++---------- 10 files changed, 36 insertions(+), 36 deletions(-) diff --git a/pages/builders/app-developers/bridging/basics.mdx b/pages/builders/app-developers/bridging/basics.mdx index 0af641177..f2085f5fe 100644 --- a/pages/builders/app-developers/bridging/basics.mdx +++ b/pages/builders/app-developers/bridging/basics.mdx @@ -28,7 +28,7 @@ All of this is easily accessible with a simple, clean API. Ready to start bridging? Check out these tutorials to get up to speed fast. -* [Learn how to bridge ERC-20 tokens with the Optimism SDK](/builders/app-developers/tutorials/cross-dom-bridge-erc20) -* [Learn how to bridge ETH with the Optimism SDK](/builders/app-developers/tutorials/cross-dom-bridge-eth) +* [Learn how to bridge ERC-20 tokens with viem](/builders/app-developers/tutorials/cross-dom-bridge-erc20) +* [Learn how to bridge ETH with viem](/builders/app-developers/tutorials/cross-dom-bridge-eth) * [Learn how to create a standard bridged token](/builders/app-developers/tutorials/standard-bridge-standard-token) * [Learn how to create a custom bridged token](/builders/app-developers/tutorials/standard-bridge-custom-token) diff --git a/pages/builders/app-developers/bridging/standard-bridge.mdx b/pages/builders/app-developers/bridging/standard-bridge.mdx index 2d137d6ad..73eb844d6 100644 --- a/pages/builders/app-developers/bridging/standard-bridge.mdx +++ b/pages/builders/app-developers/bridging/standard-bridge.mdx @@ -199,8 +199,8 @@ Users simply need to trigger and send ETH to the [`bridgeETH`](https://github.co ## Tutorials -* [Learn how to bridge ERC-20 tokens with the Optimism SDK](/builders/app-developers/tutorials/cross-dom-bridge-erc20) -* [Learn how to bridge ETH with the Optimism SDK](/builders/app-developers/tutorials/cross-dom-bridge-eth) +* [Learn how to bridge ERC-20 tokens with viem](/builders/app-developers/tutorials/cross-dom-bridge-erc20) +* [Learn how to bridge ETH with viem](/builders/app-developers/tutorials/cross-dom-bridge-eth) * [Learn how to create a standard bridged token](/builders/app-developers/tutorials/standard-bridge-standard-token) * [Learn how to create a custom bridged token](/builders/app-developers/tutorials/standard-bridge-custom-token) diff --git a/pages/builders/app-developers/overview.mdx b/pages/builders/app-developers/overview.mdx index 8b6a9e1d3..21bed4d47 100644 --- a/pages/builders/app-developers/overview.mdx +++ b/pages/builders/app-developers/overview.mdx @@ -51,17 +51,17 @@ The Standard Token Bridge for OP Mainnet even uses this same message-passing inf If you're a bit more familiar with OP Mainnet and Ethereum, you can try walking through one of the tutorials put together by the Optimism community. They'll help you get a head start when building your first Optimistic project. -| Tutorial Name | Description | Difficulty Level | -| --------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------- | ---------------- | -| [Deploying Your First Contract on OP Mainnet](tutorials/first-contract) | Learn how to deploy your first contract to OP Mainnet with Remix and MetaMask. | 🟢 Easy | -| [Bridging ETH With the Optimism SDK](tutorials/cross-dom-bridge-eth) | Learn how to use the Optimism SDK to transfer ETH between Layer 1 (Ethereum or Sepolia) and Layer 2 (OP Mainnet or OP Sepolia). | 🟢 Easy | -| [Bridging ERC-20 Tokens With the Optimism SDK](tutorials/cross-dom-bridge-erc20) | Learn how to use the Optimism SDK to transfer ERC-20 tokens between Layer 1 (Ethereum or Sepolia) and Layer 2 (OP Mainnet or OP Sepolia). | 🟢 Easy | -| [Bridging your Standard ERC-20 token using the Standard Bridge](tutorials/standard-bridge-standard-token) | Learn how to bridge your standard ERC-20 token to layer 2 using the standard bridge. | 🟡 Medium | -| [Bridging your Custom ERC-20 token using the Standard Bridge](tutorials/standard-bridge-custom-token) | Learn how to bridge your custom ERC-20 token to layer 2 using the standard bridge. | 🟡 Medium | -| [Tracing Deposits and Withdrawals With the Optimism SDK](tutorials/sdk-trace-txns) | Learn how to use the Optimism SDK to trace deposits and withdrawals. | 🟢 Easy | -| [Viewing Deposits and Withdrawals by Address With the Optimism SDK](tutorials/sdk-view-txns) | Learn how to use the Optimism SDK to view deposits and withdrawals by address. | 🟢 Easy | -| [Estimating Transaction Costs With the Optimism SDK](tutorials/sdk-view-txns) | Learn how to use the Optimism SDK to estimate the cost of a transaction on OP Mainnet. | 🟢 Easy | -| [Sending OP Mainnet Transactions from Ethereum](tutorials/send-tx-from-eth) | Learn how to send transactions to OP Mainnet from Ethereum. | 🟢 Easy | +| Tutorial Name | Description | Difficulty Level | +| --------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------- | ---------------- | +| [Deploying Your First Contract on OP Mainnet](tutorials/first-contract) | Learn how to deploy your first contract to OP Mainnet with Remix and MetaMask. | 🟢 Easy | +| [Bridging ETH With viem](tutorials/cross-dom-bridge-eth) | Learn how to use viem to transfer ETH between Layer 1 (Ethereum or Sepolia) and Layer 2 (OP Mainnet or OP Sepolia). | 🟢 Easy | +| [Bridging ERC-20 Tokens With viem](tutorials/cross-dom-bridge-erc20) | Learn how to use viem to transfer ERC-20 tokens between Layer 1 (Ethereum or Sepolia) and Layer 2 (OP Mainnet or OP Sepolia). | 🟢 Easy | +| [Bridging your Standard ERC-20 token using the Standard Bridge](tutorials/standard-bridge-standard-token) | Learn how to bridge your standard ERC-20 token to layer 2 using the standard bridge. | 🟡 Medium | +| [Bridging your Custom ERC-20 token using the Standard Bridge](tutorials/standard-bridge-custom-token) | Learn how to bridge your custom ERC-20 token to layer 2 using the standard bridge. | 🟡 Medium | +| [Tracing Deposits and Withdrawals with viem](tutorials/sdk-trace-txns) | Learn how to use viem to trace deposits and withdrawals. | 🟢 Easy | +| [Viewing Deposits and Withdrawals by address with viem](tutorials/sdk-view-txns) | Learn how to use viem to view deposits and withdrawals by address. | 🟢 Easy | +| [Estimating Transaction Costs With the viem](tutorials/sdk-view-txns) | Learn how to use viem to estimate the cost of a transaction on OP Mainnet. | 🟢 Easy | +| [Sending OP Mainnet Transactions from Ethereum](tutorials/send-tx-from-eth) | Learn how to send transactions to OP Mainnet from Ethereum. | 🟢 Easy | You can also [suggest a new tutorial](https://github.com/ethereum-optimism/docs/issues/new?assignees=\&labels=tutorial%2Cdocumentation%2Ccommunity-request\&projects=\&template=suggest_tutorial.yaml\&title=%5BTUTORIAL%5D+Add+PR+title) if you have something specific in mind. We'd love to grow this list! diff --git a/pages/builders/app-developers/tutorials.mdx b/pages/builders/app-developers/tutorials.mdx index 9376b72b8..76ed412fa 100644 --- a/pages/builders/app-developers/tutorials.mdx +++ b/pages/builders/app-developers/tutorials.mdx @@ -8,12 +8,12 @@ import { Card, Cards } from 'nextra/components' # Tutorials -This section provides information on bridging erc 20 tokens to op mainnet with the optimism sdk, bridging eth to op mainnet with the optimism sdk, communicating between op mainnet and ethereum in solidity, deploying your first contract on op mainnet, estimating transaction costs on op mainnet, tracing deposits and withdrawals, viewing deposits and withdrawals by address, triggering op mainnet transactions from ethereum, bridging your custom erc 20 token using the standard bridge and bridging your standard erc 20 token using the standard bridge. You'll find tutorial to help you understand and work with these topics. +This section provides information on bridging erc 20 tokens to op mainnet with viem, bridging eth to op mainnet with viem, communicating between op mainnet and ethereum in solidity, deploying your first contract on op mainnet, estimating transaction costs on op mainnet, tracing deposits and withdrawals, viewing deposits and withdrawals by address, triggering op mainnet transactions from ethereum, bridging your custom erc 20 token using the standard bridge and bridging your standard erc 20 token using the standard bridge. You'll find tutorial to help you understand and work with these topics. - + - + diff --git a/pages/builders/app-developers/tutorials/_meta.json b/pages/builders/app-developers/tutorials/_meta.json index c3a3283a0..a1f44203f 100644 --- a/pages/builders/app-developers/tutorials/_meta.json +++ b/pages/builders/app-developers/tutorials/_meta.json @@ -1,7 +1,7 @@ { "cross-dom-solidity": "Communicating between chains in Solidity", - "cross-dom-bridge-eth": "Bridging ETH with Viem", - "cross-dom-bridge-erc20": "Bridging ERC-20 tokens with the Optimism SDK", + "cross-dom-bridge-eth": "Bridging ETH with viem", + "cross-dom-bridge-erc20": "Bridging ERC-20 tokens with viem", "standard-bridge-custom-token": "Bridging your custom ERC-20 token to OP Mainnet", "standard-bridge-standard-token": "Bridging your standard ERC-20 token to OP Mainnet", "sdk-view-txns": "Viewing deposits and withdrawals by address", diff --git a/pages/builders/app-developers/tutorials/standard-bridge-custom-token.mdx b/pages/builders/app-developers/tutorials/standard-bridge-custom-token.mdx index 71eb9a639..76d5ee2ec 100644 --- a/pages/builders/app-developers/tutorials/standard-bridge-custom-token.mdx +++ b/pages/builders/app-developers/tutorials/standard-bridge-custom-token.mdx @@ -114,7 +114,7 @@ _SYMBOL: "MCL2T" ## Bridge some tokens Now that you have an L2 ERC-20 token, you can bridge some tokens from L1 to L2. -Check out the tutorial on [Bridging ERC-20 tokens with the Optimism SDK](./cross-dom-bridge-erc20) to learn how to bridge your L1 ERC-20 to L2s using the Optimism SDK. +Check out the tutorial on [Bridging ERC-20 tokens with viem](./cross-dom-bridge-erc20) to learn how to bridge your L1 ERC-20 to L2s using viem. Remember that the withdrawal step will *not* work for the token you just created! This is exactly what this tutorial was meant to demonstrate. diff --git a/pages/builders/app-developers/tutorials/standard-bridge-standard-token.mdx b/pages/builders/app-developers/tutorials/standard-bridge-standard-token.mdx index 6046bd1f7..2506176f1 100644 --- a/pages/builders/app-developers/tutorials/standard-bridge-standard-token.mdx +++ b/pages/builders/app-developers/tutorials/standard-bridge-standard-token.mdx @@ -96,7 +96,7 @@ The resulting L2 ERC-20 token address is printed to the console. ## Bridge some tokens Now that you have an L2 ERC-20 token, you can bridge some tokens from L1 to L2. -Check out the tutorial on [Bridging ERC-20 tokens with the Optimism SDK](./cross-dom-bridge-erc20) to learn how to bridge your L1 ERC-20 to L2s using the Optimism SDK. +Check out the tutorial on [Bridging ERC-20 tokens with viem](./cross-dom-bridge-erc20) to learn how to bridge your L1 ERC-20 to L2s using viem. ## Add to the Superchain Token List diff --git a/pages/builders/chain-operators/tutorials.mdx b/pages/builders/chain-operators/tutorials.mdx index 6f99a4661..e78b0bd6b 100644 --- a/pages/builders/chain-operators/tutorials.mdx +++ b/pages/builders/chain-operators/tutorials.mdx @@ -10,7 +10,7 @@ import { Card, Cards } from 'nextra/components' # Tutorials -This section provides information on adding attributes to the derivation function, adding a precompile, creating your own l2 rollup testnet, integrating a new da layer with alt da, modifying predeployed contracts and using the optimism sdk. You'll find overview, tutorial, guide to help you understand and work with these topics. +This section provides information on adding attributes to the derivation function, adding a precompile, creating your own l2 rollup testnet, integrating a new da layer with alt da, modifying predeployed contracts and using viem. You'll find overview, tutorial, guide to help you understand and work with these topics. @@ -23,5 +23,5 @@ This section provides information on adding attributes to the derivation functio - + diff --git a/pages/builders/tools/overview.mdx b/pages/builders/tools/overview.mdx index dac27f1e5..c3069e116 100644 --- a/pages/builders/tools/overview.mdx +++ b/pages/builders/tools/overview.mdx @@ -50,7 +50,7 @@ If you are already familiar with [building on OP Mainnet](/chain/getting-started } /> - } /> + } /> } /> diff --git a/pages/connect/contribute/style-guide.mdx b/pages/connect/contribute/style-guide.mdx index 2149e5add..f1ab6193d 100644 --- a/pages/connect/contribute/style-guide.mdx +++ b/pages/connect/contribute/style-guide.mdx @@ -69,7 +69,7 @@ Write in a friendly, yet professional tone. We are upbeat, knowledgeable, and ** See below for when to use title or sentence case. -* Avoid using all caps as it slows down reading comprehension. +* Avoid using all caps as it slows down reading comprehension. * Capitalize proper nouns in sentences.
**Example**: I use Visual Studio on my local machine. @@ -320,15 +320,15 @@ Developers trust that we will lead them to sites or pages related to their readi Content types help manage technical content by defining the purpose and common structure for each file type. All content types used in these technical docs have attributes or properties, as defined below. -| Document type | Purpose | Examples | -| ------------------ | ------------------------------------------------------------------------------------------------------------------ | --------------------------------------------------------------------------------------------------------- | -| Overviews | General introduction to a product or feature, provides a happy-path for readers | [Smart Contract Overview](/stack/smart-contracts) | -| Guides | Explain what things are and how they work | [Standard Bridge Guide](/builders/app-developers/bridging/standard-bridge) | -| Quick Start Guides | Briefly explain how to "minimally" get started with a product, often in 30 minutes or less | [Superchain App Quick Start](/builders/app-developers/quick-start) | -| Tutorials | Provide task-oriented guidance with step-by-step "learn by doing" instructions | [Bridging ERC-20 tokens with the Optimism SDK](/builders/app-developers/tutorials/cross-dom-bridge-erc20) | -| FAQs | Address frequently asked questions | [FAQ: OP Mainnet Security Model](/chain/security/faq) | -| Troubleshooting | List common troubleshooting scenarios and solutions | [Troubleshooting: Run a Node](/builders/node-operators/management/troubleshooting) | -| Reference | Provide deep, theoretical knowledge of the internal workings of a system, such as API endpoints and specifications | [Node and RPC Providers](/builders/tools/connect/rpc-providers) | +| Document type | Purpose | Examples | +| ------------------ | ------------------------------------------------------------------------------------------------------------------ | --------------------------------------------------------------------------------------------- | +| Overviews | General introduction to a product or feature, provides a happy-path for readers | [Smart Contract Overview](/stack/smart-contracts) | +| Guides | Explain what things are and how they work | [Standard Bridge Guide](/builders/app-developers/bridging/standard-bridge) | +| Quick Start Guides | Briefly explain how to "minimally" get started with a product, often in 30 minutes or less | [Superchain App Quick Start](/builders/app-developers/quick-start) | +| Tutorials | Provide task-oriented guidance with step-by-step "learn by doing" instructions | [Bridging ERC-20 tokens with viem](/builders/app-developers/tutorials/cross-dom-bridge-erc20) | +| FAQs | Address frequently asked questions | [FAQ: OP Mainnet Security Model](/chain/security/faq) | +| Troubleshooting | List common troubleshooting scenarios and solutions | [Troubleshooting: Run a Node](/builders/node-operators/management/troubleshooting) | +| Reference | Provide deep, theoretical knowledge of the internal workings of a system, such as API endpoints and specifications | [Node and RPC Providers](/builders/tools/connect/rpc-providers) | ### Overviews @@ -405,7 +405,7 @@ When writing tutorials or quick starts, steps should be written in parallel styl ### FAQs -Whenever possible, we should avoid using FAQs due to their lack of readability and difficulty of maintenance. +Whenever possible, we should avoid using FAQs due to their lack of readability and difficulty of maintenance. FAQs address common questions developers have/might ask about a product, feature, or service. FAQs should be written from the developer's perspective. If there are more than two steps in the answer, use a numbered list. Place FAQs onto their own separate pages, whenever possible, and link to the FAQ from within the respective guide or tutorial. From fe3e7ced4ed7da13734825acd4d89c37bd461066 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Tue, 12 Nov 2024 16:24:40 +0100 Subject: [PATCH 508/565] changes op mainnet to op stack --- pages/builders/app-developers/tutorials.mdx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pages/builders/app-developers/tutorials.mdx b/pages/builders/app-developers/tutorials.mdx index 76ed412fa..34a2f40e4 100644 --- a/pages/builders/app-developers/tutorials.mdx +++ b/pages/builders/app-developers/tutorials.mdx @@ -11,13 +11,13 @@ import { Card, Cards } from 'nextra/components' This section provides information on bridging erc 20 tokens to op mainnet with viem, bridging eth to op mainnet with viem, communicating between op mainnet and ethereum in solidity, deploying your first contract on op mainnet, estimating transaction costs on op mainnet, tracing deposits and withdrawals, viewing deposits and withdrawals by address, triggering op mainnet transactions from ethereum, bridging your custom erc 20 token using the standard bridge and bridging your standard erc 20 token using the standard bridge. You'll find tutorial to help you understand and work with these topics. - + - + - + From 2e2485738f4630b9fddd2d3a161ee6e2c64dfd47 Mon Sep 17 00:00:00 2001 From: Zain Bacchus Date: Wed, 13 Nov 2024 14:56:34 +0700 Subject: [PATCH 509/565] Clean up explainer Add context of mesh cluster --- pages/stack/interop/explainer.mdx | 28 +++++++++++++++++----------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/pages/stack/interop/explainer.mdx b/pages/stack/interop/explainer.mdx index 09611d7e5..c83be6aa2 100644 --- a/pages/stack/interop/explainer.mdx +++ b/pages/stack/interop/explainer.mdx @@ -14,12 +14,11 @@ import { InteropCallout } from '@/components/WipCallout' # Interoperability explainer Interoperability is the ability for a blockchain to securely read the state of another blockchain. -Native OP Stack interoperability provides the ability to read messages and transfer assets across the Superchain (without having to go through L1) via secure message passing. This results in the following benefits: -* fungible and portable assets and liquidity -* lower fees and lower latency -* less fragmentation across the Superchain +Native OP Stack interoperability provides the ability to read messages and transfer assets across the Superchain (without having to go through L1) via low-latency, secure message passing. This results in the following benefits: +* 1-block latency asset movement movement that is both maximally capital efficient and non-fragmenting * improved user experience for developers on the Superchain * secure transfer of ETH and ERC-20s across L2s +* horizontally scalable applications ## Secure message passing Superchain interop includes both the protocol layer message passing and the Superchain ERC20 token specification. @@ -30,15 +29,18 @@ Superchain interop includes both the protocol layer message passing and the Supe This means ETH and ERC-20s can seamlessly and securely move across L2s, and intent-based protocols (i.e., bridges) can build better experiences on top of the message passing protocol. ## Low latency -Interoperability allows for horizontally scalable blockchains, a key feature of the Superchain. With Superchain interop, latency can be low (~2 seconds) by optimistically accepting cross-chain messages. -The fork choice rule enforces eventual consistency, meaning that if an invalid cross-chain message is accepted, it will be reorganized out eventually. -The fault proof guarantees that all of the cross-chain messages are accounted for from the perspective of handling withdrawals through the bridge to L1. +Interoperability allows for horizontally scalable blockchains, a key feature of the Superchain. With Superchain interop, latency can be 1-block (~2 seconds) by optimistically accepting cross-chain messages. -## Permissionless chain set -It is permissionless to define a dependency on a chain, so chain operators will be able to choose which chains their chains depend on, and it is not a requirement that chains are in each other's dependency set. -Chain operators can add or remove chains from the dependency set through the `SystemConfig`. For example, the dependency set for OP Mainnet is managed by Optimism Governance. +## Permisonless dependency set +The interop protocol works via a dependency set which is configured on a per chain basis and is a unidirectional relationship that defines the set of chains that a chain will accept incoming messages from. + +This gives the OP Stack an unopinionated and flexible foundation so chain operators are able to choose which chains their chains depend on, and it is not a requirement that chains are in each other's dependency set. + +## Superchain interop cluster +The Superchain builds ontop of the interop protocol and implements a single mesh network with complete dependencies. In this model, each blockchain in the Superchain interop cluster would have direct connections to every other blockchain, creating a fully connected mesh network. This provides the highest level of interoperability, as any blockchain can transact directly with any other. + +Each blockchain that is part of the Superchain interop cluster will have the same security model to mitigate the weakest-link scenario and will be managed by Optimism Governance. -However, since the nature of defining a dependency is one way, it is impossible for a chain to know of all of the other chains that depend on it. ## New predeploys @@ -108,6 +110,9 @@ See this [dune dashboard](https://dune.com/oplabspbc/op-stack-chains-l1-activity ### What is stopping a sequencer from censoring a cross-chain message? There is nothing stopping a sequencer from censoring a transaction when it is sent directly to the sequencer. This does not mean the network has no censorship resistance, users can always send a deposit transaction for censorship resistance as strong as L1 guarantees. The tradeoff here is the latency, instead of being confirmed in ~2 seconds, the transaction can be confirmed at the rate of L1 block production. It may be possible to adopt something like [EIP-7547](https://eips.ethereum.org/EIPS/eip-7547) in the future to enable low latency censorship resistance. +### What is the weakest link scenario? +Without shared security the concern is that interoperating chains both change their state due to some cross-chain interaction, but a weak chain is attacked / reorged, and that would leave the interop cluster in a conflicting state. This means the security around interactions between two or more chains is as weak as the weakest chain. + ### Are callback style transactions possible? If two blocks are being built at the same time with shared knowledge of their contents, it is possible to build blocks where a transaction calls to another chain, does compute and then a transaction calls back with the results. This requires no protocol level changes, it just requires more sophisticated block builder infrastructure. @@ -121,3 +126,4 @@ Sequencers only have to trust each other, if they are accepting executing messag Chains that have non-fungible blockspace are chains that have different features - it could be that they use Plasma for data availability, a custom gas paying token or have a large execution gas limit. As long as the chain can be fault proven, it can work with Superchain interoperability. At the application layer, it is important for chains to have legibility into the type of chain that the message originated from. This ensures that applications do not accept messages from chains they consider not secure enough. See this [discussion](https://github.com/ethereum-optimism/specs/issues/121) for additional thoughts. When it comes to chains that have different gas limits that are interoperable, it creates a set of transactions that can execute on one chain but not the other. This happens when the transaction consumes more than the gas limit of the smaller chain but less than of the bigger chain. At 2024 usages levels, these sorts of transactions are very rare. In the future, it may be the case that these transactions become more common, it will be up to the chain operators to ensure quality of service for their users. + From 9760ff695b5099b56496f7b60b0df08d07aaf5ef Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Wed, 13 Nov 2024 09:09:38 +0100 Subject: [PATCH 510/565] remove duplicate Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> --- pages/stack/interop/explainer.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/stack/interop/explainer.mdx b/pages/stack/interop/explainer.mdx index c83be6aa2..1bd8b598c 100644 --- a/pages/stack/interop/explainer.mdx +++ b/pages/stack/interop/explainer.mdx @@ -15,7 +15,7 @@ import { InteropCallout } from '@/components/WipCallout' Interoperability is the ability for a blockchain to securely read the state of another blockchain. Native OP Stack interoperability provides the ability to read messages and transfer assets across the Superchain (without having to go through L1) via low-latency, secure message passing. This results in the following benefits: -* 1-block latency asset movement movement that is both maximally capital efficient and non-fragmenting +* 1-block latency asset movement that is both maximally capital efficient and non-fragmenting * improved user experience for developers on the Superchain * secure transfer of ETH and ERC-20s across L2s * horizontally scalable applications From da26f0604d9884d382fdbe427cd265d2ead838da Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Wed, 13 Nov 2024 09:10:01 +0100 Subject: [PATCH 511/565] correct spelling Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> --- pages/stack/interop/explainer.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/stack/interop/explainer.mdx b/pages/stack/interop/explainer.mdx index 1bd8b598c..22a523034 100644 --- a/pages/stack/interop/explainer.mdx +++ b/pages/stack/interop/explainer.mdx @@ -31,7 +31,7 @@ This means ETH and ERC-20s can seamlessly and securely move across L2s, and inte ## Low latency Interoperability allows for horizontally scalable blockchains, a key feature of the Superchain. With Superchain interop, latency can be 1-block (~2 seconds) by optimistically accepting cross-chain messages. -## Permisonless dependency set +## Permissionless dependency set The interop protocol works via a dependency set which is configured on a per chain basis and is a unidirectional relationship that defines the set of chains that a chain will accept incoming messages from. This gives the OP Stack an unopinionated and flexible foundation so chain operators are able to choose which chains their chains depend on, and it is not a requirement that chains are in each other's dependency set. From 0f493381ad4e45efc8deaac3de04b5a84a6ac178 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Wed, 13 Nov 2024 09:10:55 +0100 Subject: [PATCH 512/565] fix spacing Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> --- pages/stack/interop/explainer.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/stack/interop/explainer.mdx b/pages/stack/interop/explainer.mdx index 22a523034..38e1aec5e 100644 --- a/pages/stack/interop/explainer.mdx +++ b/pages/stack/interop/explainer.mdx @@ -37,7 +37,7 @@ The interop protocol works via a dependency set which is configured on a per cha This gives the OP Stack an unopinionated and flexible foundation so chain operators are able to choose which chains their chains depend on, and it is not a requirement that chains are in each other's dependency set. ## Superchain interop cluster -The Superchain builds ontop of the interop protocol and implements a single mesh network with complete dependencies. In this model, each blockchain in the Superchain interop cluster would have direct connections to every other blockchain, creating a fully connected mesh network. This provides the highest level of interoperability, as any blockchain can transact directly with any other. +The Superchain builds on top of the interop protocol and implements a single mesh network with complete dependencies. In this model, each blockchain in the Superchain interop cluster would have direct connections to every other blockchain, creating a fully connected mesh network. This provides the highest level of interoperability, as any blockchain can transact directly with any other. Each blockchain that is part of the Superchain interop cluster will have the same security model to mitigate the weakest-link scenario and will be managed by Optimism Governance. From 47d403d35c1f976a0a63f29fa043f29d1d1b527d Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Wed, 13 Nov 2024 09:11:54 +0100 Subject: [PATCH 513/565] improve text Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> --- pages/stack/interop/explainer.mdx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pages/stack/interop/explainer.mdx b/pages/stack/interop/explainer.mdx index 38e1aec5e..4d024f1b8 100644 --- a/pages/stack/interop/explainer.mdx +++ b/pages/stack/interop/explainer.mdx @@ -32,9 +32,9 @@ This means ETH and ERC-20s can seamlessly and securely move across L2s, and inte Interoperability allows for horizontally scalable blockchains, a key feature of the Superchain. With Superchain interop, latency can be 1-block (~2 seconds) by optimistically accepting cross-chain messages. ## Permissionless dependency set -The interop protocol works via a dependency set which is configured on a per chain basis and is a unidirectional relationship that defines the set of chains that a chain will accept incoming messages from. +The interop protocol works via a dependency set which is configured on a per-chain basis and is a unidirectional relationship that defines the set of chains that a chain will accept incoming messages from. -This gives the OP Stack an unopinionated and flexible foundation so chain operators are able to choose which chains their chains depend on, and it is not a requirement that chains are in each other's dependency set. +This gives the OP Stack an unopinionated and flexible foundation, so chain operators can choose which chains their chains depend on, and it is not a requirement that chains are in each other's dependency set. ## Superchain interop cluster The Superchain builds on top of the interop protocol and implements a single mesh network with complete dependencies. In this model, each blockchain in the Superchain interop cluster would have direct connections to every other blockchain, creating a fully connected mesh network. This provides the highest level of interoperability, as any blockchain can transact directly with any other. From d031336b67febc4619f52f8c07869470dfce02ab Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Wed, 13 Nov 2024 09:12:35 +0100 Subject: [PATCH 514/565] improve text --- pages/stack/interop/explainer.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/stack/interop/explainer.mdx b/pages/stack/interop/explainer.mdx index 4d024f1b8..b9670c875 100644 --- a/pages/stack/interop/explainer.mdx +++ b/pages/stack/interop/explainer.mdx @@ -32,7 +32,7 @@ This means ETH and ERC-20s can seamlessly and securely move across L2s, and inte Interoperability allows for horizontally scalable blockchains, a key feature of the Superchain. With Superchain interop, latency can be 1-block (~2 seconds) by optimistically accepting cross-chain messages. ## Permissionless dependency set -The interop protocol works via a dependency set which is configured on a per-chain basis and is a unidirectional relationship that defines the set of chains that a chain will accept incoming messages from. +The interop protocol works via a dependency set which is configured on a per chain basis and is a unidirectional relationship that defines the set of chains that a chain will accept incoming messages from. This gives the OP Stack an unopinionated and flexible foundation, so chain operators can choose which chains their chains depend on, and it is not a requirement that chains are in each other's dependency set. From e13361f30019ae5a8acf9ae590d75b195b06c0d9 Mon Sep 17 00:00:00 2001 From: Zain Bacchus Date: Wed, 13 Nov 2024 15:20:31 +0700 Subject: [PATCH 515/565] Update explainer.mdx --- pages/stack/interop/explainer.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/stack/interop/explainer.mdx b/pages/stack/interop/explainer.mdx index b9670c875..e2972f0e0 100644 --- a/pages/stack/interop/explainer.mdx +++ b/pages/stack/interop/explainer.mdx @@ -37,7 +37,7 @@ The interop protocol works via a dependency set which is configured on a per cha This gives the OP Stack an unopinionated and flexible foundation, so chain operators can choose which chains their chains depend on, and it is not a requirement that chains are in each other's dependency set. ## Superchain interop cluster -The Superchain builds on top of the interop protocol and implements a single mesh network with complete dependencies. In this model, each blockchain in the Superchain interop cluster would have direct connections to every other blockchain, creating a fully connected mesh network. This provides the highest level of interoperability, as any blockchain can transact directly with any other. +The Superchain builds on top of the interop protocol and implements a single mesh network with complete dependencies. In this model, each blockchain in the Superchain interop cluster would have direct connections to every other blockchain, creating a fully connected mesh network. Compared to a hub and spoke model, this provides the highest level of interoperability, as any blockchain can transact directly with any other. Each blockchain that is part of the Superchain interop cluster will have the same security model to mitigate the weakest-link scenario and will be managed by Optimism Governance. From ccf8a52a62a385d7c2485745c57f38b00756f9c6 Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Wed, 13 Nov 2024 10:05:54 +0100 Subject: [PATCH 516/565] reworded for clarity --- pages/stack/interop/explainer.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/stack/interop/explainer.mdx b/pages/stack/interop/explainer.mdx index e2972f0e0..26bec6db5 100644 --- a/pages/stack/interop/explainer.mdx +++ b/pages/stack/interop/explainer.mdx @@ -111,7 +111,7 @@ See this [dune dashboard](https://dune.com/oplabspbc/op-stack-chains-l1-activity There is nothing stopping a sequencer from censoring a transaction when it is sent directly to the sequencer. This does not mean the network has no censorship resistance, users can always send a deposit transaction for censorship resistance as strong as L1 guarantees. The tradeoff here is the latency, instead of being confirmed in ~2 seconds, the transaction can be confirmed at the rate of L1 block production. It may be possible to adopt something like [EIP-7547](https://eips.ethereum.org/EIPS/eip-7547) in the future to enable low latency censorship resistance. ### What is the weakest link scenario? -Without shared security the concern is that interoperating chains both change their state due to some cross-chain interaction, but a weak chain is attacked / reorged, and that would leave the interop cluster in a conflicting state. This means the security around interactions between two or more chains is as weak as the weakest chain. +Without shared security, there’s a risk that interacting chains could enter a conflicting state due to cross-chain interactions. If a weaker chain in the network is attacked or experiences a reorganization, it could change its state independently. This would leave the entire interop cluster in an inconsistent state, as the security of interactions across chains is only as strong as the weakest chain. ### Are callback style transactions possible? If two blocks are being built at the same time with shared knowledge of their contents, it is possible to build blocks where a transaction calls to another chain, does compute and then a transaction calls back with the results. This requires no protocol level changes, it just requires more sophisticated block builder infrastructure. From 0fb789562069a059414c9e182445160c17d8beff Mon Sep 17 00:00:00 2001 From: soyboy Date: Wed, 13 Nov 2024 16:09:52 +0700 Subject: [PATCH 517/565] adding notice page edits --- pages/builders/notices/holocene-changes.mdx | 27 ++++++++++++++------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/pages/builders/notices/holocene-changes.mdx b/pages/builders/notices/holocene-changes.mdx index 639296f52..54b2a560b 100644 --- a/pages/builders/notices/holocene-changes.mdx +++ b/pages/builders/notices/holocene-changes.mdx @@ -14,23 +14,25 @@ If you experience difficulty at any stage of this process, please reach out to [ The Holocene upgrade for the Sepolia Superchain will be activated at **Tue Nov 26 at 15:00:00 UTC (unix timestamp** `1732633200`). -The Holocene upgrade for the Mainnet Superchain is planned to happen on **Thu 9 Jan 2025 18:00:01 UTC**, [governance proposal link to be added](). +The Holocene upgrade for the Mainnet Superchain is optimistically scheduled for **Thu 9 Jan 2025 18:00:01 UTC**, pending governance approval. -## What's Included in Holocene +## What's included in Holocene Holocene contains two changes: -- **Holocene block derivation**: a set of changes that render the derivation pipeline stricter and simpler, improving worst-case scenarios for Fault Proofs and Interoperability. +- **Holocene block derivation**: a set of changes that render the derivation pipeline stricter and simpler, improving worst-case scenarios for the Fault Proof System and Interoperability. - **EIP-1559 configurability**: The elasticity and denominator EIP-1559 parameters become configurable via the `SystemConfig` L1 contract, allowing the gas target and gas limit to be configured independently. For more information on the Holocene implementation details, please review [Holocene specification](https://specs.optimism.io/protocol/holocene/overview.html). -## For Chain Operators +## For chain operators -Since the Holocene upgrade changes the execution and derivation rules, all chain and node operators, as for all hardforks, have to upgrade their nodes ahead of the activation times to a release that contains the Holocene changes and has the activation times for their chains baked in, or set the activation times manually via overrides, see below. +Chain operators have to upgrade their nodes ahead of the activation times to a release that contains the Holocene changes and has the activation times for their chains baked in, or set the activation times manually via overrides. -Besides this, chain operators must upgrade their chain’s `SystemConfig` to the latest OP Contracts [v1.8.0-rc.1 release](https://github.com/ethereum-optimism/optimism/releases/tag/op-contracts%2Fv1.8.0-rc.1). The updated `SystemConfig` implementations are deployed at addresses +TODO: is this a must? for mode, metal, and zora sepolia they're on op-contracts/v1.3.0; but they're also opted into superchain wide upgrades. + +Besides this, chain operators must upgrade their chain's `SystemConfig` to the latest OP Contracts [v1.8.0-rc.1 release](https://github.com/ethereum-optimism/optimism/releases/tag/op-contracts%2Fv1.8.0-rc.1). The updated `SystemConfig` implementations are deployed at addresses - Sepolia: TBD - Mainnet: TBD @@ -40,11 +42,18 @@ Chain operators need to update their proxy contracts to point to these new imple ### For fault proof enabled chains +Since the Holocene upgrade changes the execution and derivation rules, the version of `op-program` used in the fault proof system has to be upgraded to a version that includes the Holocene activation date for the chain. The `op-program` version used is specified via the `faultGameAbsolutePrestate` setting, deployed as part of `FaultDisputeGame` and `PermissionedDisputeGame` contracts. Additionally, the `MIPS` contract must be upgraded to support additional calls made by the new `op-program`. + +The `FaultDisputeGame` and `PermissionedDisputeGame` contracts must be deployed separately for each chain. The `MIPS` contract implementation can be shared by all chains and is deployed at: + +- Sepolia: TBD +- Mainnet: TBD +Chain operators need to update the `DisputeGameFactory` to use the new `FaultDisputeGame` and `PermissionedDisputeGame` contracts by calling `DisputeGameFactory.setImplementation`. The following upgrade script can be used to facilitate the upgrade: https://github.com/ethereum-optimism/optimism/pull/12878 ## For node operators -Node operators will need to upgrade to a Holocene release before the activation date. For Sepolia, the op-node release [FIND CORRECT VERSION](todo: add link) and op-geth release [FIND CORRECT VERSION](todo: add link) contain these changes. +Node operators will need to upgrade to the respective Holocene releases before the activation dates. These following steps are necessary for every node operator: @@ -62,9 +71,9 @@ These following steps are necessary for every node operator: For Sepolia that is: `OP Sepolia`, `Base Sepolia`, `Mode Sepolia`, and `Zora Sepolia`.
- For node operators of not included in the [hardfork activation inheritance behavior](https://github.com/ethereum-optimism/superchain-registry/blob/main/docs/hardfork-activation-inheritance.md), you will need to manually configure the [activation timestamp](https://github.com/ethereum-optimism/superchain-registry/blob/main/superchain/configs/mainnet/superchain.toml). This can be done one of two ways: + For node operators of not included in the [hardfork activation inheritance behavior](https://github.com/ethereum-optimism/superchain-registry/blob/main/docs/hardfork-activation-inheritance.md), you will need to manually configure the activation. This can be done one of two ways: - * **Option 1:** Set the activation time in the `rollup.json` for `op-node`. You will still need to set the `override.granite` flag in `op-geth` if you use this option. + * **Option 1:** Set the activation time in the `rollup.json` for `op-node`. You will still need to set the `override.holocene` flag in `op-geth` if you use this option. * **Option 2:** Set the activation time via overrides (CLI) in both `op-node` and `op-geth`. These will need to be set on `op-node` and `op-geth` for the sequencer and all other nodes. ### Verify Your Configuration From 6f750e30e63fa6c0ec3e8fbb1e5a99c874dacbbf Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Wed, 13 Nov 2024 10:28:19 +0100 Subject: [PATCH 518/565] improve text --- pages/stack/interop/explainer.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/stack/interop/explainer.mdx b/pages/stack/interop/explainer.mdx index 26bec6db5..b52b28800 100644 --- a/pages/stack/interop/explainer.mdx +++ b/pages/stack/interop/explainer.mdx @@ -111,7 +111,7 @@ See this [dune dashboard](https://dune.com/oplabspbc/op-stack-chains-l1-activity There is nothing stopping a sequencer from censoring a transaction when it is sent directly to the sequencer. This does not mean the network has no censorship resistance, users can always send a deposit transaction for censorship resistance as strong as L1 guarantees. The tradeoff here is the latency, instead of being confirmed in ~2 seconds, the transaction can be confirmed at the rate of L1 block production. It may be possible to adopt something like [EIP-7547](https://eips.ethereum.org/EIPS/eip-7547) in the future to enable low latency censorship resistance. ### What is the weakest link scenario? -Without shared security, there’s a risk that interacting chains could enter a conflicting state due to cross-chain interactions. If a weaker chain in the network is attacked or experiences a reorganization, it could change its state independently. This would leave the entire interop cluster in an inconsistent state, as the security of interactions across chains is only as strong as the weakest chain. +Without shared security, there is a risk that interacting chains could enter a conflicting state due to cross-chain interactions. If a weaker chain in the network is attacked or experiences a reorganization, it could change its state independently. This would leave the entire interop cluster in an inconsistent state, as the security of interactions across chains is only as strong as the weakest chain. ### Are callback style transactions possible? If two blocks are being built at the same time with shared knowledge of their contents, it is possible to build blocks where a transaction calls to another chain, does compute and then a transaction calls back with the results. This requires no protocol level changes, it just requires more sophisticated block builder infrastructure. From ba57f971eae2e31d992b187a23545050d8d144fe Mon Sep 17 00:00:00 2001 From: soyboy Date: Wed, 13 Nov 2024 16:49:21 +0700 Subject: [PATCH 519/565] updating hf page --- .../node-operators/network-upgrades.mdx | 120 +++--------------- pages/builders/notices.mdx | 2 + pages/builders/notices/holocene-changes.mdx | 29 ++--- words.txt | 16 --- 4 files changed, 31 insertions(+), 136 deletions(-) diff --git a/pages/builders/node-operators/network-upgrades.mdx b/pages/builders/node-operators/network-upgrades.mdx index 290021c27..24979c4ca 100644 --- a/pages/builders/node-operators/network-upgrades.mdx +++ b/pages/builders/node-operators/network-upgrades.mdx @@ -1,7 +1,7 @@ --- title: Network upgrades lang: en-US -description: Learn more about how network upgrades work and how to keep your nodes up to date. +description: Learn more about Superchain network activations. --- import Image from 'next/image' @@ -9,113 +9,23 @@ import { Steps, Callout } from 'nextra/components' # Network upgrade overview -This section has information on how to upgrade your Mainnet and Testnet nodes -for new network upgrades. The network upgrade naming scheme after the Bedrock -upgrade has a geology themed name based on the next letter in the english -alphabet. +This page has the hardfork activation timestamps and the links to the details outlined in the specs. +It also outlines the hardfork release process. +The network upgrade naming scheme after the Bedrock upgrade has a geology themed name based on the next letter in the english alphabet. ## Activations -Network upgrades are activated by timestamps. Failing to upgrade your node -before the timestamp will cause a chain divergence. You will need to resync -your node to reconcile the chain. Optimistic activation times refer to times -that are pending governance approval. - -| Upgrade | Governance Approval | [OP Mainnet Activations](https://github.com/ethereum-optimism/superchain-registry/blob/main/superchain/configs/mainnet/superchain.toml) | [OP Sepolia Activations](https://github.com/ethereum-optimism/superchain-registry/blob/main/superchain/configs/sepolia/superchain.toml) | -| ------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------- | -| [Granite](https://specs.optimism.io/protocol/granite/overview.html) | [approved](https://gov.optimism.io/t/upgrade-proposal-10-granite-network-upgrade/8733) | Wed Sep 11 16:00:01 UTC 2024 (`1726070401`) around block `125235812` | Mon Aug 12 16:00:00 UTC 2024 (`1723478400`) around block `15837930` | -| [Fjord](https://specs.optimism.io/protocol/fjord/overview.html) | [approved](https://gov.optimism.io/t/upgrade-proposal-9-fjord-network-upgrade/8236) | Wed Jul 10 16:00:01 UTC 2024 (`1720627201`) around block `122514212` | Wed May 29 16:00:00 UTC 2024 (`1716998400`) around block `12597930` | -| [Ecotone](https://specs.optimism.io/protocol/ecotone/overview.html) | [approved](https://gov.optimism.io/t/upgrade-proposal-5-ecotone-network-upgrade/7669) | Thu Mar 14 00:00:01 UTC 2024 (`1710374401`) around block `117387812` | Wed Feb 21 17:00:00 UTC 2024 (`1708534800`) around block `8366130` | -| [Delta](https://specs.optimism.io/protocol/delta/overview.html) | [approved](https://gov.optimism.io/t/final-upgrade-proposal-3-delta-network-upgrade/7310) | Thu Feb 22 00:00:00 UTC 2024 (`1708560000`) around block `116480612` | Fri Dec 22 00:00:00 UTC 2023 (`1703203200`) around block `5700330` | -| [Canyon](https://specs.optimism.io/protocol/canyon/overview.html) | [approved](https://gov.optimism.io/t/final-upgrade-proposal-2-canyon-network-upgrade/7088) | Thu Jan 11 17:00:01 UTC 2024 (`1704992401`) around block `114696812` | Tue Nov 14 17:00:00 UTC 2023 (`1699981200`) around block `4089330` | -| Bedrock | ([https://gov.optimism.io/t/final-upgrade-1-bedrock-protocol-upgrade-v2/5548](https://gov.optimism.io/t/final-upgrade-1-bedrock-protocol-upgrade-v2/5548)) | Tue Jun 06 2023 16:28:23 UTC (`1686079703`) at block `105235063` | N/A | - -## Summary of changes - -These are the summaries of each network upgrade changes ordered by the most -recent activation. These are a reflection of the [Superchain Upgrades Specifications](https://specs.optimism.io/protocol/superchain-upgrades.html) - -### [Granite](https://specs.optimism.io/protocol/granite/overview.html) - -The Granite upgrade limits `bn256Pairing` precompile input size and reduces the Channel Timeout. - -* [Limit `bn256Pairing` precompile input size](https://specs.optimism.io/protocol/granite/exec-engine.html#bn256pairing-precompile-input-restriction) -* [Reduce Channel Timeout to 50](https://specs.optimism.io/protocol/granite/derivation.html#reduce-channel-timeout) - -### [Fjord](https://specs.optimism.io/protocol/fjord/overview.html) - -The Fjord upgrade includes the RIP-7212 precompile, FastLZ gas pricing, Brotli channel compression, and several protocol parameter changes. - -* [RIP-7212: Precompile for secp256r1](https://specs.optimism.io/protocol/precompiles.html#P256VERIFY) -* [Brotli channel compression](https://specs.optimism.io/fjord/exec-engine.html#fees) -* FastLZ gas pricing - * [FastLZ L1 fee cost calculation](https://specs.optimism.io/fjord/exec-engine.html#fees) - * [Upgraded GasPriceOracle to compute FastLZ](https://specs.optimism.io/fjord/derivation.html#gaspriceoracle-deployment) - * [L1 gas cost changes](https://specs.optimism.io/fjord/predeploys.html#l1-gas-usage-estimation) -* Protocol parameter changes - * [Max sequencer drift becomes constant](https://specs.optimism.io/fjord/derivation.html#constant-maximum-sequencer-drift) - * [Channel constant increases](https://specs.optimism.io/fjord/derivation.html#increasing-max_rlp_bytes_per_channel-and-max_channel_bank_size) -* [Fjord hardfork activation block](https://specs.optimism.io/fjord/derivation.html#network-upgrade-automation-transactions) - -### [Ecotone](https://specs.optimism.io/protocol/ecotone/overview.html) - -The Ecotone upgrade contains the Dencun upgrade from L1, and adopts EIP-4844 blobs for data-availability. - -Cancun (Execution Layer): - -* [EIP-1153: Transient storage opcodes](https://eips.ethereum.org/EIPS/eip-1153) -* [EIP-4844: Shard Blob Transactions](https://eips.ethereum.org/EIPS/eip-4844) -* [Blob transactions are disabled](https://specs.optimism.io/protocol/exec-engine.html#ecotone-disable-blob-transactions) -* [EIP-4788: Beacon block root in the EVM](https://eips.ethereum.org/EIPS/eip-4788) -* [The L1 beacon block root is embedded into L2](https://specs.optimism.io/protocol/exec-engine.html#ecotone-beacon-block-root) -* [The Beacon roots contract deployment is automated](https://specs.optimism.io/protocol/derivation.html#ecotone-beacon-block-roots-contract-deployment-eip-4788) -* [EIP-5656: MCOPY - Memory copying instruction](https://eips.ethereum.org/EIPS/eip-5656) -* [EIP-6780: SELFDESTRUCT only in same transaction](https://eips.ethereum.org/EIPS/eip-6780) -* [EIP-7516: BLOBBASEFEE opcode](https://eips.ethereum.org/EIPS/eip-7516) -* [BLOBBASEFEE always pushes 1 onto the stack](https://specs.optimism.io/protocol/exec-engine.html#ecotone-disable-blob-transactions) - -Deneb (Consensus Layer): *not applicable to L2* - -* [EIP-7044: Perpetually Valid Signed Voluntary Exits](https://eips.ethereum.org/EIPS/eip-7044) -* [EIP-7045: Increase Max Attestation Inclusion Slot](https://eips.ethereum.org/EIPS/eip-7045) -* [EIP-7514: Add Max Epoch Churn Limit](https://eips.ethereum.org/EIPS/eip-7514) - -Data Availability (DA) upgrade: - -* Blobs Data Availability: support blobs DA the [L1 Data-retrieval stage](https://specs.optimism.io/protocol/derivation.html#ecotone-blob-retrieval). -* Rollup fee update: support blobs DA in [L1 Data Fee computation](https://specs.optimism.io/protocol/exec-engine.html#ecotone-l1-cost-fee-changes-eip-4844-da) -* Auto-upgrading and extension of the [L1 Attributes Predeployed Contract](https://specs.optimism.io/protocol/deposits.html#ecotone-l1block-upgrade) - (also known as `L1Block` predeploy) - -### [Delta](https://specs.optimism.io/protocol/delta/overview.html) - -The Delta upgrade consists of a single consensus-layer feature: [Span Batches](https://specs.optimism.io/protocol/delta/span-batches.html). - -The Delta upgrade uses a *L2 block-timestamp* activation-rule, and is specified only in the rollup-node (`delta_time`). - -### [Canyon](https://specs.optimism.io/protocol/canyon/overview.html) - -The Canyon upgrade contains the Shapella upgrade from L1 and some minor protocol fixes. - -* [EIP-3651: Warm COINBASE](https://eips.ethereum.org/EIPS/eip-3651) -* [EIP-3855: PUSH0 instruction](https://eips.ethereum.org/EIPS/eip-3855) -* [EIP-3860: Limit and meter initcode](https://eips.ethereum.org/EIPS/eip-3860) -* [EIP-4895: Beacon chain push withdrawals as operations](https://eips.ethereum.org/EIPS/eip-4895) -* [Withdrawals are prohibited in P2P Blocks](https://specs.optimism.io/protocol/rollup-node-p2p.html#block-validation) -* [Withdrawals should be set to the empty array with Canyon](https://specs.optimism.io/protocol/derivation.html#building-individual-payload-attributes) -* [EIP-6049: Deprecate SELFDESTRUCT](https://eips.ethereum.org/EIPS/eip-6049) -* [Modifies the EIP-1559 Denominator](https://specs.optimism.io/protocol/exec-engine.html#1559-parameters) -* [Channel Ordering Fix](https://specs.optimism.io/protocol/derivation.html#reading) -* [Adds the deposit nonce & deposit nonce version to the deposit receipt hash](https://specs.optimism.io/protocol/deposits.html#deposit-receipt) -* [Deploys the create2Deployer to `0x13b0D85CcB8bf860b6b79AF3029fCA081AE9beF2`](https://specs.optimism.io/protocol/predeploys.html#create2deployer) - -The Canyon upgrade uses a *L2 block-timestamp* activation-rule, and is specified in both the -rollup-node (`canyon_time`) and execution engine (`config.canyonTime`). Shanghai time in the -execution engine should be set to the same time as the Canyon time. - -### Bedrock - -The Bedrock upgrade transitioned the OP Stack from its legacy design to a modern modular architecture. This new design separates the OP Stack into distinct consensus, execution, and settlement layers, enabling more efficient integration of future improvements and facilitating the growth of a Superchain ecosystem. +Network upgrades are activated by timestamps. Failing to upgrade your OP Stack software before the timestamp will cause a chain divergence and you will need to resync the chain. Optimistic activation times refer to times that are pending governance approval. + +| Upgrade | Governance Approval | [Mainnet Activations](https://github.com/ethereum-optimism/superchain-registry/blob/main/superchain/configs/mainnet/superchain.toml) | [Sepolia Activations](https://github.com/ethereum-optimism/superchain-registry/blob/main/superchain/configs/sepolia/superchain.toml) | +| --------------------------------------------------------------------- | ------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------ | +| [Holocene](https://specs.optimism.io/protocol/holocene/overview.html) | TBD | TBD | Tue Nov 26 15:00:00 UTC 2024 (`1732633200`) | +| [Granite](https://specs.optimism.io/protocol/granite/overview.html) | [approved](https://gov.optimism.io/t/upgrade-proposal-10-granite-network-upgrade/8733) | Wed Sep 11 16:00:01 UTC 2024 (`1726070401`) around block `125235812` | Mon Aug 12 16:00:00 UTC 2024 (`1723478400`) around block `15837930` | +| [Fjord](https://specs.optimism.io/protocol/fjord/overview.html) | [approved](https://gov.optimism.io/t/upgrade-proposal-9-fjord-network-upgrade/8236) | Wed Jul 10 16:00:01 UTC 2024 (`1720627201`) around block `122514212` | Wed May 29 16:00:00 UTC 2024 (`1716998400`) around block `12597930` | +| [Ecotone](https://specs.optimism.io/protocol/ecotone/overview.html) | [approved](https://gov.optimism.io/t/upgrade-proposal-5-ecotone-network-upgrade/7669) | Thu Mar 14 00:00:01 UTC 2024 (`1710374401`) around block `117387812` | Wed Feb 21 17:00:00 UTC 2024 (`1708534800`) around block `8366130` | +| [Delta](https://specs.optimism.io/protocol/delta/overview.html) | [approved](https://gov.optimism.io/t/final-upgrade-proposal-3-delta-network-upgrade/7310) | Thu Feb 22 00:00:00 UTC 2024 (`1708560000`) around block `116480612` | Fri Dec 22 00:00:00 UTC 2023 (`1703203200`) around block `5700330` | +| [Canyon](https://specs.optimism.io/protocol/canyon/overview.html) | [approved](https://gov.optimism.io/t/final-upgrade-proposal-2-canyon-network-upgrade/7088) | Thu Jan 11 17:00:01 UTC 2024 (`1704992401`) around block `114696812` | Tue Nov 14 17:00:00 UTC 2023 (`1699981200`) around block `4089330` | +| Bedrock | [approved](https://gov.optimism.io/t/final-upgrade-1-bedrock-protocol-upgrade-v2/5548) | Tue Jun 06 2023 16:28:23 UTC (`1686079703`) at block `105235063` | N/A | ## Upgrade process diff --git a/pages/builders/notices.mdx b/pages/builders/notices.mdx index 27aaaa0ab..5ca3a4b7f 100644 --- a/pages/builders/notices.mdx +++ b/pages/builders/notices.mdx @@ -11,5 +11,7 @@ import { Card, Cards } from 'nextra/components' Documentation covering Sdk Deprecation in the Notices section of the OP Stack ecosystem. + + diff --git a/pages/builders/notices/holocene-changes.mdx b/pages/builders/notices/holocene-changes.mdx index 54b2a560b..d88d8f010 100644 --- a/pages/builders/notices/holocene-changes.mdx +++ b/pages/builders/notices/holocene-changes.mdx @@ -12,44 +12,43 @@ This page outlines breaking changes related to the Holocene network upgrade for If you experience difficulty at any stage of this process, please reach out to [developer support](https://github.com/ethereum-optimism/developers/discussions). -The Holocene upgrade for the Sepolia Superchain will be activated at **Tue Nov 26 at 15:00:00 UTC (unix timestamp** `1732633200`). + The Holocene upgrade for the Sepolia Superchain will be activated at **Tue Nov 26 at 15:00:00 UTC** (`1732633200`). -The Holocene upgrade for the Mainnet Superchain is optimistically scheduled for **Thu 9 Jan 2025 18:00:01 UTC**, pending governance approval. + The Holocene upgrade for the Mainnet Superchain is optimistically scheduled for **Thu 9 Jan 2025 18:00:01 UTC**, pending governance approval. ## What's included in Holocene Holocene contains two changes: -- **Holocene block derivation**: a set of changes that render the derivation pipeline stricter and simpler, improving worst-case scenarios for the Fault Proof System and Interoperability. -- **EIP-1559 configurability**: The elasticity and denominator EIP-1559 parameters become configurable via the `SystemConfig` L1 contract, allowing the gas target and gas limit to be configured independently. +* **Holocene block derivation**: a set of changes that render the derivation pipeline stricter and simpler, improving worst-case scenarios for the Fault Proof System and Interoperability. +* **EIP-1559 configurability**: The elasticity and denominator EIP-1559 parameters become configurable via the `SystemConfig` L1 contract, allowing the gas target and gas limit to be configured independently. - For more information on the Holocene implementation details, please review [Holocene specification](https://specs.optimism.io/protocol/holocene/overview.html). +For more information on the Holocene implementation details, please review [Holocene specification](https://specs.optimism.io/protocol/holocene/overview.html). ## For chain operators Chain operators have to upgrade their nodes ahead of the activation times to a release that contains the Holocene changes and has the activation times for their chains baked in, or set the activation times manually via overrides. -TODO: is this a must? for mode, metal, and zora sepolia they're on op-contracts/v1.3.0; but they're also opted into superchain wide upgrades. +TODO: is this a must? for mode, metal, and zora sepolia they're on op-contracts/v1.3.0; but they're also opted into superchain wide upgrades. Besides this, chain operators must upgrade their chain's `SystemConfig` to the latest OP Contracts [v1.8.0-rc.1 release](https://github.com/ethereum-optimism/optimism/releases/tag/op-contracts%2Fv1.8.0-rc.1). The updated `SystemConfig` implementations are deployed at addresses -- Sepolia: TBD -- Mainnet: TBD +* Sepolia: TBD +* Mainnet: TBD -Chain operators need to update their proxy contracts to point to these new implementations. The following upgrade script can be used to facilitate the upgrade: https://github.com/ethereum-optimism/optimism/pull/12878 +Chain operators need to update their proxy contracts to point to these new implementations. The following upgrade script can be used to facilitate the upgrade: [https://github.com/ethereum-optimism/optimism/pull/12878](https://github.com/ethereum-optimism/optimism/pull/12878) - -### For fault proof enabled chains +### For fault proof enabled chains Since the Holocene upgrade changes the execution and derivation rules, the version of `op-program` used in the fault proof system has to be upgraded to a version that includes the Holocene activation date for the chain. The `op-program` version used is specified via the `faultGameAbsolutePrestate` setting, deployed as part of `FaultDisputeGame` and `PermissionedDisputeGame` contracts. Additionally, the `MIPS` contract must be upgraded to support additional calls made by the new `op-program`. The `FaultDisputeGame` and `PermissionedDisputeGame` contracts must be deployed separately for each chain. The `MIPS` contract implementation can be shared by all chains and is deployed at: -- Sepolia: TBD -- Mainnet: TBD +* Sepolia: TBD +* Mainnet: TBD -Chain operators need to update the `DisputeGameFactory` to use the new `FaultDisputeGame` and `PermissionedDisputeGame` contracts by calling `DisputeGameFactory.setImplementation`. The following upgrade script can be used to facilitate the upgrade: https://github.com/ethereum-optimism/optimism/pull/12878 +Chain operators need to update the `DisputeGameFactory` to use the new `FaultDisputeGame` and `PermissionedDisputeGame` contracts by calling `DisputeGameFactory.setImplementation`. The following upgrade script can be used to facilitate the upgrade: [https://github.com/ethereum-optimism/optimism/pull/12878](https://github.com/ethereum-optimism/optimism/pull/12878) ## For node operators @@ -83,4 +82,4 @@ These following steps are necessary for every node operator: * `op-node` and `op-geth` will log their configurations at startup * Check that the Granite time is set to `activation-timestamp` in the op-node startup logs * Check that the Granite time is set to `activation-timestamp` in the op-geth startup logs - \ No newline at end of file + diff --git a/words.txt b/words.txt index f5ae76fbc..9ff8f1a1e 100644 --- a/words.txt +++ b/words.txt @@ -10,7 +10,6 @@ Allnodes Allocs allocs ANDI -Ankr Apeworx Arweave authrpc @@ -23,7 +22,6 @@ BGTZ Biconomy birthdate BLEZ -BLOBBASEFEE BLOBPOOL blobpool blobspace @@ -75,7 +73,6 @@ DATACAP datacap DATADIR datadir -Dencun Devnet devnet devnets @@ -150,13 +147,11 @@ holesky IERC IGNOREPRICE ignoreprice -Immunefi implicity Inator inator INFLUXDBV influxdbv -initcode interchain IPCDISABLE ipcdisable @@ -186,7 +181,6 @@ MAXPENDPEERS maxpendpeers MAXPRICE maxprice -MCOPY MEMPROFILERATE memprofilerate Merkle @@ -200,7 +194,6 @@ minsuggestedpriorityfee Mintable Mintplex MIPSEVM -Mitigations Monitorism Moralis Mordor @@ -295,8 +288,6 @@ Proxied Proxyd proxyd pseudorandomly -Pyth -Pyth's QRNG Quicknode quicknode @@ -329,16 +320,10 @@ runbooks RWAs safedb Schnorr -secp -SELFDESTRUCT -SEPOLIA -Sepolia -sepolia seqnr SEQUENCERHTTP sequencerhttp serv -Shapella signup SLLV SLTI @@ -404,7 +389,6 @@ VMDEBUG vmdebug VMODULE vmodule -voxel Warpcast xlarge XORI From 2b574b5be6dc421579fcbe76b14b08ab6435e036 Mon Sep 17 00:00:00 2001 From: soyboy Date: Wed, 13 Nov 2024 16:59:54 +0700 Subject: [PATCH 520/565] resolving todo --- pages/builders/notices/holocene-changes.mdx | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/pages/builders/notices/holocene-changes.mdx b/pages/builders/notices/holocene-changes.mdx index d88d8f010..a733e725d 100644 --- a/pages/builders/notices/holocene-changes.mdx +++ b/pages/builders/notices/holocene-changes.mdx @@ -30,9 +30,7 @@ For more information on the Holocene implementation details, please review [Holo Chain operators have to upgrade their nodes ahead of the activation times to a release that contains the Holocene changes and has the activation times for their chains baked in, or set the activation times manually via overrides. -TODO: is this a must? for mode, metal, and zora sepolia they're on op-contracts/v1.3.0; but they're also opted into superchain wide upgrades. - -Besides this, chain operators must upgrade their chain's `SystemConfig` to the latest OP Contracts [v1.8.0-rc.1 release](https://github.com/ethereum-optimism/optimism/releases/tag/op-contracts%2Fv1.8.0-rc.1). The updated `SystemConfig` implementations are deployed at addresses +Besides this, chain operators must upgrade their chain's `SystemConfig` to the latest OP Contracts [v1.8.0-rc.1 release](https://github.com/ethereum-optimism/optimism/releases/tag/op-contracts%2Fv1.8.0-rc.1) to utilize the EIP-1559 configurability. The updated `SystemConfig` implementations are deployed at addresses: * Sepolia: TBD * Mainnet: TBD From 011ae170293a76da4a30a795c803ceb093751981 Mon Sep 17 00:00:00 2001 From: soyboy Date: Wed, 13 Nov 2024 17:02:19 +0700 Subject: [PATCH 521/565] we really need to fix this linter thing --- words.txt | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/words.txt b/words.txt index 9ff8f1a1e..185655d9c 100644 --- a/words.txt +++ b/words.txt @@ -397,3 +397,12 @@ ZKPs ZKVM Zora zora +Sepolia +voxel +SEPOLIA +sepolia +Pyth +Pyth's +Ankr +Mitigations +Immunefi From 2ede6081dca727e049c886f763eea30efe3c0bbc Mon Sep 17 00:00:00 2001 From: Bradley Camacho <42678939+bradleycamacho@users.noreply.github.com> Date: Wed, 13 Nov 2024 09:47:10 -0800 Subject: [PATCH 522/565] Update home page capitalization Transition from title case to sentence case --- pages/index.mdx | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/pages/index.mdx b/pages/index.mdx index 3ad6a6487..15d4aebdd 100644 --- a/pages/index.mdx +++ b/pages/index.mdx @@ -11,41 +11,41 @@ import { Cards, Card } from 'nextra/components' Welcome to the Optimism Docs, the unified home of the [Optimism Collective's](/connect/resources/glossary#optimism-collective) technical documentation and information about the [OP Stack](/stack/getting-started). Information about the Optimism Collective's governance, community, and mission can be found on the [Optimism Community Hub](https://community.optimism.io/docs/governance/). -## Guides for Builders +## Guides for builders Whether you're a developer building a app on OP Mainnet, a node operator running an OP Mainnet node, or a chain operator launching your own OP Stack chain, you'll find everything you need to get started right here. - } /> + } /> - } /> + } /> - } /> + } /> } /> - } /> + } /> -## Featured Tools +## Featured tools Check out these amazing tools, so you can get building with Optimism. - } /> + } /> } /> } /> - } /> + } /> - } /> + } /> -## Learn About Optimism +## Learn about Optimism OP Mainnet is an [EVM equivalent](https://web.archive.org/web/20231127160757/https://medium.com/ethereum-optimism/introducing-evm-equivalence-5c2021deb306) Layer 2 blockchain connected to Ethereum. The OP Stack is the standardized, shared, and open-source development stack that makes it easy to spin up your own production-ready Layer 2 blockchain just like OP Mainnet. From fb9e1626ecd049351837b53724466cfc15cabf98 Mon Sep 17 00:00:00 2001 From: Bradley Camacho <42678939+bradleycamacho@users.noreply.github.com> Date: Wed, 13 Nov 2024 10:07:58 -0800 Subject: [PATCH 523/565] Fix breadcrumb and title casing --- pages/builders/node-operators.mdx | 2 +- pages/builders/node-operators/releases.mdx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pages/builders/node-operators.mdx b/pages/builders/node-operators.mdx index 9d25972cb..537743b2f 100644 --- a/pages/builders/node-operators.mdx +++ b/pages/builders/node-operators.mdx @@ -21,7 +21,7 @@ Documentation covering Architecture, Configuration, Json Rpc, Management, Networ - + diff --git a/pages/builders/node-operators/releases.mdx b/pages/builders/node-operators/releases.mdx index 08a2e40d3..4c7ad18c7 100644 --- a/pages/builders/node-operators/releases.mdx +++ b/pages/builders/node-operators/releases.mdx @@ -1,5 +1,5 @@ --- -title: Node Software Releases +title: Node software releases lang: en-US description: Off chain node software release information and how to stay up to date. --- From 3267512e3f4214f7464308c18e9547af6d5d612e Mon Sep 17 00:00:00 2001 From: Bradley Camacho <42678939+bradleycamacho@users.noreply.github.com> Date: Wed, 13 Nov 2024 11:21:03 -0800 Subject: [PATCH 524/565] Provide an interop value-prop in more plain terms --- pages/stack/interop/explainer.mdx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pages/stack/interop/explainer.mdx b/pages/stack/interop/explainer.mdx index b52b28800..ba75c0f5d 100644 --- a/pages/stack/interop/explainer.mdx +++ b/pages/stack/interop/explainer.mdx @@ -20,6 +20,8 @@ Native OP Stack interoperability provides the ability to read messages and trans * secure transfer of ETH and ERC-20s across L2s * horizontally scalable applications +In a practical sense, this allows users to securely and easily move ETH and tokens from one OP Stack chain to another by leveraging OP goverened blockspace security. + ## Secure message passing Superchain interop includes both the protocol layer message passing and the Superchain ERC20 token specification. From 05ad40964172c762e07a52eee077a57f2f4e91a2 Mon Sep 17 00:00:00 2001 From: Bradley Camacho <42678939+bradleycamacho@users.noreply.github.com> Date: Wed, 13 Nov 2024 12:53:49 -0800 Subject: [PATCH 525/565] Typo fix Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> --- pages/stack/interop/explainer.mdx | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/pages/stack/interop/explainer.mdx b/pages/stack/interop/explainer.mdx index ba75c0f5d..055afaaa8 100644 --- a/pages/stack/interop/explainer.mdx +++ b/pages/stack/interop/explainer.mdx @@ -20,8 +20,7 @@ Native OP Stack interoperability provides the ability to read messages and trans * secure transfer of ETH and ERC-20s across L2s * horizontally scalable applications -In a practical sense, this allows users to securely and easily move ETH and tokens from one OP Stack chain to another by leveraging OP goverened blockspace security. - +In a practical sense, this allows users to securely and easily move ETH and tokens from one OP Stack chain to another by leveraging OP governed blockspace security. ## Secure message passing Superchain interop includes both the protocol layer message passing and the Superchain ERC20 token specification. From e18058d94b4a49858d78060b9baa8274aa0b6bf2 Mon Sep 17 00:00:00 2001 From: Bradley Camacho <42678939+bradleycamacho@users.noreply.github.com> Date: Wed, 13 Nov 2024 13:27:18 -0800 Subject: [PATCH 526/565] Collapsing walkthrough section and disabling changed file summary --- .coderabbit.yaml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.coderabbit.yaml b/.coderabbit.yaml index 4bb0d0a94..a313f94de 100644 --- a/.coderabbit.yaml +++ b/.coderabbit.yaml @@ -4,7 +4,8 @@ reviews: high_level_summary: false poem: false review_status: false - collapse_walkthrough: false + collapse_walkthrough: true + changed_files_summary: false path_instructions: - path: "**/*.mdx" instructions: | From e9ebb3e3113fcec100328a386095f306b6dcfadf Mon Sep 17 00:00:00 2001 From: krofax Date: Thu, 14 Nov 2024 14:56:51 +0100 Subject: [PATCH 527/565] Added starter kit --- pages/stack/interop/assets/superchain-erc20.mdx | 1 + words.txt | 9 --------- 2 files changed, 1 insertion(+), 9 deletions(-) diff --git a/pages/stack/interop/assets/superchain-erc20.mdx b/pages/stack/interop/assets/superchain-erc20.mdx index c9fb90060..fab6af88e 100644 --- a/pages/stack/interop/assets/superchain-erc20.mdx +++ b/pages/stack/interop/assets/superchain-erc20.mdx @@ -90,5 +90,6 @@ For step-by-step information on implementing SuperchainERC20, see [Deploy assets ## Next steps * Explore the [SuperchainERC20 specifications](https://specs.optimism.io/interop/token-bridging.html) for in-depth implementation details. +* Check out the [Superchain ERC20 starter kit](https://github.com/ethereum-optimism/superchainerc20-starter) to get started with implementation. * Watch the [Superchain interop design video walkthrough](https://www.youtube.com/watch?v=FKc5RgjtGes) for a visual explanation of the concepts. * Review the [Superchain Interop Explainer](explainer) for answers to common questions about interoperability. diff --git a/words.txt b/words.txt index f5ae76fbc..0efd003b6 100644 --- a/words.txt +++ b/words.txt @@ -10,7 +10,6 @@ Allnodes Allocs allocs ANDI -Ankr Apeworx Arweave authrpc @@ -150,7 +149,6 @@ holesky IERC IGNOREPRICE ignoreprice -Immunefi implicity Inator inator @@ -200,7 +198,6 @@ minsuggestedpriorityfee Mintable Mintplex MIPSEVM -Mitigations Monitorism Moralis Mordor @@ -295,8 +292,6 @@ Proxied Proxyd proxyd pseudorandomly -Pyth -Pyth's QRNG Quicknode quicknode @@ -331,9 +326,6 @@ safedb Schnorr secp SELFDESTRUCT -SEPOLIA -Sepolia -sepolia seqnr SEQUENCERHTTP sequencerhttp @@ -404,7 +396,6 @@ VMDEBUG vmdebug VMODULE vmodule -voxel Warpcast xlarge XORI From f67cae5c150184c79e60febdaa2f7f06b2075555 Mon Sep 17 00:00:00 2001 From: krofax Date: Thu, 14 Nov 2024 15:00:07 +0100 Subject: [PATCH 528/565] fix lint error --- words.txt | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/words.txt b/words.txt index 0efd003b6..f5ae76fbc 100644 --- a/words.txt +++ b/words.txt @@ -10,6 +10,7 @@ Allnodes Allocs allocs ANDI +Ankr Apeworx Arweave authrpc @@ -149,6 +150,7 @@ holesky IERC IGNOREPRICE ignoreprice +Immunefi implicity Inator inator @@ -198,6 +200,7 @@ minsuggestedpriorityfee Mintable Mintplex MIPSEVM +Mitigations Monitorism Moralis Mordor @@ -292,6 +295,8 @@ Proxied Proxyd proxyd pseudorandomly +Pyth +Pyth's QRNG Quicknode quicknode @@ -326,6 +331,9 @@ safedb Schnorr secp SELFDESTRUCT +SEPOLIA +Sepolia +sepolia seqnr SEQUENCERHTTP sequencerhttp @@ -396,6 +404,7 @@ VMDEBUG vmdebug VMODULE vmodule +voxel Warpcast xlarge XORI From 02a34f5e65cccda714bea6f8885519cd44dc09cf Mon Sep 17 00:00:00 2001 From: Voronor <129545215+voronor@users.noreply.github.com> Date: Thu, 14 Nov 2024 16:39:46 +0100 Subject: [PATCH 529/565] Typo Update content-reuse.md There is a small typo in the heading for the "How to Use a Single Reusable Content Components" section. The word "Components" should be singular, as the section is referring to a single component. --- notes/content-reuse.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/notes/content-reuse.md b/notes/content-reuse.md index d11dcbfd8..7bc43516a 100644 --- a/notes/content-reuse.md +++ b/notes/content-reuse.md @@ -10,7 +10,7 @@ The content directory contains markdown files that can be imported across the ne Create a `.md` file in the `/content` directory. -### How to Use a Single Reusable Content Components +### How to Use a Single Reusable Content Component 1. Import it at the top of `.mdx` file: From 61c82882fd51f40b7e680cabd51dc2d2bc8d962b Mon Sep 17 00:00:00 2001 From: Bryer <0xbryer@gmail.com> Date: Fri, 15 Nov 2024 13:46:37 +0200 Subject: [PATCH 530/565] Refactor JSDoc for WipCallout to Improve Clarity and Precision Update WipCallout.tsx This pull request addresses an issue with the JSDoc comments for the WipCallout function. The original JSDoc was overly verbose, included redundant information, and misused the @param directive. The updated JSDoc provides a more precise and compact description while adhering to standard documentation practices. --- components/WipCallout.tsx | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/components/WipCallout.tsx b/components/WipCallout.tsx index 2d0b96ccd..ae3600044 100644 --- a/components/WipCallout.tsx +++ b/components/WipCallout.tsx @@ -1,13 +1,9 @@ /** * The WipCallout function renders a custom callout component with optional context text for * displaying maintenance messages. - * @param {Props} - The code snippet you provided is a React component named `WipCallout` that - * renders a special callout message. The component takes an optional prop `context` of type string, - * which can be used to customize the message displayed in the callout. - * @returns The WipCallout component is being returned, which is a React element representing a - * custom callout with a message. The message displayed depends on the value of the `context` prop - * passed to the component. If `context` is provided, it will display the provided context message. If - * `context` is not provided, it will display a default maintenance message. + * @param {Props} props - An object containing the optional `context` property, a string used + * to customize the message displayed in the callout. + * @returns {ReactElement} The WipCallout component, representing a custom callout message. */ import type { ReactElement } from 'react'; import { useState } from 'react'; @@ -115,4 +111,4 @@ export function AltCallout(props: Props): ReactElement { export function CGTCallout(props: Props): ReactElement { return ; -} \ No newline at end of file +} From 1426d0cb918b9446da68575323c29b44300ff5f8 Mon Sep 17 00:00:00 2001 From: Voronor <129545215+voronor@users.noreply.github.com> Date: Fri, 15 Nov 2024 13:05:42 +0100 Subject: [PATCH 531/565] Fix invalid stroke-width attribute Update Loader.tsx Fix invalid stroke-width attribute in Loader component --- components/calculator/Loader.tsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/components/calculator/Loader.tsx b/components/calculator/Loader.tsx index d437554b9..708ab889b 100644 --- a/components/calculator/Loader.tsx +++ b/components/calculator/Loader.tsx @@ -7,7 +7,7 @@ export const Loader: React.FC = () => { { { Date: Fri, 15 Nov 2024 13:08:53 +0100 Subject: [PATCH 532/565] Update components/calculator/Loader.tsx --- components/calculator/Loader.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/calculator/Loader.tsx b/components/calculator/Loader.tsx index 708ab889b..9e4ebbb85 100644 --- a/components/calculator/Loader.tsx +++ b/components/calculator/Loader.tsx @@ -7,7 +7,7 @@ export const Loader: React.FC = () => { Date: Fri, 15 Nov 2024 16:03:44 +0100 Subject: [PATCH 533/565] Created a script that checks for borken links --- lychee.toml | 8 +- package.json | 3 +- .../send-raw-transaction-conditional.mdx | 4 +- .../assets/deploy-superchain-erc20.mdx | 2 +- pages/stack/interop/explainer.mdx | 2 +- utils/redirects.ts | 135 ++++++++++++++++++ 6 files changed, 148 insertions(+), 6 deletions(-) create mode 100644 utils/redirects.ts diff --git a/lychee.toml b/lychee.toml index 60e8be5a2..9ecd097e5 100644 --- a/lychee.toml +++ b/lychee.toml @@ -13,6 +13,9 @@ remap = [ "file:///(.*?)/pages/img/(.*) file:///$1/public/img/$2", "file:///(.*?)/pages/resources/(.*) file:///$1/public/resources/$2", "file:///([^#.?]+)(#.*)?$ file:///$1.mdx$2", + "file:///([^#]+)#.*$ file:///$1.mdx", + "/([^#]+)#.*$ file:///pages/$1.mdx", + "^/([^#]+)$ file:///pages/$1.mdx", "\\\\& &" ] @@ -27,6 +30,9 @@ exclude_loopback = true # Exclude all mail addresses from checking. exclude_mail = true +# Exclude all external links except ethereum-optimism GitHub +exclude_links = ['http[s]?://(?!github\.com/ethereum-optimism).*'] + # Exclude RPC URLs from checking. exclude = [ 'https://mainnet.optimism.io', @@ -41,4 +47,4 @@ exclude = [ ] # Accept these status codes -accept = ["100..=103", "200..=299", "403..=403", "502..=502"] +accept = ["100..=103", "200..=299", "403..=403", "502..=502"] \ No newline at end of file diff --git a/package.json b/package.json index b1690e4f0..08b2b6dc1 100644 --- a/package.json +++ b/package.json @@ -3,12 +3,13 @@ "version": "0.0.1", "description": "Optimism Docs", "scripts": { - "lint": "eslint . --ext mdx --max-warnings 0 && pnpm spellcheck:lint && pnpm check-breadcrumbs", + "lint": "eslint . --ext mdx --max-warnings 0 && pnpm spellcheck:lint && pnpm check-breadcrumbs && pnpm check-redirects", "fix": "eslint . --ext mdx --fix && pnpm spellcheck:fix && pnpm check-breadcrumbs", "spellcheck:lint": "cspell lint \"**/*.mdx\"", "spellcheck:fix": "cspell --words-only --unique \"**/*.mdx\" | sort --ignore-case | uniq > words.txt", "linkcheck": "lychee --config ./lychee.toml --quiet \"./pages\"", "breadcrumbs":"npx ts-node --skip-project utils/create-breadcrumbs.ts", + "check-redirects": "npx ts-node --skip-project utils/redirects.ts", "check-breadcrumbs":"npx ts-node --skip-project utils/breadcrumbs.ts", "index:docs": "npx ts-node --skip-project utils/algolia-indexer.ts", "dev": "next dev", diff --git a/pages/stack/features/send-raw-transaction-conditional.mdx b/pages/stack/features/send-raw-transaction-conditional.mdx index 5717ae5e8..75cb7e8c5 100644 --- a/pages/stack/features/send-raw-transaction-conditional.mdx +++ b/pages/stack/features/send-raw-transaction-conditional.mdx @@ -56,8 +56,8 @@ Successful submission does **NOT** guarantee inclusion! The caller must observe This feature can be enabled with the addition of a flag to op-geth. * `--rollup.sequencertxconditionalenabled` (default: false) a boolean flag which enables the rpc. -* `--rollup.sequencertxconditionalcostratelimit` (default: 5000) an integer flag that sets the rate limit for cost observable per second. +* `--rollup.sequencertxconditionalcostratelimit` (default: 5000) an integer flag that sets the rate limit for cost observable per second. - It is not advised to publicly expose this sequencer endpoint due to DoS concerns. This supplemental proxy, [op-txproxy](/stack/operators/features/op-txproxy), should be used to apply additional constraints on this endpoint prior to passing through to the sequencer. + It is not advised to publicly expose this sequencer endpoint due to DoS concerns. This supplemental proxy, [op-txproxy](/builders/chain-operators/tools/op-txproxy), should be used to apply additional constraints on this endpoint prior to passing through to the sequencer. diff --git a/pages/stack/interop/assets/deploy-superchain-erc20.mdx b/pages/stack/interop/assets/deploy-superchain-erc20.mdx index af506e238..19b1917aa 100644 --- a/pages/stack/interop/assets/deploy-superchain-erc20.mdx +++ b/pages/stack/interop/assets/deploy-superchain-erc20.mdx @@ -13,7 +13,7 @@ import { Steps } from 'nextra/components' Interop is currently in active development and not yet ready for production use. The information provided here may change. Check back regularly for the most up-to-date information.
-This guide explains how to issue new assets with the `SuperchainERC20` and bridge them effectively using the `SuperchainERC20Bridge`. If you want more information about the `SuperchainERC20 standard`, see our [`SuperchainERC20` standard explainer](/stack/interop/superchain-erc20) +This guide explains how to issue new assets with the `SuperchainERC20` and bridge them effectively using the `SuperchainERC20Bridge`. If you want more information about the `SuperchainERC20 standard`, see our [`SuperchainERC20` standard explainer](/stack/interop/assets/superchain-erc20) Note that bridging assets through the Superchain using `SuperchainERC20` never affects the total supply of your asset. The supply remains fixed, and bridging only changes the chain on which your asset is located. This keeps the token's total amount the same across all networks, ensuring its value stays stable during the move and that the `SuperchainERC20` retains a unified, global supply count. diff --git a/pages/stack/interop/explainer.mdx b/pages/stack/interop/explainer.mdx index b52b28800..3f84e1b0f 100644 --- a/pages/stack/interop/explainer.mdx +++ b/pages/stack/interop/explainer.mdx @@ -24,7 +24,7 @@ Native OP Stack interoperability provides the ability to read messages and trans Superchain interop includes both the protocol layer message passing and the Superchain ERC20 token specification. * **Message passing protocol:** the initial + finalizing/executing [message](cross-chain-message) that fire events to be consumed by the chains in the [dependency set](https://specs.optimism.io/interop/dependency-set.html) -* **SuperchainERC20 token specification**: the [SuperchainERC20](superchain-erc20) turns message passing into asset transfer between chains in the interop set. Learn more about how the SuperchainERC20 token standard enables asset interoperability in the Superchain [here](/stack/interop/superchain-erc20) +* **SuperchainERC20 token specification**: the [SuperchainERC20](superchain-erc20) turns message passing into asset transfer between chains in the interop set. Learn more about how the SuperchainERC20 token standard enables asset interoperability in the Superchain [here](/stack/interop/assets/superchain-erc20) This means ETH and ERC-20s can seamlessly and securely move across L2s, and intent-based protocols (i.e., bridges) can build better experiences on top of the message passing protocol. diff --git a/utils/redirects.ts b/utils/redirects.ts new file mode 100644 index 000000000..bd2cb66b1 --- /dev/null +++ b/utils/redirects.ts @@ -0,0 +1,135 @@ +import * as fs from 'fs/promises'; +import * as path from 'path'; + +const rootDir = path.join(process.cwd(), 'pages'); +const redirectsPath = path.join(process.cwd(), 'public', '_redirects'); +const warnings: string[] = []; + +// ANSI color codes +const WHITE = '\x1b[37m'; +const GREEN = '\x1b[32m'; +const YELLOW = '\x1b[33m'; +const RESET = '\x1b[0m'; +const BOLD = '\x1b[1m'; + +interface Redirect { + from: string; + to: string; +} + +interface Summary { + total: number; + ok: number; + errors: number; +} + +function formatWarning(filePath: string, fromLink: string, toLink: string): string { + return `${WHITE}File "${filePath}" contains outdated link ${YELLOW}"${fromLink}"${WHITE} - should be updated to ${GREEN}"${toLink}"${RESET}`; +} + +async function getRedirects(): Promise { + const content = await fs.readFile(redirectsPath, 'utf-8'); + return content.split('\n') + .filter(line => line.trim() && !line.startsWith('#')) + .map(line => { + const [from, to] = line.split(/\s+/); + return { from, to }; + }); +} + +async function findMdxFiles(dir: string): Promise { + const files: string[] = []; + const entries = await fs.readdir(dir, { withFileTypes: true }); + + for (const entry of entries) { + const fullPath = path.join(dir, entry.name); + if (entry.isDirectory() && !entry.name.startsWith('_')) { + files.push(...await findMdxFiles(fullPath)); + } else if (entry.isFile() && /\.(md|mdx)$/.test(entry.name)) { + files.push(fullPath); + } + } + return files; +} + +function extractLinks(content: string): string[] { + const markdownLinkRegex = /\[([^\]]+)\]\(([^)]+)\)/g; + const hrefRegex = /href="([^"]+)"/g; + const links: string[] = []; + + let match; + while ((match = markdownLinkRegex.exec(content)) !== null) { + if (!match[2].startsWith('http')) { + links.push(match[2]); + } + } + while ((match = hrefRegex.exec(content)) !== null) { + if (!match[1].startsWith('http')) { + links.push(match[1]); + } + } + return links; +} + +async function checkFile(filePath: string, redirects: Redirect[]): Promise { + const content = await fs.readFile(filePath, 'utf-8'); + const links = extractLinks(content); + const relativeFilePath = path.relative(rootDir, filePath); + + links.forEach(link => { + const redirect = redirects.find(r => r.from === link); + if (redirect) { + warnings.push(formatWarning(relativeFilePath, link, redirect.to)); + } + }); +} + +function printSummary(summary: Summary) { + console.log('\nSummary:'); + console.log(`${WHITE}Total pages 🔍 - ${summary.total}`); + console.log(`${YELLOW}Pages broken 🚫 - ${summary.errors}`); + console.log(`${GREEN}Pages OK ✅ - ${summary.ok}${RESET}`); +} + +async function main() { + const summary: Summary = { + total: 0, + ok: 0, + errors: 0 + }; + + console.log('Starting redirect link check...'); + console.log('Root directory:', rootDir); + + try { + const redirects = await getRedirects(); + const files = await findMdxFiles(rootDir); + + summary.total = files.length; + + for (const file of files) { + await checkFile(file, redirects); + } + + summary.errors = warnings.length; + summary.ok = summary.total - summary.errors; + + if (warnings.length > 0) { + console.log(`${YELLOW}${BOLD}Links that need updating:${RESET}`); + warnings.forEach(warning => console.log(warning)); + printSummary(summary); + process.exit(1); + } else { + console.log(`${GREEN}All internal links are up to date.${RESET}`); + printSummary(summary); + } + } catch (error) { + console.error(`${YELLOW}${BOLD}Error checking redirects:${RESET}`, error); + process.exit(1); + } +} + +main().catch(error => { + console.error(`${YELLOW}${BOLD}Error in main process:${RESET}`, error); + process.exit(1); +}); \ No newline at end of file From 3f525de4f531e5b54d871bcc04cf1a98c8edff4f Mon Sep 17 00:00:00 2001 From: krofax Date: Fri, 15 Nov 2024 16:14:10 +0100 Subject: [PATCH 534/565] updated the link checker --- package.json | 3 +- pages/builders.mdx | 2 +- pages/builders/app-developers/overview.mdx | 6 +- .../tutorials/cross-dom-bridge-erc20.mdx | 2 +- pages/builders/chain-operators/tutorials.mdx | 2 +- pages/chain/getting-started.mdx | 2 +- pages/chain/testing/dev-node.mdx | 2 +- pages/index.mdx | 2 +- pages/stack/differences.mdx | 4 +- pages/stack/getting-started.mdx | 2 +- utils/fix-redirects.ts | 126 ++++++++++++++++++ words.txt | 9 -- 12 files changed, 140 insertions(+), 22 deletions(-) create mode 100644 utils/fix-redirects.ts diff --git a/package.json b/package.json index 08b2b6dc1..733b523eb 100644 --- a/package.json +++ b/package.json @@ -4,12 +4,13 @@ "description": "Optimism Docs", "scripts": { "lint": "eslint . --ext mdx --max-warnings 0 && pnpm spellcheck:lint && pnpm check-breadcrumbs && pnpm check-redirects", - "fix": "eslint . --ext mdx --fix && pnpm spellcheck:fix && pnpm check-breadcrumbs", + "fix": "eslint . --ext mdx --fix && pnpm spellcheck:fix && pnpm check-breadcrumbs && pnpm fix-redirects", "spellcheck:lint": "cspell lint \"**/*.mdx\"", "spellcheck:fix": "cspell --words-only --unique \"**/*.mdx\" | sort --ignore-case | uniq > words.txt", "linkcheck": "lychee --config ./lychee.toml --quiet \"./pages\"", "breadcrumbs":"npx ts-node --skip-project utils/create-breadcrumbs.ts", "check-redirects": "npx ts-node --skip-project utils/redirects.ts", + "fix-redirects": "npx ts-node --skip-project utils/fix-redirects.ts", "check-breadcrumbs":"npx ts-node --skip-project utils/breadcrumbs.ts", "index:docs": "npx ts-node --skip-project utils/algolia-indexer.ts", "dev": "next dev", diff --git a/pages/builders.mdx b/pages/builders.mdx index ab69e59b6..98f4178cf 100644 --- a/pages/builders.mdx +++ b/pages/builders.mdx @@ -15,6 +15,6 @@ Welcome to the Builders section. Here you'll find resources and guides for devel - + diff --git a/pages/builders/app-developers/overview.mdx b/pages/builders/app-developers/overview.mdx index 21bed4d47..e38817e46 100644 --- a/pages/builders/app-developers/overview.mdx +++ b/pages/builders/app-developers/overview.mdx @@ -16,14 +16,14 @@ In this area of the Optimism Docs you'll find everything you need to know about If you're brand new to OP Mainnet, try starting with the guide on [deploying a basic contract](/chain/getting-started). It'll get you familiar with the basic steps required to get a contract deployed to the network. OP Mainnet is [EVM equivalent](https://web.archive.org/web/20231127160757/https://medium.com/ethereum-optimism/introducing-evm-equivalence-5c2021deb306) so you can feel confident that your existing Ethereum smart contract skills will carry over to OP Mainnet. -Just make sure to be aware of the few small [differences between Ethereum and OP Mainnet](/chain/differences). +Just make sure to be aware of the few small [differences between Ethereum and OP Mainnet](/stack/differences). You might also want to check out the [testing on OP Networks guide](/chain/testing/testing-apps) and the tutorial on [running a local development environment](/chain/testing/dev-node) to help you feel totally confident in your OP Mainnet deployment. - } /> + } /> - } /> + } /> } /> diff --git a/pages/builders/app-developers/tutorials/cross-dom-bridge-erc20.mdx b/pages/builders/app-developers/tutorials/cross-dom-bridge-erc20.mdx index c2de64336..883e4908c 100644 --- a/pages/builders/app-developers/tutorials/cross-dom-bridge-erc20.mdx +++ b/pages/builders/app-developers/tutorials/cross-dom-bridge-erc20.mdx @@ -31,7 +31,7 @@ Make sure to check out the [Standard Bridge guide](/builders/app-developers/brid The Optimism SDK supports any of the [Superchain networks](/chain/networks). [Some Superchain networks](https://sdk.optimism.io/enums/l2chainid) are already included in the SDK by default. -If you want to use a network that isn't included by default, you can simply [instantiate the SDK with the appropriate contract addresses](/builders/chain-operators/tutorials/sdk). +If you want to use a network that isn't included by default, you can simply [instantiate the SDK with the appropriate contract addresses](/builders/app-developers/overview). ## Dependencies diff --git a/pages/builders/chain-operators/tutorials.mdx b/pages/builders/chain-operators/tutorials.mdx index e78b0bd6b..6b2387f7a 100644 --- a/pages/builders/chain-operators/tutorials.mdx +++ b/pages/builders/chain-operators/tutorials.mdx @@ -23,5 +23,5 @@ This section provides information on adding attributes to the derivation functio - + diff --git a/pages/chain/getting-started.mdx b/pages/chain/getting-started.mdx index cf9703d44..d4af9faea 100644 --- a/pages/chain/getting-started.mdx +++ b/pages/chain/getting-started.mdx @@ -11,7 +11,7 @@ import { Steps } from 'nextra/components' This guide explains the basics of OP Mainnet development. OP Mainnet is [EVM equivalent](https://web.archive.org/web/20231127160757/https://medium.com/ethereum-optimism/introducing-evm-equivalence-5c2021deb306), meaning we run a slightly modified version of the same `geth` you run on mainnet. Therefore, the differences between OP Mainnet development and Ethereum development are minor. -But a few differences [do exist](/chain/differences). +But a few differences [do exist](/stack/differences). ## OP Mainnet and OP Sepolia endpoint URLs diff --git a/pages/chain/testing/dev-node.mdx b/pages/chain/testing/dev-node.mdx index 477176e7d..6471f9876 100644 --- a/pages/chain/testing/dev-node.mdx +++ b/pages/chain/testing/dev-node.mdx @@ -24,7 +24,7 @@ We generally recommend using the local development environment if your applicati 1. **You're building contracts on both OP Mainnet and Ethereum that need to interact with one another.** The local development environment is a great way to quickly test interactions between L1 and L2. The OP Mainnet and test networks have a communication delay between L1 and L2 that can make testing slow during the early stages of development. -2. **You're building an application that might be subject to one of the few [differences between Ethereum and OP Mainnet](/chain/differences).** Although OP Mainnet is [EVM equivalent](https://web.archive.org/web/20231127160757/https://medium.com/ethereum-optimism/introducing-evm-equivalence-5c2021deb306), it's not exactly the same as Ethereum. If you're building an application that might be subject to one of these differences, you should use the local development environment to double check that everything is running as expected. You might otherwise have unexpected issues when you move to testnet. We strongly recommend reviewing these differences carefully to see if you might fall into this category. +2. **You're building an application that might be subject to one of the few [differences between Ethereum and OP Mainnet](/stack/differences).** Although OP Mainnet is [EVM equivalent](https://web.archive.org/web/20231127160757/https://medium.com/ethereum-optimism/introducing-evm-equivalence-5c2021deb306), it's not exactly the same as Ethereum. If you're building an application that might be subject to one of these differences, you should use the local development environment to double check that everything is running as expected. You might otherwise have unexpected issues when you move to testnet. We strongly recommend reviewing these differences carefully to see if you might fall into this category. However, not everyone will need to use the local development environment. OP Mainnet is [EVM equivalent](https://web.archive.org/web/20231127160757/https://medium.com/ethereum-optimism/introducing-evm-equivalence-5c2021deb306), which means that OP Mainnet looks almost exactly like Ethereum under the hood. diff --git a/pages/index.mdx b/pages/index.mdx index 15d4aebdd..fa4175ccc 100644 --- a/pages/index.mdx +++ b/pages/index.mdx @@ -22,7 +22,7 @@ Whether you're a developer building a app on OP Mainnet, a node operator running } /> - } /> + } /> } /> diff --git a/pages/stack/differences.mdx b/pages/stack/differences.mdx index 9d6e6250c..5f370f4b0 100644 --- a/pages/stack/differences.mdx +++ b/pages/stack/differences.mdx @@ -16,11 +16,11 @@ However, there are some minor differences between the behavior of Ethereum and O ### Bridging - Deposit Transactions -Deposit transactions don't exist on L1's, and are how transactions on an L2 can be initiated from the L1. Importantly, this is how bridge applications can get L1 ETH or tokens into an L2 OP Stack chain. You can read more on deposit transactions [here](/stack/protocol/rollup/deposit-flow). +Deposit transactions don't exist on L1's, and are how transactions on an L2 can be initiated from the L1. Importantly, this is how bridge applications can get L1 ETH or tokens into an L2 OP Stack chain. You can read more on deposit transactions [here](/stack/transactions/deposit-flow). ### Bridging - Withdrawal Transactions and Fault Proofs -Withdrawal transactions are how the state of the L2 rollup can be proven to the L1. Often this involves users withdrawing tokens or ETH to the L1. Fault proofs are the mechanism by which withdrawal transactions are currently proven to the L1. You can read more about fault proofs [here](/stack/protocol/fault-proofs/explainer). +Withdrawal transactions are how the state of the L2 rollup can be proven to the L1. Often this involves users withdrawing tokens or ETH to the L1. Fault proofs are the mechanism by which withdrawal transactions are currently proven to the L1. You can read more about fault proofs [here](/stack/fault-proofs/explainer). ## Opcodes diff --git a/pages/stack/getting-started.mdx b/pages/stack/getting-started.mdx index 67096b0dc..a3f5a13a2 100644 --- a/pages/stack/getting-started.mdx +++ b/pages/stack/getting-started.mdx @@ -16,7 +16,7 @@ import { Callout } from 'nextra/components' The OP Stack consists of the many different software components managed and maintained by the Optimism Collective that, together, form the backbone of Optimism. The OP Stack is built as a public good for the Ethereum and Optimism ecosystems. -To understand how to operate an OP Stack chain, including roll-up and chain deployment basics, visit [Chain Operator guide](/builders/chain-operators/self-hosted). Check out these guides to get an overview of everything you need to know to properly support OP mainnet within your [exchange](/builders/cex-wallet-developers/cex-support) and [wallet](/builders/cex-wallet-developers/wallet-support). +To understand how to operate an OP Stack chain, including roll-up and chain deployment basics, visit [Chain Operator guide](/builders/chain-operators/self-hosted). Check out these guides to get an overview of everything you need to know to properly support OP mainnet within your [exchange](/builders/app-developers/overview) and [wallet](/builders/app-developers/overview). ## The OP Stack powers Optimism diff --git a/utils/fix-redirects.ts b/utils/fix-redirects.ts new file mode 100644 index 000000000..5d609c20b --- /dev/null +++ b/utils/fix-redirects.ts @@ -0,0 +1,126 @@ +import * as fs from 'fs/promises'; +import * as path from 'path'; + +const rootDir = path.join(process.cwd(), 'pages'); +const redirectsPath = path.join(process.cwd(), 'public', '_redirects'); +const updates: string[] = []; + +// ANSI color codes +const WHITE = '\x1b[37m'; +const GREEN = '\x1b[32m'; +const YELLOW = '\x1b[33m'; +const RESET = '\x1b[0m'; +const BOLD = '\x1b[1m'; + +interface Redirect { + from: string; + to: string; +} + +interface Summary { + total: number; + fixed: number; + skipped: number; +} + +async function getRedirects(): Promise { + const content = await fs.readFile(redirectsPath, 'utf-8'); + return content.split('\n') + .filter(line => line.trim() && !line.startsWith('#')) + .map(line => { + const [from, to] = line.split(/\s+/); + return { from, to }; + }); +} + +async function findMdxFiles(dir: string): Promise { + const files: string[] = []; + const entries = await fs.readdir(dir, { withFileTypes: true }); + + for (const entry of entries) { + const fullPath = path.join(dir, entry.name); + if (entry.isDirectory() && !entry.name.startsWith('_')) { + files.push(...await findMdxFiles(fullPath)); + } else if (entry.isFile() && /\.(md|mdx)$/.test(entry.name)) { + files.push(fullPath); + } + } + return files; +} + +async function fixFile(filePath: string, redirects: Redirect[]): Promise { + let content = await fs.readFile(filePath, 'utf-8'); + let hasChanges = false; + const relativeFilePath = path.relative(rootDir, filePath); + + redirects.forEach(redirect => { + const markdownRegex = new RegExp(`\\[([^\\]]+)\\]\\(${redirect.from}\\)`, 'g'); + const hrefRegex = new RegExp(`href="${redirect.from}"`, 'g'); + + if (content.match(markdownRegex) || content.match(hrefRegex)) { + content = content + .replace(markdownRegex, `[$1](${redirect.to})`) + .replace(hrefRegex, `href="${redirect.to}"`); + + updates.push(`${WHITE}Fixed in "${relativeFilePath}": ${YELLOW}${redirect.from}${WHITE} → ${GREEN}${redirect.to}${RESET}`); + hasChanges = true; + } + }); + + if (hasChanges) { + await fs.writeFile(filePath, content); + } + + return hasChanges; +} + +function printSummary(summary: Summary) { + console.log('\nSummary:'); + console.log(`${WHITE}Total files 🔍 - ${summary.total}`); + console.log(`${GREEN}Files fixed ✅ - ${summary.fixed}`); + console.log(`${WHITE}Files skipped ⏭️ - ${summary.skipped}${RESET}`); +} + +async function main() { + const summary: Summary = { + total: 0, + fixed: 0, + skipped: 0 + }; + + console.log('Starting to fix redirect links...'); + console.log('Root directory:', rootDir); + + try { + const redirects = await getRedirects(); + const files = await findMdxFiles(rootDir); + + summary.total = files.length; + + for (const file of files) { + const wasFixed = await fixFile(file, redirects); + if (wasFixed) { + summary.fixed++; + } else { + summary.skipped++; + } + } + + if (updates.length > 0) { + console.log(`${GREEN}${BOLD}Fixed links:${RESET}`); + updates.forEach(update => console.log(update)); + printSummary(summary); + } else { + console.log(`${GREEN}No broken links found. Everything is up to date.${RESET}`); + printSummary(summary); + } + } catch (error) { + console.error(`${YELLOW}${BOLD}Error fixing redirects:${RESET}`, error); + process.exit(1); + } +} + +main().catch(error => { + console.error(`${YELLOW}${BOLD}Error in main process:${RESET}`, error); + process.exit(1); +}); \ No newline at end of file diff --git a/words.txt b/words.txt index f5ae76fbc..0efd003b6 100644 --- a/words.txt +++ b/words.txt @@ -10,7 +10,6 @@ Allnodes Allocs allocs ANDI -Ankr Apeworx Arweave authrpc @@ -150,7 +149,6 @@ holesky IERC IGNOREPRICE ignoreprice -Immunefi implicity Inator inator @@ -200,7 +198,6 @@ minsuggestedpriorityfee Mintable Mintplex MIPSEVM -Mitigations Monitorism Moralis Mordor @@ -295,8 +292,6 @@ Proxied Proxyd proxyd pseudorandomly -Pyth -Pyth's QRNG Quicknode quicknode @@ -331,9 +326,6 @@ safedb Schnorr secp SELFDESTRUCT -SEPOLIA -Sepolia -sepolia seqnr SEQUENCERHTTP sequencerhttp @@ -404,7 +396,6 @@ VMDEBUG vmdebug VMODULE vmodule -voxel Warpcast xlarge XORI From 7e72b2b43f458d3c2580c443ae069d378293f3de Mon Sep 17 00:00:00 2001 From: krofax Date: Fri, 15 Nov 2024 16:32:07 +0100 Subject: [PATCH 535/565] Documented the steps involved to automate the redirect --- notes/fix-redirects.md | 83 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 notes/fix-redirects.md diff --git a/notes/fix-redirects.md b/notes/fix-redirects.md new file mode 100644 index 000000000..206c09c83 --- /dev/null +++ b/notes/fix-redirects.md @@ -0,0 +1,83 @@ +# Redirect links management guide + +## Scripts overview +Two scripts help maintain internal links when pages are redirect: + +* `check-redirects`: Identifies links that need updating based on the `_redirects` file. +* `fix-redirects`: Automatically updates links to match `_redirects` entries. + +## Checking for broken links + +Run the check script: + +```bash +pnpm check-redirects //OR +pnpm lint +``` +## What it does + +* Scans all `.mdx` files in the docs +* Compares internal links against `_redirects` file +* Reports any outdated links that need updating +* Provides a summary of total, broken, and valid links + +## Example output + +```bash +File "builders/overview.mdx" contains outdated link "/chain/overview" - should be updated to "/stack/overview" + +Summary: +Total pages 🔍 - 50 +Pages broken 🚫 - 2 +Pages OK ✅ - 48 + +``` + +## Fixing broken links + +Fix links automatically: + +```bash +pnpm fix-redirects //OR +pnpm fix +``` + +## What it does + +* Updates all internal links to match `_redirects` entries +* Preserves other content and formatting +* Shows which files and links were updated +* Provides a summary of changes made + +## Example output + +```bash +Fixed in "builders/overview.mdx": /chain/overview → /stack/overview + +Summary: +Total files 🔍 - 50 +Files fixed ✅ - 2 +Files skipped ⏭️ - 48 +``` + +## Best practices + +1. Before running + + * Commit current changes + * Review `_redirects` file is up-to-date + * Run `check-redirects` first to preview changes + + +2. After running + + * Review git diff of updated files + * Test updated links locally + * Commit changes with descriptive message + + + +## Common issues + +* Script fails: Ensure `_redirects` file exists in public folder, it should always be there! +* No broken links found: Verify `_redirects` entries are correct. \ No newline at end of file From de92cb6588c61403cfa6b418019a970ce149f1f6 Mon Sep 17 00:00:00 2001 From: krofax Date: Fri, 15 Nov 2024 16:35:50 +0100 Subject: [PATCH 536/565] revert changes made in lychee --- lychee.toml | 3 --- 1 file changed, 3 deletions(-) diff --git a/lychee.toml b/lychee.toml index 9ecd097e5..adae3d229 100644 --- a/lychee.toml +++ b/lychee.toml @@ -13,9 +13,6 @@ remap = [ "file:///(.*?)/pages/img/(.*) file:///$1/public/img/$2", "file:///(.*?)/pages/resources/(.*) file:///$1/public/resources/$2", "file:///([^#.?]+)(#.*)?$ file:///$1.mdx$2", - "file:///([^#]+)#.*$ file:///$1.mdx", - "/([^#]+)#.*$ file:///pages/$1.mdx", - "^/([^#]+)$ file:///pages/$1.mdx", "\\\\& &" ] From d69fb35470d5564c5c6000abc9be95b4b2cc9a25 Mon Sep 17 00:00:00 2001 From: krofax Date: Fri, 15 Nov 2024 16:37:43 +0100 Subject: [PATCH 537/565] revert previous changes to lychee file --- lychee.toml | 3 --- 1 file changed, 3 deletions(-) diff --git a/lychee.toml b/lychee.toml index adae3d229..73b34c1e3 100644 --- a/lychee.toml +++ b/lychee.toml @@ -27,9 +27,6 @@ exclude_loopback = true # Exclude all mail addresses from checking. exclude_mail = true -# Exclude all external links except ethereum-optimism GitHub -exclude_links = ['http[s]?://(?!github\.com/ethereum-optimism).*'] - # Exclude RPC URLs from checking. exclude = [ 'https://mainnet.optimism.io', From 1d4dea4de3f0249130a26445e28d7d984c95a83e Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Fri, 15 Nov 2024 17:20:15 +0100 Subject: [PATCH 538/565] Update notes/fix-redirects.md Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> --- notes/fix-redirects.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/notes/fix-redirects.md b/notes/fix-redirects.md index 206c09c83..1bcb28afe 100644 --- a/notes/fix-redirects.md +++ b/notes/fix-redirects.md @@ -1,7 +1,7 @@ # Redirect links management guide ## Scripts overview -Two scripts help maintain internal links when pages are redirect: +Two scripts help maintain internal links when pages are redirected: * `check-redirects`: Identifies links that need updating based on the `_redirects` file. * `fix-redirects`: Automatically updates links to match `_redirects` entries. From 10ecb2b0037abe449948407ce6c69478cff05e94 Mon Sep 17 00:00:00 2001 From: krofax Date: Fri, 15 Nov 2024 18:22:39 +0100 Subject: [PATCH 539/565] fix lint issues --- next-env.d.ts | 2 +- words.txt | 9 +++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/next-env.d.ts b/next-env.d.ts index 4f11a03dc..a4a7b3f5c 100644 --- a/next-env.d.ts +++ b/next-env.d.ts @@ -2,4 +2,4 @@ /// // NOTE: This file should not be edited -// see https://nextjs.org/docs/basic-features/typescript for more information. +// see https://nextjs.org/docs/pages/building-your-application/configuring/typescript for more information. diff --git a/words.txt b/words.txt index 0efd003b6..f5ae76fbc 100644 --- a/words.txt +++ b/words.txt @@ -10,6 +10,7 @@ Allnodes Allocs allocs ANDI +Ankr Apeworx Arweave authrpc @@ -149,6 +150,7 @@ holesky IERC IGNOREPRICE ignoreprice +Immunefi implicity Inator inator @@ -198,6 +200,7 @@ minsuggestedpriorityfee Mintable Mintplex MIPSEVM +Mitigations Monitorism Moralis Mordor @@ -292,6 +295,8 @@ Proxied Proxyd proxyd pseudorandomly +Pyth +Pyth's QRNG Quicknode quicknode @@ -326,6 +331,9 @@ safedb Schnorr secp SELFDESTRUCT +SEPOLIA +Sepolia +sepolia seqnr SEQUENCERHTTP sequencerhttp @@ -396,6 +404,7 @@ VMDEBUG vmdebug VMODULE vmodule +voxel Warpcast xlarge XORI From 83db1024c059ea0b2d87deae0a7e06334a0ef63d Mon Sep 17 00:00:00 2001 From: krofax Date: Fri, 15 Nov 2024 18:24:31 +0100 Subject: [PATCH 540/565] update the command --- notes/fix-redirects.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/notes/fix-redirects.md b/notes/fix-redirects.md index 1bcb28afe..fdb47fdb1 100644 --- a/notes/fix-redirects.md +++ b/notes/fix-redirects.md @@ -11,8 +11,8 @@ Two scripts help maintain internal links when pages are redirected: Run the check script: ```bash -pnpm check-redirects //OR -pnpm lint +pnpm lint //OR +pnpm check-redirects ``` ## What it does @@ -38,8 +38,8 @@ Pages OK ✅ - 48 Fix links automatically: ```bash -pnpm fix-redirects //OR -pnpm fix +pnpm fix //OR +pnpm fix-redirects ``` ## What it does From 2da87a67a0bbecaba51c65fd9f7e8a2cb9290611 Mon Sep 17 00:00:00 2001 From: krofax Date: Fri, 15 Nov 2024 18:36:30 +0100 Subject: [PATCH 541/565] revert changes --- next-env.d.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/next-env.d.ts b/next-env.d.ts index a4a7b3f5c..4f11a03dc 100644 --- a/next-env.d.ts +++ b/next-env.d.ts @@ -2,4 +2,4 @@ /// // NOTE: This file should not be edited -// see https://nextjs.org/docs/pages/building-your-application/configuring/typescript for more information. +// see https://nextjs.org/docs/basic-features/typescript for more information. From 603f6cea422d3500785cacdb5a608ba1862fe906 Mon Sep 17 00:00:00 2001 From: codeesura <120671243+codeesura@users.noreply.github.com> Date: Fri, 15 Nov 2024 22:04:31 +0300 Subject: [PATCH 542/565] docs: fix SuperchainERC20 deployment guide URL --- pages/stack/interop/assets/superchain-erc20.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/stack/interop/assets/superchain-erc20.mdx b/pages/stack/interop/assets/superchain-erc20.mdx index fab6af88e..0fb654df9 100644 --- a/pages/stack/interop/assets/superchain-erc20.mdx +++ b/pages/stack/interop/assets/superchain-erc20.mdx @@ -81,7 +81,7 @@ Application developers must do two things to make their tokens `SuperchainERC20` For now, application developers should view `SuperchainERC20`as ERC20 tokens with additional built-in functions that allow cross-chain asset movement that will be enabled once Interop goes live. -For step-by-step information on implementing SuperchainERC20, see [Deploy assets using SuperchainERC20](/stack/interop/deploy-superchain-erc20) +For step-by-step information on implementing SuperchainERC20, see [Deploy assets using SuperchainERC20](/stack/interop/assets/deploy-superchain-erc20) To enable asset interoperability, `SuperchainERC20` must give access to the address where the future `SuperchainERC20Bridge` will live. From 153b1b05f5a6310293c3d8bb61ce6110ea4826e7 Mon Sep 17 00:00:00 2001 From: alan <652732310@qq.com> Date: Sat, 16 Nov 2024 12:36:23 +0800 Subject: [PATCH 543/565] fix op-deployer commands --- pages/builders/chain-operators/tools/op-deployer.mdx | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/pages/builders/chain-operators/tools/op-deployer.mdx b/pages/builders/chain-operators/tools/op-deployer.mdx index 6f5aba921..cd522696f 100644 --- a/pages/builders/chain-operators/tools/op-deployer.mdx +++ b/pages/builders/chain-operators/tools/op-deployer.mdx @@ -138,16 +138,16 @@ Inspect the `state.json` file by navigating to your working directory. With the ``` cd .deployer -op-deployer --workdir .deployer inspect genesis > genesis.json -op-deployer --workdir .deployer inspect rollup > rollup.json +op-deployer inspect genesis --workdir .deployer > genesis.json +op-deployer inspect rollup --workdir .deployer > rollup.json ``` Now that you have your `genesis.json` and `rollup.json` you can spin up a node on your network. You can also use the following inspect subcommands to get additional data: ``` -op-deployer --workdir .deployer inspect l1 # outputs all L1 contract addresses for an L2 chain -op-deployer --workdir .deployer inspect deploy-config # outputs the deploy config for an L2 chain -op-deployer --workdir .deployer inspect l2-semvers # outputs the semvers for all L2 chains +op-deployer inspect l1 --workdir .deployer # outputs all L1 contract addresses for an L2 chain +op-deployer inspect deploy-config --workdir .deployer # outputs the deploy config for an L2 chain +op-deployer inspect l2-semvers --workdir .deployer # outputs the semvers for all L2 chains ``` From fb4948906b6cba31a634e012844dbe55a03c4952 Mon Sep 17 00:00:00 2001 From: Bryer <0xbryer@gmail.com> Date: Sun, 17 Nov 2024 11:45:43 +0200 Subject: [PATCH 544/565] Typo Update OpProposerDescriptionShort.md Fix incorrect preposition in the description of op-proposer service --- content/OpProposerDescriptionShort.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/OpProposerDescriptionShort.md b/content/OpProposerDescriptionShort.md index 08f3f9282..babd3da55 100644 --- a/content/OpProposerDescriptionShort.md +++ b/content/OpProposerDescriptionShort.md @@ -1 +1 @@ -`op-proposer` is the service that submits the output roots to the L1. This is to enable trustless execution of L2-to-L1 messaging and creates the view into the L2 state from the L1's perspective. \ No newline at end of file +`op-proposer` is the service that submits the output roots to the L1. This is to enable trustless execution of L2-to-L1 messaging and creates the view of the L2 state from the L1's perspective. From bd61537941534d0183ff49b99e9e8f08777366d1 Mon Sep 17 00:00:00 2001 From: Hopium <135053852+Hopium21@users.noreply.github.com> Date: Mon, 18 Nov 2024 12:44:06 +0100 Subject: [PATCH 545/565] Update addresses.mdx --- pages/chain/addresses.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/chain/addresses.mdx b/pages/chain/addresses.mdx index eb1e0d7ef..b768b476d 100644 --- a/pages/chain/addresses.mdx +++ b/pages/chain/addresses.mdx @@ -15,7 +15,7 @@ This reference guide lists all the contract addresses for Mainnet and Testnet, a See the [Smart Contracts Overview](/stack/smart-contracts) for high-level details and access to the source code. -This page is automatically generated from packages in the [superchain-registry](https://github.com/ethereum-optimism/superchain-registry/tree/main) which keeps the content synched and up-to-date. +This page is automatically generated from packages in the [superchain-registry](https://github.com/ethereum-optimism/superchain-registry/tree/main) which keeps the content synced and up-to-date. ## Mainnet From a1519e5740f4ae8866a6c935c6e3042f8e5f0bec Mon Sep 17 00:00:00 2001 From: Hopium <135053852+Hopium21@users.noreply.github.com> Date: Mon, 18 Nov 2024 12:45:23 +0100 Subject: [PATCH 546/565] Update security-policy.mdx --- pages/chain/security/security-policy.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/chain/security/security-policy.mdx b/pages/chain/security/security-policy.mdx index 661a510ab..1e50b5093 100644 --- a/pages/chain/security/security-policy.mdx +++ b/pages/chain/security/security-policy.mdx @@ -11,7 +11,7 @@ import { Callout } from 'nextra/components' This page describes general best practices for reporting bugs and provides specific reporting guidelines for OP Stack and OP Mainnet code contained within the [ethereum-optimism](https://github.com/ethereum-optimism) GitHub organization. - **Do not** disclose vulnerabilities publicly or by executing them against a production network. If you do, will you not only be putting users at risk, but you will forfeit your right to a reward. Always follow the appropriate reporting pathways as described below. + **Do not** disclose vulnerabilities publicly or by executing them against a production network. If you do, you will not only be putting users at risk, but you will forfeit your right to a reward. Always follow the appropriate reporting pathways as described below. * **Do not** disclose the vulnerability publicly, for example by filing a public ticket. * **Do not** test the vulnerability on a publicly available network, either the testnet or the mainnet. From 325a0eb3a3eb75c36082bbc8ff21680e82cd33a9 Mon Sep 17 00:00:00 2001 From: Hopium <135053852+Hopium21@users.noreply.github.com> Date: Mon, 18 Nov 2024 12:45:48 +0100 Subject: [PATCH 547/565] Update 404.mdx --- pages/404.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/404.mdx b/pages/404.mdx index ee0616b0c..d3d50ddae 100644 --- a/pages/404.mdx +++ b/pages/404.mdx @@ -1,7 +1,7 @@ --- title: Page Not Found lang: en-US -description: 404 page not found and directs users to submit an git issue. +description: 404 page not found and directs users to submit a git issue. --- # Page Not Found From 4bb22b495483fc5eadf035c7ec15eb04e9c8281a Mon Sep 17 00:00:00 2001 From: Hopium <135053852+Hopium21@users.noreply.github.com> Date: Mon, 18 Nov 2024 12:46:57 +0100 Subject: [PATCH 548/565] Update index.mdx --- pages/index.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/index.mdx b/pages/index.mdx index fa4175ccc..6d4853af9 100644 --- a/pages/index.mdx +++ b/pages/index.mdx @@ -13,7 +13,7 @@ Information about the Optimism Collective's governance, community, and mission c ## Guides for builders -Whether you're a developer building a app on OP Mainnet, a node operator running an OP Mainnet node, or a chain operator launching your own OP Stack chain, you'll find everything you need to get started right here. +Whether you're a developer building an app on OP Mainnet, a node operator running an OP Mainnet node, or a chain operator launching your own OP Stack chain, you'll find everything you need to get started right here. } /> From 9c75da1060a027904ef7b0044c45dfe8d8fe6497 Mon Sep 17 00:00:00 2001 From: Yusuf Kehinde Hussein <41796074+brokewhale@users.noreply.github.com> Date: Tue, 19 Nov 2024 08:53:17 +0100 Subject: [PATCH 549/565] Update oracles.mdx tags --- pages/builders/tools/build/oracles.mdx | 1 + 1 file changed, 1 insertion(+) diff --git a/pages/builders/tools/build/oracles.mdx b/pages/builders/tools/build/oracles.mdx index 77ba3a07f..d3da77ea8 100644 --- a/pages/builders/tools/build/oracles.mdx +++ b/pages/builders/tools/build/oracles.mdx @@ -2,6 +2,7 @@ title: Oracles lang: en-US description: Learn about different oracles and how you can use them to access offchain data onchain as well as random number generation. +tags: ["devops-tooling", "performance-tooling", "eng-devx"] --- import { Callout } from 'nextra/components' From 18d44f345a5f7a666e5e1e4fd01b68e0c3f80096 Mon Sep 17 00:00:00 2001 From: Yusuf Kehinde Hussein <41796074+brokewhale@users.noreply.github.com> Date: Tue, 19 Nov 2024 09:41:02 +0100 Subject: [PATCH 550/565] Update rollup.mdx updated the l2BlockTime to < from <= --- pages/builders/chain-operators/configuration/rollup.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/builders/chain-operators/configuration/rollup.mdx b/pages/builders/chain-operators/configuration/rollup.mdx index 323b0f858..52600572a 100644 --- a/pages/builders/chain-operators/configuration/rollup.mdx +++ b/pages/builders/chain-operators/configuration/rollup.mdx @@ -257,7 +257,7 @@ These fields apply to L2 blocks: Their timing, when they need to be written to L #### l2BlockTime -Number of seconds between each L2 block. Must be \< = L1 block time (12 on mainnet and Sepolia). +Number of seconds between each L2 block. Must be \< L1 block time (12 on mainnet and Sepolia). * **Type:** Number of seconds * **Default value:** None From 4144b0f9431ef85906356f02c2c628421e82c1a5 Mon Sep 17 00:00:00 2001 From: soyboy <85043086+sbvegan@users.noreply.github.com> Date: Tue, 19 Nov 2024 20:04:08 +0800 Subject: [PATCH 551/565] Update pages/404.mdx --- pages/404.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/404.mdx b/pages/404.mdx index d3d50ddae..0726bb9a0 100644 --- a/pages/404.mdx +++ b/pages/404.mdx @@ -1,7 +1,7 @@ --- title: Page Not Found lang: en-US -description: 404 page not found and directs users to submit a git issue. +description: 404 page not found and directs users to submit a GitHub issue. --- # Page Not Found From 10023787af21f11ced211ab4d2dded7131973f5d Mon Sep 17 00:00:00 2001 From: soyboy Date: Tue, 19 Nov 2024 21:09:49 +0800 Subject: [PATCH 552/565] small clean up --- pages/builders/notices/holocene-changes.mdx | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/pages/builders/notices/holocene-changes.mdx b/pages/builders/notices/holocene-changes.mdx index a733e725d..a19fd9a26 100644 --- a/pages/builders/notices/holocene-changes.mdx +++ b/pages/builders/notices/holocene-changes.mdx @@ -28,14 +28,14 @@ For more information on the Holocene implementation details, please review [Holo ## For chain operators -Chain operators have to upgrade their nodes ahead of the activation times to a release that contains the Holocene changes and has the activation times for their chains baked in, or set the activation times manually via overrides. +Chain operators should upgrade their nodes ahead of the activation times to a release that contains the Holocene changes and has the activation times for their chains baked in, or set the activation times manually via overrides. Besides this, chain operators must upgrade their chain's `SystemConfig` to the latest OP Contracts [v1.8.0-rc.1 release](https://github.com/ethereum-optimism/optimism/releases/tag/op-contracts%2Fv1.8.0-rc.1) to utilize the EIP-1559 configurability. The updated `SystemConfig` implementations are deployed at addresses: * Sepolia: TBD * Mainnet: TBD -Chain operators need to update their proxy contracts to point to these new implementations. The following upgrade script can be used to facilitate the upgrade: [https://github.com/ethereum-optimism/optimism/pull/12878](https://github.com/ethereum-optimism/optimism/pull/12878) +Chain operators need to update their proxy contracts to point to these new implementations. An upgrade script in the monorepo can be used to facilitate the upgrade, please follow the instructions in this [README](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts-bedrock/scripts/upgrades/holocene/README.md). Note that it is fine to upgrade the SystemConfig after the Holocene activation. You need to upgrade if you want to reconfigure your EIP-1559 parameters. ### For fault proof enabled chains @@ -46,7 +46,7 @@ The `FaultDisputeGame` and `PermissionedDisputeGame` contracts must be deployed * Sepolia: TBD * Mainnet: TBD -Chain operators need to update the `DisputeGameFactory` to use the new `FaultDisputeGame` and `PermissionedDisputeGame` contracts by calling `DisputeGameFactory.setImplementation`. The following upgrade script can be used to facilitate the upgrade: [https://github.com/ethereum-optimism/optimism/pull/12878](https://github.com/ethereum-optimism/optimism/pull/12878) +Chain operators need to update the `DisputeGameFactory` to use the new `FaultDisputeGame` and `PermissionedDisputeGame` contracts by calling `DisputeGameFactory.setImplementation`. The same upgrade script in the monorepo can be used to facilitate the upgrade, please follow the instructions in this [README](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts-bedrock/scripts/upgrades/holocene/README.md). ## For node operators @@ -57,8 +57,8 @@ These following steps are necessary for every node operator: ### Update to the latest release - * [`op-geth`](FIND_CORRECT_LINK) - * [`op-node`](FIND_CORRECT_LINK) + * [`op-node`, `op-batcher`, and `op-proposer` at `v1.10.0`]() + * [`op-geth` at `v1.101411.2`]() ### Configure the Holocene activation date @@ -78,6 +78,6 @@ These following steps are necessary for every node operator: Make the following checks to verify that your node is properly configured. * `op-node` and `op-geth` will log their configurations at startup - * Check that the Granite time is set to `activation-timestamp` in the op-node startup logs - * Check that the Granite time is set to `activation-timestamp` in the op-geth startup logs + * Check that the Holocene time is set to `activation-timestamp` in the op-node startup logs + * Check that the Holocene time is set to `activation-timestamp` in the op-geth startup logs From f120c66edea68792d13c5808cd0224e685e2d19c Mon Sep 17 00:00:00 2001 From: Blessing Krofegha Date: Tue, 19 Nov 2024 15:31:29 +0100 Subject: [PATCH 553/565] fix lint issues --- words.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/words.txt b/words.txt index f5ae76fbc..01dad65fa 100644 --- a/words.txt +++ b/words.txt @@ -80,6 +80,7 @@ Devnet devnet devnets Devnode +devx direnv DISABLETXPOOLGOSSIP disabletxpoolgossip From daf7f2022d83c2a5c2a171dfdfb8a8bf32c89c56 Mon Sep 17 00:00:00 2001 From: soyboy <85043086+sbvegan@users.noreply.github.com> Date: Wed, 20 Nov 2024 00:09:28 +0800 Subject: [PATCH 554/565] Update pages/builders/notices/holocene-changes.mdx Co-authored-by: Matt Solomon --- pages/builders/notices/holocene-changes.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/builders/notices/holocene-changes.mdx b/pages/builders/notices/holocene-changes.mdx index a19fd9a26..aa5438a99 100644 --- a/pages/builders/notices/holocene-changes.mdx +++ b/pages/builders/notices/holocene-changes.mdx @@ -35,7 +35,7 @@ Besides this, chain operators must upgrade their chain's `SystemConfig` to the l * Sepolia: TBD * Mainnet: TBD -Chain operators need to update their proxy contracts to point to these new implementations. An upgrade script in the monorepo can be used to facilitate the upgrade, please follow the instructions in this [README](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts-bedrock/scripts/upgrades/holocene/README.md). Note that it is fine to upgrade the SystemConfig after the Holocene activation. You need to upgrade if you want to reconfigure your EIP-1559 parameters. +Chain operators need to update their proxy contracts to point to these new implementations. An upgrade script in the monorepo can be used to facilitate the upgrade, please follow the instructions in this [README](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts-bedrock/scripts/upgrades/holocene/README.md). Note that it is recommended to upgrade the SystemConfig after the Holocene activation. You need to upgrade if you want to reconfigure your EIP-1559 parameters. ### For fault proof enabled chains From 204bd67ad0c88b2e881fad8150ecf2d99089535b Mon Sep 17 00:00:00 2001 From: soyboy Date: Wed, 20 Nov 2024 06:57:50 +0800 Subject: [PATCH 555/565] updating links --- pages/builders/notices/holocene-changes.mdx | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/pages/builders/notices/holocene-changes.mdx b/pages/builders/notices/holocene-changes.mdx index aa5438a99..786bdcafb 100644 --- a/pages/builders/notices/holocene-changes.mdx +++ b/pages/builders/notices/holocene-changes.mdx @@ -30,12 +30,12 @@ For more information on the Holocene implementation details, please review [Holo Chain operators should upgrade their nodes ahead of the activation times to a release that contains the Holocene changes and has the activation times for their chains baked in, or set the activation times manually via overrides. -Besides this, chain operators must upgrade their chain's `SystemConfig` to the latest OP Contracts [v1.8.0-rc.1 release](https://github.com/ethereum-optimism/optimism/releases/tag/op-contracts%2Fv1.8.0-rc.1) to utilize the EIP-1559 configurability. The updated `SystemConfig` implementations are deployed at addresses: +Besides this, chain operators must upgrade their chain's `SystemConfig` to the latest OP Contracts [v1.8.0-rc.2 release](https://github.com/ethereum-optimism/optimism/releases/tag/op-contracts%2Fv1.8.0-rc.2) to utilize the EIP-1559 configurability. The updated `SystemConfig` implementations are deployed at addresses: * Sepolia: TBD * Mainnet: TBD -Chain operators need to update their proxy contracts to point to these new implementations. An upgrade script in the monorepo can be used to facilitate the upgrade, please follow the instructions in this [README](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts-bedrock/scripts/upgrades/holocene/README.md). Note that it is recommended to upgrade the SystemConfig after the Holocene activation. You need to upgrade if you want to reconfigure your EIP-1559 parameters. +Chain operators need to update their proxy contracts to point to these new implementations. An upgrade script in the monorepo can be used to facilitate the upgrade, please follow the instructions in this [README](https://github.com/ethereum-optimism/optimism/blob/op-contracts/v1.8.0-rc.2/packages/contracts-bedrock/scripts/upgrades/holocene/README.md). Note that it is recommended to upgrade the SystemConfig after the Holocene activation. You need to upgrade if you want to reconfigure your EIP-1559 parameters. ### For fault proof enabled chains @@ -46,7 +46,7 @@ The `FaultDisputeGame` and `PermissionedDisputeGame` contracts must be deployed * Sepolia: TBD * Mainnet: TBD -Chain operators need to update the `DisputeGameFactory` to use the new `FaultDisputeGame` and `PermissionedDisputeGame` contracts by calling `DisputeGameFactory.setImplementation`. The same upgrade script in the monorepo can be used to facilitate the upgrade, please follow the instructions in this [README](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts-bedrock/scripts/upgrades/holocene/README.md). +Chain operators need to update the `DisputeGameFactory` to use the new `FaultDisputeGame` and `PermissionedDisputeGame` contracts by calling `DisputeGameFactory.setImplementation`. The same upgrade script in the monorepo can be used to facilitate the upgrade, please follow the instructions in this [README](https://github.com/ethereum-optimism/optimism/blob/op-contracts/v1.8.0-rc.2/packages/contracts-bedrock/scripts/upgrades/holocene/README.md). ## For node operators @@ -57,8 +57,8 @@ These following steps are necessary for every node operator: ### Update to the latest release - * [`op-node`, `op-batcher`, and `op-proposer` at `v1.10.0`]() - * [`op-geth` at `v1.101411.2`]() + * [`op-node`, `op-batcher`, and `op-proposer` at `v1.10.0`](https://github.com/ethereum-optimism/optimism/releases/tag/op-node%2Fv1.10.0) + * [`op-geth` at `v1.101411.2`](https://github.com/ethereum-optimism/op-geth/releases/tag/v1.101411.2) ### Configure the Holocene activation date From 8c5acd7338c79df42223f51bf2f017ce86302488 Mon Sep 17 00:00:00 2001 From: soyboy <85043086+sbvegan@users.noreply.github.com> Date: Wed, 20 Nov 2024 07:00:13 +0800 Subject: [PATCH 556/565] Update pages/builders/notices/holocene-changes.mdx Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> --- pages/builders/notices/holocene-changes.mdx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pages/builders/notices/holocene-changes.mdx b/pages/builders/notices/holocene-changes.mdx index 786bdcafb..c2894c27d 100644 --- a/pages/builders/notices/holocene-changes.mdx +++ b/pages/builders/notices/holocene-changes.mdx @@ -19,10 +19,11 @@ If you experience difficulty at any stage of this process, please reach out to [ ## What's included in Holocene -Holocene contains two changes: +Holocene contains three changes: * **Holocene block derivation**: a set of changes that render the derivation pipeline stricter and simpler, improving worst-case scenarios for the Fault Proof System and Interoperability. * **EIP-1559 configurability**: The elasticity and denominator EIP-1559 parameters become configurable via the `SystemConfig` L1 contract, allowing the gas target and gas limit to be configured independently. +* **MIPS contract upgrade**: Updates to support additional calls made by the new `op-program` version. For more information on the Holocene implementation details, please review [Holocene specification](https://specs.optimism.io/protocol/holocene/overview.html). From 37f0aea4d35fad06f58d8918a735c1250d1ea0b9 Mon Sep 17 00:00:00 2001 From: soyboy <85043086+sbvegan@users.noreply.github.com> Date: Wed, 20 Nov 2024 07:11:03 +0800 Subject: [PATCH 557/565] Update pages/builders/node-operators/network-upgrades.mdx Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> --- pages/builders/node-operators/network-upgrades.mdx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pages/builders/node-operators/network-upgrades.mdx b/pages/builders/node-operators/network-upgrades.mdx index 24979c4ca..e82206f6a 100644 --- a/pages/builders/node-operators/network-upgrades.mdx +++ b/pages/builders/node-operators/network-upgrades.mdx @@ -9,9 +9,9 @@ import { Steps, Callout } from 'nextra/components' # Network upgrade overview -This page has the hardfork activation timestamps and the links to the details outlined in the specs. -It also outlines the hardfork release process. -The network upgrade naming scheme after the Bedrock upgrade has a geology themed name based on the next letter in the english alphabet. +This page provides hardfork activation timestamps and links to detailed specifications. +The documentation outlines the hardfork release process. +The network upgrade naming scheme after the Bedrock upgrade follows a geology theme based on the next letter in the English alphabet. ## Activations From 0a112fb9ce074119ef7db6daeea4274348876d54 Mon Sep 17 00:00:00 2001 From: soyboy <85043086+sbvegan@users.noreply.github.com> Date: Wed, 20 Nov 2024 12:15:33 +0800 Subject: [PATCH 558/565] Apply suggestions from code review Co-authored-by: Sebastian Stammler --- pages/builders/notices/holocene-changes.mdx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pages/builders/notices/holocene-changes.mdx b/pages/builders/notices/holocene-changes.mdx index c2894c27d..473b6deb6 100644 --- a/pages/builders/notices/holocene-changes.mdx +++ b/pages/builders/notices/holocene-changes.mdx @@ -33,7 +33,7 @@ Chain operators should upgrade their nodes ahead of the activation times to a re Besides this, chain operators must upgrade their chain's `SystemConfig` to the latest OP Contracts [v1.8.0-rc.2 release](https://github.com/ethereum-optimism/optimism/releases/tag/op-contracts%2Fv1.8.0-rc.2) to utilize the EIP-1559 configurability. The updated `SystemConfig` implementations are deployed at addresses: -* Sepolia: TBD +* Sepolia: `0x29d06Ed7105c7552EFD9f29f3e0d250e5df412CD` * Mainnet: TBD Chain operators need to update their proxy contracts to point to these new implementations. An upgrade script in the monorepo can be used to facilitate the upgrade, please follow the instructions in this [README](https://github.com/ethereum-optimism/optimism/blob/op-contracts/v1.8.0-rc.2/packages/contracts-bedrock/scripts/upgrades/holocene/README.md). Note that it is recommended to upgrade the SystemConfig after the Holocene activation. You need to upgrade if you want to reconfigure your EIP-1559 parameters. @@ -44,7 +44,7 @@ Since the Holocene upgrade changes the execution and derivation rules, the versi The `FaultDisputeGame` and `PermissionedDisputeGame` contracts must be deployed separately for each chain. The `MIPS` contract implementation can be shared by all chains and is deployed at: -* Sepolia: TBD +* Sepolia: `0x6f86b56d26F60a86Ccd13048993C1cE410565DC1` * Mainnet: TBD Chain operators need to update the `DisputeGameFactory` to use the new `FaultDisputeGame` and `PermissionedDisputeGame` contracts by calling `DisputeGameFactory.setImplementation`. The same upgrade script in the monorepo can be used to facilitate the upgrade, please follow the instructions in this [README](https://github.com/ethereum-optimism/optimism/blob/op-contracts/v1.8.0-rc.2/packages/contracts-bedrock/scripts/upgrades/holocene/README.md). @@ -58,7 +58,7 @@ These following steps are necessary for every node operator: ### Update to the latest release - * [`op-node`, `op-batcher`, and `op-proposer` at `v1.10.0`](https://github.com/ethereum-optimism/optimism/releases/tag/op-node%2Fv1.10.0) + * [`op-node` at `v1.10.0`](https://github.com/ethereum-optimism/optimism/releases/tag/op-node%2Fv1.10.0) * [`op-geth` at `v1.101411.2`](https://github.com/ethereum-optimism/op-geth/releases/tag/v1.101411.2) ### Configure the Holocene activation date From c33758e6e49e7238473654fdc6cdda6a485c98d1 Mon Sep 17 00:00:00 2001 From: soyboy Date: Wed, 20 Nov 2024 12:16:24 +0800 Subject: [PATCH 559/565] adding metal sepolia --- pages/builders/notices/holocene-changes.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/builders/notices/holocene-changes.mdx b/pages/builders/notices/holocene-changes.mdx index 473b6deb6..7fd4d0aee 100644 --- a/pages/builders/notices/holocene-changes.mdx +++ b/pages/builders/notices/holocene-changes.mdx @@ -66,7 +66,7 @@ These following steps are necessary for every node operator: If you are operating a node for an OP Chain that have opted into the [hardfork activation inheritance behavior](https://github.com/ethereum-optimism/superchain-registry/blob/main/docs/hardfork-activation-inheritance.md), the Holocene activation date is part of the `op-node` and `op-geth` nodes. So, no action is needed for the sequencer after upgrading to the latest release. Please skip to [Step 3: Verify Your Configuration](#verify-your-configuration). - For Sepolia that is: `OP Sepolia`, `Base Sepolia`, `Mode Sepolia`, and `Zora Sepolia`. + For Sepolia that is: `OP Sepolia`, `Base Sepolia`, `Mode Sepolia`, `Zora Sepolia`, and `Metal Sepolia`. For node operators of not included in the [hardfork activation inheritance behavior](https://github.com/ethereum-optimism/superchain-registry/blob/main/docs/hardfork-activation-inheritance.md), you will need to manually configure the activation. This can be done one of two ways: From 0cdb3e4182ac4e0610c6ae2b5839aa633c2da1d5 Mon Sep 17 00:00:00 2001 From: Joe-Thirdweb <160192317+Joe-Thirdweb@users.noreply.github.com> Date: Tue, 19 Nov 2024 22:50:43 -0600 Subject: [PATCH 560/565] Update account-abstraction.mdx Updating to proper capitalization. Updating link. --- pages/builders/tools/build/account-abstraction.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/builders/tools/build/account-abstraction.mdx b/pages/builders/tools/build/account-abstraction.mdx index 8b014756e..2bf29a299 100644 --- a/pages/builders/tools/build/account-abstraction.mdx +++ b/pages/builders/tools/build/account-abstraction.mdx @@ -52,7 +52,7 @@ Ready to enable account abstraction experiences in your app? Here's some helpful * [Stackup](https://docs.stackup.sh/docs): provides smart account tooling for building account abstraction within your apps. They offer Paymaster and Bundler APIs for sponsoring gas and sending account abstraction transactions. -* [Thirdweb](https://portal.thirdweb.com/connect/account-abstraction/overview): +* [thirdweb](https://portal.thirdweb.com/react/v5/account-abstraction/get-started?utm_source=opdocs&utm_medium=docs): offers the complete tool-kit to leverage account abstraction technology to enable seamless user experiences for your users. This includes Account Factory contracts that lets your users spin up Smart Accounts, Bundler for UserOps support, and Paymaster to enable gas sponsorships. ## Helpful tips From 0548f04db972e38a8ee35b2667c0504408cba5dc Mon Sep 17 00:00:00 2001 From: Joe-Thirdweb <160192317+Joe-Thirdweb@users.noreply.github.com> Date: Tue, 19 Nov 2024 22:51:58 -0600 Subject: [PATCH 561/565] Update faucets.mdx Updating thirdweb capitals as well as links. --- pages/builders/tools/build/faucets.mdx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pages/builders/tools/build/faucets.mdx b/pages/builders/tools/build/faucets.mdx index a21e53c08..a73b46921 100644 --- a/pages/builders/tools/build/faucets.mdx +++ b/pages/builders/tools/build/faucets.mdx @@ -39,8 +39,8 @@ The Superchain Faucet is a great place to start if you're looking for testnet ET | [Native USDC Faucet](https://faucet.circle.com/) | Sepolia, OP Sepolia | | [ETHGlobal Testnet Faucet](https://ethglobal.com/faucet) | Sepolia, OP Sepolia, Base Sepolia, Zora Sepolia, Holesky | | [Ethereum Ecosystem Faucets](https://www.ethereum-ecosystem.com/faucets) | Sepolia, OP Sepolia, Base Sepolia | -| [Thirdweb Sepolia Faucet](https://thirdweb.com/sepolia) | Sepolia | -| [Thirdweb OP Sepolia Faucet](https://thirdweb.com/op-sepolia-testnet) | OP Sepolia | +| [thirdweb Sepolia Faucet](https://thirdweb.com/sepolia?utm_source=opdocs&utm_medium=docs) | Sepolia | +| [thirdweb OP Sepolia Faucet](https://thirdweb.com/op-sepolia-testnet?utm_source=opdocs&utm_medium=docs) | OP Sepolia | ## Bridge from Sepolia From 38d2f29658f57be94cdf9d986229c659298cc957 Mon Sep 17 00:00:00 2001 From: Joe-Thirdweb <160192317+Joe-Thirdweb@users.noreply.github.com> Date: Tue, 19 Nov 2024 22:52:26 -0600 Subject: [PATCH 562/565] Update nft-tools.mdx Updating thirdweb capitalization and UTM links. --- pages/builders/tools/build/nft-tools.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/builders/tools/build/nft-tools.mdx b/pages/builders/tools/build/nft-tools.mdx index bd93d6f3a..be8dbaf60 100644 --- a/pages/builders/tools/build/nft-tools.mdx +++ b/pages/builders/tools/build/nft-tools.mdx @@ -23,7 +23,7 @@ These tools are available on OP Mainnet: * [NiftyKit](https://niftykit.com/) * [nft-inator](https://nft-inator.com/) * [Unlock](https://unlock-protocol.com/) (time-bound NFTs for membership) -* [ThirdWeb](https://thirdweb.com/) +* [thirdweb](https://thirdweb.com/?utm_source=opdocs&utm_medium=docs) * [Crossmint](https://crossmint.com/?utm_source=backlinks\&utm_medium=docs\&utm_campaign=optimism) ## Feature comparison From 957ebf47cc5ee2285a6b1f7721a046ae105c3734 Mon Sep 17 00:00:00 2001 From: Joe-Thirdweb <160192317+Joe-Thirdweb@users.noreply.github.com> Date: Tue, 19 Nov 2024 22:54:51 -0600 Subject: [PATCH 563/565] Update nft-tools.mdx Updating number of chains supported. --- pages/builders/tools/build/nft-tools.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/builders/tools/build/nft-tools.mdx b/pages/builders/tools/build/nft-tools.mdx index be8dbaf60..df4cefa83 100644 --- a/pages/builders/tools/build/nft-tools.mdx +++ b/pages/builders/tools/build/nft-tools.mdx @@ -34,7 +34,7 @@ These tools are available on OP Mainnet: | | NiftyKit | NFT-Inator | Mintplex | Zero Code NFT | ThirdWeb | Crossmint | | ------------------ | -------------------------------------------------------------------------- | ------------------------------------------------------------------------- | ------------------------------------------------------------- | ------------------------------------- | -------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Multi-chain | 3 | 5 | 6 | 11 | 1100+ [(all EVM chains)](https://thirdweb.com/dashboard/infrastructure/rpc-edge) | 9 | +| Multi-chain | 3 | 5 | 6 | 11 | 2500+ [(all EVM chains)](https://thirdweb.com/dashboard/infrastructure/rpc-edge?utm_source=opdocs&utm_medium=docs) | 9 | | Generator | ❌ | ✅ | ❌ | ❌ | ❌ | ❌ | | ERC-20 support | ❌ | ❌ | ✅ | ✅ | ✅ | ❌ | | ERC-721A support | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | From 45dc91b21230ae096e31f19c8acbb381631c1b3f Mon Sep 17 00:00:00 2001 From: Bradley Camacho <42678939+bradleycamacho@users.noreply.github.com> Date: Tue, 19 Nov 2024 21:32:25 -0800 Subject: [PATCH 564/565] Fix linting --- pages/builders/tools/build/faucets.mdx | 24 +++++++++++----------- pages/builders/tools/build/nft-tools.mdx | 26 ++++++++++++------------ 2 files changed, 25 insertions(+), 25 deletions(-) diff --git a/pages/builders/tools/build/faucets.mdx b/pages/builders/tools/build/faucets.mdx index a73b46921..8c815513a 100644 --- a/pages/builders/tools/build/faucets.mdx +++ b/pages/builders/tools/build/faucets.mdx @@ -29,18 +29,18 @@ The Superchain Faucet is a great place to start if you're looking for testnet ET ## Additional faucets -| Faucet Name | Supported Networks | -| -------------------------------------------------------------------------------- | -------------------------------------------------------- | -| [Alchemy Faucet](https://sepoliafaucet.com) | Sepolia | -| [Infura Faucet](https://www.infura.io/faucet/sepolia) | Sepolia | -| [QuickNode Faucet](https://faucet.quicknode.com/optimism/) | Sepolia, OP Sepolia | -| [Farcaster Frame Faucet by LearnWeb3](https://warpcast.com/haardikkk/0x28f4237d) | Sepolia, OP Sepolia | -| [LearnWeb3 Web App Faucet](https://learnweb3.io/faucets) | Sepolia, OP Sepolia | -| [Native USDC Faucet](https://faucet.circle.com/) | Sepolia, OP Sepolia | -| [ETHGlobal Testnet Faucet](https://ethglobal.com/faucet) | Sepolia, OP Sepolia, Base Sepolia, Zora Sepolia, Holesky | -| [Ethereum Ecosystem Faucets](https://www.ethereum-ecosystem.com/faucets) | Sepolia, OP Sepolia, Base Sepolia | -| [thirdweb Sepolia Faucet](https://thirdweb.com/sepolia?utm_source=opdocs&utm_medium=docs) | Sepolia | -| [thirdweb OP Sepolia Faucet](https://thirdweb.com/op-sepolia-testnet?utm_source=opdocs&utm_medium=docs) | OP Sepolia | +| Faucet Name | Supported Networks | +| -------------------------------------------------------------------------------------------------------- | -------------------------------------------------------- | +| [Alchemy Faucet](https://sepoliafaucet.com) | Sepolia | +| [Infura Faucet](https://www.infura.io/faucet/sepolia) | Sepolia | +| [QuickNode Faucet](https://faucet.quicknode.com/optimism/) | Sepolia, OP Sepolia | +| [Farcaster Frame Faucet by LearnWeb3](https://warpcast.com/haardikkk/0x28f4237d) | Sepolia, OP Sepolia | +| [LearnWeb3 Web App Faucet](https://learnweb3.io/faucets) | Sepolia, OP Sepolia | +| [Native USDC Faucet](https://faucet.circle.com/) | Sepolia, OP Sepolia | +| [ETHGlobal Testnet Faucet](https://ethglobal.com/faucet) | Sepolia, OP Sepolia, Base Sepolia, Zora Sepolia, Holesky | +| [Ethereum Ecosystem Faucets](https://www.ethereum-ecosystem.com/faucets) | Sepolia, OP Sepolia, Base Sepolia | +| [thirdweb Sepolia Faucet](https://thirdweb.com/sepolia?utm_source=opdocs\&utm_medium=docs) | Sepolia | +| [thirdweb OP Sepolia Faucet](https://thirdweb.com/op-sepolia-testnet?utm_source=opdocs\&utm_medium=docs) | OP Sepolia | ## Bridge from Sepolia diff --git a/pages/builders/tools/build/nft-tools.mdx b/pages/builders/tools/build/nft-tools.mdx index df4cefa83..7e0da902a 100644 --- a/pages/builders/tools/build/nft-tools.mdx +++ b/pages/builders/tools/build/nft-tools.mdx @@ -23,7 +23,7 @@ These tools are available on OP Mainnet: * [NiftyKit](https://niftykit.com/) * [nft-inator](https://nft-inator.com/) * [Unlock](https://unlock-protocol.com/) (time-bound NFTs for membership) -* [thirdweb](https://thirdweb.com/?utm_source=opdocs&utm_medium=docs) +* [thirdweb](https://thirdweb.com/?utm_source=opdocs\&utm_medium=docs) * [Crossmint](https://crossmint.com/?utm_source=backlinks\&utm_medium=docs\&utm_campaign=optimism) ## Feature comparison @@ -32,21 +32,21 @@ These tools are available on OP Mainnet: This list was last updated early February 2024, but new features are implemented all the time. -| | NiftyKit | NFT-Inator | Mintplex | Zero Code NFT | ThirdWeb | Crossmint | -| ------------------ | -------------------------------------------------------------------------- | ------------------------------------------------------------------------- | ------------------------------------------------------------- | ------------------------------------- | -------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Multi-chain | 3 | 5 | 6 | 11 | 2500+ [(all EVM chains)](https://thirdweb.com/dashboard/infrastructure/rpc-edge?utm_source=opdocs&utm_medium=docs) | 9 | -| Generator | ❌ | ✅ | ❌ | ❌ | ❌ | ❌ | -| ERC-20 support | ❌ | ❌ | ✅ | ✅ | ✅ | ❌ | -| ERC-721A support | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | -| ERC-1155 support | ❌ | ❌ | ✅ | ❌ | ✅ | ✅ | -| DAO support | ❌ | ❌ | ❌ | ✅ | ✅ | ❌ | -| No Code deployment | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | -| Pricing / Fee | [Flat membership fee plus 2.5%-10% of the sales](https://app.niftykit.com) | 2% commission on primary sales | Paywall for premium features | Test for free, $499 for OpenSea setup | See the [pricing page](https://thirdweb.com/pricing) for more details | [Mint API Pricing](https://docs.crossmint.com/docs/pricing?utm_source=backlinks\&utm_medium=docs\&utm_campaign=optimism). NFT Checkouts free for seller (Unlimited transactions). | -| Image Hosting | [NFT storage](https://nft.storage/) / [Pinata](https://www.pinata.cloud/) | [NFT storage](https://nft.storage/) / [Pinata](https://www.pinata.cloud/) | Up to creators. Recommend [Pinata](https://www.pinata.cloud/) | [IPFS](https://ipfs.tech/) | [IPFS](https://ipfs.tech/) | [IPFS](https://ipfs.tech/) and [Arweave](https://www.arweave.org/). | +| | NiftyKit | NFT-Inator | Mintplex | Zero Code NFT | ThirdWeb | Crossmint | +| ------------------ | -------------------------------------------------------------------------- | ------------------------------------------------------------------------- | ------------------------------------------------------------- | ------------------------------------- | ------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Multi-chain | 3 | 5 | 6 | 11 | 2500+ [(all EVM chains)](https://thirdweb.com/dashboard/infrastructure/rpc-edge?utm_source=opdocs\&utm_medium=docs) | 9 | +| Generator | ❌ | ✅ | ❌ | ❌ | ❌ | ❌ | +| ERC-20 support | ❌ | ❌ | ✅ | ✅ | ✅ | ❌ | +| ERC-721A support | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | +| ERC-1155 support | ❌ | ❌ | ✅ | ❌ | ✅ | ✅ | +| DAO support | ❌ | ❌ | ❌ | ✅ | ✅ | ❌ | +| No Code deployment | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | +| Pricing / Fee | [Flat membership fee plus 2.5%-10% of the sales](https://app.niftykit.com) | 2% commission on primary sales | Paywall for premium features | Test for free, $499 for OpenSea setup | See the [pricing page](https://thirdweb.com/pricing) for more details | [Mint API Pricing](https://docs.crossmint.com/docs/pricing?utm_source=backlinks\&utm_medium=docs\&utm_campaign=optimism). NFT Checkouts free for seller (Unlimited transactions). | +| Image Hosting | [NFT storage](https://nft.storage/) / [Pinata](https://www.pinata.cloud/) | [NFT storage](https://nft.storage/) / [Pinata](https://www.pinata.cloud/) | Up to creators. Recommend [Pinata](https://www.pinata.cloud/) | [IPFS](https://ipfs.tech/) | [IPFS](https://ipfs.tech/) | [IPFS](https://ipfs.tech/) and [Arweave](https://www.arweave.org/). | ## NFT data APIs -* [Moralis](https://docs.moralis.io/web3-data-api/evm/reference/nft-api?utm_source=op-docs&utm_medium=partner-docs) +* [Moralis](https://docs.moralis.io/web3-data-api/evm/reference/nft-api?utm_source=op-docs\&utm_medium=partner-docs) * [Alchemy](https://docs.alchemy.com/reference/nft-api-quickstart) * [SimpleHash](https://simplehash.com/) * [QuickNode](https://www.quicknode.com/nft-api) From dc11ff9f87f60c4926b1a791fa41e9d41a3d2ee6 Mon Sep 17 00:00:00 2001 From: Joe-Thirdweb <160192317+Joe-Thirdweb@users.noreply.github.com> Date: Wed, 20 Nov 2024 00:31:42 -0600 Subject: [PATCH 565/565] Update pages/builders/tools/build/nft-tools.mdx Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> --- pages/builders/tools/build/nft-tools.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/builders/tools/build/nft-tools.mdx b/pages/builders/tools/build/nft-tools.mdx index 7e0da902a..3e0f650bc 100644 --- a/pages/builders/tools/build/nft-tools.mdx +++ b/pages/builders/tools/build/nft-tools.mdx @@ -32,7 +32,7 @@ These tools are available on OP Mainnet: This list was last updated early February 2024, but new features are implemented all the time. -| | NiftyKit | NFT-Inator | Mintplex | Zero Code NFT | ThirdWeb | Crossmint | +| | NiftyKit | NFT-Inator | Mintplex | Zero Code NFT | thirdweb | Crossmint | | ------------------ | -------------------------------------------------------------------------- | ------------------------------------------------------------------------- | ------------------------------------------------------------- | ------------------------------------- | ------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Multi-chain | 3 | 5 | 6 | 11 | 2500+ [(all EVM chains)](https://thirdweb.com/dashboard/infrastructure/rpc-edge?utm_source=opdocs\&utm_medium=docs) | 9 | | Generator | ❌ | ✅ | ❌ | ❌ | ❌ | ❌ |