diff --git a/.coderabbit.yaml b/.coderabbit.yaml index 1d846c659..4bb0d0a94 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 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. + - 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/.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 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/.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 diff --git a/.github/workflows/tutorials.yml b/.github/workflows/tutorials.yml index 74e8870c7..7018045f1 100644 --- a/.github/workflows/tutorials.yml +++ b/.github/workflows/tutorials.yml @@ -10,7 +10,7 @@ concurrency: cancel-in-progress: false jobs: - cross-dom-bridge-erc20: + cross-dom-bridge-eth: runs-on: ubuntu-latest steps: @@ -32,7 +32,7 @@ jobs: env: TUTORIAL_PRIVATE_KEY: ${{ secrets.TUTORIAL_PRIVATE_KEY }} run: - node ./public/tutorials/cross-dom-bridge-erc20.js + node ./public/tutorials/cross-dom-bridge-eth.js - name: Notify Slack on failure uses: ravsamhq/notify-slack-action@v2 @@ -47,8 +47,8 @@ jobs: env: SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }} - cross-dom-bridge-eth: - needs: cross-dom-bridge-erc20 + send-tx-from-eth: + needs: cross-dom-bridge-eth runs-on: ubuntu-latest steps: @@ -70,7 +70,7 @@ jobs: env: TUTORIAL_PRIVATE_KEY: ${{ secrets.TUTORIAL_PRIVATE_KEY }} run: - node ./public/tutorials/cross-dom-bridge-eth.js + node ./public/tutorials/send-tx-from-eth.js - name: Notify Slack on failure uses: ravsamhq/notify-slack-action@v2 @@ -86,7 +86,7 @@ jobs: SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }} sdk-estimate-costs: - needs: cross-dom-bridge-eth + needs: send-tx-from-eth runs-on: ubuntu-latest steps: 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 +

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 diff --git a/notes/breadcrumbs.md b/notes/breadcrumbs.md new file mode 100644 index 000000000..c05467848 --- /dev/null +++ b/notes/breadcrumbs.md @@ -0,0 +1,42 @@ +# 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 breadcrumbs +``` + +* To check files with missing breadcrumbs, run: + +```bash +pnpm fix +``` + +### 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, please update the description. + * 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/nouns.txt b/nouns.txt new file mode 100644 index 000000000..be98afea6 --- /dev/null +++ b/nouns.txt @@ -0,0 +1,20 @@ +Optimism +OP Mainnet +Ethereum +OP Stack +MetaMask +SuperchainERC20 +ZK +Security Council +Sequencer PBS +Superchain Registry +Retro Funding +Alt-DA +Teleportr +Dev Console +Granite +Holocene +Monitorism +Kubernetes +Fault Proof System +Viem \ No newline at end of file diff --git a/package.json b/package.json index 7d4036e50..b1690e4f0 100644 --- a/package.json +++ b/package.json @@ -3,11 +3,13 @@ "version": "0.0.1", "description": "Optimism Docs", "scripts": { - "lint": "eslint . --ext mdx --max-warnings 0 && pnpm spellcheck:lint", - "fix": "eslint . --ext mdx --fix && pnpm spellcheck:fix", + "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", "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/breadcrumbs.ts", "index:docs": "npx ts-node --skip-project utils/algolia-indexer.ts", "dev": "next dev", "build": "next build", @@ -28,7 +30,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/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.mdx b/pages/builders.mdx new file mode 100644 index 000000000..ab69e59b6 --- /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 + +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/_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.mdx b/pages/builders/app-developers.mdx new file mode 100644 index 000000000..c5dc109d2 --- /dev/null +++ b/pages/builders/app-developers.mdx @@ -0,0 +1,27 @@ +--- +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 +--- + +import { Card, Cards } from 'nextra/components' + +# App Developers + +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 ... + + + + + + + + + + + + + + + + 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.mdx b/pages/builders/app-developers/bridging.mdx new file mode 100644 index 000000000..893cb6db6 --- /dev/null +++ b/pages/builders/app-developers/bridging.mdx @@ -0,0 +1,21 @@ +--- +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' + +# 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/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.mdx b/pages/builders/app-developers/contracts.mdx new file mode 100644 index 000000000..f2836e72d --- /dev/null +++ b/pages/builders/app-developers/contracts.mdx @@ -0,0 +1,23 @@ +--- +title: Contracts +lang: en-US +description: >- + Information on Solidity compatibility, contract optimization, and system + contracts for OP Stack. +--- + +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. + + + + + + + + + + diff --git a/pages/builders/app-developers/contracts/_meta.json b/pages/builders/app-developers/contracts/_meta.json index 50aa18684..c4b36699f 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" } 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. diff --git a/pages/builders/app-developers/tools.mdx b/pages/builders/app-developers/tools.mdx new file mode 100644 index 000000000..7aeb81f23 --- /dev/null +++ b/pages/builders/app-developers/tools.mdx @@ -0,0 +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 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/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/tools/supersim.mdx b/pages/builders/app-developers/tools/supersim.mdx index dc60c54ac..57a0d8e40 100644 --- a/pages/builders/app-developers/tools/supersim.mdx +++ b/pages/builders/app-developers/tools/supersim.mdx @@ -1,4 +1,9 @@ --- +title: Supersim +lang: en-US +description: >- + Learn about supersim in the Optimism ecosystem. This guide provides detailed + information and resources about supersim. --- import Supersim from '@/pages/stack/interop/supersim.mdx' diff --git a/pages/builders/app-developers/transactions.mdx b/pages/builders/app-developers/transactions.mdx new file mode 100644 index 000000000..e845de2d1 --- /dev/null +++ b/pages/builders/app-developers/transactions.mdx @@ -0,0 +1,25 @@ +--- +title: Transactions +lang: en-US +description: >- + Guide to understanding and working with transactions on OP Stack, including + fee estimation, gas parameters, and troubleshooting. +--- + +import { Card, Cards } from 'nextra/components' + +# Transactions + +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/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/transactions/estimates.mdx b/pages/builders/app-developers/transactions/estimates.mdx index cbf69818f..62d3668f4 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. @@ -96,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

} @@ -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 diff --git a/pages/builders/app-developers/transactions/fees.mdx b/pages/builders/app-developers/transactions/fees.mdx index 09af8f1c0..cc3b2e6f3 100644 --- a/pages/builders/app-developers/transactions/fees.mdx +++ b/pages/builders/app-developers/transactions/fees.mdx @@ -1,4 +1,9 @@ --- +title: TransactionFees +lang: en-US +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/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. diff --git a/pages/builders/app-developers/tutorials.mdx b/pages/builders/app-developers/tutorials.mdx new file mode 100644 index 000000000..807686a51 --- /dev/null +++ b/pages/builders/app-developers/tutorials.mdx @@ -0,0 +1,33 @@ +--- +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/app-developers/tutorials/_meta.json b/pages/builders/app-developers/tutorials/_meta.json index 0f6a0b800..45ddaf362 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 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", + "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/app-developers/tutorials/cross-dom-bridge-eth.mdx b/pages/builders/app-developers/tutorials/cross-dom-bridge-eth.mdx index 0c5e5b141..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,28 +1,25 @@ --- -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' - +# Bridging ETH to OP Mainnet with Viem -# Bridging ETH to OP Mainnet with the Optimism SDK +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. -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. -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. +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. ## 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. -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). +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. ## Dependencies @@ -31,40 +28,33 @@ If you want to use a network that isn't included by default you can simply [inst ## 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. +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 bridge-eth + cd bridge-eth + ``` -{

Initialize the Project

} + {

Initialize the project

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

Install the Optimism SDK

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

Install ethers.js

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

Install the Viem library

} + ```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 @@ -73,13 +63,13 @@ 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 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 @@ -88,116 +78,126 @@ 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 node ``` -This will bring up a Node REPL prompt that allows you to run javascript code. +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 Viem and other packages

} -{

Import the Optimism SDK

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

Load private key and set account

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

Import ethers.js

} +{

Create L1 public client for reading from the Sepolia network

} -```js file=/public/tutorials/cross-dom-bridge-eth.js#L4 hash=69a65ef97862612e4978b8563e6dbe3a +```js file=/public/tutorials/cross-dom-bridge-eth.js#L13-L16 hash=6f2335d67920c219b5fd3590f8450cac ``` -
-## Set session variables +{

Create L1 wallet client for sending transactions on Sepolia

} -You'll need a few variables throughout this tutorial. -Let's set those up now. +```js file=/public/tutorials/cross-dom-bridge-eth.js#L19-L23 hash=a9b217aef7c065eaf3f2a7222494a3e1 +``` - -{

Load your private key

} +{

Create L2 public client for interacting with OP Sepolia

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

Create the RPC providers and wallets

} +{

Create L2 wallet client on OP Sepolia

} -```js file=/public/tutorials/cross-dom-bridge-eth.js#L8-L11 hash=9afdce50665ae93bce602068071ffaa1 +```js file=/public/tutorials/cross-dom-bridge-eth.js#L32-L36 hash=6f91578c5b155d7abfeecf2297ee9f70 ```
-## Get ETH +## Get ETH on Sepolia 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. +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

} -{

Check your wallet balance on L1

} + See how much ETH you have on L1 so you can confirm that the deposit worked later on. -See how much ETH you have on L1 so you can confirm that the deposit worked later on. + ```js file=/public/tutorials/cross-dom-bridge-eth.js#L38-L39 hash=a77304eb0a056ba30aaa21eee60bcafa + ``` -```js file=/public/tutorials/cross-dom-bridge-eth.js#L14 hash=3be1dd9a6019e9f59ad6fab38e168e99 -``` + + We used `formatEther` method from `viem` to format the balance to ether. + -{

Create a CrossChainMessenger instance

} + {

Create the deposit transaction

} -The Optimism SDK exports a `CrossChainMessenger` class that makes it easy to interact with the `L1StandardBridge` contract. + Use `buildDepositTransaction` to build the deposit transaction parameters on the L2. -Create an instance of the `CrossChainMessenger` class: + ```js file=/public/tutorials/cross-dom-bridge-eth.js#L44-L47 hash=01a8dadb00216636f18b72758236d4b0 + ``` -```js file=/public/tutorials/cross-dom-bridge-eth.js#L16-L21 hash=997b9c4cdd5fb1f9d4e0882a683ae016 -``` -{

Deposit your ETH

} + {

Send the deposit transaction

} -Now you can deposit your ETH into the Standard Bridge contract. -You'll deposit a small amount of ETH just to demonstrate the process. + Send the deposit transaction on L1 and log the L1 transaction hash. -```js file=/public/tutorials/cross-dom-bridge-eth.js#L24-L25 hash=8bd6fdfe984274e8ec2368dc735118b4 -``` + ```js file=/public/tutorials/cross-dom-bridge-eth.js#L49-L50 hash=6c47f29f428cc4c7f6d4ad322e4feaec + ``` - -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 L1 transaction

} -{

Wait for the deposit to be relayed

} + Wait for the L1 transaction to be processed and log the receipt. -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#L52-L53 hash=0de1fe6dd17f753ab80d356b38d9ca41 + ``` -```js file=/public/tutorials/cross-dom-bridge-eth.js#L28 hash=659971675ab8d53bc2bd5196f72c873b -``` + {

Extract the L2 transaction hash

} -{

Check your wallet balance on L1

} + Extracts the corresponding L2 transaction hash from the L1 receipt, and logs it. + This hash represents the deposit transaction on L2. -You should now have less ETH on L1. + ```js file=/public/tutorials/cross-dom-bridge-eth.js#L55-L56 hash=07a053f25193bcfcb9dae397091d755a + ``` -```js file=/public/tutorials/cross-dom-bridge-eth.js#L31 hash=3be1dd9a6019e9f59ad6fab38e168e99 -``` + {

Wait for the L2 transaction to be processed

} -{

Check your wallet balance on L2

} + Wait for the L2 transaction to be processed and confirmed and logs the L2 receipt to verify completion. -You should now have more ETH on L2. + ```js file=/public/tutorials/cross-dom-bridge-eth.js#L58-L62 hash=4ab7fdff1700699951ced567db6d4710 + ``` +
+
-```js file=/public/tutorials/cross-dom-bridge-eth.js#L34 hash=7884641849eab1590b148118d709f0fd -``` + + ```js file=/public/tutorials/cross-dom-bridge-eth.js#L3-L63 hash=b7d72a54dcdbb9b89c6874e2862fde00 + ``` + +
-
+ + 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. + ## Withdraw ETH @@ -205,81 +205,102 @@ 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

} -{

Start your withdrawal on L2

} + Uses `buildWithdrawalTransaction` to create the withdrawal parameters. + Converts the withdrawal amount to `wei` and specifies the recipient on L1. -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#L68-L72 hash=cd22b075bb05dc05ac92c5502aa0568f + ``` -```js file=/public/tutorials/cross-dom-bridge-eth.js#L37-L38 hash=e9880eb7e7e95253637b5b88a4772074 -``` + {

Executing the withdrawal

} -{

Check your wallet balance on L2

} + This sends the withdrawal transaction on L2, which initiates the withdrawal process on L2 and logs a transaction hash for tracking the withdrawal. -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#L74-L75 hash=e5f3d46ba9f417fddfa4b861f3f6f208 + ``` -```js file=/public/tutorials/cross-dom-bridge-eth.js#L41 hash=7884641849eab1590b148118d709f0fd -``` + {

Confirming L2 transaction

} -{

Wait until the withdrawal is ready to prove

} + 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. -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#L77-L78 hash=37f83c57e384910a0e5bf7040c52aa7a + ``` -```js file=/public/tutorials/cross-dom-bridge-eth.js#L44 hash=e8b55ec0f16f90ba4d4197cf47ff8e6d -``` + {

Wait for withdrawal prove

} - -This step can take a few minutes. -Feel free to take a quick break while you wait. - + 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. -{

Prove the withdrawal on L1

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

Wait until the withdrawal is ready for relay

} + {

Prove the withdrawal on the L1

} -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. + Once the withdrawal is ready to be proven, you'll send an L1 transaction to prove that the withdrawal happened on L2. - -We're currently testing fault proofs on OP Sepolia, so withdrawal times reflect Mainnet times. - + ```js file=/public/tutorials/cross-dom-bridge-eth.js#L90-L92 hash=312b1d49267d75ec0475bc507ae9a742 + ``` -```js file=/public/tutorials/cross-dom-bridge-eth.js#L50 hash=55a41ac5586b8a688ffd6dfbb20f2d15 -``` + {

Wait for withdrawal finalization

} -{

Relay the withdrawal on L1

} + 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. -Once the withdrawal is ready to be relayed you can finally complete the withdrawal process. + ```js file=/public/tutorials/cross-dom-bridge-eth.js#L94-L97 hash=15e6f754d2e9f11a03f400813efef383 + ``` -```js file=/public/tutorials/cross-dom-bridge-eth.js#L66 hash=f8d30944dad1664d82b9fdf14da59f9e -``` + + We're currently testing fault proofs on OP Sepolia, so withdrawal times + reflect Mainnet times. + -{

Wait until the withdrawal is relayed

} + {

Finalize the withdrawal

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

Wait until the withdrawal is finalized

} -{

Check your wallet balance on L1

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

Check the withdrawal status

} -```js file=/public/tutorials/cross-dom-bridge-eth.js#L72 hash=3be1dd9a6019e9f59ad6fab38e168e99 -``` + ```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=4a8d4d442b95aaf0853147420eb131af + ``` + + + + +## 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. + + +## Next Steps -## Next steps +* Develop a user interface for easier interaction with these bridging functions. +* Implement robust error handling and retry mechanisms for production use. -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. +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. diff --git a/pages/builders/app-developers/tutorials/cross-dom-solidity.mdx b/pages/builders/app-developers/tutorials/cross-dom-solidity.mdx index 5c28e1178..1aa33fb07 100644 --- a/pages/builders/app-developers/tutorials/cross-dom-solidity.mdx +++ b/pages/builders/app-developers/tutorials/cross-dom-solidity.mdx @@ -1,34 +1,32 @@ --- -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' -import { WipCallout } from '@/components/WipCallout' - -# 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 @@ -80,8 +78,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. @@ -127,15 +125,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,20 +140,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

} @@ -187,46 +176,27 @@ Start the Node.js REPL with the `node` command. node ``` -{

Import the Optimism SDK

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

Import ethers.js

} +{

Import Viem

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

Load your private key

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

Load your transaction hash

} -```js file=/public/tutorials/cross-dom-solidity.js#L8 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#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#L8-L9 hash=d47e4991c5153e1e1dc55de5047a8a3e ``` {

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#L12-L16 hash=df275e659d954eb72b8c5765d9baf6de ``` @@ -238,34 +208,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#L26 hash=17922abea43b3d379404fedd87422dde +```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#L29 hash=45d995aab47ec29afee4bb4577ae9303 +```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#L32 hash=b5515811ffcf8b9ada15dea8ae666e44 +```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#L35 hash=d6e7f89e929eea0ac3217a6751b7e578 +```js file=/public/tutorials/cross-dom-solidity.js#L35-L36 hash=4ff3cdc48f17cfd7de4a6ef2d2671dc2 ``` {

Check the L1 Greeter

} @@ -348,10 +318,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/pages/builders/app-developers/tutorials/sdk-estimate-costs.mdx b/pages/builders/app-developers/tutorials/sdk-estimate-costs.mdx index 8c1b1d373..8b47d81c4 100644 --- a/pages/builders/app-developers/tutorials/sdk-estimate-costs.mdx +++ b/pages/builders/app-developers/tutorials/sdk-estimate-costs.mdx @@ -1,24 +1,27 @@ --- -title: Estimating transaction costs on OP Mainnet +title: Estimating transaction costs on OP Stack 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 viem to estimate the cost of a transaction on OP Stack. --- -import { Callout, Steps } from 'nextra/components' -import { WipCallout } from '@/components/WipCallout' +import { Callout, Steps, Tabs } from 'nextra/components' - -# Estimating transaction costs on OP Mainnet +# Estimating transaction costs on OP Stack - -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 [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 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. +## Supported networks + +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. + ## Dependencies * [node](https://nodejs.org/en/) @@ -26,41 +29,42 @@ Check out the full explainer on [OP Mainnet transaction fees](/builders/app-deve ## 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. +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-est-cost-tutorial + cd op-est-cost-tutorial + ``` -```bash -mkdir op-sample-project -cd op-sample-project -``` + {

Initialize the project

} -{

Initialize the Project

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

Install the Optimism SDK

} + {

Install viem

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

Install ethers.js

} + + 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 -pnpm add ethers@^5 -``` +## 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. -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. + You can use [this faucet](https://sepoliafaucet.com) to get ETH on Sepolia. ## Get ETH on OP Sepolia @@ -69,14 +73,14 @@ 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. ## 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. +Make sure this private key corresponds to an address that has ETH on Sepolia. ```bash export TUTORIAL_PRIVATE_KEY=0x... @@ -84,32 +88,14 @@ 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 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-estimate-costs.js#L3 hash=26b2fdb17dd6c8326a54ec51f0769528 -``` - -{

Import ethers.js

} - -```js file=/public/tutorials/sdk-estimate-costs.js#L4 hash=69a65ef97862612e4978b8563e6dbe3a -``` - -
+This will bring up a Node REPL prompt that allows you to run JavaScript code. ## Set session variables @@ -118,102 +104,98 @@ Let's set those up now. -{

Load your private key

} +{

Import viem and other necessary modules

} -```js file=/public/tutorials/sdk-estimate-costs.js#L6 hash=755b77a7ffc7dfdc186f36c37d3d847a +```js file=/public/tutorials/sdk-estimate-costs.js#L3-L6 hash=32ecaac58846bfe7e785e2cc35562120 ``` -{

Create the RPC provider

} - -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. +{

Set up the account

} -```js file=/public/tutorials/sdk-estimate-costs.js#L8 hash=1db780739476f924536f5fa58794b67f +```js file=/public/tutorials/sdk-estimate-costs.js#L8-L9 hash=165490e75b825c786a937fba7b8e159d ``` -{

Create the wallet instance

} +{

Create the public client

} -```js file=/public/tutorials/sdk-estimate-costs.js#L9 hash=d315a1ba59b2ee3f43d178bab816e930 +```js file=/public/tutorials/sdk-estimate-costs.js#L11-L14 hash=42293ff382c932f806beb7252803a848 ``` +{

Create the wallet client

} + +```js file=/public/tutorials/sdk-estimate-costs.js#L16-L19 hash=e7b6423850765242512e71589382791b +```
## 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 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`. + {

Create the unsigned transaction

} -{

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. -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). + 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#L11-L15 hash=22d44a7322d2d378e886a0ba5a0c6fec +```js file=/public/tutorials/sdk-estimate-costs.js#L21-L26 hash=d2f3fc3df8298253bd45a226dd171dcf ``` -{

Estimate the execution gas fee

} + {

Estimate the total cost

} -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. + 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#L18-L21 hash=8090c6513655722e1194d4d9f0f794af +```js file=/public/tutorials/sdk-estimate-costs.js#L28-L29 hash=db562f050d0affe866e2114779656d3a ``` -{

Estimate the L1 data fee

} + {

Send the transaction

} -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. + 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#L24-L25 hash=c5b1b1754aede507d071419fa051e3d7 +```js file=/public/tutorials/sdk-estimate-costs.js#L31-L35 hash=419162648c0c6c0d5e82ca8f6d4942d5 ``` -{

Estimate the total cost

} + {

Check the actual execution gas fee

} -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 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 -```js file=/public/tutorials/sdk-estimate-costs.js#L28-L29 hash=f7315f3dbf96423569a42c902eeee45c +```js file=/public/tutorials/sdk-estimate-costs.js#L37-L38 hash=57dba68f78481bea90e7629270a1f58b ``` -{

Send the transaction

} + {

Check the actual L1 data fee

} -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. + You can also check the actual L1 data fee. -```js file=/public/tutorials/sdk-estimate-costs.js#L32-L34 hash=f0cc7ae37a28a884aa7f47f13b381681 +```js file=/public/tutorials/sdk-estimate-costs.js#L40-L41 hash=e728708954c71fe52c55912dbe778042 ``` -{

Check the actual execution gas fee

} + {

Check the actual total cost

} -Once you get back the transaction receipt, check the actual execution gas fee. + Sum these two together to get the actual total cost of the transaction. -```js file=/public/tutorials/sdk-estimate-costs.js#L37-L38 hash=3b3ce48412906a44c1d2f6861a99c8a0 +```js file=/public/tutorials/sdk-estimate-costs.js#L43-L44 hash=38a1eadb48d89d476ea51658514d23c0 ``` -{

Check the actual L1 data fee

} + {

Check the difference

} -You can also check the actual L1 data fee. + 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 file=/public/tutorials/sdk-estimate-costs.js#L41-L42 hash=3438ad167823b837f3511759a06e73f3 +```js file=/public/tutorials/sdk-estimate-costs.js#L46-L47 hash=20c8c60af1cc39e842b207cfd2dfa2cb ``` +
-{

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 -``` - -{

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! + +Estimates will never be entirely accurate due to network conditions and gas price fluctuations, but they should be close to the actual costs. + -```js file=/public/tutorials/sdk-estimate-costs.js#L49-L50 hash=358adb5552c9f00484a6bb0580109fd8 -``` +## 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. 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 5b95054cf..543de2792 100644 --- a/pages/builders/app-developers/tutorials/send-tx-from-eth.mdx +++ b/pages/builders/app-developers/tutorials/send-tx-from-eth.mdx @@ -1,25 +1,18 @@ --- -title: Triggering OP Mainnet transactions from Ethereum +title: Triggering OP Stack transactions from Ethereum 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 Stack Sequencer using Viem. --- import { Callout, Steps } from 'nextra/components' -import { WipCallout } from '@/components/WipCallout' - -# Triggering OP Mainnet transactions from Ethereum +# Triggering OP Stack 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. -Single-Sequencer models are simpler than their highly decentralized counterparts but they are also more vulnerable to potential downtime. +OP Stack 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. -You'll use the OP Sepolia testnet, but the same logic will apply to OP Mainnet. +Sequencer downtime must not be able to prevent users from transacting on the network. As a result, OP Stack includes a mechanism for "forcing" transactions to be included in the blockchain. This mechanism involves triggering a transaction on OP Stack by sending a transaction on Ethereum. +In this tutorial you'll learn how to trigger a transaction on OP Stack from Ethereum using Viem. You'll use the OP Sepolia testnet, but the same logic will apply to OP Stack. ## Dependencies @@ -28,57 +21,41 @@ You'll use the OP Sepolia testnet, but the same logic will apply to OP Mainnet. ## 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. + {

Make a Project Folder

} -{

Make a Project Folder

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

Initialize the Project

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

Install the Contracts Package

} + {

Initialize the Project

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

Install the Utils Package

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

Install ethers.js

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

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 -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. -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 @@ -93,7 +70,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 @@ -107,112 +84,86 @@ 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 the Contracts Package

} - -```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 file=/public/tutorials/send-tx-from-eth.js#L3-L6 hash=1e06dede41cb7ba0bd9414a8962521c6 + ```
## 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

} -{

Load your private key

} - -```js file=/public/tutorials/send-tx-from-eth.js#L7 hash=755b77a7ffc7dfdc186f36c37d3d847a -``` - -{

Create the RPC providers and wallets

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

Create the RPC providers and wallets

} + ```js file=/public/tutorials/send-tx-from-eth.js#L11-L13 hash=d5a5a1252f4b6ff026cd58de8e6ae7f1 + ```
## 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 file=/public/tutorials/send-tx-from-eth.js#L17-L18 hash=2bbd74b9de0c0fa0daca043ab9030ff0 ``` ## 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

} -{

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#L18-L22 hash=75e09aebd1fe33724587ce7464f91940 -``` + {

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#L25-L31 hash=a5ed372cf7ae78a6fea1e7a65c582cee -``` + {

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#L34-L43 hash=57a69ed74c2fb3bf2242b0452ed00f88 -``` + {

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#L46 hash=efcac85d794ab4711595112fbe2c7a8e -``` - -{

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 using the `@eth-optimism/core-utils` library 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 -``` + 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 -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 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#L57-L58 hash=e44227b3ca6f46e6a16a10689b11ad39 +```js file=/public/tutorials/send-tx-from-eth.js#L78-L79 hash=3885097e127ff18b3c2c2fc1d3d5a7c0 ``` ## 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. diff --git a/pages/builders/cex-wallet-developers.mdx b/pages/builders/cex-wallet-developers.mdx new file mode 100644 index 000000000..aedc0e7eb --- /dev/null +++ b/pages/builders/cex-wallet-developers.mdx @@ -0,0 +1,17 @@ +--- +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 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.mdx b/pages/builders/chain-operators.mdx new file mode 100644 index 000000000..73c0e4bb9 --- /dev/null +++ b/pages/builders/chain-operators.mdx @@ -0,0 +1,31 @@ +--- +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 +--- + +import { Card, Cards } from 'nextra/components' + +# Chain Operators + +Documentation covering Architecture, Configuration, Deploy, Features, Hacks, Management, Self Hosted, Tools, Tutorials in the Chain Operators section of the OP Stack ecosystem. + + + + + + + + + + + + + + + + + + + + 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/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 diff --git a/pages/builders/chain-operators/configuration.mdx b/pages/builders/chain-operators/configuration.mdx new file mode 100644 index 000000000..f8ea320f4 --- /dev/null +++ b/pages/builders/chain-operators/configuration.mdx @@ -0,0 +1,21 @@ +--- +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. Users will find API references and overviews to help understand and work with these topics. + + + + + + + + + + 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/configuration/batcher.mdx b/pages/builders/chain-operators/configuration/batcher.mdx index 334a2cbef..3b0dca073 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` diff --git a/pages/builders/chain-operators/deploy.mdx b/pages/builders/chain-operators/deploy.mdx new file mode 100644 index 000000000..87e4184f6 --- /dev/null +++ b/pages/builders/chain-operators/deploy.mdx @@ -0,0 +1,19 @@ +--- +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, 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/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.mdx b/pages/builders/chain-operators/features.mdx new file mode 100644 index 000000000..e2a22d516 --- /dev/null +++ b/pages/builders/chain-operators/features.mdx @@ -0,0 +1,25 @@ +--- +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 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/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/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. diff --git a/pages/builders/chain-operators/hacks.mdx b/pages/builders/chain-operators/hacks.mdx new file mode 100644 index 000000000..5a30e8912 --- /dev/null +++ b/pages/builders/chain-operators/hacks.mdx @@ -0,0 +1,27 @@ +--- +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' + +# Hacks + +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/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/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/management.mdx b/pages/builders/chain-operators/management.mdx new file mode 100644 index 000000000..df32978e5 --- /dev/null +++ b/pages/builders/chain-operators/management.mdx @@ -0,0 +1,27 @@ +--- +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' + +# Management + +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/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/management/best-practices.mdx b/pages/builders/chain-operators/management/best-practices.mdx index 9f268e0ad..d5bcd8ae6 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/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/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.mdx b/pages/builders/chain-operators/tools.mdx new file mode 100644 index 000000000..c8018d508 --- /dev/null +++ b/pages/builders/chain-operators/tools.mdx @@ -0,0 +1,29 @@ +--- +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' + +# Tools + +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/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/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 1fc8b90d9..ff1927eae 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 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 @@ -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. @@ -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. @@ -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). 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 49c15b723..6f5aba921 100644 --- a/pages/builders/chain-operators/tools/op-deployer.mdx +++ b/pages/builders/chain-operators/tools/op-deployer.mdx @@ -2,21 +2,23 @@ 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 deploying a standard OP Stack Chain. --- 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 that utilize the Superchain wide contracts. ## 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: +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 alternatively install from source, follow the steps below. You will need to install the Go toolchain and `just` as prerequisites. ### **Clone the monorepo**: @@ -32,94 +34,137 @@ 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 + cd op-deployer + just build ``` - ### (Optional) move `op-deployer` into `$PATH` + The binary will be in the `bin` directory. + - Run the following command to move the `op-deployer` binary into your `$PATH`. Note that the path for your system - may be different: +## Deployment usage - ```bash - sudo mv ./bin/op-deployer /usr/local/bin/op-deployer - ``` - +The base use case for `op-deployer` is deploying new OP Chains. This process is broken down into three steps: -## Usage + -### 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: ``` -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. +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 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.** + -Your intent file will look something like this: ```toml +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. -contractsRelease = "op-contracts/v1.6.0" # The version of the smart contracts to deploy. +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 + +# 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" + 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" -# 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" + # Update the fee recipient contract + 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] + l1ProxyAdminOwner = "0x1a66b55a4f0139c32eddf4f8c60463afc3832e76" + l2ProxyAdminOwner = "0x7759a8a43aa6a7ee9434ddb597beed64180c40fd" + systemConfigOwner = "0x8e35d9523a0c4c9ac537d254079c2398c6f3b35f" + unsafeBlockSigner = "0xbb19dce4ce51f353a98dbab31b5fa3bc80dc7769" + batcher = "0x0e9c62712ab826e06b16b2236ce542f711eaffaf" + proposer = "0x86dfafe0689e20685f7872e0cb264868454627bc" + challenger = "0xf1658da627dd0738c555f9572f658617511c49d5" + +``` + +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] + l2BlockTime = 1 # 1s L2blockTime is also standard, op-deployer defaults to 2s ``` -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. +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: ``` 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 +### `inspect`: generate genesis files and chain information + + + 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. + -With the contracts deployed, you can generate a genesis file for any of your L2s. Run the following command 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:" ``` -./bin/op-deployer inspect genesis --outfile genesis.json +cd .deployer +op-deployer --workdir .deployer inspect genesis > genesis.json +op-deployer --workdir .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 +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 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. -## More information +### OPCM bootstrap -`op-deployer` uses the OP Contracts Manager (OPCM) under the hood to deploy contracts. +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 diff --git a/pages/builders/chain-operators/tutorials.mdx b/pages/builders/chain-operators/tutorials.mdx new file mode 100644 index 000000000..6f99a4661 --- /dev/null +++ b/pages/builders/chain-operators/tutorials.mdx @@ -0,0 +1,27 @@ +--- +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' + +# 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/chain-operators/tutorials/_meta.json b/pages/builders/chain-operators/tutorials/_meta.json index 465ec6d7b..8643c85ac 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 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/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/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/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 diff --git a/pages/builders/node-operators.mdx b/pages/builders/node-operators.mdx new file mode 100644 index 000000000..9d25972cb --- /dev/null +++ b/pages/builders/node-operators.mdx @@ -0,0 +1,29 @@ +--- +title: Node Operators +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 +--- + +import { Card, Cards } from 'nextra/components' + +# Node Operators + +Documentation covering Architecture, Configuration, Json Rpc, Management, Network Upgrades, Releases, Rollup Node, Tutorials in the Node Operators section of the OP Stack ecosystem. + + + + + + + + + + + + + + + + + + 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.mdx b/pages/builders/node-operators/configuration.mdx new file mode 100644 index 000000000..da2c8f8a8 --- /dev/null +++ b/pages/builders/node-operators/configuration.mdx @@ -0,0 +1,21 @@ +--- +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' + +# 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 information to help you understand and work with these topics. + + + + + + + + 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.mdx b/pages/builders/node-operators/management.mdx new file mode 100644 index 000000000..428a4593d --- /dev/null +++ b/pages/builders/node-operators/management.mdx @@ -0,0 +1,25 @@ +--- +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' + +# Management + +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/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/management/metrics.mdx b/pages/builders/node-operators/management/metrics.mdx index 022f44f64..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 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/network-upgrades.mdx b/pages/builders/node-operators/network-upgrades.mdx index 40f2c38f5..290021c27 100644 --- a/pages/builders/node-operators/network-upgrades.mdx +++ b/pages/builders/node-operators/network-upgrades.mdx @@ -21,17 +21,18 @@ 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` | +| 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 +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/pages/builders/node-operators/tutorials.mdx b/pages/builders/node-operators/tutorials.mdx new file mode 100644 index 000000000..de908fd0f --- /dev/null +++ b/pages/builders/node-operators/tutorials.mdx @@ -0,0 +1,23 @@ +--- +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' + +# Tutorials + +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/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/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/notices.mdx b/pages/builders/notices.mdx new file mode 100644 index 000000000..27aaaa0ab --- /dev/null +++ b/pages/builders/notices.mdx @@ -0,0 +1,15 @@ +--- +title: Notices +description: Documentation covering Sdk Deprecation in the Notices section of the OP Stack ecosystem. +lang: en-US +--- + +import { Card, Cards } from 'nextra/components' + +# Notices + +Documentation covering Sdk Deprecation in the Notices section of the OP Stack ecosystem. + + + + diff --git a/pages/builders/notices/_meta.json b/pages/builders/notices/_meta.json index c52a90569..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/pages/builders/notices/sdk-deprecation.mdx b/pages/builders/notices/sdk-deprecation.mdx index b67ba7eff..4ec4765e9 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. @@ -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 +* 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 diff --git a/pages/builders/tools.mdx b/pages/builders/tools.mdx new file mode 100644 index 000000000..354ca94dd --- /dev/null +++ b/pages/builders/tools.mdx @@ -0,0 +1,25 @@ +--- +title: Tools +description: Welcome to the Optimism developer tools! +lang: en-US +--- + +import { Card, Cards } from 'nextra/components' + +# Tools + +Welcome to the Optimism developer tools! + + + + + + + + + + + + + + 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.mdx b/pages/builders/tools/build.mdx new file mode 100644 index 000000000..0d039842e --- /dev/null +++ b/pages/builders/tools/build.mdx @@ -0,0 +1,25 @@ +--- +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' + +# 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/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/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. diff --git a/pages/builders/tools/connect.mdx b/pages/builders/tools/connect.mdx new file mode 100644 index 000000000..50154b1f4 --- /dev/null +++ b/pages/builders/tools/connect.mdx @@ -0,0 +1,19 @@ +--- +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' + +# 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/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/connect/networks.mdx b/pages/builders/tools/connect/networks.mdx index f7a9e91cb..7440c93ec 100644 --- a/pages/builders/tools/connect/networks.mdx +++ b/pages/builders/tools/connect/networks.mdx @@ -1,4 +1,9 @@ --- +title: OPNetworks +lang: en-US +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/connect/rpc-providers.mdx b/pages/builders/tools/connect/rpc-providers.mdx index e896b1a4e..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 @@ -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 @@ -52,8 +64,9 @@ Moreover, Ankr offers access to developer tooling on OP Mainnet (and testnets) l ## 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 @@ -77,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/pages/builders/tools/monitor.mdx b/pages/builders/tools/monitor.mdx new file mode 100644 index 000000000..848483480 --- /dev/null +++ b/pages/builders/tools/monitor.mdx @@ -0,0 +1,19 @@ +--- +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' + +# 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/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/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. diff --git a/pages/builders/tools/op-tools.mdx b/pages/builders/tools/op-tools.mdx new file mode 100644 index 000000000..4335cef41 --- /dev/null +++ b/pages/builders/tools/op-tools.mdx @@ -0,0 +1,15 @@ +--- +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' + +# Op Tools + +This section provides information on . + + 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..6c45f77d2 100644 --- a/pages/chain/_meta.json +++ b/pages/chain/_meta.json @@ -1,9 +1,8 @@ { - "getting-started": "Getting Started: OP Mainnet", - "differences": "Differences Between Ethereum and OP Mainnet", + "getting-started": "Getting started: 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/differences.mdx b/pages/chain/differences.mdx deleted file mode 100644 index 3e50bf180..000000000 --- a/pages/chain/differences.mdx +++ /dev/null @@ -1,77 +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. - -## 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. - -### 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). diff --git a/pages/chain/identity.mdx b/pages/chain/identity.mdx new file mode 100644 index 000000000..87c4b79e5 --- /dev/null +++ b/pages/chain/identity.mdx @@ -0,0 +1,29 @@ +--- +title: Identity +description: This guide explains the role of decentralized identity in the Optimism Collective and its key components. +lang: en-US +--- + +import { Card, Cards } from 'nextra/components' + +# Identity + +This guide explains the role of decentralized identity in the Optimism Collective and its key components. + + + + + + + + + + + + + + + + + + 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.mdx b/pages/chain/security.mdx new file mode 100644 index 000000000..e4f10a998 --- /dev/null +++ b/pages/chain/security.mdx @@ -0,0 +1,19 @@ +--- +title: Security +description: Documentation covering Faq, Privileged Roles, Security Policy in the Security section of the OP Stack ecosystem. +lang: en-US +--- + +import { Card, Cards } from 'nextra/components' + +# Security + +Documentation covering Faq, Privileged Roles, Security Policy in the Security section of the OP Stack ecosystem. + + + + + + + + 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.mdx b/pages/chain/testing.mdx new file mode 100644 index 000000000..fc2af6d47 --- /dev/null +++ b/pages/chain/testing.mdx @@ -0,0 +1,17 @@ +--- +title: Testing +description: Documentation covering Dev Node, Testing Apps in the Testing section of the OP Stack ecosystem. +lang: en-US +--- + +import { Card, Cards } from 'nextra/components' + +# Testing + +Documentation covering Dev Node, Testing Apps in the Testing section of the OP Stack ecosystem. + + + + + + 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.mdx b/pages/connect/contribute.mdx new file mode 100644 index 000000000..a7cf78027 --- /dev/null +++ b/pages/connect/contribute.mdx @@ -0,0 +1,17 @@ +--- +title: Contribute +description: Documentation covering Docs Contribute, Stack Contribute, Style Guide in the Contribute section of the OP Stack ecosystem. +lang: en-US +--- + +import { Card, Cards } from 'nextra/components' + +# Contribute + +Documentation covering Docs Contribute, Stack Contribute, Style Guide in the Contribute section of the OP Stack ecosystem. + + + + + + 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/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. diff --git a/pages/connect/resources.mdx b/pages/connect/resources.mdx new file mode 100644 index 000000000..a4ae2c526 --- /dev/null +++ b/pages/connect/resources.mdx @@ -0,0 +1,15 @@ +--- +title: Resources +description: Documentation covering Glossary in the Resources section of the OP Stack ecosystem. +lang: en-US +--- + +import { Card, Cards } from 'nextra/components' + +# Resources + +Documentation covering Glossary in the Resources section of the OP Stack ecosystem. + + + + diff --git a/pages/stack/_meta.json b/pages/stack/_meta.json index 47b2dd20d..db6bc1efe 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,6 @@ }, "opcm": "OP Contracts Manager", "interop": "Interoperability", - "beta-features": "Beta Features" + "beta-features": "Beta features", + "research": "Research" } diff --git a/pages/stack/beta-features.mdx b/pages/stack/beta-features.mdx new file mode 100644 index 000000000..24257e8e3 --- /dev/null +++ b/pages/stack/beta-features.mdx @@ -0,0 +1,17 @@ +--- +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. + + + + + + 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/differences.mdx b/pages/stack/differences.mdx index 85e10a265..9d6e6250c 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. --- @@ -11,6 +12,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 +66,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. diff --git a/pages/stack/explainer.mdx b/pages/stack/explainer.mdx index 7390e26ee..a1fb71bef 100644 --- a/pages/stack/explainer.mdx +++ b/pages/stack/explainer.mdx @@ -146,9 +146,9 @@ 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. +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.mdx b/pages/stack/fault-proofs.mdx new file mode 100644 index 000000000..4da08bb26 --- /dev/null +++ b/pages/stack/fault-proofs.mdx @@ -0,0 +1,25 @@ +--- +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. + + + + + + + + + + + + + + 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/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/features.mdx b/pages/stack/features.mdx new file mode 100644 index 000000000..84cad55a4 --- /dev/null +++ b/pages/stack/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. + + + + diff --git a/pages/stack/interop.mdx b/pages/stack/interop.mdx new file mode 100644 index 000000000..b7823d3b7 --- /dev/null +++ b/pages/stack/interop.mdx @@ -0,0 +1,29 @@ +--- +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 Cross Chain Message, Explainer, Message Passing, Op Supervisor, Superchain Erc20, Superchain Weth, Supersim, Transfer Superchainerc20 in the Interop section of the OP Stack ecosystem. + + + + + + + + + + + + + + + + + + diff --git a/pages/stack/interop/_meta.json b/pages/stack/interop/_meta.json index d59a68f5d..3a5a6bcbe 100644 --- a/pages/stack/interop/_meta.json +++ b/pages/stack/interop/_meta.json @@ -1,6 +1,10 @@ { - "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", + "message-passing": "Interop message passing", + "superchain-weth": "SuperchainWETH (Interoperable ETH)", + "op-supervisor": "OP Supervisor", + "transfer-superchainERC20": "How to transfer a SuperchainERC20" } \ 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/message-passing.mdx b/pages/stack/interop/message-passing.mdx new file mode 100644 index 000000000..3be6ed39c --- /dev/null +++ b/pages/stack/interop/message-passing.mdx @@ -0,0 +1,66 @@ +--- +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 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 cross-chain message passing in the Superchain. + +## Overview + +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. + +## How it works + +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. + +```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 +``` + +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. + +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 + +* 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/pages/stack/interop/op-supervisor.mdx b/pages/stack/interop/op-supervisor.mdx new file mode 100644 index 000000000..7afafb83b --- /dev/null +++ b/pages/stack/interop/op-supervisor.mdx @@ -0,0 +1,72 @@ +--- +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 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 +* Provides a unified point for managing interoperability data +* Supports multiple networks simultaneously +* Offers potential for public endpoints to aid in node synchronization + +## 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⁠.⁠ + +* `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 + +## Log data indexing and management + +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: + +* 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 + +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: + +| 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 | + +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 + +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: + +* 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). diff --git a/pages/stack/interop/superchain-erc20.mdx b/pages/stack/interop/superchain-erc20.mdx index 092af2cb4..cbb41932a 100644 --- a/pages/stack/interop/superchain-erc20.mdx +++ b/pages/stack/interop/superchain-erc20.mdx @@ -1,33 +1,35 @@ --- -title: SuperchainERC20 Token Standard +title: SuperchainERC20 lang: en-US -description: Learn basic details about the SuperchainERC20 token standard. +description: Learn about the basic details of the 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 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: -* **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**: 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**: Intentionally designed to be generic and supported as an Ethereum-wide standard (RIP coming soon). +* **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 -`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. +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 @@ -55,19 +57,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 token implementations -`SuperchainERC20` differs from other token standards in its focus and implementation: +`SuperchainERC20` differs from other token implementations 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. - 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 +79,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 diff --git a/pages/stack/interop/superchain-weth.mdx b/pages/stack/interop/superchain-weth.mdx new file mode 100644 index 000000000..3799681ba --- /dev/null +++ b/pages/stack/interop/superchain-weth.mdx @@ -0,0 +1,86 @@ +--- +title: SuperchainWETH (Interoperable ETH) +lang: en-US +description: Learn basic details about 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 +* Maintains fungibility of ETH across the Superchain +* Provides liquidity for cross-chain transactions +* Improves user experience by abstracting complex bridging processes + + + The `SuperchainTokenBridge` can only rebalance assets 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: + +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). + + +```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`. + + +## 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. 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 + +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. +* Review the [Superchain Interop Explainer](explainer) for answers to common questions about interoperability. diff --git a/pages/stack/interop/transfer-superchainERC20.mdx b/pages/stack/interop/transfer-superchainERC20.mdx new file mode 100644 index 000000000..18e9fa29a --- /dev/null +++ b/pages/stack/interop/transfer-superchainERC20.mdx @@ -0,0 +1,117 @@ +--- +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 + + + 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. + +## Overview + +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 + + + Always verify your addresses and amounts before sending transactions. Cross-chain transfers cannot be reversed. + + +## 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 + participant SourceChain + participant Bridge as L2ToL2CrossDomainMessenger + participant DestChain + + Note over User,DestChain: Step 1: Prepare Tokens + User->>SourceChain: Check token balance + alt + 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 [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 + + To start the transfer: + + 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 3: Complete the transfer + + 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 + 3. The message relay will trigger the minting of tokens on the destination chain + + + 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 + + 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). + +## Alternative methods + +You can also use: + +* [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/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 diff --git a/pages/stack/research.mdx b/pages/stack/research.mdx new file mode 100644 index 000000000..1a485ee0f --- /dev/null +++ b/pages/stack/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. + + + + 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/research/block-time-research.mdx b/pages/stack/research/block-time-research.mdx new file mode 100644 index 000000000..ca8678765 --- /dev/null +++ b/pages/stack/research/block-time-research.mdx @@ -0,0 +1,79 @@ +--- +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/pages/stack/rollup.mdx b/pages/stack/rollup.mdx new file mode 100644 index 000000000..ca95c2564 --- /dev/null +++ b/pages/stack/rollup.mdx @@ -0,0 +1,19 @@ +--- +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... + + + + + + + + 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.mdx b/pages/stack/security.mdx new file mode 100644 index 000000000..fbf62b199 --- /dev/null +++ b/pages/stack/security.mdx @@ -0,0 +1,17 @@ +--- +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. + + + + + + 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/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) diff --git a/pages/stack/transactions.mdx b/pages/stack/transactions.mdx new file mode 100644 index 000000000..42bfac5a8 --- /dev/null +++ b/pages/stack/transactions.mdx @@ -0,0 +1,27 @@ +--- +title: Transactions +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 +--- + +import { Card, Cards } from 'nextra/components' + +# Transactions + +Documentation covering Cross Domain, Deposit Flow, Fees, Forced Transaction, Transaction Flow, Transactions, Withdrawal Flow in the Transactions section of the OP Stack ecosystem. + + + + + + + + + + + + + + + + diff --git a/pages/stack/transactions/_meta.json b/pages/stack/transactions/_meta.json index 20f41a7f2..25cae38ce 100644 --- a/pages/stack/transactions/_meta.json +++ b/pages/stack/transactions/_meta.json @@ -1,7 +1,8 @@ { - "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", + "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/pages/stack/transactions/fees.mdx b/pages/stack/transactions/fees.mdx index 809137e54..31340544a 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. @@ -45,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(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. diff --git a/pages/stack/transactions/transactions.mdx b/pages/stack/transactions/transactions.mdx new file mode 100644 index 000000000..02d703c69 --- /dev/null +++ b/pages/stack/transactions/transactions.mdx @@ -0,0 +1,25 @@ +--- +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. + + + + + + + + + + + + + + diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 92dd2f1bc..408b01112 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -21,16 +21,16 @@ importers: dependencies: '@eth-optimism/contracts-ts': specifier: ^0.17.0 - version: 0.17.2(typescript@5.4.5)(zod@3.23.8) + version: 0.17.0(typescript@5.3.2)(zod@3.22.4) '@eth-optimism/tokenlist': specifier: ^9.0.9 - version: 9.0.51 + version: 9.0.9 '@feelback/react': specifier: ^0.3.4 - version: 0.3.4(react@18.3.1) + version: 0.3.4(react@18.2.0) '@headlessui/react': specifier: ^2.1.8 - version: 2.1.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + 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 @@ -42,53 +42,56 @@ importers: 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) + 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.3.1(react@18.3.1))(react@18.3.1)) + 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.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.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.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) + 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.3.1 + version: 18.2.0 react-dom: specifier: ^18.2.0 - version: 18.3.1(react@18.3.1) + version: 18.2.0(react@18.2.0) search-insights: specifier: ^2.15.0 - version: 2.17.2 + 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.2 + version: 0.13.1 '@eth-optimism/sdk': specifier: ^3.1.6 - version: 3.3.0(ethers@5.7.2) + 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.7.0 + version: 8.1.3 eslint: specifier: ^8.53.0 - version: 8.57.0 + version: 8.54.0 eslint-plugin-mdx: specifier: ^2.2.0 - version: 2.3.4(eslint@8.57.0) + version: 2.2.0(eslint@8.54.0) ethers: specifier: ^5 version: 5.7.2 globby: specifier: ^11.0.4 - version: 11.1.0 + version: 11.0.4 gray-matter: specifier: ^4.0.3 version: 4.0.3 @@ -133,7 +136,7 @@ importers: version: 6.1.3 typescript: specifier: ^5.2.2 - version: 5.4.5 + version: 5.3.2 unified-lint-rule: specifier: ^2.1.2 version: 2.1.2 @@ -143,9 +146,16 @@ importers: 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==} @@ -195,20 +205,20 @@ packages: resolution: {integrity: sha512-g/VW9ZQEFJAOwAyUb8JFf7MLiLy2uEB4rU270rGzDwICxnxMlPy0O11KVePSgS36K1NI29gSlK84n5INGhd4Ag==} engines: {node: '>= 16'} - '@babel/code-frame@7.24.2': - resolution: {integrity: sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==} + '@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.24.2': - resolution: {integrity: sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==} + '@babel/highlight@7.23.4': + resolution: {integrity: sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==} engines: {node: '>=6.9.0'} - '@babel/runtime@7.24.4': - resolution: {integrity: sha512-dkxf7+hn8mFBwKjs9bvBlArzLVxVbS8usaPUDd5p2a9JCL9tB8OaOVN1isD4+Xyk4ns89/xeOmbQvgdK7IIVdA==} + '@babel/runtime@7.23.2': + resolution: {integrity: sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg==} engines: {node: '>=6.9.0'} '@braintree/sanitize-url@6.0.4': @@ -217,47 +227,47 @@ packages: '@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==} + '@cspell/cspell-bundled-dicts@8.1.3': + resolution: {integrity: sha512-TwLyL2bCtetXGhMudjOIgFPAsWF2UkT0E7T+DAZG8aUBfHoC/eco/sTmR6UJVpi6Crjs0YOQkFUBGrQ2pxJPcA==} engines: {node: '>=18'} - '@cspell/cspell-json-reporter@8.7.0': - resolution: {integrity: sha512-LTQPEvXvCqnc+ok9WXpSISZyt4/nGse9fVEM430g0BpGzKpt3RMx49B8uasvvnanzCuikaW9+wFLmwgvraERhA==} + '@cspell/cspell-json-reporter@8.1.3': + resolution: {integrity: sha512-9iOU0Y733XuF0cqC7xwzJkOKFdJ65rYGnHFdUHzr5lxEqeG9X/jhlkzyHuGGOhPxkUeFP1x9XoLhXo1isMDbKA==} engines: {node: '>=18'} - '@cspell/cspell-pipe@8.7.0': - resolution: {integrity: sha512-ePqddIQ4arqPQgOkC146SkZxvZb9/jL7xIM5Igy2n3tiWTC5ijrX/mbHpPZ1VGcFck+1M0cJUuyhuJk+vMj3rg==} + '@cspell/cspell-pipe@8.1.3': + resolution: {integrity: sha512-/dcnyLDeyFuoX4seZv7VsDQyRpt3ZY0vjZiDpqFul8hPydM8czLyRPPMD6Za+Gqg6dZmh9+VsQWK52hVsqc0QA==} engines: {node: '>=18'} - '@cspell/cspell-resolver@8.7.0': - resolution: {integrity: sha512-grZwDFYqcBYQDaz4AkUtdyqc4UUH2J3/7yWVkBbYDPE+FQHa9ofFXzXxyjs56GJlPfi9ULpe5/Wz6uVLg8rQkQ==} + '@cspell/cspell-resolver@8.1.3': + resolution: {integrity: sha512-bGyJYqkHRilqhyKGL/NvODN5U+UvCuQo7kxgt0i3Vd7m7k6XYLsSLYZ4w6r1S5IQ/ybU8I5lh6/6fNqKwvo9eg==} engines: {node: '>=18'} - '@cspell/cspell-service-bus@8.7.0': - resolution: {integrity: sha512-KW48iu0nTDzbedixc7iB7K7mlAZQ7QeMLuM/akxigOlvtOdVJrRa9Pfn44lwejts1ANb/IXil3GH8YylkVi76Q==} + '@cspell/cspell-service-bus@8.1.3': + resolution: {integrity: sha512-8E5ZveQKneNfK+cuFMy0y6tDsho71UPppEHNoLZsEFDbIxDdtQcAfs0pk4nwEzxPBt+dBB+Yl8KExQ6x2FAYQw==} engines: {node: '>=18'} - '@cspell/cspell-types@8.7.0': - resolution: {integrity: sha512-Rb+LCE5I9JEb/LE8nSViVSF8z1CWv/z4mPBIG37VMa7aUx2gAQa6gJekNfpY9YZiMzx4Tv3gDujN80ytks4pGA==} + '@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.1': - resolution: {integrity: sha512-NXO+kTPQGqaaJKa4kO92NAXoqS+i99dQzf3/L1BxxWVSBS3/k1f3uhmqIh7Crb/n22W793lOm0D9x952BFga3Q==} + '@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.31': - resolution: {integrity: sha512-hKVpV/lcGKP4/DpEPS8P4osPvFH/YVLJaDn9cBIOH6/HSmL5LbFgJNKpMGaYRbhm2FEX56MKE3yn/MNeNYuesQ==} + '@cspell/dict-companies@3.0.28': + resolution: {integrity: sha512-UinHkMYB/1pUkLKm1PGIm9PBFYxeAa6YvbB1Rq/RAAlrs0WDwiDBr3BAYdxydukG1IqqwT5z9WtU+8D/yV/5lw==} - '@cspell/dict-cpp@5.1.3': - resolution: {integrity: sha512-sqnriXRAInZH9W75C+APBh6dtben9filPqVbIsiRMUXGg+s02ekz0z6LbS7kXeJ5mD2qXoMLBrv13qH2eIwutQ==} + '@cspell/dict-cpp@5.0.10': + resolution: {integrity: sha512-WCRuDrkFdpmeIR6uXQYKU9loMQKNFS4bUhtHdv5fu4qVyJSh3k/kgmtTm1h1BDTj8EwPRc/RGxS+9Z3b2mnabA==} - '@cspell/dict-cryptocurrencies@5.0.0': - resolution: {integrity: sha512-Z4ARIw5+bvmShL+4ZrhDzGhnc9znaAGHOEMaB/GURdS/jdoreEDY34wdN0NtdLHDO5KO7GduZnZyqGdRoiSmYA==} + '@cspell/dict-cryptocurrencies@4.0.0': + resolution: {integrity: sha512-EiZp91ATyRxTmauIQfOX9adLYCunKjHEh092rrM7o2eMXP9n7zpXAL9BK7LviL+LbB8VDOm21q+s83cKrrRrsg==} '@cspell/dict-csharp@4.0.2': resolution: {integrity: sha512-1JMofhLK+4p4KairF75D3A924m5ERMgd1GvzhwK2geuYgd2ZKuGW72gvXpIV7aGf52E3Uu1kDXxxGAiZ5uVG7g==} @@ -283,14 +293,14 @@ packages: '@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-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.19': - resolution: {integrity: sha512-tHcXdkmm0t9LlRct1vgu3+h0KW/wlXCInkTiR4D/rl730q1zu2qVEgiy1saMiTUSNmdu7Hiy+Mhb+1braVqnZQ==} + '@cspell/dict-en_us@4.3.12': + resolution: {integrity: sha512-1bsUxFjgxF30FTzcU5uvmCvH3lyqVKR9dbwsJhomBlUM97f0edrd6590SiYBXDm7ruE68m3lJd4vs0Ev2D6FtQ==} '@cspell/dict-filetypes@3.0.3': resolution: {integrity: sha512-J9UP+qwwBLfOQ8Qg9tAsKtSY/WWmjj21uj6zXTI9hRLD1eG1uUOLcfVovAmtmVqUWziPSKMr87F6SXI3xmJXgw==} @@ -304,11 +314,11 @@ packages: '@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-gaming-terms@1.0.4': + resolution: {integrity: sha512-hbDduNXlk4AOY0wFxcDMWBPpm34rpqJBeqaySeoUH70eKxpxm+dvjpoRLJgyu0TmymEICCQSl6lAHTHSDiWKZg==} - '@cspell/dict-git@3.0.0': - resolution: {integrity: sha512-simGS/lIiXbEaqJu9E2VPoYW1OTC2xrwPPXNXFMa2uo/50av56qOuaxDrZ5eH1LidFXwoc8HROCHYeKoNrDLSw==} + '@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==} @@ -325,9 +335,6 @@ packages: '@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==} @@ -343,44 +350,41 @@ packages: '@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-npm@5.0.13': + resolution: {integrity: sha512-uPb3DlQA/FvlmzT5RjZoy7fy91mxMRZW1B+K3atVM5A/cmP1QlDaSW/iCtde5kHET1MOV7uxz+vy0Yha2OI5pQ==} - '@cspell/dict-php@4.0.6': - resolution: {integrity: sha512-ySAXisf7twoVFZqBV2o/DKiCLIDTHNqfnj0EfH9OoOUR7HL3rb6zJkm0viLUFDO2G/8SyIi6YrN/6KX+Scjjjg==} + '@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.6': - resolution: {integrity: sha512-bHqpSpJvLCUcWxj1ov/Ki8WjmESpYwRpQlqfdchekOTc93Huhvjm/RXVN1R4fVf4Hspyem1QVkCGqAmjJMj6sw==} + '@cspell/dict-public-licenses@2.0.5': + resolution: {integrity: sha512-91HK4dSRri/HqzAypHgduRMarJAleOX5NugoI8SjDLPzWYkwZ1ftuCXSk+fy8DLc3wK7iOaFcZAvbjmnLhVs4A==} - '@cspell/dict-python@4.1.11': - resolution: {integrity: sha512-XG+v3PumfzUW38huSbfT15Vqt3ihNb462ulfXifpQllPok5OWynhszCLCRQjQReV+dgz784ST4ggRxW452/kVg==} + '@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.2': - resolution: {integrity: sha512-cIh8KTjpldzFzKGgrqUX4bFyav5lC52hXDKo4LbRuMVncs3zg4hcSf4HtURY+f2AfEZzN6ZKzXafQpThq3dl2g==} + '@cspell/dict-ruby@5.0.1': + resolution: {integrity: sha512-rruTm7Emhty/BSYavSm8ZxRuVw0OBqzJkwIFXcV0cX7To8D1qbmS9HFHRuRg8IL11+/nJvtdDz+lMFBSmPUagQ==} - '@cspell/dict-rust@4.0.2': - resolution: {integrity: sha512-RhziKDrklzOntxAbY3AvNR58wnFGIo3YS8+dNeLY36GFuWOvXDHFStYw5Pod4f/VXbO/+1tXtywCC4zWfB2p1w==} + '@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.20': - resolution: {integrity: sha512-KmPwCxYWEu7SGyT/0m/n6i6R4ZgxbmN3XcerzA6Z629Wm5iZTVfJaMWqDK2RKAyBawS7OMfxGz0W/wYU4FhJlA==} + '@cspell/dict-software-terms@3.3.12': + resolution: {integrity: sha512-6aa4T9VqOMc0SFNBt6gxp0CWjvRqMg/uxvgpRbil+ToHWcU+Q+As0WKhPLaOniuTdCM85WWzRouD0O1XUGqg5Q==} - '@cspell/dict-sql@2.1.3': - resolution: {integrity: sha512-SEyTNKJrjqD6PAzZ9WpdSu6P7wgdNtGV2RV8Kpuw1x6bV+YsSptuClYG+JSdRExBTE6LwIe1bTklejUp3ZP8TQ==} + '@cspell/dict-sql@2.1.2': + resolution: {integrity: sha512-Pi0hAcvsSGtZZeyyAN1VfGtQJbrXos5x2QjJU0niAQKhmITSOrXU/1II1Gogk+FYDjWyV9wP2De0U2f7EWs6oQ==} '@cspell/dict-svelte@1.0.2': resolution: {integrity: sha512-rPJmnn/GsDs0btNvrRBciOhngKV98yZ9SHmg8qI6HLS8hZKvcXc0LMsf9LLuMK1TmS2+WQFAan6qeqg6bBxL2Q==} @@ -388,21 +392,18 @@ packages: '@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-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.7.0': - resolution: {integrity: sha512-xlEPdiHVDu+4xYkvwjL9MgklxOi9XB+Pr1H9s3Ww9WEq+q6BA3xOHxLIU/k8mhqFTMZGFZRCsdy/EwMu6SyRhQ==} + '@cspell/dynamic-import@8.1.3': + resolution: {integrity: sha512-/lXFLa92v4oOcZ2PbdRpOqBvnqWlYmGaV7iCy8+QhIWlMdzi+7tBX3LVTm9Jzvt/rJseVHQQ6RvfTsSmhbUMFQ==} engines: {node: '>=18.0'} - '@cspell/strong-weak-map@8.7.0': - resolution: {integrity: sha512-0bo0WwDr2lzGoCP7vbpWbDpPyuOrHKK+218txnUpx6Pn1EDBLfcDQsiZED5B6zlpwgbGi6y3vc0rWtJbjKvwzg==} + '@cspell/strong-weak-map@8.1.3': + resolution: {integrity: sha512-GhWyximzk8tumo0zhrDV3+nFYiETYefiTBWAEVbXJMibuvitFocVZwddqN85J0UdZ2M7q6tvBleEaI9ME/16gA==} engines: {node: '>=18'} '@double-great/alt-text@3.1.0': @@ -421,22 +422,22 @@ packages: 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==} + '@eslint/eslintrc@2.1.3': + resolution: {integrity: sha512-yZzuIG+jnVu6hNSzFEN07e8BxF3uAzYtQb6uDkaYZLo6oYZDCq454c5kB8zxnzfCYyP4MIuyBn10L0DqwujTmA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - '@eslint/js@8.57.0': - resolution: {integrity: sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==} + '@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.17.2': - resolution: {integrity: sha512-YVwPHpBZgFwFX9qY8+iToVAAH7mSnVIVmih+YfHhqjAhlLvLZfYjvj+hRNgcB9eRyl1SOOB0jevp4JOOV1v2BA==} + '@eth-optimism/contracts-bedrock@0.16.2': + resolution: {integrity: sha512-a2+f7soDbrd6jV74U02EpyMwQt2iZeDZ4c2ZwgkObcxXUZLZQ2ELt/VRFBf8TIL3wYcBOGpUa1aXAE2oHQ7oRA==} - '@eth-optimism/contracts-ts@0.17.2': - resolution: {integrity: sha512-5aM+pn1uK8Hx9r9+PHCF6NQTYKVHmrm7Gc7LQ6sO9MQItVP1WdIWNcQYT7TQhkxGKHYG2arF06rbHGeGNqzBeg==} + '@eth-optimism/contracts-ts@0.17.0': + resolution: {integrity: sha512-V4uJtS4ngAQ8tLSeIHWAK7ZNrz3a5Mf4YN3vf5U3u2/c+bKWIkGYgmD/GPQuyMmALOv67tJpFn3GRDTb9LgG1g==} peerDependencies: - '@wagmi/core': ^2.6.3 - wagmi: ^2.5.5 + '@wagmi/core': '>1.0.0' + wagmi: '>1.0.0' peerDependenciesMeta: '@wagmi/core': optional: true @@ -451,16 +452,16 @@ packages: '@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/core-utils@0.13.1': + resolution: {integrity: sha512-1FvzbUmCEy9zSKPG1QWg2VfA2Cy90xBA9Wkp11lXXrz91zUPCNCNSRTujXWYIC86ketNsZp7p4njSf6lTycHCw==} - '@eth-optimism/sdk@3.3.0': - resolution: {integrity: sha512-0Wt9roWe3itdzp08caCQLoFqhmT47ssquKAzBe7yXI6saVL+f2vWl6VgEaq0aYe2FsWvD9L0tSAJHLx1FiquNw==} + '@eth-optimism/sdk@3.1.6': + resolution: {integrity: sha512-YU3Sx4jPFfdXW4gs0PvnFDFPrJjbsaFxAJrsqxDpkUH3fMC3MmQgECYdkj8y1xTO6CTHm9gWLNC2WQdYTdNJsQ==} peerDependencies: ethers: ^5 - '@eth-optimism/tokenlist@9.0.51': - resolution: {integrity: sha512-GfKk4euEfNLniyRisP7sB/N9Kp96M+2t529mkvwC6nXITouzH4faDP8JdtwU6AOcgC4UlrFjXJ9w8ecnWWNQbw==} + '@eth-optimism/tokenlist@9.0.9': + resolution: {integrity: sha512-Wz0ZbvJKBUIikZpAjX1dqXYlSq0mHCnVXfGST+rZOhpCnY9Qwf9PEpSEK9kMeUz2ySDVV1mqtXtLgVjZb6z3Pg==} '@ethereumjs/rlp@4.0.1': resolution: {integrity: sha512-tqsQiBQDQdmPWE1xkkBq4rlSW5QZpLOUJ5RJh2/9fug+q9tnUhuZoVLk7s0scUIKTOzEtR72DFBXI4WiZcMpvw==} @@ -570,53 +571,51 @@ packages: peerDependencies: react: '>=17' - '@floating-ui/core@1.6.2': - resolution: {integrity: sha512-+2XpQV9LLZeanU4ZevzRnGFg2neDeKHgFLjP6YLW+tly0IvrhqT4u8enLGjLH3qeh85g19xY5rsAusfwTdn5lg==} + '@floating-ui/core@1.6.8': + resolution: {integrity: sha512-7XJ9cPU+yI2QeLS+FCSlqNFZJq8arvswefkZrYI1yQBbftw6FyrZOxYSh+9S7z7TpeWlRt9zJ5IhM1WIL334jA==} - '@floating-ui/dom@1.6.5': - resolution: {integrity: sha512-Nsdud2X65Dz+1RHjAIP0t8z5e2ff/IRbei6BqFrl1urT8sDVzM1HMQ+R0XcU5ceRfyO3I6ayeqIfh+6Wb8LGTw==} + '@floating-ui/dom@1.6.11': + resolution: {integrity: sha512-qkMCxSR24v2vGkhYDo/UzxfJN3D4syqSjyuTFz6C7XcpU1pASPRieNI0Kj5VP3/503mOfYiGY891ugBX1GlABQ==} - '@floating-ui/react-dom@2.1.0': - resolution: {integrity: sha512-lNzj5EQmEKn5FFKc04+zasr09h/uX8RtJRNj5gUXsSQIXHVWTVh+hVAg1vOMCexkX8EgvemMvIFpQfkosnVNyA==} + '@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.17': - resolution: {integrity: sha512-ESD+jYWwqwVzaIgIhExrArdsCL1rOAzryG/Sjlu8yaD3Mtqi3uVyhbE2V7jD58Mo52qbzKz2eUY/Xgh5I86FCQ==} + '@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.2': - resolution: {integrity: sha512-J4yDIIthosAsRZ5CPYP/jQvUAQtlZTTD/4suA08/FEnlxqW3sKS9iAhgsa9VYLZ6vDHn/ixJgIqRQPotoBjxIw==} + '@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==} + '@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.10': - resolution: {integrity: sha512-6mLa2fjMDAFQi+/R10B+zU3edsUk/MDtENB2zHho0lqKU1uzhAfJLUduWds4nCo8wbl3vULtC5rJfZAQ1yqIng==} + '@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==} + '@humanwhocodes/config-array@0.11.13': + resolution: {integrity: sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==} 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 + '@humanwhocodes/object-schema@2.0.1': + resolution: {integrity: sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==} '@isaacs/cliui@8.0.2': resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} @@ -633,74 +632,74 @@ packages: peerDependencies: react: '>=16' - '@napi-rs/simple-git-android-arm-eabi@0.1.16': - resolution: {integrity: sha512-dbrCL0Pl5KZG7x7tXdtVsA5CO6At5ohDX3myf5xIYn9kN4jDFxsocl8bNt6Vb/hZQoJd8fI+k5VlJt+rFhbdVw==} + '@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.16': - resolution: {integrity: sha512-xYz+TW5J09iK8SuTAKK2D5MMIsBUXVSs8nYp7HcMi8q6FCRO7yJj96YfP9PvKsc/k64hOyqGmL5DhCzY9Cu1FQ==} + '@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.16': - resolution: {integrity: sha512-XfgsYqxhUE022MJobeiX563TJqyQyX4FmYCnqrtJwAfivESVeAJiH6bQIum8dDEYMHXCsG7nL8Ok0Dp8k2m42g==} + '@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.16': - resolution: {integrity: sha512-tkEVBhD6vgRCbeWsaAQqM3bTfpIVGeitamPPRVSbsq8qgzJ5Dx6ZedH27R7KSsA/uao7mZ3dsrNLXbu1Wy5MzA==} + '@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.16': - resolution: {integrity: sha512-R6VAyNnp/yRaT7DV1Ao3r67SqTWDa+fNq2LrNy0Z8gXk2wB9ZKlrxFtLPE1WSpWknWtyRDLpRlsorh7Evk7+7w==} + '@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.16': - resolution: {integrity: sha512-LAGI0opFKw/HBMCV2qIBK3uWSEW9h4xd2ireZKLJy8DBPymX6NrWIamuxYNyCuACnFdPRxR4LaRFy4J5ZwuMdw==} + '@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.16': - resolution: {integrity: sha512-I57Ph0F0Yn2KW93ep+V1EzKhACqX0x49vvSiapqIsdDA2PifdEWLc1LJarBolmK7NKoPqKmf6lAKKO9lhiZzkg==} + '@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.16': - resolution: {integrity: sha512-AZYYFY2V7hlcQASPEOWyOa3e1skzTct9QPzz0LiDM3f/hCFY/wBaU2M6NC5iG3d2Kr38heuyFS/+JqxLm5WaKA==} + '@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.16': - resolution: {integrity: sha512-9TyMcYSBJwjT8jwjY9m24BZbu7ozyWTjsmYBYNtK3B0Um1Ov6jthSNneLVvouQ6x+k3Ow+00TiFh6bvmT00r8g==} + '@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.16': - resolution: {integrity: sha512-uslJ1WuAHCYJWui6xjsyT47SjX6KOHDtClmNO8hqKz1pmDSNY7AjyUY8HxvD1lK9bDnWwc4JYhikS9cxCqHybw==} + '@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.16': - resolution: {integrity: sha512-SoEaVeCZCDF1MP+M9bMSXsZWgEjk4On9GWADO5JOulvzR1bKjk0s9PMHwe/YztR9F0sJzrCxwtvBZowhSJsQPg==} + '@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.16': - resolution: {integrity: sha512-C5wRPw9waqL2jk3jEDeJv+f7ScuO3N0a39HVdyFLkwKxHH4Sya4ZbzZsu2JLi6eEqe7RuHipHL6mC7B2OfYZZw==} + '@napi-rs/simple-git@0.1.9': + resolution: {integrity: sha512-qKzDS0+VjMvVyU28px+C6zlD1HKy83NIdYzfMQWa/g/V1iG/Ic8uwrS2ihHfm7mp7X0PPrmINLiTTi6ieUIKfw==} engines: {node: '>= 10'} '@next/env@13.5.6': @@ -763,23 +762,27 @@ packages: 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.3.0': - resolution: {integrity: sha512-t01iSXPuN+Eqzb4eBX0S5oubSqXbK/xXa1Ne18Hj8f9pStxztHCE2gfboSp/dZRLSqfuLpRK2nDXDK+W9puocA==} + '@noble/curves@1.6.0': + resolution: {integrity: sha512-TlaHRXDehJuRNR9TfZDNQ45mMEd5dwUwmicsafcIX4SsNiqnCHKjE/1alYPd/lDRVhxdhUAlv8uEhMCI5zjIJQ==} + engines: {node: ^14.21.3 || >=16} - '@noble/hashes@1.3.2': - resolution: {integrity: sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==} + '@noble/hashes@1.3.1': + resolution: {integrity: sha512-EbqwksQwz9xDRGfDST86whPBgM65E0OH/pCgqW0GBVzO22bNE+NuIbeTb714+IfSjU3aRk47EUvXIb5bTsenKA==} engines: {node: '>= 16'} - '@noble/hashes@1.3.3': - resolution: {integrity: sha512-V7/fPHgl+jsVPXqqeOzT8egNj2iBIVt+ECeMMG8TdcnTikP3oaBtUVqpT/gYCR68aEBJSF+XbYUxStjbFMqIIA==} + '@noble/hashes@1.3.2': + resolution: {integrity: sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==} engines: {node: '>= 16'} - '@noble/hashes@1.4.0': - 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==} @@ -793,12 +796,12 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} - '@npmcli/config@6.4.1': - resolution: {integrity: sha512-uSz+elSGzjCMANWa5IlbGczLYPkNI/LeR+cHrgaTqTrTSh9RHhOFA4daD2eRUz6lMtOW+Fnsb+qv7V2Zz8ML0g==} + '@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.6': - resolution: {integrity: sha512-tkYs0OYnzQm6iIRdfy+LcLBjcKuQCeE5YLb8KnrIlutJfheNaPvPpgoFEyEFgbjzl5PLZ3IA/BWAwRU0eHuQDA==} + '@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': @@ -809,58 +812,64 @@ packages: resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} - '@pkgr/core@0.1.1': - resolution: {integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==} + '@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.17.1': - resolution: {integrity: sha512-FLTySoSNqX++u0nWZJPPN5etXY0WBxaIe/YuL/GTEeuqUIuC/2bJSaw5hlsM6T2yjy6Y/VAxBcKSdAFUlU6njQ==} + '@react-aria/focus@3.18.4': + resolution: {integrity: sha512-91J35077w9UNaMK1cpMUEFRkNNz0uZjnSwiyBCFuRdaVuivO53wNC9XtWSDNDdcO5cGy87vfJRVAiyoCn/mjqA==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - '@react-aria/interactions@3.21.3': - resolution: {integrity: sha512-BWIuf4qCs5FreDJ9AguawLVS0lV9UU+sK4CCnbCNNmYqOWY+1+gRXCsnOM32K+oMESBxilAjdHW5n1hsMqYMpA==} + '@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 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - '@react-aria/ssr@3.9.4': - resolution: {integrity: sha512-4jmAigVq409qcJvQyuorsmBR4+9r3+JEC60wC+Y0MZV0HCtTmm8D9guYXlJMdx0SSkgj0hHAyFm/HvPNFofCoQ==} + '@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 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - '@react-aria/utils@3.24.1': - resolution: {integrity: sha512-O3s9qhPMd6n42x9sKeJ3lhu5V1Tlnzhu6Yk8QOvDuXf7UGuUjXf9mzfHJt1dYzID4l9Fwm8toczBzPM9t0jc8Q==} + '@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 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - '@react-stately/utils@3.10.1': - resolution: {integrity: sha512-VS/EHRyicef25zDZcM/ClpzYMC5i2YGN6uegOeQawmgfGjb02yaCX0F0zR69Pod9m2Hr3wunTbtpgVXvYbZItg==} + '@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 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - '@react-types/shared@3.23.1': - resolution: {integrity: sha512-5d+3HbFDxGZjhbMBeFHRQhexMFt4pUce3okyRtUVKbbedQFUrtXSBg9VszgF2RTeQDKDkMCIQDtz5ccP/Lk1gw==} + '@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 + 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.6': - resolution: {integrity: sha512-ok9AWwhcgYuGG3Zfhyqg+zwl+Wn5uE+dwC0NV/2qQkx4dABbb/bx96vWu8NSj+BNjjSjno+JRYRjle1jV08k3g==} + '@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.3.3': - resolution: {integrity: sha512-LJaN3HwRbfQK0X1xFSi0Q9amqOgzQnnDngIt+ZlsBC3Bm7/nE7K0kwshZHyaru79yIVRv/e1mQAjZyuZG6jOFQ==} + '@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.2.2': - resolution: {integrity: sha512-HYf9TUXG80beW+hGAt3TRM8wU6pQoYur9iNypTROm42dorCGmLnFe3eWjz3gOq6G62H2WRh0FCzAR1PI+29zIA==} + '@scure/bip39@1.4.0': + resolution: {integrity: sha512-BEEm6p8IueV/ZTfQLp/0vhw4NPnT9oWf5+28nvmeUICjP99f4vr2d+qc7AVGDDtwRep6ifR43Yed9ERVmiITzw==} '@swc/counter@0.1.3': resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} @@ -877,24 +886,15 @@ packages: 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==} + '@testing-library/dom@9.3.3': + resolution: {integrity: sha512-fB0R+fa3AUqbLHWyxXa2kGVtf1Fe1ZZFr0Zp6AIbIAzXb2mKbEXl+PCQNUOaq5lbTab5tfctfXRNsWXxa2f7Aw==} engines: {node: '>=14'} - '@testing-library/react@14.3.1': - resolution: {integrity: sha512-H99XjUhWQw0lTgyMN05W3xQG1Nh4lq574D8keFf1dDoNTJgp66VbJozRaczoF+wsiaPJNt/TcnfpLGufGxSrZQ==} + '@testing-library/react@14.1.2': + resolution: {integrity: sha512-z4p7DVBTPjKM5qDZ0t5ZjzkpSNb+fZy1u6bzO7kk8oeGagpPCAtgh4cx1syrfp7a+QWkM021jGqjJaxJJnXAZg==} engines: {node: '>=14'} peerDependencies: react: ^18.0.0 @@ -921,80 +921,83 @@ packages: '@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-chromatic@3.0.1': + resolution: {integrity: sha512-Ob7OrwiTeQXY/WBBbRHGZBOn6rH1h7y3jjpTSKYqDEeqFjktql6k2XSgNwLrLDmAsXhEn8P9NHDY4VTuo0ZY1w==} - '@types/d3-scale@4.0.8': - resolution: {integrity: sha512-gkK1VVTr5iNiYJ7vWDI+yUFFlszhNMtVeneJ6lUTKPjprsvLLI9/tgEGiXJOnlINJA8FyA88gfnQsHbybVZrYQ==} + '@types/d3-scale@4.0.7': + resolution: {integrity: sha512-/YEbMIOtqSFSELqUT8desdT3a7iybPkSQiIx/wN4CZ/5b7wrCvmyXWELTMUYB10k0N5rzHVu4f/OkhulG1b3Lw==} - '@types/d3-time@3.0.3': - resolution: {integrity: sha512-2p6olUZ4w3s+07q3Tm2dbiMZy5pCDfYwtLXXHUnVzXgQlZ/OyPtUz6OL382BkOuGlLXqfT+wqv8Fw2v8/0geBw==} + '@types/d3-time@3.0.2': + resolution: {integrity: sha512-kbdRXTmUgNfw5OTE3KZnFQn6XdIc4QGroN5UixgdrXATmYsdlPQS6pEut9tVlIojtzuFD4txs/L+Rq41AHtLpg==} - '@types/debug@4.1.12': - resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} + '@types/debug@4.1.11': + resolution: {integrity: sha512-R2qflTjHDs4CL6D/6TkqBeIHr54WzZfIxN729xvCNlYIVp2LknlnCro5Yo3frNaX2E5gO9pZ3/QAPVdGmu+q9w==} - '@types/estree-jsx@1.0.5': - resolution: {integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==} + '@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.10': - resolution: {integrity: sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw==} + '@types/hast@2.3.7': + resolution: {integrity: sha512-EVLigw5zInURhzfXUM65eixfadfsHKomGKUakToXo84t8gGIJuTcD2xooM2See7GyQ7DRtYjhCHnSUQez8JaLw==} - '@types/hast@3.0.4': - resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} + '@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.9': - resolution: {integrity: sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==} + '@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.7': - resolution: {integrity: sha512-HMwFiRujE5PjrgwHQ25+bsLJgowjGjm5Z8FVSf0N6PwgJrwxH0QxzHYDcKsTfV3wva0vzrpqMTJS2jXPr5BMEQ==} + '@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.17.0': - resolution: {integrity: sha512-t7dhREVv6dbNj0q17X12j7yDG4bD/DHYX7o5/DbDxobP0HnGPgpRz2Ej77aL7TZT3DSw13fqUTj8J4mMnqa7WA==} + '@types/lodash@4.14.202': + resolution: {integrity: sha512-OvlIYQK9tNneDlS0VN54LLd5uiPCBOp7gS5Z0f1mjoJYBrtStzgmJBxONW3U6OZqdtNzZPmn9BS/7WI7BFFcFQ==} - '@types/mdast@3.0.15': - resolution: {integrity: sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==} + '@types/mdast@3.0.14': + resolution: {integrity: sha512-gVZ04PGgw1qLZKsnWnyFv4ORnaJ+DXLdHTVSFbU8yX6xZ34Bjg4Q32yPkmveUP1yItXReKfB0Aknlh/3zxTKAw==} - '@types/mdast@4.0.3': - resolution: {integrity: sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg==} + '@types/mdast@4.0.2': + resolution: {integrity: sha512-tYR83EignvhYO9iU3kDg8V28M0jqyh9zzp5GV+EO+AYnyUl3P5ltkTeJuTiFZQFz670FSb3EwT/6LQdX+UdKfw==} - '@types/mdx@2.0.13': - resolution: {integrity: sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==} + '@types/mdx@2.0.9': + resolution: {integrity: sha512-OKMdj17y8Cs+k1r0XFyp59ChSOwf8ODGtMQ4mnpfz5eFDk1aO41yN3pSKGuvVzmWAkFp37seubY1tzOVpwfWwg==} - '@types/ms@0.7.34': - resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==} + '@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.12': - resolution: {integrity: sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==} + '@types/prop-types@15.7.9': + resolution: {integrity: sha512-n1yyPsugYNSmHgxDFjicaI2+gCNjsBck8UX9kuofAKlc0h1bL+20oSF72KeNaW2DUlesbEVCFgyV2dPGTiY42g==} + + '@types/react-dom@18.2.16': + resolution: {integrity: sha512-766c37araZ9vxtYs25gvY2wNdFWsT2ZiUvOd0zMhTaoGj6B911N8CKQWgXXJoPMLF3J82thpRqQA7Rf3rBwyJw==} - '@types/react-dom@18.3.0': - resolution: {integrity: sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==} + '@types/react@18.2.36': + resolution: {integrity: sha512-o9XFsHYLLZ4+sb9CWUYwHqFVoG61SesydF353vFMMsQziiyRu8np4n2OYMUSDZ8XuImxDr9c5tR7gidlH29Vnw==} - '@types/react@18.3.1': - resolution: {integrity: sha512-V0kuGBX3+prX+DQ/7r2qsv1NsdfnCLnTgnRJ1pYnxykBhGMz+qj+box5lq7XsO5mtZsBqpjwwTu/7wszPfMBcw==} + '@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.10': - resolution: {integrity: sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==} + '@types/unist@2.0.9': + resolution: {integrity: sha512-zC0iXxAv1C1ERURduJueYzkzZ2zaGyc+P2c95hgkikHPr3z8EdUZOlgEQ5X0DRmwDZn+hekycQnoeiiRVrmilQ==} - '@types/unist@3.0.2': - resolution: {integrity: sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==} + '@types/unist@3.0.1': + resolution: {integrity: sha512-ue/hDUpPjC85m+PM9OQDMZr3LywT+CT6mPsQq8OJtCLiERkGRcQUFvu9XASF5XWqyZFXbf15lvb3JFJ4dRLWPg==} '@ungap/structured-clone@1.2.0': resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} @@ -1003,8 +1006,19 @@ 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@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 @@ -1019,8 +1033,8 @@ packages: peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - acorn@8.11.3: - resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} + acorn@8.11.2: + resolution: {integrity: sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==} engines: {node: '>=0.4.0'} hasBin: true @@ -1086,9 +1100,8 @@ packages: 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-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==} @@ -1104,8 +1117,8 @@ packages: resolution: {integrity: sha512-ISvCdHdlTDlH5IpxQJIex7BWBywFWgjJSVdwst+/iQCoEYnyOaQ95+X1JGshuBjGp6nxKUy1jMgE3zPqN7fQdg==} hasBin: true - available-typed-arrays@1.0.7: - resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} + available-typed-arrays@1.0.5: + resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==} engines: {node: '>= 0.4'} bail@2.0.2: @@ -1117,6 +1130,10 @@ packages: 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==} @@ -1129,6 +1146,10 @@ packages: 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==} @@ -1152,13 +1173,16 @@ packages: 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.7: - resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} - engines: {node: '>= 0.4'} + call-bind@1.0.5: + resolution: {integrity: sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==} callsites@3.1.0: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} @@ -1167,8 +1191,8 @@ packages: 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==} + caniuse-lite@1.0.30001669: + resolution: {integrity: sha512-DlWzFDJqstqtIVx1zeSpIMLjunf5SmwOw0N2Ck/QSQdS8PLS4+9HrLaYei4w8BIAL7IB/UEDu889d8vhCTPA0w==} capital-case@1.0.4: resolution: {integrity: sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==} @@ -1176,8 +1200,8 @@ packages: ccount@2.0.1: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} - chai@4.4.1: - resolution: {integrity: sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==} + chai@4.3.10: + resolution: {integrity: sha512-0UXG04VuVbruMUYbJ6JctvH0YnC/4q3/AkT18q4NaITo91CUm0liMS9VqzT9vZhVQ/1eqPanMWjBM+Juhfb/9g==} engines: {node: '>=4'} chalk-template@1.1.0: @@ -1227,8 +1251,8 @@ packages: check-error@1.0.3: resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} - ci-info@4.0.0: - resolution: {integrity: sha512-TdHqgGf9odd8SXNuxtUBVx8Nv+qZOejE6qyqiy5NtbYYQOeFa6zmHkxlPzmaLxWWHsU6nJmB7AETdVPi+2NBUg==} + ci-info@3.9.0: + resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} engines: {node: '>=8'} clear-module@4.1.2: @@ -1262,9 +1286,9 @@ packages: 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@11.1.0: + resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==} + engines: {node: '>=16'} commander@7.2.0: resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} @@ -1301,6 +1325,9 @@ packages: 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==} @@ -1315,55 +1342,60 @@ packages: resolution: {integrity: sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==} engines: {node: '>=12'} - cspell-config-lib@8.7.0: - resolution: {integrity: sha512-depsd01GbLBo71/tfRrL5iECWQLS4CjCxA9C01dVkFAJqVB0s+K9KLKjTlq5aHOhcvo9Z3dHV+bGQCf5/Q7bfw==} + cspell-config-lib@8.1.3: + resolution: {integrity: sha512-whzJYxcxos3vnywn0alCFZ+Myc0K/C62pUurfOGhgvIba7ArmlXhNRaL2r5noBxWARtpBOtzz3vrzSBK7Lq6jg==} engines: {node: '>=18'} - cspell-dictionary@8.7.0: - resolution: {integrity: sha512-S6IpZSzIMxlOO/33NgCOuP0TPH2mZbw8d5CP44z5jajflloq8l74MeJLkeDzYfCRcm0Rtk0A5drBeMg+Ai34OA==} + cspell-dictionary@8.1.3: + resolution: {integrity: sha512-nkRQDPNnA6tw+hJFBqq26M0nK306q5rtyv/AUIWa8ZHhQkwzACnpMSpuJA7/DV5GVvPKltMK5M4A6vgfpoaFHw==} engines: {node: '>=18'} - cspell-gitignore@8.7.0: - resolution: {integrity: sha512-yvUZ86qyopUpDgn+YXP1qTpUe/lp65ZFvpMtw21lWHTFlg1OWKntr349EQU/5ben/K6koxk1FiElCBV7Lr4uFg==} + cspell-gitignore@8.1.3: + resolution: {integrity: sha512-NHx5lg44eCKb6yJmUPOCz4prcuYowzoo5GJ5hOcCfbk7ZEBWV1E2/kDRuQMOK2W0y1hNGr45CSxO3UxWJlYg7w==} engines: {node: '>=18'} hasBin: true - cspell-glob@8.7.0: - resolution: {integrity: sha512-AMdfx0gvROA/aIL8t8b5Y5NtMgscGZELFj6WhCSZiQSuWRxXUKiLGGLUFjx2y0hgXN9LUYOo6aBjvhnxI/v71g==} + cspell-glob@8.1.3: + resolution: {integrity: sha512-Likr7UVUXBpthQnM5r6yao3X0YBNRbJ9AHWXTC2RJfzwZOFKF+pKPfeo3FU+Px8My96M4RC2bVMbrbZUwN5NJw==} engines: {node: '>=18'} - cspell-grammar@8.7.0: - resolution: {integrity: sha512-SGcXc7322wU2WNRi7vtpToWDXTqZHhxqvR+aIXHT2kkxlMSWp3Rvfpshd0ckgY54nZtgw7R/JtKND2jeACRpwQ==} + cspell-grammar@8.1.3: + resolution: {integrity: sha512-dTOwNq6a5wcVzOsi4xY5/tq2r2w/+wLVU+WfyySTsPe66Rjqx/QceFl4OinImks/ZMKF7Zyjd3WGyQ5TcSsJFQ==} engines: {node: '>=18'} hasBin: true - cspell-io@8.7.0: - resolution: {integrity: sha512-o7OltyyvVkRG1gQrIqGpN5pUkHNnv6rvihb7Qu6cJ8jITinLGuWJuEQpgt0eF5yIr624jDbFwSzAxsFox8riQg==} + cspell-io@8.1.3: + resolution: {integrity: sha512-QkcFeYd79oIl7PgSqFSZyvwXnZQhXmdCI733n54IN2+iXDcf7W0mwptxoC/cE19RkEwAwEFLG81UAy6L/BXI6A==} engines: {node: '>=18'} - cspell-lib@8.7.0: - resolution: {integrity: sha512-qDSHZGekwiDmouYRECTQokE+hgAuPqREm+Hb+G3DoIo3ZK5H47TtEUo8fNCw22XsKefcF8X28LiyoZwiYHVpSg==} + cspell-lib@8.1.3: + resolution: {integrity: sha512-Kk8bpHVkDZO4MEiPkDvRf/LgJ0h5mufbKLTWModq6k0Ca8EkZ/qgQlZ0ve0rIivbleSqebuWjpJHKDM+IHmzHA==} engines: {node: '>=18'} - cspell-trie-lib@8.7.0: - resolution: {integrity: sha512-W3Nh2cO7gMV91r+hLqyTMgKlvRl4W5diKs5YiyOxjZumRkMBy42IzcNYtgIIacOxghklv96F5Bd1Vx/zY6ylGA==} + cspell-trie-lib@8.1.3: + resolution: {integrity: sha512-EDSYU9MCtzPSJDrfvDrTKmc0rzl50Ehjg1c5rUCqn33p2LCRe/G8hW0FxXe0mxrZxrMO2b8l0PVSGlrCXCQ8RQ==} engines: {node: '>=18'} - cspell@8.7.0: - resolution: {integrity: sha512-77nRPgLl240C6FK8RKVKo34lP15Lzp/6bk+SKYJFwUKKXlcgWXDis+Lw4JolA741/JgHtuxmhW1C8P7dCKjJ3w==} + cspell@8.1.3: + resolution: {integrity: sha512-SU4Su6002bPoJYaiMeNV4wwLoS8TwaOgIwaTxhys3GDbJIxZV6CrDgwksezHcG7TZrC4yrveDVsdpnrzmQ7T5Q==} engines: {node: '>=18'} hasBin: true - csstype@3.1.3: - resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + 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@3.29.2: - resolution: {integrity: sha512-2G1ycU28Nh7OHT9rkXRLpCDP30MKH1dXJORZuBhtEhEW7pKwgPi77ImqlCWinouyE1PNepIOGZBOrE84DG7LyQ==} + 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: @@ -1426,8 +1458,8 @@ packages: resolution: {integrity: sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==} engines: {node: '>=12'} - d3-geo@3.1.1: - resolution: {integrity: sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==} + d3-geo@3.1.0: + resolution: {integrity: sha512-JEo5HxXDdDYXCaWdwLRt79y7giK8SbhZJbFWXqbRTolCHFI5jRqteLzCsq51NKbUoX0PjBVSohxrx+NoOUujYA==} engines: {node: '>=12'} d3-hierarchy@3.1.2: @@ -1460,8 +1492,8 @@ packages: d3-sankey@0.12.3: resolution: {integrity: sha512-nQhsBRmM19Ax5xEIPLMY9ZmJ/cDvd1BG3UVvt5h3WRxKg5zGRbvnteTyWAbzeSvlh3tW7ZEmq4VwR5mB3tutmQ==} - d3-scale-chromatic@3.1.0: - resolution: {integrity: sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==} + d3-scale-chromatic@3.0.0: + resolution: {integrity: sha512-Lx9thtxAKrO2Pq6OO2Ua474opeziKr279P/TKZsMAhYyNDD3EnCffdbgeSYN5O7m2ByQsxtuP2CSDczNUIZ22g==} engines: {node: '>=12'} d3-scale@4.0.2: @@ -1501,15 +1533,15 @@ packages: resolution: {integrity: sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==} engines: {node: '>=12'} - d3@7.9.0: - resolution: {integrity: sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==} + 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.11: - resolution: {integrity: sha512-okzr3f11N6WuqYtZSvm+F776mB41wRZMhKP+hc34YdW+KmtYYK9iqvHSwo2k9FEH3fhGXvOPV6yz2IcSrfRUDg==} + dayjs@1.11.10: + resolution: {integrity: sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==} debug@4.3.4: resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} @@ -1534,16 +1566,28 @@ packages: 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==} + 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.1: - resolution: {integrity: sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw==} + delaunator@5.0.0: + resolution: {integrity: sha512-AyLvtyJdbv/U1GkiS6gUUzclRoAY4Gs75qkMygJJhU75LW4DNuSF2RMzpxs9jw9Oz1BobHjTdkG3zdP55VxAqw==} dequal@2.0.3: resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} @@ -1552,8 +1596,8 @@ packages: devlop@1.1.0: resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} - diff@5.2.0: - resolution: {integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==} + diff@5.1.0: + resolution: {integrity: sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==} engines: {node: '>=0.3.1'} dir-glob@3.0.1: @@ -1567,8 +1611,8 @@ packages: dom-accessibility-api@0.5.16: resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==} - dompurify@3.1.6: - resolution: {integrity: sha512-cTOAhc36AalkjtBpfG6O8JimdTMWNXjiePT2xQH/ppBGi/4uIpmj8eKyIkMJErXWARyINV/sB38yf8JCLF5pbQ==} + dompurify@3.0.6: + resolution: {integrity: sha512-ilkD8YEnnGh1zJ240uJsW7AzE+2qpbOUYjacomn3AvJ6J4JhKGSZ2nh4wUIXPZrEPppaCLx5jFe8T89Rk8tQ7w==} dot-case@3.0.4: resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} @@ -1580,8 +1624,8 @@ packages: eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - elkjs@0.9.3: - resolution: {integrity: sha512-f/ZeWvW/BCXbhGEf1Ujp29EASo/lk1FDnETgNKwJrsVvGZhUWCZyg3xLJjAsxfOmt8KjswHmI5EwCQcPMpOYhQ==} + elkjs@0.8.2: + resolution: {integrity: sha512-L6uRgvZTH+4OF5NE/MBbzQx/WYpru1xCBE9respNj6qznEewGUIfhzmm7horWWxbNO2M0WckQypGctR8lH79xQ==} elliptic@6.5.4: resolution: {integrity: sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==} @@ -1602,14 +1646,6 @@ packages: 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==} @@ -1625,8 +1661,8 @@ packages: resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} engines: {node: '>=12'} - eslint-mdx@2.3.4: - resolution: {integrity: sha512-u4NszEUyoGtR7Q0A4qs0OymsEQdCO6yqWlTzDa9vGWsK7aMotdnW0hqifHTkf6lEtA2vHk2xlkWHTCrhYLyRbw==} + 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' @@ -1637,8 +1673,8 @@ packages: peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - eslint-plugin-mdx@2.3.4: - resolution: {integrity: sha512-kr6tgaifKL+AVGYMtdYc2VCsIjfYQXuUCKz4rK58d2DpnPFHrmgXIOC7NcMvaEld+VOEpxBSCCnjnsf4IVCQGg==} + 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' @@ -1651,10 +1687,9 @@ packages: 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==} + eslint@8.54.0: + resolution: {integrity: sha512-NY0DfAkM8BIZDVl6PgSa1ttZbx3xHgJzSNJKYcQglem6CppHyMhRIQkBVSSMaSRnLhig3jsDbEzOjwCVt4AmmA==} 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: @@ -1704,12 +1739,11 @@ packages: 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-bloom-filters@1.0.10: + resolution: {integrity: sha512-rxJ5OFN3RwjQxDcFP2Z5+Q9ho4eIdEmSc2ht0fCu8Se9nbXjZ7/031uXoUYJ87KHCOdVeiUuwSnoS7hmYAGVHA==} - ethereum-cryptography@2.1.3: - resolution: {integrity: sha512-BlwbIL7/P45W8FGW2r7LGuvoEZ+7PWsniMvQ4p5s2xCyw9tmaDlpfsN9HjAucbF+t/qpVHwZUisgfK24TCW8aA==} + ethereum-cryptography@2.1.2: + resolution: {integrity: sha512-Z5Ba0T0ImZ8fqXrJbpHcbpAvIswRte2wGNR/KePnu8GbbvgJ47lMxT/ZZPG6i9Jaht4azPDop4HaM00J0J59ug==} ethers@5.7.2: resolution: {integrity: sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==} @@ -1722,6 +1756,14 @@ packages: 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'} @@ -1746,8 +1788,8 @@ packages: fast-levenshtein@2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - fastq@1.17.1: - resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + fastq@1.15.0: + resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} fault@2.0.1: resolution: {integrity: sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ==} @@ -1756,9 +1798,9 @@ packages: 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'} + 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==} @@ -1780,15 +1822,11 @@ packages: 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==} + flatted@3.2.9: + resolution: {integrity: sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==} - flexsearch@0.7.43: - resolution: {integrity: sha512-c5o/+Um8aqCSOXGcZoqZOm+NqtVwNsvVpWv6lfmSclU954O3wvQKxxK8zj74fPaSJbXpSLTs4PRhh+wnoCXnKg==} + flexsearch@0.7.31: + resolution: {integrity: sha512-XGozTsMPYkm+6b5QL3Z9wQcJjNYxp0CYn3U1gO7dwD6PAqU1SVWZxI9CCg3z+ml3YfqdPnrBehaBrnH2AGKbNA==} focus-visible@5.2.0: resolution: {integrity: sha512-Rwix9pBtC1Nuy5wysTmKy+UjbDJpIfg8eHjw0rjZ1mX4GNLz1Bmd16uDpI3Gk1i70Fgcs8Csg2lPm8HULFg9DQ==} @@ -1813,16 +1851,15 @@ packages: 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'} + 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.4: - resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} - engines: {node: '>= 0.4'} + 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==} @@ -1832,6 +1869,10 @@ packages: 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==} @@ -1852,30 +1893,28 @@ packages: 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==} + 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==} - 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==} + globals@13.23.0: + resolution: {integrity: sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==} engines: {node: '>=8'} - globby@11.1.0: - resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + globby@11.0.4: + resolution: {integrity: sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==} engines: {node: '>=10'} gopd@1.0.1: @@ -1910,19 +1949,19 @@ packages: resolution: {integrity: sha512-Pq0h+hvsVm6dDEa8x82GnLSYHOzNDt7f0ddFa3FqcQlgzEiptPqL+XrOJNavjOzSYiYWIrgeVYYgGlLmnxwilQ==} engines: {node: '>=8'} - has-property-descriptors@1.0.2: - resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + has-property-descriptors@1.0.1: + resolution: {integrity: sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==} - has-proto@1.0.3: - resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} + 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.2: - resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + has-tostringtag@1.0.0: + resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==} engines: {node: '>= 0.4'} hash-obj@4.0.0: @@ -1932,8 +1971,8 @@ packages: hash.js@1.1.7: resolution: {integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==} - hasown@2.0.2: - resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + hasown@2.0.0: + resolution: {integrity: sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==} engines: {node: '>= 0.4'} hast-util-from-dom@5.0.0: @@ -1954,8 +1993,8 @@ packages: hast-util-parse-selector@4.0.0: resolution: {integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==} - hast-util-raw@9.0.2: - resolution: {integrity: sha512-PldBy71wO9Uq1kyaMch9AHIghtQvIwxBUkv823pKmkTM3oV1JxtsTNYdevMxvUHqcnOAuO65JKU2+0NOxc2ksA==} + 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==} @@ -1963,8 +2002,8 @@ packages: 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-to-text@4.0.0: + resolution: {integrity: sha512-EWiE1FSArNBPUo1cKWtzqgnuRQwEeQbQtnFJRYV1hb1BWDgrAlBU0ExptvZMM/KSA82cDpm2sFGf3Dmc5Mza3w==} hast-util-whitespace@2.0.1: resolution: {integrity: sha512-nAxA0v8+vXSBDt3AnRUNjyRIQ0rD+ntpbAp4LnPkumc5M9yUbSMa4XDU9Q6etY4f1Wp4bNgvc1yjiZtsTTrSng==} @@ -1975,18 +2014,29 @@ packages: 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.1: - resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} + ignore@5.3.0: + resolution: {integrity: sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==} engines: {node: '>= 4'} import-fresh@3.3.0: @@ -1996,8 +2046,8 @@ packages: import-meta-resolve@2.2.2: resolution: {integrity: sha512-f8KcQ1D80V7RnqVm+/lirO9zkOxjGxhaTC1IPrBGd3MEfNgmNG67tSUO9gTi2F3Blr2Az6g1vocaxzkVnWl9MA==} - import-meta-resolve@4.1.0: - resolution: {integrity: sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==} + import-meta-resolve@4.0.0: + resolution: {integrity: sha512-okYUR7ZQPH+efeuMJGlq4f8ubUgO50kByRPyt/Cy1Io4PSRsPjxME+YlVaCOx+NIToW7hCsZNFJyTPFFKepRSA==} imurmurhash@0.1.4: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} @@ -2005,7 +2055,6 @@ packages: 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==} @@ -2014,15 +2063,11 @@ packages: 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==} + internal-slot@1.0.6: + resolution: {integrity: sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==} engines: {node: '>= 0.4'} internmap@1.0.1: @@ -2051,9 +2096,8 @@ packages: 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-array-buffer@3.0.2: + resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==} is-arrayish@0.2.1: resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} @@ -2083,6 +2127,16 @@ packages: 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==} @@ -2112,9 +2166,13 @@ packages: 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-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==} @@ -2151,13 +2209,11 @@ packages: 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-set@2.0.2: + resolution: {integrity: sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==} - is-shared-array-buffer@1.0.3: - resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==} - engines: {node: '>= 0.4'} + 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==} @@ -2166,6 +2222,14 @@ packages: 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'} @@ -2174,16 +2238,22 @@ packages: 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.2: - resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} - engines: {node: '>= 0.4'} + is-weakmap@2.0.1: + resolution: {integrity: sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==} - is-weakset@2.0.3: - resolution: {integrity: sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==} - engines: {node: '>= 0.4'} + 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==} @@ -2196,6 +2266,11 @@ packages: 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'} @@ -2220,8 +2295,8 @@ packages: 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==} + 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: @@ -2233,11 +2308,11 @@ packages: 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==} + jsonc-parser@3.2.0: + resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} - katex@0.16.10: - resolution: {integrity: sha512-ZiqaC04tp2O5utMsl2TEZTXxa6WSC4yo0fv5ML++D3QZv/vx2Mct0mTlRx3O+uUkjfuAgOkzsCmq5MiUEsDDdA==} + katex@0.16.9: + resolution: {integrity: sha512-fsSYjWS0EEOwvy81j3vRA8TEAhQhKiqO+FQaKWp0m39qwOzHVBgAUBIXWj1pB+O2W3fIpNa6Y9KSKCVbfPhyAQ==} hasBin: true keyv@4.5.4: @@ -2257,6 +2332,9 @@ packages: 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'} @@ -2304,8 +2382,8 @@ packages: lower-case@2.0.2: resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} - lru-cache@10.2.2: - resolution: {integrity: sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==} + lru-cache@10.0.3: + resolution: {integrity: sha512-B7gr+F6MkqB3uzINHXNctGieGsRTMwIBgxkp0yq/5BwcuDzD4A8wQpHQW6vDAm1uKSLQghmRdD9sKqf2vJ1cEg==} engines: {node: 14 || >=16.14} lru-cache@4.1.5: @@ -2326,8 +2404,8 @@ packages: markdown-table@3.0.3: resolution: {integrity: sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==} - match-sorter@6.3.4: - resolution: {integrity: sha512-jfZW7cWS5y/1xswZo8VBOdudUiSd9nifYRWphc9M5D/ee4w4AoXLgBEdRbgVaxbMuagBPeUC5y2Hi8DO6o9aDg==} + match-sorter@6.3.1: + resolution: {integrity: sha512-mxybbo3pPNuA+ZuCUhm5bwNkXrJTbsk5VWbR5wiwz/GC6LIiegBGn2w3O08UG/jdbYLinw51fSQ5xNU1U3MgBw==} mdast-comment-marker@2.1.2: resolution: {integrity: sha512-HED3ezseRVkBzZ0uK4q6RJMdufr/2p3VfVZstE3H1N9K8bwtspztWo6Xd7rEatuGNoCXaBna8oEqMwUn0Ve1bw==} @@ -2389,14 +2467,14 @@ packages: 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-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.1.0: - resolution: {integrity: sha512-/e2l/6+OdGp/FB+ctrJ9Avz71AN/GRH3oi/3KAx/kMnoUsD6q0woXlDT8lLEeViVKE7oZxE7RXzvO3T8kF2/sA==} + 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==} @@ -2413,6 +2491,9 @@ packages: 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'} @@ -2421,8 +2502,8 @@ packages: resolution: {integrity: sha512-LJKTl4iVNTndhL+3Uz/tfkjD0klIWsHlUzgtuNnNrsf7bAlXR30m+xYB7lHr5Z/l6e/yAIsr26Dabx6Buo4VGQ==} engines: {node: '>= 7.6.0'} - mermaid@10.9.3: - resolution: {integrity: sha512-V80X1isSEvAewIL3xhmz/rVmc27CVljcsbWxkxlWJWY/1kQa4XOABqpDl2qQLGKzpKm6WbTfUEKImBlUfFYArw==} + 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==} @@ -2430,8 +2511,8 @@ packages: 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-core-commonmark@2.0.0: + resolution: {integrity: sha512-jThOz/pVmAYUtkroV3D5c1osFXAMv9e0ypGDOIZuCeAe91/sD6BoE2Sjzt30yuXtwOYUmySOhMas/PVyh02itA==} micromark-extension-frontmatter@2.0.0: resolution: {integrity: sha512-C4AkuM3dA58cgZha7zVnuVxBhDsbttIMiytjgsM2XbHAB2faRVaHRle40558FBN+DJcrLNCoqG5mlrpdU4cRtg==} @@ -2511,8 +2592,8 @@ packages: 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-character@2.0.1: + resolution: {integrity: sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==} micromark-util-chunked@1.1.0: resolution: {integrity: sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ==} @@ -2580,8 +2661,8 @@ packages: 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-subtokenize@2.0.0: + resolution: {integrity: sha512-vc93L1t+gpR3p8jxeVdaYlbV2jTYteDje19rNSS/H5dlhxUYll5Fy6vJ2cDwP8RnsXi818yGty1ayP55y3W6fg==} micromark-util-symbol@1.1.0: resolution: {integrity: sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==} @@ -2608,6 +2689,14 @@ packages: 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'} @@ -2629,10 +2718,6 @@ packages: 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==} @@ -2662,8 +2747,8 @@ packages: react: '>=16.x <=18.x' react-dom: '>=16.x <=18.x' - next-seo@6.5.0: - resolution: {integrity: sha512-MfzUeWTN/x/rsKp/1n0213eojO97lIl0unxqbeCY+6pAucViHDA8GSLRRcXpgjsSmBxfCFdfpu7LXbt4ANQoNQ==} + 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' @@ -2745,8 +2830,16 @@ packages: resolution: {integrity: sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==} engines: {node: '>=4'} - npm-to-yarn@2.2.1: - resolution: {integrity: sha512-O/j/ROyX0KGLG7O6Ieut/seQ0oiTpHF2tXAcFbpdTLQFiaNtkyTXXocM1fwpaa60dg1qpWj0nHlbNhx6qwuENQ==} + 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: @@ -2756,23 +2849,35 @@ packages: object-inspect@1.13.1: resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} - object-is@1.1.6: - resolution: {integrity: sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==} + 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.5: - resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} + 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==} - optionator@0.9.4: - resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + 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: @@ -2854,8 +2959,12 @@ packages: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} - path-scurry@1.10.2: - resolution: {integrity: sha512-7xTavNy5RQXnsjANvVvMkEjvloOinkAjv/Z6Ildz9v2RinZ4SBKTWFOVRbaF8p0vpHnyjV/UwNDdKuUv6M5qcA==} + 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: @@ -2879,10 +2988,6 @@ packages: 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} @@ -2899,8 +3004,8 @@ packages: 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==} + property-information@6.4.0: + resolution: {integrity: sha512-9t5qARVofg2xQqKtytzt+lZ4d1Qvj8t5B8fEwXK6qOfgRLgH/b13QlgEyDh033NOS31nXeFbYv7CLUDG1CeifQ==} protocols@2.0.1: resolution: {integrity: sha512-/XJ368cyBJ7fzLMwLKv1e4vLxOju2MNAIokcr7meSaNcVbWz/CPcW22cP04mwxOErdA5mwjA8Q6w/cdAQxVn7Q==} @@ -2918,16 +3023,16 @@ packages: randombytes@2.1.0: resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} - react-dom@18.3.1: - resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==} + react-dom@18.2.0: + resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==} peerDependencies: - react: ^18.3.1 + react: ^18.2.0 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==} + react@18.2.0: + resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==} engines: {node: '>=0.10.0'} read-package-json-fast@3.0.2: @@ -2941,11 +3046,11 @@ packages: 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==} + regenerator-runtime@0.14.0: + resolution: {integrity: sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==} - regexp.prototype.flags@1.5.2: - resolution: {integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==} + regexp.prototype.flags@1.5.1: + resolution: {integrity: sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==} engines: {node: '>= 0.4'} rehype-katex@7.0.0: @@ -3096,8 +3201,8 @@ packages: 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==} + remove-accents@0.4.2: + resolution: {integrity: sha512-7pXIJqJOq5tFgG1A2Zxti3Ht8jJF337m4sowbuHsW30ZnkQFnDzy9qBNhgzX8ZLW4+UBcXiiR7SwR6pokHsxiA==} repeat-string@1.6.1: resolution: {integrity: sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==} @@ -3121,7 +3226,6 @@ packages: 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: @@ -3131,6 +3235,10 @@ packages: 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==} @@ -3147,8 +3255,8 @@ packages: safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - scheduler@0.23.2: - resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} + scheduler@0.23.0: + resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==} scroll-into-view-if-needed@3.1.0: resolution: {integrity: sha512-49oNpRjWRvnU8NyGVmUaYG4jtTkNonFZI86MmGRDqBphEK2EXT9gdEUoQPZhuBM8yWHxCWbobltqYO5M4XrUvQ==} @@ -3156,27 +3264,27 @@ packages: scrypt-js@3.0.1: resolution: {integrity: sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==} - search-insights@2.17.2: - resolution: {integrity: sha512-zFNpOpUO+tY2D85KrxJ+aqwnIfdEGi06UH2+xEb+Bp9Mwznmauqc9djbnBibJO5mpfUPPa8st6Sx65+vbeO45g==} + 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==} + 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.2.2: - resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + set-function-length@1.1.1: + resolution: {integrity: sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==} engines: {node: '>= 0.4'} - set-function-name@2.0.2: - resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} + set-function-name@2.0.1: + resolution: {integrity: sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==} engines: {node: '>= 0.4'} shebang-command@1.2.0: @@ -3195,12 +3303,11 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} - shiki@0.14.7: - resolution: {integrity: sha512-dNPAPrxSc87ua2sKJ3H5dQ/6ZaY8RNnaAqK+t0eG7p0Soi2ydiqbGOTaZCqaYvA/uZYfS1LJnemt3Q+mSfcPCg==} + shiki@0.14.5: + resolution: {integrity: sha512-1gCAYOcmCFONmErGTrS1fjzJLA7MGZmKzrBNX7apqSwhyITJg2O102uFzXUeBxNnEkDA9vHIKLyeKq0V083vIw==} - side-channel@1.0.6: - resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} - engines: {node: '>= 0.4'} + side-channel@1.0.4: + resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} signal-exit@3.0.7: resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} @@ -3220,8 +3327,8 @@ packages: resolution: {integrity: sha512-Pdz01AvCAottHTPQGzndktFNdbRA75BgOfeT1hH+AMnJFv8lynkPi42rfeEhpx1saTEI3YNMWxfqu0sFD1G8pw==} engines: {node: '>=12'} - source-map-js@1.2.0: - resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} + source-map-js@1.0.2: + resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} engines: {node: '>=0.10.0'} source-map@0.7.4: @@ -3253,8 +3360,8 @@ packages: 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==} + stringify-entities@4.0.3: + resolution: {integrity: sha512-BP9nNHMhhfcMbiuQKCqMjhDP5yBCAxsPu4pHFFzJ6Alo9dZgY4VLDPutXqIjpRiMoKdp7Av85Gr73Q5uH9k7+g==} strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} @@ -3272,6 +3379,14 @@ packages: 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'} @@ -3300,8 +3415,8 @@ packages: babel-plugin-macros: optional: true - stylis@4.3.2: - resolution: {integrity: sha512-bhtUjWd/z6ltJiQwg0dUfxEJ+W+jdqQd8TbWLWyeIJHlnsqmGLRFFd8e5mA0AZi/zx90smXRlN66YMTcaSFifg==} + stylis@4.3.0: + resolution: {integrity: sha512-E87pIogpwUsUwXw7dNyU4QDjdgVMy52m+XEOPEKUn161cCzWjjhPSQhByfd1CcNvrOLnXQ6OnnZDwnJrz/Z4YQ==} supports-color@4.5.0: resolution: {integrity: sha512-ycQR/UbvI9xIlEdQT1TQqwoXtEldExbCEAJgRo5YXlmSKjv6ThHnP9/vwGa1gr19Gfw+LkFd7KqYMhzrRC5JYw==} @@ -3319,8 +3434,8 @@ packages: resolution: {integrity: sha512-VL+lNrEoIXww1coLPOmiEmK/0sGigko5COxI09KzHc2VJXJsQ37UaQ+8quuxjDeA7+KnLGTWRyOXSLLR2Wb4jw==} engines: {node: '>=12'} - synckit@0.9.0: - resolution: {integrity: sha512-7RnqIMq572L8PeEzKeBINYEJDDxpcH8JEgLwUqBd3TkofhFRbkq4QLR0u+36avGAhCRbk2nnmjcW9SE531hPDg==} + synckit@0.8.5: + resolution: {integrity: sha512-L1dapNV6vu2s/4Sputv8xGsCdAVlb5nRDMFU/E27D44l5U6cw1g0dGd45uLc+OXjNMmF4ntiMdCimzcjFKQI8Q==} engines: {node: ^14.18.0 || >=16.0.0} tabbable@6.2.0: @@ -3341,6 +3456,10 @@ packages: 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==} @@ -3364,8 +3483,8 @@ packages: trim-lines@3.0.1: resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} - trough@2.2.0: - resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} + trough@2.1.0: + resolution: {integrity: sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g==} ts-dedent@2.2.0: resolution: {integrity: sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==} @@ -3396,8 +3515,8 @@ packages: 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==} + typescript@5.3.2: + resolution: {integrity: sha512-6l+RyNy7oAHDfxC4FzSJcz9vnjTKxrLpDG5M2Vu4SHRVNg6xzqZp6LYSR9zjqQTu8DU/f5xwxUdADOkbrIX2gQ==} engines: {node: '>=14.17'} hasBin: true @@ -3480,6 +3599,10 @@ packages: 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==} @@ -3540,8 +3663,16 @@ packages: vfile@6.0.1: resolution: {integrity: sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw==} - viem@2.9.28: - resolution: {integrity: sha512-/1iTg8yQlCNJ+7wSmdsBNB/vhjWqFJtTH6XZXHjGXrZnlBxAtHR5ZAr5TvTJc/2nhVIVE4BkCe5JCrIiSuZodg==} + 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: @@ -3566,13 +3697,16 @@ packages: web-namespaces@2.0.1: resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} - web-worker@1.3.0: - resolution: {integrity: sha512-BSR9wyRsy/KOValMgd5kMyr3JzpdeoR9KVId8u5GVlTTAtNChlsE4yTxeY7zMdNSyOmoKBv8NH2qeRY9Tg+IaA==} + web-worker@1.2.0: + resolution: {integrity: sha512-PgF341avzqyx60neE9DD+XS26MMNMoUQRz9NOZwW32nPQrF6p77f1htcnjBSEV8BGMKZ16choqUG4hyI0Hx7mA==} - web3-utils@1.10.4: - resolution: {integrity: sha512-tsu8FiKJLk2PzhDl9fXbGUWTkkVXYhtTA+SmEFkKft+9BgwLxfCRpU96sWv7ICC8zixBNd3JURVoiR3dUXgP8A==} + 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==} @@ -3582,12 +3716,11 @@ packages: 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-collection@1.0.1: + resolution: {integrity: sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==} - which-typed-array@1.1.15: - resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==} + which-typed-array@1.1.13: + resolution: {integrity: sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==} engines: {node: '>= 0.4'} which@1.3.1: @@ -3599,10 +3732,6 @@ packages: 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'} @@ -3641,6 +3770,18 @@ packages: 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'} @@ -3655,10 +3796,9 @@ packages: resolution: {integrity: sha512-zw0VAJxgeZ6+++/su5AFoqBbZbrEakwu+X0M5HmcwUiBL7AzcuPKjj5we4xfQLp78LkEMpD0cOnUhmgOVy3KdQ==} engines: {node: '>= 14'} - yaml@2.4.2: - resolution: {integrity: sha512-B3VqDZ+JAg1nZpaEmWtTXUlBneoGx6CPM9b0TENK6aoSu5t73dItudwdgmi6tHlIZZId4dZ9skcAQ2UbcyAeVA==} + yaml@2.3.4: + resolution: {integrity: sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==} engines: {node: '>= 14'} - hasBin: true yocto-queue@0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} @@ -3668,16 +3808,20 @@ packages: resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} engines: {node: '>=12.20'} - zod@3.23.8: - resolution: {integrity: sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==} + 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 @@ -3762,36 +3906,35 @@ snapshots: js-yaml: 4.1.0 lodash.clonedeep: 4.5.0 - '@babel/code-frame@7.24.2': + '@babel/code-frame@7.23.4': 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/highlight@7.24.2': + '@babel/highlight@7.23.4': 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': dependencies: - regenerator-runtime: 0.14.1 + regenerator-runtime: 0.14.0 '@braintree/sanitize-url@6.0.4': {} '@corex/deepmerge@4.0.43': {} - '@cspell/cspell-bundled-dicts@8.7.0': + '@cspell/cspell-bundled-dicts@8.1.3': 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,70 +3942,67 @@ 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 - '@cspell/cspell-json-reporter@8.7.0': + '@cspell/cspell-json-reporter@8.1.3': dependencies: - '@cspell/cspell-types': 8.7.0 + '@cspell/cspell-types': 8.1.3 - '@cspell/cspell-pipe@8.7.0': {} + '@cspell/cspell-pipe@8.1.3': {} - '@cspell/cspell-resolver@8.7.0': + '@cspell/cspell-resolver@8.1.3': dependencies: global-directory: 4.0.1 - '@cspell/cspell-service-bus@8.7.0': {} + '@cspell/cspell-service-bus@8.1.3': {} - '@cspell/cspell-types@8.7.0': {} + '@cspell/cspell-types@8.1.3': {} '@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-companies@3.0.28': {} - '@cspell/dict-cpp@5.1.3': {} + '@cspell/dict-cpp@5.0.10': {} - '@cspell/dict-cryptocurrencies@5.0.0': {} + '@cspell/dict-cryptocurrencies@4.0.0': {} '@cspell/dict-csharp@4.0.2': {} @@ -3880,11 +4020,11 @@ snapshots: '@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': {} @@ -3894,9 +4034,9 @@ snapshots: '@cspell/dict-fullstack@3.1.5': {} - '@cspell/dict-gaming-terms@1.0.5': {} + '@cspell/dict-gaming-terms@1.0.4': {} - '@cspell/dict-git@3.0.0': {} + '@cspell/dict-git@2.0.0': {} '@cspell/dict-golang@6.0.5': {} @@ -3908,8 +4048,6 @@ snapshots: '@cspell/dict-java@5.0.6': {} - '@cspell/dict-julia@1.0.1': {} - '@cspell/dict-k8s@1.0.2': {} '@cspell/dict-latex@4.0.0': {} @@ -3920,49 +4058,45 @@ snapshots: '@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-npm@5.0.13': {} - '@cspell/dict-php@4.0.6': {} + '@cspell/dict-php@4.0.4': {} '@cspell/dict-powershell@5.0.3': {} - '@cspell/dict-public-licenses@2.0.6': {} + '@cspell/dict-public-licenses@2.0.5': {} - '@cspell/dict-python@4.1.11': + '@cspell/dict-python@4.1.10': dependencies: '@cspell/dict-data-science': 1.0.11 '@cspell/dict-r@2.0.1': {} - '@cspell/dict-ruby@5.0.2': {} + '@cspell/dict-ruby@5.0.1': {} - '@cspell/dict-rust@4.0.2': {} + '@cspell/dict-rust@4.0.1': {} '@cspell/dict-scala@5.0.0': {} - '@cspell/dict-software-terms@3.3.20': {} + '@cspell/dict-software-terms@3.3.12': {} - '@cspell/dict-sql@2.1.3': {} + '@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': {} - '@cspell/dynamic-import@8.7.0': + '@cspell/dynamic-import@8.1.3': dependencies: - import-meta-resolve: 4.1.0 + import-meta-resolve: 4.0.0 - '@cspell/strong-weak-map@8.7.0': {} + '@cspell/strong-weak-map@8.1.3': {} '@double-great/alt-text@3.1.0': dependencies: @@ -3976,20 +4110,20 @@ snapshots: unified-lint-rule: 2.1.2 unist-util-visit-parents: 5.1.3 - '@eslint-community/eslint-utils@4.4.0(eslint@8.57.0)': + '@eslint-community/eslint-utils@4.4.0(eslint@8.54.0)': dependencies: - eslint: 8.57.0 + eslint: 8.54.0 eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.10.0': {} - '@eslint/eslintrc@2.1.4': + '@eslint/eslintrc@2.1.3': 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 @@ -3997,18 +4131,18 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/js@8.57.0': {} + '@eslint/js@8.54.0': {} - '@eth-optimism/contracts-bedrock@0.17.2': {} + '@eth-optimism/contracts-bedrock@0.16.2': {} - '@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)(zod@3.22.4)': 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))(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)(zod@3.22.4) transitivePeerDependencies: - bufferutil - typescript @@ -4042,12 +4176,12 @@ 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 - '@eth-optimism/core-utils@0.13.2': + '@eth-optimism/core-utils@0.13.1': dependencies: '@ethersproject/abi': 5.7.0 '@ethersproject/abstract-provider': 5.7.0 @@ -4060,7 +4194,7 @@ 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: @@ -4068,29 +4202,28 @@ snapshots: - encoding - utf-8-validate - '@eth-optimism/sdk@3.3.0(ethers@5.7.2)': + '@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.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 - '@eth-optimism/tokenlist@9.0.51': {} + '@eth-optimism/tokenlist@9.0.9': {} '@ethereumjs/rlp@4.0.1': {} '@ethereumjs/util@8.1.0': dependencies: '@ethereumjs/rlp': 4.0.1 - ethereum-cryptography: 2.1.3 + ethereum-cryptography: 2.1.2 micro-ftch: 0.3.1 '@ethersproject/abi@5.7.0': @@ -4350,55 +4483,54 @@ snapshots: '@feelback/js@0.3.4': {} - '@feelback/react@0.3.4(react@18.3.1)': + '@feelback/react@0.3.4(react@18.2.0)': dependencies: '@feelback/js': 0.3.4 - react: 18.3.1 + react: 18.2.0 - '@floating-ui/core@1.6.2': + '@floating-ui/core@1.6.8': dependencies: - '@floating-ui/utils': 0.2.2 + '@floating-ui/utils': 0.2.8 - '@floating-ui/dom@1.6.5': + '@floating-ui/dom@1.6.11': 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 - '@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))(react@18.2.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) - '@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))(react@18.2.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))(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 - '@floating-ui/utils@0.2.2': {} + '@floating-ui/utils@0.2.8': {} - '@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))(react@18.2.0)': 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) - '@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))(react@18.2.0)': 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@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: 18.2.0 + react-dom: 18.2.0(react@18.2.0) - '@humanwhocodes/config-array@0.11.14': + '@humanwhocodes/config-array@0.11.13': dependencies: - '@humanwhocodes/object-schema': 2.0.3 + '@humanwhocodes/object-schema': 2.0.1 debug: 4.3.4 minimatch: 3.1.2 transitivePeerDependencies: @@ -4406,7 +4538,7 @@ snapshots: '@humanwhocodes/module-importer@1.0.1': {} - '@humanwhocodes/object-schema@2.0.3': {} + '@humanwhocodes/object-schema@2.0.1': {} '@isaacs/cliui@8.0.2': dependencies: @@ -4421,8 +4553,8 @@ snapshots: '@mdx-js/mdx@2.3.0': 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 @@ -4441,58 +4573,58 @@ snapshots: transitivePeerDependencies: - supports-color - '@mdx-js/react@2.3.0(react@18.3.1)': + '@mdx-js/react@2.3.0(react@18.2.0)': 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 - '@napi-rs/simple-git-android-arm-eabi@0.1.16': + '@napi-rs/simple-git-android-arm-eabi@0.1.9': optional: true - '@napi-rs/simple-git-android-arm64@0.1.16': + '@napi-rs/simple-git-android-arm64@0.1.9': optional: true - '@napi-rs/simple-git-darwin-arm64@0.1.16': + '@napi-rs/simple-git-darwin-arm64@0.1.9': optional: true - '@napi-rs/simple-git-darwin-x64@0.1.16': + '@napi-rs/simple-git-darwin-x64@0.1.9': optional: true - '@napi-rs/simple-git-linux-arm-gnueabihf@0.1.16': + '@napi-rs/simple-git-linux-arm-gnueabihf@0.1.9': optional: true - '@napi-rs/simple-git-linux-arm64-gnu@0.1.16': + '@napi-rs/simple-git-linux-arm64-gnu@0.1.9': optional: true - '@napi-rs/simple-git-linux-arm64-musl@0.1.16': + '@napi-rs/simple-git-linux-arm64-musl@0.1.9': optional: true - '@napi-rs/simple-git-linux-x64-gnu@0.1.16': + '@napi-rs/simple-git-linux-x64-gnu@0.1.9': optional: true - '@napi-rs/simple-git-linux-x64-musl@0.1.16': + '@napi-rs/simple-git-linux-x64-musl@0.1.9': optional: true - '@napi-rs/simple-git-win32-arm64-msvc@0.1.16': + '@napi-rs/simple-git-win32-arm64-msvc@0.1.9': optional: true - '@napi-rs/simple-git-win32-x64-msvc@0.1.16': + '@napi-rs/simple-git-win32-x64-msvc@0.1.9': optional: true - '@napi-rs/simple-git@0.1.16': + '@napi-rs/simple-git@0.1.9': 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 + '@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 '@next/env@13.5.6': {} @@ -4525,19 +4657,23 @@ snapshots: '@next/swc-win32-x64-msvc@14.2.10': optional: true + '@noble/curves@1.1.0': + dependencies: + '@noble/hashes': 1.3.1 + '@noble/curves@1.2.0': dependencies: '@noble/hashes': 1.3.2 - '@noble/curves@1.3.0': + '@noble/curves@1.6.0': dependencies: - '@noble/hashes': 1.3.3 + '@noble/hashes': 1.5.0 - '@noble/hashes@1.3.2': {} + '@noble/hashes@1.3.1': {} - '@noble/hashes@1.3.3': {} + '@noble/hashes@1.3.2': {} - '@noble/hashes@1.4.0': {} + '@noble/hashes@1.5.0': {} '@nodelib/fs.scandir@2.1.5': dependencies: @@ -4549,24 +4685,24 @@ snapshots: '@nodelib/fs.walk@1.2.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': 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 - '@npmcli/map-workspaces@3.0.6': + '@npmcli/map-workspaces@3.0.4': 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 '@npmcli/name-from-folder@2.0.0': {} @@ -4574,73 +4710,88 @@ snapshots: '@pkgjs/parseargs@0.11.0': optional: true - '@pkgr/core@0.1.1': {} + '@pkgr/utils@2.4.2': + 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 '@popperjs/core@2.11.8': {} - '@react-aria/focus@3.17.1(react@18.3.1)': + '@react-aria/focus@3.18.4(react@18.2.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 - '@react-aria/interactions@3.21.3(react@18.3.1)': + '@react-aria/interactions@3.22.4(react@18.2.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 - '@react-aria/ssr@3.9.4(react@18.3.1)': + '@react-aria/ssr@3.9.6(react@18.2.0)': dependencies: '@swc/helpers': 0.5.2 - react: 18.3.1 + react: 18.2.0 - '@react-aria/utils@3.24.1(react@18.3.1)': + '@react-aria/utils@3.25.3(react@18.2.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 - '@react-stately/utils@3.10.1(react@18.3.1)': + '@react-stately/utils@3.10.4(react@18.2.0)': dependencies: '@swc/helpers': 0.5.2 - react: 18.3.1 + react: 18.2.0 - '@react-types/shared@3.23.1(react@18.3.1)': + '@react-types/shared@3.25.0(react@18.2.0)': dependencies: - react: 18.3.1 + react: 18.2.0 - '@scure/base@1.1.6': {} + '@scure/base@1.1.3': {} + + '@scure/base@1.1.9': {} + + '@scure/bip32@1.3.1': + dependencies: + '@noble/curves': 1.1.0 + '@noble/hashes': 1.3.2 + '@scure/base': 1.1.3 '@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 - '@scure/bip32@1.3.3': + '@scure/bip32@1.5.0': dependencies: - '@noble/curves': 1.3.0 - '@noble/hashes': 1.3.3 - '@scure/base': 1.1.6 + '@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.6 + '@scure/base': 1.1.3 - '@scure/bip39@1.2.2': + '@scure/bip39@1.4.0': dependencies: - '@noble/hashes': 1.3.3 - '@scure/base': 1.1.6 + '@noble/hashes': 1.5.0 + '@scure/base': 1.1.9 '@swc/counter@0.1.3': {} @@ -4653,26 +4804,18 @@ snapshots: '@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)': + '@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.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) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) '@tanstack/virtual-core@3.10.8': {} - '@tanstack/virtual-core@3.5.0': {} - - '@testing-library/dom@9.3.4': + '@testing-library/dom@9.3.3': 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 @@ -4680,25 +4823,25 @@ snapshots: lz-string: 1.5.0 pretty-format: 27.5.1 - '@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))(react@18.2.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) - '@theguild/remark-mermaid@0.0.5(react@18.3.1)': + '@theguild/remark-mermaid@0.0.5(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 '@theguild/remark-npm2yarn@0.2.1': dependencies: - npm-to-yarn: 2.2.1 + npm-to-yarn: 2.1.0 unist-util-visit: 5.0.0 '@types/acorn@4.0.6': @@ -4715,91 +4858,99 @@ snapshots: dependencies: '@types/node': 18.11.10 - '@types/d3-scale-chromatic@3.0.3': {} + '@types/d3-scale-chromatic@3.0.1': {} - '@types/d3-scale@4.0.8': + '@types/d3-scale@4.0.7': dependencies: - '@types/d3-time': 3.0.3 + '@types/d3-time': 3.0.2 - '@types/d3-time@3.0.3': {} + '@types/d3-time@3.0.2': {} - '@types/debug@4.1.12': + '@types/debug@4.1.11': dependencies: - '@types/ms': 0.7.34 + '@types/ms': 0.7.33 - '@types/estree-jsx@1.0.5': + '@types/estree-jsx@1.0.3': dependencies: '@types/estree': 1.0.5 '@types/estree@1.0.5': {} - '@types/hast@2.3.10': + '@types/hast@2.3.7': dependencies: - '@types/unist': 2.0.10 + '@types/unist': 2.0.9 - '@types/hast@3.0.4': + '@types/hast@3.0.2': dependencies: - '@types/unist': 3.0.2 + '@types/unist': 3.0.1 '@types/is-empty@1.2.3': {} - '@types/js-yaml@4.0.9': {} + '@types/js-yaml@4.0.8': {} '@types/json-schema@7.0.15': {} - '@types/katex@0.16.7': {} + '@types/katex@0.16.5': {} '@types/lodash.clonedeep@4.5.9': dependencies: - '@types/lodash': 4.17.0 + '@types/lodash': 4.14.202 - '@types/lodash@4.17.0': {} + '@types/lodash@4.14.202': {} - '@types/mdast@3.0.15': + '@types/mdast@3.0.14': dependencies: - '@types/unist': 2.0.10 + '@types/unist': 2.0.9 - '@types/mdast@4.0.3': + '@types/mdast@4.0.2': dependencies: - '@types/unist': 3.0.2 + '@types/unist': 3.0.1 - '@types/mdx@2.0.13': {} + '@types/mdx@2.0.9': {} - '@types/ms@0.7.34': {} + '@types/ms@0.7.33': {} '@types/node@18.11.10': {} - '@types/prop-types@15.7.12': {} + '@types/prop-types@15.7.9': {} - '@types/react-dom@18.3.0': + '@types/react-dom@18.2.16': dependencies: - '@types/react': 18.3.1 + '@types/react': 18.2.36 - '@types/react@18.3.1': + '@types/react@18.2.36': 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 + + '@types/scheduler@0.16.5': {} '@types/supports-color@8.1.3': {} - '@types/unist@2.0.10': {} + '@types/unist@2.0.9': {} - '@types/unist@3.0.2': {} + '@types/unist@3.0.1': {} '@ungap/structured-clone@1.2.0': {} abbrev@2.0.0: {} - abitype@1.0.0(typescript@5.4.5)(zod@3.23.8): + abitype@0.9.8(typescript@5.3.2)(zod@3.22.4): optionalDependencies: - typescript: 5.4.5 - zod: 3.23.8 + typescript: 5.3.2 + zod: 3.22.4 - acorn-jsx@5.3.2(acorn@8.11.3): + 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.3 + acorn: 8.11.2 - acorn@8.11.3: {} + acorn@8.11.2: {} aes-js@3.0.0: {} @@ -4871,10 +5022,10 @@ snapshots: dependencies: deep-equal: 2.2.3 - array-buffer-byte-length@1.0.1: + array-buffer-byte-length@1.0.0: dependencies: - call-bind: 1.0.7 - is-array-buffer: 3.0.4 + call-bind: 1.0.5 + is-array-buffer: 3.0.2 array-timsort@1.0.3: {} @@ -4884,9 +5035,7 @@ snapshots: astring@1.8.6: {} - available-typed-arrays@1.0.7: - dependencies: - possible-typed-array-names: 1.0.0 + available-typed-arrays@1.0.5: {} bail@2.0.2: {} @@ -4894,6 +5043,8 @@ snapshots: bech32@1.1.4: {} + big-integer@1.6.52: {} + bignumber.js@9.1.2: {} bn.js@4.11.6: {} @@ -4902,6 +5053,10 @@ snapshots: bn.js@5.2.1: {} + bplist-parser@0.2.0: + dependencies: + big-integer: 1.6.52 + brace-expansion@1.1.11: dependencies: balanced-match: 1.0.2 @@ -4923,17 +5078,19 @@ snapshots: bufio@1.2.1: {} + bundle-name@3.0.0: + dependencies: + run-applescript: 5.0.0 + busboy@1.6.0: dependencies: streamsearch: 1.1.0 - call-bind@1.0.7: + call-bind@1.0.5: 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 callsites@3.1.0: {} @@ -4942,7 +5099,7 @@ snapshots: pascal-case: 3.1.2 tslib: 2.6.2 - caniuse-lite@1.0.30001614: {} + caniuse-lite@1.0.30001669: {} capital-case@1.0.4: dependencies: @@ -4952,7 +5109,7 @@ snapshots: ccount@2.0.1: {} - chai@4.4.1: + chai@4.3.10: dependencies: assertion-error: 1.1.0 check-error: 1.0.3 @@ -5018,7 +5175,7 @@ snapshots: dependencies: get-func-name: 2.0.2 - ci-info@4.0.0: {} + ci-info@3.9.0: {} clear-module@4.1.2: dependencies: @@ -5048,7 +5205,7 @@ snapshots: comma-separated-tokens@2.0.3: {} - commander@12.0.0: {} + commander@11.1.0: {} commander@7.2.0: {} @@ -5093,6 +5250,10 @@ snapshots: dependencies: layout-base: 1.0.2 + cose-base@2.2.0: + dependencies: + layout-base: 2.0.1 + cross-spawn@5.1.0: dependencies: lru-cache: 4.1.5 @@ -5111,97 +5272,105 @@ snapshots: dependencies: type-fest: 1.4.0 - cspell-config-lib@8.7.0: + cspell-config-lib@8.1.3: 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 - cspell-dictionary@8.7.0: + cspell-dictionary@8.1.3: 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 - cspell-gitignore@8.7.0: + cspell-gitignore@8.1.3: dependencies: - cspell-glob: 8.7.0 + cspell-glob: 8.1.3 find-up-simple: 1.0.0 - cspell-glob@8.7.0: + cspell-glob@8.1.3: dependencies: micromatch: 4.0.5 - cspell-grammar@8.7.0: + cspell-grammar@8.1.3: 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 - cspell-io@8.7.0: + cspell-io@8.1.3: dependencies: - '@cspell/cspell-service-bus': 8.7.0 + '@cspell/cspell-service-bus': 8.1.3 - cspell-lib@8.7.0: + cspell-lib@8.1.3: 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 - cspell-trie-lib@8.7.0: + cspell-trie-lib@8.1.3: 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 - cspell@8.7.0: + cspell@8.1.3: 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 - csstype@3.1.3: {} + csstype@3.1.2: {} - cytoscape-cose-bilkent@4.1.0(cytoscape@3.29.2): + cytoscape-cose-bilkent@4.1.0(cytoscape@3.27.0): dependencies: cose-base: 1.0.3 - cytoscape: 3.29.2 + cytoscape: 3.27.0 + + cytoscape-fcose@2.2.0(cytoscape@3.27.0): + dependencies: + cose-base: 2.2.0 + cytoscape: 3.27.0 - cytoscape@3.29.2: {} + cytoscape@3.27.0: + dependencies: + heap: 0.2.7 + lodash: 4.17.21 d3-array@2.12.1: dependencies: @@ -5233,7 +5402,7 @@ snapshots: d3-delaunay@6.0.4: dependencies: - delaunator: 5.0.1 + delaunator: 5.0.0 d3-dispatch@3.0.1: {} @@ -5262,7 +5431,7 @@ snapshots: d3-format@3.1.0: {} - d3-geo@3.1.1: + d3-geo@3.1.0: dependencies: d3-array: 3.2.4 @@ -5287,7 +5456,7 @@ snapshots: d3-array: 2.12.1 d3-shape: 1.3.7 - d3-scale-chromatic@3.1.0: + d3-scale-chromatic@3.0.0: dependencies: d3-color: 3.1.0 d3-interpolate: 3.0.1 @@ -5337,7 +5506,7 @@ snapshots: d3-selection: 3.0.0 d3-transition: 3.0.1(d3-selection@3.0.0) - d3@7.9.0: + d3@7.8.5: dependencies: d3-array: 3.2.4 d3-axis: 3.0.0 @@ -5353,7 +5522,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 +5530,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 @@ -5372,10 +5541,10 @@ snapshots: dagre-d3-es@7.0.10: dependencies: - d3: 7.9.0 + d3: 7.8.5 lodash-es: 4.17.21 - dayjs@1.11.11: {} + dayjs@1.11.10: {} debug@4.3.4: dependencies: @@ -5391,40 +5560,54 @@ snapshots: deep-equal@2.2.3: 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 deep-is@0.1.4: {} - define-data-property@1.1.4: + default-browser-id@3.0.0: + dependencies: + bplist-parser: 0.2.0 + untildify: 4.0.0 + + 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 + + define-data-property@1.1.1: 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 + + define-lazy-prop@3.0.0: {} define-properties@1.2.1: 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 - delaunator@5.0.1: + delaunator@5.0.0: dependencies: robust-predicates: 3.0.2 @@ -5434,7 +5617,7 @@ snapshots: dependencies: dequal: 2.0.3 - diff@5.2.0: {} + diff@5.1.0: {} dir-glob@3.0.1: dependencies: @@ -5446,7 +5629,7 @@ snapshots: dom-accessibility-api@0.5.16: {} - dompurify@3.1.6: {} + dompurify@3.0.6: {} dot-case@3.0.4: dependencies: @@ -5459,7 +5642,7 @@ snapshots: eastasianwidth@0.2.0: {} - elkjs@0.9.3: {} + elkjs@0.8.2: {} elliptic@6.5.4: dependencies: @@ -5483,20 +5666,14 @@ snapshots: dependencies: is-arrayish: 0.2.1 - es-define-property@1.0.0: - dependencies: - get-intrinsic: 1.2.4 - - es-errors@1.3.0: {} - es-get-iterator@1.1.3: 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 @@ -5507,17 +5684,17 @@ snapshots: escape-string-regexp@5.0.0: {} - eslint-mdx@2.3.4(eslint@8.57.0): + eslint-mdx@2.2.0(eslint@8.54.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 @@ -5527,18 +5704,18 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-plugin-markdown@3.0.1(eslint@8.57.0): + eslint-plugin-markdown@3.0.1(eslint@8.54.0): dependencies: - eslint: 8.57.0 + eslint: 8.54.0 mdast-util-from-markdown: 0.8.5 transitivePeerDependencies: - supports-color - eslint-plugin-mdx@2.3.4(eslint@8.57.0): + eslint-plugin-mdx@2.2.0(eslint@8.54.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 @@ -5555,13 +5732,13 @@ snapshots: eslint-visitor-keys@3.4.3: {} - eslint@8.57.0: + eslint@8.54.0: 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 +5757,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,7 +5769,7 @@ 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: @@ -5600,8 +5777,8 @@ snapshots: espree@9.6.1: 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 esprima@4.0.1: {} @@ -5622,7 +5799,7 @@ snapshots: estree-util-build-jsx@2.2.2: 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 @@ -5630,7 +5807,7 @@ snapshots: estree-util-to-js@1.2.0: dependencies: - '@types/estree-jsx': 1.0.5 + '@types/estree-jsx': 1.0.3 astring: 1.8.6 source-map: 0.7.4 @@ -5640,8 +5817,8 @@ snapshots: estree-util-visit@1.2.1: 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: dependencies: @@ -5649,16 +5826,16 @@ snapshots: esutils@2.0.3: {} - ethereum-bloom-filters@1.1.0: + ethereum-bloom-filters@1.0.10: dependencies: - '@noble/hashes': 1.4.0 + js-sha3: 0.8.0 - ethereum-cryptography@2.1.3: + ethereum-cryptography@2.1.2: 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 ethers@5.7.2: dependencies: @@ -5711,6 +5888,30 @@ snapshots: signal-exit: 3.0.7 strip-eof: 1.0.0 + execa@5.1.1: + 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 + + execa@7.2.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 + extend-shallow@2.0.1: dependencies: is-extendable: 0.1.1 @@ -5733,7 +5934,7 @@ snapshots: fast-levenshtein@2.0.6: {} - fastq@1.17.1: + fastq@1.15.0: dependencies: reusify: 1.0.4 @@ -5745,9 +5946,9 @@ snapshots: dependencies: flat-cache: 3.2.0 - file-entry-cache@8.0.0: + file-entry-cache@7.0.2: dependencies: - flat-cache: 4.0.1 + flat-cache: 3.2.0 fill-range@7.0.1: dependencies: @@ -5767,18 +5968,13 @@ snapshots: flat-cache@3.2.0: dependencies: - flatted: 3.3.1 + flatted: 3.2.9 keyv: 4.5.4 rimraf: 3.0.2 - flat-cache@4.0.1: - dependencies: - flatted: 3.3.1 - keyv: 4.5.4 - - flatted@3.3.1: {} + flatted@3.2.9: {} - flexsearch@0.7.43: {} + flexsearch@0.7.31: {} focus-visible@5.2.0: {} @@ -5799,22 +5995,23 @@ snapshots: functions-have-names@1.2.3: {} - gensequence@7.0.0: {} + gensequence@6.0.0: {} get-func-name@2.0.2: {} - get-intrinsic@1.2.4: + get-intrinsic@1.2.2: 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 get-stdin@9.0.0: {} get-stream@3.0.0: {} + get-stream@6.0.1: {} + git-up@7.0.0: dependencies: is-ssh: 1.4.0 @@ -5836,13 +6033,13 @@ snapshots: dependencies: is-glob: 4.0.3 - glob@10.3.12: + glob@10.3.10: 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 glob@7.2.3: dependencies: @@ -5865,22 +6062,22 @@ snapshots: dependencies: ini: 4.1.1 - globals@13.24.0: + globals@13.23.0: dependencies: type-fest: 0.20.2 - globby@11.1.0: + globby@11.0.4: 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 gopd@1.0.1: dependencies: - get-intrinsic: 1.2.4 + get-intrinsic: 1.2.2 graceful-fs@4.2.11: {} @@ -5903,15 +6100,15 @@ snapshots: has-own-prop@2.0.0: {} - has-property-descriptors@1.0.2: + has-property-descriptors@1.0.1: dependencies: - es-define-property: 1.0.0 + get-intrinsic: 1.2.2 - has-proto@1.0.3: {} + has-proto@1.0.1: {} has-symbols@1.0.3: {} - has-tostringtag@1.0.2: + has-tostringtag@1.0.0: dependencies: has-symbols: 1.0.3 @@ -5926,26 +6123,26 @@ snapshots: inherits: 2.0.4 minimalistic-assert: 1.0.1 - hasown@2.0.2: + hasown@2.0.0: dependencies: function-bind: 1.1.2 hast-util-from-dom@5.0.0: dependencies: - '@types/hast': 3.0.4 + '@types/hast': 3.0.2 hastscript: 8.0.0 web-namespaces: 2.0.1 hast-util-from-html-isomorphic@2.0.0: 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 hast-util-from-html@2.0.1: 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 @@ -5954,32 +6151,32 @@ snapshots: hast-util-from-parse5@8.0.1: 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 hast-util-is-element@3.0.0: dependencies: - '@types/hast': 3.0.4 + '@types/hast': 3.0.2 hast-util-parse-selector@4.0.0: dependencies: - '@types/hast': 3.0.4 + '@types/hast': 3.0.2 - hast-util-raw@9.0.2: + hast-util-raw@9.0.1: 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 @@ -5990,16 +6187,16 @@ snapshots: hast-util-to-estree@2.3.3: 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 @@ -6009,18 +6206,18 @@ snapshots: hast-util-to-parse5@8.0.0: 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 - hast-util-to-text@4.0.2: + hast-util-to-text@4.0.0: 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 @@ -6028,10 +6225,10 @@ snapshots: hastscript@8.0.0: 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 header-case@2.0.4: @@ -6039,6 +6236,8 @@ snapshots: capital-case: 1.0.4 tslib: 2.6.2 + heap@0.2.7: {} + hmac-drbg@1.0.1: dependencies: hash.js: 1.1.7 @@ -6047,11 +6246,15 @@ snapshots: html-void-elements@3.0.0: {} + human-signals@2.1.0: {} + + human-signals@4.3.1: {} + iconv-lite@0.6.3: dependencies: safer-buffer: 2.1.2 - ignore@5.3.1: {} + ignore@5.3.0: {} import-fresh@3.3.0: dependencies: @@ -6060,7 +6263,7 @@ snapshots: import-meta-resolve@2.2.2: {} - import-meta-resolve@4.1.0: {} + import-meta-resolve@4.0.0: {} imurmurhash@0.1.4: {} @@ -6073,15 +6276,13 @@ snapshots: ini@4.1.1: {} - ini@4.1.2: {} - inline-style-parser@0.1.1: {} - internal-slot@1.0.7: + internal-slot@1.0.6: 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 internmap@1.0.1: {} @@ -6105,13 +6306,14 @@ snapshots: is-arguments@1.1.1: dependencies: - call-bind: 1.0.7 - has-tostringtag: 1.0.2 + call-bind: 1.0.5 + has-tostringtag: 1.0.0 - is-array-buffer@3.0.4: + is-array-buffer@3.0.2: 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 is-arrayish@0.2.1: {} @@ -6121,8 +6323,8 @@ snapshots: is-boolean-object@1.1.2: dependencies: - call-bind: 1.0.7 - has-tostringtag: 1.0.2 + call-bind: 1.0.5 + has-tostringtag: 1.0.0 is-buffer@2.0.5: {} @@ -6130,12 +6332,16 @@ snapshots: is-date-object@1.0.5: dependencies: - has-tostringtag: 1.0.2 + has-tostringtag: 1.0.0 is-decimal@1.0.4: {} is-decimal@2.0.1: {} + is-docker@2.2.1: {} + + is-docker@3.0.0: {} + is-empty@1.2.0: {} is-extendable@0.1.1: {} @@ -6154,11 +6360,15 @@ snapshots: is-hexadecimal@2.0.1: {} - is-map@2.0.3: {} + is-inside-container@1.0.0: + dependencies: + is-docker: 3.0.0 + + is-map@2.0.2: {} is-number-object@1.0.7: dependencies: - has-tostringtag: 1.0.2 + has-tostringtag: 1.0.0 is-number@7.0.0: {} @@ -6178,14 +6388,14 @@ snapshots: is-regex@1.1.4: dependencies: - call-bind: 1.0.7 - has-tostringtag: 1.0.2 + call-bind: 1.0.5 + has-tostringtag: 1.0.0 - is-set@2.0.3: {} + is-set@2.0.2: {} - is-shared-array-buffer@1.0.3: + is-shared-array-buffer@1.0.2: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.5 is-ssh@1.4.0: dependencies: @@ -6193,22 +6403,34 @@ snapshots: is-stream@1.1.0: {} + is-stream@2.0.1: {} + + is-stream@3.0.0: {} + is-string@1.0.7: dependencies: - has-tostringtag: 1.0.2 + has-tostringtag: 1.0.0 is-symbol@1.0.4: dependencies: has-symbols: 1.0.3 + is-typed-array@1.1.12: + dependencies: + which-typed-array: 1.1.13 + is-typedarray@1.0.0: {} - is-weakmap@2.0.2: {} + is-weakmap@2.0.1: {} - is-weakset@2.0.3: + is-weakset@2.0.2: dependencies: - call-bind: 1.0.7 - get-intrinsic: 1.2.4 + call-bind: 1.0.5 + get-intrinsic: 1.2.2 + + is-wsl@2.2.0: + dependencies: + is-docker: 2.2.1 isarray@2.0.5: {} @@ -6218,6 +6440,10 @@ snapshots: dependencies: ws: 8.13.0 + isows@1.0.6(ws@8.18.0): + dependencies: + ws: 8.18.0 + jackspeak@2.3.6: dependencies: '@isaacs/cliui': 8.0.2 @@ -6241,7 +6467,7 @@ snapshots: json-parse-even-better-errors@2.3.1: {} - json-parse-even-better-errors@3.0.1: {} + json-parse-even-better-errors@3.0.0: {} json-schema-traverse@0.4.1: {} @@ -6249,9 +6475,9 @@ snapshots: json-stable-stringify-without-jsonify@1.0.1: {} - jsonc-parser@3.2.1: {} + jsonc-parser@3.2.0: {} - katex@0.16.10: + katex@0.16.9: dependencies: commander: 8.3.0 @@ -6267,6 +6493,8 @@ snapshots: layout-base@1.0.2: {} + layout-base@2.0.1: {} + levn@0.4.1: dependencies: prelude-ls: 1.2.1 @@ -6276,7 +6504,7 @@ snapshots: load-plugin@5.1.0: dependencies: - '@npmcli/config': 6.4.1 + '@npmcli/config': 6.4.0 import-meta-resolve: 2.2.2 locate-path@6.0.0: @@ -6311,7 +6539,7 @@ snapshots: dependencies: tslib: 2.6.2 - lru-cache@10.2.2: {} + lru-cache@10.0.3: {} lru-cache@4.1.5: dependencies: @@ -6328,34 +6556,34 @@ snapshots: markdown-table@3.0.3: {} - match-sorter@6.3.4: + match-sorter@6.3.1: dependencies: - '@babel/runtime': 7.24.4 - remove-accents: 0.5.0 + '@babel/runtime': 7.23.2 + remove-accents: 0.4.2 mdast-comment-marker@2.1.2: dependencies: - '@types/mdast': 3.0.15 + '@types/mdast': 3.0.14 mdast-util-mdx-expression: 1.3.2 transitivePeerDependencies: - supports-color mdast-util-definitions@5.1.2: 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 mdast-util-find-and-replace@2.2.2: 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: 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 @@ -6365,8 +6593,8 @@ snapshots: mdast-util-from-markdown@1.3.1: 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 @@ -6382,8 +6610,8 @@ snapshots: mdast-util-from-markdown@2.0.0: 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 @@ -6399,7 +6627,7 @@ snapshots: mdast-util-frontmatter@2.0.1: 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 @@ -6410,25 +6638,25 @@ snapshots: mdast-util-gfm-autolink-literal@1.0.3: 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: 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: 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: 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 @@ -6437,7 +6665,7 @@ snapshots: mdast-util-gfm-task-list-item@1.0.2: dependencies: - '@types/mdast': 3.0.15 + '@types/mdast': 3.0.14 mdast-util-to-markdown: 1.5.0 mdast-util-gfm@2.0.2: @@ -6454,19 +6682,19 @@ snapshots: mdast-util-heading-style@2.0.1: dependencies: - '@types/mdast': 3.0.15 + '@types/mdast': 3.0.14 mdast-util-math@2.0.2: dependencies: - '@types/mdast': 3.0.15 + '@types/mdast': 3.0.14 longest-streak: 3.1.0 mdast-util-to-markdown: 1.5.0 mdast-util-mdx-expression@1.3.2: 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: @@ -6474,15 +6702,15 @@ snapshots: mdast-util-mdx-jsx@2.1.4: 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 @@ -6501,9 +6729,9 @@ snapshots: mdast-util-mdxjs-esm@1.3.1: 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: @@ -6511,18 +6739,18 @@ snapshots: mdast-util-phrasing@3.0.1: 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: dependencies: - '@types/mdast': 4.0.3 + '@types/mdast': 4.0.2 unist-util-is: 6.0.0 mdast-util-to-hast@12.3.0: 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 @@ -6530,22 +6758,21 @@ snapshots: unist-util-position: 4.0.4 unist-util-visit: 4.1.2 - mdast-util-to-hast@13.1.0: + mdast-util-to-hast@13.0.2: 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 mdast-util-to-markdown@1.5.0: 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 @@ -6555,10 +6782,10 @@ snapshots: mdast-util-to-markdown@2.1.0: 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 @@ -6568,11 +6795,13 @@ snapshots: mdast-util-to-string@3.2.0: dependencies: - '@types/mdast': 3.0.15 + '@types/mdast': 3.0.14 mdast-util-to-string@4.0.0: dependencies: - '@types/mdast': 4.0.3 + '@types/mdast': 4.0.2 + + merge-stream@2.0.0: {} merge2@1.4.1: {} @@ -6582,30 +6811,30 @@ snapshots: buffer-reverse: 1.0.1 crypto-js: 4.2.0 treeify: 1.1.0 - web3-utils: 1.10.4 + web3-utils: 1.10.3 - mermaid@10.9.3: + mermaid@10.6.1: 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 @@ -6630,7 +6859,7 @@ snapshots: micromark-util-types: 1.1.0 uvu: 0.5.6 - micromark-core-commonmark@2.0.1: + micromark-core-commonmark@2.0.0: dependencies: decode-named-character-reference: 1.0.2 devlop: 1.1.0 @@ -6639,20 +6868,20 @@ 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 micromark-extension-frontmatter@2.0.0: 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 @@ -6716,8 +6945,8 @@ snapshots: micromark-extension-math@2.1.2: 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 @@ -6766,8 +6995,8 @@ snapshots: micromark-extension-mdxjs@1.0.1: 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 @@ -6783,7 +7012,7 @@ snapshots: micromark-factory-destination@2.0.0: 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 @@ -6797,7 +7026,7 @@ snapshots: micromark-factory-label@2.0.0: 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 @@ -6819,7 +7048,7 @@ snapshots: micromark-factory-space@2.0.0: dependencies: - micromark-util-character: 2.1.0 + micromark-util-character: 2.0.1 micromark-util-types: 2.0.0 micromark-factory-title@1.1.0: @@ -6832,7 +7061,7 @@ snapshots: micromark-factory-title@2.0.0: 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 @@ -6846,7 +7075,7 @@ snapshots: micromark-factory-whitespace@2.0.0: 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 @@ -6855,7 +7084,7 @@ snapshots: micromark-util-symbol: 1.1.0 micromark-util-types: 1.1.0 - micromark-util-character@2.1.0: + micromark-util-character@2.0.1: dependencies: micromark-util-symbol: 2.0.0 micromark-util-types: 2.0.0 @@ -6876,7 +7105,7 @@ snapshots: micromark-util-classify-character@2.0.0: 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 @@ -6908,7 +7137,7 @@ snapshots: micromark-util-decode-string@2.0.0: 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 @@ -6920,7 +7149,7 @@ snapshots: 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 @@ -6955,7 +7184,7 @@ snapshots: micromark-util-sanitize-uri@2.0.0: 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 @@ -6966,7 +7195,7 @@ snapshots: micromark-util-types: 1.1.0 uvu: 0.5.6 - micromark-util-subtokenize@2.0.1: + micromark-util-subtokenize@2.0.0: dependencies: devlop: 1.1.0 micromark-util-chunked: 2.0.0 @@ -6990,7 +7219,7 @@ snapshots: micromark@3.2.0: 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 @@ -7012,13 +7241,13 @@ snapshots: micromark@4.0.0: 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,7 +7255,7 @@ 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: @@ -7037,6 +7266,10 @@ snapshots: braces: 3.0.2 picomatch: 2.3.1 + mimic-fn@2.1.0: {} + + mimic-fn@4.0.0: {} + min-indent@1.0.1: {} minimalistic-assert@1.0.1: {} @@ -7055,10 +7288,6 @@ snapshots: dependencies: brace-expansion: 2.0.1 - minimatch@9.0.4: - dependencies: - brace-expansion: 2.0.1 - minimist@1.2.8: {} minipass@7.0.4: {} @@ -7071,48 +7300,48 @@ snapshots: natural-compare@1.4.0: {} - 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))(react@18.2.0): 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 - 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))(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.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: 18.2.0 + react-dom: 18.2.0(react@18.2.0) - 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(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.3.1(react@18.3.1))(react@18.3.1) + 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.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))(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.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: 18.2.0 + react-dom: 18.2.0(react@18.2.0) - 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))(react@18.2.0): 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 @@ -7127,57 +7356,57 @@ snapshots: - '@babel/core' - babel-plugin-macros - 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(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.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))(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))(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.23.8 + zod: 3.22.4 - 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))(react@18.2.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0): 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))(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))(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.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 @@ -7202,7 +7431,15 @@ snapshots: dependencies: path-key: 2.0.1 - npm-to-yarn@2.2.1: {} + npm-run-path@4.0.1: + dependencies: + path-key: 3.1.1 + + npm-run-path@5.1.0: + dependencies: + path-key: 4.0.0 + + npm-to-yarn@2.1.0: {} number-to-bn@1.7.0: dependencies: @@ -7211,16 +7448,16 @@ snapshots: object-inspect@1.13.1: {} - object-is@1.1.6: + object-is@1.1.5: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.5 define-properties: 1.2.1 object-keys@1.1.1: {} - object.assign@4.1.5: + object.assign@4.1.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 @@ -7229,14 +7466,29 @@ snapshots: dependencies: wrappy: 1.0.2 - optionator@0.9.4: + onetime@5.1.2: dependencies: + mimic-fn: 2.1.0 + + onetime@6.0.0: + dependencies: + mimic-fn: 4.0.0 + + 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 + + optionator@0.9.3: + 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 p-finally@1.0.0: {} @@ -7280,7 +7532,7 @@ snapshots: parse-entities@4.0.1: 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 @@ -7291,7 +7543,7 @@ snapshots: parse-json@6.0.2: 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 @@ -7330,9 +7582,11 @@ snapshots: path-key@3.1.1: {} - path-scurry@1.10.2: + path-key@4.0.0: {} + + path-scurry@1.10.1: dependencies: - lru-cache: 10.2.2 + lru-cache: 10.0.3 minipass: 7.0.4 path-type@4.0.0: {} @@ -7351,13 +7605,11 @@ snapshots: pluralize@8.0.0: {} - possible-typed-array-names@1.0.0: {} - postcss@8.4.31: dependencies: nanoid: 3.3.7 picocolors: 1.0.0 - source-map-js: 1.2.0 + source-map-js: 1.0.2 prelude-ls@1.2.1: {} @@ -7369,7 +7621,7 @@ snapshots: proc-log@3.0.0: {} - property-information@6.5.0: {} + property-information@6.4.0: {} protocols@2.0.1: {} @@ -7383,21 +7635,21 @@ snapshots: dependencies: safe-buffer: 5.2.1 - react-dom@18.3.1(react@18.3.1): + react-dom@18.2.0(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 react-is@17.0.2: {} - react@18.3.1: + react@18.2.0: dependencies: loose-envify: 1.4.0 read-package-json-fast@3.0.2: dependencies: - json-parse-even-better-errors: 3.0.1 + json-parse-even-better-errors: 3.0.0 npm-normalize-package-bin: 3.0.1 readable-stream@3.6.2: @@ -7408,36 +7660,35 @@ snapshots: reading-time@1.5.0: {} - regenerator-runtime@0.14.1: {} + regenerator-runtime@0.14.0: {} - regexp.prototype.flags@1.5.2: + regexp.prototype.flags@1.5.1: 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 rehype-katex@7.0.0: 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 - rehype-pretty-code@0.9.11(shiki@0.14.7): + rehype-pretty-code@0.9.11(shiki@0.14.5): 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 rehype-raw@7.0.0: 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 remark-code-import@1.2.0(patch_hash=heylvfasxh3ubj2edns2svea2m): @@ -7448,7 +7699,7 @@ snapshots: remark-frontmatter@5.0.0: 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 @@ -7457,7 +7708,7 @@ snapshots: remark-gfm@3.0.1: 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 @@ -7466,7 +7717,7 @@ snapshots: remark-lint-blockquote-indentation@3.1.2: 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 @@ -7476,7 +7727,7 @@ snapshots: remark-lint-checkbox-character-style@4.1.2: 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 @@ -7484,7 +7735,7 @@ snapshots: remark-lint-code-block-style@3.1.2: 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 @@ -7493,7 +7744,7 @@ snapshots: remark-lint-emphasis-marker@3.1.2: 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 @@ -7501,7 +7752,7 @@ snapshots: remark-lint-fenced-code-marker@3.1.2: 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 @@ -7509,7 +7760,7 @@ snapshots: remark-lint-final-newline@2.1.2: dependencies: - '@types/mdast': 3.0.15 + '@types/mdast': 3.0.14 unified: 10.1.2 unified-lint-rule: 2.1.2 @@ -7525,7 +7776,7 @@ snapshots: remark-lint-hard-break-spaces@3.1.2: 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 @@ -7534,7 +7785,7 @@ snapshots: remark-lint-heading-style@3.1.2: 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 @@ -7543,7 +7794,7 @@ snapshots: remark-lint-link-title-style@3.1.2: 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 @@ -7552,7 +7803,7 @@ snapshots: remark-lint-list-item-bullet-indent@4.1.2: 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 @@ -7560,7 +7811,7 @@ snapshots: remark-lint-list-item-content-indent@3.1.2: 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 @@ -7569,7 +7820,7 @@ snapshots: remark-lint-list-item-indent@3.1.2: 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 @@ -7579,7 +7830,7 @@ snapshots: remark-lint-no-blockquote-without-marker@5.1.2: 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 @@ -7589,7 +7840,7 @@ snapshots: remark-lint-no-duplicate-definitions@3.1.2: 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 @@ -7599,7 +7850,7 @@ snapshots: remark-lint-no-heading-content-indent@4.1.2: 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 @@ -7610,7 +7861,7 @@ snapshots: remark-lint-no-inline-padding@4.1.2: 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 @@ -7619,7 +7870,7 @@ snapshots: remark-lint-no-literal-urls@3.1.2: 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 @@ -7629,7 +7880,7 @@ snapshots: remark-lint-no-shortcut-reference-image@3.1.2: 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 @@ -7637,7 +7888,7 @@ snapshots: remark-lint-no-shortcut-reference-link@3.1.2: 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 @@ -7645,7 +7896,7 @@ snapshots: remark-lint-no-undefined-references@4.2.1: 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 @@ -7656,7 +7907,7 @@ snapshots: remark-lint-no-unused-definitions@3.1.2: 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 @@ -7664,7 +7915,7 @@ snapshots: remark-lint-ordered-list-marker-style@3.1.2: 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 @@ -7673,7 +7924,7 @@ snapshots: remark-lint-rule-style@3.1.2: 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 @@ -7681,7 +7932,7 @@ snapshots: remark-lint-strong-marker@3.1.2: 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 @@ -7689,8 +7940,8 @@ snapshots: remark-lint-table-cell-padding@4.1.3: 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 @@ -7698,7 +7949,7 @@ snapshots: remark-lint-table-pipe-alignment@3.1.3: 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 @@ -7706,7 +7957,7 @@ snapshots: remark-lint-table-pipes@4.1.2: 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 @@ -7714,7 +7965,7 @@ snapshots: remark-lint-unordered-list-marker-style@3.1.2: 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 @@ -7723,7 +7974,7 @@ snapshots: remark-lint@9.1.2: dependencies: - '@types/mdast': 3.0.15 + '@types/mdast': 3.0.14 remark-message-control: 7.1.1 unified: 10.1.2 transitivePeerDependencies: @@ -7731,7 +7982,7 @@ snapshots: remark-math@5.1.1: 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 @@ -7745,7 +7996,7 @@ snapshots: remark-message-control@7.1.1: 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 @@ -7755,7 +8006,7 @@ snapshots: remark-parse@10.0.2: dependencies: - '@types/mdast': 3.0.15 + '@types/mdast': 3.0.14 mdast-util-from-markdown: 1.3.1 unified: 10.1.2 transitivePeerDependencies: @@ -7763,7 +8014,7 @@ snapshots: remark-parse@11.0.0: 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 @@ -7772,7 +8023,7 @@ snapshots: remark-preset-lint-consistent@5.1.2: 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 @@ -7792,7 +8043,7 @@ snapshots: remark-preset-lint-recommended@6.1.3: 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 @@ -7821,33 +8072,33 @@ snapshots: remark-rehype@10.1.0: 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 remark-stringify@10.0.3: dependencies: - '@types/mdast': 3.0.15 + '@types/mdast': 3.0.14 mdast-util-to-markdown: 1.5.0 unified: 10.1.2 remark-stringify@11.0.0: dependencies: - '@types/mdast': 4.0.3 + '@types/mdast': 4.0.2 mdast-util-to-markdown: 2.1.0 unified: 11.0.4 remark@15.0.1: 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 - remove-accents@0.5.0: {} + remove-accents@0.4.2: {} repeat-string@1.6.1: {} @@ -7869,6 +8120,10 @@ snapshots: robust-predicates@3.0.2: {} + run-applescript@5.0.0: + dependencies: + execa: 5.1.1 + run-parallel@1.2.0: dependencies: queue-microtask: 1.2.3 @@ -7883,7 +8138,7 @@ snapshots: safer-buffer@2.1.2: {} - scheduler@0.23.2: + scheduler@0.23.0: dependencies: loose-envify: 1.4.0 @@ -7893,14 +8148,14 @@ snapshots: scrypt-js@3.0.1: {} - search-insights@2.17.2: {} + search-insights@2.15.0: {} section-matter@1.0.0: dependencies: extend-shallow: 2.0.1 kind-of: 6.0.3 - semver@7.6.0: + semver@7.5.4: dependencies: lru-cache: 6.0.0 @@ -7910,21 +8165,18 @@ snapshots: tslib: 2.6.2 upper-case-first: 2.0.2 - set-function-length@1.2.2: + set-function-length@1.1.1: 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 - set-function-name@2.0.2: + set-function-name@2.0.1: 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 shebang-command@1.2.0: dependencies: @@ -7938,18 +8190,17 @@ snapshots: shebang-regex@3.0.0: {} - shiki@0.14.7: + shiki@0.14.5: 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 - side-channel@1.0.6: + side-channel@1.0.4: 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 signal-exit@3.0.7: {} @@ -7967,7 +8218,7 @@ snapshots: dependencies: is-plain-obj: 4.1.0 - source-map-js@1.2.0: {} + source-map-js@1.0.2: {} source-map@0.7.4: {} @@ -7977,7 +8228,7 @@ snapshots: stop-iteration-iterator@1.0.0: dependencies: - internal-slot: 1.0.7 + internal-slot: 1.0.6 streamsearch@1.1.0: {} @@ -7997,7 +8248,7 @@ snapshots: dependencies: safe-buffer: 5.2.1 - stringify-entities@4.0.4: + stringify-entities@4.0.3: dependencies: character-entities-html4: 2.1.0 character-entities-legacy: 3.0.0 @@ -8014,6 +8265,10 @@ snapshots: strip-eof@1.0.0: {} + strip-final-newline@2.0.0: {} + + strip-final-newline@3.0.0: {} + strip-hex-prefix@1.0.0: dependencies: is-hex-prefixed: 1.0.0 @@ -8028,12 +8283,12 @@ snapshots: dependencies: inline-style-parser: 0.1.1 - styled-jsx@5.1.1(react@18.3.1): + styled-jsx@5.1.1(react@18.2.0): dependencies: client-only: 0.0.1 - react: 18.3.1 + react: 18.2.0 - stylis@4.3.2: {} + stylis@4.3.0: {} supports-color@4.5.0: dependencies: @@ -8049,9 +8304,9 @@ snapshots: supports-color@9.4.0: {} - synckit@0.9.0: + synckit@0.8.5: dependencies: - '@pkgr/core': 0.1.1 + '@pkgr/utils': 2.4.2 tslib: 2.6.2 tabbable@6.2.0: {} @@ -8069,6 +8324,8 @@ snapshots: titleize@1.0.0: {} + titleize@3.0.0: {} + to-gatsby-remark-plugin@0.1.0: dependencies: to-vfile: 6.1.0 @@ -8093,7 +8350,7 @@ snapshots: trim-lines@3.0.1: {} - trough@2.2.0: {} + trough@2.1.0: {} ts-dedent@2.2.0: {} @@ -8115,45 +8372,45 @@ snapshots: typedarray@0.0.6: {} - typescript@5.4.5: {} + typescript@5.3.2: {} unified-engine@10.1.0: 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 unified-lint-rule@2.1.2: 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 unified-message-control@4.0.0: 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 @@ -8162,22 +8419,22 @@ snapshots: unified@10.1.2: 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: 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 unique-string@3.0.0: @@ -8186,96 +8443,98 @@ snapshots: unist-util-find-after@5.0.0: dependencies: - '@types/unist': 3.0.2 + '@types/unist': 3.0.1 unist-util-is: 6.0.0 unist-util-generated@2.0.1: {} unist-util-inspect@7.0.2: dependencies: - '@types/unist': 2.0.10 + '@types/unist': 2.0.9 unist-util-is@5.2.1: dependencies: - '@types/unist': 2.0.10 + '@types/unist': 2.0.9 unist-util-is@6.0.0: dependencies: - '@types/unist': 3.0.2 + '@types/unist': 3.0.1 unist-util-position-from-estree@1.1.2: dependencies: - '@types/unist': 2.0.10 + '@types/unist': 2.0.9 unist-util-position@4.0.4: dependencies: - '@types/unist': 2.0.10 + '@types/unist': 2.0.9 unist-util-position@5.0.0: dependencies: - '@types/unist': 3.0.2 + '@types/unist': 3.0.1 unist-util-remove-position@4.0.2: dependencies: - '@types/unist': 2.0.10 + '@types/unist': 2.0.9 unist-util-visit: 4.1.2 unist-util-remove-position@5.0.0: dependencies: - '@types/unist': 3.0.2 + '@types/unist': 3.0.1 unist-util-visit: 5.0.0 unist-util-remove@4.0.0: dependencies: - '@types/unist': 3.0.2 + '@types/unist': 3.0.1 unist-util-is: 6.0.0 unist-util-visit-parents: 6.0.1 unist-util-stringify-position@2.0.3: dependencies: - '@types/unist': 2.0.10 + '@types/unist': 2.0.9 unist-util-stringify-position@3.0.3: dependencies: - '@types/unist': 2.0.10 + '@types/unist': 2.0.9 unist-util-stringify-position@4.0.0: dependencies: - '@types/unist': 3.0.2 + '@types/unist': 3.0.1 unist-util-visit-parents@4.1.1: dependencies: - '@types/unist': 2.0.10 + '@types/unist': 2.0.9 unist-util-is: 5.2.1 unist-util-visit-parents@5.1.3: dependencies: - '@types/unist': 2.0.10 + '@types/unist': 2.0.9 unist-util-is: 5.2.1 unist-util-visit-parents@6.0.1: dependencies: - '@types/unist': 3.0.2 + '@types/unist': 3.0.1 unist-util-is: 6.0.0 unist-util-visit@3.1.0: 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: 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: dependencies: - '@types/unist': 3.0.2 + '@types/unist': 3.0.1 unist-util-is: 6.0.0 unist-util-visit-parents: 6.0.1 + untildify@4.0.0: {} + upper-case-first@2.0.2: dependencies: tslib: 2.6.2 @@ -8297,39 +8556,39 @@ snapshots: uvu@0.5.6: 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: dependencies: - '@types/unist': 2.0.10 + '@types/unist': 2.0.9 vfile: 5.3.7 vfile-location@5.0.2: dependencies: - '@types/unist': 3.0.2 + '@types/unist': 3.0.1 vfile: 6.0.1 vfile-matter@3.0.1: dependencies: - '@types/js-yaml': 4.0.9 + '@types/js-yaml': 4.0.8 is-buffer: 2.0.5 js-yaml: 4.1.0 vfile-message@2.0.4: dependencies: - '@types/unist': 2.0.10 + '@types/unist': 2.0.9 unist-util-stringify-position: 2.0.3 vfile-message@3.1.4: dependencies: - '@types/unist': 2.0.10 + '@types/unist': 2.0.9 unist-util-stringify-position: 3.0.3 vfile-message@4.0.2: dependencies: - '@types/unist': 3.0.2 + '@types/unist': 3.0.1 unist-util-stringify-position: 4.0.0 vfile-reporter@7.0.5: @@ -8355,36 +8614,54 @@ snapshots: vfile@4.2.1: 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 vfile@5.3.7: 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: 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)(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: 1.0.0(typescript@5.4.5)(zod@3.23.8) + abitype: 0.9.8(typescript@5.3.2)(zod@3.22.4) isows: 1.0.3(ws@8.13.0) ws: 8.13.0 optionalDependencies: - typescript: 5.4.5 + typescript: 5.3.2 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + - zod + + 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 @@ -8402,19 +8679,24 @@ snapshots: web-namespaces@2.0.1: {} - web-worker@1.3.0: {} + web-worker@1.2.0: {} - web3-utils@1.10.4: + web3-utils@1.10.3: 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 + webauthn-p256@0.0.10: + dependencies: + '@noble/curves': 1.6.0 + '@noble/hashes': 1.5.0 + webidl-conversions@3.0.1: {} whatwg-url@5.0.0: @@ -8430,20 +8712,20 @@ snapshots: is-string: 1.0.7 is-symbol: 1.0.4 - which-collection@1.0.2: + which-collection@1.0.1: 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 - which-typed-array@1.1.15: + which-typed-array@1.1.13: 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 which@1.3.1: dependencies: @@ -8453,8 +8735,6 @@ snapshots: dependencies: isexe: 2.0.0 - word-wrap@1.2.5: {} - wrap-ansi@7.0.0: dependencies: ansi-styles: 4.3.0 @@ -8480,6 +8760,8 @@ snapshots: ws@8.13.0: {} + ws@8.18.0: {} + xdg-basedir@5.1.0: {} yallist@2.1.2: {} @@ -8488,12 +8770,12 @@ snapshots: yaml@2.3.3: {} - yaml@2.4.2: {} + yaml@2.3.4: {} yocto-queue@0.1.0: {} yocto-queue@1.0.0: {} - zod@3.23.8: {} + zod@3.22.4: {} zwitch@2.0.4: {} diff --git a/public/_redirects b/public/_redirects index d586cee18..3eb5cb69c 100644 --- a/public/_redirects +++ b/public/_redirects @@ -101,4 +101,7 @@ /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 +/chain/differences /stack/differences \ No newline at end of file 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 000000000..5bab0c5ef Binary files /dev/null and b/public/img/op-stack/protocol/block-time-research-figure-1.png differ 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 000000000..4e88aabc4 Binary files /dev/null and b/public/img/op-stack/protocol/block-time-research-figure-2.png differ 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 000000000..74cf842c3 Binary files /dev/null and b/public/img/op-stack/protocol/block-time-research-figure-3.png differ diff --git a/public/img/op-stack/protocol/block-time-research-figure-4.png b/public/img/op-stack/protocol/block-time-research-figure-4.png new file mode 100644 index 000000000..c20e85eac Binary files /dev/null and b/public/img/op-stack/protocol/block-time-research-figure-4.png differ diff --git a/public/img/op-stack/protocol/block-time-research-figure-5.png b/public/img/op-stack/protocol/block-time-research-figure-5.png new file mode 100644 index 000000000..4feaa1671 Binary files /dev/null and b/public/img/op-stack/protocol/block-time-research-figure-5.png differ 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 000000000..73b3da9a2 Binary files /dev/null and b/public/img/op-stack/protocol/block-time-research-figure-6.png differ 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 000000000..396668654 Binary files /dev/null and b/public/img/op-stack/protocol/op-cross-chain-txn.jpeg differ diff --git a/public/tutorials/cross-dom-bridge-eth.js b/public/tutorials/cross-dom-bridge-eth.js index ba612e28b..82abb4d6e 100644 --- a/public/tutorials/cross-dom-bridge-eth.js +++ b/public/tutorials/cross-dom-bridge-eth.js @@ -1,74 +1,115 @@ (async () => { -const optimism = require("@eth-optimism/sdk") -const ethers = require("ethers") +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'); -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) +const PRIVATE_KEY = process.env.TUTORIAL_PRIVATE_KEY; +const account = privateKeyToAccount(PRIVATE_KEY); -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, -}) +const publicClientL1 = createPublicClient({ + chain: sepolia, + transport: http("https://rpc.ankr.com/eth_sepolia"), +}).extend(publicActionsL1()) -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) +const walletClientL1 = createWalletClient({ + account, + chain: sepolia, + transport: http("https://rpc.ankr.com/eth_sepolia"), +}).extend(walletActionsL1()); -console.log('L1 balance:') -console.log((await l1Wallet.getBalance()).toString()) -console.log('L2 balance:') -console.log((await l2Wallet.getBalance()).toString()) +const publicClientL2 = createPublicClient({ + chain: optimismSepolia, + transport: http("https://sepolia.optimism.io"), +}).extend(publicActionsL2()); -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()) +const walletClientL2 = createWalletClient({ + account, + chain: optimismSepolia, + transport: http("https://sepolia.optimism.io"), +}).extend(walletActionsL2()); -console.log('Waiting for withdrawal to be provable...') -await messenger.waitForMessageStatus(withdrawal.hash, optimism.MessageStatus.READY_TO_PROVE) +const l1Balance = await publicClientL1.getBalance({ address: account.address }); +console.log(`L1 Balance: ${formatEther(l1Balance)} ETH`); -console.log('Proving withdrawal...') -await messenger.proveMessage(withdrawal.hash) +async function depositETH() { -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)) -} +const depositArgs = await publicClientL2.buildDepositTransaction({ + mint: parseEther("0.0001"), + to: account.address, +}); + +const depositHash = await walletClientL1.depositTransaction(depositArgs); +console.log(`Deposit transaction hash on L1: ${depositHash}`); + +const depositReceipt = await publicClientL1.waitForTransactionReceipt({ depositHash }); +console.log('L1 transaction confirmed:', depositReceipt); + +const [l2Hash] = getL2TransactionHashes(depositReceipt); +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!'); +} + + +async function withdrawETH() { + +//Add the same imports used in DepositETH function +const withdrawalArgs = await publicClientL2.buildWithdrawalTransaction({ +value: parseEther('0.0001'), +to: account.address, +}); + +const withdrawalHash = await walletClientL2.initiateWithdrawal(withdrawalArgs); +console.log(`Withdrawal transaction hash on L2: ${withdrawalHash}`); -console.log('Relaying withdrawal...') -await messenger.finalizeMessage(withdrawal.hash) +const withdrawalReceipt = await publicClientL2.waitForTransactionReceipt({ hash: withdrawalHash }); +console.log('L2 transaction confirmed:', withdrawalReceipt); -console.log('Waiting for withdrawal to be relayed...') -await messenger.waitForMessageStatus(withdrawal.hash, optimism.MessageStatus.RELAYED) +const { output, withdrawal } = await publicClientL1.waitToProve({ +withdrawalReceipt, +targetChain: walletClientL2.chain +}); -console.log('L1 balance:') -console.log((await l1Wallet.getBalance()).toString()) +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 diff --git a/public/tutorials/cross-dom-solidity.js b/public/tutorials/cross-dom-solidity.js index 9ddafb16b..c4368c9e5 100644 --- a/public/tutorials/cross-dom-solidity.js +++ b/public/tutorials/cross-dom-solidity.js @@ -1,37 +1,39 @@ (async () => { -const optimism = require("@eth-optimism/sdk") -const ethers = require("ethers") - -const privateKey = process.env.TUTORIAL_PRIVATE_KEY +const { createPublicClient, http } = require('viem'); +const { optimismSepolia } = require('viem/chains'); +const { publicActionsL1, publicActionsL2} = require('viem/op-stack'); 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 }) + })() diff --git a/public/tutorials/sdk-estimate-costs.js b/public/tutorials/sdk-estimate-costs.js index f223f0026..72507f96f 100644 --- a/public/tutorials/sdk-estimate-costs.js +++ b/public/tutorials/sdk-estimate-costs.js @@ -1,52 +1,49 @@ (async () => { -const optimism = require("@eth-optimism/sdk") -const ethers = require("ethers") +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) -const provider = optimism.asL2Provider(new ethers.providers.StaticJsonRpcProvider("https://sepolia.optimism.io")) -const wallet = new ethers.Wallet(privateKey, provider) +const publicClient = createPublicClient({ + chain: optimismSepolia, + transport: http("https://sepolia.optimism.io"), +}).extend(publicActionsL2()) -const tx = await wallet.populateTransaction({ +const walletClientL2 = createWalletClient({ + chain: optimismSepolia, + transport: http("https://sepolia.optimism.io"), +}).extend(walletActionsL2()) + + const transaction = { + account, to: '0x1000000000000000000000000000000000000000', - value: ethers.utils.parseEther('0.00069420'), - gasPrice: await provider.getGasPrice(), -}) - -console.log('Estimating L2 cost...') -const gasLimit = tx.gasLimit -const gasPrice = tx.maxFeePerGas -const l2CostEstimate = gasLimit.mul(gasPrice) -console.log(ethers.utils.formatEther(l2CostEstimate)) - -console.log('Estimating L1 cost...') -const l1CostEstimate = await provider.estimateL1GasCost(tx) -console.log(ethers.utils.formatEther(l1CostEstimate)) - -console.log('Summing total cost...') -const totalSum = l2CostEstimate.add(l1CostEstimate) -console.log(ethers.utils.formatEther(totalSum)) - -console.log('Sending transaction...') -const res = await wallet.sendTransaction(tx) -const receipt = await res.wait() -console.log(receipt.transactionHash) - -console.log('Actual L2 cost:') -const l2CostActual = receipt.gasUsed.mul(receipt.effectiveGasPrice) -console.log(ethers.utils.formatEther(l2CostActual)) - -console.log('Actual L1 cost:') -const l1CostActual = receipt.l1Fee -console.log(ethers.utils.formatEther(l1CostActual)) - -console.log('Actual total cost:') -const totalActual = l2CostActual.add(l1CostActual) -console.log(ethers.utils.formatEther(totalActual)) - -console.log('Difference:') -const difference = totalActual.sub(totalSum).abs() -console.log(ethers.utils.formatEther(difference)) - -})() + value: parseEther('0.00069420'), + gasPrice: await publicClient.getGasPrice() + } + + 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 = receipt.l1Fee + console.log(`Actual L1 Data Fee: ${formatEther(l1CostActual)} ETH`) + + 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 diff --git a/public/tutorials/send-tx-from-eth.js b/public/tutorials/send-tx-from-eth.js index 9666aeb07..12ea74460 100644 --- a/public/tutorials/send-tx-from-eth.js +++ b/public/tutorials/send-tx-from-eth.js @@ -1,60 +1,81 @@ (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 { publicActionsL2, publicActionsL1, walletActionsL2, walletActionsL1, getL2TransactionHashes } = require ('viem/op-stack') + + 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 = '0x5b47E1A08Ea6d985D6649300584e6722Ec4B1383'; + const gasLimit = 100000n; + const data = '0x'; + const value = parseEther('0.000069420'); + + const gasEstimate = await l1PublicClient.estimateContractGas({ + address: optimismPortalAddress, + abi: optimismPortalAbi, + functionName: 'depositTransaction', + args: [gasLimit, data], + value, + account: account.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 in balance: ${formatEther(difference)} ETH`); })() diff --git a/utils/breadcrumbs.ts b/utils/breadcrumbs.ts new file mode 100644 index 000000000..ff00309d7 --- /dev/null +++ b/utils/breadcrumbs.ts @@ -0,0 +1,154 @@ +import * as fs from 'fs/promises'; +import * as path from 'path'; +import matter from 'gray-matter'; + +const rootDir: string = path.join(__dirname, '..', 'pages'); +const warnings: string[] = []; + +// ANSI color codes +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', + '500.mdx', + 'index.mdx', + '404.mdx', + 'console', + 'block-explorer', + 'bridge', + 'sdk', + 'faucet', + 'gas', + 'bug-bounty', + 'live-support', + 'governance', + 'changelog', + 'experimental' +]; + +async function getContentFiles(folderPath: string): Promise { + const files = await fs.readdir(folderPath, { withFileTypes: true }); + const fileInfos: FileInfo[] = []; + const folderName = path.basename(folderPath); + + for (const file of files) { + if (file.name.startsWith('_') || + file.name.startsWith('.') || + excludedPages.includes(file.name)) { + continue; + } + + const filePath = path.join(folderPath, file.name); + + 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)$/, ''); + + fileInfos.push({ + title: fileTitle, + url: relativeUrl, + description: frontMatter.description, + content: content + }); + } catch (error) { + console.error(`Error processing file ${file.name}:`, error); + } + } + } + + return fileInfos; +} + +async function getBreadcrumbCards(breadcrumbPath: string): Promise> { + try { + const content = await fs.readFile(breadcrumbPath, 'utf-8'); + const cardMatches = content.match(/]*href="([^"]+)"[^>]*>/g) || []; + return new Set( + cardMatches.map(match => { + const hrefMatch = match.match(/href="([^"]+)"/); + return hrefMatch ? hrefMatch[1] : ''; + }).filter(Boolean) + ); + } catch (error) { + return new Set(); + } +} + +async function checkDirectory(dirPath: string): Promise { + const entries = await fs.readdir(dirPath, { withFileTypes: true }); + + 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`); + + // Get all content files in the folder + const files = await getContentFiles(folderPath); + + // Get existing cards in breadcrumb + const existingCards = await getBreadcrumbCards(breadcrumbPath); + + // Check for missing pages + files.forEach(({ title, url }) => { + if (!existingCards.has(url)) { + warnings.push( + `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 { + // 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 are properly referenced in breadcrumb files.'); + } + } catch (error) { + console.log(`${YELLOW}${BOLD}Error checking breadcrumbs:${RESET}`, error); + process.exit(1); + } +} + +main().catch(error => { + console.error('Error in main process:', error); + process.exit(1); +}); 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 diff --git a/utils/create-breadcrumbs.ts b/utils/create-breadcrumbs.ts new file mode 100644 index 000000000..370e44bc4 --- /dev/null +++ b/utils/create-breadcrumbs.ts @@ -0,0 +1,259 @@ +import * as fs from 'fs/promises'; +import * as path from 'path'; +import matter from 'gray-matter'; + +const rootDir: string = path.join(__dirname, '..', 'pages'); + +interface FileInfo { + title: string; + url: string; + description?: string; + 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()) + .join(' '); +} + +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'); + }); + + if (firstParagraph) { + const cleaned = firstParagraph.replace(/\s+/g, ' ').trim(); + return cleaned.length > 150 ? cleaned.slice(0, 147) + '...' : cleaned; + } + + return ''; +} + +async function generateFolderDescription(folderName: string, files: FileInfo[]): Promise { + if (files.length === 0) { + 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') + ); + + if (overviewFile && overviewFile.content) { + const desc = extractFirstParagraph(overviewFile.content); + if (desc) return desc; + } + + // 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 ${toTitleCase(folderName)} section of the OP Stack ecosystem.`; +} + +async function getContentFiles(folderPath: string): Promise { + const files = await fs.readdir(folderPath, { withFileTypes: true }); + const fileInfos: FileInfo[] = []; + const folderName = path.basename(folderPath); + + for (const file of files) { + if (file.name.startsWith('_') || + file.name.startsWith('.') || + excludedPages.includes(file.name)) { + continue; + } + + const filePath = path.join(folderPath, file.name); + + 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 || 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.name}:`, error); + } + } + } + + return fileInfos; +} + +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); + + // 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 +--- + +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.'; + } + + await fs.writeFile(breadcrumbPath, content); + console.log(`Created new breadcrumb file: ${folderName}.mdx`); + } +} + +async function processSubfolders(parentPath: string): Promise { + try { + const entries = await fs.readdir(parentPath, { withFileTypes: true }); + + for (const entry of entries) { + if (!entry.isDirectory() || entry.name.startsWith('_')) { + continue; + } + + const folderName = entry.name; + console.log(`Processing folder: ${folderName}`); + + try { + await createOrUpdateBreadcrumb(parentPath, folderName); + } catch (error) { + console.error(`Error processing breadcrumb for ${folderName}:`, error); + } + } + } catch (error) { + console.error('Error processing folders:', error); + } +} + +const main = async (): Promise => { + console.log('Starting breadcrumb update process...'); + console.log('Root directory:', rootDir); + + try { + // 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); + } +}; + +main().catch(error => { + console.error('Error in main process:', error); + process.exit(1); +}); \ No newline at end of file diff --git a/words.txt b/words.txt index 376553b4f..c20a7a919 100644 --- a/words.txt +++ b/words.txt @@ -9,7 +9,6 @@ airgap Allnodes Allocs allocs -altda ANDI Ankr Apeworx @@ -28,6 +27,8 @@ BLOBBASEFEE BLOBPOOL blobpool blobspace +Blockdaemon +Blockdaemon's blockhash BLOCKLOGS blocklists @@ -75,7 +76,6 @@ datacap DATADIR datadir Dencun -derviation Devnet devnet Devnode @@ -298,6 +298,7 @@ Quicknode quicknode quickstarts RANDAO +rebalance Regenesis regenesis REJOURNAL @@ -326,7 +327,9 @@ safedb Schnorr secp SELFDESTRUCT +SEPOLIA Sepolia +sepolia seqnr SEQUENCERHTTP sequencerhttp @@ -357,6 +360,7 @@ SUPERCHAIN Superchain superchain Superchain's +Superchainerc Superchains Superscan Supersim @@ -380,6 +384,7 @@ txns TXPOOL txpool txproxy +txproxyd uncountered Unprotect unsubmitted @@ -390,6 +395,7 @@ VHOSTS vhosts Viem viem +Viem's VMDEBUG vmdebug VMODULE