From 447a99c27e5767f713e959aaf5104c02ce1c163d Mon Sep 17 00:00:00 2001 From: ravinagill15 Date: Fri, 18 Jul 2025 13:20:50 -0700 Subject: [PATCH 01/20] lz devtools upgradeable oft example --- plume-oft-adapter-migration/.env.example | 15 + plume-oft-adapter-migration/.eslintignore | 10 + plume-oft-adapter-migration/.eslintrc.js | 12 + plume-oft-adapter-migration/.gitignore | 24 + plume-oft-adapter-migration/.nvmrc | 1 + plume-oft-adapter-migration/.prettierignore | 11 + plume-oft-adapter-migration/.prettierrc.js | 3 + plume-oft-adapter-migration/README.md | 737 ++++++++++++++++++ .../contracts/MyOFTAdapterFeeUpgradeable.sol | 15 + .../contracts/MyOFTAdapterUpgradeable.sol | 15 + .../contracts/MyOFTFeeUpgradeable.sol | 15 + .../contracts/MyOFTUpgradeable.sol | 15 + .../contracts/mocks/MyERC20Mock.sol | 13 + .../mocks/MyOFTAdapterUpgradeableMock.sol | 9 + .../contracts/mocks/MyOFTUpgradeableMock.sol | 13 + .../deploy/MyOFTAdapterFeeUpgradeable.ts | 39 + .../deploy/MyOFTAdapterUpgradeable.ts | 39 + .../deploy/MyOFTFeeUpgradeable.ts | 39 + .../deploy/MyOFTUpgradeable.ts | 39 + .../deploy/MyOFTUpgradeableMock.ts | 39 + plume-oft-adapter-migration/foundry.toml | 30 + plume-oft-adapter-migration/hardhat.config.ts | 89 +++ .../layerzero.config.ts | 52 ++ plume-oft-adapter-migration/package.json | 83 ++ plume-oft-adapter-migration/solhint.config.js | 1 + plume-oft-adapter-migration/tasks/sendEvm.ts | 242 ++++++ plume-oft-adapter-migration/tasks/sendOFT.ts | 108 +++ plume-oft-adapter-migration/tasks/types.ts | 4 + plume-oft-adapter-migration/tasks/utils.ts | 48 ++ .../test/foundry/MyOFTUpgradeable.t.sol | 61 ++ .../test/hardhat/MyOFTUpgradeable.test.ts | 98 +++ plume-oft-adapter-migration/tsconfig.json | 13 + 32 files changed, 1932 insertions(+) create mode 100644 plume-oft-adapter-migration/.env.example create mode 100644 plume-oft-adapter-migration/.eslintignore create mode 100644 plume-oft-adapter-migration/.eslintrc.js create mode 100644 plume-oft-adapter-migration/.gitignore create mode 100644 plume-oft-adapter-migration/.nvmrc create mode 100644 plume-oft-adapter-migration/.prettierignore create mode 100644 plume-oft-adapter-migration/.prettierrc.js create mode 100644 plume-oft-adapter-migration/README.md create mode 100644 plume-oft-adapter-migration/contracts/MyOFTAdapterFeeUpgradeable.sol create mode 100644 plume-oft-adapter-migration/contracts/MyOFTAdapterUpgradeable.sol create mode 100644 plume-oft-adapter-migration/contracts/MyOFTFeeUpgradeable.sol create mode 100644 plume-oft-adapter-migration/contracts/MyOFTUpgradeable.sol create mode 100644 plume-oft-adapter-migration/contracts/mocks/MyERC20Mock.sol create mode 100644 plume-oft-adapter-migration/contracts/mocks/MyOFTAdapterUpgradeableMock.sol create mode 100644 plume-oft-adapter-migration/contracts/mocks/MyOFTUpgradeableMock.sol create mode 100644 plume-oft-adapter-migration/deploy/MyOFTAdapterFeeUpgradeable.ts create mode 100644 plume-oft-adapter-migration/deploy/MyOFTAdapterUpgradeable.ts create mode 100644 plume-oft-adapter-migration/deploy/MyOFTFeeUpgradeable.ts create mode 100644 plume-oft-adapter-migration/deploy/MyOFTUpgradeable.ts create mode 100644 plume-oft-adapter-migration/deploy/MyOFTUpgradeableMock.ts create mode 100644 plume-oft-adapter-migration/foundry.toml create mode 100644 plume-oft-adapter-migration/hardhat.config.ts create mode 100644 plume-oft-adapter-migration/layerzero.config.ts create mode 100644 plume-oft-adapter-migration/package.json create mode 100644 plume-oft-adapter-migration/solhint.config.js create mode 100644 plume-oft-adapter-migration/tasks/sendEvm.ts create mode 100644 plume-oft-adapter-migration/tasks/sendOFT.ts create mode 100644 plume-oft-adapter-migration/tasks/types.ts create mode 100644 plume-oft-adapter-migration/tasks/utils.ts create mode 100644 plume-oft-adapter-migration/test/foundry/MyOFTUpgradeable.t.sol create mode 100644 plume-oft-adapter-migration/test/hardhat/MyOFTUpgradeable.test.ts create mode 100644 plume-oft-adapter-migration/tsconfig.json diff --git a/plume-oft-adapter-migration/.env.example b/plume-oft-adapter-migration/.env.example new file mode 100644 index 00000000..197ba1d6 --- /dev/null +++ b/plume-oft-adapter-migration/.env.example @@ -0,0 +1,15 @@ +# .-.-. .-.-. .-.-. .-.-. .-.-. .-.-. .-.-. .-.- +# / / \ \ / / \ \ / / \ \ / / \ \ / / \ \ / / \ \ / / \ \ / / \ +# `-' `-`-' `-`-' `-`-' `-`-' `-`-' `-`-' `-`-' +# +# Example environment configuration +# +# .-.-. .-.-. .-.-. .-.-. .-.-. .-.-. .-.-. .-.- +# / / \ \ / / \ \ / / \ \ / / \ \ / / \ \ / / \ \ / / \ \ / / \ +# `-' `-`-' `-`-' `-`-' `-`-' `-`-' `-`-' `-`-' + +# By default, the examples support both mnemonic-based and private key-based authentication +# +# You don't need to set both of these values, just pick the one that you prefer and set that one +MNEMONIC= +PRIVATE_KEY= \ No newline at end of file diff --git a/plume-oft-adapter-migration/.eslintignore b/plume-oft-adapter-migration/.eslintignore new file mode 100644 index 00000000..ee9f768f --- /dev/null +++ b/plume-oft-adapter-migration/.eslintignore @@ -0,0 +1,10 @@ +artifacts +cache +dist +node_modules +out +*.log +*.sol +*.yaml +*.lock +package-lock.json \ No newline at end of file diff --git a/plume-oft-adapter-migration/.eslintrc.js b/plume-oft-adapter-migration/.eslintrc.js new file mode 100644 index 00000000..32352e10 --- /dev/null +++ b/plume-oft-adapter-migration/.eslintrc.js @@ -0,0 +1,12 @@ +require('@rushstack/eslint-patch/modern-module-resolution'); + +module.exports = { + root: true, + extends: ['@layerzerolabs/eslint-config-next/recommended'], + rules: { + // @layerzerolabs/eslint-config-next defines rules for turborepo-based projects + // that are not relevant for this particular project + 'turbo/no-undeclared-env-vars': 'off', + 'import/no-unresolved': 'warn', // lint runs before workspace packages are built; missing dist/ folders cause false unresolved errors + }, +}; diff --git a/plume-oft-adapter-migration/.gitignore b/plume-oft-adapter-migration/.gitignore new file mode 100644 index 00000000..e2face95 --- /dev/null +++ b/plume-oft-adapter-migration/.gitignore @@ -0,0 +1,24 @@ +node_modules +.env +coverage +coverage.json +typechain +typechain-types + +# Hardhat files +cache +artifacts + + +# LayerZero specific files +.layerzero + +# foundry test compilation files +out + +# pnpm +pnpm-error.log + +# Editor and OS files +.DS_Store +.idea diff --git a/plume-oft-adapter-migration/.nvmrc b/plume-oft-adapter-migration/.nvmrc new file mode 100644 index 00000000..b714151e --- /dev/null +++ b/plume-oft-adapter-migration/.nvmrc @@ -0,0 +1 @@ +v18.18.0 \ No newline at end of file diff --git a/plume-oft-adapter-migration/.prettierignore b/plume-oft-adapter-migration/.prettierignore new file mode 100644 index 00000000..4445ae51 --- /dev/null +++ b/plume-oft-adapter-migration/.prettierignore @@ -0,0 +1,11 @@ +artifacts/ +cache/ +dist/ +node_modules/ +out/ +*.log +*ignore +*.yaml +*.lock +package-lock.json +package.json \ No newline at end of file diff --git a/plume-oft-adapter-migration/.prettierrc.js b/plume-oft-adapter-migration/.prettierrc.js new file mode 100644 index 00000000..6f55b401 --- /dev/null +++ b/plume-oft-adapter-migration/.prettierrc.js @@ -0,0 +1,3 @@ +module.exports = { + ...require('@layerzerolabs/prettier-config-next'), +}; diff --git a/plume-oft-adapter-migration/README.md b/plume-oft-adapter-migration/README.md new file mode 100644 index 00000000..f2200319 --- /dev/null +++ b/plume-oft-adapter-migration/README.md @@ -0,0 +1,737 @@ +

+ + LayerZero + +

+ +

+ LayerZero Docs +

+ +

EVM-to-EVM Omnichain Fungible Token (OFT) Upgradeable Example

+ +

Template project for an upgradeable cross-chain token (OFT) powered by the LayerZero protocol. This example's config involves EVM chains, but the same OFT can be extended to involve other VM chains such as Solana, Aptos and Hyperliquid.

+ +## Table of Contents + +- [Prerequisite Knowledge](#prerequisite-knowledge) +- [Requirements](#requirements) +- [Scaffold this example](#scaffold-this-example) +- [Helper Tasks](#helper-tasks) +- [Setup](#setup) +- [Build](#build) + - [Compiling your contracts](#compiling-your-contracts) +- [Deploy](#deploy) +- [Enable Messaging](#enable-messaging) +- [Sending OFTs](#sending-ofts) +- [Next Steps](#next-steps) +- [Production Deployment Checklist](#production-deployment-checklist) + - [Profiling `lzReceive` and `lzCompose` Gas Usage](#profiling-lzreceive-and-lzcompose-gas-usage) + - [Available Commands](#available-commands) + - [`lzReceive`](#lzreceive) + - [`lzCompose`](#lzcompose) + - [Usage Examples](#usage-examples) + - [Notes](#notes) +- [Appendix](#appendix) + - [Running Tests](#running-tests) + - [Adding other chains](#adding-other-chains) + - [Using Multisigs](#using-multisigs) + - [LayerZero Hardhat Helper Tasks](#layerzero-hardhat-helper-tasks) + - [Manual Configuration](#manual-configuration) + - [Contract Verification](#contract-verification) + - [Troubleshooting](#troubleshooting) + +## Prerequisite Knowledge + +- [What is an OFT (Omnichain Fungible Token) ?](https://docs.layerzero.network/v2/concepts/applications/oft-standard) +- [What is an OApp (Omnichain Application) ?](https://docs.layerzero.network/v2/concepts/applications/oapp-standard) + +## Introduction + +This example contains 4 OFT variations: + +- `MyOFTAdapterFeeUpgradeable` +- `MyOFTAdapterUpgradeable` +- `MyOFTFeeUpgradeable` +- `MyOFTUpgradeable` + +The walkthrough will use `MyOFTUpgradeable` but you can as easily swap out the `contractName` (in the [Deploy](#deploy) step onwards). + +:warning: With great power comes great responsibility. Upgradeable contracts are powerful, but they also come with +risks. Please ensure you understand the risks before deploying an upgradeable contract. For more information on the +limitations of upgradeable contracts, please see the +[OpenZeppelin documentation](https://docs.openzeppelin.com/contracts/5.x/upgradeable). Further, consider fully testing +any and all upgrades thoroughly before deploying to production. + +## Requirements + +- `Node.js` - ` >=18.16.0` +- `pnpm` (recommended) - or another package manager of your choice (npm, yarn) +- `forge` (optional) - `>=0.2.0` for testing, and if not using Hardhat for compilation + +## Scaffold this example + +Create your local copy of this example: + +```bash +LZ_ENABLE_UPGRADEABLE_EXAMPLE=1 pnpm dlx create-lz-oapp@latest --example oft-upgradeable +``` + +Specify the directory, select `UpgradeableOFT` and proceed with the installation. + +Note that `create-lz-oapp` will also automatically run the dependencies install step for you. + +## Helper Tasks + +Throughout this walkthrough, helper tasks will be used. For the full list of available helper tasks, refer to the [LayerZero Hardhat Helper Tasks section](#layerzero-hardhat-helper-tasks). All commands can be run at the project root. + +## Setup + +- Copy `.env.example` into a new `.env` +- Set up your deployer address/account via the `.env` + + - You can specify either `MNEMONIC` or `PRIVATE_KEY`: + + ``` + MNEMONIC="test test test test test test test test test test test junk" + or... + PRIVATE_KEY="0xabc...def" + ``` + +- Fund this deployer address/account with the native tokens of the chains you want to deploy to. This example by default will deploy to the following chains' testnets: **Optimism** and **Arbitrum**. + +## Build + +### Compiling your contracts + + + +This project supports both `hardhat` and `forge` compilation. By default, the `compile` command will execute both: + +```bash +pnpm compile +``` + +If you prefer one over the other, you can use the tooling-specific commands: + +```bash +pnpm compile:forge +pnpm compile:hardhat +``` + +## Deploy + +To deploy the OFT contracts to your desired blockchains, run the following command: + +```bash +pnpm hardhat lz:deploy --tags MyOFTUpgradeableMock +``` + +> :information_source: MyOFTUpgradeableMock will be used as it provides a public mint function which we require for testing + +> If you would like to try any of the other 3 variants (`MyOFTAdapterFeeUpgradeable`, `MyOFTAdapterUpgradeable`, `MyOFTFeeUpgradeable`), replace `MyOFTUpgradeableMock` with the name of the variant you'd like to deploy. + +Select all the chains you want to deploy the OFT to. + +## Enable Messaging + +The OFT standard builds on top of the OApp standard, which enables generic message-passing between chains. After deploying the OFT on the respective chains, you enable messaging by running the [wiring](https://docs.layerzero.network/v2/concepts/glossary#wire--wiring) task. + +> :information_source: This example uses the [Simple Config Generator](https://docs.layerzero.network/v2/developers/evm/technical-reference/simple-config), which is recommended over manual configuration. + +> If you are deploying a variant other than `MyOFTUpgradeableMock`, you would need to update the `layerzero.config.ts` so that the contract object uses the correct `contractName` value. + +Run the wiring task: + +```bash +pnpm hardhat lz:oapp:wire --oapp-config layerzero.config.ts +``` + +Submit all the transactions to complete wiring. After all transactions confirm, your OApps are wired and can send messages to each other. + +## Sending OFTs + +With your OFTs wired, you can now send them cross chain. + +First, via the mock contract, let's mint on **Optimism Sepolia**: + +``` +cast send "mint(address,uint256)" 1000000000000000000 --private-key --rpc-url + +``` + +> You can get the address of your OFT on Optimism Sepolia from the file at `./deployments/optimism-testnet/MyOFTUpgradeableMock.json` + +Send 1 OFT from **Optimism Sepolia** to **Arbitrum Sepolia**: + +```bash +pnpm hardhat lz:oft:send --src-eid 40232 --dst-eid 40231 --amount 1 --to +``` + +> :information_source: `40232` and `40106` are the Endpoint IDs of Optimism Sepolia and Arbitrum Sepolia respectively. View the list of chains and their Endpoint IDs on the [Deployed Endpoints](https://docs.layerzero.network/v2/deployments/deployed-contracts) page. + +Upon a successful send, the script will provide you with the link to the message on LayerZero Scan. + +Once the message is delivered, you will be able to click on the destination transaction hash to verify that the OFT was sent. + +Congratulations, you have now sent an OFT cross-chain! + +> If you run into any issues, refer to [Troubleshooting](#troubleshooting). + +## Next Steps + +Now that you've gone through a simplified walkthrough, here are what you can do next. + +- If you are planning to deploy to production, go through the [Production Deployment Checklist](#production-deployment-checklist). +- Read on [DVNs / Security Stack](https://docs.layerzero.network/v2/concepts/modular-security/security-stack-dvns) +- Read on [Message Execution Options](https://docs.layerzero.network/v2/concepts/technical-reference/options-reference) + +## Production Deployment Checklist + + + +Before deploying, ensure the following: + +- (required) you are not using `MyOFTUpgradeableMock`, which has a public `mint` function + - In `layerzero.config.ts`, ensure you are not using `MyOFTUpgradeableMock` as the `contractName` for any of the contract objects. +- (recommended) you have profiled the gas usage of `lzReceive` on your destination chains + + +### Profiling `lzReceive` and `lzCompose` Gas Usage + +The optimal values you should specify for the `gas` parameter in the LZ Config depends on the destination chain, and requires profiling. This section walks through how to estimate the optimal `gas` value. + +This guide explains how to use the `pnpm` commands to estimate gas usage for LayerZero's `lzReceive` and `lzCompose` functions. These commands wrap Foundry scripts for easier invocation and allow you to pass the required arguments dynamically. + +### Available Commands + +1. **`gas:lzReceive`** + + This command profiles the `lzReceive` function for estimating gas usage across multiple runs. + + ```json + "gas:lzReceive": "forge script scripts/GasProfiler.s.sol:GasProfilerScript --via-ir --sig 'run_lzReceive(string,address,uint32,address,uint32,address,bytes,uint256,uint256)'" + ``` + +2. **`gas:lzCompose`** + + This command profiles the `lzCompose` function for estimating gas usage across multiple runs. + + ```json + "gas:lzCompose": "forge script scripts/GasProfiler.s.sol:GasProfilerScript --via-ir --sig 'run_lzCompose(string,address,uint32,address,uint32,address,address,bytes,uint256,uint256)'" + ``` + +### Usage Examples + +#### `lzReceive` + +To estimate the gas for the `lzReceive` function: + +```bash +pnpm gas:lzReceive + \ + \ + \ + \ + \ + \ + \ + \ + +``` + +Where: + +- `rpcUrl`: The RPC URL for the target blockchain (e.g., Optimism, Arbitrum, etc.). +- `endpointAddress`: The deployed LayerZero EndpointV2 contract address. +- `srcEid`: The source endpoint ID (uint32). +- `sender`: The sender's address (OApp). +- `dstEid`: The destination endpoint ID (uint32). +- `receiver`: The address intended to receive the message (OApp). +- `message`: The message payload as a `bytes` array. +- `msg.value`: The amount of Ether sent with the message (in wei). +- `numOfRuns`: The number of test runs to execute. + +#### `lzCompose` + +To estimate the gas for the `lzCompose` function: + +```bash +pnpm gas:lzCompose + \ + \ + \ + \ + \ + \ + \ + \ + \ + +``` + +Where: + +- `rpcUrl`: The RPC URL for the target blockchain (e.g., Optimism, Arbitrum, etc.). +- `endpointAddress`: The deployed LayerZero EndpointV2 contract address. +- `srcEid`: The source endpoint ID (uint32). +- `sender`: The originating OApp address. +- `dstEid`: The destination endpoint ID (uint32). +- `receiver`: The address intended to receive the message (OApp). +- `composer`: The LayerZero Composer contract address. +- `composeMsg`: The compose message payload as a `bytes` array. +- `msgValue`: The amount of Ether sent with the message (in wei). +- `numOfRuns`: The number of test runs to execute. + +#### Notes + +- Modify `numOfRuns` based on the level of accuracy or performance you require for gas profiling. +- Log outputs will provide metrics such as the **average**, **median**, **minimum**, and **maximum** gas usage across all successful runs. + +This approach simplifies repetitive tasks and ensures consistent testing across various configurations. + +

+ Join our community! | Follow us on X (formerly Twitter) +

+ +# Appendix + +## Running Tests + +Similar to the contract compilation, we support both `hardhat` and `forge` tests. By default, the `test` command will execute both: + +```bash +pnpm test +``` + +If you prefer one over the other, you can use the tooling-specific commands: + +```bash +pnpm test:forge +pnpm test:hardhat +``` + +## Adding other chains + + + +If you're adding another EVM chain, first, add it to the `hardhat.config.ts`. Adding non-EVM chains do not require modifying the `hardhat.config.ts`. + + + +Then, modify `layerzero.config.ts` with the following changes: + +- declare a new contract object (specifying the `eid` and `contractName`) +- decide whether to use an existing EVM enforced options variable or declare a new one +- create a new entry in the `pathways` variable +- add the new contract into the `contracts` key of the `return` of the `export default` function + +After applying the desired changes, make sure you re-run the wiring task: + +```bash +pnpm hardhat lz:oapp:wire --oapp-config layerzero.config.ts +``` + +## Using Multisigs + +The wiring task supports the usage of Safe Multisigs. + +To use a Safe multisig as the signer for these transactions, add the following to each network in your `hardhat.config.ts` and add the `--safe` flag to `lz:oapp:wire --safe`: + +```typescript +// hardhat.config.ts + +networks: { + // Include configurations for other networks as needed + fuji: { + /* ... */ + // Network-specific settings + safeConfig: { + safeUrl: 'http://something', // URL of the Safe API, not the Safe itself + safeAddress: 'address' + } + } +} +``` + +## LayerZero Hardhat Helper Tasks + +LayerZero Devtools provides several helper hardhat tasks to easily deploy, verify, configure, connect, and send OFTs cross-chain. + +
+ pnpm hardhat lz:deploy + +
+ +Deploys your contract to any of the available networks in your [`hardhat.config.ts`](./hardhat.config.ts) when given a deploy tag (by default contract name) and returns a list of available networks to select for the deployment. For specifics around all deployment options, please refer to the [Deploying Contracts](https://docs.layerzero.network/v2/developers/evm/create-lz-oapp/deploying) section of the documentation. LayerZero's `lz:deploy` utilizes `hardhat-deploy`. + +```typescript +'arbitrum-sepolia': { + eid: EndpointId.ARBSEP_V2_TESTNET, + url: process.env.RPC_URL_ARBSEP_TESTNET, + accounts, +}, +'base-sepolia': { + eid: EndpointId.BASESEP_V2_TESTNET, + url: process.env.RPC_URL_BASE_TESTNET, + accounts, +}, +``` + +More information about available CLI arguments can be found using the `--help` flag: + +```bash +pnpm hardhat lz:deploy --help +``` + +
+ +
+ pnpm hardhat lz:oapp:config:init --oapp-config YOUR_OAPP_CONFIG --contract-name CONTRACT_NAME + +
+ +Initializes a `layerzero.config.ts` file for all available pathways between your hardhat networks with the current LayerZero default placeholder settings. This task can be incredibly useful for correctly formatting your config file. + +You can run this task by providing the `contract-name` you want to set for the config and `file-name` you want to generate: + +```bash +pnpm hardhat lz:oapp:config:init --contract-name CONTRACT_NAME --oapp-config FILE_NAME +``` + +This will create a `layerzero.config.ts` in your working directory populated with your contract name and connections for every pathway possible between your hardhat networks: + +```typescript +import { EndpointId } from "@layerzerolabs/lz-definitions"; + +const arbsepContract = { + eid: EndpointId.ARBSEP_V2_TESTNET, + contractName: "MyOFT", +}; +const sepoliaContract = { + eid: EndpointId.SEPOLIA_V2_TESTNET, + contractName: "MyOFT", +}; + +export default { + contracts: [{ contract: arbsepContract }, { contract: sepoliaContract }], + connections: [ + { + from: arbsepContract, + to: sepoliaContract, + config: { + sendLibrary: "0x4f7cd4DA19ABB31b0eC98b9066B9e857B1bf9C0E", + receiveLibraryConfig: { + receiveLibrary: "0x75Db67CDab2824970131D5aa9CECfC9F69c69636", + gracePeriod: 0, + }, + sendConfig: { + executorConfig: { + maxMessageSize: 10000, + executor: "0x5Df3a1cEbBD9c8BA7F8dF51Fd632A9aef8308897", + }, + ulnConfig: { + confirmations: 1, + requiredDVNs: ["0x53f488E93b4f1b60E8E83aa374dBe1780A1EE8a8"], + optionalDVNs: [], + optionalDVNThreshold: 0, + }, + }, + // receiveConfig: { + // ulnConfig: { + // confirmations: 2, + // requiredDVNs: ['0x53f488E93b4f1b60E8E83aa374dBe1780A1EE8a8'], + // optionalDVNs: [], + // optionalDVNThreshold: 0, + // }, + // }, + }, + }, + { + from: sepoliaContract, + to: arbsepContract, + config: { + sendLibrary: "0xcc1ae8Cf5D3904Cef3360A9532B477529b177cCE", + receiveLibraryConfig: { + receiveLibrary: "0xdAf00F5eE2158dD58E0d3857851c432E34A3A851", + gracePeriod: 0, + }, + // sendConfig: { + // executorConfig: { maxMessageSize: 10000, executor: '0x718B92b5CB0a5552039B593faF724D182A881eDA' }, + // ulnConfig: { + // confirmations: 2, + // requiredDVNs: ['0x8eebf8b423B73bFCa51a1Db4B7354AA0bFCA9193'], + // optionalDVNs: [], + // optionalDVNThreshold: 0, + // }, + // }, + receiveConfig: { + ulnConfig: { + confirmations: 1, + requiredDVNs: ["0x8eebf8b423B73bFCa51a1Db4B7354AA0bFCA9193"], + optionalDVNs: [], + optionalDVNThreshold: 0, + }, + }, + }, + }, + ], +}; +``` + +
+ +
+ pnpm hardhat lz:oapp:config:wire --oapp-config YOUR_OAPP_CONFIG + +
+ +Calls the configuration functions between your deployed OApp contracts on every chain based on the provided `layerzero.config.ts`. + +Running `lz:oapp:wire` will make the following function calls per pathway connection for a fully defined config file using your specified settings and your environment variables (Private Keys and RPCs): + +- function setPeer(uint32 \_eid, bytes32 \_peer) public virtual onlyOwner {} + +- function setConfig(address \_oapp, address \_lib, SetConfigParam[] calldata \_params) external onlyRegistered(\_lib) {} + +- function setEnforcedOptions(EnforcedOptionParam[] calldata \_enforcedOptions) public virtual onlyOwner {} + +- function setSendLibrary(address \_oapp, uint32 \_eid, address \_newLib) external onlyRegisteredOrDefault(\_newLib) isSendLib(\_newLib) onlySupportedEid(\_newLib, \_eid) {} + +- function setReceiveLibrary(address \_oapp, uint32 \_eid, address \_newLib, uint256 \_gracePeriod) external onlyRegisteredOrDefault(\_newLib) isReceiveLib(\_newLib) onlySupportedEid(\_newLib, \_eid) {} + +To use this task, run: + +```bash +pnpm hardhat lz:oapp:wire --oapp-config YOUR_LAYERZERO_CONFIG_FILE +``` + +Whenever you make changes to the configuration, run `lz:oapp:wire` again. The task will check your current configuration, and only apply NEW changes. + +
+
+ pnpm hardhat lz:oapp:config:get --oapp-config YOUR_OAPP_CONFIG + +
+ +Returns your current OApp's configuration for each chain and pathway in 3 columns: + +- **Custom Configuration**: the changes that your `layerzero.config.ts` currently has set + +- **Default Configuration**: the default placeholder configuration that LayerZero provides + +- **Active Configuration**: the active configuration that applies to the message pathway (Defaults + Custom Values) + +If you do NOT explicitly set each configuration parameter, your OApp will fallback to the placeholder parameters in the default config. + +```bash +┌────────────────────┬───────────────────────────────────────────────────────────────────────────────┬───────────────────────────────────────────────────────────────────────────────┬───────────────────────────────────────────────────────────────────────────────┐ +│ │ Custom OApp Config │ Default OApp Config │ Active OApp Config │ +├────────────────────┼───────────────────────────────────────────────────────────────────────────────┼───────────────────────────────────────────────────────────────────────────────┼───────────────────────────────────────────────────────────────────────────────┤ +│ localNetworkName │ arbsep │ arbsep │ arbsep │ +├────────────────────┼───────────────────────────────────────────────────────────────────────────────┼───────────────────────────────────────────────────────────────────────────────┼───────────────────────────────────────────────────────────────────────────────┤ +│ remoteNetworkName │ sepolia │ sepolia │ sepolia │ +├────────────────────┼───────────────────────────────────────────────────────────────────────────────┼───────────────────────────────────────────────────────────────────────────────┼───────────────────────────────────────────────────────────────────────────────┤ +│ sendLibrary │ 0x4f7cd4DA19ABB31b0eC98b9066B9e857B1bf9C0E │ 0x4f7cd4DA19ABB31b0eC98b9066B9e857B1bf9C0E │ 0x4f7cd4DA19ABB31b0eC98b9066B9e857B1bf9C0E │ +├────────────────────┼───────────────────────────────────────────────────────────────────────────────┼───────────────────────────────────────────────────────────────────────────────┼───────────────────────────────────────────────────────────────────────────────┤ +│ receiveLibrary │ 0x75Db67CDab2824970131D5aa9CECfC9F69c69636 │ 0x75Db67CDab2824970131D5aa9CECfC9F69c69636 │ 0x75Db67CDab2824970131D5aa9CECfC9F69c69636 │ +├────────────────────┼───────────────────────────────────────────────────────────────────────────────┼───────────────────────────────────────────────────────────────────────────────┼───────────────────────────────────────────────────────────────────────────────┤ +│ sendUlnConfig │ ┌──────────────────────┬────────────────────────────────────────────────────┐ │ ┌──────────────────────┬────────────────────────────────────────────────────┐ │ ┌──────────────────────┬────────────────────────────────────────────────────┐ │ +│ │ │ confirmations │ 1 │ │ │ confirmations │ 1 │ │ │ confirmations │ 1 │ │ +│ │ ├──────────────────────┼────────────────────────────────────────────────────┤ │ ├──────────────────────┼────────────────────────────────────────────────────┤ │ ├──────────────────────┼────────────────────────────────────────────────────┤ │ +│ │ │ requiredDVNs │ ┌───┬────────────────────────────────────────────┐ │ │ │ requiredDVNs │ ┌───┬────────────────────────────────────────────┐ │ │ │ requiredDVNs │ ┌───┬────────────────────────────────────────────┐ │ │ +│ │ │ │ │ 0 │ 0x53f488E93b4f1b60E8E83aa374dBe1780A1EE8a8 │ │ │ │ │ │ 0 │ 0x53f488E93b4f1b60E8E83aa374dBe1780A1EE8a8 │ │ │ │ │ │ 0 │ 0x53f488E93b4f1b60E8E83aa374dBe1780A1EE8a8 │ │ │ +│ │ │ │ └───┴────────────────────────────────────────────┘ │ │ │ │ └───┴────────────────────────────────────────────┘ │ │ │ │ └───┴────────────────────────────────────────────┘ │ │ +│ │ │ │ │ │ │ │ │ │ │ │ │ │ +│ │ ├──────────────────────┼────────────────────────────────────────────────────┤ │ ├──────────────────────┼────────────────────────────────────────────────────┤ │ ├──────────────────────┼────────────────────────────────────────────────────┤ │ +│ │ │ optionalDVNs │ │ │ │ optionalDVNs │ │ │ │ optionalDVNs │ │ │ +│ │ ├──────────────────────┼────────────────────────────────────────────────────┤ │ ├──────────────────────┼────────────────────────────────────────────────────┤ │ ├──────────────────────┼────────────────────────────────────────────────────┤ │ +│ │ │ optionalDVNThreshold │ 0 │ │ │ optionalDVNThreshold │ 0 │ │ │ optionalDVNThreshold │ 0 │ │ +│ │ └──────────────────────┴────────────────────────────────────────────────────┘ │ └──────────────────────┴────────────────────────────────────────────────────┘ │ └──────────────────────┴────────────────────────────────────────────────────┘ │ +│ │ │ │ │ +├────────────────────┼───────────────────────────────────────────────────────────────────────────────┼───────────────────────────────────────────────────────────────────────────────┼───────────────────────────────────────────────────────────────────────────────┤ +│ sendExecutorConfig │ ┌────────────────┬────────────────────────────────────────────┐ │ ┌────────────────┬────────────────────────────────────────────┐ │ ┌────────────────┬────────────────────────────────────────────┐ │ +│ │ │ executor │ 0x5Df3a1cEbBD9c8BA7F8dF51Fd632A9aef8308897 │ │ │ executor │ 0x5Df3a1cEbBD9c8BA7F8dF51Fd632A9aef8308897 │ │ │ executor │ 0x5Df3a1cEbBD9c8BA7F8dF51Fd632A9aef8308897 │ │ +│ │ ├────────────────┼────────────────────────────────────────────┤ │ ├────────────────┼────────────────────────────────────────────┤ │ ├────────────────┼────────────────────────────────────────────┤ │ +│ │ │ maxMessageSize │ 10000 │ │ │ maxMessageSize │ 10000 │ │ │ maxMessageSize │ 10000 │ │ +│ │ └────────────────┴────────────────────────────────────────────┘ │ └────────────────┴────────────────────────────────────────────┘ │ └────────────────┴────────────────────────────────────────────┘ │ +│ │ │ │ │ +├────────────────────┼───────────────────────────────────────────────────────────────────────────────┼───────────────────────────────────────────────────────────────────────────────┼───────────────────────────────────────────────────────────────────────────────┤ +│ receiveUlnConfig │ ┌──────────────────────┬────────────────────────────────────────────────────┐ │ ┌──────────────────────┬────────────────────────────────────────────────────┐ │ ┌──────────────────────┬────────────────────────────────────────────────────┐ │ +│ │ │ confirmations │ 2 │ │ │ confirmations │ 2 │ │ │ confirmations │ 2 │ │ +│ │ ├──────────────────────┼────────────────────────────────────────────────────┤ │ ├──────────────────────┼────────────────────────────────────────────────────┤ │ ├──────────────────────┼────────────────────────────────────────────────────┤ │ +│ │ │ requiredDVNs │ ┌───┬────────────────────────────────────────────┐ │ │ │ requiredDVNs │ ┌───┬────────────────────────────────────────────┐ │ │ │ requiredDVNs │ ┌───┬────────────────────────────────────────────┐ │ │ +│ │ │ │ │ 0 │ 0x53f488E93b4f1b60E8E83aa374dBe1780A1EE8a8 │ │ │ │ │ │ 0 │ 0x53f488E93b4f1b60E8E83aa374dBe1780A1EE8a8 │ │ │ │ │ │ 0 │ 0x53f488E93b4f1b60E8E83aa374dBe1780A1EE8a8 │ │ │ +│ │ │ │ └───┴────────────────────────────────────────────┘ │ │ │ │ └───┴────────────────────────────────────────────┘ │ │ │ │ └───┴────────────────────────────────────────────┘ │ │ +│ │ │ │ │ │ │ │ │ │ │ │ │ │ +│ │ ├──────────────────────┼────────────────────────────────────────────────────┤ │ ├──────────────────────┼────────────────────────────────────────────────────┤ │ ├──────────────────────┼────────────────────────────────────────────────────┤ │ +│ │ │ optionalDVNs │ │ │ │ optionalDVNs │ │ │ │ optionalDVNs │ │ │ +│ │ ├──────────────────────┼────────────────────────────────────────────────────┤ │ ├──────────────────────┼────────────────────────────────────────────────────┤ │ ├──────────────────────┼────────────────────────────────────────────────────┤ │ +│ │ │ optionalDVNThreshold │ 0 │ │ │ optionalDVNThreshold │ 0 │ │ │ optionalDVNThreshold │ 0 │ │ +│ │ └──────────────────────┴────────────────────────────────────────────────────┘ │ └──────────────────────┴────────────────────────────────────────────────────┘ │ └──────────────────────┴────────────────────────────────────────────────────┘ │ +│ │ │ │ │ +└────────────────────┴───────────────────────────────────────────────────────────────────────────────┴───────────────────────────────────────────────────────────────────────────────┴───────────────────────────────────────────────────────────────────────────────┘ +``` + +
+
+ pnpm hardhat lz:oapp:config:get:executor --oapp-config YOUR_OAPP_CONFIG + +
+ +Returns the LayerZero Executor config for each network in your `hardhat.config.ts`. You can use this method to see the max destination gas in wei (`nativeCap`) you can request in your [`execution options`](https://docs.layerzero.network/v2/developers/evm/gas-settings/options). + +```bash +┌───────────────────┬────────────────────────────────────────────┐ +│ localNetworkName │ mantle │ +├───────────────────┼────────────────────────────────────────────┤ +│ remoteNetworkName │ polygon │ +├───────────────────┼────────────────────────────────────────────┤ +│ executorDstConfig │ ┌────────────────┬───────────────────────┐ │ +│ │ │ baseGas │ 85000 │ │ +│ │ ├────────────────┼───────────────────────┤ │ +│ │ │ multiplierBps │ 12000 │ │ +│ │ ├────────────────┼───────────────────────┤ │ +│ │ │ floorMarginUSD │ 5000000000000000000 │ │ +│ │ ├────────────────┼───────────────────────┤ │ +│ │ │ nativeCap │ 681000000000000000000 │ │ +│ │ └────────────────┴───────────────────────┘ │ +│ │ │ +└───────────────────┴────────────────────────────────────────────┘ +``` + +
+ +### Manual Configuration + + + +This section only applies if you would like to configure manually instead of using the Simple Config Generator. + +Define the pathway you want to create from and to each contract: + +```typescript +connections: [ + // ETH <--> ARB PATHWAY: START + { + from: ethereumContract, + to: arbitrumContract, + }, + { + from: arbitrumContract, + to: ethereumContract, + }, + // ETH <--> ARB PATHWAY: END +]; +``` + +Finally, define the config settings for each direction of the pathway: + +```typescript +connections: [ + // ETH <--> ARB PATHWAY: START + { + from: ethereumContract, + to: arbitrumContract, + config: { + sendLibrary: contractsConfig.ethereum.sendLib302, + receiveLibraryConfig: { + receiveLibrary: contractsConfig.ethereum.receiveLib302, + gracePeriod: BigInt(0), + }, + // Optional Receive Library Timeout for when the Old Receive Library Address will no longer be valid + receiveLibraryTimeoutConfig: { + lib: "0x0000000000000000000000000000000000000000", + expiry: BigInt(0), + }, + // Optional Send Configuration + // @dev Controls how the `from` chain sends messages to the `to` chain. + sendConfig: { + executorConfig: { + maxMessageSize: 10000, + // The configured Executor address + executor: contractsConfig.ethereum.executor, + }, + ulnConfig: { + // The number of block confirmations to wait on Ethereum before emitting the message from the source chain. + confirmations: BigInt(15), + // The address of the DVNs you will pay to verify a sent message on the source chain ). + // The destination tx will wait until ALL `requiredDVNs` verify the message. + requiredDVNs: [ + contractsConfig.ethereum.horizenDVN, // Horizen + contractsConfig.ethereum.polyhedraDVN, // Polyhedra + contractsConfig.ethereum.animocaBlockdaemonDVN, // Animoca-Blockdaemon (only available on ETH <-> Arbitrum One) + contractsConfig.ethereum.lzDVN, // LayerZero Labs + ], + // The address of the DVNs you will pay to verify a sent message on the source chain ). + // The destination tx will wait until the configured threshold of `optionalDVNs` verify a message. + optionalDVNs: [], + // The number of `optionalDVNs` that need to successfully verify the message for it to be considered Verified. + optionalDVNThreshold: 0, + }, + }, + // Optional Receive Configuration + // @dev Controls how the `from` chain receives messages from the `to` chain. + receiveConfig: { + ulnConfig: { + // The number of block confirmations to expect from the `to` chain. + confirmations: BigInt(20), + // The address of the DVNs your `receiveConfig` expects to receive verifications from on the `from` chain ). + // The `from` chain's OApp will wait until the configured threshold of `requiredDVNs` verify the message. + requiredDVNs: [ + contractsConfig.ethereum.lzDVN, // LayerZero Labs DVN + contractsConfig.ethereum.animocaBlockdaemonDVN, // Blockdaemon-Animoca + contractsConfig.ethereum.horizenDVN, // Horizen Labs + contractsConfig.ethereum.polyhedraDVN, // Polyhedra + ], + // The address of the `optionalDVNs` you expect to receive verifications from on the `from` chain ). + // The destination tx will wait until the configured threshold of `optionalDVNs` verify the message. + optionalDVNs: [], + // The number of `optionalDVNs` that need to successfully verify the message for it to be considered Verified. + optionalDVNThreshold: 0, + }, + }, + // Optional Enforced Options Configuration + // @dev Controls how much gas to use on the `to` chain, which the user pays for on the source `from` chain. + enforcedOptions: [ + { + msgType: 1, + optionType: ExecutorOptionType.LZ_RECEIVE, + gas: 65000, + value: 0, + }, + { + msgType: 2, + optionType: ExecutorOptionType.LZ_RECEIVE, + gas: 65000, + value: 0, + }, + { + msgType: 2, + optionType: ExecutorOptionType.COMPOSE, + index: 0, + gas: 50000, + value: 0, + }, + ], + }, + }, + { + from: arbitrumContract, + to: ethereumContract, + }, + // ETH <--> ARB PATHWAY: END +]; +``` + +### Contract Verification + +You can verify EVM chain contracts using the LayerZero helper package: + +```bash +pnpm dlx @layerzerolabs/verify-contract -n -u -k --contracts +``` + +### Troubleshooting + +Refer to [Debugging Messages](https://docs.layerzero.network/v2/developers/evm/troubleshooting/debugging-messages) or [Error Codes & Handling](https://docs.layerzero.network/v2/developers/evm/troubleshooting/error-messages). diff --git a/plume-oft-adapter-migration/contracts/MyOFTAdapterFeeUpgradeable.sol b/plume-oft-adapter-migration/contracts/MyOFTAdapterFeeUpgradeable.sol new file mode 100644 index 00000000..155d360a --- /dev/null +++ b/plume-oft-adapter-migration/contracts/MyOFTAdapterFeeUpgradeable.sol @@ -0,0 +1,15 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.22; + +import { OFTAdapterFeeUpgradeable } from "@layerzerolabs/oft-evm-upgradeable/contracts/oft/OFTAdapterFeeUpgradeable.sol"; + +contract MyOFTAdapterFeeUpgradeable is OFTAdapterFeeUpgradeable { + constructor(address _token, address _lzEndpoint) OFTAdapterFeeUpgradeable(_token, _lzEndpoint) { + _disableInitializers(); + } + + function initialize(address _delegate) public initializer { + __OFTAdapterFee_init(_delegate); + __Ownable_init(_delegate); + } +} diff --git a/plume-oft-adapter-migration/contracts/MyOFTAdapterUpgradeable.sol b/plume-oft-adapter-migration/contracts/MyOFTAdapterUpgradeable.sol new file mode 100644 index 00000000..c4d36461 --- /dev/null +++ b/plume-oft-adapter-migration/contracts/MyOFTAdapterUpgradeable.sol @@ -0,0 +1,15 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.22; + +import { OFTAdapterUpgradeable } from "@layerzerolabs/oft-evm-upgradeable/contracts/oft/OFTAdapterUpgradeable.sol"; + +contract MyOFTAdapterUpgradeable is OFTAdapterUpgradeable { + constructor(address _token, address _lzEndpoint) OFTAdapterUpgradeable(_token, _lzEndpoint) { + _disableInitializers(); + } + + function initialize(address _delegate) public initializer { + __OFTAdapter_init(_delegate); + __Ownable_init(_delegate); + } +} diff --git a/plume-oft-adapter-migration/contracts/MyOFTFeeUpgradeable.sol b/plume-oft-adapter-migration/contracts/MyOFTFeeUpgradeable.sol new file mode 100644 index 00000000..f40720fb --- /dev/null +++ b/plume-oft-adapter-migration/contracts/MyOFTFeeUpgradeable.sol @@ -0,0 +1,15 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.22; + +import { OFTFeeUpgradeable } from "@layerzerolabs/oft-evm-upgradeable/contracts/oft/OFTFeeUpgradeable.sol"; + +contract MyOFTFeeUpgradeable is OFTFeeUpgradeable { + constructor(address _lzEndpoint) OFTFeeUpgradeable(_lzEndpoint) { + _disableInitializers(); + } + + function initialize(string memory _name, string memory _symbol, address _delegate) public initializer { + __OFTFee_init(_name, _symbol, _delegate); + __Ownable_init(_delegate); + } +} diff --git a/plume-oft-adapter-migration/contracts/MyOFTUpgradeable.sol b/plume-oft-adapter-migration/contracts/MyOFTUpgradeable.sol new file mode 100644 index 00000000..1eeaf8a1 --- /dev/null +++ b/plume-oft-adapter-migration/contracts/MyOFTUpgradeable.sol @@ -0,0 +1,15 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.22; + +import { OFTUpgradeable } from "@layerzerolabs/oft-evm-upgradeable/contracts/oft/OFTUpgradeable.sol"; + +contract MyOFTUpgradeable is OFTUpgradeable { + constructor(address _lzEndpoint) OFTUpgradeable(_lzEndpoint) { + _disableInitializers(); + } + + function initialize(string memory _name, string memory _symbol, address _delegate) public initializer { + __OFT_init(_name, _symbol, _delegate); + __Ownable_init(_delegate); + } +} diff --git a/plume-oft-adapter-migration/contracts/mocks/MyERC20Mock.sol b/plume-oft-adapter-migration/contracts/mocks/MyERC20Mock.sol new file mode 100644 index 00000000..9ea57e78 --- /dev/null +++ b/plume-oft-adapter-migration/contracts/mocks/MyERC20Mock.sol @@ -0,0 +1,13 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.20; + +import { ERC20 } from "@openzeppelin/contracts/token/ERC20/ERC20.sol"; + +// @dev WARNING: This is for testing purposes only +contract MyERC20Mock is ERC20 { + constructor(string memory _name, string memory _symbol) ERC20(_name, _symbol) {} + + function mint(address _to, uint256 _amount) public { + _mint(_to, _amount); + } +} diff --git a/plume-oft-adapter-migration/contracts/mocks/MyOFTAdapterUpgradeableMock.sol b/plume-oft-adapter-migration/contracts/mocks/MyOFTAdapterUpgradeableMock.sol new file mode 100644 index 00000000..ad9dd27c --- /dev/null +++ b/plume-oft-adapter-migration/contracts/mocks/MyOFTAdapterUpgradeableMock.sol @@ -0,0 +1,9 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.22; + +import { MyOFTAdapterUpgradeable } from "../MyOFTAdapterUpgradeable.sol"; + +// @dev WARNING: This is for testing purposes only +contract MyOFTAdapterUpgradeableMock is MyOFTAdapterUpgradeable { + constructor(address _token, address _lzEndpoint) MyOFTAdapterUpgradeable(_token, _lzEndpoint) {} +} diff --git a/plume-oft-adapter-migration/contracts/mocks/MyOFTUpgradeableMock.sol b/plume-oft-adapter-migration/contracts/mocks/MyOFTUpgradeableMock.sol new file mode 100644 index 00000000..7f9754a9 --- /dev/null +++ b/plume-oft-adapter-migration/contracts/mocks/MyOFTUpgradeableMock.sol @@ -0,0 +1,13 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.22; + +import { MyOFTUpgradeable } from "../MyOFTUpgradeable.sol"; + +// @dev WARNING: This is for testing purposes only +contract MyOFTUpgradeableMock is MyOFTUpgradeable { + constructor(address _lzEndpoint) MyOFTUpgradeable(_lzEndpoint) {} + + function mint(address _to, uint256 _amount) public { + _mint(_to, _amount); + } +} diff --git a/plume-oft-adapter-migration/deploy/MyOFTAdapterFeeUpgradeable.ts b/plume-oft-adapter-migration/deploy/MyOFTAdapterFeeUpgradeable.ts new file mode 100644 index 00000000..bfcf5449 --- /dev/null +++ b/plume-oft-adapter-migration/deploy/MyOFTAdapterFeeUpgradeable.ts @@ -0,0 +1,39 @@ +import { type DeployFunction } from 'hardhat-deploy/types' + +import { EndpointId, endpointIdToNetwork } from '@layerzerolabs/lz-definitions' +import { getDeploymentAddressAndAbi } from '@layerzerolabs/lz-evm-sdk-v2' + +const contractName = 'MyOFTAdapterFeeUpgradeable' + +const deploy: DeployFunction = async (hre) => { + const { deploy } = hre.deployments + const signer = (await hre.ethers.getSigners())[0] + console.log(`deploying ${contractName} on network: ${hre.network.name} with ${signer.address}`) + + const eid = hre.network.config.eid as EndpointId + const lzNetworkName = endpointIdToNetwork(eid) + + const { address } = getDeploymentAddressAndAbi(lzNetworkName, 'EndpointV2') + + await deploy(contractName, { + from: signer.address, + args: ['0x', address], // replace '0x' with the address of the ERC-20 token + log: true, + waitConfirmations: 1, + skipIfAlreadyDeployed: false, + proxy: { + proxyContract: 'OpenZeppelinTransparentProxy', + owner: signer.address, + execute: { + init: { + methodName: 'initialize', + args: [signer.address], + }, + }, + }, + }) +} + +deploy.tags = [contractName] + +export default deploy diff --git a/plume-oft-adapter-migration/deploy/MyOFTAdapterUpgradeable.ts b/plume-oft-adapter-migration/deploy/MyOFTAdapterUpgradeable.ts new file mode 100644 index 00000000..4b3441fc --- /dev/null +++ b/plume-oft-adapter-migration/deploy/MyOFTAdapterUpgradeable.ts @@ -0,0 +1,39 @@ +import { type DeployFunction } from 'hardhat-deploy/types' + +import { EndpointId, endpointIdToNetwork } from '@layerzerolabs/lz-definitions' +import { getDeploymentAddressAndAbi } from '@layerzerolabs/lz-evm-sdk-v2' + +const contractName = 'MyOFTAdapterUpgradeable' + +const deploy: DeployFunction = async (hre) => { + const { deploy } = hre.deployments + const signer = (await hre.ethers.getSigners())[0] + console.log(`deploying ${contractName} on network: ${hre.network.name} with ${signer.address}`) + + const eid = hre.network.config.eid as EndpointId + const lzNetworkName = endpointIdToNetwork(eid) + + const { address } = getDeploymentAddressAndAbi(lzNetworkName, 'EndpointV2') + + await deploy(contractName, { + from: signer.address, + args: ['0x', address], // replace '0x' with the address of the ERC-20 token + log: true, + waitConfirmations: 1, + skipIfAlreadyDeployed: false, + proxy: { + proxyContract: 'OpenZeppelinTransparentProxy', + owner: signer.address, + execute: { + init: { + methodName: 'initialize', + args: [signer.address], + }, + }, + }, + }) +} + +deploy.tags = [contractName] + +export default deploy diff --git a/plume-oft-adapter-migration/deploy/MyOFTFeeUpgradeable.ts b/plume-oft-adapter-migration/deploy/MyOFTFeeUpgradeable.ts new file mode 100644 index 00000000..eaab8131 --- /dev/null +++ b/plume-oft-adapter-migration/deploy/MyOFTFeeUpgradeable.ts @@ -0,0 +1,39 @@ +import { type DeployFunction } from 'hardhat-deploy/types' + +import { EndpointId, endpointIdToNetwork } from '@layerzerolabs/lz-definitions' +import { getDeploymentAddressAndAbi } from '@layerzerolabs/lz-evm-sdk-v2' + +const contractName = 'MyOFTFeeUpgradeable' + +const deploy: DeployFunction = async (hre) => { + const { deploy } = hre.deployments + const signer = (await hre.ethers.getSigners())[0] + console.log(`deploying ${contractName} on network: ${hre.network.name} with ${signer.address}`) + + const eid = hre.network.config.eid as EndpointId + const lzNetworkName = endpointIdToNetwork(eid) + + const { address } = getDeploymentAddressAndAbi(lzNetworkName, 'EndpointV2') + + await deploy(contractName, { + from: signer.address, + args: [address], + log: true, + waitConfirmations: 1, + skipIfAlreadyDeployed: false, + proxy: { + proxyContract: 'OpenZeppelinTransparentProxy', + owner: signer.address, + execute: { + init: { + methodName: 'initialize', + args: ['MyOFT', 'MOFT', signer.address], // TODO: add name/symbol + }, + }, + }, + }) +} + +deploy.tags = [contractName] + +export default deploy diff --git a/plume-oft-adapter-migration/deploy/MyOFTUpgradeable.ts b/plume-oft-adapter-migration/deploy/MyOFTUpgradeable.ts new file mode 100644 index 00000000..d2c20b45 --- /dev/null +++ b/plume-oft-adapter-migration/deploy/MyOFTUpgradeable.ts @@ -0,0 +1,39 @@ +import { type DeployFunction } from 'hardhat-deploy/types' + +import { EndpointId, endpointIdToNetwork } from '@layerzerolabs/lz-definitions' +import { getDeploymentAddressAndAbi } from '@layerzerolabs/lz-evm-sdk-v2' + +const contractName = 'MyOFTUpgradeable' + +const deploy: DeployFunction = async (hre) => { + const { deploy } = hre.deployments + const signer = (await hre.ethers.getSigners())[0] + console.log(`deploying ${contractName} on network: ${hre.network.name} with ${signer.address}`) + + const eid = hre.network.config.eid as EndpointId + const lzNetworkName = endpointIdToNetwork(eid) + + const { address } = getDeploymentAddressAndAbi(lzNetworkName, 'EndpointV2') + + await deploy(contractName, { + from: signer.address, + args: [address], + log: true, + waitConfirmations: 1, + skipIfAlreadyDeployed: false, + proxy: { + proxyContract: 'OpenZeppelinTransparentProxy', + owner: signer.address, + execute: { + init: { + methodName: 'initialize', + args: ['MyOFT', 'MOFT', signer.address], // TODO: add name/symbol + }, + }, + }, + }) +} + +deploy.tags = [contractName] + +export default deploy diff --git a/plume-oft-adapter-migration/deploy/MyOFTUpgradeableMock.ts b/plume-oft-adapter-migration/deploy/MyOFTUpgradeableMock.ts new file mode 100644 index 00000000..2da2943f --- /dev/null +++ b/plume-oft-adapter-migration/deploy/MyOFTUpgradeableMock.ts @@ -0,0 +1,39 @@ +import { type DeployFunction } from 'hardhat-deploy/types' + +import { EndpointId, endpointIdToNetwork } from '@layerzerolabs/lz-definitions' +import { getDeploymentAddressAndAbi } from '@layerzerolabs/lz-evm-sdk-v2' + +const contractName = 'MyOFTUpgradeableMock' + +const deploy: DeployFunction = async (hre) => { + const { deploy } = hre.deployments + const signer = (await hre.ethers.getSigners())[0] + console.log(`deploying ${contractName} on network: ${hre.network.name} with ${signer.address}`) + + const eid = hre.network.config.eid as EndpointId + const lzNetworkName = endpointIdToNetwork(eid) + + const { address } = getDeploymentAddressAndAbi(lzNetworkName, 'EndpointV2') + + await deploy(contractName, { + from: signer.address, + args: [address], + log: true, + waitConfirmations: 1, + skipIfAlreadyDeployed: false, + proxy: { + proxyContract: 'OpenZeppelinTransparentProxy', + owner: signer.address, + execute: { + init: { + methodName: 'initialize', + args: ['MyOFT', 'MOFT', signer.address], // TODO: add name/symbol + }, + }, + }, + }) +} + +deploy.tags = [contractName] + +export default deploy diff --git a/plume-oft-adapter-migration/foundry.toml b/plume-oft-adapter-migration/foundry.toml new file mode 100644 index 00000000..325211b4 --- /dev/null +++ b/plume-oft-adapter-migration/foundry.toml @@ -0,0 +1,30 @@ +[profile.default] +solc-version = '0.8.22' +src = 'contracts' +out = 'out' +test = 'test/foundry' +cache_path = 'cache/foundry' +optimizer = true +optimizer_runs = 20_000 + +libs = [ + # We provide a set of useful contract utilities + # in the lib directory of @layerzerolabs/toolbox-foundry: + # + # - forge-std + # - ds-test + # - solidity-bytes-utils + 'node_modules/@layerzerolabs/toolbox-foundry/lib', + 'node_modules', +] + +remappings = [ + # Due to a misconfiguration of solidity-bytes-utils, an outdated version + # of forge-std is being dragged in + # + # To remedy this, we'll remap the ds-test and forge-std imports to ou own versions + 'ds-test/=node_modules/@layerzerolabs/toolbox-foundry/lib/ds-test', + 'forge-std/=node_modules/@layerzerolabs/toolbox-foundry/lib/forge-std', + '@layerzerolabs/=node_modules/@layerzerolabs/', + '@openzeppelin/=node_modules/@openzeppelin/', +] diff --git a/plume-oft-adapter-migration/hardhat.config.ts b/plume-oft-adapter-migration/hardhat.config.ts new file mode 100644 index 00000000..8191c4cf --- /dev/null +++ b/plume-oft-adapter-migration/hardhat.config.ts @@ -0,0 +1,89 @@ +// Get the environment configuration from .env file +// +// To make use of automatic environment setup: +// - Duplicate .env.example file and name it .env +// - Fill in the environment variables +import 'dotenv/config' + +import '@openzeppelin/hardhat-upgrades' +import 'hardhat-deploy' +import '@nomiclabs/hardhat-waffle' +import 'hardhat-deploy-ethers' +import 'hardhat-contract-sizer' +import '@nomiclabs/hardhat-ethers' +import '@layerzerolabs/toolbox-hardhat' + +import { HardhatUserConfig, HttpNetworkAccountsUserConfig } from 'hardhat/types' + +import { EndpointId } from '@layerzerolabs/lz-definitions' + +import './tasks/sendOFT' + +// Set your preferred authentication method +// +// If you prefer using a mnemonic, set a MNEMONIC environment variable +// to a valid mnemonic +const MNEMONIC = process.env.MNEMONIC + +// If you prefer to be authenticated using a private key, set a PRIVATE_KEY environment variable +const PRIVATE_KEY = process.env.PRIVATE_KEY + +const accounts: HttpNetworkAccountsUserConfig | undefined = MNEMONIC + ? { mnemonic: MNEMONIC } + : PRIVATE_KEY + ? [PRIVATE_KEY] + : undefined + +if (accounts == null) { + console.warn( + 'Could not find MNEMONIC or PRIVATE_KEY environment variables. It will not be possible to execute transactions in your example.' + ) +} + +const config: HardhatUserConfig = { + paths: { + cache: 'cache/hardhat', + }, + solidity: { + compilers: [ + { + version: '0.8.22', + settings: { + optimizer: { + enabled: true, + runs: 200, + }, + }, + }, + ], + }, + networks: { + 'optimism-testnet': { + eid: EndpointId.OPTSEP_V2_TESTNET, + url: process.env.RPC_URL_OP_SEPOLIA || 'https://optimism-sepolia.gateway.tenderly.co', + accounts, + }, + 'arbitrum-testnet': { + eid: EndpointId.ARBSEP_V2_TESTNET, + url: process.env.RPC_URL_ARB_SEPOLIA || 'https://arbitrum-sepolia.gateway.tenderly.co', + accounts, + }, + hardhat: { + // Need this for testing because TestHelperOz5.sol is exceeding the compiled contract size limit + allowUnlimitedContractSize: true, + }, + }, + namedAccounts: { + deployer: { + default: 0, // wallet address of index[0], of the mnemonic in .env + }, + }, + layerZero: { + // You can tell hardhat toolbox not to include any deployments (hover over the property name to see full docs) + deploymentSourcePackages: [], + // You can tell hardhat not to include any artifacts either + // artifactSourcePackages: [], + }, +} + +export default config diff --git a/plume-oft-adapter-migration/layerzero.config.ts b/plume-oft-adapter-migration/layerzero.config.ts new file mode 100644 index 00000000..baa1c7a4 --- /dev/null +++ b/plume-oft-adapter-migration/layerzero.config.ts @@ -0,0 +1,52 @@ +import { EndpointId } from '@layerzerolabs/lz-definitions' +import { ExecutorOptionType } from '@layerzerolabs/lz-v2-utilities' +import { TwoWayConfig, generateConnectionsConfig } from '@layerzerolabs/metadata-tools' +import { OAppEnforcedOption } from '@layerzerolabs/toolbox-hardhat' + +import type { OmniPointHardhat } from '@layerzerolabs/toolbox-hardhat' + +const optimismContract: OmniPointHardhat = { + eid: EndpointId.OPTSEP_V2_TESTNET, + contractName: 'MyOFTUpgradeableMock', // Note: change this to 'MyOFTUpgradeable' or your production contract name +} + +const arbitrumContract: OmniPointHardhat = { + eid: EndpointId.ARBSEP_V2_TESTNET, + contractName: 'MyOFTUpgradeableMock', // Note: change this to 'MyOFTUpgradeable' or your production contract name +} + +// To connect all the above chains to each other, we need the following pathways: +// Optimism <-> Arbitrum + +// For this example's simplicity, we will use the same enforced options values for sending to all chains +// For production, you should ensure `gas` is set to the correct value through profiling the gas usage of calling OFT._lzReceive(...) on the destination chain +// To learn more, read https://docs.layerzero.network/v2/concepts/applications/oapp-standard#execution-options-and-enforced-settings +const EVM_ENFORCED_OPTIONS: OAppEnforcedOption[] = [ + { + msgType: 1, + optionType: ExecutorOptionType.LZ_RECEIVE, + gas: 80000, + value: 0, + }, +] +// With the config generator, pathways declared are automatically bidirectional +// i.e. if you declare A,B there's no need to declare B,A +const pathways: TwoWayConfig[] = [ + [ + optimismContract, // Chain A contract + arbitrumContract, // Chain C contract + [['LayerZero Labs'], []], // [ requiredDVN[], [ optionalDVN[], threshold ] ] + [1, 1], // [A to B confirmations, B to A confirmations] + [EVM_ENFORCED_OPTIONS, EVM_ENFORCED_OPTIONS], // Chain C enforcedOptions, Chain A enforcedOptions + ], +] +// Note: you should not use the values 1, 1 for confirmations. Choose the right number of confirmations based on the finalization that you require from the source/destination chains. + +export default async function () { + // Generate the connections config based on the pathways + const connections = await generateConnectionsConfig(pathways) + return { + contracts: [{ contract: optimismContract }, { contract: arbitrumContract }], + connections, + } +} diff --git a/plume-oft-adapter-migration/package.json b/plume-oft-adapter-migration/package.json new file mode 100644 index 00000000..ea7b5ef9 --- /dev/null +++ b/plume-oft-adapter-migration/package.json @@ -0,0 +1,83 @@ +{ + "name": "@layerzerolabs/oft-upgradeable-example", + "version": "0.3.0", + "private": true, + "license": "MIT", + "scripts": { + "clean": "rm -rf artifacts cache out", + "compile": "concurrently -c auto --names forge,hardhat '$npm_execpath run compile:forge' '$npm_execpath run compile:hardhat'", + "compile:forge": "forge build", + "compile:hardhat": "hardhat compile", + "lint": "$npm_execpath run lint:js && $npm_execpath run lint:sol", + "lint:fix": "eslint --fix '**/*.{js,ts,json}' && prettier --write . && solhint 'contracts/**/*.sol' --fix --noPrompt", + "lint:js": "eslint '**/*.{js,ts,json}' && prettier --check .", + "lint:sol": "solhint 'contracts/**/*.sol'", + "test": "$npm_execpath run test:forge && $npm_execpath run test:hardhat", + "test:forge": "forge test", + "test:hardhat": "hardhat test" + }, + "resolutions": { + "ethers": "^5.7.2", + "hardhat-deploy": "^0.12.1" + }, + "devDependencies": { + "@babel/core": "^7.23.9", + "@layerzerolabs/devtools-evm-hardhat": "^3.0.0", + "@layerzerolabs/eslint-config-next": "~2.3.39", + "@layerzerolabs/io-devtools": "~0.2.0", + "@layerzerolabs/lz-definitions": "^3.0.75", + "@layerzerolabs/lz-evm-messagelib-v2": "^3.0.75", + "@layerzerolabs/lz-evm-protocol-v2": "^3.0.75", + "@layerzerolabs/lz-evm-sdk-v2": "^3.0.75", + "@layerzerolabs/lz-evm-v1-0.7": "^3.0.75", + "@layerzerolabs/lz-v2-utilities": "^3.0.75", + "@layerzerolabs/metadata-tools": "^2.0.0", + "@layerzerolabs/oapp-evm": "^0.3.2", + "@layerzerolabs/oapp-evm-upgradeable": "^0.1.2", + "@layerzerolabs/oft-evm": "^3.1.3", + "@layerzerolabs/oft-evm-upgradeable": "^3.0.2", + "@layerzerolabs/prettier-config-next": "^2.3.39", + "@layerzerolabs/solhint-config": "^3.0.12", + "@layerzerolabs/test-devtools-evm-foundry": "~6.0.3", + "@layerzerolabs/toolbox-foundry": "~0.1.12", + "@layerzerolabs/toolbox-hardhat": "~0.6.10", + "@nomiclabs/hardhat-ethers": "^2.2.3", + "@nomiclabs/hardhat-waffle": "^2.0.6", + "@openzeppelin/contracts": "^5.0.2", + "@openzeppelin/contracts-upgradeable": "^5.0.2", + "@openzeppelin/hardhat-upgrades": "^1.28.0", + "@rushstack/eslint-patch": "^1.7.0", + "@types/chai": "^4.3.11", + "@types/mocha": "^10.0.6", + "@types/node": "~18.18.14", + "chai": "^4.4.1", + "concurrently": "~9.1.0", + "dotenv": "^16.4.1", + "eslint": "^8.55.0", + "eslint-plugin-jest-extended": "~2.0.0", + "ethers": "^5.7.2", + "hardhat": "^2.22.10", + "hardhat-contract-sizer": "^2.10.0", + "hardhat-deploy": "^0.12.1", + "hardhat-deploy-ethers": "^0.3.0-beta.13", + "mocha": "^10.2.0", + "prettier": "^3.2.5", + "solhint": "^4.1.1", + "solidity-bytes-utils": "^0.8.2", + "ts-node": "^10.9.2", + "typescript": "^5.4.4" + }, + "engines": { + "node": ">=18.16.0" + }, + "pnpm": { + "overrides": { + "ethers": "^5.7.2", + "hardhat-deploy": "^0.12.1" + } + }, + "overrides": { + "ethers": "^5.7.2", + "hardhat-deploy": "^0.12.1" + } +} diff --git a/plume-oft-adapter-migration/solhint.config.js b/plume-oft-adapter-migration/solhint.config.js new file mode 100644 index 00000000..52efe629 --- /dev/null +++ b/plume-oft-adapter-migration/solhint.config.js @@ -0,0 +1 @@ +module.exports = require('@layerzerolabs/solhint-config'); diff --git a/plume-oft-adapter-migration/tasks/sendEvm.ts b/plume-oft-adapter-migration/tasks/sendEvm.ts new file mode 100644 index 00000000..7a9cf989 --- /dev/null +++ b/plume-oft-adapter-migration/tasks/sendEvm.ts @@ -0,0 +1,242 @@ +import path from 'path' + +import { BigNumber, ContractTransaction } from 'ethers' +import { parseUnits } from 'ethers/lib/utils' +import { HardhatRuntimeEnvironment } from 'hardhat/types' + +import { OmniPointHardhat, createGetHreByEid } from '@layerzerolabs/devtools-evm-hardhat' +import { createLogger } from '@layerzerolabs/io-devtools' +import { ChainType, endpointIdToChainType, endpointIdToNetwork } from '@layerzerolabs/lz-definitions' +import { Options, addressToBytes32 } from '@layerzerolabs/lz-v2-utilities' + +import { SendResult } from './types' +import { DebugLogger, KnownErrors, getLayerZeroScanLink } from './utils' + +const logger = createLogger() + +export interface EvmArgs { + srcEid: number + dstEid: number + amount: string + to: string + oappConfig: string + minAmount?: string + extraLzReceiveOptions?: string[] + extraLzComposeOptions?: string[] + extraNativeDropOptions?: string[] + composeMsg?: string + oftAddress?: string +} + +export async function sendEvm( + { + srcEid, + dstEid, + amount, + to, + oappConfig, + minAmount, + extraLzReceiveOptions, + extraLzComposeOptions, + extraNativeDropOptions, + composeMsg, + oftAddress, + }: EvmArgs, + hre: HardhatRuntimeEnvironment +): Promise { + if (endpointIdToChainType(srcEid) !== ChainType.EVM) { + throw new Error(`non-EVM srcEid (${srcEid}) not supported here`) + } + + const getHreByEid = createGetHreByEid(hre) + let srcEidHre: HardhatRuntimeEnvironment + try { + srcEidHre = await getHreByEid(srcEid) + } catch (error) { + DebugLogger.printErrorAndFixSuggestion( + KnownErrors.ERROR_GETTING_HRE, + `For network: ${endpointIdToNetwork(srcEid)}, OFT: ${oftAddress}` + ) + throw error + } + const signer = (await srcEidHre.ethers.getSigners())[0] + + // 1️⃣ resolve the OFT wrapper address + let wrapperAddress: string + if (oftAddress) { + wrapperAddress = oftAddress + } else { + const layerZeroConfig = (await import(path.resolve('./', oappConfig))).default + const { contracts } = typeof layerZeroConfig === 'function' ? await layerZeroConfig() : layerZeroConfig + const wrapper = contracts.find((c: { contract: OmniPointHardhat }) => c.contract.eid === srcEid) + if (!wrapper) throw new Error(`No config for EID ${srcEid}`) + wrapperAddress = wrapper.contract.contractName + ? (await srcEidHre.deployments.get(wrapper.contract.contractName)).address + : wrapper.contract.address || '' + } + + // 2️⃣ load IOFT ABI, extend it with token() + const ioftArtifact = await srcEidHre.artifacts.readArtifact('IOFT') + + // now attach + const oft = await srcEidHre.ethers.getContractAt(ioftArtifact.abi, wrapperAddress, signer) + + // 3️⃣ fetch the underlying ERC-20 + const underlying = await oft.token() + + // 4️⃣ fetch decimals from the underlying token + const erc20 = await srcEidHre.ethers.getContractAt('ERC20', underlying, signer) + const decimals: number = await erc20.decimals() + + // 5️⃣ normalize the user-supplied amount + const amountUnits: BigNumber = parseUnits(amount, decimals) + + // 6️⃣ Check if approval is required (for OFT Adapters) and handle approval + try { + const approvalRequired = await oft.approvalRequired() + if (approvalRequired) { + logger.info('OFT Adapter detected - checking ERC20 allowance...') + + // Check current allowance + const currentAllowance = await erc20.allowance(signer.address, wrapperAddress) + logger.info(`Current allowance: ${currentAllowance.toString()}`) + logger.info(`Required amount: ${amountUnits.toString()}`) + + if (currentAllowance.lt(amountUnits)) { + logger.info('Insufficient allowance - approving ERC20 tokens...') + const approveTx = await erc20.approve(wrapperAddress, amountUnits) + logger.info(`Approval transaction hash: ${approveTx.hash}`) + await approveTx.wait() + logger.info('ERC20 approval confirmed') + } else { + logger.info('Sufficient allowance already exists') + } + } + } catch (error) { + // If approvalRequired() doesn't exist or fails, assume it's a regular OFT (not an adapter) + logger.info('No approval required (regular OFT detected)') + } + + // 7️⃣ hex string → Uint8Array → zero-pad to 32 bytes + const toBytes = addressToBytes32(to) + + // 8️⃣ Build options dynamically using Options.newOptions() + let options = Options.newOptions() + + // Add lzReceive options + if (extraLzReceiveOptions && extraLzReceiveOptions.length > 0) { + // Handle case where Hardhat's CSV parsing splits "gas,value" into separate elements + if (extraLzReceiveOptions.length % 2 !== 0) { + throw new Error( + `Invalid lzReceive options: received ${extraLzReceiveOptions.length} values, but expected pairs of gas,value` + ) + } + + for (let i = 0; i < extraLzReceiveOptions.length; i += 2) { + const gas = Number(extraLzReceiveOptions[i]) + const value = Number(extraLzReceiveOptions[i + 1]) || 0 + options = options.addExecutorLzReceiveOption(gas, value) + logger.info(`Added lzReceive option: ${gas} gas, ${value} value`) + } + } + + // Add lzCompose options + if (extraLzComposeOptions && extraLzComposeOptions.length > 0) { + // Handle case where Hardhat's CSV parsing splits "index,gas,value" into separate elements + if (extraLzComposeOptions.length % 3 !== 0) { + throw new Error( + `Invalid lzCompose options: received ${extraLzComposeOptions.length} values, but expected triplets of index,gas,value` + ) + } + + for (let i = 0; i < extraLzComposeOptions.length; i += 3) { + const index = Number(extraLzComposeOptions[i]) + const gas = Number(extraLzComposeOptions[i + 1]) + const value = Number(extraLzComposeOptions[i + 2]) || 0 + options = options.addExecutorComposeOption(index, gas, value) + logger.info(`Added lzCompose option: index ${index}, ${gas} gas, ${value} value`) + } + } + + // Add native drop options + if (extraNativeDropOptions && extraNativeDropOptions.length > 0) { + // Handle case where Hardhat's CSV parsing splits "amount,recipient" into separate elements + if (extraNativeDropOptions.length % 2 !== 0) { + throw new Error( + `Invalid native drop options: received ${extraNativeDropOptions.length} values, but expected pairs of amount,recipient` + ) + } + + for (let i = 0; i < extraNativeDropOptions.length; i += 2) { + const amountStr = extraNativeDropOptions[i] + const recipient = extraNativeDropOptions[i + 1] + + if (!amountStr || !recipient) { + throw new Error( + `Invalid native drop option: Both amount and recipient must be provided. Got amount="${amountStr}", recipient="${recipient}"` + ) + } + + try { + options = options.addExecutorNativeDropOption(amountStr.trim(), recipient.trim()) + logger.info(`Added native drop option: ${amountStr.trim()} wei to ${recipient.trim()}`) + } catch (error) { + // Provide helpful context if the amount exceeds protocol limits + const maxUint128 = BigInt('340282366920938463463374607431768211455') // 2^128 - 1 + const maxUint128Ether = Number(maxUint128) / 1e18 // Convert to ETH for readability + + throw new Error( + `Failed to add native drop option with amount ${amountStr.trim()} wei. ` + + `LayerZero protocol constrains native drop amounts to uint128 maximum ` + + `(${maxUint128.toString()} wei ≈ ${maxUint128Ether.toFixed(2)} ETH). ` + + `Original error: ${error instanceof Error ? error.message : String(error)}` + ) + } + } + } + + const extraOptions = options.toHex() + + // 9️⃣ build sendParam and dispatch + const sendParam = { + dstEid, + to: toBytes, + amountLD: amountUnits.toString(), + minAmountLD: minAmount ? parseUnits(minAmount, decimals).toString() : amountUnits.toString(), + extraOptions: extraOptions, + composeMsg: composeMsg ? composeMsg.toString() : '0x', + oftCmd: '0x', + } + + // 10️⃣ Quote (MessagingFee = { nativeFee, lzTokenFee }) + logger.info('Quoting the native gas cost for the send transaction...') + let msgFee: { nativeFee: BigNumber; lzTokenFee: BigNumber } + try { + msgFee = await oft.quoteSend(sendParam, false) + } catch (error) { + DebugLogger.printErrorAndFixSuggestion( + KnownErrors.ERROR_QUOTING_NATIVE_GAS_COST, + `For network: ${endpointIdToNetwork(srcEid)}, OFT: ${oftAddress}` + ) + throw error + } + logger.info('Sending the transaction...') + let tx: ContractTransaction + try { + tx = await oft.send(sendParam, msgFee, signer.address, { + value: msgFee.nativeFee, + }) + } catch (error) { + DebugLogger.printErrorAndFixSuggestion( + KnownErrors.ERROR_SENDING_TRANSACTION, + `For network: ${endpointIdToNetwork(srcEid)}, OFT: ${oftAddress}` + ) + throw error + } + const receipt = await tx.wait() + + const txHash = receipt.transactionHash + const scanLink = getLayerZeroScanLink(txHash, srcEid >= 40_000 && srcEid < 50_000) + + return { txHash, scanLink } +} diff --git a/plume-oft-adapter-migration/tasks/sendOFT.ts b/plume-oft-adapter-migration/tasks/sendOFT.ts new file mode 100644 index 00000000..32101a05 --- /dev/null +++ b/plume-oft-adapter-migration/tasks/sendOFT.ts @@ -0,0 +1,108 @@ +import { task, types } from 'hardhat/config' +import { HardhatRuntimeEnvironment } from 'hardhat/types' + +import { types as cliTypes } from '@layerzerolabs/devtools-evm-hardhat' +import { ChainType, endpointIdToChainType, endpointIdToNetwork } from '@layerzerolabs/lz-definitions' + +import { EvmArgs, sendEvm } from './sendEvm' +import { SendResult } from './types' +import { DebugLogger, KnownOutputs, KnownWarnings, getBlockExplorerLink } from './utils' + +interface MasterArgs { + srcEid: number + dstEid: number + amount: string + to: string + oappConfig: string + /** Minimum amount to receive in case of custom slippage or fees (human readable units, e.g. "1.5") */ + minAmount?: string + /** Array of lzReceive options as comma-separated values "gas,value" - e.g. --extra-lz-receive-options "200000,0" */ + extraLzReceiveOptions?: string[] + /** Array of lzCompose options as comma-separated values "index,gas,value" - e.g. --extra-lz-compose-options "0,500000,0" */ + extraLzComposeOptions?: string[] + /** Array of native drop options as comma-separated values "amount,recipient" - e.g. --extra-native-drop-options "1000000000000000000,0x1234..." */ + extraNativeDropOptions?: string[] + /** Arbitrary bytes message to deliver alongside the OFT */ + composeMsg?: string + /** EVM: 20-byte hex address */ + oftAddress?: string +} + +task('lz:oft:send', 'Sends OFT tokens cross‐chain from EVM chains') + .addParam('srcEid', 'Source endpoint ID', undefined, types.int) + .addParam('dstEid', 'Destination endpoint ID', undefined, types.int) + .addParam('amount', 'Amount to send (human readable units, e.g. "1.5")', undefined, types.string) + .addParam('to', 'Recipient address (20-byte hex for EVM)', undefined, types.string) + .addOptionalParam('oappConfig', 'Path to the LayerZero config file', 'layerzero.config.ts', types.string) + .addOptionalParam( + 'minAmount', + 'Minimum amount to receive in case of custom slippage or fees (human readable units, e.g. "1.5")', + undefined, + types.string + ) + .addOptionalParam( + 'extraLzReceiveOptions', + 'Array of extra lzReceive options in format "gas,value" (e.g. ["200000,0", "100000,1000000000000000000"])', + undefined, + cliTypes.csv + ) + .addOptionalParam( + 'extraLzComposeOptions', + 'Array of extra lzCompose options in format "index,gas,value" (e.g. ["0,500000,0", "1,300000,1000000000000000000"])', + undefined, + cliTypes.csv + ) + .addOptionalParam( + 'extraNativeDropOptions', + 'Array of extra native drop options in format "amount,recipient" (e.g. ["1000000000000000000,0x1234..."])', + undefined, + cliTypes.csv + ) + .addOptionalParam('composeMsg', 'Arbitrary bytes message to deliver alongside the OFT', undefined, types.string) + .addOptionalParam( + 'oftAddress', + 'Override the source local deployment OFT address (20-byte hex for EVM)', + undefined, + types.string + ) + .setAction(async (args: MasterArgs, hre: HardhatRuntimeEnvironment) => { + const chainType = endpointIdToChainType(args.srcEid) + let result: SendResult + + if (args.oftAddress) { + DebugLogger.printWarning( + KnownWarnings.USING_OVERRIDE_OFT, + `For network: ${endpointIdToNetwork(args.srcEid)}, OFT: ${args.oftAddress}` + ) + } + + // Only support EVM chains in this example + if (chainType === ChainType.EVM) { + result = await sendEvm(args as EvmArgs, hre) + } else { + throw new Error( + `The chain type ${chainType} is not supported in this OFT example. Only EVM chains are supported.` + ) + } + + DebugLogger.printLayerZeroOutput( + KnownOutputs.SENT_VIA_OFT, + `Successfully sent ${args.amount} tokens from ${endpointIdToNetwork(args.srcEid)} to ${endpointIdToNetwork(args.dstEid)}` + ) + + // print the explorer link for the srcEid from metadata + const explorerLink = await getBlockExplorerLink(args.srcEid, result.txHash) + // if explorer link is available, print the tx hash link + if (explorerLink) { + DebugLogger.printLayerZeroOutput( + KnownOutputs.TX_HASH, + `Explorer link for source chain ${endpointIdToNetwork(args.srcEid)}: ${explorerLink}` + ) + } + + // print the LayerZero Scan link from metadata + DebugLogger.printLayerZeroOutput( + KnownOutputs.EXPLORER_LINK, + `LayerZero Scan link for tracking all cross-chain transaction details: ${result.scanLink}` + ) + }) diff --git a/plume-oft-adapter-migration/tasks/types.ts b/plume-oft-adapter-migration/tasks/types.ts new file mode 100644 index 00000000..8d2b6816 --- /dev/null +++ b/plume-oft-adapter-migration/tasks/types.ts @@ -0,0 +1,4 @@ +export interface SendResult { + txHash: string // EVM: receipt.transactionHash + scanLink: string // LayerZeroScan link for cross-chain tracking +} diff --git a/plume-oft-adapter-migration/tasks/utils.ts b/plume-oft-adapter-migration/tasks/utils.ts new file mode 100644 index 00000000..5e2fd9b3 --- /dev/null +++ b/plume-oft-adapter-migration/tasks/utils.ts @@ -0,0 +1,48 @@ +import { endpointIdToNetwork } from '@layerzerolabs/lz-definitions' +import { Options } from '@layerzerolabs/lz-v2-utilities' + +export const deploymentMetadataUrl = 'https://metadata.layerzero-api.com/v1/metadata/deployments' + +/** + * Given a srcEid and on-chain tx hash, return + * `https://…blockExplorers[0].url/tx/`, or undefined. + */ +export async function getBlockExplorerLink(srcEid: number, txHash: string): Promise { + const network = endpointIdToNetwork(srcEid) // e.g. "ethereum-mainnet" + const res = await fetch(deploymentMetadataUrl) + if (!res.ok) return + const all = (await res.json()) as Record + const meta = all[network] + const explorer = meta?.blockExplorers?.[0]?.url + if (explorer) { + // many explorers use `/tx/` + return `${explorer.replace(/\/+$/, '')}/tx/${txHash}` + } + return +} + +function formatBigIntForDisplay(n: bigint) { + return n.toLocaleString().replace(/,/g, '_') +} + +export function decodeLzReceiveOptions(hex: string): string { + try { + // Handle empty/undefined values first + if (!hex || hex === '0x') return 'No options set' + const options = Options.fromOptions(hex) + const lzReceiveOpt = options.decodeExecutorLzReceiveOption() + return lzReceiveOpt + ? `gas: ${formatBigIntForDisplay(lzReceiveOpt.gas)} , value: ${formatBigIntForDisplay(lzReceiveOpt.value)} wei` + : 'No executor options' + } catch (e) { + return `Invalid options (${hex.slice(0, 12)}...)` + } +} + +// Get LayerZero scan link +export function getLayerZeroScanLink(txHash: string, isTestnet = false): string { + const baseUrl = isTestnet ? 'https://testnet.layerzeroscan.com' : 'https://layerzeroscan.com' + return `${baseUrl}/tx/${txHash}` +} + +export { DebugLogger, KnownErrors, KnownOutputs, KnownWarnings } from '@layerzerolabs/io-devtools' diff --git a/plume-oft-adapter-migration/test/foundry/MyOFTUpgradeable.t.sol b/plume-oft-adapter-migration/test/foundry/MyOFTUpgradeable.t.sol new file mode 100644 index 00000000..d00c769c --- /dev/null +++ b/plume-oft-adapter-migration/test/foundry/MyOFTUpgradeable.t.sol @@ -0,0 +1,61 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.20; + +import { OFTTest } from "@layerzerolabs/oft-evm-upgradeable/test/OFT.t.sol"; +import { MyOFTAdapterUpgradeable } from "../../contracts/MyOFTAdapterUpgradeable.sol"; +import { EndpointV2Mock } from "@layerzerolabs/test-devtools-evm-foundry/contracts/mocks/EndpointV2Mock.sol"; +import { MyOFTUpgradeable } from "../../contracts/MyOFTUpgradeable.sol"; +import { Initializable } from "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; + +contract MyOFTUpgradeableTest is OFTTest { + bytes32 internal constant IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; + + function test_oft_implementation_initialization_disabled() public { + MyOFTUpgradeable oftUpgradeable = MyOFTUpgradeable( + _deployContractAndProxy( + type(MyOFTUpgradeable).creationCode, + abi.encode(address(endpoints[aEid])), + abi.encodeWithSelector( + MyOFTUpgradeable.initialize.selector, + "oftUpgradeable", + "oftUpgradeable", + address(this) + ) + ) + ); + + bytes32 implementationRaw = vm.load(address(oftUpgradeable), IMPLEMENTATION_SLOT); + address implementationAddress = address(uint160(uint256(implementationRaw))); + + MyOFTUpgradeable oftUpgradeableImplementation = MyOFTUpgradeable(implementationAddress); + + vm.expectRevert(Initializable.InvalidInitialization.selector); + oftUpgradeableImplementation.initialize("oftUpgradeable", "oftUpgradeable", address(this)); + + EndpointV2Mock endpoint = EndpointV2Mock(address(oftUpgradeable.endpoint())); + assertEq(endpoint.delegates(address(oftUpgradeable)), address(this)); + assertEq(endpoint.delegates(implementationAddress), address(0)); + } + + function test_oft_adapter_implementation_initialization_disabled() public { + MyOFTAdapterUpgradeable oftAdapter = MyOFTAdapterUpgradeable( + _deployContractAndProxy( + type(MyOFTAdapterUpgradeable).creationCode, + abi.encode(address(cERC20Mock), address(endpoints[cEid])), + abi.encodeWithSelector(MyOFTAdapterUpgradeable.initialize.selector, address(this)) + ) + ); + + bytes32 implementationRaw = vm.load(address(oftAdapter), IMPLEMENTATION_SLOT); + address implementationAddress = address(uint160(uint256(implementationRaw))); + + MyOFTAdapterUpgradeable oftAdapterImplementation = MyOFTAdapterUpgradeable(implementationAddress); + + vm.expectRevert(Initializable.InvalidInitialization.selector); + oftAdapterImplementation.initialize(address(this)); + + EndpointV2Mock endpoint = EndpointV2Mock(address(oftAdapter.endpoint())); + assertEq(endpoint.delegates(address(oftAdapter)), address(this)); + assertEq(endpoint.delegates(implementationAddress), address(0)); + } +} diff --git a/plume-oft-adapter-migration/test/hardhat/MyOFTUpgradeable.test.ts b/plume-oft-adapter-migration/test/hardhat/MyOFTUpgradeable.test.ts new file mode 100644 index 00000000..ce11c5f4 --- /dev/null +++ b/plume-oft-adapter-migration/test/hardhat/MyOFTUpgradeable.test.ts @@ -0,0 +1,98 @@ +import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers' +import { expect } from 'chai' +import { Contract, ContractFactory } from 'ethers' +import { deployments, ethers, upgrades } from 'hardhat' + +describe('MyOFTUpgradeable Test', () => { + // Constant representing a mock Endpoint ID for testing purposes + const eidA = 1 + const eidB = 2 + // Declaration of variables to be used in the test suite + let MyOFT: ContractFactory + let EndpointV2Mock: ContractFactory + let ownerA: SignerWithAddress + let ownerB: SignerWithAddress + let endpointOwner: SignerWithAddress + let myOFTA: Contract + let myOFTB: Contract + let mockEndpointV2A: Contract + let mockEndpointV2B: Contract + + before(async function () { + MyOFT = await ethers.getContractFactory('MyOFTUpgradeable') + + // Fetching the first three signers (accounts) from Hardhat's local Ethereum network + const signers = await ethers.getSigners() + + ;[ownerA, ownerB, endpointOwner] = signers + + // The EndpointV2Mock contract comes from @layerzerolabs/test-devtools-evm-hardhat package + // and its artifacts are connected as external artifacts to this project + // + // Unfortunately, hardhat itself does not yet provide a way of connecting external artifacts, + // so we rely on hardhat-deploy to create a ContractFactory for EndpointV2Mock + // + // See https://github.com/NomicFoundation/hardhat/issues/1040 + const EndpointV2MockArtifact = await deployments.getArtifact('EndpointV2Mock') + EndpointV2Mock = new ContractFactory(EndpointV2MockArtifact.abi, EndpointV2MockArtifact.bytecode, endpointOwner) + }) + + // beforeEach hook for setup that runs before each test in the block + beforeEach(async function () { + // Deploying a mock LZEndpoint with the given Endpoint ID + mockEndpointV2A = await EndpointV2Mock.deploy(eidA) + mockEndpointV2B = await EndpointV2Mock.deploy(eidB) + + // Deploying two instances of MyOFT contract with different identifiers and linking them to the mock LZEndpoint + myOFTA = await MyOFT.deploy(mockEndpointV2A.address) + myOFTB = await MyOFT.deploy(mockEndpointV2B.address) + + // Setting destination endpoints in the LZEndpoint mock for each MyOFT instance + await mockEndpointV2A.setDestLzEndpoint(myOFTB.address, mockEndpointV2B.address) + await mockEndpointV2B.setDestLzEndpoint(myOFTA.address, mockEndpointV2A.address) + }) + + it('should upgrade', async () => { + // Deploying the upgradeable contract + const MyOFTUpgradeable = await ethers.getContractFactory('MyOFTUpgradeable') + const myOFTUpgradeable = await upgrades.deployProxy(MyOFTUpgradeable, ['MyOFT', 'MOFT', ownerA.address], { + initializer: 'initialize', + constructorArgs: [mockEndpointV2A.address], + unsafeAllow: ['constructor', 'state-variable-immutable'], + }) + const myOFTUpgradeableImpl = (await upgrades.admin.getInstance(ownerA)).functions.getProxyImplementation( + myOFTUpgradeable.address + ) + + // Upgrade the contract to the mock, so it has a "mint" function + const MyOFTUpgradeableMock = await ethers.getContractFactory('MyOFTUpgradeableMock') + const myOFTUpgradeableMock = await upgrades.upgradeProxy(myOFTUpgradeable.address, MyOFTUpgradeableMock, { + constructorArgs: [mockEndpointV2A.address], + unsafeAllow: ['constructor', 'state-variable-immutable'], + }) + + // Ensure the proxy remains constant after the upgrade + expect(myOFTUpgradeable.address).to.equal(myOFTUpgradeableMock.address) + const myOFTUpgradeableMockImpl = (await upgrades.admin.getInstance(ownerA)).functions.getProxyImplementation( + myOFTUpgradeableMock.address + ) + // ensure the implementation address changed + expect(myOFTUpgradeableImpl).to.not.equal(myOFTUpgradeableMockImpl) + const [intialBalance] = await myOFTUpgradeableMock.functions.balanceOf(ownerA.address) + // ensure we can mint now + await (await myOFTUpgradeableMock.functions.mint(ownerA.address, 100)).wait() + const [finalBalance] = await myOFTUpgradeableMock.functions.balanceOf(ownerA.address) + expect(finalBalance.toNumber()).to.equal(intialBalance.add(100).toNumber()) + + // Downgrade the contract to remove mint + const myOFTUpgradeableAgain = await upgrades.upgradeProxy(myOFTUpgradeableMock.address, MyOFTUpgradeable, { + constructorArgs: [mockEndpointV2A.address], + unsafeAllow: ['constructor', 'state-variable-immutable'], + }) + // Ensure the proxy remains constant after the upgrade + expect(myOFTUpgradeableMock.address).to.equal(myOFTUpgradeableAgain.address) + // Ensure that the tokens don't disappear into thin air + const [postUpgradeBalance] = await myOFTUpgradeableMock.functions.balanceOf(ownerA.address) + expect(postUpgradeBalance.toNumber()).to.equal(finalBalance.toNumber()) + }) +}) diff --git a/plume-oft-adapter-migration/tsconfig.json b/plume-oft-adapter-migration/tsconfig.json new file mode 100644 index 00000000..027ad0f3 --- /dev/null +++ b/plume-oft-adapter-migration/tsconfig.json @@ -0,0 +1,13 @@ +{ + "exclude": ["node_modules"], + "include": ["deploy", "tasks", "test", "hardhat.config.ts"], + "compilerOptions": { + "target": "es2020", + "module": "commonjs", + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "strict": true, + "skipLibCheck": true, + "resolveJsonModule": true + } +} From 7a3ff87919539f653235a4b7e6b1840640d07cd2 Mon Sep 17 00:00:00 2001 From: ravinagill15 Date: Fri, 18 Jul 2025 13:42:34 -0700 Subject: [PATCH 02/20] copied over contracts and tests from orbit-adapter repo --- .../contracts/L2/GasToken.sol | 14 + .../contracts/L2/MintableERC20.sol | 8 + .../contracts/L2/OrbitERC20OFTAdapter.sol | 45 ++ .../contracts/L2/bridge/AbsBridge.sol | 308 +++++++++++ .../contracts/L2/bridge/ERC20Bridge.sol | 91 ++++ .../contracts/L2/bridge/IBridge.sol | 126 +++++ .../L2/bridge/IDelayedMessageProvider.sol | 15 + .../contracts/L2/bridge/IERC20Bridge.sol | 37 ++ .../contracts/L2/bridge/IEthBridge.sol | 26 + .../contracts/L2/bridge/IInbox.sol | 133 +++++ .../contracts/L2/bridge/IInboxBase.sol | 86 ++++ .../contracts/L2/bridge/IOwnable.sol | 10 + .../contracts/L2/bridge/ISequencerInbox.sol | 229 +++++++++ .../contracts/L2/bridge/Messages.sol | 38 ++ .../L2/libraries/AddressAliasHelper.sol | 29 ++ .../L2/libraries/DelegateCallAware.sol | 44 ++ .../contracts/L2/libraries/Error.sol | 201 ++++++++ .../contracts/L2/libraries/IGasRefunder.sol | 14 + .../contracts/L2/libraries/MessageTypes.sol | 16 + .../contracts/L2/mocks/BridgeStub.sol | 190 +++++++ .../contracts/L2/mocks/InboxStub.sol | 214 ++++++++ .../contracts/L2/mocks/RollupStub.sol | 11 + .../contracts/L2/mocks/SimpleProxy.sol | 19 + .../L2/mocks/UpgradeExecutorMock.sol | 82 +++ .../contracts/L3/ArbNativeOFTAdapter.sol | 137 +++++ .../contracts/L3/OrbitNativeOFTAdapter.sol | 17 + .../L3/precompiles/ArbNativeTokenManager.sol | 29 ++ .../contracts/MyOFTAdapterFeeUpgradeable.sol | 15 - .../contracts/MyOFTAdapterUpgradeable.sol | 15 - .../contracts/MyOFTFeeUpgradeable.sol | 15 - .../contracts/MyOFTUpgradeable.sol | 15 - .../contracts/mocks/MyERC20Mock.sol | 13 - .../mocks/MyOFTAdapterUpgradeableMock.sol | 9 - .../contracts/mocks/MyOFTUpgradeableMock.sol | 13 - .../test/ArbNativeOFTAdapter.t.sol | 243 +++++++++ .../test/L2_L3_flow.t.sol | 221 ++++++++ .../test/foundry/MyOFTUpgradeable.t.sol | 61 --- .../test/hardhat/MyOFTUpgradeable.test.ts | 98 ---- .../test/helpers/TestHelper.sol | 486 ++++++++++++++++++ .../test/helpers/mocks/SendUln302Mock.sol | 32 ++ .../helpers/mocks/SimpleMessageLibMock.sol | 20 + .../test/mocks/MockArbNativeOFTAdapter.sol | 30 ++ .../test/mocks/MockEndpoint.sol | 163 ++++++ .../test/mocks/MockNativeTokenManager.sol | 20 + .../test/mocks/MockOFT.sol | 18 + 45 files changed, 3402 insertions(+), 254 deletions(-) create mode 100644 plume-oft-adapter-migration/contracts/L2/GasToken.sol create mode 100644 plume-oft-adapter-migration/contracts/L2/MintableERC20.sol create mode 100644 plume-oft-adapter-migration/contracts/L2/OrbitERC20OFTAdapter.sol create mode 100644 plume-oft-adapter-migration/contracts/L2/bridge/AbsBridge.sol create mode 100644 plume-oft-adapter-migration/contracts/L2/bridge/ERC20Bridge.sol create mode 100644 plume-oft-adapter-migration/contracts/L2/bridge/IBridge.sol create mode 100644 plume-oft-adapter-migration/contracts/L2/bridge/IDelayedMessageProvider.sol create mode 100644 plume-oft-adapter-migration/contracts/L2/bridge/IERC20Bridge.sol create mode 100644 plume-oft-adapter-migration/contracts/L2/bridge/IEthBridge.sol create mode 100644 plume-oft-adapter-migration/contracts/L2/bridge/IInbox.sol create mode 100644 plume-oft-adapter-migration/contracts/L2/bridge/IInboxBase.sol create mode 100644 plume-oft-adapter-migration/contracts/L2/bridge/IOwnable.sol create mode 100644 plume-oft-adapter-migration/contracts/L2/bridge/ISequencerInbox.sol create mode 100644 plume-oft-adapter-migration/contracts/L2/bridge/Messages.sol create mode 100644 plume-oft-adapter-migration/contracts/L2/libraries/AddressAliasHelper.sol create mode 100644 plume-oft-adapter-migration/contracts/L2/libraries/DelegateCallAware.sol create mode 100644 plume-oft-adapter-migration/contracts/L2/libraries/Error.sol create mode 100644 plume-oft-adapter-migration/contracts/L2/libraries/IGasRefunder.sol create mode 100644 plume-oft-adapter-migration/contracts/L2/libraries/MessageTypes.sol create mode 100644 plume-oft-adapter-migration/contracts/L2/mocks/BridgeStub.sol create mode 100644 plume-oft-adapter-migration/contracts/L2/mocks/InboxStub.sol create mode 100644 plume-oft-adapter-migration/contracts/L2/mocks/RollupStub.sol create mode 100644 plume-oft-adapter-migration/contracts/L2/mocks/SimpleProxy.sol create mode 100644 plume-oft-adapter-migration/contracts/L2/mocks/UpgradeExecutorMock.sol create mode 100644 plume-oft-adapter-migration/contracts/L3/ArbNativeOFTAdapter.sol create mode 100644 plume-oft-adapter-migration/contracts/L3/OrbitNativeOFTAdapter.sol create mode 100644 plume-oft-adapter-migration/contracts/L3/precompiles/ArbNativeTokenManager.sol delete mode 100644 plume-oft-adapter-migration/contracts/MyOFTAdapterFeeUpgradeable.sol delete mode 100644 plume-oft-adapter-migration/contracts/MyOFTAdapterUpgradeable.sol delete mode 100644 plume-oft-adapter-migration/contracts/MyOFTFeeUpgradeable.sol delete mode 100644 plume-oft-adapter-migration/contracts/MyOFTUpgradeable.sol delete mode 100644 plume-oft-adapter-migration/contracts/mocks/MyERC20Mock.sol delete mode 100644 plume-oft-adapter-migration/contracts/mocks/MyOFTAdapterUpgradeableMock.sol delete mode 100644 plume-oft-adapter-migration/contracts/mocks/MyOFTUpgradeableMock.sol create mode 100644 plume-oft-adapter-migration/test/ArbNativeOFTAdapter.t.sol create mode 100644 plume-oft-adapter-migration/test/L2_L3_flow.t.sol delete mode 100644 plume-oft-adapter-migration/test/foundry/MyOFTUpgradeable.t.sol delete mode 100644 plume-oft-adapter-migration/test/hardhat/MyOFTUpgradeable.test.ts create mode 100644 plume-oft-adapter-migration/test/helpers/TestHelper.sol create mode 100644 plume-oft-adapter-migration/test/helpers/mocks/SendUln302Mock.sol create mode 100644 plume-oft-adapter-migration/test/helpers/mocks/SimpleMessageLibMock.sol create mode 100644 plume-oft-adapter-migration/test/mocks/MockArbNativeOFTAdapter.sol create mode 100644 plume-oft-adapter-migration/test/mocks/MockEndpoint.sol create mode 100644 plume-oft-adapter-migration/test/mocks/MockNativeTokenManager.sol create mode 100644 plume-oft-adapter-migration/test/mocks/MockOFT.sol diff --git a/plume-oft-adapter-migration/contracts/L2/GasToken.sol b/plume-oft-adapter-migration/contracts/L2/GasToken.sol new file mode 100644 index 00000000..5d33053a --- /dev/null +++ b/plume-oft-adapter-migration/contracts/L2/GasToken.sol @@ -0,0 +1,14 @@ +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; +import "@openzeppelin/contracts/access/Ownable.sol"; + +contract GasToken is ERC20, Ownable { + constructor(string memory name_, string memory symbol_) + ERC20(name_, symbol_) + {} + + function mint(address to, uint256 amount) public onlyOwner { + _mint(to, amount); + } +} \ No newline at end of file diff --git a/plume-oft-adapter-migration/contracts/L2/MintableERC20.sol b/plume-oft-adapter-migration/contracts/L2/MintableERC20.sol new file mode 100644 index 00000000..b61e1939 --- /dev/null +++ b/plume-oft-adapter-migration/contracts/L2/MintableERC20.sol @@ -0,0 +1,8 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.13; + +import { ERC20 } from "@openzeppelin/contracts/token/ERC20/ERC20.sol"; + +abstract contract MintableERC20 is ERC20 { + function mint(address to, uint256 amount) external virtual; +} \ No newline at end of file diff --git a/plume-oft-adapter-migration/contracts/L2/OrbitERC20OFTAdapter.sol b/plume-oft-adapter-migration/contracts/L2/OrbitERC20OFTAdapter.sol new file mode 100644 index 00000000..64cfd412 --- /dev/null +++ b/plume-oft-adapter-migration/contracts/L2/OrbitERC20OFTAdapter.sol @@ -0,0 +1,45 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.22; + +import { IERC20 } from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol"; +import { SafeERC20 } from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; +import { OFTAdapter } from "@layerzerolabs/lz-evm-oapp-v2/contracts/oft/OFTAdapter.sol"; + +import { IERC20Bridge } from "./bridge/IERC20Bridge.sol"; + +contract OrbitERC20OFTAdapter is OFTAdapter { + using SafeERC20 for IERC20; + + IERC20Bridge private immutable bridge; + + constructor( + address _token, + address _layerZeroEndpoint, + address _owner, + IERC20Bridge _bridge + ) OFTAdapter(_token, _layerZeroEndpoint, _owner) { + bridge = _bridge; + } + + function _debit( + uint256 _amountLD, + uint256 _minAmountLD, + uint32 _dstEid + ) internal virtual override returns (uint256 amountSentLD, uint256 amountReceivedLD) { + (amountSentLD, amountReceivedLD) = _debitView(_amountLD, _minAmountLD, _dstEid); + // @dev Lock tokens by moving them into the bridge from the caller. + innerToken.safeTransferFrom(msg.sender, address(bridge), amountSentLD); + } + + function _credit( + address _to, + uint256 _amountLD, + uint32 /*_srcEid*/ + ) internal virtual override returns (uint256 amountReceivedLD) { + // @dev Unlock the tokens and transfer to the recipient. + bridge.executeCall(_to, _amountLD, ""); + + // @dev In the case of NON-default OFTAdapter, the amountLD MIGHT not be == amountReceivedLD. + return _amountLD; + } +} \ No newline at end of file diff --git a/plume-oft-adapter-migration/contracts/L2/bridge/AbsBridge.sol b/plume-oft-adapter-migration/contracts/L2/bridge/AbsBridge.sol new file mode 100644 index 00000000..bafd56f9 --- /dev/null +++ b/plume-oft-adapter-migration/contracts/L2/bridge/AbsBridge.sol @@ -0,0 +1,308 @@ +// Copyright 2021-2022, Offchain Labs, Inc. +// For license information, see https://github.com/nitro/blob/master/LICENSE +// SPDX-License-Identifier: BUSL-1.1 + +pragma solidity ^0.8.4; + +import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; +import "@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol"; + +import { + NotContract, + NotRollupOrOwner, + NotDelayedInbox, + NotSequencerInbox, + NotOutbox, + InvalidOutboxSet, + BadSequencerMessageNumber +} from "../libraries/Error.sol"; +import "./IBridge.sol"; +import "./Messages.sol"; +import "../libraries/DelegateCallAware.sol"; + +import {L1MessageType_batchPostingReport} from "../libraries/MessageTypes.sol"; + +/** + * @title Staging ground for incoming and outgoing messages + * @notice Holds the inbox accumulator for sequenced and delayed messages. + * Since the escrow is held here, this contract also contains a list of allowed + * outboxes that can make calls from here and withdraw this escrow. + */ +abstract contract AbsBridge is Initializable, DelegateCallAware, IBridge { + using AddressUpgradeable for address; + + struct InOutInfo { + uint256 index; + bool allowed; + } + + mapping(address => InOutInfo) private allowedDelayedInboxesMap; + mapping(address => InOutInfo) private allowedOutboxesMap; + + address[] public allowedDelayedInboxList; + address[] public allowedOutboxList; + + address internal _activeOutbox; + + /// @inheritdoc IBridge + bytes32[] public delayedInboxAccs; + + /// @inheritdoc IBridge + bytes32[] public sequencerInboxAccs; + + IOwnable public rollup; + address public sequencerInbox; + + uint256 public override sequencerReportedSubMessageCount; + + address internal constant EMPTY_ACTIVEOUTBOX = address(type(uint160).max); + + modifier onlyRollupOrOwner() { + if (msg.sender != address(rollup)) { + address rollupOwner = rollup.owner(); + if (msg.sender != rollupOwner) { + revert NotRollupOrOwner(msg.sender, address(rollup), rollupOwner); + } + } + _; + } + + /// @notice Allows the rollup owner to set another rollup address + function updateRollupAddress(IOwnable _rollup) external onlyRollupOrOwner { + rollup = _rollup; + emit RollupUpdated(address(_rollup)); + } + + /// @dev returns the address of current active Outbox, or zero if no outbox is active + function activeOutbox() public view returns (address) { + address outbox = _activeOutbox; + // address zero is returned if no outbox is set, but the value used in storage + // is non-zero to save users some gas (as storage refunds are usually maxed out) + // EIP-1153 would help here. + // we don't return `EMPTY_ACTIVEOUTBOX` to avoid a breaking change on the current api + if (outbox == EMPTY_ACTIVEOUTBOX) return address(0); + return outbox; + } + + function allowedDelayedInboxes(address inbox) public view returns (bool) { + return allowedDelayedInboxesMap[inbox].allowed; + } + + function allowedOutboxes(address outbox) public view returns (bool) { + return allowedOutboxesMap[outbox].allowed; + } + + modifier onlySequencerInbox() { + if (msg.sender != sequencerInbox) revert NotSequencerInbox(msg.sender); + _; + } + + function enqueueSequencerMessage( + bytes32 dataHash, + uint256 afterDelayedMessagesRead, + uint256 prevMessageCount, + uint256 newMessageCount + ) + external + onlySequencerInbox + returns ( + uint256 seqMessageIndex, + bytes32 beforeAcc, + bytes32 delayedAcc, + bytes32 acc + ) + { + if ( + sequencerReportedSubMessageCount != prevMessageCount && + prevMessageCount != 0 && + sequencerReportedSubMessageCount != 0 + ) { + revert BadSequencerMessageNumber(sequencerReportedSubMessageCount, prevMessageCount); + } + sequencerReportedSubMessageCount = newMessageCount; + seqMessageIndex = sequencerInboxAccs.length; + if (sequencerInboxAccs.length > 0) { + beforeAcc = sequencerInboxAccs[sequencerInboxAccs.length - 1]; + } + if (afterDelayedMessagesRead > 0) { + delayedAcc = delayedInboxAccs[afterDelayedMessagesRead - 1]; + } + acc = keccak256(abi.encodePacked(beforeAcc, dataHash, delayedAcc)); + sequencerInboxAccs.push(acc); + } + + /// @inheritdoc IBridge + function submitBatchSpendingReport(address sender, bytes32 messageDataHash) + external + onlySequencerInbox + returns (uint256) + { + return + addMessageToDelayedAccumulator( + L1MessageType_batchPostingReport, + sender, + uint64(block.number), + uint64(block.timestamp), // solhint-disable-line not-rely-on-time, + block.basefee, + messageDataHash + ); + } + + function _enqueueDelayedMessage( + uint8 kind, + address sender, + bytes32 messageDataHash, + uint256 amount + ) internal returns (uint256) { + if (!allowedDelayedInboxes(msg.sender)) revert NotDelayedInbox(msg.sender); + + uint256 messageCount = addMessageToDelayedAccumulator( + kind, + sender, + uint64(block.number), + uint64(block.timestamp), // solhint-disable-line not-rely-on-time + _baseFeeToReport(), + messageDataHash + ); + + _transferFunds(amount); + + return messageCount; + } + + function addMessageToDelayedAccumulator( + uint8 kind, + address sender, + uint64 blockNumber, + uint64 blockTimestamp, + uint256 baseFeeL1, + bytes32 messageDataHash + ) internal returns (uint256) { + uint256 count = delayedInboxAccs.length; + bytes32 messageHash = Messages.messageHash( + kind, + sender, + blockNumber, + blockTimestamp, + count, + baseFeeL1, + messageDataHash + ); + bytes32 prevAcc = 0; + if (count > 0) { + prevAcc = delayedInboxAccs[count - 1]; + } + delayedInboxAccs.push(Messages.accumulateInboxMessage(prevAcc, messageHash)); + emit MessageDelivered( + count, + prevAcc, + msg.sender, + kind, + sender, + messageDataHash, + baseFeeL1, + blockTimestamp + ); + return count; + } + + /// @inheritdoc IBridge + function executeCall( + address to, + uint256 value, + bytes calldata data + ) external returns (bool success, bytes memory returnData) { + if (!allowedOutboxes(msg.sender)) revert NotOutbox(msg.sender); + if (data.length > 0 && !to.isContract()) revert NotContract(to); + address prevOutbox = _activeOutbox; + _activeOutbox = msg.sender; + // We set and reset active outbox around external call so activeOutbox remains valid during call + + // We use a low level call here since we want to bubble up whether it succeeded or failed to the caller + // rather than reverting on failure as well as allow contract and non-contract calls + (success, returnData) = _executeLowLevelCall(to, value, data); + + _activeOutbox = prevOutbox; + emit BridgeCallTriggered(msg.sender, to, value, data); + } + + function setSequencerInbox(address _sequencerInbox) external onlyRollupOrOwner { + sequencerInbox = _sequencerInbox; + emit SequencerInboxUpdated(_sequencerInbox); + } + + function setDelayedInbox(address inbox, bool enabled) external onlyRollupOrOwner { + InOutInfo storage info = allowedDelayedInboxesMap[inbox]; + bool alreadyEnabled = info.allowed; + emit InboxToggle(inbox, enabled); + if (alreadyEnabled == enabled) { + return; + } + if (enabled) { + allowedDelayedInboxesMap[inbox] = InOutInfo(allowedDelayedInboxList.length, true); + allowedDelayedInboxList.push(inbox); + } else { + allowedDelayedInboxList[info.index] = allowedDelayedInboxList[ + allowedDelayedInboxList.length - 1 + ]; + allowedDelayedInboxesMap[allowedDelayedInboxList[info.index]].index = info.index; + allowedDelayedInboxList.pop(); + delete allowedDelayedInboxesMap[inbox]; + } + } + + function setOutbox(address outbox, bool enabled) external onlyRollupOrOwner { + if (outbox == EMPTY_ACTIVEOUTBOX) revert InvalidOutboxSet(outbox); + + InOutInfo storage info = allowedOutboxesMap[outbox]; + bool alreadyEnabled = info.allowed; + emit OutboxToggle(outbox, enabled); + if (alreadyEnabled == enabled) { + return; + } + if (enabled) { + allowedOutboxesMap[outbox] = InOutInfo(allowedOutboxList.length, true); + allowedOutboxList.push(outbox); + } else { + allowedOutboxList[info.index] = allowedOutboxList[allowedOutboxList.length - 1]; + allowedOutboxesMap[allowedOutboxList[info.index]].index = info.index; + allowedOutboxList.pop(); + delete allowedOutboxesMap[outbox]; + } + } + + function setSequencerReportedSubMessageCount(uint256 newMsgCount) external onlyRollupOrOwner { + sequencerReportedSubMessageCount = newMsgCount; + } + + function delayedMessageCount() external view override returns (uint256) { + return delayedInboxAccs.length; + } + + function sequencerMessageCount() external view returns (uint256) { + return sequencerInboxAccs.length; + } + + /// @dev For the classic -> nitro migration. TODO: remove post-migration. + function acceptFundsFromOldBridge() external payable {} + + /// @dev transfer funds provided to pay for crosschain msg + function _transferFunds(uint256 amount) internal virtual; + + function _executeLowLevelCall( + address to, + uint256 value, + bytes memory data + ) internal virtual returns (bool success, bytes memory returnData); + + /// @dev get base fee which is emitted in `MessageDelivered` event and then picked up and + /// used in ArbOs to calculate the submission fee for retryable ticket + function _baseFeeToReport() internal view virtual returns (uint256); + + /** + * @dev This empty reserved space is put in place to allow future versions to add new + * variables without shifting down storage in the inheritance chain. + * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps + */ + uint256[40] private __gap; +} diff --git a/plume-oft-adapter-migration/contracts/L2/bridge/ERC20Bridge.sol b/plume-oft-adapter-migration/contracts/L2/bridge/ERC20Bridge.sol new file mode 100644 index 00000000..c67e1ba0 --- /dev/null +++ b/plume-oft-adapter-migration/contracts/L2/bridge/ERC20Bridge.sol @@ -0,0 +1,91 @@ +// Copyright 2021-2022, Offchain Labs, Inc. +// For license information, see https://github.com/nitro/blob/master/LICENSE +// SPDX-License-Identifier: BUSL-1.1 + +pragma solidity ^0.8.4; + +import "./AbsBridge.sol"; +import "./IERC20Bridge.sol"; +import "../libraries/AddressAliasHelper.sol"; +import {InvalidTokenSet, CallTargetNotAllowed, CallNotAllowed} from "../libraries/Error.sol"; +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; + +/** + * @title Staging ground for incoming and outgoing messages + * @notice Unlike the standard Eth bridge, native token bridge escrows the custom ERC20 token which is + * used as native currency on L2. + * @dev Fees are paid in this token. There are certain restrictions on the native token: + * - The token can't be rebasing or have a transfer fee + * - The token must only be transferrable via a call to the token address itself + * - The token must only be able to set allowance via a call to the token address itself + * - The token must not have a callback on transfer, and more generally a user must not be able to make a transfer to themselves revert + */ +contract ERC20Bridge is AbsBridge, IERC20Bridge { + using SafeERC20 for IERC20; + + /// @inheritdoc IERC20Bridge + address public nativeToken; + + /// @inheritdoc IERC20Bridge + function initialize(IOwnable rollup_, address nativeToken_) external initializer onlyDelegated { + if (nativeToken_ == address(0)) revert InvalidTokenSet(nativeToken_); + nativeToken = nativeToken_; + _activeOutbox = EMPTY_ACTIVEOUTBOX; + rollup = rollup_; + } + + /// @inheritdoc IERC20Bridge + function enqueueDelayedMessage( + uint8 kind, + address sender, + bytes32 messageDataHash, + uint256 tokenFeeAmount + ) external returns (uint256) { + return _enqueueDelayedMessage(kind, sender, messageDataHash, tokenFeeAmount); + } + + function _transferFunds(uint256 amount) internal override { + // fetch native token from Inbox + IERC20(nativeToken).safeTransferFrom(msg.sender, address(this), amount); + } + + function _executeLowLevelCall( + address to, + uint256 value, + bytes memory data + ) internal override returns (bool success, bytes memory returnData) { + address _nativeToken = nativeToken; + + // we don't allow outgoing calls to native token contract because it could + // result in loss of native tokens which are escrowed by ERC20Bridge + if (to == _nativeToken) { + revert CallTargetNotAllowed(_nativeToken); + } + + // first release native token + IERC20(_nativeToken).safeTransfer(to, value); + success = true; + + // if there's data do additional contract call. Make sure that call is not used to + // decrease bridge contract's balance of the native token + if (data.length > 0) { + uint256 bridgeBalanceBefore = IERC20(_nativeToken).balanceOf(address(this)); + + // solhint-disable-next-line avoid-low-level-calls + (success, returnData) = to.call(data); + + uint256 bridgeBalanceAfter = IERC20(_nativeToken).balanceOf(address(this)); + if (bridgeBalanceAfter < bridgeBalanceBefore) { + revert CallNotAllowed(); + } + } + } + + function _baseFeeToReport() internal pure override returns (uint256) { + // ArbOs uses formula 'l1BaseFee * (1400 + 6 * calldataLengthInBytes)' to calculate retryable ticket's + // submission fee. When custom ERC20 token is used to pay for fees, submission fee shall be 0. That's + // why baseFee is reported as 0 here. + return 0; + } +} diff --git a/plume-oft-adapter-migration/contracts/L2/bridge/IBridge.sol b/plume-oft-adapter-migration/contracts/L2/bridge/IBridge.sol new file mode 100644 index 00000000..1137fcd3 --- /dev/null +++ b/plume-oft-adapter-migration/contracts/L2/bridge/IBridge.sol @@ -0,0 +1,126 @@ +// Copyright 2021-2022, Offchain Labs, Inc. +// For license information, see https://github.com/OffchainLabs/nitro-contracts/blob/main/LICENSE +// SPDX-License-Identifier: BUSL-1.1 + +// solhint-disable-next-line compiler-version +pragma solidity >=0.6.9 <0.9.0; + +import "./IOwnable.sol"; + +interface IBridge { + /// @dev This is an instruction to offchain readers to inform them where to look + /// for sequencer inbox batch data. This is not the type of data (eg. das, brotli encoded, or blob versioned hash) + /// and this enum is not used in the state transition function, rather it informs an offchain + /// reader where to find the data so that they can supply it to the replay binary + enum BatchDataLocation { + /// @notice The data can be found in the transaction call data + TxInput, + /// @notice The data can be found in an event emitted during the transaction + SeparateBatchEvent, + /// @notice This batch contains no data + NoData, + /// @notice The data can be found in the 4844 data blobs on this transaction + Blob + } + + struct TimeBounds { + uint64 minTimestamp; + uint64 maxTimestamp; + uint64 minBlockNumber; + uint64 maxBlockNumber; + } + + event MessageDelivered( + uint256 indexed messageIndex, + bytes32 indexed beforeInboxAcc, + address inbox, + uint8 kind, + address sender, + bytes32 messageDataHash, + uint256 baseFeeL1, + uint64 timestamp + ); + + event BridgeCallTriggered( + address indexed outbox, + address indexed to, + uint256 value, + bytes data + ); + + event InboxToggle(address indexed inbox, bool enabled); + + event OutboxToggle(address indexed outbox, bool enabled); + + event SequencerInboxUpdated(address newSequencerInbox); + + event RollupUpdated(address rollup); + + function allowedDelayedInboxList(uint256) external returns (address); + + function allowedOutboxList(uint256) external returns (address); + + /// @dev Accumulator for delayed inbox messages; tail represents hash of the current state; each element represents the inclusion of a new message. + function delayedInboxAccs(uint256) external view returns (bytes32); + + /// @dev Accumulator for sequencer inbox messages; tail represents hash of the current state; each element represents the inclusion of a new message. + function sequencerInboxAccs(uint256) external view returns (bytes32); + + function rollup() external view returns (IOwnable); + + function sequencerInbox() external view returns (address); + + function activeOutbox() external view returns (address); + + function allowedDelayedInboxes(address inbox) external view returns (bool); + + function allowedOutboxes(address outbox) external view returns (bool); + + function sequencerReportedSubMessageCount() external view returns (uint256); + + function executeCall( + address to, + uint256 value, + bytes calldata data + ) external returns (bool success, bytes memory returnData); + + function delayedMessageCount() external view returns (uint256); + + function sequencerMessageCount() external view returns (uint256); + + // ---------- onlySequencerInbox functions ---------- + + function enqueueSequencerMessage( + bytes32 dataHash, + uint256 afterDelayedMessagesRead, + uint256 prevMessageCount, + uint256 newMessageCount + ) + external + returns ( + uint256 seqMessageIndex, + bytes32 beforeAcc, + bytes32 delayedAcc, + bytes32 acc + ); + + /** + * @dev Allows the sequencer inbox to submit a delayed message of the batchPostingReport type + * This is done through a separate function entrypoint instead of allowing the sequencer inbox + * to call `enqueueDelayedMessage` to avoid the gas overhead of an extra SLOAD in either + * every delayed inbox or every sequencer inbox call. + */ + function submitBatchSpendingReport(address batchPoster, bytes32 dataHash) + external + returns (uint256 msgNum); + + // ---------- onlyRollupOrOwner functions ---------- + + function setSequencerInbox(address _sequencerInbox) external; + + function setDelayedInbox(address inbox, bool enabled) external; + + function setOutbox(address inbox, bool enabled) external; + + function updateRollupAddress(IOwnable _rollup) external; +} diff --git a/plume-oft-adapter-migration/contracts/L2/bridge/IDelayedMessageProvider.sol b/plume-oft-adapter-migration/contracts/L2/bridge/IDelayedMessageProvider.sol new file mode 100644 index 00000000..a03601aa --- /dev/null +++ b/plume-oft-adapter-migration/contracts/L2/bridge/IDelayedMessageProvider.sol @@ -0,0 +1,15 @@ +// Copyright 2021-2022, Offchain Labs, Inc. +// For license information, see https://github.com/OffchainLabs/nitro-contracts/blob/main/LICENSE +// SPDX-License-Identifier: BUSL-1.1 + +// solhint-disable-next-line compiler-version +pragma solidity >=0.6.9 <0.9.0; + +interface IDelayedMessageProvider { + /// @dev event emitted when a inbox message is added to the Bridge's delayed accumulator + event InboxMessageDelivered(uint256 indexed messageNum, bytes data); + + /// @dev event emitted when a inbox message is added to the Bridge's delayed accumulator + /// same as InboxMessageDelivered but the batch data is available in tx.input + event InboxMessageDeliveredFromOrigin(uint256 indexed messageNum); +} diff --git a/plume-oft-adapter-migration/contracts/L2/bridge/IERC20Bridge.sol b/plume-oft-adapter-migration/contracts/L2/bridge/IERC20Bridge.sol new file mode 100644 index 00000000..b2b4551d --- /dev/null +++ b/plume-oft-adapter-migration/contracts/L2/bridge/IERC20Bridge.sol @@ -0,0 +1,37 @@ +// Copyright 2021-2022, Offchain Labs, Inc. +// For license information, see https://github.com/nitro/blob/master/LICENSE +// SPDX-License-Identifier: BUSL-1.1 + +// solhint-disable-next-line compiler-version +pragma solidity >=0.6.9 <0.9.0; + +import "./IOwnable.sol"; +import "./IBridge.sol"; + +interface IERC20Bridge is IBridge { + /** + * @dev token that is escrowed in bridge on L1 side and minted on L2 as native currency. + * Fees are paid in this token. There are certain restrictions on the native token: + * - The token can't be rebasing or have a transfer fee + * - The token must only be transferrable via a call to the token address itself + * - The token must only be able to set allowance via a call to the token address itself + * - The token must not have a callback on transfer, and more generally a user must not be able to make a transfer to themselves revert + */ + function nativeToken() external view returns (address); + + /** + * @dev Enqueue a message in the delayed inbox accumulator. + * These messages are later sequenced in the SequencerInbox, either + * by the sequencer as part of a normal batch, or by force inclusion. + */ + function enqueueDelayedMessage( + uint8 kind, + address sender, + bytes32 messageDataHash, + uint256 tokenFeeAmount + ) external returns (uint256); + + // ---------- initializer ---------- + + function initialize(IOwnable rollup_, address nativeToken_) external; +} diff --git a/plume-oft-adapter-migration/contracts/L2/bridge/IEthBridge.sol b/plume-oft-adapter-migration/contracts/L2/bridge/IEthBridge.sol new file mode 100644 index 00000000..aa52d75c --- /dev/null +++ b/plume-oft-adapter-migration/contracts/L2/bridge/IEthBridge.sol @@ -0,0 +1,26 @@ +// Copyright 2021-2022, Offchain Labs, Inc. +// For license information, see https://github.com/nitro/blob/master/LICENSE +// SPDX-License-Identifier: BUSL-1.1 + +// solhint-disable-next-line compiler-version +pragma solidity >=0.6.9 <0.9.0; + +import "./IOwnable.sol"; +import "./IBridge.sol"; + +interface IEthBridge is IBridge { + /** + * @dev Enqueue a message in the delayed inbox accumulator. + * These messages are later sequenced in the SequencerInbox, either + * by the sequencer as part of a normal batch, or by force inclusion. + */ + function enqueueDelayedMessage( + uint8 kind, + address sender, + bytes32 messageDataHash + ) external payable returns (uint256); + + // ---------- initializer ---------- + + function initialize(IOwnable rollup_) external; +} diff --git a/plume-oft-adapter-migration/contracts/L2/bridge/IInbox.sol b/plume-oft-adapter-migration/contracts/L2/bridge/IInbox.sol new file mode 100644 index 00000000..2c7672d7 --- /dev/null +++ b/plume-oft-adapter-migration/contracts/L2/bridge/IInbox.sol @@ -0,0 +1,133 @@ +// Copyright 2021-2022, Offchain Labs, Inc. +// For license information, see https://github.com/nitro/blob/master/LICENSE +// SPDX-License-Identifier: BUSL-1.1 + +// solhint-disable-next-line compiler-version +pragma solidity >=0.6.9 <0.9.0; + +import "./IBridge.sol"; +import "./IInboxBase.sol"; + +interface IInbox is IInboxBase { + function sendL1FundedUnsignedTransaction( + uint256 gasLimit, + uint256 maxFeePerGas, + uint256 nonce, + address to, + bytes calldata data + ) external payable returns (uint256); + + function sendL1FundedContractTransaction( + uint256 gasLimit, + uint256 maxFeePerGas, + address to, + bytes calldata data + ) external payable returns (uint256); + + /** + * @dev This method can only be called upon L1 fork and will not alias the caller + * This method will revert if not called from origin + */ + function sendL1FundedUnsignedTransactionToFork( + uint256 gasLimit, + uint256 maxFeePerGas, + uint256 nonce, + address to, + bytes calldata data + ) external payable returns (uint256); + + /** + * @dev This method can only be called upon L1 fork and will not alias the caller + * This method will revert if not called from origin + */ + function sendUnsignedTransactionToFork( + uint256 gasLimit, + uint256 maxFeePerGas, + uint256 nonce, + address to, + uint256 value, + bytes calldata data + ) external returns (uint256); + + /** + * @notice Send a message to initiate L2 withdrawal + * @dev This method can only be called upon L1 fork and will not alias the caller + * This method will revert if not called from origin + */ + function sendWithdrawEthToFork( + uint256 gasLimit, + uint256 maxFeePerGas, + uint256 nonce, + uint256 value, + address withdrawTo + ) external returns (uint256); + + /** + * @notice Deposit eth from L1 to L2 to address of the sender if sender is an EOA, and to its aliased address if the sender is a contract + * @dev This does not trigger the fallback function when receiving in the L2 side. + * Look into retryable tickets if you are interested in this functionality. + * @dev This function should not be called inside contract constructors + */ + function depositEth() external payable returns (uint256); + + /** + * @notice Put a message in the L2 inbox that can be reexecuted for some fixed amount of time if it reverts + * @dev all msg.value will deposited to callValueRefundAddress on L2 + * @dev Gas limit and maxFeePerGas should not be set to 1 as that is used to trigger the RetryableData error + * @param to destination L2 contract address + * @param l2CallValue call value for retryable L2 message + * @param maxSubmissionCost Max gas deducted from user's L2 balance to cover base submission fee + * @param excessFeeRefundAddress gasLimit x maxFeePerGas - execution cost gets credited here on L2 balance + * @param callValueRefundAddress l2Callvalue gets credited here on L2 if retryable txn times out or gets cancelled + * @param gasLimit Max gas deducted from user's L2 balance to cover L2 execution. Should not be set to 1 (magic value used to trigger the RetryableData error) + * @param maxFeePerGas price bid for L2 execution. Should not be set to 1 (magic value used to trigger the RetryableData error) + * @param data ABI encoded data of L2 message + * @return unique message number of the retryable transaction + */ + function createRetryableTicket( + address to, + uint256 l2CallValue, + uint256 maxSubmissionCost, + address excessFeeRefundAddress, + address callValueRefundAddress, + uint256 gasLimit, + uint256 maxFeePerGas, + bytes calldata data + ) external payable returns (uint256); + + /** + * @notice Put a message in the L2 inbox that can be reexecuted for some fixed amount of time if it reverts + * @dev Same as createRetryableTicket, but does not guarantee that submission will succeed by requiring the needed funds + * come from the deposit alone, rather than falling back on the user's L2 balance + * @dev Advanced usage only (does not rewrite aliases for excessFeeRefundAddress and callValueRefundAddress). + * createRetryableTicket method is the recommended standard. + * @dev Gas limit and maxFeePerGas should not be set to 1 as that is used to trigger the RetryableData error + * @param to destination L2 contract address + * @param l2CallValue call value for retryable L2 message + * @param maxSubmissionCost Max gas deducted from user's L2 balance to cover base submission fee + * @param excessFeeRefundAddress gasLimit x maxFeePerGas - execution cost gets credited here on L2 balance + * @param callValueRefundAddress l2Callvalue gets credited here on L2 if retryable txn times out or gets cancelled + * @param gasLimit Max gas deducted from user's L2 balance to cover L2 execution. Should not be set to 1 (magic value used to trigger the RetryableData error) + * @param maxFeePerGas price bid for L2 execution. Should not be set to 1 (magic value used to trigger the RetryableData error) + * @param data ABI encoded data of L2 message + * @return unique message number of the retryable transaction + */ + function unsafeCreateRetryableTicket( + address to, + uint256 l2CallValue, + uint256 maxSubmissionCost, + address excessFeeRefundAddress, + address callValueRefundAddress, + uint256 gasLimit, + uint256 maxFeePerGas, + bytes calldata data + ) external payable returns (uint256); + + // ---------- initializer ---------- + + /** + * @dev function to be called one time during the inbox upgrade process + * this is used to fix the storage slots + */ + function postUpgradeInit(IBridge _bridge) external; +} diff --git a/plume-oft-adapter-migration/contracts/L2/bridge/IInboxBase.sol b/plume-oft-adapter-migration/contracts/L2/bridge/IInboxBase.sol new file mode 100644 index 00000000..c9775a36 --- /dev/null +++ b/plume-oft-adapter-migration/contracts/L2/bridge/IInboxBase.sol @@ -0,0 +1,86 @@ +// Copyright 2021-2022, Offchain Labs, Inc. +// For license information, see https://github.com/OffchainLabs/nitro-contracts/blob/main/LICENSE +// SPDX-License-Identifier: BUSL-1.1 + +// solhint-disable-next-line compiler-version +pragma solidity >=0.6.9 <0.9.0; + +import "./IBridge.sol"; +import "./IDelayedMessageProvider.sol"; +import "./ISequencerInbox.sol"; + +interface IInboxBase is IDelayedMessageProvider { + function bridge() external view returns (IBridge); + + function sequencerInbox() external view returns (ISequencerInbox); + + function maxDataSize() external view returns (uint256); + + /** + * @notice Send a generic L2 message to the chain + * @dev This method is an optimization to avoid having to emit the entirety of the messageData in a log. Instead validators are expected to be able to parse the data from the transaction's input + * @param messageData Data of the message being sent + */ + function sendL2MessageFromOrigin(bytes calldata messageData) external returns (uint256); + + /** + * @notice Send a generic L2 message to the chain + * @dev This method can be used to send any type of message that doesn't require L1 validation + * @param messageData Data of the message being sent + */ + function sendL2Message(bytes calldata messageData) external returns (uint256); + + function sendUnsignedTransaction( + uint256 gasLimit, + uint256 maxFeePerGas, + uint256 nonce, + address to, + uint256 value, + bytes calldata data + ) external returns (uint256); + + function sendContractTransaction( + uint256 gasLimit, + uint256 maxFeePerGas, + address to, + uint256 value, + bytes calldata data + ) external returns (uint256); + + /** + * @notice Get the L1 fee for submitting a retryable + * @dev This fee can be paid by funds already in the L2 aliased address or by the current message value + * @dev This formula may change in the future, to future proof your code query this method instead of inlining!! + * @param dataLength The length of the retryable's calldata, in bytes + * @param baseFee The block basefee when the retryable is included in the chain, if 0 current block.basefee will be used + */ + function calculateRetryableSubmissionFee(uint256 dataLength, uint256 baseFee) + external + view + returns (uint256); + + // ---------- onlyRollupOrOwner functions ---------- + + /// @notice pauses all inbox functionality + function pause() external; + + /// @notice unpauses all inbox functionality + function unpause() external; + + /// @notice add or remove users from allowList + function setAllowList(address[] memory user, bool[] memory val) external; + + /// @notice enable or disable allowList + function setAllowListEnabled(bool _allowListEnabled) external; + + /// @notice check if user is in allowList + function isAllowed(address user) external view returns (bool); + + /// @notice check if allowList is enabled + function allowListEnabled() external view returns (bool); + + function initialize(IBridge _bridge, ISequencerInbox _sequencerInbox) external; + + /// @notice returns the current admin + function getProxyAdmin() external view returns (address); +} diff --git a/plume-oft-adapter-migration/contracts/L2/bridge/IOwnable.sol b/plume-oft-adapter-migration/contracts/L2/bridge/IOwnable.sol new file mode 100644 index 00000000..10bfc5e9 --- /dev/null +++ b/plume-oft-adapter-migration/contracts/L2/bridge/IOwnable.sol @@ -0,0 +1,10 @@ +// Copyright 2021-2022, Offchain Labs, Inc. +// For license information, see https://github.com/OffchainLabs/nitro-contracts/blob/main/LICENSE +// SPDX-License-Identifier: BUSL-1.1 + +// solhint-disable-next-line compiler-version +pragma solidity >=0.4.21 <0.9.0; + +interface IOwnable { + function owner() external view returns (address); +} diff --git a/plume-oft-adapter-migration/contracts/L2/bridge/ISequencerInbox.sol b/plume-oft-adapter-migration/contracts/L2/bridge/ISequencerInbox.sol new file mode 100644 index 00000000..47db30f0 --- /dev/null +++ b/plume-oft-adapter-migration/contracts/L2/bridge/ISequencerInbox.sol @@ -0,0 +1,229 @@ +// Copyright 2021-2022, Offchain Labs, Inc. +// For license information, see https://github.com/OffchainLabs/nitro-contracts/blob/main/LICENSE +// SPDX-License-Identifier: BUSL-1.1 + +// solhint-disable-next-line compiler-version +pragma solidity >=0.6.9 <0.9.0; +pragma experimental ABIEncoderV2; + +import "../libraries/IGasRefunder.sol"; +import "./IDelayedMessageProvider.sol"; +import "./IBridge.sol"; + +interface ISequencerInbox is IDelayedMessageProvider { + struct MaxTimeVariation { + uint256 delayBlocks; + uint256 futureBlocks; + uint256 delaySeconds; + uint256 futureSeconds; + } + + event SequencerBatchDelivered( + uint256 indexed batchSequenceNumber, + bytes32 indexed beforeAcc, + bytes32 indexed afterAcc, + bytes32 delayedAcc, + uint256 afterDelayedMessagesRead, + IBridge.TimeBounds timeBounds, + IBridge.BatchDataLocation dataLocation + ); + + event OwnerFunctionCalled(uint256 indexed id); + + /// @dev a separate event that emits batch data when this isn't easily accessible in the tx.input + event SequencerBatchData(uint256 indexed batchSequenceNumber, bytes data); + + /// @dev a valid keyset was added + event SetValidKeyset(bytes32 indexed keysetHash, bytes keysetBytes); + + /// @dev a keyset was invalidated + event InvalidateKeyset(bytes32 indexed keysetHash); + + function totalDelayedMessagesRead() external view returns (uint256); + + function bridge() external view returns (IBridge); + + /// @dev The size of the batch header + // solhint-disable-next-line func-name-mixedcase + function HEADER_LENGTH() external view returns (uint256); + + /// @dev If the first batch data byte after the header has this bit set, + /// the sequencer inbox has authenticated the data. Currently only used for 4844 blob support. + /// See: https://github.com/OffchainLabs/nitro/blob/69de0603abf6f900a4128cab7933df60cad54ded/arbstate/das_reader.go + // solhint-disable-next-line func-name-mixedcase + function DATA_AUTHENTICATED_FLAG() external view returns (bytes1); + + /// @dev If the first data byte after the header has this bit set, + /// then the batch data is to be found in 4844 data blobs + /// See: https://github.com/OffchainLabs/nitro/blob/69de0603abf6f900a4128cab7933df60cad54ded/arbstate/das_reader.go + // solhint-disable-next-line func-name-mixedcase + function DATA_BLOB_HEADER_FLAG() external view returns (bytes1); + + /// @dev If the first data byte after the header has this bit set, + /// then the batch data is a das message + /// See: https://github.com/OffchainLabs/nitro/blob/69de0603abf6f900a4128cab7933df60cad54ded/arbstate/das_reader.go + // solhint-disable-next-line func-name-mixedcase + function DAS_MESSAGE_HEADER_FLAG() external view returns (bytes1); + + /// @dev If the first data byte after the header has this bit set, + /// then the batch data is a das message that employs a merklesization strategy + /// See: https://github.com/OffchainLabs/nitro/blob/69de0603abf6f900a4128cab7933df60cad54ded/arbstate/das_reader.go + // solhint-disable-next-line func-name-mixedcase + function TREE_DAS_MESSAGE_HEADER_FLAG() external view returns (bytes1); + + /// @dev If the first data byte after the header has this bit set, + /// then the batch data has been brotli compressed + /// See: https://github.com/OffchainLabs/nitro/blob/69de0603abf6f900a4128cab7933df60cad54ded/arbstate/das_reader.go + // solhint-disable-next-line func-name-mixedcase + function BROTLI_MESSAGE_HEADER_FLAG() external view returns (bytes1); + + /// @dev If the first data byte after the header has this bit set, + /// then the batch data uses a zero heavy encoding + /// See: https://github.com/OffchainLabs/nitro/blob/69de0603abf6f900a4128cab7933df60cad54ded/arbstate/das_reader.go + // solhint-disable-next-line func-name-mixedcase + function ZERO_HEAVY_MESSAGE_HEADER_FLAG() external view returns (bytes1); + + function rollup() external view returns (IOwnable); + + function isBatchPoster(address) external view returns (bool); + + function isSequencer(address) external view returns (bool); + + function maxDataSize() external view returns (uint256); + + /// @notice The batch poster manager has the ability to change the batch poster addresses + /// This enables the batch poster to do key rotation + function batchPosterManager() external view returns (address); + + struct DasKeySetInfo { + bool isValidKeyset; + uint64 creationBlock; + } + + /// @dev returns 4 uint256 to be compatible with older version + function maxTimeVariation() + external + view + returns ( + uint256 delayBlocks, + uint256 futureBlocks, + uint256 delaySeconds, + uint256 futureSeconds + ); + + function dasKeySetInfo(bytes32) external view returns (bool, uint64); + + /// @notice Remove force inclusion delay after a L1 chainId fork + function removeDelayAfterFork() external; + + /// @notice Force messages from the delayed inbox to be included in the chain + /// Callable by any address, but message can only be force-included after maxTimeVariation.delayBlocks and + /// maxTimeVariation.delaySeconds has elapsed. As part of normal behaviour the sequencer will include these + /// messages so it's only necessary to call this if the sequencer is down, or not including any delayed messages. + /// @param _totalDelayedMessagesRead The total number of messages to read up to + /// @param kind The kind of the last message to be included + /// @param l1BlockAndTime The l1 block and the l1 timestamp of the last message to be included + /// @param baseFeeL1 The l1 gas price of the last message to be included + /// @param sender The sender of the last message to be included + /// @param messageDataHash The messageDataHash of the last message to be included + function forceInclusion( + uint256 _totalDelayedMessagesRead, + uint8 kind, + uint64[2] calldata l1BlockAndTime, + uint256 baseFeeL1, + address sender, + bytes32 messageDataHash + ) external; + + function inboxAccs(uint256 index) external view returns (bytes32); + + function batchCount() external view returns (uint256); + + function isValidKeysetHash(bytes32 ksHash) external view returns (bool); + + /// @notice the creation block is intended to still be available after a keyset is deleted + function getKeysetCreationBlock(bytes32 ksHash) external view returns (uint256); + + // ---------- BatchPoster functions ---------- + + function addSequencerL2BatchFromOrigin( + uint256 sequenceNumber, + bytes calldata data, + uint256 afterDelayedMessagesRead, + IGasRefunder gasRefunder + ) external; + + function addSequencerL2BatchFromOrigin( + uint256 sequenceNumber, + bytes calldata data, + uint256 afterDelayedMessagesRead, + IGasRefunder gasRefunder, + uint256 prevMessageCount, + uint256 newMessageCount + ) external; + + function addSequencerL2Batch( + uint256 sequenceNumber, + bytes calldata data, + uint256 afterDelayedMessagesRead, + IGasRefunder gasRefunder, + uint256 prevMessageCount, + uint256 newMessageCount + ) external; + + function addSequencerL2BatchFromBlobs( + uint256 sequenceNumber, + uint256 afterDelayedMessagesRead, + IGasRefunder gasRefunder, + uint256 prevMessageCount, + uint256 newMessageCount + ) external; + + // ---------- onlyRollupOrOwner functions ---------- + + /** + * @notice Set max delay for sequencer inbox + * @param maxTimeVariation_ the maximum time variation parameters + */ + function setMaxTimeVariation(MaxTimeVariation memory maxTimeVariation_) external; + + /** + * @notice Updates whether an address is authorized to be a batch poster at the sequencer inbox + * @param addr the address + * @param isBatchPoster_ if the specified address should be authorized as a batch poster + */ + function setIsBatchPoster(address addr, bool isBatchPoster_) external; + + /** + * @notice Makes Data Availability Service keyset valid + * @param keysetBytes bytes of the serialized keyset + */ + function setValidKeyset(bytes calldata keysetBytes) external; + + /** + * @notice Invalidates a Data Availability Service keyset + * @param ksHash hash of the keyset + */ + function invalidateKeysetHash(bytes32 ksHash) external; + + /** + * @notice Updates whether an address is authorized to be a sequencer. + * @dev The IsSequencer information is used only off-chain by the nitro node to validate sequencer feed signer. + * @param addr the address + * @param isSequencer_ if the specified address should be authorized as a sequencer + */ + function setIsSequencer(address addr, bool isSequencer_) external; + + /** + * @notice Updates the batch poster manager, the address which has the ability to rotate batch poster keys + * @param newBatchPosterManager The new batch poster manager to be set + */ + function setBatchPosterManager(address newBatchPosterManager) external; + + /// @notice Allows the rollup owner to sync the rollup address + function updateRollupAddress() external; + + // ---------- initializer ---------- + + function initialize(IBridge bridge_, MaxTimeVariation calldata maxTimeVariation_) external; +} diff --git a/plume-oft-adapter-migration/contracts/L2/bridge/Messages.sol b/plume-oft-adapter-migration/contracts/L2/bridge/Messages.sol new file mode 100644 index 00000000..07731c51 --- /dev/null +++ b/plume-oft-adapter-migration/contracts/L2/bridge/Messages.sol @@ -0,0 +1,38 @@ +// Copyright 2021-2022, Offchain Labs, Inc. +// For license information, see https://github.com/OffchainLabs/nitro-contracts/blob/main/LICENSE +// SPDX-License-Identifier: BUSL-1.1 + +pragma solidity ^0.8.0; + +library Messages { + function messageHash( + uint8 kind, + address sender, + uint64 blockNumber, + uint64 timestamp, + uint256 inboxSeqNum, + uint256 baseFeeL1, + bytes32 messageDataHash + ) internal pure returns (bytes32) { + return + keccak256( + abi.encodePacked( + kind, + sender, + blockNumber, + timestamp, + inboxSeqNum, + baseFeeL1, + messageDataHash + ) + ); + } + + function accumulateInboxMessage(bytes32 prevAcc, bytes32 message) + internal + pure + returns (bytes32) + { + return keccak256(abi.encodePacked(prevAcc, message)); + } +} diff --git a/plume-oft-adapter-migration/contracts/L2/libraries/AddressAliasHelper.sol b/plume-oft-adapter-migration/contracts/L2/libraries/AddressAliasHelper.sol new file mode 100644 index 00000000..9320fe3e --- /dev/null +++ b/plume-oft-adapter-migration/contracts/L2/libraries/AddressAliasHelper.sol @@ -0,0 +1,29 @@ +// Copyright 2021-2022, Offchain Labs, Inc. +// For license information, see https://github.com/OffchainLabs/nitro-contracts/blob/main/LICENSE +// SPDX-License-Identifier: BUSL-1.1 + +pragma solidity ^0.8.0; + +library AddressAliasHelper { + uint160 internal constant OFFSET = uint160(0x1111000000000000000000000000000000001111); + + /// @notice Utility function that converts the address in the L1 that submitted a tx to + /// the inbox to the msg.sender viewed in the L2 + /// @param l1Address the address in the L1 that triggered the tx to L2 + /// @return l2Address L2 address as viewed in msg.sender + function applyL1ToL2Alias(address l1Address) internal pure returns (address l2Address) { + unchecked { + l2Address = address(uint160(l1Address) + OFFSET); + } + } + + /// @notice Utility function that converts the msg.sender viewed in the L2 to the + /// address in the L1 that submitted a tx to the inbox + /// @param l2Address L2 address as viewed in msg.sender + /// @return l1Address the address in the L1 that triggered the tx to L2 + function undoL1ToL2Alias(address l2Address) internal pure returns (address l1Address) { + unchecked { + l1Address = address(uint160(l2Address) - OFFSET); + } + } +} diff --git a/plume-oft-adapter-migration/contracts/L2/libraries/DelegateCallAware.sol b/plume-oft-adapter-migration/contracts/L2/libraries/DelegateCallAware.sol new file mode 100644 index 00000000..c5168aa1 --- /dev/null +++ b/plume-oft-adapter-migration/contracts/L2/libraries/DelegateCallAware.sol @@ -0,0 +1,44 @@ +// Copyright 2021-2022, Offchain Labs, Inc. +// For license information, see https://github.com/OffchainLabs/nitro-contracts/blob/main/LICENSE +// SPDX-License-Identifier: BUSL-1.1 + +pragma solidity ^0.8.0; + +import {NotOwner} from "./Error.sol"; + +/// @dev A stateless contract that allows you to infer if the current call has been delegated or not +/// Pattern used here is from UUPS implementation by the OpenZeppelin team +abstract contract DelegateCallAware { + address private immutable __self = address(this); + + /** + * @dev Check that the execution is being performed through a delegate call. This allows a function to be + * callable on the proxy contract but not on the logic contract. + */ + modifier onlyDelegated() { + require(address(this) != __self, "Function must be called through delegatecall"); + _; + } + + /** + * @dev Check that the execution is not being performed through a delegate call. This allows a function to be + * callable on the implementing contract but not through proxies. + */ + modifier notDelegated() { + require(address(this) == __self, "Function must not be called through delegatecall"); + _; + } + + /// @dev Check that msg.sender is the current EIP 1967 proxy admin + modifier onlyProxyOwner() { + // Storage slot with the admin of the proxy contract + // This is the keccak-256 hash of "eip1967.proxy.admin" subtracted by 1 + bytes32 slot = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103; + address admin; + assembly { + admin := sload(slot) + } + if (msg.sender != admin) revert NotOwner(msg.sender, admin); + _; + } +} diff --git a/plume-oft-adapter-migration/contracts/L2/libraries/Error.sol b/plume-oft-adapter-migration/contracts/L2/libraries/Error.sol new file mode 100644 index 00000000..0d5a2a8d --- /dev/null +++ b/plume-oft-adapter-migration/contracts/L2/libraries/Error.sol @@ -0,0 +1,201 @@ +// Copyright 2021-2022, Offchain Labs, Inc. +// For license information, see https://github.com/OffchainLabs/nitro-contracts/blob/main/LICENSE +// SPDX-License-Identifier: BUSL-1.1 + +pragma solidity ^0.8.4; + +/// @dev Init was already called +error AlreadyInit(); + +/// @dev Init was called with param set to zero that must be nonzero +error HadZeroInit(); + +/// @dev Thrown when post upgrade init validation fails +error BadPostUpgradeInit(); + +/// @dev Thrown when non owner tries to access an only-owner function +/// @param sender The msg.sender who is not the owner +/// @param owner The owner address +error NotOwner(address sender, address owner); + +/// @dev Thrown when an address that is not the rollup tries to call an only-rollup function +/// @param sender The sender who is not the rollup +/// @param rollup The rollup address authorized to call this function +error NotRollup(address sender, address rollup); + +/// @dev Thrown when the contract was not called directly from the origin ie msg.sender != tx.origin +error NotOrigin(); + +/// @dev Provided data was too large +/// @param dataLength The length of the data that is too large +/// @param maxDataLength The max length the data can be +error DataTooLarge(uint256 dataLength, uint256 maxDataLength); + +/// @dev The provided is not a contract and was expected to be +/// @param addr The adddress in question +error NotContract(address addr); + +/// @dev The merkle proof provided was too long +/// @param actualLength The length of the merkle proof provided +/// @param maxProofLength The max length a merkle proof can have +error MerkleProofTooLong(uint256 actualLength, uint256 maxProofLength); + +/// @dev Thrown when an un-authorized address tries to access an admin function +/// @param sender The un-authorized sender +/// @param rollup The rollup, which would be authorized +/// @param owner The rollup's owner, which would be authorized +error NotRollupOrOwner(address sender, address rollup, address owner); + +// Bridge Errors + +/// @dev Thrown when an un-authorized address tries to access an only-inbox function +/// @param sender The un-authorized sender +error NotDelayedInbox(address sender); + +/// @dev Thrown when an un-authorized address tries to access an only-sequencer-inbox function +/// @param sender The un-authorized sender +error NotSequencerInbox(address sender); + +/// @dev Thrown when an un-authorized address tries to access an only-outbox function +/// @param sender The un-authorized sender +error NotOutbox(address sender); + +/// @dev the provided outbox address isn't valid +/// @param outbox address of outbox being set +error InvalidOutboxSet(address outbox); + +/// @dev The provided token address isn't valid +/// @param token address of token being set +error InvalidTokenSet(address token); + +/// @dev Call to this specific address is not allowed +/// @param target address of the call receiver +error CallTargetNotAllowed(address target); + +/// @dev Call that changes the balance of ERC20Bridge is not allowed +error CallNotAllowed(); + +// Inbox Errors + +/// @dev The contract is paused, so cannot be paused +error AlreadyPaused(); + +/// @dev The contract is unpaused, so cannot be unpaused +error AlreadyUnpaused(); + +/// @dev The contract is paused +error Paused(); + +/// @dev msg.value sent to the inbox isn't high enough +error InsufficientValue(uint256 expected, uint256 actual); + +/// @dev submission cost provided isn't enough to create retryable ticket +error InsufficientSubmissionCost(uint256 expected, uint256 actual); + +/// @dev address not allowed to interact with the given contract +error NotAllowedOrigin(address origin); + +/// @dev used to convey retryable tx data in eth calls without requiring a tx trace +/// this follows a pattern similar to EIP-3668 where reverts surface call information +error RetryableData( + address from, + address to, + uint256 l2CallValue, + uint256 deposit, + uint256 maxSubmissionCost, + address excessFeeRefundAddress, + address callValueRefundAddress, + uint256 gasLimit, + uint256 maxFeePerGas, + bytes data +); + +/// @dev Thrown when a L1 chainId fork is detected +error L1Forked(); + +/// @dev Thrown when a L1 chainId fork is not detected +error NotForked(); + +/// @dev The provided gasLimit is larger than uint64 +error GasLimitTooLarge(); + +// Outbox Errors + +/// @dev The provided proof was too long +/// @param proofLength The length of the too-long proof +error ProofTooLong(uint256 proofLength); + +/// @dev The output index was greater than the maximum +/// @param index The output index +/// @param maxIndex The max the index could be +error PathNotMinimal(uint256 index, uint256 maxIndex); + +/// @dev The calculated root does not exist +/// @param root The calculated root +error UnknownRoot(bytes32 root); + +/// @dev The record has already been spent +/// @param index The index of the spent record +error AlreadySpent(uint256 index); + +/// @dev A call to the bridge failed with no return data +error BridgeCallFailed(); + +// Sequencer Inbox Errors + +/// @dev Thrown when someone attempts to read fewer messages than have already been read +error DelayedBackwards(); + +/// @dev Thrown when someone attempts to read more messages than exist +error DelayedTooFar(); + +/// @dev Force include can only read messages more blocks old than the delay period +error ForceIncludeBlockTooSoon(); + +/// @dev Force include can only read messages more seconds old than the delay period +error ForceIncludeTimeTooSoon(); + +/// @dev The message provided did not match the hash in the delayed inbox +error IncorrectMessagePreimage(); + +/// @dev This can only be called by the batch poster +error NotBatchPoster(); + +/// @dev The sequence number provided to this message was inconsistent with the number of batches already included +error BadSequencerNumber(uint256 stored, uint256 received); + +/// @dev The sequence message number provided to this message was inconsistent with the previous one +error BadSequencerMessageNumber(uint256 stored, uint256 received); + +/// @dev Tried to create an already valid Data Availability Service keyset +error AlreadyValidDASKeyset(bytes32); + +/// @dev Tried to use or invalidate an already invalid Data Availability Service keyset +error NoSuchKeyset(bytes32); + +/// @dev Thrown when the provided address is not the designated batch poster manager +error NotBatchPosterManager(address); + +/// @dev Thrown when a data blob feature is attempted to be used on a chain that doesnt support it +error DataBlobsNotSupported(); + +/// @dev Thrown when an init param was supplied as empty +error InitParamZero(string name); + +/// @dev Thrown when data hashes where expected but not where present on the tx +error MissingDataHashes(); + +/// @dev Thrown when rollup is not updated with updateRollupAddress +error RollupNotChanged(); + +/// @dev Unsupported header flag was provided +error InvalidHeaderFlag(bytes1); + +/// @dev SequencerInbox and Bridge are not in the same feeToken/ETH mode +error NativeTokenMismatch(); + +/// @dev Thrown when a deprecated function is called +error Deprecated(); + +/// @dev Thrown when any component of maxTimeVariation is over uint64 +error BadMaxTimeVariation(); diff --git a/plume-oft-adapter-migration/contracts/L2/libraries/IGasRefunder.sol b/plume-oft-adapter-migration/contracts/L2/libraries/IGasRefunder.sol new file mode 100644 index 00000000..f80ac3b2 --- /dev/null +++ b/plume-oft-adapter-migration/contracts/L2/libraries/IGasRefunder.sol @@ -0,0 +1,14 @@ +// Copyright 2021-2022, Offchain Labs, Inc. +// For license information, see https://github.com/OffchainLabs/nitro-contracts/blob/main/LICENSE +// SPDX-License-Identifier: BUSL-1.1 + +// solhint-disable-next-line compiler-version +pragma solidity >=0.6.9 <0.9.0; + +interface IGasRefunder { + function onGasSpent( + address payable spender, + uint256 gasUsed, + uint256 calldataSize + ) external returns (bool success); +} diff --git a/plume-oft-adapter-migration/contracts/L2/libraries/MessageTypes.sol b/plume-oft-adapter-migration/contracts/L2/libraries/MessageTypes.sol new file mode 100644 index 00000000..d7a6a812 --- /dev/null +++ b/plume-oft-adapter-migration/contracts/L2/libraries/MessageTypes.sol @@ -0,0 +1,16 @@ +// Copyright 2021-2022, Offchain Labs, Inc. +// For license information, see https://github.com/OffchainLabs/nitro-contracts/blob/main/LICENSE +// SPDX-License-Identifier: BUSL-1.1 + +pragma solidity ^0.8.4; + +uint8 constant L2_MSG = 3; +uint8 constant L1MessageType_L2FundedByL1 = 7; +uint8 constant L1MessageType_submitRetryableTx = 9; +uint8 constant L1MessageType_ethDeposit = 12; +uint8 constant L1MessageType_batchPostingReport = 13; +uint8 constant L2MessageType_unsignedEOATx = 0; +uint8 constant L2MessageType_unsignedContractTx = 1; + +uint8 constant ROLLUP_PROTOCOL_EVENT_TYPE = 8; +uint8 constant INITIALIZATION_MSG_TYPE = 11; diff --git a/plume-oft-adapter-migration/contracts/L2/mocks/BridgeStub.sol b/plume-oft-adapter-migration/contracts/L2/mocks/BridgeStub.sol new file mode 100644 index 00000000..7ba6e0bd --- /dev/null +++ b/plume-oft-adapter-migration/contracts/L2/mocks/BridgeStub.sol @@ -0,0 +1,190 @@ +// Copyright 2021-2022, Offchain Labs, Inc. +// For license information, see https://github.com/OffchainLabs/nitro-contracts/blob/main/LICENSE +// SPDX-License-Identifier: BUSL-1.1 + +pragma solidity ^0.8.0; + +import "./InboxStub.sol"; +import {BadSequencerMessageNumber} from "../libraries/Error.sol"; + +import "../bridge/IBridge.sol"; +import "../bridge/IEthBridge.sol"; + +contract BridgeStub is IBridge, IEthBridge { + struct InOutInfo { + uint256 index; + bool allowed; + } + + mapping(address => InOutInfo) private allowedDelayedInboxesMap; + //mapping(address => InOutInfo) private allowedOutboxesMap; + + address[] public allowedDelayedInboxList; + address[] public allowedOutboxList; + + address public override activeOutbox; + + // Accumulator for delayed inbox; tail represents hash of the current state; each element represents the inclusion of a new message. + bytes32[] public override delayedInboxAccs; + + bytes32[] public override sequencerInboxAccs; + + address public sequencerInbox; + uint256 public override sequencerReportedSubMessageCount; + + IOwnable public rollupAddress; + + function setSequencerInbox(address _sequencerInbox) external override { + sequencerInbox = _sequencerInbox; + emit SequencerInboxUpdated(_sequencerInbox); + } + + function allowedDelayedInboxes(address inbox) external view override returns (bool) { + return allowedDelayedInboxesMap[inbox].allowed; + } + + function allowedOutboxes(address) external pure override returns (bool) { + revert("NOT_IMPLEMENTED"); + } + + function updateRollupAddress(IOwnable _address) external { + rollupAddress = _address; + } + + function enqueueDelayedMessage( + uint8 kind, + address sender, + bytes32 messageDataHash + ) external payable override returns (uint256) { + require(allowedDelayedInboxesMap[msg.sender].allowed, "NOT_FROM_INBOX"); + + return + addMessageToDelayedAccumulator( + kind, + sender, + block.number, + block.timestamp, // solhint-disable-line not-rely-on-time + block.basefee, + messageDataHash + ); + } + + function enqueueSequencerMessage( + bytes32 dataHash, + uint256 afterDelayedMessagesRead, + uint256 prevMessageCount, + uint256 newMessageCount + ) + external + returns ( + uint256 seqMessageIndex, + bytes32 beforeAcc, + bytes32 delayedAcc, + bytes32 acc + ) + { + if ( + sequencerReportedSubMessageCount != prevMessageCount && + prevMessageCount != 0 && + sequencerReportedSubMessageCount != 0 + ) { + revert BadSequencerMessageNumber(sequencerReportedSubMessageCount, prevMessageCount); + } + sequencerReportedSubMessageCount = newMessageCount; + seqMessageIndex = sequencerInboxAccs.length; + if (sequencerInboxAccs.length > 0) { + beforeAcc = sequencerInboxAccs[sequencerInboxAccs.length - 1]; + } + if (afterDelayedMessagesRead > 0) { + delayedAcc = delayedInboxAccs[afterDelayedMessagesRead - 1]; + } + acc = keccak256(abi.encodePacked(beforeAcc, dataHash, delayedAcc)); + sequencerInboxAccs.push(acc); + } + + function submitBatchSpendingReport(address batchPoster, bytes32 dataHash) + external + returns (uint256) + { + // TODO: implement stub + } + + function addMessageToDelayedAccumulator( + uint8, + address, + uint256, + uint256, + uint256, + bytes32 messageDataHash + ) internal returns (uint256) { + uint256 count = delayedInboxAccs.length; + bytes32 messageHash = Messages.messageHash( + 0, + address(uint160(0)), + 0, + 0, + 0, + 0, + messageDataHash + ); + bytes32 prevAcc = 0; + if (count > 0) { + prevAcc = delayedInboxAccs[count - 1]; + } + delayedInboxAccs.push(Messages.accumulateInboxMessage(prevAcc, messageHash)); + return count; + } + + function executeCall( + address, + uint256, + bytes calldata + ) external pure override returns (bool, bytes memory) { + revert("NOT_IMPLEMENTED"); + } + + function setDelayedInbox(address inbox, bool enabled) external override { + InOutInfo storage info = allowedDelayedInboxesMap[inbox]; + bool alreadyEnabled = info.allowed; + emit InboxToggle(inbox, enabled); + if (alreadyEnabled == enabled) { + return; + } + if (enabled) { + allowedDelayedInboxesMap[inbox] = InOutInfo(allowedDelayedInboxList.length, true); + allowedDelayedInboxList.push(inbox); + } else { + allowedDelayedInboxList[info.index] = allowedDelayedInboxList[ + allowedDelayedInboxList.length - 1 + ]; + allowedDelayedInboxesMap[allowedDelayedInboxList[info.index]].index = info.index; + allowedDelayedInboxList.pop(); + delete allowedDelayedInboxesMap[inbox]; + } + } + + function setOutbox( + address, /* outbox */ + bool /* enabled*/ + ) external pure override { + revert("NOT_IMPLEMENTED"); + } + + function delayedMessageCount() external view override returns (uint256) { + return delayedInboxAccs.length; + } + + function sequencerMessageCount() external view override returns (uint256) { + return sequencerInboxAccs.length; + } + + function rollup() external view override returns (IOwnable) { + return rollupAddress; + } + + function acceptFundsFromOldBridge() external payable {} + + function initialize(IOwnable) external pure { + revert("NOT_IMPLEMENTED"); + } +} diff --git a/plume-oft-adapter-migration/contracts/L2/mocks/InboxStub.sol b/plume-oft-adapter-migration/contracts/L2/mocks/InboxStub.sol new file mode 100644 index 00000000..182dda67 --- /dev/null +++ b/plume-oft-adapter-migration/contracts/L2/mocks/InboxStub.sol @@ -0,0 +1,214 @@ +// Copyright 2021-2022, Offchain Labs, Inc. +// For license information, see https://github.com/OffchainLabs/nitro-contracts/blob/main/LICENSE +// SPDX-License-Identifier: BUSL-1.1 + +pragma solidity ^0.8.0; + +import "../bridge/IInboxBase.sol"; +import "../bridge/IInbox.sol"; +import "../bridge/IBridge.sol"; +import "../bridge/IEthBridge.sol"; + +import "../bridge/Messages.sol"; +import "./BridgeStub.sol"; +import { + L2_MSG, + L1MessageType_L2FundedByL1, + L1MessageType_submitRetryableTx, + L2MessageType_unsignedEOATx, + L2MessageType_unsignedContractTx +} from "../libraries/MessageTypes.sol"; + +contract InboxStub is IInboxBase, IInbox { + IBridge public override bridge; + ISequencerInbox public override sequencerInbox; + + bool public paused; + uint256 public immutable maxDataSize; + + constructor() { + maxDataSize = 117964; + } + + function pause() external pure { + revert("NOT IMPLEMENTED"); + } + + function unpause() external pure { + revert("NOT IMPLEMENTED"); + } + + function initialize(IBridge _bridge, ISequencerInbox) external { + require(address(bridge) == address(0), "ALREADY_INIT"); + bridge = _bridge; + } + + /** + * @notice Send a generic L2 message to the chain + * @dev This method is an optimization to avoid having to emit the entirety of the messageData in a log. Instead validators are expected to be able to parse the data from the transaction's input + * @param messageData Data of the message being sent + */ + function sendL2MessageFromOrigin(bytes calldata messageData) external returns (uint256) { + // solhint-disable-next-line avoid-tx-origin + require(msg.sender == tx.origin, "origin only"); + uint256 msgNum = deliverToBridge(L2_MSG, msg.sender, keccak256(messageData)); + emit InboxMessageDeliveredFromOrigin(msgNum); + return msgNum; + } + + /** + * @notice Send a generic L2 message to the chain + * @dev This method can be used to send any type of message that doesn't require L1 validation + * @param messageData Data of the message being sent + */ + function sendL2Message(bytes calldata messageData) external override returns (uint256) { + uint256 msgNum = deliverToBridge(L2_MSG, msg.sender, keccak256(messageData)); + emit InboxMessageDelivered(msgNum, messageData); + return msgNum; + } + + function deliverToBridge( + uint8 kind, + address sender, + bytes32 messageDataHash + ) internal returns (uint256) { + return + IEthBridge(address(bridge)).enqueueDelayedMessage{value: msg.value}( + kind, + sender, + messageDataHash + ); + } + + function sendUnsignedTransaction( + uint256, + uint256, + uint256, + address, + uint256, + bytes calldata + ) external pure override returns (uint256) { + revert("NOT_IMPLEMENTED"); + } + + function sendContractTransaction( + uint256, + uint256, + address, + uint256, + bytes calldata + ) external pure override returns (uint256) { + revert("NOT_IMPLEMENTED"); + } + + function sendL1FundedUnsignedTransaction( + uint256, + uint256, + uint256, + address, + bytes calldata + ) external payable override returns (uint256) { + revert("NOT_IMPLEMENTED"); + } + + function sendL1FundedContractTransaction( + uint256, + uint256, + address, + bytes calldata + ) external payable override returns (uint256) { + revert("NOT_IMPLEMENTED"); + } + + function createRetryableTicket( + address, + uint256, + uint256, + address, + address, + uint256, + uint256, + bytes calldata + ) external payable override returns (uint256) { + revert("NOT_IMPLEMENTED"); + } + + function unsafeCreateRetryableTicket( + address, + uint256, + uint256, + address, + address, + uint256, + uint256, + bytes calldata + ) external payable override returns (uint256) { + revert("NOT_IMPLEMENTED"); + } + + function sendL1FundedUnsignedTransactionToFork( + uint256, + uint256, + uint256, + address, + bytes calldata + ) external payable returns (uint256) { + revert("NOT_IMPLEMENTED"); + } + + function sendUnsignedTransactionToFork( + uint256, + uint256, + uint256, + address, + uint256, + bytes calldata + ) external pure returns (uint256) { + revert("NOT_IMPLEMENTED"); + } + + function sendWithdrawEthToFork( + uint256, + uint256, + uint256, + uint256, + address + ) external pure returns (uint256) { + revert("NOT_IMPLEMENTED"); + } + + function depositEth() external payable override returns (uint256) { + revert("NOT_IMPLEMENTED"); + } + + function postUpgradeInit(IBridge _bridge) external {} + + function calculateRetryableSubmissionFee(uint256, uint256) + external + pure + override + returns (uint256) + { + revert("NOT_IMPLEMENTED"); + } + + function setAllowList(address[] memory, bool[] memory) external pure { + revert("NOT_IMPLEMENTED"); + } + + function setAllowListEnabled(bool) external pure { + revert("NOT_IMPLEMENTED"); + } + + function isAllowed(address) external pure returns (bool) { + revert("NOT_IMPLEMENTED"); + } + + function allowListEnabled() external pure returns (bool) { + revert("NOT_IMPLEMENTED"); + } + + function getProxyAdmin() external pure returns (address) { + revert("NOT_IMPLEMENTED"); + } +} diff --git a/plume-oft-adapter-migration/contracts/L2/mocks/RollupStub.sol b/plume-oft-adapter-migration/contracts/L2/mocks/RollupStub.sol new file mode 100644 index 00000000..15344747 --- /dev/null +++ b/plume-oft-adapter-migration/contracts/L2/mocks/RollupStub.sol @@ -0,0 +1,11 @@ +pragma solidity ^0.8.0; + +import { IOwnable } from "../bridge/IOwnable.sol"; + +contract RollupStub is IOwnable { + address public owner; + + constructor(address _owner) { + owner = _owner; + } +} diff --git a/plume-oft-adapter-migration/contracts/L2/mocks/SimpleProxy.sol b/plume-oft-adapter-migration/contracts/L2/mocks/SimpleProxy.sol new file mode 100644 index 00000000..e69f891c --- /dev/null +++ b/plume-oft-adapter-migration/contracts/L2/mocks/SimpleProxy.sol @@ -0,0 +1,19 @@ +// Copyright 2021-2022, Offchain Labs, Inc. +// For license information, see https://github.com/OffchainLabs/nitro-contracts/blob/main/LICENSE +// SPDX-License-Identifier: BUSL-1.1 + +pragma solidity ^0.8.0; + +import "@openzeppelin/contracts/proxy/Proxy.sol"; + +contract SimpleProxy is Proxy { + address private immutable impl; + + constructor(address impl_) { + impl = impl_; + } + + function _implementation() internal view override returns (address) { + return impl; + } +} diff --git a/plume-oft-adapter-migration/contracts/L2/mocks/UpgradeExecutorMock.sol b/plume-oft-adapter-migration/contracts/L2/mocks/UpgradeExecutorMock.sol new file mode 100644 index 00000000..6b7ca9db --- /dev/null +++ b/plume-oft-adapter-migration/contracts/L2/mocks/UpgradeExecutorMock.sol @@ -0,0 +1,82 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.0; + +import "@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol"; +import "@openzeppelin/contracts/security/ReentrancyGuard.sol"; +import "@openzeppelin/contracts/utils/Address.sol"; + +import "@offchainlabs/upgrade-executor/src/IUpgradeExecutor.sol"; + +contract UpgradeExecutorMock is + Initializable, + AccessControlUpgradeable, + ReentrancyGuard, + IUpgradeExecutor +{ + using Address for address; + + bytes32 public constant ADMIN_ROLE = keccak256("ADMIN_ROLE"); + bytes32 public constant EXECUTOR_ROLE = keccak256("EXECUTOR_ROLE"); + + /// @notice Emitted when an upgrade execution occurs + event UpgradeExecuted(address indexed upgrade, uint256 value, bytes data); + + /// @notice Emitted when target call occurs + event TargetCallExecuted(address indexed target, uint256 value, bytes data); + + constructor() initializer {} + + /// @notice Initialise the upgrade executor + /// @param admin The admin who can update other roles, and itself - ADMIN_ROLE + /// @param executors Can call the execute function - EXECUTOR_ROLE + function initialize(address admin, address[] memory executors) public initializer { + require(admin != address(0), "UpgradeExecutor: zero admin"); + + __AccessControl_init(); + + _setRoleAdmin(ADMIN_ROLE, ADMIN_ROLE); + _setRoleAdmin(EXECUTOR_ROLE, ADMIN_ROLE); + + _setupRole(ADMIN_ROLE, admin); + for (uint256 i = 0; i < executors.length; ++i) { + _setupRole(EXECUTOR_ROLE, executors[i]); + } + } + + /// @notice Execute an upgrade by delegate calling an upgrade contract + /// @dev Only executor can call this. Since we're using a delegatecall here the Upgrade contract + /// will have access to the state of this contract - including the roles. Only upgrade contracts + /// that do not touch local state should be used. + function execute(address upgrade, bytes memory upgradeCallData) + public + payable + onlyRole(EXECUTOR_ROLE) + nonReentrant + { + // OZ Address library check if the address is a contract and bubble up inner revert reason + address(upgrade).functionDelegateCall( + upgradeCallData, + "UpgradeExecutor: inner delegate call failed without reason" + ); + + emit UpgradeExecuted(upgrade, msg.value, upgradeCallData); + } + + /// @notice Execute an upgrade by directly calling target contract + /// @dev Only executor can call this. + function executeCall(address target, bytes memory targetCallData) + public + payable + onlyRole(EXECUTOR_ROLE) + nonReentrant + { + // OZ Address library check if the address is a contract and bubble up inner revert reason + address(target).functionCallWithValue( + targetCallData, + msg.value, + "UpgradeExecutor: inner call failed without reason" + ); + + emit TargetCallExecuted(target, msg.value, targetCallData); + } +} diff --git a/plume-oft-adapter-migration/contracts/L3/ArbNativeOFTAdapter.sol b/plume-oft-adapter-migration/contracts/L3/ArbNativeOFTAdapter.sol new file mode 100644 index 00000000..79420cdc --- /dev/null +++ b/plume-oft-adapter-migration/contracts/L3/ArbNativeOFTAdapter.sol @@ -0,0 +1,137 @@ +// SPDX-License-Identifier: UNLICENSED + +pragma solidity ^0.8.20; + +import { OFTCore } from "@layerzerolabs/lz-evm-oapp-v2/contracts/oft/OFTCore.sol"; +import { IOFT, SendParam, OFTReceipt, MessagingReceipt, MessagingFee } from "@layerzerolabs/lz-evm-oapp-v2/contracts/oft/interfaces/IOFT.sol"; + +import { ArbNativeTokenManager } from "./precompiles/ArbNativeTokenManager.sol"; + +abstract contract ArbNativeOFTAdapter is OFTCore { + ArbNativeTokenManager public immutable arbNativeTokenManager = ArbNativeTokenManager(address(0x73)); + + error IncorrectMessageValue(uint256 provided, uint256 required); + error CreditFailed(address to, uint256 amountLD, bytes revertData); + + /** + * @param _localDecimals The decimals of the native on the local chain (this chain). 18 on ETH. + * @param _lzEndpoint The LayerZero endpoint address. + * @param _delegate The delegate capable of making OApp configurations inside of the endpoint. + */ + constructor( + uint8 _localDecimals, + address _lzEndpoint, + address _delegate + ) OFTCore(_localDecimals, _lzEndpoint, _delegate) {} + + function token() external pure returns (address) { + return address(0); + } + + /** + * @notice Indicates whether the OFT contract requires approval of the 'token()' to send. + * @return requiresApproval Needs approval of the underlying token implementation. + * + * @dev In the case of default OFTAdapter, approval is required. + * @dev In non-default OFTAdapter contracts with something like mint and burn privileges, it would NOT need approval. + */ + function approvalRequired() external pure virtual returns (bool) { + return false; + } + + /** + * @dev Burns tokens from the sender's specified balance, ie. pull method. + * @param _amountLD The amount of tokens to send in local decimals. + * @param _minAmountLD The minimum amount to send in local decimals. + * @param _dstEid The destination chain ID. + * @return amountSentLD The amount sent in local decimals. + * @return amountReceivedLD The amount received in local decimals on the remote. + * + * @dev msg.sender will need to approve this _amountLD of tokens to be locked inside of the contract. + * @dev WARNING: The default OFTAdapter implementation assumes LOSSLESS transfers, ie. 1 token in, 1 token out. + * IF the 'innerToken' applies something like a transfer fee, the default will NOT work... + * a pre/post balance check will need to be done to calculate the amountReceivedLD. + */ + function _debit( + uint256 _amountLD, + uint256 _minAmountLD, + uint32 _dstEid + ) internal virtual override returns (uint256 amountSentLD, uint256 amountReceivedLD) { + (amountSentLD, amountReceivedLD) = _debitView(_amountLD, _minAmountLD, _dstEid); + + arbNativeTokenManager.burnNativeToken(amountSentLD); + } + + /** + * @dev Credits tokens to the specified address. + * @param _to The address to credit the tokens to. + * @param _amountLD The amount of tokens to credit in local decimals. + * @dev _srcEid The source chain ID. + * @return amountReceivedLD The amount of tokens ACTUALLY received in local decimals. + * + * @dev WARNING: The default OFTAdapter implementation assumes LOSSLESS transfers, ie. 1 token in, 1 token out. + * IF the 'innerToken' applies something like a transfer fee, the default will NOT work... + * a pre/post balance check will need to be done to calculate the amountReceivedLD. + */ + function _credit( + address _to, + uint256 _amountLD, + uint32 /*_srcEid*/ + ) internal virtual override returns (uint256 amountReceivedLD) { + arbNativeTokenManager.mintNativeToken(_amountLD); + + // @dev Transfer tokens to the recipient. + (bool success, bytes memory data) = payable(_to).call{value: _amountLD}(""); + if (!success) { + revert CreditFailed(_to, _amountLD, data); + } + + // @dev In the case of NON-default NativeOFTAdapter, the amountLD MIGHT not be == amountReceivedLD. + return _amountLD; + } + + function send( + SendParam calldata _sendParam, + MessagingFee calldata _fee, + address _refundAddress + ) external payable override returns (MessagingReceipt memory msgReceipt, OFTReceipt memory oftReceipt) { + // @dev Ensure the native funds in msg.value are exactly enough to cover the fees and amount to send (with dust removed). + // @dev This will revert if the _sendParam.amountLD contains any dust + uint256 requiredMsgValue = _fee.nativeFee + _removeDust(_sendParam.amountLD); + if (msg.value != requiredMsgValue) { + revert IncorrectMessageValue(msg.value, requiredMsgValue); + } + + // @dev Applies the token transfers regarding this send() operation. + // - amountSentLD is the amount in local decimals that was ACTUALLY sent/debited from the sender. + // - amountReceivedLD is the amount in local decimals that will be received/credited to the recipient on the remote OFT instance. + (uint256 amountSentLD, uint256 amountReceivedLD) = _debit( + _sendParam.amountLD, + _sendParam.minAmountLD, + _sendParam.dstEid + ); + + // @dev Builds the options and OFT message to quote in the endpoint. + (bytes memory message, bytes memory options) = _buildMsgAndOptions(_sendParam, amountReceivedLD); + + // @dev Sends the message to the LayerZero endpoint and returns the LayerZero msg receipt. + msgReceipt = _lzSend(_sendParam.dstEid, message, options, _fee, _refundAddress); + // @dev Formulate the OFT receipt. + oftReceipt = OFTReceipt(amountSentLD, amountReceivedLD); + + emit OFTSent(msgReceipt.guid, _sendParam.dstEid, msg.sender, amountSentLD, amountReceivedLD); + } + + /** + * @dev Overridden to be empty as this assertion is done higher up on the overriden send() function. + * @param _nativeFee The native fee to be paid. + * @return nativeFee The amount of native currency paid. + */ + function _payNative(uint256 _nativeFee) internal pure override returns (uint256 nativeFee) { + return _nativeFee; + } + + function oftVersion() external pure virtual returns (bytes4 interfaceId, uint64 version) { + return (type(IOFT).interfaceId, 1); + } +} \ No newline at end of file diff --git a/plume-oft-adapter-migration/contracts/L3/OrbitNativeOFTAdapter.sol b/plume-oft-adapter-migration/contracts/L3/OrbitNativeOFTAdapter.sol new file mode 100644 index 00000000..ed56d8cd --- /dev/null +++ b/plume-oft-adapter-migration/contracts/L3/OrbitNativeOFTAdapter.sol @@ -0,0 +1,17 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.22; + +import { ArbNativeOFTAdapter } from "./ArbNativeOFTAdapter.sol"; + +contract OrbitNativeOFTAdapter is ArbNativeOFTAdapter { + /** + * @param _localDecimals The decimals of the native on the local chain (this chain). 18 on ETH. + * @param _lzEndpoint The LayerZero endpoint address. + * @param _delegate The delegate capable of making OApp configurations inside of the endpoint. + */ + constructor( + uint8 _localDecimals, + address _lzEndpoint, + address _delegate + ) ArbNativeOFTAdapter(_localDecimals, _lzEndpoint, _delegate) {} +} \ No newline at end of file diff --git a/plume-oft-adapter-migration/contracts/L3/precompiles/ArbNativeTokenManager.sol b/plume-oft-adapter-migration/contracts/L3/precompiles/ArbNativeTokenManager.sol new file mode 100644 index 00000000..64ca1d01 --- /dev/null +++ b/plume-oft-adapter-migration/contracts/L3/precompiles/ArbNativeTokenManager.sol @@ -0,0 +1,29 @@ +// Copyright 2021-2025, Offchain Labs, Inc. +// For license information, see https://github.com/OffchainLabs/nitro-contracts/blob/main/LICENSE.md +// SPDX-License-Identifier: BUSL-1.1 + +pragma solidity >=0.4.21 <0.9.0; + +/** + * @title Enables minting and burning native tokens. + * @notice Authorized callers are added/removed through ArbOwner precompile. + * Precompiled contract that exists in every Arbitrum chain at 0x0000000000000000000000000000000000000073. + * Available in ArbOS version 41 + */ +interface ArbNativeTokenManager { + /** + * @notice In case the caller is authorized, + * mints some amount of the native gas token for this chain to the caller. + */ + function mintNativeToken( + uint256 amount + ) external; + + /** + * @notice In case the caller is authorized, + * burns some amount of the native gas token for this chain from the caller. + */ + function burnNativeToken( + uint256 amount + ) external; +} \ No newline at end of file diff --git a/plume-oft-adapter-migration/contracts/MyOFTAdapterFeeUpgradeable.sol b/plume-oft-adapter-migration/contracts/MyOFTAdapterFeeUpgradeable.sol deleted file mode 100644 index 155d360a..00000000 --- a/plume-oft-adapter-migration/contracts/MyOFTAdapterFeeUpgradeable.sol +++ /dev/null @@ -1,15 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.22; - -import { OFTAdapterFeeUpgradeable } from "@layerzerolabs/oft-evm-upgradeable/contracts/oft/OFTAdapterFeeUpgradeable.sol"; - -contract MyOFTAdapterFeeUpgradeable is OFTAdapterFeeUpgradeable { - constructor(address _token, address _lzEndpoint) OFTAdapterFeeUpgradeable(_token, _lzEndpoint) { - _disableInitializers(); - } - - function initialize(address _delegate) public initializer { - __OFTAdapterFee_init(_delegate); - __Ownable_init(_delegate); - } -} diff --git a/plume-oft-adapter-migration/contracts/MyOFTAdapterUpgradeable.sol b/plume-oft-adapter-migration/contracts/MyOFTAdapterUpgradeable.sol deleted file mode 100644 index c4d36461..00000000 --- a/plume-oft-adapter-migration/contracts/MyOFTAdapterUpgradeable.sol +++ /dev/null @@ -1,15 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.22; - -import { OFTAdapterUpgradeable } from "@layerzerolabs/oft-evm-upgradeable/contracts/oft/OFTAdapterUpgradeable.sol"; - -contract MyOFTAdapterUpgradeable is OFTAdapterUpgradeable { - constructor(address _token, address _lzEndpoint) OFTAdapterUpgradeable(_token, _lzEndpoint) { - _disableInitializers(); - } - - function initialize(address _delegate) public initializer { - __OFTAdapter_init(_delegate); - __Ownable_init(_delegate); - } -} diff --git a/plume-oft-adapter-migration/contracts/MyOFTFeeUpgradeable.sol b/plume-oft-adapter-migration/contracts/MyOFTFeeUpgradeable.sol deleted file mode 100644 index f40720fb..00000000 --- a/plume-oft-adapter-migration/contracts/MyOFTFeeUpgradeable.sol +++ /dev/null @@ -1,15 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.22; - -import { OFTFeeUpgradeable } from "@layerzerolabs/oft-evm-upgradeable/contracts/oft/OFTFeeUpgradeable.sol"; - -contract MyOFTFeeUpgradeable is OFTFeeUpgradeable { - constructor(address _lzEndpoint) OFTFeeUpgradeable(_lzEndpoint) { - _disableInitializers(); - } - - function initialize(string memory _name, string memory _symbol, address _delegate) public initializer { - __OFTFee_init(_name, _symbol, _delegate); - __Ownable_init(_delegate); - } -} diff --git a/plume-oft-adapter-migration/contracts/MyOFTUpgradeable.sol b/plume-oft-adapter-migration/contracts/MyOFTUpgradeable.sol deleted file mode 100644 index 1eeaf8a1..00000000 --- a/plume-oft-adapter-migration/contracts/MyOFTUpgradeable.sol +++ /dev/null @@ -1,15 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.22; - -import { OFTUpgradeable } from "@layerzerolabs/oft-evm-upgradeable/contracts/oft/OFTUpgradeable.sol"; - -contract MyOFTUpgradeable is OFTUpgradeable { - constructor(address _lzEndpoint) OFTUpgradeable(_lzEndpoint) { - _disableInitializers(); - } - - function initialize(string memory _name, string memory _symbol, address _delegate) public initializer { - __OFT_init(_name, _symbol, _delegate); - __Ownable_init(_delegate); - } -} diff --git a/plume-oft-adapter-migration/contracts/mocks/MyERC20Mock.sol b/plume-oft-adapter-migration/contracts/mocks/MyERC20Mock.sol deleted file mode 100644 index 9ea57e78..00000000 --- a/plume-oft-adapter-migration/contracts/mocks/MyERC20Mock.sol +++ /dev/null @@ -1,13 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.20; - -import { ERC20 } from "@openzeppelin/contracts/token/ERC20/ERC20.sol"; - -// @dev WARNING: This is for testing purposes only -contract MyERC20Mock is ERC20 { - constructor(string memory _name, string memory _symbol) ERC20(_name, _symbol) {} - - function mint(address _to, uint256 _amount) public { - _mint(_to, _amount); - } -} diff --git a/plume-oft-adapter-migration/contracts/mocks/MyOFTAdapterUpgradeableMock.sol b/plume-oft-adapter-migration/contracts/mocks/MyOFTAdapterUpgradeableMock.sol deleted file mode 100644 index ad9dd27c..00000000 --- a/plume-oft-adapter-migration/contracts/mocks/MyOFTAdapterUpgradeableMock.sol +++ /dev/null @@ -1,9 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.22; - -import { MyOFTAdapterUpgradeable } from "../MyOFTAdapterUpgradeable.sol"; - -// @dev WARNING: This is for testing purposes only -contract MyOFTAdapterUpgradeableMock is MyOFTAdapterUpgradeable { - constructor(address _token, address _lzEndpoint) MyOFTAdapterUpgradeable(_token, _lzEndpoint) {} -} diff --git a/plume-oft-adapter-migration/contracts/mocks/MyOFTUpgradeableMock.sol b/plume-oft-adapter-migration/contracts/mocks/MyOFTUpgradeableMock.sol deleted file mode 100644 index 7f9754a9..00000000 --- a/plume-oft-adapter-migration/contracts/mocks/MyOFTUpgradeableMock.sol +++ /dev/null @@ -1,13 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.22; - -import { MyOFTUpgradeable } from "../MyOFTUpgradeable.sol"; - -// @dev WARNING: This is for testing purposes only -contract MyOFTUpgradeableMock is MyOFTUpgradeable { - constructor(address _lzEndpoint) MyOFTUpgradeable(_lzEndpoint) {} - - function mint(address _to, uint256 _amount) public { - _mint(_to, _amount); - } -} diff --git a/plume-oft-adapter-migration/test/ArbNativeOFTAdapter.t.sol b/plume-oft-adapter-migration/test/ArbNativeOFTAdapter.t.sol new file mode 100644 index 00000000..4f7fb974 --- /dev/null +++ b/plume-oft-adapter-migration/test/ArbNativeOFTAdapter.t.sol @@ -0,0 +1,243 @@ +pragma solidity ^0.8.22; + +import "forge-std/console.sol"; + +import { Packet } from "@layerzerolabs/lz-evm-protocol-v2/contracts/interfaces/ISendLib.sol"; +import { OptionsBuilder } from "@layerzerolabs/lz-evm-oapp-v2/contracts/oapp/libs/OptionsBuilder.sol"; +import { MessagingFee } from "@layerzerolabs/lz-evm-oapp-v2/contracts/oapp/OApp.sol"; +import { MessagingReceipt, OAppSender } from "@layerzerolabs/lz-evm-oapp-v2/contracts/oapp/OAppSender.sol"; +import { IOFT, SendParam, OFTReceipt } from "@layerzerolabs/lz-evm-oapp-v2/contracts/oft/interfaces/IOFT.sol"; +import { TestHelper } from "./helpers/TestHelper.sol"; + +import { ArbNativeOFTAdapter } from "../src/L3/ArbNativeOFTAdapter.sol"; +import { MockArbNativeOFTAdapter } from "./mocks/MockArbNativeOFTAdapter.sol"; +import { MockOFT } from "./mocks/MockOFT.sol"; +import { MockNativeTokenManager } from "./mocks/MockNativeTokenManager.sol"; + +contract NativeOFTAdapterMsgValueTransferTest is TestHelper { + using OptionsBuilder for bytes; + + address owner = makeAddr("owner"); + address alice = makeAddr("alice"); + address bob = makeAddr("bob"); + + uint32 eid_a = 1; + uint32 eid_b = 2; + + MockArbNativeOFTAdapter nativeOFTV2; + MockOFT remoteOFTV2; + MockNativeTokenManager mockNativeTokenManager = MockNativeTokenManager(address(0x73)); + + function setUp() public virtual override { + super.setUp(); + + setUpEndpoints(2, LibraryType.UltraLightNode); + + MockNativeTokenManager _mockNativeTokenManager = new MockNativeTokenManager(); + vm.etch(address(mockNativeTokenManager), address(_mockNativeTokenManager).code); + + vm.startPrank(owner); + + nativeOFTV2 = new MockArbNativeOFTAdapter(18, endpoints[eid_a], owner); + remoteOFTV2 = new MockOFT("MyToken", "MTK", endpoints[eid_b], owner); + + nativeOFTV2.setPeer(eid_b, bytes32(uint(uint160(address(remoteOFTV2))))); + remoteOFTV2.setPeer(eid_a, bytes32(uint(uint160(address(nativeOFTV2))))); + vm.stopPrank(); + } + + function test_constructor() public view { + assertEq(nativeOFTV2.owner(), owner); + assertEq(nativeOFTV2.token(), address(0)); + assertEq(nativeOFTV2.approvalRequired(), false); + } + + function test_send_with_enough_native() public { + uint256 initialAliceBalance = 20 ether; + vm.deal(alice, initialAliceBalance); + + assertEq(mockNativeTokenManager.mintedAmount(), 0); + assertEq(mockNativeTokenManager.burnedAmount(), 0); + assertEq(remoteOFTV2.balanceOf(alice), 0); + assertEq(address(nativeOFTV2).balance, 0); + + vm.startPrank(alice); + uint256 totalAmount = 4 ether + 1 wei; + uint256 totalAmountMinusDust = 4 ether; + + SendParam memory sendParam = SendParam( + eid_b, + addressToBytes32(alice), + totalAmount, + totalAmountMinusDust, + OptionsBuilder.newOptions().addExecutorLzReceiveOption(200000, 0), + "", + "" + ); + MessagingFee memory fee = nativeOFTV2.quoteSend(sendParam, false); + uint256 messageValue = fee.nativeFee + totalAmountMinusDust; + + nativeOFTV2.send{ value: messageValue }(sendParam, fee, alice); + verifyPackets(eid_b, addressToBytes32(address(remoteOFTV2))); + + assertEq(alice.balance, initialAliceBalance - totalAmountMinusDust - fee.nativeFee); + assertEq(address(nativeOFTV2).balance, 0); + assertEq(mockNativeTokenManager.mintedAmount(), 0); + assertEq(mockNativeTokenManager.burnedAmount(), totalAmountMinusDust); + assertEq(remoteOFTV2.balanceOf(alice), totalAmountMinusDust); + assertEq(remoteOFTV2.totalSupply(), totalAmountMinusDust); + } + + function test_send_from_main_to_other_chain_using_default() public { + uint256 initialAliceBalance = 20 ether; + uint256 initialBobBalance = 0 ether; + deal(alice, initialAliceBalance); + deal(bob, initialBobBalance); + + assertEq(mockNativeTokenManager.mintedAmount(), 0); + assertEq(mockNativeTokenManager.burnedAmount(), 0); + assertEq(remoteOFTV2.balanceOf(alice), 0); + assertEq(address(nativeOFTV2).balance, 0); + + uint256 totalAmount = 8 ether; + + SendParam memory sendParam = SendParam( + eid_b, + addressToBytes32(alice), + totalAmount, + totalAmount, + OptionsBuilder.newOptions().addExecutorLzReceiveOption(200000, 0), + "", + "" + ); + MessagingFee memory fee = nativeOFTV2.quoteSend(sendParam, false); + uint256 messageValue = fee.nativeFee + totalAmount; + + vm.prank(alice); + nativeOFTV2.send{ value: messageValue }(sendParam, fee, alice); + + verifyPackets(eid_b, addressToBytes32(address(remoteOFTV2))); + + assertEq(alice.balance, initialAliceBalance - totalAmount - fee.nativeFee); + assertEq(address(nativeOFTV2).balance, 0); + assertEq(mockNativeTokenManager.mintedAmount(), 0); + assertEq(mockNativeTokenManager.burnedAmount(), totalAmount); + assertEq(remoteOFTV2.balanceOf(alice), totalAmount); + assertEq(remoteOFTV2.totalSupply(), totalAmount); + + // second send + + SendParam memory sendParamSecondTx = SendParam( + eid_a, + addressToBytes32(bob), + totalAmount, + totalAmount, + OptionsBuilder.newOptions().addExecutorLzReceiveOption(200000, 0), + "", + "" + ); + MessagingFee memory feeSecondTx = remoteOFTV2.quoteSend(sendParamSecondTx, false); + + vm.prank(alice); + remoteOFTV2.send{ value: feeSecondTx.nativeFee }(sendParamSecondTx, feeSecondTx, alice); + + verifyPackets(eid_a, addressToBytes32(address(nativeOFTV2))); + + assertEq(alice.balance, initialAliceBalance - totalAmount - fee.nativeFee - feeSecondTx.nativeFee); + assertEq(bob.balance, totalAmount); + assertEq(address(nativeOFTV2).balance, 0); + assertEq(address(remoteOFTV2).balance, 0); + assertEq(mockNativeTokenManager.mintedAmount(), totalAmount); + assertEq(mockNativeTokenManager.burnedAmount(), totalAmount); + assertEq(remoteOFTV2.balanceOf(alice), 0); + assertEq(remoteOFTV2.balanceOf(bob), 0); + assertEq(remoteOFTV2.totalSupply(), 0); + } + + function test_send_reverts_when_incorrect_message_value_passed() public { + uint256 initialAliceBalance = 20 ether; + deal(alice, initialAliceBalance); + + assertEq(mockNativeTokenManager.mintedAmount(), 0); + assertEq(mockNativeTokenManager.burnedAmount(), 0); + assertEq(remoteOFTV2.balanceOf(alice), 0); + assertEq(address(nativeOFTV2).balance, 0); + assertEq(remoteOFTV2.totalSupply(), 0); + + uint256 totalAmount = 8 ether; + uint256 extraAmount = 2 ether; + + SendParam memory sendParam = SendParam( + eid_b, + addressToBytes32(alice), + totalAmount, + totalAmount, + OptionsBuilder.newOptions().addExecutorLzReceiveOption(200000, 0), + "", + "" + ); + MessagingFee memory fee = nativeOFTV2.quoteSend(sendParam, false); + uint256 messageValue = fee.nativeFee + totalAmount + extraAmount; + + vm.prank(alice); + vm.expectRevert(abi.encodeWithSelector(ArbNativeOFTAdapter.IncorrectMessageValue.selector, messageValue, totalAmount + fee.nativeFee)); + nativeOFTV2.send{ value: messageValue }(sendParam, fee, alice); + } + + function test_send_reverts_when_value_gt_fee_and_sender_balance_gt_send_amount() public { + deal(alice, 10 ether); + + assertEq(mockNativeTokenManager.mintedAmount(), 0); + assertEq(mockNativeTokenManager.burnedAmount(), 0); + assertEq(address(nativeOFTV2).balance, 0); + + uint256 sendAmount = 2 ether; + uint256 messageValue = 3 ether; + + bytes memory options = OptionsBuilder.newOptions().addExecutorLzReceiveOption(200000, 0); + SendParam memory sendParam = SendParam( + eid_b, + addressToBytes32(bob), + sendAmount, + sendAmount, + options, + "", + "" + ); + MessagingFee memory fee = nativeOFTV2.quoteSend(sendParam, false); + + vm.expectRevert( + abi.encodeWithSelector(ArbNativeOFTAdapter.IncorrectMessageValue.selector, messageValue, sendAmount + fee.nativeFee) + ); + nativeOFTV2.send{ value: messageValue }(sendParam, fee, alice); + } + + function test_native_oft_adapter_debit() public virtual { + uint256 amountToSendLD = 1 ether; + uint256 minAmountToCreditLD = 1 ether; + uint32 dstEid = eid_b; + + deal(address(nativeOFTV2), amountToSendLD); + + vm.prank(alice); + vm.expectRevert( + abi.encodeWithSelector(IOFT.SlippageExceeded.selector, amountToSendLD, minAmountToCreditLD + 1) + ); + nativeOFTV2.debit(amountToSendLD, minAmountToCreditLD + 1, dstEid); + + vm.prank(alice); + (uint256 amountDebitedLD, uint256 amountToCreditLD) = nativeOFTV2.debit( + amountToSendLD, + minAmountToCreditLD, + dstEid + ); + + assertEq(amountDebitedLD, amountToSendLD); + assertEq(amountToCreditLD, amountToSendLD); + assertEq(mockNativeTokenManager.mintedAmount(), 0); + assertEq(mockNativeTokenManager.burnedAmount(), amountToSendLD); + assertEq(address(nativeOFTV2).balance, 0); + assertEq(alice.balance, 0); + } + +} \ No newline at end of file diff --git a/plume-oft-adapter-migration/test/L2_L3_flow.t.sol b/plume-oft-adapter-migration/test/L2_L3_flow.t.sol new file mode 100644 index 00000000..fef26975 --- /dev/null +++ b/plume-oft-adapter-migration/test/L2_L3_flow.t.sol @@ -0,0 +1,221 @@ +pragma solidity ^0.8.22; + +import { Packet } from "@layerzerolabs/lz-evm-protocol-v2/contracts/interfaces/ISendLib.sol"; +import { OptionsBuilder } from "@layerzerolabs/lz-evm-oapp-v2/contracts/oapp/libs/OptionsBuilder.sol"; +import { MessagingFee } from "@layerzerolabs/lz-evm-oapp-v2/contracts/oapp/OApp.sol"; +import { MessagingReceipt, OAppSender } from "@layerzerolabs/lz-evm-oapp-v2/contracts/oapp/OAppSender.sol"; +import { IOFT, SendParam, OFTReceipt } from "@layerzerolabs/lz-evm-oapp-v2/contracts/oft/interfaces/IOFT.sol"; +import { IUpgradeExecutor } from "@offchainlabs/upgrade-executor/src/IUpgradeExecutor.sol"; +import { ProxyAdmin } from "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol"; +import { ITransparentUpgradeableProxy, TransparentUpgradeableProxy } from "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; +import { IAccessControlUpgradeable } from "@openzeppelin/contracts-upgradeable/access/IAccessControlUpgradeable.sol"; + +import { GasToken } from "../src/L2/GasToken.sol"; +import { OrbitERC20OFTAdapter } from "../src/L2/OrbitERC20OFTAdapter.sol"; +import { IBridge } from "../src/L2/bridge/IBridge.sol"; +import { ERC20Bridge } from "../src/L2/bridge/ERC20Bridge.sol"; +import { IOwnable } from "../src/L2/bridge/IOwnable.sol"; +import { ISequencerInbox } from "../src/L2/bridge/ISequencerInbox.sol"; +import { SimpleProxy } from "../src/L2/mocks/SimpleProxy.sol"; +import { BridgeStub } from "../src/L2/mocks/BridgeStub.sol"; +import { RollupStub } from "../src/L2/mocks/RollupStub.sol"; +import { UpgradeExecutorMock } from "../src/L2/mocks/UpgradeExecutorMock.sol"; +import { OrbitNativeOFTAdapter } from "../src/L3/OrbitNativeOFTAdapter.sol"; +import { IDelayedMessageProvider } from "../src/L2/bridge/IDelayedMessageProvider.sol"; +import { TestHelper } from "./helpers/TestHelper.sol"; +import { MockNativeTokenManager } from "./mocks/MockNativeTokenManager.sol"; + +import "forge-std/console.sol"; + +contract L2ToL3FlowTest is TestHelper { + using OptionsBuilder for bytes; + + address rollupOwner = makeAddr("rollupOwner"); + address alice = makeAddr("alice"); + address bob = makeAddr("bob"); + + uint32 L2_Eid = 1; + uint32 L3_Eid = 2; + + // L2 + OrbitERC20OFTAdapter l2Adapter; + GasToken gasToken; + IUpgradeExecutor l2UpgradeExecutor; + + // L3 + OrbitNativeOFTAdapter l3Adapter; + MockNativeTokenManager mockNativeTokenManager = MockNativeTokenManager(address(0x73)); + + uint256 gasTokenSupply = 100 ether; + + /// @notice Calls setUp from TestHelper and initializes contract instances for testing. + function setUp() public virtual override { + super.setUp(); + + // Setup function to initialize 2 Mock Endpoints with Mock MessageLib. + setUpEndpoints(2, LibraryType.UltraLightNode); + + MockNativeTokenManager _mockNativeTokenManager = new MockNativeTokenManager(); + vm.etch(address(mockNativeTokenManager), address(_mockNativeTokenManager).code); + + // L2 + address endpointL2 = endpoints[L2_Eid]; + + vm.startPrank(rollupOwner); + gasToken = new GasToken("GasToken", "GTK"); + + address[] memory executors = new address[](1); + executors[0] = rollupOwner; + + ProxyAdmin proxyAdmin = new ProxyAdmin(); + l2UpgradeExecutor = new UpgradeExecutorMock(); + TransparentUpgradeableProxy transparentProxy = new TransparentUpgradeableProxy( + address(l2UpgradeExecutor), + address(proxyAdmin), + abi.encodeWithSelector(UpgradeExecutorMock.initialize.selector, rollupOwner, executors) + ); + l2UpgradeExecutor = IUpgradeExecutor(address(transparentProxy)); + + bool isRollupOwnerExecutor = IAccessControlUpgradeable(address(l2UpgradeExecutor)).hasRole(keccak256("EXECUTOR_ROLE"), rollupOwner); + if (!isRollupOwnerExecutor) { + revert("!isRollupOwnerExecutor"); + } + + RollupStub rollup = new RollupStub(address(l2UpgradeExecutor)); + + ERC20Bridge l2Bridge = new ERC20Bridge(); + SimpleProxy l2BridgeProxy = new SimpleProxy(address(l2Bridge)); + l2Bridge = ERC20Bridge(address(l2BridgeProxy)); + l2Bridge.initialize(rollup, address(gasToken)); + + l2Adapter = new OrbitERC20OFTAdapter(address(gasToken), endpointL2, rollupOwner, l2Bridge); + + // L3 + address endpointL3 = endpoints[L3_Eid]; + l3Adapter = new OrbitNativeOFTAdapter(18, endpointL3, rollupOwner); + address l3AdapterAddress = address(l3Adapter); + + // L2 + gasToken.mint(address(l2Bridge), gasTokenSupply); + l2UpgradeExecutor.executeCall(address(l2Bridge), abi.encodeWithSelector(l2Bridge.setOutbox.selector, address(l2Adapter), true)); + + l2Adapter.setPeer(L3_Eid, bytes32(uint(uint160(l3AdapterAddress)))); + l3Adapter.setPeer(L2_Eid, bytes32(uint(uint160(address(l2Adapter))))); + vm.stopPrank(); + + assertEq(gasToken.balanceOf(rollupOwner), 0); + assertEq(address(l3Adapter).balance, 0, "L3 adapter balance has to be 0 because it uses mint burn"); + } + + function test_send_l2_to_l3_different_account() public { + uint256 tokensToSend = 1 ether; + uint256 initialNativeBalance = 1 ether; + + vm.deal(alice, initialNativeBalance); + + vm.prank(rollupOwner); + gasToken.mint(alice, tokensToSend); + + assertEq(gasToken.balanceOf(alice), tokensToSend); + assertEq(alice.balance, initialNativeBalance); + + vm.startPrank(alice); + gasToken.approve(address(l2Adapter), tokensToSend); + + bytes memory options = OptionsBuilder.newOptions().addExecutorLzReceiveOption(200000, 0); + SendParam memory sendParam = SendParam( + L3_Eid, + addressToBytes32(bob), + tokensToSend, + tokensToSend, + options, + "", + "" + ); + MessagingFee memory fee = l2Adapter.quoteSend(sendParam, false); + + l2Adapter.send{ value: fee.nativeFee }(sendParam, fee, alice); + + vm.stopPrank(); + + verifyPackets(L3_Eid, addressToBytes32(address(l3Adapter))); + + assertEq(gasToken.balanceOf(alice), 0); + assertEq(alice.balance, initialNativeBalance - fee.nativeFee); + assertEq(bob.balance, tokensToSend); + } + + function test_send_l2_to_l3_same_account() public { + uint256 tokensToSend = 1 ether; + uint256 initialNativeBalance = 1 ether; + + vm.deal(rollupOwner, initialNativeBalance); + + vm.prank(rollupOwner); + gasToken.mint(rollupOwner, tokensToSend); + + assertEq(gasToken.balanceOf(rollupOwner), tokensToSend); + assertEq(rollupOwner.balance, initialNativeBalance); + + vm.startPrank(rollupOwner); + gasToken.approve(address(l2Adapter), tokensToSend); + + bytes memory options = OptionsBuilder.newOptions().addExecutorLzReceiveOption(200000, 0); + SendParam memory sendParam = SendParam( + L3_Eid, + addressToBytes32(rollupOwner), + tokensToSend, + tokensToSend, + options, + "", + "" + ); + MessagingFee memory fee = l2Adapter.quoteSend(sendParam, false); + + l2Adapter.send{ value: fee.nativeFee }(sendParam, fee, rollupOwner); + + vm.stopPrank(); + + verifyPackets(L3_Eid, addressToBytes32(address(l3Adapter))); + + assertEq(gasToken.balanceOf(rollupOwner), 0); + assertEq(rollupOwner.balance, initialNativeBalance - fee.nativeFee + tokensToSend); + } + + function test_send_l3_to_l2() public { + uint256 tokensToSend = 1 ether; + uint256 initialNativeBalance = 2 ether; + + deal(alice, initialNativeBalance); + + assertEq(gasToken.balanceOf(alice), 0); + assertEq(gasToken.balanceOf(bob), 0); + assertEq(alice.balance, initialNativeBalance); + assertEq(bob.balance, 0); + + bytes memory options = OptionsBuilder.newOptions().addExecutorLzReceiveOption(200000, 0); + SendParam memory sendParam = SendParam( + L2_Eid, + addressToBytes32(bob), + tokensToSend, + tokensToSend, + options, + "", + "" + ); + MessagingFee memory fee = l3Adapter.quoteSend(sendParam, false); + + vm.prank(alice); + l3Adapter.send{ value: tokensToSend + fee.nativeFee }(sendParam, fee, alice); + + verifyPackets(L2_Eid, addressToBytes32(address(l2Adapter))); + + assertEq(gasToken.balanceOf(alice), 0); + assertEq(gasToken.balanceOf(bob), tokensToSend); + assertEq(address(l3Adapter).balance, 0); + assertEq(mockNativeTokenManager.mintedAmount(), 0); + assertEq(mockNativeTokenManager.burnedAmount(), tokensToSend); + assertEq(alice.balance, initialNativeBalance - tokensToSend - fee.nativeFee); + assertEq(bob.balance, 0); + } +} \ No newline at end of file diff --git a/plume-oft-adapter-migration/test/foundry/MyOFTUpgradeable.t.sol b/plume-oft-adapter-migration/test/foundry/MyOFTUpgradeable.t.sol deleted file mode 100644 index d00c769c..00000000 --- a/plume-oft-adapter-migration/test/foundry/MyOFTUpgradeable.t.sol +++ /dev/null @@ -1,61 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.20; - -import { OFTTest } from "@layerzerolabs/oft-evm-upgradeable/test/OFT.t.sol"; -import { MyOFTAdapterUpgradeable } from "../../contracts/MyOFTAdapterUpgradeable.sol"; -import { EndpointV2Mock } from "@layerzerolabs/test-devtools-evm-foundry/contracts/mocks/EndpointV2Mock.sol"; -import { MyOFTUpgradeable } from "../../contracts/MyOFTUpgradeable.sol"; -import { Initializable } from "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; - -contract MyOFTUpgradeableTest is OFTTest { - bytes32 internal constant IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; - - function test_oft_implementation_initialization_disabled() public { - MyOFTUpgradeable oftUpgradeable = MyOFTUpgradeable( - _deployContractAndProxy( - type(MyOFTUpgradeable).creationCode, - abi.encode(address(endpoints[aEid])), - abi.encodeWithSelector( - MyOFTUpgradeable.initialize.selector, - "oftUpgradeable", - "oftUpgradeable", - address(this) - ) - ) - ); - - bytes32 implementationRaw = vm.load(address(oftUpgradeable), IMPLEMENTATION_SLOT); - address implementationAddress = address(uint160(uint256(implementationRaw))); - - MyOFTUpgradeable oftUpgradeableImplementation = MyOFTUpgradeable(implementationAddress); - - vm.expectRevert(Initializable.InvalidInitialization.selector); - oftUpgradeableImplementation.initialize("oftUpgradeable", "oftUpgradeable", address(this)); - - EndpointV2Mock endpoint = EndpointV2Mock(address(oftUpgradeable.endpoint())); - assertEq(endpoint.delegates(address(oftUpgradeable)), address(this)); - assertEq(endpoint.delegates(implementationAddress), address(0)); - } - - function test_oft_adapter_implementation_initialization_disabled() public { - MyOFTAdapterUpgradeable oftAdapter = MyOFTAdapterUpgradeable( - _deployContractAndProxy( - type(MyOFTAdapterUpgradeable).creationCode, - abi.encode(address(cERC20Mock), address(endpoints[cEid])), - abi.encodeWithSelector(MyOFTAdapterUpgradeable.initialize.selector, address(this)) - ) - ); - - bytes32 implementationRaw = vm.load(address(oftAdapter), IMPLEMENTATION_SLOT); - address implementationAddress = address(uint160(uint256(implementationRaw))); - - MyOFTAdapterUpgradeable oftAdapterImplementation = MyOFTAdapterUpgradeable(implementationAddress); - - vm.expectRevert(Initializable.InvalidInitialization.selector); - oftAdapterImplementation.initialize(address(this)); - - EndpointV2Mock endpoint = EndpointV2Mock(address(oftAdapter.endpoint())); - assertEq(endpoint.delegates(address(oftAdapter)), address(this)); - assertEq(endpoint.delegates(implementationAddress), address(0)); - } -} diff --git a/plume-oft-adapter-migration/test/hardhat/MyOFTUpgradeable.test.ts b/plume-oft-adapter-migration/test/hardhat/MyOFTUpgradeable.test.ts deleted file mode 100644 index ce11c5f4..00000000 --- a/plume-oft-adapter-migration/test/hardhat/MyOFTUpgradeable.test.ts +++ /dev/null @@ -1,98 +0,0 @@ -import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers' -import { expect } from 'chai' -import { Contract, ContractFactory } from 'ethers' -import { deployments, ethers, upgrades } from 'hardhat' - -describe('MyOFTUpgradeable Test', () => { - // Constant representing a mock Endpoint ID for testing purposes - const eidA = 1 - const eidB = 2 - // Declaration of variables to be used in the test suite - let MyOFT: ContractFactory - let EndpointV2Mock: ContractFactory - let ownerA: SignerWithAddress - let ownerB: SignerWithAddress - let endpointOwner: SignerWithAddress - let myOFTA: Contract - let myOFTB: Contract - let mockEndpointV2A: Contract - let mockEndpointV2B: Contract - - before(async function () { - MyOFT = await ethers.getContractFactory('MyOFTUpgradeable') - - // Fetching the first three signers (accounts) from Hardhat's local Ethereum network - const signers = await ethers.getSigners() - - ;[ownerA, ownerB, endpointOwner] = signers - - // The EndpointV2Mock contract comes from @layerzerolabs/test-devtools-evm-hardhat package - // and its artifacts are connected as external artifacts to this project - // - // Unfortunately, hardhat itself does not yet provide a way of connecting external artifacts, - // so we rely on hardhat-deploy to create a ContractFactory for EndpointV2Mock - // - // See https://github.com/NomicFoundation/hardhat/issues/1040 - const EndpointV2MockArtifact = await deployments.getArtifact('EndpointV2Mock') - EndpointV2Mock = new ContractFactory(EndpointV2MockArtifact.abi, EndpointV2MockArtifact.bytecode, endpointOwner) - }) - - // beforeEach hook for setup that runs before each test in the block - beforeEach(async function () { - // Deploying a mock LZEndpoint with the given Endpoint ID - mockEndpointV2A = await EndpointV2Mock.deploy(eidA) - mockEndpointV2B = await EndpointV2Mock.deploy(eidB) - - // Deploying two instances of MyOFT contract with different identifiers and linking them to the mock LZEndpoint - myOFTA = await MyOFT.deploy(mockEndpointV2A.address) - myOFTB = await MyOFT.deploy(mockEndpointV2B.address) - - // Setting destination endpoints in the LZEndpoint mock for each MyOFT instance - await mockEndpointV2A.setDestLzEndpoint(myOFTB.address, mockEndpointV2B.address) - await mockEndpointV2B.setDestLzEndpoint(myOFTA.address, mockEndpointV2A.address) - }) - - it('should upgrade', async () => { - // Deploying the upgradeable contract - const MyOFTUpgradeable = await ethers.getContractFactory('MyOFTUpgradeable') - const myOFTUpgradeable = await upgrades.deployProxy(MyOFTUpgradeable, ['MyOFT', 'MOFT', ownerA.address], { - initializer: 'initialize', - constructorArgs: [mockEndpointV2A.address], - unsafeAllow: ['constructor', 'state-variable-immutable'], - }) - const myOFTUpgradeableImpl = (await upgrades.admin.getInstance(ownerA)).functions.getProxyImplementation( - myOFTUpgradeable.address - ) - - // Upgrade the contract to the mock, so it has a "mint" function - const MyOFTUpgradeableMock = await ethers.getContractFactory('MyOFTUpgradeableMock') - const myOFTUpgradeableMock = await upgrades.upgradeProxy(myOFTUpgradeable.address, MyOFTUpgradeableMock, { - constructorArgs: [mockEndpointV2A.address], - unsafeAllow: ['constructor', 'state-variable-immutable'], - }) - - // Ensure the proxy remains constant after the upgrade - expect(myOFTUpgradeable.address).to.equal(myOFTUpgradeableMock.address) - const myOFTUpgradeableMockImpl = (await upgrades.admin.getInstance(ownerA)).functions.getProxyImplementation( - myOFTUpgradeableMock.address - ) - // ensure the implementation address changed - expect(myOFTUpgradeableImpl).to.not.equal(myOFTUpgradeableMockImpl) - const [intialBalance] = await myOFTUpgradeableMock.functions.balanceOf(ownerA.address) - // ensure we can mint now - await (await myOFTUpgradeableMock.functions.mint(ownerA.address, 100)).wait() - const [finalBalance] = await myOFTUpgradeableMock.functions.balanceOf(ownerA.address) - expect(finalBalance.toNumber()).to.equal(intialBalance.add(100).toNumber()) - - // Downgrade the contract to remove mint - const myOFTUpgradeableAgain = await upgrades.upgradeProxy(myOFTUpgradeableMock.address, MyOFTUpgradeable, { - constructorArgs: [mockEndpointV2A.address], - unsafeAllow: ['constructor', 'state-variable-immutable'], - }) - // Ensure the proxy remains constant after the upgrade - expect(myOFTUpgradeableMock.address).to.equal(myOFTUpgradeableAgain.address) - // Ensure that the tokens don't disappear into thin air - const [postUpgradeBalance] = await myOFTUpgradeableMock.functions.balanceOf(ownerA.address) - expect(postUpgradeBalance.toNumber()).to.equal(finalBalance.toNumber()) - }) -}) diff --git a/plume-oft-adapter-migration/test/helpers/TestHelper.sol b/plume-oft-adapter-migration/test/helpers/TestHelper.sol new file mode 100644 index 00000000..8216cec7 --- /dev/null +++ b/plume-oft-adapter-migration/test/helpers/TestHelper.sol @@ -0,0 +1,486 @@ +// SPDX-License-Identifier: UNLICENSED + +pragma solidity ^0.8.18; + +import { Test } from "forge-std/Test.sol"; +import { DoubleEndedQueue } from "@openzeppelin/contracts/utils/structs/DoubleEndedQueue.sol"; + +import { UlnConfig, SetDefaultUlnConfigParam } from "@layerzerolabs/lz-evm-messagelib-v2/contracts/uln/UlnBase.sol"; +import { SetDefaultExecutorConfigParam, ExecutorConfig } from "@layerzerolabs/lz-evm-messagelib-v2/contracts/SendLibBase.sol"; +import { ReceiveUln302 } from "@layerzerolabs/lz-evm-messagelib-v2/contracts/uln/uln302/ReceiveUln302.sol"; +import { IDVN } from "@layerzerolabs/lz-evm-messagelib-v2/contracts/uln/interfaces/IDVN.sol"; +import { DVN, ExecuteParam } from "@layerzerolabs/lz-evm-messagelib-v2/contracts/uln/dvn/DVN.sol"; +import { DVNFeeLib } from "@layerzerolabs/lz-evm-messagelib-v2/contracts/uln/dvn/DVNFeeLib.sol"; +import { IExecutor } from "@layerzerolabs/lz-evm-messagelib-v2/contracts/interfaces/IExecutor.sol"; +import { Executor } from "@layerzerolabs/lz-evm-messagelib-v2/contracts/Executor.sol"; +import { PriceFeed } from "@layerzerolabs/lz-evm-messagelib-v2/contracts/PriceFeed.sol"; +import { ILayerZeroPriceFeed } from "@layerzerolabs/lz-evm-messagelib-v2/contracts/interfaces/ILayerZeroPriceFeed.sol"; +import { IReceiveUlnE2 } from "@layerzerolabs/lz-evm-messagelib-v2/contracts/uln/interfaces/IReceiveUlnE2.sol"; +import { ReceiveUln302 } from "@layerzerolabs/lz-evm-messagelib-v2/contracts/uln/uln302/ReceiveUln302.sol"; +import { IMessageLib } from "@layerzerolabs/lz-evm-protocol-v2/contracts/interfaces/IMessageLib.sol"; +import { EndpointV2 } from "@layerzerolabs/lz-evm-protocol-v2/contracts/EndpointV2.sol"; +import { ExecutorOptions } from "@layerzerolabs/lz-evm-protocol-v2/contracts/messagelib/libs/ExecutorOptions.sol"; +import { PacketV1Codec } from "@layerzerolabs/lz-evm-protocol-v2/contracts/messagelib/libs/PacketV1Codec.sol"; +import { Origin } from "@layerzerolabs/lz-evm-protocol-v2/contracts/interfaces/ILayerZeroEndpointV2.sol"; + +import { OApp } from "@layerzerolabs/lz-evm-oapp-v2/contracts/oapp/OApp.sol"; +import { OptionsBuilder } from "@layerzerolabs/lz-evm-oapp-v2/contracts/oapp/libs/OptionsBuilder.sol"; + +import { OptionsHelper } from "@layerzerolabs/lz-evm-oapp-v2/test/OptionsHelper.sol"; +import { SendUln302Mock as SendUln302 } from "./mocks/SendUln302Mock.sol"; +import { SimpleMessageLibMock } from "./mocks/SimpleMessageLibMock.sol"; +import "@layerzerolabs/lz-evm-oapp-v2/test/mocks/ExecutorFeeLibMock.sol"; + +// file copied and modified from original package to avoid problems with stack too deep +contract TestHelper is Test, OptionsHelper { + using OptionsBuilder for bytes; + + enum LibraryType { + UltraLightNode, + SimpleMessageLib + } + + struct EndpointSetup { + EndpointV2[] endpointList; + uint32[] eidList; + address[] sendLibs; + address[] receiveLibs; + address[] readLibs; + address[] signers; + PriceFeed priceFeed; + } + + struct LibrarySetup { + SendUln302 sendUln; + ReceiveUln302 receiveUln; + Executor executor; + DVN dvn; + ExecutorFeeLib executorLib; + DVNFeeLib dvnLib; + } + + struct ConfigParams { + IExecutor.DstConfigParam[] executorConfigParams; + IDVN.DstConfigParam[] dvnConfigParams; + } + + using DoubleEndedQueue for DoubleEndedQueue.Bytes32Deque; + using PacketV1Codec for bytes; + + mapping(uint32 => mapping(bytes32 => DoubleEndedQueue.Bytes32Deque)) packetsQueue; // dstEid => dstUA => guids queue + mapping(bytes32 => bytes) packets; // guid => packet bytes + mapping(bytes32 => bytes) optionsLookup; // guid => options + + mapping(uint32 => address) endpoints; // eid => endpoint + + uint256 public constant TREASURY_GAS_CAP = 1000000000000; + uint256 public constant TREASURY_GAS_FOR_FEE_CAP = 100000; + + uint128 public executorValueCap = 0.1 ether; + + EndpointSetup internal endpointSetup; + LibrarySetup internal libSetup; + + function setUp() public virtual {} + + /** + * @dev set executorValueCap if more than 0.1 ether is necessary + * @dev this must be called prior to setUpEndpoints() if the value is to be used + * @param _valueCap amount executor can pass as msg.value to lzReceive() + */ + function setExecutorValueCap(uint128 _valueCap) public { + executorValueCap = _valueCap; + } + + /** + * @dev setup the endpoints + * @param _endpointNum num of endpoints + */ + function setUpEndpoints(uint8 _endpointNum, LibraryType _libraryType) public { + endpointSetup.endpointList = new EndpointV2[](_endpointNum); + endpointSetup.eidList = new uint32[](_endpointNum); + endpointSetup.sendLibs = new address[](_endpointNum); + endpointSetup.receiveLibs = new address[](_endpointNum); + endpointSetup.signers = new address[](1); + endpointSetup.signers[0] = vm.addr(1); + + { + // deploy endpoints + for (uint8 i = 0; i < _endpointNum; i++) { + uint32 eid = i + 1; + endpointSetup.eidList[i] = eid; + endpointSetup.endpointList[i] = new EndpointV2(eid, address(this)); + registerEndpoint(endpointSetup.endpointList[i]); + } + } + + // @dev oz4/5 breaking change... constructor init + endpointSetup.priceFeed = new PriceFeed(); + endpointSetup.priceFeed.initialize(address(this)); + + for (uint8 i = 0; i < _endpointNum; i++) { + if (_libraryType == LibraryType.UltraLightNode) { + address endpointAddr = address(endpointSetup.endpointList[i]); + + { + libSetup.sendUln = new SendUln302(payable(this), endpointAddr, TREASURY_GAS_CAP, TREASURY_GAS_FOR_FEE_CAP); + libSetup.receiveUln = new ReceiveUln302(endpointAddr); + endpointSetup.endpointList[i].registerLibrary(address(libSetup.sendUln)); + endpointSetup.endpointList[i].registerLibrary(address(libSetup.receiveUln)); + endpointSetup.sendLibs[i] = address(libSetup.sendUln); + endpointSetup.receiveLibs[i] = address(libSetup.receiveUln); + } + + { + libSetup.executor = new Executor(); + address[] memory admins = new address[](1); + admins[0] = address(this); + + address[] memory messageLibs = new address[](2); + messageLibs[0] = address(libSetup.sendUln); + messageLibs[1] = address(libSetup.receiveUln); + + libSetup.executor.initialize( + endpointAddr, + address(0x0), + messageLibs, + address(endpointSetup.priceFeed), + address(this), + admins + ); + ExecutorFeeLib executorLib = new ExecutorFeeLibMock(); + libSetup.executor.setWorkerFeeLib(address(executorLib)); + + libSetup.dvn = new DVN(i + 1, messageLibs, address(endpointSetup.priceFeed), endpointSetup.signers, 1, admins); + DVNFeeLib dvnLib = new DVNFeeLib(1e18); + libSetup.dvn.setWorkerFeeLib(address(dvnLib)); + } + + ConfigParams memory configParams; + configParams.executorConfigParams = new IExecutor.DstConfigParam[](_endpointNum + 1); + configParams.dvnConfigParams = new IDVN.DstConfigParam[](_endpointNum + 1); + + for (uint8 j = 0; j < _endpointNum; j++) { + if (i == j) continue; + uint32 dstEid = j + 1; + + address[] memory defaultDVNs = new address[](1); + address[] memory optionalDVNs = new address[](0); + defaultDVNs[0] = address(libSetup.dvn); + + { + SetDefaultUlnConfigParam[] memory params = new SetDefaultUlnConfigParam[](1); + UlnConfig memory ulnConfig = UlnConfig( + 100, + uint8(defaultDVNs.length), + uint8(optionalDVNs.length), + 0, + defaultDVNs, + optionalDVNs + ); + params[0] = SetDefaultUlnConfigParam(dstEid, ulnConfig); + libSetup.sendUln.setDefaultUlnConfigs(params); + } + + { + SetDefaultExecutorConfigParam[] memory params = new SetDefaultExecutorConfigParam[](1); + ExecutorConfig memory executorConfig = ExecutorConfig(10000, address(libSetup.executor)); + params[0] = SetDefaultExecutorConfigParam(dstEid, executorConfig); + libSetup.sendUln.setDefaultExecutorConfigs(params); + } + + { + SetDefaultUlnConfigParam[] memory params = new SetDefaultUlnConfigParam[](1); + UlnConfig memory ulnConfig = UlnConfig( + 100, + uint8(defaultDVNs.length), + uint8(optionalDVNs.length), + 0, + defaultDVNs, + optionalDVNs + ); + params[0] = SetDefaultUlnConfigParam(dstEid, ulnConfig); + libSetup.receiveUln.setDefaultUlnConfigs(params); + } + + // executor config + configParams.executorConfigParams[j] = IExecutor.DstConfigParam({ + dstEid: dstEid, + baseGas: 5000, + multiplierBps: 10000, + floorMarginUSD: 1e10, + nativeCap: executorValueCap + }); + + // dvn config + configParams.dvnConfigParams[j] = IDVN.DstConfigParam({ + dstEid: dstEid, + gas: 5000, + multiplierBps: 10000, + floorMarginUSD: 1e10 + }); + + uint128 denominator = endpointSetup.priceFeed.getPriceRatioDenominator(); + ILayerZeroPriceFeed.UpdatePrice[] memory prices = new ILayerZeroPriceFeed.UpdatePrice[](1); + prices[0] = ILayerZeroPriceFeed.UpdatePrice( + dstEid, + ILayerZeroPriceFeed.Price(1 * denominator, 1, 1) + ); + endpointSetup.priceFeed.setPrice(prices); + } + libSetup.executor.setDstConfig(configParams.executorConfigParams); + libSetup.dvn.setDstConfig(configParams.dvnConfigParams); + } else if (_libraryType == LibraryType.SimpleMessageLib) { + SimpleMessageLibMock messageLib = new SimpleMessageLibMock(payable(this), address(endpointSetup.endpointList[i])); + endpointSetup.endpointList[i].registerLibrary(address(messageLib)); + endpointSetup.sendLibs[i] = address(messageLib); + endpointSetup.receiveLibs[i] = address(messageLib); + } else { + revert("invalid library type"); + } + } + + // config up + for (uint8 i = 0; i < _endpointNum; i++) { + EndpointV2 endpoint = endpointSetup.endpointList[i]; + for (uint8 j = 0; j < _endpointNum; j++) { + if (i == j) continue; + endpoint.setDefaultSendLibrary(j + 1, endpointSetup.sendLibs[i]); + endpoint.setDefaultReceiveLibrary(j + 1, endpointSetup.receiveLibs[i], 0); + } + } + } + + /** + * @dev setup UAs, only if the UA has `endpoint` address as the unique parameter + */ + function setupOApps( + bytes memory _oappCreationCode, + uint8 _startEid, + uint8 _oappNum + ) public returns (address[] memory oapps) { + oapps = new address[](_oappNum); + for (uint8 eid = _startEid; eid < _startEid + _oappNum; eid++) { + address oapp = _deployOApp(_oappCreationCode, abi.encode(address(endpoints[eid]), address(this), true)); + oapps[eid - _startEid] = oapp; + } + // config + wireOApps(oapps); + } + + function wireOApps(address[] memory oapps) public { + uint256 size = oapps.length; + for (uint256 i = 0; i < size; i++) { + OApp localOApp = OApp(payable(oapps[i])); + for (uint256 j = 0; j < size; j++) { + if (i == j) continue; + OApp remoteOApp = OApp(payable(oapps[j])); + uint32 remoteEid = (remoteOApp.endpoint()).eid(); + localOApp.setPeer(remoteEid, addressToBytes32(address(remoteOApp))); + } + } + } + + function _deployOApp(bytes memory _oappBytecode, bytes memory _constructorArgs) internal returns (address addr) { + bytes memory bytecode = bytes.concat(abi.encodePacked(_oappBytecode), _constructorArgs); + assembly { + addr := create(0, add(bytecode, 0x20), mload(bytecode)) + if iszero(extcodesize(addr)) { + revert(0, 0) + } + } + } + + function schedulePacket(bytes calldata _packetBytes, bytes calldata _options) public { + uint32 dstEid = _packetBytes.dstEid(); + bytes32 dstAddress = _packetBytes.receiver(); + DoubleEndedQueue.Bytes32Deque storage queue = packetsQueue[dstEid][dstAddress]; + // front in, back out + bytes32 guid = _packetBytes.guid(); + queue.pushFront(guid); + packets[guid] = _packetBytes; + optionsLookup[guid] = _options; + } + + /** + * @dev verify packets to destination chain's UA address + * @param _dstEid destination eid + * @param _dstAddress destination address + */ + function verifyPackets(uint32 _dstEid, bytes32 _dstAddress) public { + verifyPackets(_dstEid, _dstAddress, 0, address(0x0)); + } + + /** + * @dev verify packets to destination chain's UA address + * @param _dstEid destination eid + * @param _dstAddress destination address + */ + function verifyPackets(uint32 _dstEid, address _dstAddress) public { + verifyPackets(_dstEid, bytes32(uint256(uint160(_dstAddress))), 0, address(0x0)); + } + + /** + * @dev dst UA receive/execute packets + * @dev will NOT work calling this directly with composer IF the composed payload is different from the lzReceive msg payload + */ + function verifyPackets(uint32 _dstEid, bytes32 _dstAddress, uint256 _packetAmount, address _composer) public { + require(endpoints[_dstEid] != address(0), "endpoint not yet registered"); + + DoubleEndedQueue.Bytes32Deque storage queue = packetsQueue[_dstEid][_dstAddress]; + uint256 pendingPacketsSize = queue.length(); + uint256 numberOfPackets; + if (_packetAmount == 0) { + numberOfPackets = queue.length(); + } else { + numberOfPackets = pendingPacketsSize > _packetAmount ? _packetAmount : pendingPacketsSize; + } + while (numberOfPackets > 0) { + numberOfPackets--; + // front in, back out + bytes32 guid = queue.popBack(); + bytes memory packetBytes = packets[guid]; + this.assertGuid(packetBytes, guid); + this.validatePacket(packetBytes); + + bytes memory options = optionsLookup[guid]; + if (_executorOptionExists(options, ExecutorOptions.OPTION_TYPE_NATIVE_DROP)) { + (uint256 amount, bytes32 receiver) = _parseExecutorNativeDropOption(options); + address to = address(uint160(uint256(receiver))); + (bool sent, ) = to.call{ value: amount }(""); + require(sent, "Failed to send Ether"); + } + if (_executorOptionExists(options, ExecutorOptions.OPTION_TYPE_LZRECEIVE)) { + this.lzReceive(packetBytes, options); + } + if (_composer != address(0) && _executorOptionExists(options, ExecutorOptions.OPTION_TYPE_LZCOMPOSE)) { + this.lzCompose(packetBytes, options, guid, _composer); + } + } + } + + function lzReceive(bytes calldata _packetBytes, bytes memory _options) external payable { + EndpointV2 endpoint = EndpointV2(endpoints[_packetBytes.dstEid()]); + (uint256 gas, uint256 value) = OptionsHelper._parseExecutorLzReceiveOption(_options); + + Origin memory origin = Origin(_packetBytes.srcEid(), _packetBytes.sender(), _packetBytes.nonce()); + endpoint.lzReceive{ value: value, gas: gas }( + origin, + _packetBytes.receiverB20(), + _packetBytes.guid(), + _packetBytes.message(), + bytes("") + ); + } + + function lzCompose( + bytes calldata _packetBytes, + bytes memory _options, + bytes32 _guid, + address _composer + ) external payable { + this.lzCompose( + _packetBytes.dstEid(), + _packetBytes.receiverB20(), + _options, + _guid, + _composer, + _packetBytes.message() + ); + } + + // @dev the verifyPackets does not know the composeMsg if it is NOT the same as the original lzReceive payload + // Can call this directly from your test to lzCompose those types of packets + function lzCompose( + uint32 _dstEid, + address _from, + bytes memory _options, + bytes32 _guid, + address _to, + bytes calldata _composerMsg + ) external payable { + EndpointV2 endpoint = EndpointV2(endpoints[_dstEid]); + (uint16 index, uint256 gas, uint256 value) = _parseExecutorLzComposeOption(_options); + endpoint.lzCompose{ value: value, gas: gas }(_from, _to, _guid, index, _composerMsg, bytes("")); + } + + function validatePacket(bytes calldata _packetBytes) external { + uint32 dstEid = _packetBytes.dstEid(); + EndpointV2 endpoint = EndpointV2(endpoints[dstEid]); + (address receiveLib, ) = endpoint.getReceiveLibrary(_packetBytes.receiverB20(), _packetBytes.srcEid()); + ReceiveUln302 dstUln = ReceiveUln302(receiveLib); + + (uint64 major, , ) = IMessageLib(receiveLib).version(); + if (major == 3) { + // it is ultra light node + bytes memory config = dstUln.getConfig(_packetBytes.srcEid(), _packetBytes.receiverB20(), 2); // CONFIG_TYPE_ULN + DVN dvn = DVN(abi.decode(config, (UlnConfig)).requiredDVNs[0]); + + bytes memory packetHeader = _packetBytes.header(); + bytes32 payloadHash = keccak256(_packetBytes.payload()); + + // sign + bytes memory signatures; + bytes memory verifyCalldata = abi.encodeWithSelector( + IReceiveUlnE2.verify.selector, + packetHeader, + payloadHash, + 100 + ); + { + bytes32 hash = dvn.hashCallData(dstEid, address(dstUln), verifyCalldata, block.timestamp + 1000); + bytes32 ethSignedMessageHash = keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)); + (uint8 v, bytes32 r, bytes32 s) = vm.sign(1, ethSignedMessageHash); // matches dvn signer + signatures = abi.encodePacked(r, s, v); + } + ExecuteParam[] memory params = new ExecuteParam[](1); + params[0] = ExecuteParam(dstEid, address(dstUln), verifyCalldata, block.timestamp + 1000, signatures); + dvn.execute(params); + + // commit verification + bytes memory callData = abi.encodeWithSelector( + IReceiveUlnE2.commitVerification.selector, + packetHeader, + payloadHash + ); + { + bytes32 hash = dvn.hashCallData(dstEid, address(dstUln), callData, block.timestamp + 1000); + bytes32 ethSignedMessageHash = keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)); + (uint8 v, bytes32 r, bytes32 s) = vm.sign(1, ethSignedMessageHash); // matches dvn signer + signatures = abi.encodePacked(r, s, v); + } + params[0] = ExecuteParam(dstEid, address(dstUln), callData, block.timestamp + 1000, signatures); + dvn.execute(params); + } else { + SimpleMessageLibMock(payable(receiveLib)).validatePacket(_packetBytes); + } + } + + function assertGuid(bytes calldata packetBytes, bytes32 guid) external pure { + bytes32 packetGuid = packetBytes.guid(); + require(packetGuid == guid, "guid not match"); + } + + function registerEndpoint(EndpointV2 endpoint) public { + endpoints[endpoint.eid()] = address(endpoint); + } + + function hasPendingPackets(uint16 _dstEid, bytes32 _dstAddress) public view returns (bool flag) { + DoubleEndedQueue.Bytes32Deque storage queue = packetsQueue[_dstEid][_dstAddress]; + return queue.length() > 0; + } + + function getNextInflightPacket(uint16 _dstEid, bytes32 _dstAddress) public view returns (bytes memory packetBytes) { + DoubleEndedQueue.Bytes32Deque storage queue = packetsQueue[_dstEid][_dstAddress]; + if (queue.length() > 0) { + bytes32 guid = queue.back(); + packetBytes = packets[guid]; + } + } + + function addressToBytes32(address _addr) internal pure returns (bytes32) { + return bytes32(uint256(uint160(_addr))); + } + + receive() external payable {} +} diff --git a/plume-oft-adapter-migration/test/helpers/mocks/SendUln302Mock.sol b/plume-oft-adapter-migration/test/helpers/mocks/SendUln302Mock.sol new file mode 100644 index 00000000..19e6a058 --- /dev/null +++ b/plume-oft-adapter-migration/test/helpers/mocks/SendUln302Mock.sol @@ -0,0 +1,32 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.0; + +import { Packet } from "@layerzerolabs/lz-evm-protocol-v2/contracts/interfaces/ISendLib.sol"; +import { MessagingFee } from "@layerzerolabs/lz-evm-protocol-v2/contracts/interfaces/ILayerZeroEndpointV2.sol"; +import { SendUln302 } from "@layerzerolabs/lz-evm-messagelib-v2/contracts/uln/uln302/SendUln302.sol"; + +import { TestHelper } from "../TestHelper.sol"; + +// file copied and modified from original package to avoid problems with stack too deep +contract SendUln302Mock is SendUln302 { + // offchain packets schedule + TestHelper public testHelper; + + constructor( + address payable _verifyHelper, + address _endpoint, + uint256 _treasuryGasCap, + uint256 _treasuryGasForFeeCap + ) SendUln302(_endpoint, _treasuryGasCap, _treasuryGasForFeeCap) { + testHelper = TestHelper(_verifyHelper); + } + + function send( + Packet calldata _packet, + bytes calldata _options, + bool _payInLzToken + ) public override returns (MessagingFee memory fee, bytes memory encodedPacket) { + (fee, encodedPacket) = super.send(_packet, _options, _payInLzToken); + testHelper.schedulePacket(encodedPacket, _options); + } +} diff --git a/plume-oft-adapter-migration/test/helpers/mocks/SimpleMessageLibMock.sol b/plume-oft-adapter-migration/test/helpers/mocks/SimpleMessageLibMock.sol new file mode 100644 index 00000000..c3258b6b --- /dev/null +++ b/plume-oft-adapter-migration/test/helpers/mocks/SimpleMessageLibMock.sol @@ -0,0 +1,20 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.0; + +import { SimpleMessageLib } from "@layerzerolabs/lz-evm-protocol-v2/contracts/messagelib/SimpleMessageLib.sol"; + +import { TestHelper } from "../TestHelper.sol"; + +// file copied and modified from original package to avoid problems with stack too deep +contract SimpleMessageLibMock is SimpleMessageLib { + // offchain packets schedule + TestHelper public testHelper; + + constructor(address payable _verifyHelper, address _endpoint) SimpleMessageLib(_endpoint, address(0x0)) { + testHelper = TestHelper(_verifyHelper); + } + + function _handleMessagingParamsHook(bytes memory _encodedPacket, bytes memory _options) internal override { + testHelper.schedulePacket(_encodedPacket, _options); + } +} diff --git a/plume-oft-adapter-migration/test/mocks/MockArbNativeOFTAdapter.sol b/plume-oft-adapter-migration/test/mocks/MockArbNativeOFTAdapter.sol new file mode 100644 index 00000000..e3ad0960 --- /dev/null +++ b/plume-oft-adapter-migration/test/mocks/MockArbNativeOFTAdapter.sol @@ -0,0 +1,30 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.22; + +import { ArbNativeOFTAdapter } from "../../src/L3/ArbNativeOFTAdapter.sol"; + +contract MockArbNativeOFTAdapter is ArbNativeOFTAdapter { + /** + * @param _localDecimals The decimals of the native on the local chain (this chain). 18 on ETH. + * @param _lzEndpoint The LayerZero endpoint address. + * @param _delegate The delegate capable of making OApp configurations inside of the endpoint. + */ + constructor( + uint8 _localDecimals, + address _lzEndpoint, + address _delegate + ) ArbNativeOFTAdapter(_localDecimals, _lzEndpoint, _delegate) {} + + // @dev expose internal functions for testing purposes + function debit( + uint256 _amountToSendLD, + uint256 _minAmountToCreditLD, + uint32 _dstEid + ) public returns (uint256 amountDebitedLD, uint256 amountToCreditLD) { + return _debit(_amountToSendLD, _minAmountToCreditLD, _dstEid); + } + + function credit(address _to, uint256 _amountToCreditLD, uint32 _srcEid) public returns (uint256 amountReceivedLD) { + return _credit(_to, _amountToCreditLD, _srcEid); + } +} \ No newline at end of file diff --git a/plume-oft-adapter-migration/test/mocks/MockEndpoint.sol b/plume-oft-adapter-migration/test/mocks/MockEndpoint.sol new file mode 100644 index 00000000..3e35ab16 --- /dev/null +++ b/plume-oft-adapter-migration/test/mocks/MockEndpoint.sol @@ -0,0 +1,163 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.22; + +import { ILayerZeroEndpointV2, MessagingParams, MessagingFee, MessagingReceipt, Origin } from "@layerzerolabs/lz-evm-protocol-v2/contracts/interfaces/ILayerZeroEndpointV2.sol"; +import { SetConfigParam } from "@layerzerolabs/lz-evm-protocol-v2/contracts/interfaces/IMessageLibManager.sol"; + +contract MockEndpoint is ILayerZeroEndpointV2 { + mapping(address oapp => address delegate) public delegates; + + // Implementations for ILayerZeroEndpointV2 + function quote(MessagingParams calldata /*_params*/, address /*_sender*/) external pure override returns (MessagingFee memory) { + return MessagingFee(0, 0); + } + + function send( + MessagingParams calldata /*_params*/, + address /*_refundAddress*/ + ) external payable override returns (MessagingReceipt memory) { + return MessagingReceipt(bytes32(0), 0, MessagingFee(0, 0)); + } + + function verify(Origin calldata /*_origin*/, address /*_receiver*/, bytes32 /*_payloadHash*/) external override {} + + function verifiable(Origin calldata /*_origin*/, address /*_receiver*/) external pure override returns (bool) { + return false; + } + + function initializable(Origin calldata /*_origin*/, address /*_receiver*/) external pure override returns (bool) { + return false; + } + + function lzReceive( + Origin calldata /*_origin*/, + address /*_receiver*/, + bytes32 /*_guid*/, + bytes calldata /*_message*/, + bytes calldata /*_extraData*/ + ) external payable override {} + + function clear(address /*_oapp*/, Origin calldata /*_origin*/, bytes32 /*_guid*/, bytes calldata /*_message*/) external override {} + + function setLzToken(address /*_lzToken*/) external override {} + + function lzToken() external pure override returns (address) { + return address(0); + } + + function nativeToken() external pure override returns (address) { + return address(0); + } + + function setDelegate(address _delegate) external override { + delegates[msg.sender] = _delegate; + emit DelegateSet(msg.sender, _delegate); + } + + // Implementations for IMessageLibManager + function registerLibrary(address /*_lib*/) external override {} + function isRegisteredLibrary(address /*_lib*/) external pure override returns (bool) { + return false; + } + function getRegisteredLibraries() external pure override returns (address[] memory) { + address[] memory emptyArray; + return emptyArray; + } + function setDefaultSendLibrary(uint32 /*_eid*/, address /*_newLib*/) external override {} + function defaultSendLibrary(uint32 /*_eid*/) external pure override returns (address) { + return address(0); + } + function setDefaultReceiveLibrary(uint32 /*_eid*/, address /*_newLib*/, uint256 /*_timeout*/) external override {} + function defaultReceiveLibrary(uint32 /*_eid*/) external pure override returns (address) { + return address(0); + } + function setDefaultReceiveLibraryTimeout(uint32 /*_eid*/, address /*_lib*/, uint256 /*_expiry*/) external override {} + function defaultReceiveLibraryTimeout(uint32 /*_eid*/) external pure override returns (address lib, uint256 expiry) { + return (address(0), 0); + } + function isSupportedEid(uint32 /*_eid*/) external pure override returns (bool) { + return false; + } + function isValidReceiveLibrary(address /*_receiver*/, uint32 /*_eid*/, address /*_lib*/) external pure override returns (bool) { + return false; + } + function setSendLibrary(address /*_oapp*/, uint32 /*_eid*/, address /*_newLib*/) external override {} + function getSendLibrary(address /*_sender*/, uint32 /*_eid*/) external pure override returns (address lib) { + return address(0); + } + function isDefaultSendLibrary(address /*_sender*/, uint32 /*_eid*/) external pure override returns (bool) { + return false; + } + function setReceiveLibrary(address /*_oapp*/, uint32 /*_eid*/, address /*_newLib*/, uint256 /*_gracePeriod*/) external override {} + function getReceiveLibrary(address /*_receiver*/, uint32 /*_eid*/) external pure override returns (address lib, bool isDefault) { + return (address(0), false); + } + function setReceiveLibraryTimeout(address /*_oapp*/, uint32 /*_eid*/, address /*_lib*/, uint256 /*_gracePeriod*/) external override {} + function receiveLibraryTimeout(address /*_receiver*/, uint32 /*_eid*/) external pure override returns (address lib, uint256 expiry) { + return (address(0), 0); + } + function setConfig(address /*_oapp*/, address /*_lib*/, SetConfigParam[] calldata /*_params*/) external override {} + function getConfig( + address /*_oapp*/, + address /*_lib*/, + uint32 /*_eid*/, + uint32 /*_configType*/ + ) external pure override returns (bytes memory config) { + return ""; + } + + // Implementations for IMessagingComposer + function composeQueue( + address /*_from*/, + address /*_to*/, + bytes32 /*_guid*/, + uint16 /*_index*/ + ) external pure override returns (bytes32) { + return bytes32(0); + } + function sendCompose(address /*_to*/, bytes32 /*_guid*/, uint16 /*_index*/, bytes calldata /*_message*/) external override {} + function lzCompose( + address /*_from*/, + address /*_to*/, + bytes32 /*_guid*/, + uint16 /*_index*/, + bytes calldata /*_message*/, + bytes calldata /*_extraData*/ + ) external payable override {} + + // Implementations for IMessagingChannel + function eid() external pure override returns (uint32) { + return 10777; + } + function skip(address /*_oapp*/, uint32 /*_srcEid*/, bytes32 /*_sender*/, uint64 /*_nonce*/) external override {} + function nilify(address /*_oapp*/, uint32 /*_srcEid*/, bytes32 /*_sender*/, uint64 /*_nonce*/, bytes32 /*_payloadHash*/) external override {} + function burn(address /*_oapp*/, uint32 /*_srcEid*/, bytes32 /*_sender*/, uint64 /*_nonce*/, bytes32 /*_payloadHash*/) external override {} + function nextGuid(address /*_sender*/, uint32 /*_dstEid*/, bytes32 /*_receiver*/) external pure override returns (bytes32) { + return bytes32(0); + } + function inboundNonce(address /*_receiver*/, uint32 /*_srcEid*/, bytes32 /*_sender*/) external pure override returns (uint64) { + return 0; + } + function outboundNonce(address /*_sender*/, uint32 /*_dstEid*/, bytes32 /*_receiver*/) external pure override returns (uint64) { + return 0; + } + function inboundPayloadHash( + address /*_receiver*/, + uint32 /*_srcEid*/, + bytes32 /*_sender*/, + uint64 /*_nonce*/ + ) external pure override returns (bytes32) { + return bytes32(0); + } + function lazyInboundNonce(address /*_receiver*/, uint32 /*_srcEid*/, bytes32 /*_sender*/) external pure override returns (uint64) { + return 0; + } + + // Implementations for IMessagingContext + function isSendingMessage() external pure override returns (bool) { + return false; + } + function getSendContext() external pure override returns (uint32 dstEid, address sender) { + return (0, address(0)); + } +} \ No newline at end of file diff --git a/plume-oft-adapter-migration/test/mocks/MockNativeTokenManager.sol b/plume-oft-adapter-migration/test/mocks/MockNativeTokenManager.sol new file mode 100644 index 00000000..6f04a2f5 --- /dev/null +++ b/plume-oft-adapter-migration/test/mocks/MockNativeTokenManager.sol @@ -0,0 +1,20 @@ +// SPDX-License-Identifier: UNLICENSED + +pragma solidity ^0.8.20; + +import { StdCheats } from "forge-std/StdCheats.sol"; + +contract MockNativeTokenManager is StdCheats { + uint256 public burnedAmount; + uint256 public mintedAmount; + + function mintNativeToken(uint256 amount) external { + mintedAmount += amount; + deal(msg.sender, amount); + } + + function burnNativeToken(uint256 amount) external { + burnedAmount += amount; + deal(msg.sender, msg.sender.balance - amount); + } +} \ No newline at end of file diff --git a/plume-oft-adapter-migration/test/mocks/MockOFT.sol b/plume-oft-adapter-migration/test/mocks/MockOFT.sol new file mode 100644 index 00000000..bba6055c --- /dev/null +++ b/plume-oft-adapter-migration/test/mocks/MockOFT.sol @@ -0,0 +1,18 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.22; + +import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol"; +import { OFT } from "@layerzerolabs/lz-evm-oapp-v2/contracts/oft/OFT.sol"; + +contract MockOFT is OFT { + constructor( + string memory _name, + string memory _symbol, + address _lzEndpoint, + address _delegate + ) OFT(_name, _symbol, _lzEndpoint, _delegate) {} + + function mint(address to, uint256 amount) external { + _mint(to, amount); + } +} From a31eee503ac01936023829a62fb23ddf0f313f86 Mon Sep 17 00:00:00 2001 From: ravinagill15 Date: Fri, 18 Jul 2025 13:52:58 -0700 Subject: [PATCH 03/20] updated contracts to be upgradeable and use latest LZ packages, also added deploy scripts --- .../contracts/L3/OrbitNativeOFTAdapter.sol | 17 ------- .../contracts/{L2 => ethereum}/GasToken.sol | 0 .../{L2 => ethereum}/MintableERC20.sol | 0 .../OrbitERC20OFTAdapterUpgradeable.sol} | 15 ++++-- .../{L2 => ethereum}/bridge/AbsBridge.sol | 0 .../{L2 => ethereum}/bridge/ERC20Bridge.sol | 0 .../{L2 => ethereum}/bridge/IBridge.sol | 0 .../bridge/IDelayedMessageProvider.sol | 0 .../{L2 => ethereum}/bridge/IERC20Bridge.sol | 0 .../{L2 => ethereum}/bridge/IEthBridge.sol | 0 .../{L2 => ethereum}/bridge/IInbox.sol | 0 .../{L2 => ethereum}/bridge/IInboxBase.sol | 0 .../{L2 => ethereum}/bridge/IOwnable.sol | 0 .../bridge/ISequencerInbox.sol | 0 .../{L2 => ethereum}/bridge/Messages.sol | 0 .../libraries/AddressAliasHelper.sol | 0 .../libraries/DelegateCallAware.sol | 0 .../{L2 => ethereum}/libraries/Error.sol | 0 .../libraries/IGasRefunder.sol | 0 .../libraries/MessageTypes.sol | 0 .../{L2 => ethereum}/mocks/BridgeStub.sol | 0 .../{L2 => ethereum}/mocks/InboxStub.sol | 0 .../{L2 => ethereum}/mocks/RollupStub.sol | 0 .../{L2 => ethereum}/mocks/SimpleProxy.sol | 0 .../mocks/UpgradeExecutorMock.sol | 0 .../ArbNativeOFTAdapterUpgradeable.sol} | 28 +++++++--- .../OrbitNativeOFTAdapterUpgradeable.sol | 24 +++++++++ .../precompiles/ArbNativeTokenManager.sol | 0 .../deploy/MyOFTAdapterFeeUpgradeable.ts | 39 -------------- .../deploy/MyOFTFeeUpgradeable.ts | 39 -------------- .../deploy/MyOFTUpgradeable.ts | 39 -------------- .../deploy/MyOFTUpgradeableMock.ts | 39 -------------- ....ts => OrbitERC20OFTAdapterUpgradeable.ts} | 6 +-- .../OrbitNativeOFTAdapterUpgradeable.ts | 51 +++++++++++++++++++ 34 files changed, 109 insertions(+), 188 deletions(-) delete mode 100644 plume-oft-adapter-migration/contracts/L3/OrbitNativeOFTAdapter.sol rename plume-oft-adapter-migration/contracts/{L2 => ethereum}/GasToken.sol (100%) rename plume-oft-adapter-migration/contracts/{L2 => ethereum}/MintableERC20.sol (100%) rename plume-oft-adapter-migration/contracts/{L2/OrbitERC20OFTAdapter.sol => ethereum/OrbitERC20OFTAdapterUpgradeable.sol} (75%) rename plume-oft-adapter-migration/contracts/{L2 => ethereum}/bridge/AbsBridge.sol (100%) rename plume-oft-adapter-migration/contracts/{L2 => ethereum}/bridge/ERC20Bridge.sol (100%) rename plume-oft-adapter-migration/contracts/{L2 => ethereum}/bridge/IBridge.sol (100%) rename plume-oft-adapter-migration/contracts/{L2 => ethereum}/bridge/IDelayedMessageProvider.sol (100%) rename plume-oft-adapter-migration/contracts/{L2 => ethereum}/bridge/IERC20Bridge.sol (100%) rename plume-oft-adapter-migration/contracts/{L2 => ethereum}/bridge/IEthBridge.sol (100%) rename plume-oft-adapter-migration/contracts/{L2 => ethereum}/bridge/IInbox.sol (100%) rename plume-oft-adapter-migration/contracts/{L2 => ethereum}/bridge/IInboxBase.sol (100%) rename plume-oft-adapter-migration/contracts/{L2 => ethereum}/bridge/IOwnable.sol (100%) rename plume-oft-adapter-migration/contracts/{L2 => ethereum}/bridge/ISequencerInbox.sol (100%) rename plume-oft-adapter-migration/contracts/{L2 => ethereum}/bridge/Messages.sol (100%) rename plume-oft-adapter-migration/contracts/{L2 => ethereum}/libraries/AddressAliasHelper.sol (100%) rename plume-oft-adapter-migration/contracts/{L2 => ethereum}/libraries/DelegateCallAware.sol (100%) rename plume-oft-adapter-migration/contracts/{L2 => ethereum}/libraries/Error.sol (100%) rename plume-oft-adapter-migration/contracts/{L2 => ethereum}/libraries/IGasRefunder.sol (100%) rename plume-oft-adapter-migration/contracts/{L2 => ethereum}/libraries/MessageTypes.sol (100%) rename plume-oft-adapter-migration/contracts/{L2 => ethereum}/mocks/BridgeStub.sol (100%) rename plume-oft-adapter-migration/contracts/{L2 => ethereum}/mocks/InboxStub.sol (100%) rename plume-oft-adapter-migration/contracts/{L2 => ethereum}/mocks/RollupStub.sol (100%) rename plume-oft-adapter-migration/contracts/{L2 => ethereum}/mocks/SimpleProxy.sol (100%) rename plume-oft-adapter-migration/contracts/{L2 => ethereum}/mocks/UpgradeExecutorMock.sol (100%) rename plume-oft-adapter-migration/contracts/{L3/ArbNativeOFTAdapter.sol => plume/ArbNativeOFTAdapterUpgradeable.sol} (86%) create mode 100644 plume-oft-adapter-migration/contracts/plume/OrbitNativeOFTAdapterUpgradeable.sol rename plume-oft-adapter-migration/contracts/{L3 => plume}/precompiles/ArbNativeTokenManager.sol (100%) delete mode 100644 plume-oft-adapter-migration/deploy/MyOFTAdapterFeeUpgradeable.ts delete mode 100644 plume-oft-adapter-migration/deploy/MyOFTFeeUpgradeable.ts delete mode 100644 plume-oft-adapter-migration/deploy/MyOFTUpgradeable.ts delete mode 100644 plume-oft-adapter-migration/deploy/MyOFTUpgradeableMock.ts rename plume-oft-adapter-migration/deploy/{MyOFTAdapterUpgradeable.ts => OrbitERC20OFTAdapterUpgradeable.ts} (79%) create mode 100644 plume-oft-adapter-migration/deploy/OrbitNativeOFTAdapterUpgradeable.ts diff --git a/plume-oft-adapter-migration/contracts/L3/OrbitNativeOFTAdapter.sol b/plume-oft-adapter-migration/contracts/L3/OrbitNativeOFTAdapter.sol deleted file mode 100644 index ed56d8cd..00000000 --- a/plume-oft-adapter-migration/contracts/L3/OrbitNativeOFTAdapter.sol +++ /dev/null @@ -1,17 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.22; - -import { ArbNativeOFTAdapter } from "./ArbNativeOFTAdapter.sol"; - -contract OrbitNativeOFTAdapter is ArbNativeOFTAdapter { - /** - * @param _localDecimals The decimals of the native on the local chain (this chain). 18 on ETH. - * @param _lzEndpoint The LayerZero endpoint address. - * @param _delegate The delegate capable of making OApp configurations inside of the endpoint. - */ - constructor( - uint8 _localDecimals, - address _lzEndpoint, - address _delegate - ) ArbNativeOFTAdapter(_localDecimals, _lzEndpoint, _delegate) {} -} \ No newline at end of file diff --git a/plume-oft-adapter-migration/contracts/L2/GasToken.sol b/plume-oft-adapter-migration/contracts/ethereum/GasToken.sol similarity index 100% rename from plume-oft-adapter-migration/contracts/L2/GasToken.sol rename to plume-oft-adapter-migration/contracts/ethereum/GasToken.sol diff --git a/plume-oft-adapter-migration/contracts/L2/MintableERC20.sol b/plume-oft-adapter-migration/contracts/ethereum/MintableERC20.sol similarity index 100% rename from plume-oft-adapter-migration/contracts/L2/MintableERC20.sol rename to plume-oft-adapter-migration/contracts/ethereum/MintableERC20.sol diff --git a/plume-oft-adapter-migration/contracts/L2/OrbitERC20OFTAdapter.sol b/plume-oft-adapter-migration/contracts/ethereum/OrbitERC20OFTAdapterUpgradeable.sol similarity index 75% rename from plume-oft-adapter-migration/contracts/L2/OrbitERC20OFTAdapter.sol rename to plume-oft-adapter-migration/contracts/ethereum/OrbitERC20OFTAdapterUpgradeable.sol index 64cfd412..8bcd758f 100644 --- a/plume-oft-adapter-migration/contracts/L2/OrbitERC20OFTAdapter.sol +++ b/plume-oft-adapter-migration/contracts/ethereum/OrbitERC20OFTAdapterUpgradeable.sol @@ -1,13 +1,14 @@ // SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.22; +import { OFTAdapterUpgradeable } from "@layerzerolabs/oft-evm-upgradeable/contracts/oft/OFTAdapterUpgradeable.sol"; + import { IERC20 } from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol"; import { SafeERC20 } from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; -import { OFTAdapter } from "@layerzerolabs/lz-evm-oapp-v2/contracts/oft/OFTAdapter.sol"; import { IERC20Bridge } from "./bridge/IERC20Bridge.sol"; -contract OrbitERC20OFTAdapter is OFTAdapter { +contract OrbitERC20OFTAdapterUpgradeable is OFTAdapterUpgradeable { using SafeERC20 for IERC20; IERC20Bridge private immutable bridge; @@ -15,13 +16,19 @@ contract OrbitERC20OFTAdapter is OFTAdapter { constructor( address _token, address _layerZeroEndpoint, - address _owner, IERC20Bridge _bridge - ) OFTAdapter(_token, _layerZeroEndpoint, _owner) { + ) OFTAdapterUpgradeable(_token, _layerZeroEndpoint) { bridge = _bridge; + _disableInitializers(); + } + + function initialize(address _delegate) public initializer { + __OFTAdapter_init(_delegate); + __Ownable_init(_delegate); } function _debit( + address /*_from*/, uint256 _amountLD, uint256 _minAmountLD, uint32 _dstEid diff --git a/plume-oft-adapter-migration/contracts/L2/bridge/AbsBridge.sol b/plume-oft-adapter-migration/contracts/ethereum/bridge/AbsBridge.sol similarity index 100% rename from plume-oft-adapter-migration/contracts/L2/bridge/AbsBridge.sol rename to plume-oft-adapter-migration/contracts/ethereum/bridge/AbsBridge.sol diff --git a/plume-oft-adapter-migration/contracts/L2/bridge/ERC20Bridge.sol b/plume-oft-adapter-migration/contracts/ethereum/bridge/ERC20Bridge.sol similarity index 100% rename from plume-oft-adapter-migration/contracts/L2/bridge/ERC20Bridge.sol rename to plume-oft-adapter-migration/contracts/ethereum/bridge/ERC20Bridge.sol diff --git a/plume-oft-adapter-migration/contracts/L2/bridge/IBridge.sol b/plume-oft-adapter-migration/contracts/ethereum/bridge/IBridge.sol similarity index 100% rename from plume-oft-adapter-migration/contracts/L2/bridge/IBridge.sol rename to plume-oft-adapter-migration/contracts/ethereum/bridge/IBridge.sol diff --git a/plume-oft-adapter-migration/contracts/L2/bridge/IDelayedMessageProvider.sol b/plume-oft-adapter-migration/contracts/ethereum/bridge/IDelayedMessageProvider.sol similarity index 100% rename from plume-oft-adapter-migration/contracts/L2/bridge/IDelayedMessageProvider.sol rename to plume-oft-adapter-migration/contracts/ethereum/bridge/IDelayedMessageProvider.sol diff --git a/plume-oft-adapter-migration/contracts/L2/bridge/IERC20Bridge.sol b/plume-oft-adapter-migration/contracts/ethereum/bridge/IERC20Bridge.sol similarity index 100% rename from plume-oft-adapter-migration/contracts/L2/bridge/IERC20Bridge.sol rename to plume-oft-adapter-migration/contracts/ethereum/bridge/IERC20Bridge.sol diff --git a/plume-oft-adapter-migration/contracts/L2/bridge/IEthBridge.sol b/plume-oft-adapter-migration/contracts/ethereum/bridge/IEthBridge.sol similarity index 100% rename from plume-oft-adapter-migration/contracts/L2/bridge/IEthBridge.sol rename to plume-oft-adapter-migration/contracts/ethereum/bridge/IEthBridge.sol diff --git a/plume-oft-adapter-migration/contracts/L2/bridge/IInbox.sol b/plume-oft-adapter-migration/contracts/ethereum/bridge/IInbox.sol similarity index 100% rename from plume-oft-adapter-migration/contracts/L2/bridge/IInbox.sol rename to plume-oft-adapter-migration/contracts/ethereum/bridge/IInbox.sol diff --git a/plume-oft-adapter-migration/contracts/L2/bridge/IInboxBase.sol b/plume-oft-adapter-migration/contracts/ethereum/bridge/IInboxBase.sol similarity index 100% rename from plume-oft-adapter-migration/contracts/L2/bridge/IInboxBase.sol rename to plume-oft-adapter-migration/contracts/ethereum/bridge/IInboxBase.sol diff --git a/plume-oft-adapter-migration/contracts/L2/bridge/IOwnable.sol b/plume-oft-adapter-migration/contracts/ethereum/bridge/IOwnable.sol similarity index 100% rename from plume-oft-adapter-migration/contracts/L2/bridge/IOwnable.sol rename to plume-oft-adapter-migration/contracts/ethereum/bridge/IOwnable.sol diff --git a/plume-oft-adapter-migration/contracts/L2/bridge/ISequencerInbox.sol b/plume-oft-adapter-migration/contracts/ethereum/bridge/ISequencerInbox.sol similarity index 100% rename from plume-oft-adapter-migration/contracts/L2/bridge/ISequencerInbox.sol rename to plume-oft-adapter-migration/contracts/ethereum/bridge/ISequencerInbox.sol diff --git a/plume-oft-adapter-migration/contracts/L2/bridge/Messages.sol b/plume-oft-adapter-migration/contracts/ethereum/bridge/Messages.sol similarity index 100% rename from plume-oft-adapter-migration/contracts/L2/bridge/Messages.sol rename to plume-oft-adapter-migration/contracts/ethereum/bridge/Messages.sol diff --git a/plume-oft-adapter-migration/contracts/L2/libraries/AddressAliasHelper.sol b/plume-oft-adapter-migration/contracts/ethereum/libraries/AddressAliasHelper.sol similarity index 100% rename from plume-oft-adapter-migration/contracts/L2/libraries/AddressAliasHelper.sol rename to plume-oft-adapter-migration/contracts/ethereum/libraries/AddressAliasHelper.sol diff --git a/plume-oft-adapter-migration/contracts/L2/libraries/DelegateCallAware.sol b/plume-oft-adapter-migration/contracts/ethereum/libraries/DelegateCallAware.sol similarity index 100% rename from plume-oft-adapter-migration/contracts/L2/libraries/DelegateCallAware.sol rename to plume-oft-adapter-migration/contracts/ethereum/libraries/DelegateCallAware.sol diff --git a/plume-oft-adapter-migration/contracts/L2/libraries/Error.sol b/plume-oft-adapter-migration/contracts/ethereum/libraries/Error.sol similarity index 100% rename from plume-oft-adapter-migration/contracts/L2/libraries/Error.sol rename to plume-oft-adapter-migration/contracts/ethereum/libraries/Error.sol diff --git a/plume-oft-adapter-migration/contracts/L2/libraries/IGasRefunder.sol b/plume-oft-adapter-migration/contracts/ethereum/libraries/IGasRefunder.sol similarity index 100% rename from plume-oft-adapter-migration/contracts/L2/libraries/IGasRefunder.sol rename to plume-oft-adapter-migration/contracts/ethereum/libraries/IGasRefunder.sol diff --git a/plume-oft-adapter-migration/contracts/L2/libraries/MessageTypes.sol b/plume-oft-adapter-migration/contracts/ethereum/libraries/MessageTypes.sol similarity index 100% rename from plume-oft-adapter-migration/contracts/L2/libraries/MessageTypes.sol rename to plume-oft-adapter-migration/contracts/ethereum/libraries/MessageTypes.sol diff --git a/plume-oft-adapter-migration/contracts/L2/mocks/BridgeStub.sol b/plume-oft-adapter-migration/contracts/ethereum/mocks/BridgeStub.sol similarity index 100% rename from plume-oft-adapter-migration/contracts/L2/mocks/BridgeStub.sol rename to plume-oft-adapter-migration/contracts/ethereum/mocks/BridgeStub.sol diff --git a/plume-oft-adapter-migration/contracts/L2/mocks/InboxStub.sol b/plume-oft-adapter-migration/contracts/ethereum/mocks/InboxStub.sol similarity index 100% rename from plume-oft-adapter-migration/contracts/L2/mocks/InboxStub.sol rename to plume-oft-adapter-migration/contracts/ethereum/mocks/InboxStub.sol diff --git a/plume-oft-adapter-migration/contracts/L2/mocks/RollupStub.sol b/plume-oft-adapter-migration/contracts/ethereum/mocks/RollupStub.sol similarity index 100% rename from plume-oft-adapter-migration/contracts/L2/mocks/RollupStub.sol rename to plume-oft-adapter-migration/contracts/ethereum/mocks/RollupStub.sol diff --git a/plume-oft-adapter-migration/contracts/L2/mocks/SimpleProxy.sol b/plume-oft-adapter-migration/contracts/ethereum/mocks/SimpleProxy.sol similarity index 100% rename from plume-oft-adapter-migration/contracts/L2/mocks/SimpleProxy.sol rename to plume-oft-adapter-migration/contracts/ethereum/mocks/SimpleProxy.sol diff --git a/plume-oft-adapter-migration/contracts/L2/mocks/UpgradeExecutorMock.sol b/plume-oft-adapter-migration/contracts/ethereum/mocks/UpgradeExecutorMock.sol similarity index 100% rename from plume-oft-adapter-migration/contracts/L2/mocks/UpgradeExecutorMock.sol rename to plume-oft-adapter-migration/contracts/ethereum/mocks/UpgradeExecutorMock.sol diff --git a/plume-oft-adapter-migration/contracts/L3/ArbNativeOFTAdapter.sol b/plume-oft-adapter-migration/contracts/plume/ArbNativeOFTAdapterUpgradeable.sol similarity index 86% rename from plume-oft-adapter-migration/contracts/L3/ArbNativeOFTAdapter.sol rename to plume-oft-adapter-migration/contracts/plume/ArbNativeOFTAdapterUpgradeable.sol index 79420cdc..524b0727 100644 --- a/plume-oft-adapter-migration/contracts/L3/ArbNativeOFTAdapter.sol +++ b/plume-oft-adapter-migration/contracts/plume/ArbNativeOFTAdapterUpgradeable.sol @@ -2,12 +2,12 @@ pragma solidity ^0.8.20; -import { OFTCore } from "@layerzerolabs/lz-evm-oapp-v2/contracts/oft/OFTCore.sol"; -import { IOFT, SendParam, OFTReceipt, MessagingReceipt, MessagingFee } from "@layerzerolabs/lz-evm-oapp-v2/contracts/oft/interfaces/IOFT.sol"; +import { OFTCoreUpgradeable } from "@layerzerolabs/oft-evm-upgradeable/contracts/oft/OFTCoreUpgradeable.sol"; +import { IOFT, SendParam, OFTReceipt, MessagingReceipt, MessagingFee } from "@layerzerolabs/oft-evm/contracts/interfaces/IOFT.sol"; import { ArbNativeTokenManager } from "./precompiles/ArbNativeTokenManager.sol"; -abstract contract ArbNativeOFTAdapter is OFTCore { +abstract contract ArbNativeOFTAdapterUpgradeable is OFTCoreUpgradeable { ArbNativeTokenManager public immutable arbNativeTokenManager = ArbNativeTokenManager(address(0x73)); error IncorrectMessageValue(uint256 provided, uint256 required); @@ -16,13 +16,23 @@ abstract contract ArbNativeOFTAdapter is OFTCore { /** * @param _localDecimals The decimals of the native on the local chain (this chain). 18 on ETH. * @param _lzEndpoint The LayerZero endpoint address. - * @param _delegate The delegate capable of making OApp configurations inside of the endpoint. */ constructor( uint8 _localDecimals, - address _lzEndpoint, - address _delegate - ) OFTCore(_localDecimals, _lzEndpoint, _delegate) {} + address _lzEndpoint + ) OFTCoreUpgradeable(_localDecimals, _lzEndpoint) {} + + /** + * @dev Initializes the OFTAdapter with the provided delegate. + * @param _delegate The delegate capable of making OApp configurations inside of the endpoint. + * + * @dev The delegate typically should be set as the owner of the contract. + * @dev Ownable is not initialized here on purpose. It should be initialized in the child contract to + * accommodate the different version of Ownable. + */ + function __NativeOFTAdapter_init(address _delegate) internal onlyInitializing { + __OFTCore_init(_delegate); + } function token() external pure returns (address) { return address(0); @@ -53,6 +63,7 @@ abstract contract ArbNativeOFTAdapter is OFTCore { * a pre/post balance check will need to be done to calculate the amountReceivedLD. */ function _debit( + address /*_from*/, uint256 _amountLD, uint256 _minAmountLD, uint32 _dstEid @@ -106,6 +117,7 @@ abstract contract ArbNativeOFTAdapter is OFTCore { // - amountSentLD is the amount in local decimals that was ACTUALLY sent/debited from the sender. // - amountReceivedLD is the amount in local decimals that will be received/credited to the recipient on the remote OFT instance. (uint256 amountSentLD, uint256 amountReceivedLD) = _debit( + msg.sender, _sendParam.amountLD, _sendParam.minAmountLD, _sendParam.dstEid @@ -131,7 +143,7 @@ abstract contract ArbNativeOFTAdapter is OFTCore { return _nativeFee; } - function oftVersion() external pure virtual returns (bytes4 interfaceId, uint64 version) { + function oftVersion() external pure virtual override returns (bytes4 interfaceId, uint64 version) { return (type(IOFT).interfaceId, 1); } } \ No newline at end of file diff --git a/plume-oft-adapter-migration/contracts/plume/OrbitNativeOFTAdapterUpgradeable.sol b/plume-oft-adapter-migration/contracts/plume/OrbitNativeOFTAdapterUpgradeable.sol new file mode 100644 index 00000000..c4c24289 --- /dev/null +++ b/plume-oft-adapter-migration/contracts/plume/OrbitNativeOFTAdapterUpgradeable.sol @@ -0,0 +1,24 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.22; + +import { ArbNativeOFTAdapterUpgradeable } from "./ArbNativeOFTAdapterUpgradeable.sol"; +import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol"; + +contract OrbitNativeOFTAdapterUpgradeable is ArbNativeOFTAdapterUpgradeable { + /** + * @param _localDecimals The decimals of the native on the local chain (this chain). 18 on ETH. + * @param _lzEndpoint The LayerZero endpoint address. + */ + constructor( + uint8 _localDecimals, + address _lzEndpoint + ) ArbNativeOFTAdapterUpgradeable(_localDecimals, _lzEndpoint) { + _disableInitializers(); + } + + function initialize(address _delegate) public initializer { + __NativeOFTAdapter_init(_delegate); + __Ownable_init(_delegate); + } + +} \ No newline at end of file diff --git a/plume-oft-adapter-migration/contracts/L3/precompiles/ArbNativeTokenManager.sol b/plume-oft-adapter-migration/contracts/plume/precompiles/ArbNativeTokenManager.sol similarity index 100% rename from plume-oft-adapter-migration/contracts/L3/precompiles/ArbNativeTokenManager.sol rename to plume-oft-adapter-migration/contracts/plume/precompiles/ArbNativeTokenManager.sol diff --git a/plume-oft-adapter-migration/deploy/MyOFTAdapterFeeUpgradeable.ts b/plume-oft-adapter-migration/deploy/MyOFTAdapterFeeUpgradeable.ts deleted file mode 100644 index bfcf5449..00000000 --- a/plume-oft-adapter-migration/deploy/MyOFTAdapterFeeUpgradeable.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { type DeployFunction } from 'hardhat-deploy/types' - -import { EndpointId, endpointIdToNetwork } from '@layerzerolabs/lz-definitions' -import { getDeploymentAddressAndAbi } from '@layerzerolabs/lz-evm-sdk-v2' - -const contractName = 'MyOFTAdapterFeeUpgradeable' - -const deploy: DeployFunction = async (hre) => { - const { deploy } = hre.deployments - const signer = (await hre.ethers.getSigners())[0] - console.log(`deploying ${contractName} on network: ${hre.network.name} with ${signer.address}`) - - const eid = hre.network.config.eid as EndpointId - const lzNetworkName = endpointIdToNetwork(eid) - - const { address } = getDeploymentAddressAndAbi(lzNetworkName, 'EndpointV2') - - await deploy(contractName, { - from: signer.address, - args: ['0x', address], // replace '0x' with the address of the ERC-20 token - log: true, - waitConfirmations: 1, - skipIfAlreadyDeployed: false, - proxy: { - proxyContract: 'OpenZeppelinTransparentProxy', - owner: signer.address, - execute: { - init: { - methodName: 'initialize', - args: [signer.address], - }, - }, - }, - }) -} - -deploy.tags = [contractName] - -export default deploy diff --git a/plume-oft-adapter-migration/deploy/MyOFTFeeUpgradeable.ts b/plume-oft-adapter-migration/deploy/MyOFTFeeUpgradeable.ts deleted file mode 100644 index eaab8131..00000000 --- a/plume-oft-adapter-migration/deploy/MyOFTFeeUpgradeable.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { type DeployFunction } from 'hardhat-deploy/types' - -import { EndpointId, endpointIdToNetwork } from '@layerzerolabs/lz-definitions' -import { getDeploymentAddressAndAbi } from '@layerzerolabs/lz-evm-sdk-v2' - -const contractName = 'MyOFTFeeUpgradeable' - -const deploy: DeployFunction = async (hre) => { - const { deploy } = hre.deployments - const signer = (await hre.ethers.getSigners())[0] - console.log(`deploying ${contractName} on network: ${hre.network.name} with ${signer.address}`) - - const eid = hre.network.config.eid as EndpointId - const lzNetworkName = endpointIdToNetwork(eid) - - const { address } = getDeploymentAddressAndAbi(lzNetworkName, 'EndpointV2') - - await deploy(contractName, { - from: signer.address, - args: [address], - log: true, - waitConfirmations: 1, - skipIfAlreadyDeployed: false, - proxy: { - proxyContract: 'OpenZeppelinTransparentProxy', - owner: signer.address, - execute: { - init: { - methodName: 'initialize', - args: ['MyOFT', 'MOFT', signer.address], // TODO: add name/symbol - }, - }, - }, - }) -} - -deploy.tags = [contractName] - -export default deploy diff --git a/plume-oft-adapter-migration/deploy/MyOFTUpgradeable.ts b/plume-oft-adapter-migration/deploy/MyOFTUpgradeable.ts deleted file mode 100644 index d2c20b45..00000000 --- a/plume-oft-adapter-migration/deploy/MyOFTUpgradeable.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { type DeployFunction } from 'hardhat-deploy/types' - -import { EndpointId, endpointIdToNetwork } from '@layerzerolabs/lz-definitions' -import { getDeploymentAddressAndAbi } from '@layerzerolabs/lz-evm-sdk-v2' - -const contractName = 'MyOFTUpgradeable' - -const deploy: DeployFunction = async (hre) => { - const { deploy } = hre.deployments - const signer = (await hre.ethers.getSigners())[0] - console.log(`deploying ${contractName} on network: ${hre.network.name} with ${signer.address}`) - - const eid = hre.network.config.eid as EndpointId - const lzNetworkName = endpointIdToNetwork(eid) - - const { address } = getDeploymentAddressAndAbi(lzNetworkName, 'EndpointV2') - - await deploy(contractName, { - from: signer.address, - args: [address], - log: true, - waitConfirmations: 1, - skipIfAlreadyDeployed: false, - proxy: { - proxyContract: 'OpenZeppelinTransparentProxy', - owner: signer.address, - execute: { - init: { - methodName: 'initialize', - args: ['MyOFT', 'MOFT', signer.address], // TODO: add name/symbol - }, - }, - }, - }) -} - -deploy.tags = [contractName] - -export default deploy diff --git a/plume-oft-adapter-migration/deploy/MyOFTUpgradeableMock.ts b/plume-oft-adapter-migration/deploy/MyOFTUpgradeableMock.ts deleted file mode 100644 index 2da2943f..00000000 --- a/plume-oft-adapter-migration/deploy/MyOFTUpgradeableMock.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { type DeployFunction } from 'hardhat-deploy/types' - -import { EndpointId, endpointIdToNetwork } from '@layerzerolabs/lz-definitions' -import { getDeploymentAddressAndAbi } from '@layerzerolabs/lz-evm-sdk-v2' - -const contractName = 'MyOFTUpgradeableMock' - -const deploy: DeployFunction = async (hre) => { - const { deploy } = hre.deployments - const signer = (await hre.ethers.getSigners())[0] - console.log(`deploying ${contractName} on network: ${hre.network.name} with ${signer.address}`) - - const eid = hre.network.config.eid as EndpointId - const lzNetworkName = endpointIdToNetwork(eid) - - const { address } = getDeploymentAddressAndAbi(lzNetworkName, 'EndpointV2') - - await deploy(contractName, { - from: signer.address, - args: [address], - log: true, - waitConfirmations: 1, - skipIfAlreadyDeployed: false, - proxy: { - proxyContract: 'OpenZeppelinTransparentProxy', - owner: signer.address, - execute: { - init: { - methodName: 'initialize', - args: ['MyOFT', 'MOFT', signer.address], // TODO: add name/symbol - }, - }, - }, - }) -} - -deploy.tags = [contractName] - -export default deploy diff --git a/plume-oft-adapter-migration/deploy/MyOFTAdapterUpgradeable.ts b/plume-oft-adapter-migration/deploy/OrbitERC20OFTAdapterUpgradeable.ts similarity index 79% rename from plume-oft-adapter-migration/deploy/MyOFTAdapterUpgradeable.ts rename to plume-oft-adapter-migration/deploy/OrbitERC20OFTAdapterUpgradeable.ts index 4b3441fc..4138ccd8 100644 --- a/plume-oft-adapter-migration/deploy/MyOFTAdapterUpgradeable.ts +++ b/plume-oft-adapter-migration/deploy/OrbitERC20OFTAdapterUpgradeable.ts @@ -3,7 +3,7 @@ import { type DeployFunction } from 'hardhat-deploy/types' import { EndpointId, endpointIdToNetwork } from '@layerzerolabs/lz-definitions' import { getDeploymentAddressAndAbi } from '@layerzerolabs/lz-evm-sdk-v2' -const contractName = 'MyOFTAdapterUpgradeable' +const contractName = 'OrbitERC20OFTAdapterUpgradeable' const deploy: DeployFunction = async (hre) => { const { deploy } = hre.deployments @@ -17,7 +17,7 @@ const deploy: DeployFunction = async (hre) => { await deploy(contractName, { from: signer.address, - args: ['0x', address], // replace '0x' with the address of the ERC-20 token + args: ['0x4C1746A800D224393fE2470C70A35717eD4eA5F1', address, '0x35381f63091926750F43b2A7401B083263aDEF83'], // replace '0xtoken' with the address of the ERC-20 token and '0xbridge' with the address of the bridge log: true, waitConfirmations: 1, skipIfAlreadyDeployed: false, @@ -36,4 +36,4 @@ const deploy: DeployFunction = async (hre) => { deploy.tags = [contractName] -export default deploy +export default deploy \ No newline at end of file diff --git a/plume-oft-adapter-migration/deploy/OrbitNativeOFTAdapterUpgradeable.ts b/plume-oft-adapter-migration/deploy/OrbitNativeOFTAdapterUpgradeable.ts new file mode 100644 index 00000000..784697b7 --- /dev/null +++ b/plume-oft-adapter-migration/deploy/OrbitNativeOFTAdapterUpgradeable.ts @@ -0,0 +1,51 @@ +import assert from 'assert' + +import { type DeployFunction } from 'hardhat-deploy/types' + +const contractName = 'OrbitNativeOFTAdapterUpgradeable' + +const deploy: DeployFunction = async (hre) => { + const { getNamedAccounts, deployments } = hre + + const { deploy } = deployments + const { deployer } = await getNamedAccounts() + + assert(deployer, 'Missing named deployer account') + + console.log(`Network: ${hre.network.name}`) + console.log(`Deployer: ${deployer}`) + + // This is an external deployment pulled in from @layerzerolabs/lz-evm-sdk-v2 + // + // @layerzerolabs/toolbox-hardhat takes care of plugging in the external deployments + // from @layerzerolabs packages based on the configuration in your hardhat config + // + // For this to work correctly, your network config must define an eid property + // set to `EndpointId` as defined in @layerzerolabs/lz-definitions + // + // For example: + // + // networks: { + // fuji: { + // ... + // eid: EndpointId.AVALANCHE_V2_TESTNET + // } + // } + const endpointV2Deployment = await hre.deployments.get('EndpointV2') + + const { address } = await deploy(contractName, { + from: deployer, + args: [ + 18, + endpointV2Deployment.address, // LayerZero's EndpointV2 address + ], + log: true, + skipIfAlreadyDeployed: false, + }) + + console.log(`Deployed contract: ${contractName}, network: ${hre.network.name}, address: ${address}`) +} + +deploy.tags = [contractName] + +export default deploy \ No newline at end of file From edca7e773d8f64c0f15ede16a7e91ebbd2af9730 Mon Sep 17 00:00:00 2001 From: ravinagill15 Date: Fri, 18 Jul 2025 14:07:12 -0700 Subject: [PATCH 04/20] moved over mocks that are only used for testing --- .../contracts/ethereum/MintableERC20.sol | 8 - .../test/helpers/TestHelper.sol | 486 ------------------ .../test/helpers/mocks/SendUln302Mock.sol | 32 -- .../helpers/mocks/SimpleMessageLibMock.sol | 20 - .../ethereum => test}/mocks/BridgeStub.sol | 0 .../ethereum => test/mocks}/GasToken.sol | 0 .../ethereum => test}/mocks/InboxStub.sol | 0 .../test/mocks/MockEndpoint.sol | 163 ------ .../ethereum => test}/mocks/RollupStub.sol | 0 .../ethereum => test}/mocks/SimpleProxy.sol | 0 .../mocks/UpgradeExecutorMock.sol | 0 11 files changed, 709 deletions(-) delete mode 100644 plume-oft-adapter-migration/contracts/ethereum/MintableERC20.sol delete mode 100644 plume-oft-adapter-migration/test/helpers/TestHelper.sol delete mode 100644 plume-oft-adapter-migration/test/helpers/mocks/SendUln302Mock.sol delete mode 100644 plume-oft-adapter-migration/test/helpers/mocks/SimpleMessageLibMock.sol rename plume-oft-adapter-migration/{contracts/ethereum => test}/mocks/BridgeStub.sol (100%) rename plume-oft-adapter-migration/{contracts/ethereum => test/mocks}/GasToken.sol (100%) rename plume-oft-adapter-migration/{contracts/ethereum => test}/mocks/InboxStub.sol (100%) delete mode 100644 plume-oft-adapter-migration/test/mocks/MockEndpoint.sol rename plume-oft-adapter-migration/{contracts/ethereum => test}/mocks/RollupStub.sol (100%) rename plume-oft-adapter-migration/{contracts/ethereum => test}/mocks/SimpleProxy.sol (100%) rename plume-oft-adapter-migration/{contracts/ethereum => test}/mocks/UpgradeExecutorMock.sol (100%) diff --git a/plume-oft-adapter-migration/contracts/ethereum/MintableERC20.sol b/plume-oft-adapter-migration/contracts/ethereum/MintableERC20.sol deleted file mode 100644 index b61e1939..00000000 --- a/plume-oft-adapter-migration/contracts/ethereum/MintableERC20.sol +++ /dev/null @@ -1,8 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.13; - -import { ERC20 } from "@openzeppelin/contracts/token/ERC20/ERC20.sol"; - -abstract contract MintableERC20 is ERC20 { - function mint(address to, uint256 amount) external virtual; -} \ No newline at end of file diff --git a/plume-oft-adapter-migration/test/helpers/TestHelper.sol b/plume-oft-adapter-migration/test/helpers/TestHelper.sol deleted file mode 100644 index 8216cec7..00000000 --- a/plume-oft-adapter-migration/test/helpers/TestHelper.sol +++ /dev/null @@ -1,486 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED - -pragma solidity ^0.8.18; - -import { Test } from "forge-std/Test.sol"; -import { DoubleEndedQueue } from "@openzeppelin/contracts/utils/structs/DoubleEndedQueue.sol"; - -import { UlnConfig, SetDefaultUlnConfigParam } from "@layerzerolabs/lz-evm-messagelib-v2/contracts/uln/UlnBase.sol"; -import { SetDefaultExecutorConfigParam, ExecutorConfig } from "@layerzerolabs/lz-evm-messagelib-v2/contracts/SendLibBase.sol"; -import { ReceiveUln302 } from "@layerzerolabs/lz-evm-messagelib-v2/contracts/uln/uln302/ReceiveUln302.sol"; -import { IDVN } from "@layerzerolabs/lz-evm-messagelib-v2/contracts/uln/interfaces/IDVN.sol"; -import { DVN, ExecuteParam } from "@layerzerolabs/lz-evm-messagelib-v2/contracts/uln/dvn/DVN.sol"; -import { DVNFeeLib } from "@layerzerolabs/lz-evm-messagelib-v2/contracts/uln/dvn/DVNFeeLib.sol"; -import { IExecutor } from "@layerzerolabs/lz-evm-messagelib-v2/contracts/interfaces/IExecutor.sol"; -import { Executor } from "@layerzerolabs/lz-evm-messagelib-v2/contracts/Executor.sol"; -import { PriceFeed } from "@layerzerolabs/lz-evm-messagelib-v2/contracts/PriceFeed.sol"; -import { ILayerZeroPriceFeed } from "@layerzerolabs/lz-evm-messagelib-v2/contracts/interfaces/ILayerZeroPriceFeed.sol"; -import { IReceiveUlnE2 } from "@layerzerolabs/lz-evm-messagelib-v2/contracts/uln/interfaces/IReceiveUlnE2.sol"; -import { ReceiveUln302 } from "@layerzerolabs/lz-evm-messagelib-v2/contracts/uln/uln302/ReceiveUln302.sol"; -import { IMessageLib } from "@layerzerolabs/lz-evm-protocol-v2/contracts/interfaces/IMessageLib.sol"; -import { EndpointV2 } from "@layerzerolabs/lz-evm-protocol-v2/contracts/EndpointV2.sol"; -import { ExecutorOptions } from "@layerzerolabs/lz-evm-protocol-v2/contracts/messagelib/libs/ExecutorOptions.sol"; -import { PacketV1Codec } from "@layerzerolabs/lz-evm-protocol-v2/contracts/messagelib/libs/PacketV1Codec.sol"; -import { Origin } from "@layerzerolabs/lz-evm-protocol-v2/contracts/interfaces/ILayerZeroEndpointV2.sol"; - -import { OApp } from "@layerzerolabs/lz-evm-oapp-v2/contracts/oapp/OApp.sol"; -import { OptionsBuilder } from "@layerzerolabs/lz-evm-oapp-v2/contracts/oapp/libs/OptionsBuilder.sol"; - -import { OptionsHelper } from "@layerzerolabs/lz-evm-oapp-v2/test/OptionsHelper.sol"; -import { SendUln302Mock as SendUln302 } from "./mocks/SendUln302Mock.sol"; -import { SimpleMessageLibMock } from "./mocks/SimpleMessageLibMock.sol"; -import "@layerzerolabs/lz-evm-oapp-v2/test/mocks/ExecutorFeeLibMock.sol"; - -// file copied and modified from original package to avoid problems with stack too deep -contract TestHelper is Test, OptionsHelper { - using OptionsBuilder for bytes; - - enum LibraryType { - UltraLightNode, - SimpleMessageLib - } - - struct EndpointSetup { - EndpointV2[] endpointList; - uint32[] eidList; - address[] sendLibs; - address[] receiveLibs; - address[] readLibs; - address[] signers; - PriceFeed priceFeed; - } - - struct LibrarySetup { - SendUln302 sendUln; - ReceiveUln302 receiveUln; - Executor executor; - DVN dvn; - ExecutorFeeLib executorLib; - DVNFeeLib dvnLib; - } - - struct ConfigParams { - IExecutor.DstConfigParam[] executorConfigParams; - IDVN.DstConfigParam[] dvnConfigParams; - } - - using DoubleEndedQueue for DoubleEndedQueue.Bytes32Deque; - using PacketV1Codec for bytes; - - mapping(uint32 => mapping(bytes32 => DoubleEndedQueue.Bytes32Deque)) packetsQueue; // dstEid => dstUA => guids queue - mapping(bytes32 => bytes) packets; // guid => packet bytes - mapping(bytes32 => bytes) optionsLookup; // guid => options - - mapping(uint32 => address) endpoints; // eid => endpoint - - uint256 public constant TREASURY_GAS_CAP = 1000000000000; - uint256 public constant TREASURY_GAS_FOR_FEE_CAP = 100000; - - uint128 public executorValueCap = 0.1 ether; - - EndpointSetup internal endpointSetup; - LibrarySetup internal libSetup; - - function setUp() public virtual {} - - /** - * @dev set executorValueCap if more than 0.1 ether is necessary - * @dev this must be called prior to setUpEndpoints() if the value is to be used - * @param _valueCap amount executor can pass as msg.value to lzReceive() - */ - function setExecutorValueCap(uint128 _valueCap) public { - executorValueCap = _valueCap; - } - - /** - * @dev setup the endpoints - * @param _endpointNum num of endpoints - */ - function setUpEndpoints(uint8 _endpointNum, LibraryType _libraryType) public { - endpointSetup.endpointList = new EndpointV2[](_endpointNum); - endpointSetup.eidList = new uint32[](_endpointNum); - endpointSetup.sendLibs = new address[](_endpointNum); - endpointSetup.receiveLibs = new address[](_endpointNum); - endpointSetup.signers = new address[](1); - endpointSetup.signers[0] = vm.addr(1); - - { - // deploy endpoints - for (uint8 i = 0; i < _endpointNum; i++) { - uint32 eid = i + 1; - endpointSetup.eidList[i] = eid; - endpointSetup.endpointList[i] = new EndpointV2(eid, address(this)); - registerEndpoint(endpointSetup.endpointList[i]); - } - } - - // @dev oz4/5 breaking change... constructor init - endpointSetup.priceFeed = new PriceFeed(); - endpointSetup.priceFeed.initialize(address(this)); - - for (uint8 i = 0; i < _endpointNum; i++) { - if (_libraryType == LibraryType.UltraLightNode) { - address endpointAddr = address(endpointSetup.endpointList[i]); - - { - libSetup.sendUln = new SendUln302(payable(this), endpointAddr, TREASURY_GAS_CAP, TREASURY_GAS_FOR_FEE_CAP); - libSetup.receiveUln = new ReceiveUln302(endpointAddr); - endpointSetup.endpointList[i].registerLibrary(address(libSetup.sendUln)); - endpointSetup.endpointList[i].registerLibrary(address(libSetup.receiveUln)); - endpointSetup.sendLibs[i] = address(libSetup.sendUln); - endpointSetup.receiveLibs[i] = address(libSetup.receiveUln); - } - - { - libSetup.executor = new Executor(); - address[] memory admins = new address[](1); - admins[0] = address(this); - - address[] memory messageLibs = new address[](2); - messageLibs[0] = address(libSetup.sendUln); - messageLibs[1] = address(libSetup.receiveUln); - - libSetup.executor.initialize( - endpointAddr, - address(0x0), - messageLibs, - address(endpointSetup.priceFeed), - address(this), - admins - ); - ExecutorFeeLib executorLib = new ExecutorFeeLibMock(); - libSetup.executor.setWorkerFeeLib(address(executorLib)); - - libSetup.dvn = new DVN(i + 1, messageLibs, address(endpointSetup.priceFeed), endpointSetup.signers, 1, admins); - DVNFeeLib dvnLib = new DVNFeeLib(1e18); - libSetup.dvn.setWorkerFeeLib(address(dvnLib)); - } - - ConfigParams memory configParams; - configParams.executorConfigParams = new IExecutor.DstConfigParam[](_endpointNum + 1); - configParams.dvnConfigParams = new IDVN.DstConfigParam[](_endpointNum + 1); - - for (uint8 j = 0; j < _endpointNum; j++) { - if (i == j) continue; - uint32 dstEid = j + 1; - - address[] memory defaultDVNs = new address[](1); - address[] memory optionalDVNs = new address[](0); - defaultDVNs[0] = address(libSetup.dvn); - - { - SetDefaultUlnConfigParam[] memory params = new SetDefaultUlnConfigParam[](1); - UlnConfig memory ulnConfig = UlnConfig( - 100, - uint8(defaultDVNs.length), - uint8(optionalDVNs.length), - 0, - defaultDVNs, - optionalDVNs - ); - params[0] = SetDefaultUlnConfigParam(dstEid, ulnConfig); - libSetup.sendUln.setDefaultUlnConfigs(params); - } - - { - SetDefaultExecutorConfigParam[] memory params = new SetDefaultExecutorConfigParam[](1); - ExecutorConfig memory executorConfig = ExecutorConfig(10000, address(libSetup.executor)); - params[0] = SetDefaultExecutorConfigParam(dstEid, executorConfig); - libSetup.sendUln.setDefaultExecutorConfigs(params); - } - - { - SetDefaultUlnConfigParam[] memory params = new SetDefaultUlnConfigParam[](1); - UlnConfig memory ulnConfig = UlnConfig( - 100, - uint8(defaultDVNs.length), - uint8(optionalDVNs.length), - 0, - defaultDVNs, - optionalDVNs - ); - params[0] = SetDefaultUlnConfigParam(dstEid, ulnConfig); - libSetup.receiveUln.setDefaultUlnConfigs(params); - } - - // executor config - configParams.executorConfigParams[j] = IExecutor.DstConfigParam({ - dstEid: dstEid, - baseGas: 5000, - multiplierBps: 10000, - floorMarginUSD: 1e10, - nativeCap: executorValueCap - }); - - // dvn config - configParams.dvnConfigParams[j] = IDVN.DstConfigParam({ - dstEid: dstEid, - gas: 5000, - multiplierBps: 10000, - floorMarginUSD: 1e10 - }); - - uint128 denominator = endpointSetup.priceFeed.getPriceRatioDenominator(); - ILayerZeroPriceFeed.UpdatePrice[] memory prices = new ILayerZeroPriceFeed.UpdatePrice[](1); - prices[0] = ILayerZeroPriceFeed.UpdatePrice( - dstEid, - ILayerZeroPriceFeed.Price(1 * denominator, 1, 1) - ); - endpointSetup.priceFeed.setPrice(prices); - } - libSetup.executor.setDstConfig(configParams.executorConfigParams); - libSetup.dvn.setDstConfig(configParams.dvnConfigParams); - } else if (_libraryType == LibraryType.SimpleMessageLib) { - SimpleMessageLibMock messageLib = new SimpleMessageLibMock(payable(this), address(endpointSetup.endpointList[i])); - endpointSetup.endpointList[i].registerLibrary(address(messageLib)); - endpointSetup.sendLibs[i] = address(messageLib); - endpointSetup.receiveLibs[i] = address(messageLib); - } else { - revert("invalid library type"); - } - } - - // config up - for (uint8 i = 0; i < _endpointNum; i++) { - EndpointV2 endpoint = endpointSetup.endpointList[i]; - for (uint8 j = 0; j < _endpointNum; j++) { - if (i == j) continue; - endpoint.setDefaultSendLibrary(j + 1, endpointSetup.sendLibs[i]); - endpoint.setDefaultReceiveLibrary(j + 1, endpointSetup.receiveLibs[i], 0); - } - } - } - - /** - * @dev setup UAs, only if the UA has `endpoint` address as the unique parameter - */ - function setupOApps( - bytes memory _oappCreationCode, - uint8 _startEid, - uint8 _oappNum - ) public returns (address[] memory oapps) { - oapps = new address[](_oappNum); - for (uint8 eid = _startEid; eid < _startEid + _oappNum; eid++) { - address oapp = _deployOApp(_oappCreationCode, abi.encode(address(endpoints[eid]), address(this), true)); - oapps[eid - _startEid] = oapp; - } - // config - wireOApps(oapps); - } - - function wireOApps(address[] memory oapps) public { - uint256 size = oapps.length; - for (uint256 i = 0; i < size; i++) { - OApp localOApp = OApp(payable(oapps[i])); - for (uint256 j = 0; j < size; j++) { - if (i == j) continue; - OApp remoteOApp = OApp(payable(oapps[j])); - uint32 remoteEid = (remoteOApp.endpoint()).eid(); - localOApp.setPeer(remoteEid, addressToBytes32(address(remoteOApp))); - } - } - } - - function _deployOApp(bytes memory _oappBytecode, bytes memory _constructorArgs) internal returns (address addr) { - bytes memory bytecode = bytes.concat(abi.encodePacked(_oappBytecode), _constructorArgs); - assembly { - addr := create(0, add(bytecode, 0x20), mload(bytecode)) - if iszero(extcodesize(addr)) { - revert(0, 0) - } - } - } - - function schedulePacket(bytes calldata _packetBytes, bytes calldata _options) public { - uint32 dstEid = _packetBytes.dstEid(); - bytes32 dstAddress = _packetBytes.receiver(); - DoubleEndedQueue.Bytes32Deque storage queue = packetsQueue[dstEid][dstAddress]; - // front in, back out - bytes32 guid = _packetBytes.guid(); - queue.pushFront(guid); - packets[guid] = _packetBytes; - optionsLookup[guid] = _options; - } - - /** - * @dev verify packets to destination chain's UA address - * @param _dstEid destination eid - * @param _dstAddress destination address - */ - function verifyPackets(uint32 _dstEid, bytes32 _dstAddress) public { - verifyPackets(_dstEid, _dstAddress, 0, address(0x0)); - } - - /** - * @dev verify packets to destination chain's UA address - * @param _dstEid destination eid - * @param _dstAddress destination address - */ - function verifyPackets(uint32 _dstEid, address _dstAddress) public { - verifyPackets(_dstEid, bytes32(uint256(uint160(_dstAddress))), 0, address(0x0)); - } - - /** - * @dev dst UA receive/execute packets - * @dev will NOT work calling this directly with composer IF the composed payload is different from the lzReceive msg payload - */ - function verifyPackets(uint32 _dstEid, bytes32 _dstAddress, uint256 _packetAmount, address _composer) public { - require(endpoints[_dstEid] != address(0), "endpoint not yet registered"); - - DoubleEndedQueue.Bytes32Deque storage queue = packetsQueue[_dstEid][_dstAddress]; - uint256 pendingPacketsSize = queue.length(); - uint256 numberOfPackets; - if (_packetAmount == 0) { - numberOfPackets = queue.length(); - } else { - numberOfPackets = pendingPacketsSize > _packetAmount ? _packetAmount : pendingPacketsSize; - } - while (numberOfPackets > 0) { - numberOfPackets--; - // front in, back out - bytes32 guid = queue.popBack(); - bytes memory packetBytes = packets[guid]; - this.assertGuid(packetBytes, guid); - this.validatePacket(packetBytes); - - bytes memory options = optionsLookup[guid]; - if (_executorOptionExists(options, ExecutorOptions.OPTION_TYPE_NATIVE_DROP)) { - (uint256 amount, bytes32 receiver) = _parseExecutorNativeDropOption(options); - address to = address(uint160(uint256(receiver))); - (bool sent, ) = to.call{ value: amount }(""); - require(sent, "Failed to send Ether"); - } - if (_executorOptionExists(options, ExecutorOptions.OPTION_TYPE_LZRECEIVE)) { - this.lzReceive(packetBytes, options); - } - if (_composer != address(0) && _executorOptionExists(options, ExecutorOptions.OPTION_TYPE_LZCOMPOSE)) { - this.lzCompose(packetBytes, options, guid, _composer); - } - } - } - - function lzReceive(bytes calldata _packetBytes, bytes memory _options) external payable { - EndpointV2 endpoint = EndpointV2(endpoints[_packetBytes.dstEid()]); - (uint256 gas, uint256 value) = OptionsHelper._parseExecutorLzReceiveOption(_options); - - Origin memory origin = Origin(_packetBytes.srcEid(), _packetBytes.sender(), _packetBytes.nonce()); - endpoint.lzReceive{ value: value, gas: gas }( - origin, - _packetBytes.receiverB20(), - _packetBytes.guid(), - _packetBytes.message(), - bytes("") - ); - } - - function lzCompose( - bytes calldata _packetBytes, - bytes memory _options, - bytes32 _guid, - address _composer - ) external payable { - this.lzCompose( - _packetBytes.dstEid(), - _packetBytes.receiverB20(), - _options, - _guid, - _composer, - _packetBytes.message() - ); - } - - // @dev the verifyPackets does not know the composeMsg if it is NOT the same as the original lzReceive payload - // Can call this directly from your test to lzCompose those types of packets - function lzCompose( - uint32 _dstEid, - address _from, - bytes memory _options, - bytes32 _guid, - address _to, - bytes calldata _composerMsg - ) external payable { - EndpointV2 endpoint = EndpointV2(endpoints[_dstEid]); - (uint16 index, uint256 gas, uint256 value) = _parseExecutorLzComposeOption(_options); - endpoint.lzCompose{ value: value, gas: gas }(_from, _to, _guid, index, _composerMsg, bytes("")); - } - - function validatePacket(bytes calldata _packetBytes) external { - uint32 dstEid = _packetBytes.dstEid(); - EndpointV2 endpoint = EndpointV2(endpoints[dstEid]); - (address receiveLib, ) = endpoint.getReceiveLibrary(_packetBytes.receiverB20(), _packetBytes.srcEid()); - ReceiveUln302 dstUln = ReceiveUln302(receiveLib); - - (uint64 major, , ) = IMessageLib(receiveLib).version(); - if (major == 3) { - // it is ultra light node - bytes memory config = dstUln.getConfig(_packetBytes.srcEid(), _packetBytes.receiverB20(), 2); // CONFIG_TYPE_ULN - DVN dvn = DVN(abi.decode(config, (UlnConfig)).requiredDVNs[0]); - - bytes memory packetHeader = _packetBytes.header(); - bytes32 payloadHash = keccak256(_packetBytes.payload()); - - // sign - bytes memory signatures; - bytes memory verifyCalldata = abi.encodeWithSelector( - IReceiveUlnE2.verify.selector, - packetHeader, - payloadHash, - 100 - ); - { - bytes32 hash = dvn.hashCallData(dstEid, address(dstUln), verifyCalldata, block.timestamp + 1000); - bytes32 ethSignedMessageHash = keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)); - (uint8 v, bytes32 r, bytes32 s) = vm.sign(1, ethSignedMessageHash); // matches dvn signer - signatures = abi.encodePacked(r, s, v); - } - ExecuteParam[] memory params = new ExecuteParam[](1); - params[0] = ExecuteParam(dstEid, address(dstUln), verifyCalldata, block.timestamp + 1000, signatures); - dvn.execute(params); - - // commit verification - bytes memory callData = abi.encodeWithSelector( - IReceiveUlnE2.commitVerification.selector, - packetHeader, - payloadHash - ); - { - bytes32 hash = dvn.hashCallData(dstEid, address(dstUln), callData, block.timestamp + 1000); - bytes32 ethSignedMessageHash = keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)); - (uint8 v, bytes32 r, bytes32 s) = vm.sign(1, ethSignedMessageHash); // matches dvn signer - signatures = abi.encodePacked(r, s, v); - } - params[0] = ExecuteParam(dstEid, address(dstUln), callData, block.timestamp + 1000, signatures); - dvn.execute(params); - } else { - SimpleMessageLibMock(payable(receiveLib)).validatePacket(_packetBytes); - } - } - - function assertGuid(bytes calldata packetBytes, bytes32 guid) external pure { - bytes32 packetGuid = packetBytes.guid(); - require(packetGuid == guid, "guid not match"); - } - - function registerEndpoint(EndpointV2 endpoint) public { - endpoints[endpoint.eid()] = address(endpoint); - } - - function hasPendingPackets(uint16 _dstEid, bytes32 _dstAddress) public view returns (bool flag) { - DoubleEndedQueue.Bytes32Deque storage queue = packetsQueue[_dstEid][_dstAddress]; - return queue.length() > 0; - } - - function getNextInflightPacket(uint16 _dstEid, bytes32 _dstAddress) public view returns (bytes memory packetBytes) { - DoubleEndedQueue.Bytes32Deque storage queue = packetsQueue[_dstEid][_dstAddress]; - if (queue.length() > 0) { - bytes32 guid = queue.back(); - packetBytes = packets[guid]; - } - } - - function addressToBytes32(address _addr) internal pure returns (bytes32) { - return bytes32(uint256(uint160(_addr))); - } - - receive() external payable {} -} diff --git a/plume-oft-adapter-migration/test/helpers/mocks/SendUln302Mock.sol b/plume-oft-adapter-migration/test/helpers/mocks/SendUln302Mock.sol deleted file mode 100644 index 19e6a058..00000000 --- a/plume-oft-adapter-migration/test/helpers/mocks/SendUln302Mock.sol +++ /dev/null @@ -1,32 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.0; - -import { Packet } from "@layerzerolabs/lz-evm-protocol-v2/contracts/interfaces/ISendLib.sol"; -import { MessagingFee } from "@layerzerolabs/lz-evm-protocol-v2/contracts/interfaces/ILayerZeroEndpointV2.sol"; -import { SendUln302 } from "@layerzerolabs/lz-evm-messagelib-v2/contracts/uln/uln302/SendUln302.sol"; - -import { TestHelper } from "../TestHelper.sol"; - -// file copied and modified from original package to avoid problems with stack too deep -contract SendUln302Mock is SendUln302 { - // offchain packets schedule - TestHelper public testHelper; - - constructor( - address payable _verifyHelper, - address _endpoint, - uint256 _treasuryGasCap, - uint256 _treasuryGasForFeeCap - ) SendUln302(_endpoint, _treasuryGasCap, _treasuryGasForFeeCap) { - testHelper = TestHelper(_verifyHelper); - } - - function send( - Packet calldata _packet, - bytes calldata _options, - bool _payInLzToken - ) public override returns (MessagingFee memory fee, bytes memory encodedPacket) { - (fee, encodedPacket) = super.send(_packet, _options, _payInLzToken); - testHelper.schedulePacket(encodedPacket, _options); - } -} diff --git a/plume-oft-adapter-migration/test/helpers/mocks/SimpleMessageLibMock.sol b/plume-oft-adapter-migration/test/helpers/mocks/SimpleMessageLibMock.sol deleted file mode 100644 index c3258b6b..00000000 --- a/plume-oft-adapter-migration/test/helpers/mocks/SimpleMessageLibMock.sol +++ /dev/null @@ -1,20 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.0; - -import { SimpleMessageLib } from "@layerzerolabs/lz-evm-protocol-v2/contracts/messagelib/SimpleMessageLib.sol"; - -import { TestHelper } from "../TestHelper.sol"; - -// file copied and modified from original package to avoid problems with stack too deep -contract SimpleMessageLibMock is SimpleMessageLib { - // offchain packets schedule - TestHelper public testHelper; - - constructor(address payable _verifyHelper, address _endpoint) SimpleMessageLib(_endpoint, address(0x0)) { - testHelper = TestHelper(_verifyHelper); - } - - function _handleMessagingParamsHook(bytes memory _encodedPacket, bytes memory _options) internal override { - testHelper.schedulePacket(_encodedPacket, _options); - } -} diff --git a/plume-oft-adapter-migration/contracts/ethereum/mocks/BridgeStub.sol b/plume-oft-adapter-migration/test/mocks/BridgeStub.sol similarity index 100% rename from plume-oft-adapter-migration/contracts/ethereum/mocks/BridgeStub.sol rename to plume-oft-adapter-migration/test/mocks/BridgeStub.sol diff --git a/plume-oft-adapter-migration/contracts/ethereum/GasToken.sol b/plume-oft-adapter-migration/test/mocks/GasToken.sol similarity index 100% rename from plume-oft-adapter-migration/contracts/ethereum/GasToken.sol rename to plume-oft-adapter-migration/test/mocks/GasToken.sol diff --git a/plume-oft-adapter-migration/contracts/ethereum/mocks/InboxStub.sol b/plume-oft-adapter-migration/test/mocks/InboxStub.sol similarity index 100% rename from plume-oft-adapter-migration/contracts/ethereum/mocks/InboxStub.sol rename to plume-oft-adapter-migration/test/mocks/InboxStub.sol diff --git a/plume-oft-adapter-migration/test/mocks/MockEndpoint.sol b/plume-oft-adapter-migration/test/mocks/MockEndpoint.sol deleted file mode 100644 index 3e35ab16..00000000 --- a/plume-oft-adapter-migration/test/mocks/MockEndpoint.sol +++ /dev/null @@ -1,163 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.22; - -import { ILayerZeroEndpointV2, MessagingParams, MessagingFee, MessagingReceipt, Origin } from "@layerzerolabs/lz-evm-protocol-v2/contracts/interfaces/ILayerZeroEndpointV2.sol"; -import { SetConfigParam } from "@layerzerolabs/lz-evm-protocol-v2/contracts/interfaces/IMessageLibManager.sol"; - -contract MockEndpoint is ILayerZeroEndpointV2 { - mapping(address oapp => address delegate) public delegates; - - // Implementations for ILayerZeroEndpointV2 - function quote(MessagingParams calldata /*_params*/, address /*_sender*/) external pure override returns (MessagingFee memory) { - return MessagingFee(0, 0); - } - - function send( - MessagingParams calldata /*_params*/, - address /*_refundAddress*/ - ) external payable override returns (MessagingReceipt memory) { - return MessagingReceipt(bytes32(0), 0, MessagingFee(0, 0)); - } - - function verify(Origin calldata /*_origin*/, address /*_receiver*/, bytes32 /*_payloadHash*/) external override {} - - function verifiable(Origin calldata /*_origin*/, address /*_receiver*/) external pure override returns (bool) { - return false; - } - - function initializable(Origin calldata /*_origin*/, address /*_receiver*/) external pure override returns (bool) { - return false; - } - - function lzReceive( - Origin calldata /*_origin*/, - address /*_receiver*/, - bytes32 /*_guid*/, - bytes calldata /*_message*/, - bytes calldata /*_extraData*/ - ) external payable override {} - - function clear(address /*_oapp*/, Origin calldata /*_origin*/, bytes32 /*_guid*/, bytes calldata /*_message*/) external override {} - - function setLzToken(address /*_lzToken*/) external override {} - - function lzToken() external pure override returns (address) { - return address(0); - } - - function nativeToken() external pure override returns (address) { - return address(0); - } - - function setDelegate(address _delegate) external override { - delegates[msg.sender] = _delegate; - emit DelegateSet(msg.sender, _delegate); - } - - // Implementations for IMessageLibManager - function registerLibrary(address /*_lib*/) external override {} - function isRegisteredLibrary(address /*_lib*/) external pure override returns (bool) { - return false; - } - function getRegisteredLibraries() external pure override returns (address[] memory) { - address[] memory emptyArray; - return emptyArray; - } - function setDefaultSendLibrary(uint32 /*_eid*/, address /*_newLib*/) external override {} - function defaultSendLibrary(uint32 /*_eid*/) external pure override returns (address) { - return address(0); - } - function setDefaultReceiveLibrary(uint32 /*_eid*/, address /*_newLib*/, uint256 /*_timeout*/) external override {} - function defaultReceiveLibrary(uint32 /*_eid*/) external pure override returns (address) { - return address(0); - } - function setDefaultReceiveLibraryTimeout(uint32 /*_eid*/, address /*_lib*/, uint256 /*_expiry*/) external override {} - function defaultReceiveLibraryTimeout(uint32 /*_eid*/) external pure override returns (address lib, uint256 expiry) { - return (address(0), 0); - } - function isSupportedEid(uint32 /*_eid*/) external pure override returns (bool) { - return false; - } - function isValidReceiveLibrary(address /*_receiver*/, uint32 /*_eid*/, address /*_lib*/) external pure override returns (bool) { - return false; - } - function setSendLibrary(address /*_oapp*/, uint32 /*_eid*/, address /*_newLib*/) external override {} - function getSendLibrary(address /*_sender*/, uint32 /*_eid*/) external pure override returns (address lib) { - return address(0); - } - function isDefaultSendLibrary(address /*_sender*/, uint32 /*_eid*/) external pure override returns (bool) { - return false; - } - function setReceiveLibrary(address /*_oapp*/, uint32 /*_eid*/, address /*_newLib*/, uint256 /*_gracePeriod*/) external override {} - function getReceiveLibrary(address /*_receiver*/, uint32 /*_eid*/) external pure override returns (address lib, bool isDefault) { - return (address(0), false); - } - function setReceiveLibraryTimeout(address /*_oapp*/, uint32 /*_eid*/, address /*_lib*/, uint256 /*_gracePeriod*/) external override {} - function receiveLibraryTimeout(address /*_receiver*/, uint32 /*_eid*/) external pure override returns (address lib, uint256 expiry) { - return (address(0), 0); - } - function setConfig(address /*_oapp*/, address /*_lib*/, SetConfigParam[] calldata /*_params*/) external override {} - function getConfig( - address /*_oapp*/, - address /*_lib*/, - uint32 /*_eid*/, - uint32 /*_configType*/ - ) external pure override returns (bytes memory config) { - return ""; - } - - // Implementations for IMessagingComposer - function composeQueue( - address /*_from*/, - address /*_to*/, - bytes32 /*_guid*/, - uint16 /*_index*/ - ) external pure override returns (bytes32) { - return bytes32(0); - } - function sendCompose(address /*_to*/, bytes32 /*_guid*/, uint16 /*_index*/, bytes calldata /*_message*/) external override {} - function lzCompose( - address /*_from*/, - address /*_to*/, - bytes32 /*_guid*/, - uint16 /*_index*/, - bytes calldata /*_message*/, - bytes calldata /*_extraData*/ - ) external payable override {} - - // Implementations for IMessagingChannel - function eid() external pure override returns (uint32) { - return 10777; - } - function skip(address /*_oapp*/, uint32 /*_srcEid*/, bytes32 /*_sender*/, uint64 /*_nonce*/) external override {} - function nilify(address /*_oapp*/, uint32 /*_srcEid*/, bytes32 /*_sender*/, uint64 /*_nonce*/, bytes32 /*_payloadHash*/) external override {} - function burn(address /*_oapp*/, uint32 /*_srcEid*/, bytes32 /*_sender*/, uint64 /*_nonce*/, bytes32 /*_payloadHash*/) external override {} - function nextGuid(address /*_sender*/, uint32 /*_dstEid*/, bytes32 /*_receiver*/) external pure override returns (bytes32) { - return bytes32(0); - } - function inboundNonce(address /*_receiver*/, uint32 /*_srcEid*/, bytes32 /*_sender*/) external pure override returns (uint64) { - return 0; - } - function outboundNonce(address /*_sender*/, uint32 /*_dstEid*/, bytes32 /*_receiver*/) external pure override returns (uint64) { - return 0; - } - function inboundPayloadHash( - address /*_receiver*/, - uint32 /*_srcEid*/, - bytes32 /*_sender*/, - uint64 /*_nonce*/ - ) external pure override returns (bytes32) { - return bytes32(0); - } - function lazyInboundNonce(address /*_receiver*/, uint32 /*_srcEid*/, bytes32 /*_sender*/) external pure override returns (uint64) { - return 0; - } - - // Implementations for IMessagingContext - function isSendingMessage() external pure override returns (bool) { - return false; - } - function getSendContext() external pure override returns (uint32 dstEid, address sender) { - return (0, address(0)); - } -} \ No newline at end of file diff --git a/plume-oft-adapter-migration/contracts/ethereum/mocks/RollupStub.sol b/plume-oft-adapter-migration/test/mocks/RollupStub.sol similarity index 100% rename from plume-oft-adapter-migration/contracts/ethereum/mocks/RollupStub.sol rename to plume-oft-adapter-migration/test/mocks/RollupStub.sol diff --git a/plume-oft-adapter-migration/contracts/ethereum/mocks/SimpleProxy.sol b/plume-oft-adapter-migration/test/mocks/SimpleProxy.sol similarity index 100% rename from plume-oft-adapter-migration/contracts/ethereum/mocks/SimpleProxy.sol rename to plume-oft-adapter-migration/test/mocks/SimpleProxy.sol diff --git a/plume-oft-adapter-migration/contracts/ethereum/mocks/UpgradeExecutorMock.sol b/plume-oft-adapter-migration/test/mocks/UpgradeExecutorMock.sol similarity index 100% rename from plume-oft-adapter-migration/contracts/ethereum/mocks/UpgradeExecutorMock.sol rename to plume-oft-adapter-migration/test/mocks/UpgradeExecutorMock.sol From 841f898af1b9f539593a9fb085c84c085acdb281 Mon Sep 17 00:00:00 2001 From: ravinagill15 Date: Fri, 18 Jul 2025 14:07:56 -0700 Subject: [PATCH 05/20] moved libraries directory to test directory since files are only used within tests --- .../{contracts/ethereum => test}/libraries/AddressAliasHelper.sol | 0 .../{contracts/ethereum => test}/libraries/DelegateCallAware.sol | 0 .../{contracts/ethereum => test}/libraries/Error.sol | 0 .../{contracts/ethereum => test}/libraries/IGasRefunder.sol | 0 .../{contracts/ethereum => test}/libraries/MessageTypes.sol | 0 5 files changed, 0 insertions(+), 0 deletions(-) rename plume-oft-adapter-migration/{contracts/ethereum => test}/libraries/AddressAliasHelper.sol (100%) rename plume-oft-adapter-migration/{contracts/ethereum => test}/libraries/DelegateCallAware.sol (100%) rename plume-oft-adapter-migration/{contracts/ethereum => test}/libraries/Error.sol (100%) rename plume-oft-adapter-migration/{contracts/ethereum => test}/libraries/IGasRefunder.sol (100%) rename plume-oft-adapter-migration/{contracts/ethereum => test}/libraries/MessageTypes.sol (100%) diff --git a/plume-oft-adapter-migration/contracts/ethereum/libraries/AddressAliasHelper.sol b/plume-oft-adapter-migration/test/libraries/AddressAliasHelper.sol similarity index 100% rename from plume-oft-adapter-migration/contracts/ethereum/libraries/AddressAliasHelper.sol rename to plume-oft-adapter-migration/test/libraries/AddressAliasHelper.sol diff --git a/plume-oft-adapter-migration/contracts/ethereum/libraries/DelegateCallAware.sol b/plume-oft-adapter-migration/test/libraries/DelegateCallAware.sol similarity index 100% rename from plume-oft-adapter-migration/contracts/ethereum/libraries/DelegateCallAware.sol rename to plume-oft-adapter-migration/test/libraries/DelegateCallAware.sol diff --git a/plume-oft-adapter-migration/contracts/ethereum/libraries/Error.sol b/plume-oft-adapter-migration/test/libraries/Error.sol similarity index 100% rename from plume-oft-adapter-migration/contracts/ethereum/libraries/Error.sol rename to plume-oft-adapter-migration/test/libraries/Error.sol diff --git a/plume-oft-adapter-migration/contracts/ethereum/libraries/IGasRefunder.sol b/plume-oft-adapter-migration/test/libraries/IGasRefunder.sol similarity index 100% rename from plume-oft-adapter-migration/contracts/ethereum/libraries/IGasRefunder.sol rename to plume-oft-adapter-migration/test/libraries/IGasRefunder.sol diff --git a/plume-oft-adapter-migration/contracts/ethereum/libraries/MessageTypes.sol b/plume-oft-adapter-migration/test/libraries/MessageTypes.sol similarity index 100% rename from plume-oft-adapter-migration/contracts/ethereum/libraries/MessageTypes.sol rename to plume-oft-adapter-migration/test/libraries/MessageTypes.sol From ab52ed262fc4aed881c06b1551f696a52c7e54f9 Mon Sep 17 00:00:00 2001 From: ravinagill15 Date: Fri, 18 Jul 2025 14:09:12 -0700 Subject: [PATCH 06/20] moved contracts/ethereum/bridge files that are only used for testing to test/bridge directory --- .../{contracts/ethereum => test}/bridge/AbsBridge.sol | 0 .../{contracts/ethereum => test}/bridge/ERC20Bridge.sol | 0 .../ethereum => test}/bridge/IDelayedMessageProvider.sol | 0 .../{contracts/ethereum => test}/bridge/IEthBridge.sol | 0 .../{contracts/ethereum => test}/bridge/IInbox.sol | 0 .../{contracts/ethereum => test}/bridge/IInboxBase.sol | 0 .../{contracts/ethereum => test}/bridge/ISequencerInbox.sol | 0 .../{contracts/ethereum => test}/bridge/Messages.sol | 0 8 files changed, 0 insertions(+), 0 deletions(-) rename plume-oft-adapter-migration/{contracts/ethereum => test}/bridge/AbsBridge.sol (100%) rename plume-oft-adapter-migration/{contracts/ethereum => test}/bridge/ERC20Bridge.sol (100%) rename plume-oft-adapter-migration/{contracts/ethereum => test}/bridge/IDelayedMessageProvider.sol (100%) rename plume-oft-adapter-migration/{contracts/ethereum => test}/bridge/IEthBridge.sol (100%) rename plume-oft-adapter-migration/{contracts/ethereum => test}/bridge/IInbox.sol (100%) rename plume-oft-adapter-migration/{contracts/ethereum => test}/bridge/IInboxBase.sol (100%) rename plume-oft-adapter-migration/{contracts/ethereum => test}/bridge/ISequencerInbox.sol (100%) rename plume-oft-adapter-migration/{contracts/ethereum => test}/bridge/Messages.sol (100%) diff --git a/plume-oft-adapter-migration/contracts/ethereum/bridge/AbsBridge.sol b/plume-oft-adapter-migration/test/bridge/AbsBridge.sol similarity index 100% rename from plume-oft-adapter-migration/contracts/ethereum/bridge/AbsBridge.sol rename to plume-oft-adapter-migration/test/bridge/AbsBridge.sol diff --git a/plume-oft-adapter-migration/contracts/ethereum/bridge/ERC20Bridge.sol b/plume-oft-adapter-migration/test/bridge/ERC20Bridge.sol similarity index 100% rename from plume-oft-adapter-migration/contracts/ethereum/bridge/ERC20Bridge.sol rename to plume-oft-adapter-migration/test/bridge/ERC20Bridge.sol diff --git a/plume-oft-adapter-migration/contracts/ethereum/bridge/IDelayedMessageProvider.sol b/plume-oft-adapter-migration/test/bridge/IDelayedMessageProvider.sol similarity index 100% rename from plume-oft-adapter-migration/contracts/ethereum/bridge/IDelayedMessageProvider.sol rename to plume-oft-adapter-migration/test/bridge/IDelayedMessageProvider.sol diff --git a/plume-oft-adapter-migration/contracts/ethereum/bridge/IEthBridge.sol b/plume-oft-adapter-migration/test/bridge/IEthBridge.sol similarity index 100% rename from plume-oft-adapter-migration/contracts/ethereum/bridge/IEthBridge.sol rename to plume-oft-adapter-migration/test/bridge/IEthBridge.sol diff --git a/plume-oft-adapter-migration/contracts/ethereum/bridge/IInbox.sol b/plume-oft-adapter-migration/test/bridge/IInbox.sol similarity index 100% rename from plume-oft-adapter-migration/contracts/ethereum/bridge/IInbox.sol rename to plume-oft-adapter-migration/test/bridge/IInbox.sol diff --git a/plume-oft-adapter-migration/contracts/ethereum/bridge/IInboxBase.sol b/plume-oft-adapter-migration/test/bridge/IInboxBase.sol similarity index 100% rename from plume-oft-adapter-migration/contracts/ethereum/bridge/IInboxBase.sol rename to plume-oft-adapter-migration/test/bridge/IInboxBase.sol diff --git a/plume-oft-adapter-migration/contracts/ethereum/bridge/ISequencerInbox.sol b/plume-oft-adapter-migration/test/bridge/ISequencerInbox.sol similarity index 100% rename from plume-oft-adapter-migration/contracts/ethereum/bridge/ISequencerInbox.sol rename to plume-oft-adapter-migration/test/bridge/ISequencerInbox.sol diff --git a/plume-oft-adapter-migration/contracts/ethereum/bridge/Messages.sol b/plume-oft-adapter-migration/test/bridge/Messages.sol similarity index 100% rename from plume-oft-adapter-migration/contracts/ethereum/bridge/Messages.sol rename to plume-oft-adapter-migration/test/bridge/Messages.sol From 607d0d960af4b72e04fcc99a48c6a1e784c4b477 Mon Sep 17 00:00:00 2001 From: ravinagill15 Date: Fri, 18 Jul 2025 14:11:06 -0700 Subject: [PATCH 07/20] renamed mock file --- ...eOFTAdapter.sol => MockArbNativeOFTAdapterUpgradeable.sol} | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) rename plume-oft-adapter-migration/test/mocks/{MockArbNativeOFTAdapter.sol => MockArbNativeOFTAdapterUpgradeable.sol} (85%) diff --git a/plume-oft-adapter-migration/test/mocks/MockArbNativeOFTAdapter.sol b/plume-oft-adapter-migration/test/mocks/MockArbNativeOFTAdapterUpgradeable.sol similarity index 85% rename from plume-oft-adapter-migration/test/mocks/MockArbNativeOFTAdapter.sol rename to plume-oft-adapter-migration/test/mocks/MockArbNativeOFTAdapterUpgradeable.sol index e3ad0960..9cc6b111 100644 --- a/plume-oft-adapter-migration/test/mocks/MockArbNativeOFTAdapter.sol +++ b/plume-oft-adapter-migration/test/mocks/MockArbNativeOFTAdapterUpgradeable.sol @@ -1,9 +1,9 @@ // SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.22; -import { ArbNativeOFTAdapter } from "../../src/L3/ArbNativeOFTAdapter.sol"; +import { ArbNativeOFTAdapterUpgradeable } from "../../src/L3/ArbNativeOFTAdapterUpgradeable.sol"; -contract MockArbNativeOFTAdapter is ArbNativeOFTAdapter { +contract MockArbNativeOFTAdapterUpgradeable is ArbNativeOFTAdapterUpgradeable { /** * @param _localDecimals The decimals of the native on the local chain (this chain). 18 on ETH. * @param _lzEndpoint The LayerZero endpoint address. From 7fbcbfb6cfbb196bdb29bb69b5b7ac04a0da22f9 Mon Sep 17 00:00:00 2001 From: ravinagill15 Date: Fri, 18 Jul 2025 14:18:47 -0700 Subject: [PATCH 08/20] updated ArbNativeOFTAdapter test for upgradeable contracts --- .../test/ArbNativeOFTAdapter.t.sol | 180 +++++++++++------- 1 file changed, 112 insertions(+), 68 deletions(-) diff --git a/plume-oft-adapter-migration/test/ArbNativeOFTAdapter.t.sol b/plume-oft-adapter-migration/test/ArbNativeOFTAdapter.t.sol index 4f7fb974..6ea564fa 100644 --- a/plume-oft-adapter-migration/test/ArbNativeOFTAdapter.t.sol +++ b/plume-oft-adapter-migration/test/ArbNativeOFTAdapter.t.sol @@ -1,55 +1,84 @@ pragma solidity ^0.8.22; -import "forge-std/console.sol"; - -import { Packet } from "@layerzerolabs/lz-evm-protocol-v2/contracts/interfaces/ISendLib.sol"; -import { OptionsBuilder } from "@layerzerolabs/lz-evm-oapp-v2/contracts/oapp/libs/OptionsBuilder.sol"; -import { MessagingFee } from "@layerzerolabs/lz-evm-oapp-v2/contracts/oapp/OApp.sol"; -import { MessagingReceipt, OAppSender } from "@layerzerolabs/lz-evm-oapp-v2/contracts/oapp/OAppSender.sol"; -import { IOFT, SendParam, OFTReceipt } from "@layerzerolabs/lz-evm-oapp-v2/contracts/oft/interfaces/IOFT.sol"; -import { TestHelper } from "./helpers/TestHelper.sol"; - -import { ArbNativeOFTAdapter } from "../src/L3/ArbNativeOFTAdapter.sol"; -import { MockArbNativeOFTAdapter } from "./mocks/MockArbNativeOFTAdapter.sol"; +import { TestHelperOz5 } from "@layerzerolabs/test-devtools-evm-foundry/contracts/TestHelperOz5.sol"; +import { ArbNativeOFTAdapterUpgradeable } from "../../contracts/plume/ArbNativeOFTAdapterUpgradeable.sol"; +import { MockArbNativeOFTAdapterUpgradeable } from "./mocks/MockArbNativeOFTAdapterUpgradeable.sol"; import { MockOFT } from "./mocks/MockOFT.sol"; import { MockNativeTokenManager } from "./mocks/MockNativeTokenManager.sol"; -contract NativeOFTAdapterMsgValueTransferTest is TestHelper { +import { TransparentUpgradeableProxy } from "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; +import { OptionsBuilder } from "@layerzerolabs/oapp-evm/contracts/oapp/libs/OptionsBuilder.sol"; +import { MessagingFee, MessagingReceipt } from "@layerzerolabs/oft-evm/contracts/OFTCore.sol"; +import { SendParam, OFTReceipt, IOFT } from "@layerzerolabs/oft-evm/contracts/interfaces/IOFT.sol"; + + +contract ArbNativeOFTAdapterUpgradeableTest is TestHelperOz5 { using OptionsBuilder for bytes; address owner = makeAddr("owner"); address alice = makeAddr("alice"); address bob = makeAddr("bob"); + address public proxyAdmin = makeAddr("proxyAdmin"); uint32 eid_a = 1; uint32 eid_b = 2; - MockArbNativeOFTAdapter nativeOFTV2; - MockOFT remoteOFTV2; + MockArbNativeOFTAdapterUpgradeable adapter; + MockOFT remoteOFT; MockNativeTokenManager mockNativeTokenManager = MockNativeTokenManager(address(0x73)); + function _deployContractAndProxy( + bytes memory _oappBytecode, + bytes memory _constructorArgs, + bytes memory _initializeArgs + ) internal returns (address addr) { + bytes memory bytecode = bytes.concat(abi.encodePacked(_oappBytecode), _constructorArgs); + assembly { + addr := create(0, add(bytecode, 0x20), mload(bytecode)) + if iszero(extcodesize(addr)) { + revert(0, 0) + } + } + + return address(new TransparentUpgradeableProxy(addr, proxyAdmin, _initializeArgs)); + } + function setUp() public virtual override { super.setUp(); setUpEndpoints(2, LibraryType.UltraLightNode); - MockNativeTokenManager _mockNativeTokenManager = new MockNativeTokenManager(); - vm.etch(address(mockNativeTokenManager), address(_mockNativeTokenManager).code); + MockNativeTokenManager logic = new MockNativeTokenManager(); + vm.etch(address(mockNativeTokenManager), address(logic).code); - vm.startPrank(owner); + vm.deal(owner, 1000 ether); + + bytes memory constructorArgs = abi.encode(uint8(18), address(endpoints[eid_a])); + + bytes memory initializeArgs = abi.encodeWithSelector( + MockArbNativeOFTAdapterUpgradeable.initialize.selector, + owner + ); + + address proxyAddr = _deployContractAndProxy( + type(MockArbNativeOFTAdapterUpgradeable).creationCode, + constructorArgs, + initializeArgs + ); - nativeOFTV2 = new MockArbNativeOFTAdapter(18, endpoints[eid_a], owner); - remoteOFTV2 = new MockOFT("MyToken", "MTK", endpoints[eid_b], owner); + adapter = MockArbNativeOFTAdapterUpgradeable(proxyAddr); + remoteOFT = new MockOFT("MyToken", "MTK", endpoints[eid_b], owner); - nativeOFTV2.setPeer(eid_b, bytes32(uint(uint160(address(remoteOFTV2))))); - remoteOFTV2.setPeer(eid_a, bytes32(uint(uint160(address(nativeOFTV2))))); + vm.startPrank(owner); + adapter.setPeer(eid_b, addressToBytes32(address(remoteOFT))); + remoteOFT.setPeer(eid_a, addressToBytes32(address(adapter))); vm.stopPrank(); } - function test_constructor() public view { - assertEq(nativeOFTV2.owner(), owner); - assertEq(nativeOFTV2.token(), address(0)); - assertEq(nativeOFTV2.approvalRequired(), false); + function test_initialize_works() view public { + assertEq(adapter.owner(), owner); + assertEq(adapter.token(), address(0)); + assertEq(adapter.approvalRequired(), false); } function test_send_with_enough_native() public { @@ -58,10 +87,11 @@ contract NativeOFTAdapterMsgValueTransferTest is TestHelper { assertEq(mockNativeTokenManager.mintedAmount(), 0); assertEq(mockNativeTokenManager.burnedAmount(), 0); - assertEq(remoteOFTV2.balanceOf(alice), 0); - assertEq(address(nativeOFTV2).balance, 0); + assertEq(remoteOFT.balanceOf(alice), 0); + assertEq(address(adapter).balance, 0); vm.startPrank(alice); + uint256 totalAmount = 4 ether + 1 wei; uint256 totalAmountMinusDust = 4 ether; @@ -74,21 +104,25 @@ contract NativeOFTAdapterMsgValueTransferTest is TestHelper { "", "" ); - MessagingFee memory fee = nativeOFTV2.quoteSend(sendParam, false); + + MessagingFee memory fee = adapter.quoteSend(sendParam, false); uint256 messageValue = fee.nativeFee + totalAmountMinusDust; - nativeOFTV2.send{ value: messageValue }(sendParam, fee, alice); - verifyPackets(eid_b, addressToBytes32(address(remoteOFTV2))); + adapter.send{ value: messageValue }(sendParam, fee, alice); + verifyPackets(eid_b, addressToBytes32(address(remoteOFT))); + + vm.stopPrank(); assertEq(alice.balance, initialAliceBalance - totalAmountMinusDust - fee.nativeFee); - assertEq(address(nativeOFTV2).balance, 0); + assertEq(address(adapter).balance, 0); assertEq(mockNativeTokenManager.mintedAmount(), 0); assertEq(mockNativeTokenManager.burnedAmount(), totalAmountMinusDust); - assertEq(remoteOFTV2.balanceOf(alice), totalAmountMinusDust); - assertEq(remoteOFTV2.totalSupply(), totalAmountMinusDust); + assertEq(remoteOFT.balanceOf(alice), totalAmountMinusDust); + assertEq(remoteOFT.totalSupply(), totalAmountMinusDust); } - function test_send_from_main_to_other_chain_using_default() public { + + function test_send_from_main_to_other_chain_using_upgradeable_adapter() public { uint256 initialAliceBalance = 20 ether; uint256 initialBobBalance = 0 ether; deal(alice, initialAliceBalance); @@ -96,8 +130,8 @@ contract NativeOFTAdapterMsgValueTransferTest is TestHelper { assertEq(mockNativeTokenManager.mintedAmount(), 0); assertEq(mockNativeTokenManager.burnedAmount(), 0); - assertEq(remoteOFTV2.balanceOf(alice), 0); - assertEq(address(nativeOFTV2).balance, 0); + assertEq(remoteOFT.balanceOf(alice), 0); + assertEq(address(adapter).balance, 0); uint256 totalAmount = 8 ether; @@ -110,23 +144,22 @@ contract NativeOFTAdapterMsgValueTransferTest is TestHelper { "", "" ); - MessagingFee memory fee = nativeOFTV2.quoteSend(sendParam, false); + MessagingFee memory fee = adapter.quoteSend(sendParam, false); uint256 messageValue = fee.nativeFee + totalAmount; - + vm.prank(alice); - nativeOFTV2.send{ value: messageValue }(sendParam, fee, alice); + adapter.send{ value: messageValue }(sendParam, fee, alice); - verifyPackets(eid_b, addressToBytes32(address(remoteOFTV2))); + verifyPackets(eid_b, addressToBytes32(address(remoteOFT))); assertEq(alice.balance, initialAliceBalance - totalAmount - fee.nativeFee); - assertEq(address(nativeOFTV2).balance, 0); + assertEq(address(adapter).balance, 0); assertEq(mockNativeTokenManager.mintedAmount(), 0); assertEq(mockNativeTokenManager.burnedAmount(), totalAmount); - assertEq(remoteOFTV2.balanceOf(alice), totalAmount); - assertEq(remoteOFTV2.totalSupply(), totalAmount); + assertEq(remoteOFT.balanceOf(alice), totalAmount); + assertEq(remoteOFT.totalSupply(), totalAmount); // second send - SendParam memory sendParamSecondTx = SendParam( eid_a, addressToBytes32(bob), @@ -136,22 +169,22 @@ contract NativeOFTAdapterMsgValueTransferTest is TestHelper { "", "" ); - MessagingFee memory feeSecondTx = remoteOFTV2.quoteSend(sendParamSecondTx, false); + MessagingFee memory feeSecondTx = remoteOFT.quoteSend(sendParamSecondTx, false); vm.prank(alice); - remoteOFTV2.send{ value: feeSecondTx.nativeFee }(sendParamSecondTx, feeSecondTx, alice); + remoteOFT.send{ value: feeSecondTx.nativeFee }(sendParamSecondTx, feeSecondTx, alice); - verifyPackets(eid_a, addressToBytes32(address(nativeOFTV2))); + verifyPackets(eid_a, addressToBytes32(address(adapter))); assertEq(alice.balance, initialAliceBalance - totalAmount - fee.nativeFee - feeSecondTx.nativeFee); assertEq(bob.balance, totalAmount); - assertEq(address(nativeOFTV2).balance, 0); - assertEq(address(remoteOFTV2).balance, 0); + assertEq(address(adapter).balance, 0); + assertEq(address(remoteOFT).balance, 0); assertEq(mockNativeTokenManager.mintedAmount(), totalAmount); assertEq(mockNativeTokenManager.burnedAmount(), totalAmount); - assertEq(remoteOFTV2.balanceOf(alice), 0); - assertEq(remoteOFTV2.balanceOf(bob), 0); - assertEq(remoteOFTV2.totalSupply(), 0); + assertEq(remoteOFT.balanceOf(alice), 0); + assertEq(remoteOFT.balanceOf(bob), 0); + assertEq(remoteOFT.totalSupply(), 0); } function test_send_reverts_when_incorrect_message_value_passed() public { @@ -160,9 +193,9 @@ contract NativeOFTAdapterMsgValueTransferTest is TestHelper { assertEq(mockNativeTokenManager.mintedAmount(), 0); assertEq(mockNativeTokenManager.burnedAmount(), 0); - assertEq(remoteOFTV2.balanceOf(alice), 0); - assertEq(address(nativeOFTV2).balance, 0); - assertEq(remoteOFTV2.totalSupply(), 0); + assertEq(remoteOFT.balanceOf(alice), 0); + assertEq(address(adapter).balance, 0); + assertEq(remoteOFT.totalSupply(), 0); uint256 totalAmount = 8 ether; uint256 extraAmount = 2 ether; @@ -176,12 +209,18 @@ contract NativeOFTAdapterMsgValueTransferTest is TestHelper { "", "" ); - MessagingFee memory fee = nativeOFTV2.quoteSend(sendParam, false); + MessagingFee memory fee = adapter.quoteSend(sendParam, false); uint256 messageValue = fee.nativeFee + totalAmount + extraAmount; vm.prank(alice); - vm.expectRevert(abi.encodeWithSelector(ArbNativeOFTAdapter.IncorrectMessageValue.selector, messageValue, totalAmount + fee.nativeFee)); - nativeOFTV2.send{ value: messageValue }(sendParam, fee, alice); + vm.expectRevert( + abi.encodeWithSelector( + ArbNativeOFTAdapterUpgradeable.IncorrectMessageValue.selector, + messageValue, + totalAmount + fee.nativeFee + ) + ); + adapter.send{ value: messageValue }(sendParam, fee, alice); } function test_send_reverts_when_value_gt_fee_and_sender_balance_gt_send_amount() public { @@ -189,7 +228,7 @@ contract NativeOFTAdapterMsgValueTransferTest is TestHelper { assertEq(mockNativeTokenManager.mintedAmount(), 0); assertEq(mockNativeTokenManager.burnedAmount(), 0); - assertEq(address(nativeOFTV2).balance, 0); + assertEq(address(adapter).balance, 0); uint256 sendAmount = 2 ether; uint256 messageValue = 3 ether; @@ -204,29 +243,35 @@ contract NativeOFTAdapterMsgValueTransferTest is TestHelper { "", "" ); - MessagingFee memory fee = nativeOFTV2.quoteSend(sendParam, false); + MessagingFee memory fee = adapter.quoteSend(sendParam, false); vm.expectRevert( - abi.encodeWithSelector(ArbNativeOFTAdapter.IncorrectMessageValue.selector, messageValue, sendAmount + fee.nativeFee) + abi.encodeWithSelector( + ArbNativeOFTAdapterUpgradeable.IncorrectMessageValue.selector, + messageValue, + sendAmount + fee.nativeFee + ) ); - nativeOFTV2.send{ value: messageValue }(sendParam, fee, alice); + vm.prank(alice); + adapter.send{ value: messageValue }(sendParam, fee, alice); } - function test_native_oft_adapter_debit() public virtual { + function test_native_oft_adapter_debit() public { uint256 amountToSendLD = 1 ether; uint256 minAmountToCreditLD = 1 ether; uint32 dstEid = eid_b; - deal(address(nativeOFTV2), amountToSendLD); + deal(address(adapter), amountToSendLD); vm.prank(alice); vm.expectRevert( abi.encodeWithSelector(IOFT.SlippageExceeded.selector, amountToSendLD, minAmountToCreditLD + 1) ); - nativeOFTV2.debit(amountToSendLD, minAmountToCreditLD + 1, dstEid); + adapter.debit(alice, amountToSendLD, minAmountToCreditLD + 1, dstEid); vm.prank(alice); - (uint256 amountDebitedLD, uint256 amountToCreditLD) = nativeOFTV2.debit( + (uint256 amountDebitedLD, uint256 amountToCreditLD) = adapter.debit( + alice, amountToSendLD, minAmountToCreditLD, dstEid @@ -236,8 +281,7 @@ contract NativeOFTAdapterMsgValueTransferTest is TestHelper { assertEq(amountToCreditLD, amountToSendLD); assertEq(mockNativeTokenManager.mintedAmount(), 0); assertEq(mockNativeTokenManager.burnedAmount(), amountToSendLD); - assertEq(address(nativeOFTV2).balance, 0); + assertEq(address(adapter).balance, 0); assertEq(alice.balance, 0); } - } \ No newline at end of file From c14fc1b0d490fe8f6aef450e6a4e37ff9547e3fb Mon Sep 17 00:00:00 2001 From: ravinagill15 Date: Fri, 18 Jul 2025 14:19:29 -0700 Subject: [PATCH 09/20] renamed ArbNativeOFTAdapter to state upgradeable --- ...ativeOFTAdapter.t.sol => ArbNativeOFTAdapterUpgradeable.t.sol} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename plume-oft-adapter-migration/test/{ArbNativeOFTAdapter.t.sol => ArbNativeOFTAdapterUpgradeable.t.sol} (100%) diff --git a/plume-oft-adapter-migration/test/ArbNativeOFTAdapter.t.sol b/plume-oft-adapter-migration/test/ArbNativeOFTAdapterUpgradeable.t.sol similarity index 100% rename from plume-oft-adapter-migration/test/ArbNativeOFTAdapter.t.sol rename to plume-oft-adapter-migration/test/ArbNativeOFTAdapterUpgradeable.t.sol From 4e65bfb6420a23cf43734428eef2b01db8c432f6 Mon Sep 17 00:00:00 2001 From: ravinagill15 Date: Fri, 18 Jul 2025 14:22:20 -0700 Subject: [PATCH 10/20] updated L2_L3_flow tests to use upgradeable contracts --- .../test/L2_L3_flow.t.sol | 156 ++++++++++-------- 1 file changed, 88 insertions(+), 68 deletions(-) diff --git a/plume-oft-adapter-migration/test/L2_L3_flow.t.sol b/plume-oft-adapter-migration/test/L2_L3_flow.t.sol index fef26975..3ae46159 100644 --- a/plume-oft-adapter-migration/test/L2_L3_flow.t.sol +++ b/plume-oft-adapter-migration/test/L2_L3_flow.t.sol @@ -1,49 +1,50 @@ pragma solidity ^0.8.22; import { Packet } from "@layerzerolabs/lz-evm-protocol-v2/contracts/interfaces/ISendLib.sol"; -import { OptionsBuilder } from "@layerzerolabs/lz-evm-oapp-v2/contracts/oapp/libs/OptionsBuilder.sol"; -import { MessagingFee } from "@layerzerolabs/lz-evm-oapp-v2/contracts/oapp/OApp.sol"; -import { MessagingReceipt, OAppSender } from "@layerzerolabs/lz-evm-oapp-v2/contracts/oapp/OAppSender.sol"; -import { IOFT, SendParam, OFTReceipt } from "@layerzerolabs/lz-evm-oapp-v2/contracts/oft/interfaces/IOFT.sol"; +import { OptionsBuilder } from "@layerzerolabs/oapp-evm/contracts/oapp/libs/OptionsBuilder.sol"; +import { MessagingFee, MessagingReceipt } from "@layerzerolabs/oft-evm/contracts/OFTCore.sol"; +import { OAppSender } from "@layerzerolabs/oapp-evm/contracts/oapp/OAppSender.sol"; +import { SendParam, OFTReceipt, IOFT } from "@layerzerolabs/oft-evm/contracts/interfaces/IOFT.sol"; import { IUpgradeExecutor } from "@offchainlabs/upgrade-executor/src/IUpgradeExecutor.sol"; import { ProxyAdmin } from "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol"; import { ITransparentUpgradeableProxy, TransparentUpgradeableProxy } from "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; -import { IAccessControlUpgradeable } from "@openzeppelin/contracts-upgradeable/access/IAccessControlUpgradeable.sol"; - -import { GasToken } from "../src/L2/GasToken.sol"; -import { OrbitERC20OFTAdapter } from "../src/L2/OrbitERC20OFTAdapter.sol"; -import { IBridge } from "../src/L2/bridge/IBridge.sol"; -import { ERC20Bridge } from "../src/L2/bridge/ERC20Bridge.sol"; -import { IOwnable } from "../src/L2/bridge/IOwnable.sol"; -import { ISequencerInbox } from "../src/L2/bridge/ISequencerInbox.sol"; -import { SimpleProxy } from "../src/L2/mocks/SimpleProxy.sol"; -import { BridgeStub } from "../src/L2/mocks/BridgeStub.sol"; -import { RollupStub } from "../src/L2/mocks/RollupStub.sol"; -import { UpgradeExecutorMock } from "../src/L2/mocks/UpgradeExecutorMock.sol"; -import { OrbitNativeOFTAdapter } from "../src/L3/OrbitNativeOFTAdapter.sol"; -import { IDelayedMessageProvider } from "../src/L2/bridge/IDelayedMessageProvider.sol"; -import { TestHelper } from "./helpers/TestHelper.sol"; +import { IAccessControl } from "@openzeppelin/contracts/access/IAccessControl.sol"; + +import { GasToken } from "./mocks/GasToken.sol"; +import { OrbitERC20OFTAdapterUpgradeable } from "../../contracts/ethereum/OrbitERC20OFTAdapterUpgradeable.sol"; +import { IBridge } from "../../contracts/ethereum/bridge/IBridge.sol"; +import { ERC20Bridge } from "./bridge/ERC20Bridge.sol"; +import { IOwnable } from "../../contracts/ethereum/bridge/IOwnable.sol"; +import { ISequencerInbox } from "./bridge/ISequencerInbox.sol"; +import { SimpleProxy } from "./mocks/SimpleProxy.sol"; +import { BridgeStub } from "./mocks/BridgeStub.sol"; +import { RollupStub } from "./mocks/RollupStub.sol"; +import { UpgradeExecutorMock } from "./mocks/UpgradeExecutorMock.sol"; +import { OrbitNativeOFTAdapterUpgradeable } from "../../contracts/plume/OrbitNativeOFTAdapterUpgradeable.sol"; +import { IDelayedMessageProvider } from "./bridge/IDelayedMessageProvider.sol"; import { MockNativeTokenManager } from "./mocks/MockNativeTokenManager.sol"; +import { TestHelperOz5 } from "@layerzerolabs/test-devtools-evm-foundry/contracts/TestHelperOz5.sol"; + import "forge-std/console.sol"; -contract L2ToL3FlowTest is TestHelper { +contract EthToPlumeFlowTest is TestHelperOz5 { using OptionsBuilder for bytes; address rollupOwner = makeAddr("rollupOwner"); address alice = makeAddr("alice"); address bob = makeAddr("bob"); - uint32 L2_Eid = 1; - uint32 L3_Eid = 2; + uint32 ETH_Eid = 1; + uint32 PLUME_Eid = 2; - // L2 - OrbitERC20OFTAdapter l2Adapter; + // ETH + OrbitERC20OFTAdapterUpgradeable ethAdapter; GasToken gasToken; - IUpgradeExecutor l2UpgradeExecutor; + IUpgradeExecutor ethUpgradeExecutor; - // L3 - OrbitNativeOFTAdapter l3Adapter; + // PLUME + OrbitNativeOFTAdapterUpgradeable plumeAdapter; MockNativeTokenManager mockNativeTokenManager = MockNativeTokenManager(address(0x73)); uint256 gasTokenSupply = 100 ether; @@ -58,8 +59,8 @@ contract L2ToL3FlowTest is TestHelper { MockNativeTokenManager _mockNativeTokenManager = new MockNativeTokenManager(); vm.etch(address(mockNativeTokenManager), address(_mockNativeTokenManager).code); - // L2 - address endpointL2 = endpoints[L2_Eid]; + // ETH + address endpointETH = endpoints[ETH_Eid]; vm.startPrank(rollupOwner); gasToken = new GasToken("GasToken", "GTK"); @@ -67,47 +68,66 @@ contract L2ToL3FlowTest is TestHelper { address[] memory executors = new address[](1); executors[0] = rollupOwner; - ProxyAdmin proxyAdmin = new ProxyAdmin(); - l2UpgradeExecutor = new UpgradeExecutorMock(); + ProxyAdmin proxyAdmin = new ProxyAdmin(rollupOwner); + ethUpgradeExecutor = new UpgradeExecutorMock(); TransparentUpgradeableProxy transparentProxy = new TransparentUpgradeableProxy( - address(l2UpgradeExecutor), + address(ethUpgradeExecutor), address(proxyAdmin), abi.encodeWithSelector(UpgradeExecutorMock.initialize.selector, rollupOwner, executors) ); - l2UpgradeExecutor = IUpgradeExecutor(address(transparentProxy)); + ethUpgradeExecutor = IUpgradeExecutor(address(transparentProxy)); - bool isRollupOwnerExecutor = IAccessControlUpgradeable(address(l2UpgradeExecutor)).hasRole(keccak256("EXECUTOR_ROLE"), rollupOwner); + bool isRollupOwnerExecutor = IAccessControl(address(ethUpgradeExecutor)).hasRole(keccak256("EXECUTOR_ROLE"), rollupOwner); if (!isRollupOwnerExecutor) { revert("!isRollupOwnerExecutor"); } - RollupStub rollup = new RollupStub(address(l2UpgradeExecutor)); + RollupStub rollup = new RollupStub(address(ethUpgradeExecutor)); + + ERC20Bridge ethBridge = new ERC20Bridge(); + SimpleProxy ethBridgeProxy = new SimpleProxy(address(ethBridge)); + ethBridge = ERC20Bridge(address(ethBridgeProxy)); + ethBridge.initialize(rollup, address(gasToken)); + + OrbitERC20OFTAdapterUpgradeable ethLogic = new OrbitERC20OFTAdapterUpgradeable(address(gasToken), endpointETH, ethBridge); + + // Deploy proxy + TransparentUpgradeableProxy ethProxy = new TransparentUpgradeableProxy( + address(ethLogic), + address(proxyAdmin), + abi.encodeWithSelector(OrbitERC20OFTAdapterUpgradeable.initialize.selector, rollupOwner) + ); + + // Use the proxy address as the adapter instance + ethAdapter = OrbitERC20OFTAdapterUpgradeable(address(ethProxy)); + + address endpointPLUME = endpoints[PLUME_Eid]; - ERC20Bridge l2Bridge = new ERC20Bridge(); - SimpleProxy l2BridgeProxy = new SimpleProxy(address(l2Bridge)); - l2Bridge = ERC20Bridge(address(l2BridgeProxy)); - l2Bridge.initialize(rollup, address(gasToken)); + OrbitNativeOFTAdapterUpgradeable plumeLogic = new OrbitNativeOFTAdapterUpgradeable(18, endpointPLUME); - l2Adapter = new OrbitERC20OFTAdapter(address(gasToken), endpointL2, rollupOwner, l2Bridge); + // Deploy the proxy, initializing through the constructor + TransparentUpgradeableProxy plumeProxy = new TransparentUpgradeableProxy( + address(plumeLogic), + address(proxyAdmin), + abi.encodeWithSelector(OrbitNativeOFTAdapterUpgradeable.initialize.selector, rollupOwner) + ); - // L3 - address endpointL3 = endpoints[L3_Eid]; - l3Adapter = new OrbitNativeOFTAdapter(18, endpointL3, rollupOwner); - address l3AdapterAddress = address(l3Adapter); + // Cast the proxy address to the adapter interface + plumeAdapter = OrbitNativeOFTAdapterUpgradeable(address(plumeProxy)); + address plumeAdapterAddress = address(plumeAdapter); - // L2 - gasToken.mint(address(l2Bridge), gasTokenSupply); - l2UpgradeExecutor.executeCall(address(l2Bridge), abi.encodeWithSelector(l2Bridge.setOutbox.selector, address(l2Adapter), true)); + gasToken.mint(address(ethBridge), gasTokenSupply); + ethUpgradeExecutor.executeCall(address(ethBridge), abi.encodeWithSelector(ethBridge.setOutbox.selector, address(ethAdapter), true)); - l2Adapter.setPeer(L3_Eid, bytes32(uint(uint160(l3AdapterAddress)))); - l3Adapter.setPeer(L2_Eid, bytes32(uint(uint160(address(l2Adapter))))); + ethAdapter.setPeer(PLUME_Eid, bytes32(uint(uint160(plumeAdapterAddress)))); + plumeAdapter.setPeer(ETH_Eid, bytes32(uint(uint160(address(ethAdapter))))); vm.stopPrank(); assertEq(gasToken.balanceOf(rollupOwner), 0); - assertEq(address(l3Adapter).balance, 0, "L3 adapter balance has to be 0 because it uses mint burn"); + assertEq(address(plumeAdapter).balance, 0, "PLUME adapter balance has to be 0 because it uses mint burn"); } - function test_send_l2_to_l3_different_account() public { + function test_send_eth_to_plume_different_account() public { uint256 tokensToSend = 1 ether; uint256 initialNativeBalance = 1 ether; @@ -120,11 +140,11 @@ contract L2ToL3FlowTest is TestHelper { assertEq(alice.balance, initialNativeBalance); vm.startPrank(alice); - gasToken.approve(address(l2Adapter), tokensToSend); + gasToken.approve(address(ethAdapter), tokensToSend); bytes memory options = OptionsBuilder.newOptions().addExecutorLzReceiveOption(200000, 0); SendParam memory sendParam = SendParam( - L3_Eid, + PLUME_Eid, addressToBytes32(bob), tokensToSend, tokensToSend, @@ -132,20 +152,20 @@ contract L2ToL3FlowTest is TestHelper { "", "" ); - MessagingFee memory fee = l2Adapter.quoteSend(sendParam, false); + MessagingFee memory fee = ethAdapter.quoteSend(sendParam, false); - l2Adapter.send{ value: fee.nativeFee }(sendParam, fee, alice); + ethAdapter.send{ value: fee.nativeFee }(sendParam, fee, alice); vm.stopPrank(); - verifyPackets(L3_Eid, addressToBytes32(address(l3Adapter))); + verifyPackets(PLUME_Eid, addressToBytes32(address(plumeAdapter))); assertEq(gasToken.balanceOf(alice), 0); assertEq(alice.balance, initialNativeBalance - fee.nativeFee); assertEq(bob.balance, tokensToSend); } - function test_send_l2_to_l3_same_account() public { + function test_send_eth_to_plume_same_account() public { uint256 tokensToSend = 1 ether; uint256 initialNativeBalance = 1 ether; @@ -158,11 +178,11 @@ contract L2ToL3FlowTest is TestHelper { assertEq(rollupOwner.balance, initialNativeBalance); vm.startPrank(rollupOwner); - gasToken.approve(address(l2Adapter), tokensToSend); + gasToken.approve(address(ethAdapter), tokensToSend); bytes memory options = OptionsBuilder.newOptions().addExecutorLzReceiveOption(200000, 0); SendParam memory sendParam = SendParam( - L3_Eid, + PLUME_Eid, addressToBytes32(rollupOwner), tokensToSend, tokensToSend, @@ -170,19 +190,19 @@ contract L2ToL3FlowTest is TestHelper { "", "" ); - MessagingFee memory fee = l2Adapter.quoteSend(sendParam, false); + MessagingFee memory fee = ethAdapter.quoteSend(sendParam, false); - l2Adapter.send{ value: fee.nativeFee }(sendParam, fee, rollupOwner); + ethAdapter.send{ value: fee.nativeFee }(sendParam, fee, rollupOwner); vm.stopPrank(); - verifyPackets(L3_Eid, addressToBytes32(address(l3Adapter))); + verifyPackets(PLUME_Eid, addressToBytes32(address(plumeAdapter))); assertEq(gasToken.balanceOf(rollupOwner), 0); assertEq(rollupOwner.balance, initialNativeBalance - fee.nativeFee + tokensToSend); } - function test_send_l3_to_l2() public { + function test_send_plume_to_eth() public { uint256 tokensToSend = 1 ether; uint256 initialNativeBalance = 2 ether; @@ -195,7 +215,7 @@ contract L2ToL3FlowTest is TestHelper { bytes memory options = OptionsBuilder.newOptions().addExecutorLzReceiveOption(200000, 0); SendParam memory sendParam = SendParam( - L2_Eid, + ETH_Eid, addressToBytes32(bob), tokensToSend, tokensToSend, @@ -203,16 +223,16 @@ contract L2ToL3FlowTest is TestHelper { "", "" ); - MessagingFee memory fee = l3Adapter.quoteSend(sendParam, false); + MessagingFee memory fee = plumeAdapter.quoteSend(sendParam, false); vm.prank(alice); - l3Adapter.send{ value: tokensToSend + fee.nativeFee }(sendParam, fee, alice); + plumeAdapter.send{ value: tokensToSend + fee.nativeFee }(sendParam, fee, alice); - verifyPackets(L2_Eid, addressToBytes32(address(l2Adapter))); + verifyPackets(ETH_Eid, addressToBytes32(address(ethAdapter))); assertEq(gasToken.balanceOf(alice), 0); assertEq(gasToken.balanceOf(bob), tokensToSend); - assertEq(address(l3Adapter).balance, 0); + assertEq(address(plumeAdapter).balance, 0); assertEq(mockNativeTokenManager.mintedAmount(), 0); assertEq(mockNativeTokenManager.burnedAmount(), tokensToSend); assertEq(alice.balance, initialNativeBalance - tokensToSend - fee.nativeFee); From 92ce167462e8072aa72ee4ec1844f41a877b94f3 Mon Sep 17 00:00:00 2001 From: ravinagill15 Date: Fri, 18 Jul 2025 14:24:04 -0700 Subject: [PATCH 11/20] renamed test to state upgradeable --- .../test/{L2_L3_flow.t.sol => eth_plume_flow.t.sol} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename plume-oft-adapter-migration/test/{L2_L3_flow.t.sol => eth_plume_flow.t.sol} (100%) diff --git a/plume-oft-adapter-migration/test/L2_L3_flow.t.sol b/plume-oft-adapter-migration/test/eth_plume_flow.t.sol similarity index 100% rename from plume-oft-adapter-migration/test/L2_L3_flow.t.sol rename to plume-oft-adapter-migration/test/eth_plume_flow.t.sol From cbba68f1fd353b708663e18f3f2a6c850a82a557 Mon Sep 17 00:00:00 2001 From: ravinagill15 Date: Fri, 18 Jul 2025 14:25:22 -0700 Subject: [PATCH 12/20] added offchain labs dependency and generated lock file --- plume-oft-adapter-migration/package.json | 1 + plume-oft-adapter-migration/pnpm-lock.yaml | 9893 ++++++++++++++++++++ 2 files changed, 9894 insertions(+) create mode 100644 plume-oft-adapter-migration/pnpm-lock.yaml diff --git a/plume-oft-adapter-migration/package.json b/plume-oft-adapter-migration/package.json index ea7b5ef9..4b779f2b 100644 --- a/plume-oft-adapter-migration/package.json +++ b/plume-oft-adapter-migration/package.json @@ -43,6 +43,7 @@ "@layerzerolabs/toolbox-hardhat": "~0.6.10", "@nomiclabs/hardhat-ethers": "^2.2.3", "@nomiclabs/hardhat-waffle": "^2.0.6", + "@offchainlabs/upgrade-executor": "1.1.0-beta.0", "@openzeppelin/contracts": "^5.0.2", "@openzeppelin/contracts-upgradeable": "^5.0.2", "@openzeppelin/hardhat-upgrades": "^1.28.0", diff --git a/plume-oft-adapter-migration/pnpm-lock.yaml b/plume-oft-adapter-migration/pnpm-lock.yaml new file mode 100644 index 00000000..69048aa7 --- /dev/null +++ b/plume-oft-adapter-migration/pnpm-lock.yaml @@ -0,0 +1,9893 @@ +lockfileVersion: '6.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +overrides: + ethers: ^5.7.2 + hardhat-deploy: ^0.12.1 + +devDependencies: + '@babel/core': + specifier: ^7.23.9 + version: 7.28.0 + '@layerzerolabs/devtools-evm-hardhat': + specifier: ^3.0.0 + version: 3.1.0(@ethersproject/abi@5.8.0)(@ethersproject/abstract-signer@5.8.0)(@ethersproject/contracts@5.8.0)(@ethersproject/providers@5.8.0)(@layerzerolabs/devtools-evm@2.0.1)(@layerzerolabs/devtools@1.0.1)(@layerzerolabs/io-devtools@0.2.1)(@layerzerolabs/lz-definitions@3.0.114)(@nomiclabs/hardhat-ethers@2.2.3)(ethers@5.8.0)(fp-ts@2.16.10)(hardhat-deploy@0.12.4)(hardhat@2.26.0) + '@layerzerolabs/eslint-config-next': + specifier: ~2.3.39 + version: 2.3.44(typescript@5.8.3) + '@layerzerolabs/io-devtools': + specifier: ~0.2.0 + version: 0.2.1(ink-gradient@2.0.0)(ink-table@3.1.0)(ink@3.2.0)(react@17.0.2)(yoga-layout-prebuilt@1.10.0)(zod@3.25.76) + '@layerzerolabs/lz-definitions': + specifier: ^3.0.75 + version: 3.0.114 + '@layerzerolabs/lz-evm-messagelib-v2': + specifier: ^3.0.75 + version: 3.0.114(@axelar-network/axelar-gmp-sdk-solidity@5.10.0)(@chainlink/contracts-ccip@0.7.6)(@eth-optimism/contracts@0.6.0)(@layerzerolabs/lz-evm-protocol-v2@3.0.114)(@layerzerolabs/lz-evm-v1-0.7@3.0.114)(@openzeppelin/contracts-upgradeable@5.4.0)(@openzeppelin/contracts@5.4.0)(hardhat-deploy@0.12.4)(solidity-bytes-utils@0.8.4) + '@layerzerolabs/lz-evm-protocol-v2': + specifier: ^3.0.75 + version: 3.0.114(@openzeppelin/contracts-upgradeable@5.4.0)(@openzeppelin/contracts@5.4.0)(hardhat-deploy@0.12.4)(solidity-bytes-utils@0.8.4) + '@layerzerolabs/lz-evm-sdk-v2': + specifier: ^3.0.75 + version: 3.0.114 + '@layerzerolabs/lz-evm-v1-0.7': + specifier: ^3.0.75 + version: 3.0.114(@openzeppelin/contracts-upgradeable@5.4.0)(@openzeppelin/contracts@5.4.0)(hardhat-deploy@0.12.4) + '@layerzerolabs/lz-v2-utilities': + specifier: ^3.0.75 + version: 3.0.114 + '@layerzerolabs/metadata-tools': + specifier: ^2.0.0 + version: 2.0.0(@layerzerolabs/devtools-evm-hardhat@3.1.0)(@layerzerolabs/ua-devtools@4.0.0) + '@layerzerolabs/oapp-evm': + specifier: ^0.3.2 + version: 0.3.2(@layerzerolabs/lz-evm-messagelib-v2@3.0.114)(@layerzerolabs/lz-evm-protocol-v2@3.0.114)(@layerzerolabs/lz-evm-v1-0.7@3.0.114)(@openzeppelin/contracts-upgradeable@5.4.0)(@openzeppelin/contracts@5.4.0) + '@layerzerolabs/oapp-evm-upgradeable': + specifier: ^0.1.2 + version: 0.1.2(@layerzerolabs/lz-evm-messagelib-v2@3.0.114)(@layerzerolabs/lz-evm-protocol-v2@3.0.114)(@layerzerolabs/lz-evm-v1-0.7@3.0.114)(@openzeppelin/contracts-upgradeable@5.4.0)(@openzeppelin/contracts@5.4.0) + '@layerzerolabs/oft-evm': + specifier: ^3.1.3 + version: 3.1.4(@layerzerolabs/lz-evm-messagelib-v2@3.0.114)(@layerzerolabs/lz-evm-protocol-v2@3.0.114)(@layerzerolabs/lz-evm-v1-0.7@3.0.114)(@layerzerolabs/oapp-evm@0.3.2)(@openzeppelin/contracts-upgradeable@5.4.0)(@openzeppelin/contracts@5.4.0) + '@layerzerolabs/oft-evm-upgradeable': + specifier: ^3.0.2 + version: 3.1.0(@layerzerolabs/lz-evm-messagelib-v2@3.0.114)(@layerzerolabs/lz-evm-protocol-v2@3.0.114)(@layerzerolabs/lz-evm-v1-0.7@3.0.114)(@layerzerolabs/oapp-evm@0.3.2)(@openzeppelin/contracts-upgradeable@5.4.0)(@openzeppelin/contracts@5.4.0) + '@layerzerolabs/prettier-config-next': + specifier: ^2.3.39 + version: 2.3.44 + '@layerzerolabs/solhint-config': + specifier: ^3.0.12 + version: 3.0.114(typescript@5.8.3) + '@layerzerolabs/test-devtools-evm-foundry': + specifier: ~6.0.3 + version: 6.0.3(@layerzerolabs/lz-evm-messagelib-v2@3.0.114)(@layerzerolabs/lz-evm-protocol-v2@3.0.114)(@layerzerolabs/lz-evm-v1-0.7@3.0.114)(@layerzerolabs/oapp-evm@0.3.2)(@layerzerolabs/oft-evm@3.1.4)(@openzeppelin/contracts-upgradeable@5.4.0)(@openzeppelin/contracts@5.4.0) + '@layerzerolabs/toolbox-foundry': + specifier: ~0.1.12 + version: 0.1.13 + '@layerzerolabs/toolbox-hardhat': + specifier: ~0.6.10 + version: 0.6.11(@ethersproject/abstract-provider@5.8.0)(@ethersproject/abstract-signer@5.8.0)(@ethersproject/bignumber@5.8.0)(@ethersproject/constants@5.8.0)(@ethersproject/providers@5.8.0)(@nomicfoundation/hardhat-ethers@3.1.0)(@nomiclabs/hardhat-ethers@2.2.3)(ethers@5.8.0)(hardhat-deploy@0.12.4)(hardhat@2.26.0)(solidity-bytes-utils@0.8.4) + '@nomiclabs/hardhat-ethers': + specifier: ^2.2.3 + version: 2.2.3(ethers@5.8.0)(hardhat@2.26.0) + '@nomiclabs/hardhat-waffle': + specifier: ^2.0.6 + version: 2.0.6(@nomiclabs/hardhat-ethers@2.2.3)(@types/sinon-chai@3.2.12)(ethereum-waffle@4.0.10)(ethers@5.8.0)(hardhat@2.26.0) + '@offchainlabs/upgrade-executor': + specifier: 1.1.0-beta.0 + version: 1.1.0-beta.0 + '@openzeppelin/contracts': + specifier: ^5.0.2 + version: 5.4.0 + '@openzeppelin/contracts-upgradeable': + specifier: ^5.0.2 + version: 5.4.0(@openzeppelin/contracts@5.4.0) + '@openzeppelin/hardhat-upgrades': + specifier: ^1.28.0 + version: 1.28.0(@nomiclabs/hardhat-ethers@2.2.3)(@nomiclabs/hardhat-etherscan@3.1.8)(ethers@5.8.0)(hardhat@2.26.0) + '@rushstack/eslint-patch': + specifier: ^1.7.0 + version: 1.12.0 + '@types/chai': + specifier: ^4.3.11 + version: 4.3.20 + '@types/mocha': + specifier: ^10.0.6 + version: 10.0.10 + '@types/node': + specifier: ~18.18.14 + version: 18.18.14 + chai: + specifier: ^4.4.1 + version: 4.5.0 + concurrently: + specifier: ~9.1.0 + version: 9.1.2 + dotenv: + specifier: ^16.4.1 + version: 16.6.1 + eslint: + specifier: ^8.55.0 + version: 8.57.1 + eslint-plugin-jest-extended: + specifier: ~2.0.0 + version: 2.0.3(eslint@8.57.1)(typescript@5.8.3) + ethers: + specifier: ^5.7.2 + version: 5.8.0 + hardhat: + specifier: ^2.22.10 + version: 2.26.0(ts-node@10.9.2)(typescript@5.8.3) + hardhat-contract-sizer: + specifier: ^2.10.0 + version: 2.10.0(hardhat@2.26.0) + hardhat-deploy: + specifier: ^0.12.1 + version: 0.12.4 + hardhat-deploy-ethers: + specifier: ^0.3.0-beta.13 + version: 0.3.0-beta.13(ethers@5.8.0)(hardhat@2.26.0) + mocha: + specifier: ^10.2.0 + version: 10.8.2 + prettier: + specifier: ^3.2.5 + version: 3.6.2 + solhint: + specifier: ^4.1.1 + version: 4.5.4(typescript@5.8.3) + solidity-bytes-utils: + specifier: ^0.8.2 + version: 0.8.4 + ts-node: + specifier: ^10.9.2 + version: 10.9.2(@types/node@18.18.14)(typescript@5.8.3) + typescript: + specifier: ^5.4.4 + version: 5.8.3 + +packages: + + /@ampproject/remapping@2.3.0: + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/gen-mapping': 0.3.12 + '@jridgewell/trace-mapping': 0.3.29 + dev: true + + /@aws-crypto/sha256-js@1.2.2: + resolution: {integrity: sha512-Nr1QJIbW/afYYGzYvrF70LtaHrIRtd4TNAglX8BvlfxJLZ45SAmueIKYl5tWoNBPzp65ymXGFK0Bb1vZUpuc9g==} + dependencies: + '@aws-crypto/util': 1.2.2 + '@aws-sdk/types': 3.840.0 + tslib: 1.14.1 + dev: true + + /@aws-crypto/util@1.2.2: + resolution: {integrity: sha512-H8PjG5WJ4wz0UXAFXeJjWCW1vkvIJ3qUUD+rGRwJ2/hj+xT58Qle2MTql/2MGzkU+1JLAFuR6aJpLAjHwhmwwg==} + dependencies: + '@aws-sdk/types': 3.840.0 + '@aws-sdk/util-utf8-browser': 3.259.0 + tslib: 1.14.1 + dev: true + + /@aws-sdk/types@3.840.0: + resolution: {integrity: sha512-xliuHaUFZxEx1NSXeLLZ9Dyu6+EJVQKEoD+yM+zqUo3YDZ7medKJWY6fIOKiPX/N7XbLdBYwajb15Q7IL8KkeA==} + engines: {node: '>=18.0.0'} + dependencies: + '@smithy/types': 4.3.1 + tslib: 2.8.1 + dev: true + + /@aws-sdk/util-utf8-browser@3.259.0: + resolution: {integrity: sha512-UvFa/vR+e19XookZF8RzFZBrw2EUkQWxiBW0yYQAhvk3C+QVGl0H3ouca8LDBlBfQKXwmW3huo/59H8rwb1wJw==} + dependencies: + tslib: 2.8.1 + dev: true + + /@axelar-network/axelar-gmp-sdk-solidity@5.10.0: + resolution: {integrity: sha512-s8SImALvYB+5AeiT3tbfWNBI2Mhqw1x91i/zM3DNpVUCnAR2HKtsB9T84KnUn/OJjOVgb4h0lv7q9smeYniRPw==} + engines: {node: '>=18'} + dev: true + + /@babel/code-frame@7.27.1: + resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-validator-identifier': 7.27.1 + js-tokens: 4.0.0 + picocolors: 1.1.1 + dev: true + + /@babel/compat-data@7.28.0: + resolution: {integrity: sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/core@7.28.0: + resolution: {integrity: sha512-UlLAnTPrFdNGoFtbSXwcGFQBtQZJCNjaN6hQNP3UPvuNXT1i82N26KL3dZeIpNalWywr9IuQuncaAfUaS1g6sQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@ampproject/remapping': 2.3.0 + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.28.0 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-module-transforms': 7.27.3(@babel/core@7.28.0) + '@babel/helpers': 7.27.6 + '@babel/parser': 7.28.0 + '@babel/template': 7.27.2 + '@babel/traverse': 7.28.0 + '@babel/types': 7.28.1 + convert-source-map: 2.0.0 + debug: 4.4.1(supports-color@8.1.1) + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/generator@7.28.0: + resolution: {integrity: sha512-lJjzvrbEeWrhB4P3QBsH7tey117PjLZnDbLiQEKjQ/fNJTjuq4HSqgFA+UNSwZT8D7dxxbnuSBMsa1lrWzKlQg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/parser': 7.28.0 + '@babel/types': 7.28.1 + '@jridgewell/gen-mapping': 0.3.12 + '@jridgewell/trace-mapping': 0.3.29 + jsesc: 3.1.0 + dev: true + + /@babel/helper-compilation-targets@7.27.2: + resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/compat-data': 7.28.0 + '@babel/helper-validator-option': 7.27.1 + browserslist: 4.25.1 + lru-cache: 5.1.1 + semver: 6.3.1 + dev: true + + /@babel/helper-globals@7.28.0: + resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-module-imports@7.27.1: + resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/traverse': 7.28.0 + '@babel/types': 7.28.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/helper-module-transforms@7.27.3(@babel/core@7.28.0): + resolution: {integrity: sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + '@babel/traverse': 7.28.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/helper-string-parser@7.27.1: + resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-validator-identifier@7.27.1: + resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-validator-option@7.27.1: + resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helpers@7.27.6: + resolution: {integrity: sha512-muE8Tt8M22638HU31A3CgfSUciwz1fhATfoVai05aPXGor//CdWDCbnlY1yvBPo07njuVOCNGCSp/GTt12lIug==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.27.2 + '@babel/types': 7.28.1 + dev: true + + /@babel/parser@7.28.0: + resolution: {integrity: sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': 7.28.1 + dev: true + + /@babel/template@7.27.2: + resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/parser': 7.28.0 + '@babel/types': 7.28.1 + dev: true + + /@babel/traverse@7.28.0: + resolution: {integrity: sha512-mGe7UK5wWyh0bKRfupsUchrQGqvDbZDbKJw+kcRGSmdHVYrv+ltd0pnpDTVpiTqnaBru9iEvA8pz8W46v0Amwg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.28.0 + '@babel/helper-globals': 7.28.0 + '@babel/parser': 7.28.0 + '@babel/template': 7.27.2 + '@babel/types': 7.28.1 + debug: 4.4.1(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/types@7.28.1: + resolution: {integrity: sha512-x0LvFTekgSX+83TI28Y9wYPUfzrnl2aT5+5QLnO6v7mSJYtEEevuDRN0F0uSHRk1G1IWZC43o00Y0xDDrpBGPQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + dev: true + + /@bytecodealliance/preview2-shim@0.17.0: + resolution: {integrity: sha512-JorcEwe4ud0x5BS/Ar2aQWOQoFzjq/7jcnxYXCvSMh0oRm0dQXzOA+hqLDBnOMks1LLBA7dmiLLsEBl09Yd6iQ==} + dev: true + + /@chainlink/contracts-ccip@0.7.6(ethers@5.8.0): + resolution: {integrity: sha512-yNbCBFpLs3R+ALymto9dQYKz3vatnjqYGu1pnMD0i2fHEMthiXe0+otaNCGNht6n8k7ruNaA0DNpz3F+2jHQXw==} + dependencies: + '@eth-optimism/contracts': 0.5.40(ethers@5.8.0) + '@openzeppelin/contracts': 4.3.3 + '@openzeppelin/contracts-upgradeable-4.7.3': /@openzeppelin/contracts-upgradeable@4.7.3 + '@openzeppelin/contracts-v0.7': /@openzeppelin/contracts@3.4.2 + transitivePeerDependencies: + - bufferutil + - ethers + - utf-8-validate + dev: true + + /@colors/colors@1.5.0: + resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==} + engines: {node: '>=0.1.90'} + requiresBuild: true + dev: true + optional: true + + /@colors/colors@1.6.0: + resolution: {integrity: sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==} + engines: {node: '>=0.1.90'} + dev: true + + /@cspotcode/source-map-support@0.8.1: + resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} + engines: {node: '>=12'} + dependencies: + '@jridgewell/trace-mapping': 0.3.9 + dev: true + + /@dabh/diagnostics@2.0.3: + resolution: {integrity: sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==} + dependencies: + colorspace: 1.1.4 + enabled: 2.0.0 + kuler: 2.0.0 + dev: true + + /@emnapi/core@1.4.5: + resolution: {integrity: sha512-XsLw1dEOpkSX/WucdqUhPWP7hDxSvZiY+fsUC14h+FtQ2Ifni4znbBt8punRX+Uj2JG/uDb8nEHVKvrVlvdZ5Q==} + requiresBuild: true + dependencies: + '@emnapi/wasi-threads': 1.0.4 + tslib: 2.8.1 + dev: true + optional: true + + /@emnapi/runtime@1.4.5: + resolution: {integrity: sha512-++LApOtY0pEEz1zrd9vy1/zXVaVJJ/EbAF3u0fXIzPJEDtnITsBGbbK0EkM72amhl/R5b+5xx0Y/QhcVOpuulg==} + requiresBuild: true + dependencies: + tslib: 2.8.1 + dev: true + optional: true + + /@emnapi/wasi-threads@1.0.4: + resolution: {integrity: sha512-PJR+bOmMOPH8AtcTGAyYNiuJ3/Fcoj2XN/gBEWzDIKh254XO+mM9XoXHk5GNEhodxeMznbg7BlRojVbKN+gC6g==} + requiresBuild: true + dependencies: + tslib: 2.8.1 + dev: true + optional: true + + /@ensdomains/ens@0.4.5: + resolution: {integrity: sha512-JSvpj1iNMFjK6K+uVl4unqMoa9rf5jopb8cya5UGBWz23Nw8hSNT7efgUx4BTlAPAgpNlEioUfeTyQ6J9ZvTVw==} + deprecated: Please use @ensdomains/ens-contracts + dependencies: + bluebird: 3.7.2 + eth-ens-namehash: 2.0.8 + solc: 0.4.26 + testrpc: 0.0.1 + web3-utils: 1.10.4 + dev: true + + /@ensdomains/resolver@0.2.4: + resolution: {integrity: sha512-bvaTH34PMCbv6anRa9I/0zjLJgY4EuznbEMgbV77JBCQ9KNC46rzi0avuxpOfu+xDjPEtSFGqVEOr5GlUSGudA==} + deprecated: Please use @ensdomains/ens-contracts + dev: true + + /@eslint-community/eslint-utils@4.7.0(eslint@8.57.1): + resolution: {integrity: sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + dependencies: + eslint: 8.57.1 + eslint-visitor-keys: 3.4.3 + dev: true + + /@eslint-community/regexpp@4.12.1: + resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + dev: true + + /@eslint/eslintrc@2.1.4: + resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + ajv: 6.12.6 + debug: 4.4.1(supports-color@8.1.1) + espree: 9.6.1 + globals: 13.24.0 + ignore: 5.3.2 + import-fresh: 3.3.1 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@eslint/js@8.57.1: + resolution: {integrity: sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + + /@eth-optimism/contracts@0.5.40(ethers@5.8.0): + resolution: {integrity: sha512-MrzV0nvsymfO/fursTB7m/KunkPsCndltVgfdHaT1Aj5Vi6R/doKIGGkOofHX+8B6VMZpuZosKCMQ5lQuqjt8w==} + peerDependencies: + ethers: ^5.7.2 + dependencies: + '@eth-optimism/core-utils': 0.12.0 + '@ethersproject/abstract-provider': 5.8.0 + '@ethersproject/abstract-signer': 5.8.0 + ethers: 5.8.0 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + dev: true + + /@eth-optimism/contracts@0.6.0(ethers@5.8.0): + resolution: {integrity: sha512-vQ04wfG9kMf1Fwy3FEMqH2QZbgS0gldKhcBeBUPfO8zu68L61VI97UDXmsMQXzTsEAxK8HnokW3/gosl4/NW3w==} + peerDependencies: + ethers: ^5.7.2 + dependencies: + '@eth-optimism/core-utils': 0.12.0 + '@ethersproject/abstract-provider': 5.8.0 + '@ethersproject/abstract-signer': 5.8.0 + ethers: 5.8.0 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + dev: true + + /@eth-optimism/core-utils@0.12.0: + resolution: {integrity: sha512-qW+7LZYCz7i8dRa7SRlUKIo1VBU8lvN0HeXCxJR+z+xtMzMQpPds20XJNCMclszxYQHkXY00fOT6GvFw9ZL6nw==} + dependencies: + '@ethersproject/abi': 5.8.0 + '@ethersproject/abstract-provider': 5.8.0 + '@ethersproject/address': 5.8.0 + '@ethersproject/bignumber': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/constants': 5.8.0 + '@ethersproject/contracts': 5.8.0 + '@ethersproject/hash': 5.8.0 + '@ethersproject/keccak256': 5.8.0 + '@ethersproject/properties': 5.8.0 + '@ethersproject/providers': 5.8.0 + '@ethersproject/rlp': 5.8.0 + '@ethersproject/transactions': 5.8.0 + '@ethersproject/web': 5.8.0 + bufio: 1.2.3 + chai: 4.5.0 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + dev: true + + /@ethereum-waffle/chai@4.0.10(@ensdomains/ens@0.4.5)(@ensdomains/resolver@0.2.4)(ethers@5.8.0): + resolution: {integrity: sha512-X5RepE7Dn8KQLFO7HHAAe+KeGaX/by14hn90wePGBhzL54tq4Y8JscZFu+/LCwCl6TnkAAy5ebiMoqJ37sFtWw==} + engines: {node: '>=10.0'} + peerDependencies: + ethers: ^5.7.2 + dependencies: + '@ethereum-waffle/provider': 4.0.5(@ensdomains/ens@0.4.5)(@ensdomains/resolver@0.2.4)(ethers@5.8.0) + debug: 4.4.1(supports-color@8.1.1) + ethers: 5.8.0 + json-bigint: 1.0.0 + transitivePeerDependencies: + - '@ensdomains/ens' + - '@ensdomains/resolver' + - supports-color + dev: true + + /@ethereum-waffle/compiler@4.0.3(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0)(ethers@5.8.0)(solc@0.8.15)(typechain@8.3.2)(typescript@5.8.3): + resolution: {integrity: sha512-5x5U52tSvEVJS6dpCeXXKvRKyf8GICDwiTwUvGD3/WD+DpvgvaoHOL82XqpTSUHgV3bBq6ma5/8gKUJUIAnJCw==} + engines: {node: '>=10.0'} + peerDependencies: + ethers: ^5.7.2 + solc: '*' + typechain: ^8.0.0 + dependencies: + '@resolver-engine/imports': 0.3.3 + '@resolver-engine/imports-fs': 0.3.3 + '@typechain/ethers-v5': 10.2.1(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0)(ethers@5.8.0)(typechain@8.3.2)(typescript@5.8.3) + '@types/mkdirp': 0.5.2 + '@types/node-fetch': 2.6.12 + ethers: 5.8.0 + mkdirp: 0.5.6 + node-fetch: 2.7.0 + solc: 0.8.15 + typechain: 8.3.2(typescript@5.8.3) + transitivePeerDependencies: + - '@ethersproject/abi' + - '@ethersproject/providers' + - encoding + - supports-color + - typescript + dev: true + + /@ethereum-waffle/ens@4.0.3(@ensdomains/ens@0.4.5)(@ensdomains/resolver@0.2.4)(ethers@5.8.0): + resolution: {integrity: sha512-PVLcdnTbaTfCrfSOrvtlA9Fih73EeDvFS28JQnT5M5P4JMplqmchhcZB1yg/fCtx4cvgHlZXa0+rOCAk2Jk0Jw==} + engines: {node: '>=10.0'} + peerDependencies: + '@ensdomains/ens': ^0.4.4 + '@ensdomains/resolver': ^0.2.4 + ethers: ^5.7.2 + dependencies: + '@ensdomains/ens': 0.4.5 + '@ensdomains/resolver': 0.2.4 + ethers: 5.8.0 + dev: true + + /@ethereum-waffle/mock-contract@4.0.4(ethers@5.8.0): + resolution: {integrity: sha512-LwEj5SIuEe9/gnrXgtqIkWbk2g15imM/qcJcxpLyAkOj981tQxXmtV4XmQMZsdedEsZ/D/rbUAOtZbgwqgUwQA==} + engines: {node: '>=10.0'} + peerDependencies: + ethers: ^5.7.2 + dependencies: + ethers: 5.8.0 + dev: true + + /@ethereum-waffle/provider@4.0.5(@ensdomains/ens@0.4.5)(@ensdomains/resolver@0.2.4)(ethers@5.8.0): + resolution: {integrity: sha512-40uzfyzcrPh+Gbdzv89JJTMBlZwzya1YLDyim8mVbEqYLP5VRYWoGp0JMyaizgV3hMoUFRqJKVmIUw4v7r3hYw==} + engines: {node: '>=10.0'} + peerDependencies: + ethers: ^5.7.2 + dependencies: + '@ethereum-waffle/ens': 4.0.3(@ensdomains/ens@0.4.5)(@ensdomains/resolver@0.2.4)(ethers@5.8.0) + '@ganache/ethereum-options': 0.1.4 + debug: 4.4.1(supports-color@8.1.1) + ethers: 5.8.0 + ganache: 7.4.3 + transitivePeerDependencies: + - '@ensdomains/ens' + - '@ensdomains/resolver' + - supports-color + dev: true + + /@ethereumjs/block@3.6.3: + resolution: {integrity: sha512-CegDeryc2DVKnDkg5COQrE0bJfw/p0v3GBk2W5/Dj5dOVfEmb50Ux0GLnSPypooLnfqjwFaorGuT9FokWB3GRg==} + dependencies: + '@ethereumjs/common': 2.6.5 + '@ethereumjs/tx': 3.5.2 + ethereumjs-util: 7.1.5 + merkle-patricia-tree: 4.2.4 + dev: true + + /@ethereumjs/blockchain@5.5.3: + resolution: {integrity: sha512-bi0wuNJ1gw4ByNCV56H0Z4Q7D+SxUbwyG12Wxzbvqc89PXLRNR20LBcSUZRKpN0+YCPo6m0XZL/JLio3B52LTw==} + dependencies: + '@ethereumjs/block': 3.6.3 + '@ethereumjs/common': 2.6.5 + '@ethereumjs/ethash': 1.1.0 + debug: 4.4.1(supports-color@8.1.1) + ethereumjs-util: 7.1.5 + level-mem: 5.0.1 + lru-cache: 5.1.1 + semaphore-async-await: 1.5.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@ethereumjs/common@2.6.0: + resolution: {integrity: sha512-Cq2qS0FTu6O2VU1sgg+WyU9Ps0M6j/BEMHN+hRaECXCV/r0aI78u4N6p52QW/BDVhwWZpCdrvG8X7NJdzlpNUA==} + dependencies: + crc-32: 1.2.2 + ethereumjs-util: 7.1.5 + dev: true + + /@ethereumjs/common@2.6.5: + resolution: {integrity: sha512-lRyVQOeCDaIVtgfbowla32pzeDv2Obr8oR8Put5RdUBNRGr1VGPGQNGP6elWIpgK3YdpzqTOh4GyUGOureVeeA==} + dependencies: + crc-32: 1.2.2 + ethereumjs-util: 7.1.5 + dev: true + + /@ethereumjs/ethash@1.1.0: + resolution: {integrity: sha512-/U7UOKW6BzpA+Vt+kISAoeDie1vAvY4Zy2KF5JJb+So7+1yKmJeJEHOGSnQIj330e9Zyl3L5Nae6VZyh2TJnAA==} + dependencies: + '@ethereumjs/block': 3.6.3 + '@types/levelup': 4.3.3 + buffer-xor: 2.0.2 + ethereumjs-util: 7.1.5 + miller-rabin: 4.0.1 + dev: true + + /@ethereumjs/rlp@4.0.1: + resolution: {integrity: sha512-tqsQiBQDQdmPWE1xkkBq4rlSW5QZpLOUJ5RJh2/9fug+q9tnUhuZoVLk7s0scUIKTOzEtR72DFBXI4WiZcMpvw==} + engines: {node: '>=14'} + hasBin: true + dev: true + + /@ethereumjs/rlp@5.0.2: + resolution: {integrity: sha512-DziebCdg4JpGlEqEdGgXmjqcFoJi+JGulUXwEjsZGAscAQ7MyD/7LE/GVCP29vEQxKc7AAwjT3A2ywHp2xfoCA==} + engines: {node: '>=18'} + hasBin: true + dev: true + + /@ethereumjs/tx@3.4.0: + resolution: {integrity: sha512-WWUwg1PdjHKZZxPPo274ZuPsJCWV3SqATrEKQP1n2DrVYVP1aZIYpo/mFaA0BDoE0tIQmBeimRCEA0Lgil+yYw==} + dependencies: + '@ethereumjs/common': 2.6.5 + ethereumjs-util: 7.1.5 + dev: true + + /@ethereumjs/tx@3.5.2: + resolution: {integrity: sha512-gQDNJWKrSDGu2w7w0PzVXVBNMzb7wwdDOmOqczmhNjqFxFuIbhVJDwiGEnxFNC2/b8ifcZzY7MLcluizohRzNw==} + dependencies: + '@ethereumjs/common': 2.6.5 + ethereumjs-util: 7.1.5 + dev: true + + /@ethereumjs/util@8.1.0: + resolution: {integrity: sha512-zQ0IqbdX8FZ9aw11vP+dZkKDkS+kgIvQPHnSAXzP9pLu+Rfu3D3XEeLbicvoXJTYnhZiPmsZUxgdzXwNKxRPbA==} + engines: {node: '>=14'} + dependencies: + '@ethereumjs/rlp': 4.0.1 + ethereum-cryptography: 2.2.1 + micro-ftch: 0.3.1 + dev: true + + /@ethereumjs/util@9.1.0: + resolution: {integrity: sha512-XBEKsYqLGXLah9PNJbgdkigthkG7TAGvlD/sH12beMXEyHDyigfcbdvHhmLyDWgDyOJn4QwiQUaF7yeuhnjdog==} + engines: {node: '>=18'} + dependencies: + '@ethereumjs/rlp': 5.0.2 + ethereum-cryptography: 2.2.1 + dev: true + + /@ethereumjs/vm@5.6.0: + resolution: {integrity: sha512-J2m/OgjjiGdWF2P9bj/4LnZQ1zRoZhY8mRNVw/N3tXliGI8ai1sI1mlDPkLpeUUM4vq54gH6n0ZlSpz8U/qlYQ==} + dependencies: + '@ethereumjs/block': 3.6.3 + '@ethereumjs/blockchain': 5.5.3 + '@ethereumjs/common': 2.6.5 + '@ethereumjs/tx': 3.5.2 + async-eventemitter: 0.2.4 + core-js-pure: 3.44.0 + debug: 2.6.9 + ethereumjs-util: 7.1.5 + functional-red-black-tree: 1.0.1 + mcl-wasm: 0.7.9 + merkle-patricia-tree: 4.2.4 + rustbn.js: 0.2.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@ethersproject/abi@5.8.0: + resolution: {integrity: sha512-b9YS/43ObplgyV6SlyQsG53/vkSal0MNA1fskSC4mbnCMi8R+NkcH8K9FPYNESf6jUefBUniE4SOKms0E/KK1Q==} + dependencies: + '@ethersproject/address': 5.8.0 + '@ethersproject/bignumber': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/constants': 5.8.0 + '@ethersproject/hash': 5.8.0 + '@ethersproject/keccak256': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/properties': 5.8.0 + '@ethersproject/strings': 5.8.0 + dev: true + + /@ethersproject/abstract-provider@5.8.0: + resolution: {integrity: sha512-wC9SFcmh4UK0oKuLJQItoQdzS/qZ51EJegK6EmAWlh+OptpQ/npECOR3QqECd8iGHC0RJb4WKbVdSfif4ammrg==} + dependencies: + '@ethersproject/bignumber': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/networks': 5.8.0 + '@ethersproject/properties': 5.8.0 + '@ethersproject/transactions': 5.8.0 + '@ethersproject/web': 5.8.0 + dev: true + + /@ethersproject/abstract-signer@5.8.0: + resolution: {integrity: sha512-N0XhZTswXcmIZQdYtUnd79VJzvEwXQw6PK0dTl9VoYrEBxxCPXqS0Eod7q5TNKRxe1/5WUMuR0u0nqTF/avdCA==} + dependencies: + '@ethersproject/abstract-provider': 5.8.0 + '@ethersproject/bignumber': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/properties': 5.8.0 + dev: true + + /@ethersproject/address@5.7.0: + resolution: {integrity: sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==} + dependencies: + '@ethersproject/bignumber': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/keccak256': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/rlp': 5.8.0 + dev: true + + /@ethersproject/address@5.8.0: + resolution: {integrity: sha512-GhH/abcC46LJwshoN+uBNoKVFPxUuZm6dA257z0vZkKmU1+t8xTn8oK7B9qrj8W2rFRMch4gbJl6PmVxjxBEBA==} + dependencies: + '@ethersproject/bignumber': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/keccak256': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/rlp': 5.8.0 + dev: true + + /@ethersproject/base64@5.8.0: + resolution: {integrity: sha512-lN0oIwfkYj9LbPx4xEkie6rAMJtySbpOAFXSDVQaBnAzYfB4X2Qr+FXJGxMoc3Bxp2Sm8OwvzMrywxyw0gLjIQ==} + dependencies: + '@ethersproject/bytes': 5.8.0 + dev: true + + /@ethersproject/basex@5.8.0: + resolution: {integrity: sha512-PIgTszMlDRmNwW9nhS6iqtVfdTAKosA7llYXNmGPw4YAI1PUyMv28988wAb41/gHF/WqGdoLv0erHaRcHRKW2Q==} + dependencies: + '@ethersproject/bytes': 5.8.0 + '@ethersproject/properties': 5.8.0 + dev: true + + /@ethersproject/bignumber@5.8.0: + resolution: {integrity: sha512-ZyaT24bHaSeJon2tGPKIiHszWjD/54Sz8t57Toch475lCLljC6MgPmxk7Gtzz+ddNN5LuHea9qhAe0x3D+uYPA==} + dependencies: + '@ethersproject/bytes': 5.8.0 + '@ethersproject/logger': 5.8.0 + bn.js: 5.2.2 + dev: true + + /@ethersproject/bytes@5.8.0: + resolution: {integrity: sha512-vTkeohgJVCPVHu5c25XWaWQOZ4v+DkGoC42/TS2ond+PARCxTJvgTFUNDZovyQ/uAQ4EcpqqowKydcdmRKjg7A==} + dependencies: + '@ethersproject/logger': 5.8.0 + dev: true + + /@ethersproject/constants@5.8.0: + resolution: {integrity: sha512-wigX4lrf5Vu+axVTIvNsuL6YrV4O5AXl5ubcURKMEME5TnWBouUh0CDTWxZ2GpnRn1kcCgE7l8O5+VbV9QTTcg==} + dependencies: + '@ethersproject/bignumber': 5.8.0 + dev: true + + /@ethersproject/contracts@5.8.0: + resolution: {integrity: sha512-0eFjGz9GtuAi6MZwhb4uvUM216F38xiuR0yYCjKJpNfSEy4HUM8hvqqBj9Jmm0IUz8l0xKEhWwLIhPgxNY0yvQ==} + dependencies: + '@ethersproject/abi': 5.8.0 + '@ethersproject/abstract-provider': 5.8.0 + '@ethersproject/abstract-signer': 5.8.0 + '@ethersproject/address': 5.8.0 + '@ethersproject/bignumber': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/constants': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/properties': 5.8.0 + '@ethersproject/transactions': 5.8.0 + dev: true + + /@ethersproject/hash@5.8.0: + resolution: {integrity: sha512-ac/lBcTbEWW/VGJij0CNSw/wPcw9bSRgCB0AIBz8CvED/jfvDoV9hsIIiWfvWmFEi8RcXtlNwp2jv6ozWOsooA==} + dependencies: + '@ethersproject/abstract-signer': 5.8.0 + '@ethersproject/address': 5.8.0 + '@ethersproject/base64': 5.8.0 + '@ethersproject/bignumber': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/keccak256': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/properties': 5.8.0 + '@ethersproject/strings': 5.8.0 + dev: true + + /@ethersproject/hdnode@5.8.0: + resolution: {integrity: sha512-4bK1VF6E83/3/Im0ERnnUeWOY3P1BZml4ZD3wcH8Ys0/d1h1xaFt6Zc+Dh9zXf9TapGro0T4wvO71UTCp3/uoA==} + dependencies: + '@ethersproject/abstract-signer': 5.8.0 + '@ethersproject/basex': 5.8.0 + '@ethersproject/bignumber': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/pbkdf2': 5.8.0 + '@ethersproject/properties': 5.8.0 + '@ethersproject/sha2': 5.8.0 + '@ethersproject/signing-key': 5.8.0 + '@ethersproject/strings': 5.8.0 + '@ethersproject/transactions': 5.8.0 + '@ethersproject/wordlists': 5.8.0 + dev: true + + /@ethersproject/json-wallets@5.8.0: + resolution: {integrity: sha512-HxblNck8FVUtNxS3VTEYJAcwiKYsBIF77W15HufqlBF9gGfhmYOJtYZp8fSDZtn9y5EaXTE87zDwzxRoTFk11w==} + dependencies: + '@ethersproject/abstract-signer': 5.8.0 + '@ethersproject/address': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/hdnode': 5.8.0 + '@ethersproject/keccak256': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/pbkdf2': 5.8.0 + '@ethersproject/properties': 5.8.0 + '@ethersproject/random': 5.8.0 + '@ethersproject/strings': 5.8.0 + '@ethersproject/transactions': 5.8.0 + aes-js: 3.0.0 + scrypt-js: 3.0.1 + dev: true + + /@ethersproject/keccak256@5.8.0: + resolution: {integrity: sha512-A1pkKLZSz8pDaQ1ftutZoaN46I6+jvuqugx5KYNeQOPqq+JZ0Txm7dlWesCHB5cndJSu5vP2VKptKf7cksERng==} + dependencies: + '@ethersproject/bytes': 5.8.0 + js-sha3: 0.8.0 + dev: true + + /@ethersproject/logger@5.8.0: + resolution: {integrity: sha512-Qe6knGmY+zPPWTC+wQrpitodgBfH7XoceCGL5bJVejmH+yCS3R8jJm8iiWuvWbG76RUmyEG53oqv6GMVWqunjA==} + dev: true + + /@ethersproject/networks@5.8.0: + resolution: {integrity: sha512-egPJh3aPVAzbHwq8DD7Po53J4OUSsA1MjQp8Vf/OZPav5rlmWUaFLiq8cvQiGK0Z5K6LYzm29+VA/p4RL1FzNg==} + dependencies: + '@ethersproject/logger': 5.8.0 + dev: true + + /@ethersproject/pbkdf2@5.8.0: + resolution: {integrity: sha512-wuHiv97BrzCmfEaPbUFpMjlVg/IDkZThp9Ri88BpjRleg4iePJaj2SW8AIyE8cXn5V1tuAaMj6lzvsGJkGWskg==} + dependencies: + '@ethersproject/bytes': 5.8.0 + '@ethersproject/sha2': 5.8.0 + dev: true + + /@ethersproject/properties@5.8.0: + resolution: {integrity: sha512-PYuiEoQ+FMaZZNGrStmN7+lWjlsoufGIHdww7454FIaGdbe/p5rnaCXTr5MtBYl3NkeoVhHZuyzChPeGeKIpQw==} + dependencies: + '@ethersproject/logger': 5.8.0 + dev: true + + /@ethersproject/providers@5.8.0: + resolution: {integrity: sha512-3Il3oTzEx3o6kzcg9ZzbE+oCZYyY+3Zh83sKkn4s1DZfTUjIegHnN2Cm0kbn9YFy45FDVcuCLLONhU7ny0SsCw==} + dependencies: + '@ethersproject/abstract-provider': 5.8.0 + '@ethersproject/abstract-signer': 5.8.0 + '@ethersproject/address': 5.8.0 + '@ethersproject/base64': 5.8.0 + '@ethersproject/basex': 5.8.0 + '@ethersproject/bignumber': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/constants': 5.8.0 + '@ethersproject/hash': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/networks': 5.8.0 + '@ethersproject/properties': 5.8.0 + '@ethersproject/random': 5.8.0 + '@ethersproject/rlp': 5.8.0 + '@ethersproject/sha2': 5.8.0 + '@ethersproject/strings': 5.8.0 + '@ethersproject/transactions': 5.8.0 + '@ethersproject/web': 5.8.0 + bech32: 1.1.4 + ws: 8.18.0 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + dev: true + + /@ethersproject/random@5.8.0: + resolution: {integrity: sha512-E4I5TDl7SVqyg4/kkA/qTfuLWAQGXmSOgYyO01So8hLfwgKvYK5snIlzxJMk72IFdG/7oh8yuSqY2KX7MMwg+A==} + dependencies: + '@ethersproject/bytes': 5.8.0 + '@ethersproject/logger': 5.8.0 + dev: true + + /@ethersproject/rlp@5.8.0: + resolution: {integrity: sha512-LqZgAznqDbiEunaUvykH2JAoXTT9NV0Atqk8rQN9nx9SEgThA/WMx5DnW8a9FOufo//6FZOCHZ+XiClzgbqV9Q==} + dependencies: + '@ethersproject/bytes': 5.8.0 + '@ethersproject/logger': 5.8.0 + dev: true + + /@ethersproject/sha2@5.8.0: + resolution: {integrity: sha512-dDOUrXr9wF/YFltgTBYS0tKslPEKr6AekjqDW2dbn1L1xmjGR+9GiKu4ajxovnrDbwxAKdHjW8jNcwfz8PAz4A==} + dependencies: + '@ethersproject/bytes': 5.8.0 + '@ethersproject/logger': 5.8.0 + hash.js: 1.1.7 + dev: true + + /@ethersproject/signing-key@5.8.0: + resolution: {integrity: sha512-LrPW2ZxoigFi6U6aVkFN/fa9Yx/+4AtIUe4/HACTvKJdhm0eeb107EVCIQcrLZkxaSIgc/eCrX8Q1GtbH+9n3w==} + dependencies: + '@ethersproject/bytes': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/properties': 5.8.0 + bn.js: 5.2.2 + elliptic: 6.6.1 + hash.js: 1.1.7 + dev: true + + /@ethersproject/solidity@5.8.0: + resolution: {integrity: sha512-4CxFeCgmIWamOHwYN9d+QWGxye9qQLilpgTU0XhYs1OahkclF+ewO+3V1U0mvpiuQxm5EHHmv8f7ClVII8EHsA==} + dependencies: + '@ethersproject/bignumber': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/keccak256': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/sha2': 5.8.0 + '@ethersproject/strings': 5.8.0 + dev: true + + /@ethersproject/strings@5.8.0: + resolution: {integrity: sha512-qWEAk0MAvl0LszjdfnZ2uC8xbR2wdv4cDabyHiBh3Cldq/T8dPH3V4BbBsAYJUeonwD+8afVXld274Ls+Y1xXg==} + dependencies: + '@ethersproject/bytes': 5.8.0 + '@ethersproject/constants': 5.8.0 + '@ethersproject/logger': 5.8.0 + dev: true + + /@ethersproject/transactions@5.8.0: + resolution: {integrity: sha512-UglxSDjByHG0TuU17bDfCemZ3AnKO2vYrL5/2n2oXvKzvb7Cz+W9gOWXKARjp2URVwcWlQlPOEQyAviKwT4AHg==} + dependencies: + '@ethersproject/address': 5.8.0 + '@ethersproject/bignumber': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/constants': 5.8.0 + '@ethersproject/keccak256': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/properties': 5.8.0 + '@ethersproject/rlp': 5.8.0 + '@ethersproject/signing-key': 5.8.0 + dev: true + + /@ethersproject/units@5.8.0: + resolution: {integrity: sha512-lxq0CAnc5kMGIiWW4Mr041VT8IhNM+Pn5T3haO74XZWFulk7wH1Gv64HqE96hT4a7iiNMdOCFEBgaxWuk8ETKQ==} + dependencies: + '@ethersproject/bignumber': 5.8.0 + '@ethersproject/constants': 5.8.0 + '@ethersproject/logger': 5.8.0 + dev: true + + /@ethersproject/wallet@5.8.0: + resolution: {integrity: sha512-G+jnzmgg6UxurVKRKvw27h0kvG75YKXZKdlLYmAHeF32TGUzHkOFd7Zn6QHOTYRFWnfjtSSFjBowKo7vfrXzPA==} + dependencies: + '@ethersproject/abstract-provider': 5.8.0 + '@ethersproject/abstract-signer': 5.8.0 + '@ethersproject/address': 5.8.0 + '@ethersproject/bignumber': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/hash': 5.8.0 + '@ethersproject/hdnode': 5.8.0 + '@ethersproject/json-wallets': 5.8.0 + '@ethersproject/keccak256': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/properties': 5.8.0 + '@ethersproject/random': 5.8.0 + '@ethersproject/signing-key': 5.8.0 + '@ethersproject/transactions': 5.8.0 + '@ethersproject/wordlists': 5.8.0 + dev: true + + /@ethersproject/web@5.8.0: + resolution: {integrity: sha512-j7+Ksi/9KfGviws6Qtf9Q7KCqRhpwrYKQPs+JBA/rKVFF/yaWLHJEH3zfVP2plVu+eys0d2DlFmhoQJayFewcw==} + dependencies: + '@ethersproject/base64': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/properties': 5.8.0 + '@ethersproject/strings': 5.8.0 + dev: true + + /@ethersproject/wordlists@5.8.0: + resolution: {integrity: sha512-2df9bbXicZws2Sb5S6ET493uJ0Z84Fjr3pC4tu/qlnZERibZCeUVuqdtt+7Tv9xxhUxHoIekIA7avrKUWHrezg==} + dependencies: + '@ethersproject/bytes': 5.8.0 + '@ethersproject/hash': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/properties': 5.8.0 + '@ethersproject/strings': 5.8.0 + dev: true + + /@fastify/busboy@2.1.1: + resolution: {integrity: sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==} + engines: {node: '>=14'} + dev: true + + /@ganache/ethereum-address@0.1.4: + resolution: {integrity: sha512-sTkU0M9z2nZUzDeHRzzGlW724xhMLXo2LeX1hixbnjHWY1Zg1hkqORywVfl+g5uOO8ht8T0v+34IxNxAhmWlbw==} + dependencies: + '@ganache/utils': 0.1.4 + dev: true + + /@ganache/ethereum-options@0.1.4: + resolution: {integrity: sha512-i4l46taoK2yC41FPkcoDlEVoqHS52wcbHPqJtYETRWqpOaoj9hAg/EJIHLb1t6Nhva2CdTO84bG+qlzlTxjAHw==} + dependencies: + '@ganache/ethereum-address': 0.1.4 + '@ganache/ethereum-utils': 0.1.4 + '@ganache/options': 0.1.4 + '@ganache/utils': 0.1.4 + bip39: 3.0.4 + seedrandom: 3.0.5 + transitivePeerDependencies: + - supports-color + dev: true + + /@ganache/ethereum-utils@0.1.4: + resolution: {integrity: sha512-FKXF3zcdDrIoCqovJmHLKZLrJ43234Em2sde/3urUT/10gSgnwlpFmrv2LUMAmSbX3lgZhW/aSs8krGhDevDAg==} + dependencies: + '@ethereumjs/common': 2.6.0 + '@ethereumjs/tx': 3.4.0 + '@ethereumjs/vm': 5.6.0 + '@ganache/ethereum-address': 0.1.4 + '@ganache/rlp': 0.1.4 + '@ganache/utils': 0.1.4 + emittery: 0.10.0 + ethereumjs-abi: 0.6.8 + ethereumjs-util: 7.1.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@ganache/options@0.1.4: + resolution: {integrity: sha512-zAe/craqNuPz512XQY33MOAG6Si1Xp0hCvfzkBfj2qkuPcbJCq6W/eQ5MB6SbXHrICsHrZOaelyqjuhSEmjXRw==} + dependencies: + '@ganache/utils': 0.1.4 + bip39: 3.0.4 + seedrandom: 3.0.5 + dev: true + + /@ganache/rlp@0.1.4: + resolution: {integrity: sha512-Do3D1H6JmhikB+6rHviGqkrNywou/liVeFiKIpOBLynIpvZhRCgn3SEDxyy/JovcaozTo/BynHumfs5R085MFQ==} + dependencies: + '@ganache/utils': 0.1.4 + rlp: 2.2.6 + dev: true + + /@ganache/utils@0.1.4: + resolution: {integrity: sha512-oatUueU3XuXbUbUlkyxeLLH3LzFZ4y5aSkNbx6tjSIhVTPeh+AuBKYt4eQ73FFcTB3nj/gZoslgAh5CN7O369w==} + dependencies: + emittery: 0.10.0 + keccak: 3.0.1 + seedrandom: 3.0.5 + optionalDependencies: + '@trufflesuite/bigint-buffer': 1.1.9 + dev: true + + /@humanwhocodes/config-array@0.13.0: + resolution: {integrity: sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==} + engines: {node: '>=10.10.0'} + deprecated: Use @eslint/config-array instead + dependencies: + '@humanwhocodes/object-schema': 2.0.3 + debug: 4.4.1(supports-color@8.1.1) + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@humanwhocodes/module-importer@1.0.1: + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + dev: true + + /@humanwhocodes/object-schema@2.0.3: + resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} + deprecated: Use @eslint/object-schema instead + dev: true + + /@jridgewell/gen-mapping@0.3.12: + resolution: {integrity: sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==} + dependencies: + '@jridgewell/sourcemap-codec': 1.5.4 + '@jridgewell/trace-mapping': 0.3.29 + dev: true + + /@jridgewell/resolve-uri@3.1.2: + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + dev: true + + /@jridgewell/sourcemap-codec@1.5.4: + resolution: {integrity: sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==} + dev: true + + /@jridgewell/trace-mapping@0.3.29: + resolution: {integrity: sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==} + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.4 + dev: true + + /@jridgewell/trace-mapping@0.3.9: + resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.4 + dev: true + + /@layerzerolabs/devtools-evm-hardhat@3.1.0(@ethersproject/abi@5.8.0)(@ethersproject/abstract-signer@5.8.0)(@ethersproject/contracts@5.8.0)(@ethersproject/providers@5.8.0)(@layerzerolabs/devtools-evm@2.0.1)(@layerzerolabs/devtools@1.0.1)(@layerzerolabs/io-devtools@0.2.1)(@layerzerolabs/lz-definitions@3.0.114)(@nomiclabs/hardhat-ethers@2.2.3)(ethers@5.8.0)(fp-ts@2.16.10)(hardhat-deploy@0.12.4)(hardhat@2.26.0): + resolution: {integrity: sha512-DS6KZyyUnwNB8aMnwwAAuGVHKYIxv4W24y+d/5QId/WqMcnDXHVY76SijEv9DJJoebYhuq4I7OHkDMmr+h15nA==} + peerDependencies: + '@ethersproject/abi': ^5.7.0 + '@ethersproject/abstract-signer': ^5.7.0 + '@ethersproject/contracts': ^5.7.0 + '@ethersproject/providers': ^5.7.0 + '@layerzerolabs/devtools': ~1.0.0 + '@layerzerolabs/devtools-evm': ~2.0.0 + '@layerzerolabs/io-devtools': ~0.2.0 + '@layerzerolabs/lz-definitions': ^3.0.75 + '@nomiclabs/hardhat-ethers': ^2.2.3 + fp-ts: ^2.16.2 + hardhat: ^2.22.10 + hardhat-deploy: ^0.12.1 + dependencies: + '@ethersproject/abi': 5.8.0 + '@ethersproject/abstract-signer': 5.8.0 + '@ethersproject/contracts': 5.8.0 + '@ethersproject/providers': 5.8.0 + '@layerzerolabs/devtools': 1.0.1(@ethersproject/bytes@5.8.0)(@layerzerolabs/io-devtools@0.2.1)(@layerzerolabs/lz-definitions@3.0.114)(zod@3.25.76) + '@layerzerolabs/devtools-evm': 2.0.1(@ethersproject/abi@5.8.0)(@ethersproject/abstract-provider@5.8.0)(@ethersproject/abstract-signer@5.8.0)(@ethersproject/address@5.7.0)(@ethersproject/bignumber@5.8.0)(@ethersproject/constants@5.8.0)(@ethersproject/contracts@5.8.0)(@ethersproject/providers@5.8.0)(@layerzerolabs/devtools@1.0.1)(@layerzerolabs/io-devtools@0.2.1)(@layerzerolabs/lz-definitions@3.0.114)(fp-ts@2.16.10)(zod@3.25.76) + '@layerzerolabs/export-deployments': 0.0.16 + '@layerzerolabs/io-devtools': 0.2.1(ink-gradient@2.0.0)(ink-table@3.1.0)(ink@3.2.0)(react@17.0.2)(yoga-layout-prebuilt@1.10.0)(zod@3.25.76) + '@layerzerolabs/lz-definitions': 3.0.114 + '@nomiclabs/hardhat-ethers': 2.2.3(ethers@5.8.0)(hardhat@2.26.0) + '@safe-global/protocol-kit': 1.3.0(ethers@5.8.0) + fp-ts: 2.16.10 + hardhat: 2.26.0(ts-node@10.9.2)(typescript@5.8.3) + hardhat-deploy: 0.12.4 + micro-memoize: 4.1.3 + p-memoize: 4.0.4 + zod: 3.25.76 + transitivePeerDependencies: + - bufferutil + - encoding + - ethers + - supports-color + - utf-8-validate + dev: true + + /@layerzerolabs/devtools-evm@2.0.1(@ethersproject/abi@5.8.0)(@ethersproject/abstract-provider@5.8.0)(@ethersproject/abstract-signer@5.8.0)(@ethersproject/address@5.7.0)(@ethersproject/bignumber@5.8.0)(@ethersproject/constants@5.8.0)(@ethersproject/contracts@5.8.0)(@ethersproject/providers@5.8.0)(@layerzerolabs/devtools@1.0.1)(@layerzerolabs/io-devtools@0.2.1)(@layerzerolabs/lz-definitions@3.0.114)(fp-ts@2.16.10)(zod@3.25.76): + resolution: {integrity: sha512-Tt1I+QZu9/0Do8CXb4l3w3gNyPYbfYwU16DgrNtBorzeCNlud7irLE+VMvTzE5lWa8EakHg5cRkaxuumD1dAew==} + peerDependencies: + '@ethersproject/abi': ^5.7.0 + '@ethersproject/abstract-provider': ^5.7.0 + '@ethersproject/abstract-signer': ^5.7.0 + '@ethersproject/address': ~5.7.0 + '@ethersproject/bignumber': ^5.7.0 + '@ethersproject/constants': ^5.7.0 + '@ethersproject/contracts': ^5.7.0 + '@ethersproject/providers': ^5.7.0 + '@layerzerolabs/devtools': ~1.0.0 + '@layerzerolabs/io-devtools': ~0.2.0 + '@layerzerolabs/lz-definitions': ^3.0.75 + fp-ts: ^2.16.2 + zod: ^3.22.4 + dependencies: + '@ethersproject/abi': 5.8.0 + '@ethersproject/abstract-provider': 5.8.0 + '@ethersproject/abstract-signer': 5.8.0 + '@ethersproject/address': 5.7.0 + '@ethersproject/bignumber': 5.8.0 + '@ethersproject/constants': 5.8.0 + '@ethersproject/contracts': 5.8.0 + '@ethersproject/providers': 5.8.0 + '@layerzerolabs/devtools': 1.0.1(@ethersproject/bytes@5.8.0)(@layerzerolabs/io-devtools@0.2.1)(@layerzerolabs/lz-definitions@3.0.114)(zod@3.25.76) + '@layerzerolabs/io-devtools': 0.2.1(ink-gradient@2.0.0)(ink-table@3.1.0)(ink@3.2.0)(react@17.0.2)(yoga-layout-prebuilt@1.10.0)(zod@3.25.76) + '@layerzerolabs/lz-definitions': 3.0.114 + '@safe-global/api-kit': 1.3.1 + '@safe-global/protocol-kit': 1.3.0(ethers@5.8.0) + ethers: 5.8.0 + fp-ts: 2.16.10 + p-memoize: 4.0.4 + zod: 3.25.76 + transitivePeerDependencies: + - bufferutil + - encoding + - supports-color + - utf-8-validate + dev: true + + /@layerzerolabs/devtools@1.0.1(@ethersproject/bytes@5.8.0)(@layerzerolabs/io-devtools@0.2.1)(@layerzerolabs/lz-definitions@3.0.114)(zod@3.25.76): + resolution: {integrity: sha512-oz7zXqGSCkuTVe5wpoFF1gNtzQmJLBwCir+t32MbTlG7jamj6Zs9LL8x8/+LXvRNMOVOabTgdIpdEgWLRNVbhg==} + peerDependencies: + '@ethersproject/bytes': ~5.7.0 + '@layerzerolabs/io-devtools': ~0.2.1 + '@layerzerolabs/lz-definitions': ^3.0.75 + zod: ^3.22.4 + dependencies: + '@ethersproject/bytes': 5.8.0 + '@layerzerolabs/io-devtools': 0.2.1(ink-gradient@2.0.0)(ink-table@3.1.0)(ink@3.2.0)(react@17.0.2)(yoga-layout-prebuilt@1.10.0)(zod@3.25.76) + '@layerzerolabs/lz-definitions': 3.0.114 + bs58: 6.0.0 + exponential-backoff: 3.1.2 + js-yaml: 4.1.0 + zod: 3.25.76 + dev: true + + /@layerzerolabs/eslint-config-next@2.3.44(typescript@5.8.3): + resolution: {integrity: sha512-WlBSy47LGPILdrNgzPiRtQf/hAY62IN37ncUsQwcr8T7cyX1HZREx2qljuXpvduLDAKn5otsm0XIqHuCRUHEFg==} + dependencies: + '@typescript-eslint/eslint-plugin': 7.18.0(@typescript-eslint/parser@7.18.0)(eslint@8.57.1)(typescript@5.8.3) + '@typescript-eslint/parser': 7.18.0(eslint@8.57.1)(typescript@5.8.3) + eslint: 8.57.1 + eslint-config-prettier: 9.1.2(eslint@8.57.1) + eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@8.57.1) + eslint-plugin-autofix: 2.2.0(eslint@8.57.1) + eslint-plugin-compat: 4.2.0(eslint@8.57.1) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@7.18.0)(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1) + eslint-plugin-prettier: 5.5.3(eslint-config-prettier@9.1.2)(eslint@8.57.1)(prettier@3.6.2) + eslint-plugin-unused-imports: 3.2.0(@typescript-eslint/eslint-plugin@7.18.0)(eslint@8.57.1) + prettier: 3.6.2 + transitivePeerDependencies: + - '@types/eslint' + - eslint-import-resolver-webpack + - eslint-plugin-import-x + - supports-color + - typescript + dev: true + + /@layerzerolabs/evm-sdks-core@3.0.114: + resolution: {integrity: sha512-jzA+dqDVv145WrvZz2nNogPJEdds1n+S0im9UxdzwC7i9wzdA0Gsh+66tSp8muVLKKvqzpV21L4+I+s0VbCGTg==} + dependencies: + ethers: 5.8.0 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + dev: true + + /@layerzerolabs/export-deployments@0.0.16: + resolution: {integrity: sha512-tI+mKMx51qCrj+G42mrVR+5jAiRaiLCpnXiogjW7E3krbNbJenI1eYYX7U62ssXWXwTZfYSJ1Bw/zLAbs59sqw==} + hasBin: true + dependencies: + typescript: 5.8.3 + dev: true + + /@layerzerolabs/io-devtools@0.2.1(ink-gradient@2.0.0)(ink-table@3.1.0)(ink@3.2.0)(react@17.0.2)(yoga-layout-prebuilt@1.10.0)(zod@3.25.76): + resolution: {integrity: sha512-NqENU8ixAhAyN2Wv8x7n/FVqjnY0Q2J0dIE64aSYNeLCyatINxsg8YSNVu2g7CjShTcqVPOtrU2zydxExDJ2Kw==} + peerDependencies: + ink: ^3.2.0 + ink-gradient: ^2.0.0 + ink-table: ^3.1.0 + react: ^17.0.2 + yoga-layout-prebuilt: ^1.9.6 + zod: ^3.22.4 + peerDependenciesMeta: + ink: + optional: true + ink-gradient: + optional: true + ink-table: + optional: true + react: + optional: true + yoga-layout-prebuilt: + optional: true + dependencies: + chalk: 4.1.2 + ink: 3.2.0(react@17.0.2) + ink-gradient: 2.0.0(ink@3.2.0)(react@17.0.2) + ink-table: 3.1.0(ink@3.2.0)(react@17.0.2) + logform: 2.7.0 + prompts: 2.4.2 + react: 17.0.2 + table: 6.8.2 + winston: 3.17.0 + yoga-layout-prebuilt: 1.10.0 + zod: 3.25.76 + dev: true + + /@layerzerolabs/lz-definitions@3.0.114: + resolution: {integrity: sha512-9Ef4DvlnGhr9Hk5rhJHIFgYn1L179VYnL/20c6ZBO6ul/T980xBh8vf0odk5RXOIHmmWrsaCYK2gAk0SNENROA==} + dependencies: + tiny-invariant: 1.3.3 + dev: true + + /@layerzerolabs/lz-evm-messagelib-v2@3.0.114(@axelar-network/axelar-gmp-sdk-solidity@5.10.0)(@chainlink/contracts-ccip@0.7.6)(@eth-optimism/contracts@0.6.0)(@layerzerolabs/lz-evm-protocol-v2@3.0.114)(@layerzerolabs/lz-evm-v1-0.7@3.0.114)(@openzeppelin/contracts-upgradeable@5.4.0)(@openzeppelin/contracts@5.4.0)(hardhat-deploy@0.12.4)(solidity-bytes-utils@0.8.4): + resolution: {integrity: sha512-uw6SxYIjw8kcWqM/9hN4UmBYCA3HBnCUfZ8lPIjegnfAd7yOzJqAQCFCWPlPAunGoOUmOLgxCkFsqyaK9nXbAA==} + peerDependencies: + '@arbitrum/nitro-contracts': ^1.1.0 + '@axelar-network/axelar-gmp-sdk-solidity': ^5.6.4 + '@chainlink/contracts-ccip': ^0.7.6 + '@eth-optimism/contracts': ^0.6.0 + '@layerzerolabs/lz-evm-protocol-v2': ^3.0.114 + '@layerzerolabs/lz-evm-v1-0.7': ^3.0.114 + '@openzeppelin/contracts': ^4.8.1 || ^5.0.0 + '@openzeppelin/contracts-upgradeable': ^4.8.1 || ^5.0.0 + hardhat-deploy: ^0.12.1 + solidity-bytes-utils: ^0.8.0 + peerDependenciesMeta: + '@arbitrum/nitro-contracts': + optional: true + dependencies: + '@axelar-network/axelar-gmp-sdk-solidity': 5.10.0 + '@chainlink/contracts-ccip': 0.7.6(ethers@5.8.0) + '@eth-optimism/contracts': 0.6.0(ethers@5.8.0) + '@layerzerolabs/lz-evm-protocol-v2': 3.0.114(@openzeppelin/contracts-upgradeable@5.4.0)(@openzeppelin/contracts@5.4.0)(hardhat-deploy@0.12.4)(solidity-bytes-utils@0.8.4) + '@layerzerolabs/lz-evm-v1-0.7': 3.0.114(@openzeppelin/contracts-upgradeable@5.4.0)(@openzeppelin/contracts@5.4.0)(hardhat-deploy@0.12.4) + '@openzeppelin/contracts': 5.4.0 + '@openzeppelin/contracts-upgradeable': 5.4.0(@openzeppelin/contracts@5.4.0) + hardhat-deploy: 0.12.4 + solidity-bytes-utils: 0.8.4 + dev: true + + /@layerzerolabs/lz-evm-protocol-v2@3.0.114(@openzeppelin/contracts-upgradeable@5.4.0)(@openzeppelin/contracts@5.4.0)(hardhat-deploy@0.12.4)(solidity-bytes-utils@0.8.4): + resolution: {integrity: sha512-uVVdAieowqFVAlJZH5g2hdb0SB3CPoxDP1B6+TxSgGN9JIT3ohyqak/BcP4rLqcru4joH9zp85NMFI989fFs4g==} + peerDependencies: + '@openzeppelin/contracts': ^4.8.1 || ^5.0.0 + '@openzeppelin/contracts-upgradeable': ^4.8.1 || ^5.0.0 + hardhat-deploy: ^0.12.1 + solidity-bytes-utils: ^0.8.0 + dependencies: + '@openzeppelin/contracts': 5.4.0 + '@openzeppelin/contracts-upgradeable': 5.4.0(@openzeppelin/contracts@5.4.0) + hardhat-deploy: 0.12.4 + solidity-bytes-utils: 0.8.4 + dev: true + + /@layerzerolabs/lz-evm-sdk-v1@3.0.114: + resolution: {integrity: sha512-jmSMNYaMbpQHbZMp8LogdiJCnf9n+gDGdKOZEaNvvMSdPxqspGgJJ7J2qH1wUWyRrlThzh50laKMXMhPcZd03A==} + dependencies: + '@ethersproject/abi': 5.8.0 + '@ethersproject/providers': 5.8.0 + '@layerzerolabs/evm-sdks-core': 3.0.114 + ethers: 5.8.0 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + dev: true + + /@layerzerolabs/lz-evm-sdk-v2@3.0.114: + resolution: {integrity: sha512-sh9bIrO+GEJTjbBSc/YzwaQmWN2AWFOfHdXIX5wrwWnDUoo5AujsCXbAcFHoBhnE1JiLVaWcCUym4UEIeprCtg==} + dependencies: + '@layerzerolabs/evm-sdks-core': 3.0.114 + ethers: 5.8.0 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + dev: true + + /@layerzerolabs/lz-evm-v1-0.7@3.0.114(@openzeppelin/contracts-upgradeable@5.4.0)(@openzeppelin/contracts@5.4.0)(hardhat-deploy@0.12.4): + resolution: {integrity: sha512-y8Z3MJWJQIalyO/jtiOhQrXBqU49Z/BnR40qIjjCPEr+VTj4teIev+CYsL3MPe0g9BNgwHWcQuSY9bH2EA+80g==} + peerDependencies: + '@openzeppelin/contracts': 3.4.2-solc-0.7 || ^3.4.2 || ^4.0.0 || ^5.0.0 + '@openzeppelin/contracts-upgradeable': 3.4.2-solc-0.7 || ^3.4.2 || ^4.0.0 || ^5.0.0 + hardhat-deploy: ^0.12.1 + dependencies: + '@openzeppelin/contracts': 5.4.0 + '@openzeppelin/contracts-upgradeable': 5.4.0(@openzeppelin/contracts@5.4.0) + hardhat-deploy: 0.12.4 + dev: true + + /@layerzerolabs/lz-v2-utilities@3.0.114: + resolution: {integrity: sha512-jRuhICM+J19W8MOP7hULY1hIkTaU7Oy4hm4nj7DuRoLXtdEeLztYfTKdooxDKjx24BRTkSbrUUewm3OFvYHNTg==} + dependencies: + '@ethersproject/abi': 5.8.0 + '@ethersproject/address': 5.8.0 + '@ethersproject/bignumber': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/keccak256': 5.8.0 + '@ethersproject/solidity': 5.8.0 + bs58: 5.0.0 + tiny-invariant: 1.3.3 + dev: true + + /@layerzerolabs/metadata-tools@2.0.0(@layerzerolabs/devtools-evm-hardhat@3.1.0)(@layerzerolabs/ua-devtools@4.0.0): + resolution: {integrity: sha512-AkPoJIbVC5b4INVYlWtxr5ptMk5JGLYlickv4KmtOBZkRp/MMl5FXinFVmYoc+bfzD9VLS5ZNAvTOSoAMnNTgw==} + peerDependencies: + '@layerzerolabs/devtools-evm-hardhat': ~3.1.0 + '@layerzerolabs/ua-devtools': ~4.0.0 + dependencies: + '@layerzerolabs/devtools-evm-hardhat': 3.1.0(@ethersproject/abi@5.8.0)(@ethersproject/abstract-signer@5.8.0)(@ethersproject/contracts@5.8.0)(@ethersproject/providers@5.8.0)(@layerzerolabs/devtools-evm@2.0.1)(@layerzerolabs/devtools@1.0.1)(@layerzerolabs/io-devtools@0.2.1)(@layerzerolabs/lz-definitions@3.0.114)(@nomiclabs/hardhat-ethers@2.2.3)(ethers@5.8.0)(fp-ts@2.16.10)(hardhat-deploy@0.12.4)(hardhat@2.26.0) + '@layerzerolabs/ua-devtools': 4.0.0(@layerzerolabs/devtools@1.0.1)(@layerzerolabs/io-devtools@0.2.1)(@layerzerolabs/lz-definitions@3.0.114)(@layerzerolabs/lz-v2-utilities@3.0.114)(@layerzerolabs/protocol-devtools@2.0.0)(zod@3.25.76) + dev: true + + /@layerzerolabs/oapp-evm-upgradeable@0.1.2(@layerzerolabs/lz-evm-messagelib-v2@3.0.114)(@layerzerolabs/lz-evm-protocol-v2@3.0.114)(@layerzerolabs/lz-evm-v1-0.7@3.0.114)(@openzeppelin/contracts-upgradeable@5.4.0)(@openzeppelin/contracts@5.4.0): + resolution: {integrity: sha512-w/TeKIcug6kxfZGuasqSFI4ip9+izSUbTha6ZOyGZeNQqIo88A198ykU36e27dk7JLGjAdwhQH9bOzdzfSPLWQ==} + peerDependencies: + '@layerzerolabs/lz-evm-messagelib-v2': ^3.0.75 + '@layerzerolabs/lz-evm-protocol-v2': ^3.0.75 + '@layerzerolabs/lz-evm-v1-0.7': ^3.0.75 + '@openzeppelin/contracts': ^4.8.1 || ^5.0.0 + '@openzeppelin/contracts-upgradeable': ^4.8.1 || ^5.0.0 + dependencies: + '@layerzerolabs/lz-evm-messagelib-v2': 3.0.114(@axelar-network/axelar-gmp-sdk-solidity@5.10.0)(@chainlink/contracts-ccip@0.7.6)(@eth-optimism/contracts@0.6.0)(@layerzerolabs/lz-evm-protocol-v2@3.0.114)(@layerzerolabs/lz-evm-v1-0.7@3.0.114)(@openzeppelin/contracts-upgradeable@5.4.0)(@openzeppelin/contracts@5.4.0)(hardhat-deploy@0.12.4)(solidity-bytes-utils@0.8.4) + '@layerzerolabs/lz-evm-protocol-v2': 3.0.114(@openzeppelin/contracts-upgradeable@5.4.0)(@openzeppelin/contracts@5.4.0)(hardhat-deploy@0.12.4)(solidity-bytes-utils@0.8.4) + '@layerzerolabs/lz-evm-v1-0.7': 3.0.114(@openzeppelin/contracts-upgradeable@5.4.0)(@openzeppelin/contracts@5.4.0)(hardhat-deploy@0.12.4) + '@openzeppelin/contracts': 5.4.0 + '@openzeppelin/contracts-upgradeable': 5.4.0(@openzeppelin/contracts@5.4.0) + ethers: 5.8.0 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + dev: true + + /@layerzerolabs/oapp-evm@0.3.2(@layerzerolabs/lz-evm-messagelib-v2@3.0.114)(@layerzerolabs/lz-evm-protocol-v2@3.0.114)(@layerzerolabs/lz-evm-v1-0.7@3.0.114)(@openzeppelin/contracts-upgradeable@5.4.0)(@openzeppelin/contracts@5.4.0): + resolution: {integrity: sha512-QqazLEl9KEPsipU/3m5eFDhyse+sG4bO2FWUEf/Kuee4JW6P3iIBI9wg0QfalUqLj0HL0ChFHL3yRTZVqzxrww==} + peerDependencies: + '@layerzerolabs/lz-evm-messagelib-v2': ^3.0.75 + '@layerzerolabs/lz-evm-protocol-v2': ^3.0.75 + '@layerzerolabs/lz-evm-v1-0.7': ^3.0.75 + '@openzeppelin/contracts': ^4.8.1 || ^5.0.0 + '@openzeppelin/contracts-upgradeable': ^4.8.1 || ^5.0.0 + dependencies: + '@layerzerolabs/lz-evm-messagelib-v2': 3.0.114(@axelar-network/axelar-gmp-sdk-solidity@5.10.0)(@chainlink/contracts-ccip@0.7.6)(@eth-optimism/contracts@0.6.0)(@layerzerolabs/lz-evm-protocol-v2@3.0.114)(@layerzerolabs/lz-evm-v1-0.7@3.0.114)(@openzeppelin/contracts-upgradeable@5.4.0)(@openzeppelin/contracts@5.4.0)(hardhat-deploy@0.12.4)(solidity-bytes-utils@0.8.4) + '@layerzerolabs/lz-evm-protocol-v2': 3.0.114(@openzeppelin/contracts-upgradeable@5.4.0)(@openzeppelin/contracts@5.4.0)(hardhat-deploy@0.12.4)(solidity-bytes-utils@0.8.4) + '@layerzerolabs/lz-evm-v1-0.7': 3.0.114(@openzeppelin/contracts-upgradeable@5.4.0)(@openzeppelin/contracts@5.4.0)(hardhat-deploy@0.12.4) + '@openzeppelin/contracts': 5.4.0 + '@openzeppelin/contracts-upgradeable': 5.4.0(@openzeppelin/contracts@5.4.0) + ethers: 5.8.0 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + dev: true + + /@layerzerolabs/oft-evm-upgradeable@3.1.0(@layerzerolabs/lz-evm-messagelib-v2@3.0.114)(@layerzerolabs/lz-evm-protocol-v2@3.0.114)(@layerzerolabs/lz-evm-v1-0.7@3.0.114)(@layerzerolabs/oapp-evm@0.3.2)(@openzeppelin/contracts-upgradeable@5.4.0)(@openzeppelin/contracts@5.4.0): + resolution: {integrity: sha512-GY7MsoodohRkuxf1cm6LEdokZhnUdtgsiJcmvUyePlt3WZE/TL5DlZv5dQdQZRfQRlsd0plKoTYhJeVRNFrGzQ==} + peerDependencies: + '@layerzerolabs/lz-evm-messagelib-v2': ^3.0.75 + '@layerzerolabs/lz-evm-protocol-v2': ^3.0.75 + '@layerzerolabs/lz-evm-v1-0.7': ^3.0.75 + '@layerzerolabs/oapp-evm': ^0.3.2 + '@openzeppelin/contracts': ^4.8.1 || ^5.0.0 + '@openzeppelin/contracts-upgradeable': ^4.8.1 || ^5.0.0 + dependencies: + '@layerzerolabs/lz-evm-messagelib-v2': 3.0.114(@axelar-network/axelar-gmp-sdk-solidity@5.10.0)(@chainlink/contracts-ccip@0.7.6)(@eth-optimism/contracts@0.6.0)(@layerzerolabs/lz-evm-protocol-v2@3.0.114)(@layerzerolabs/lz-evm-v1-0.7@3.0.114)(@openzeppelin/contracts-upgradeable@5.4.0)(@openzeppelin/contracts@5.4.0)(hardhat-deploy@0.12.4)(solidity-bytes-utils@0.8.4) + '@layerzerolabs/lz-evm-protocol-v2': 3.0.114(@openzeppelin/contracts-upgradeable@5.4.0)(@openzeppelin/contracts@5.4.0)(hardhat-deploy@0.12.4)(solidity-bytes-utils@0.8.4) + '@layerzerolabs/lz-evm-v1-0.7': 3.0.114(@openzeppelin/contracts-upgradeable@5.4.0)(@openzeppelin/contracts@5.4.0)(hardhat-deploy@0.12.4) + '@layerzerolabs/oapp-evm': 0.3.2(@layerzerolabs/lz-evm-messagelib-v2@3.0.114)(@layerzerolabs/lz-evm-protocol-v2@3.0.114)(@layerzerolabs/lz-evm-v1-0.7@3.0.114)(@openzeppelin/contracts-upgradeable@5.4.0)(@openzeppelin/contracts@5.4.0) + '@openzeppelin/contracts': 5.4.0 + '@openzeppelin/contracts-upgradeable': 5.4.0(@openzeppelin/contracts@5.4.0) + dev: true + + /@layerzerolabs/oft-evm@3.1.4(@layerzerolabs/lz-evm-messagelib-v2@3.0.114)(@layerzerolabs/lz-evm-protocol-v2@3.0.114)(@layerzerolabs/lz-evm-v1-0.7@3.0.114)(@layerzerolabs/oapp-evm@0.3.2)(@openzeppelin/contracts-upgradeable@5.4.0)(@openzeppelin/contracts@5.4.0): + resolution: {integrity: sha512-jxuEXtzAv2x/ZErBtg6OI6rxq4KyMamPgy8+r3/AQ5uD4Ih2Sd51mBIebpzueJKqMk7MNdOauLfYRRK6tOFWXQ==} + peerDependencies: + '@layerzerolabs/lz-evm-messagelib-v2': ^3.0.75 + '@layerzerolabs/lz-evm-protocol-v2': ^3.0.75 + '@layerzerolabs/lz-evm-v1-0.7': ^3.0.75 + '@layerzerolabs/oapp-evm': ^0.3.2 + '@openzeppelin/contracts': ^4.8.1 || ^5.0.0 + '@openzeppelin/contracts-upgradeable': ^4.8.1 || ^5.0.0 + dependencies: + '@layerzerolabs/lz-evm-messagelib-v2': 3.0.114(@axelar-network/axelar-gmp-sdk-solidity@5.10.0)(@chainlink/contracts-ccip@0.7.6)(@eth-optimism/contracts@0.6.0)(@layerzerolabs/lz-evm-protocol-v2@3.0.114)(@layerzerolabs/lz-evm-v1-0.7@3.0.114)(@openzeppelin/contracts-upgradeable@5.4.0)(@openzeppelin/contracts@5.4.0)(hardhat-deploy@0.12.4)(solidity-bytes-utils@0.8.4) + '@layerzerolabs/lz-evm-protocol-v2': 3.0.114(@openzeppelin/contracts-upgradeable@5.4.0)(@openzeppelin/contracts@5.4.0)(hardhat-deploy@0.12.4)(solidity-bytes-utils@0.8.4) + '@layerzerolabs/lz-evm-v1-0.7': 3.0.114(@openzeppelin/contracts-upgradeable@5.4.0)(@openzeppelin/contracts@5.4.0)(hardhat-deploy@0.12.4) + '@layerzerolabs/oapp-evm': 0.3.2(@layerzerolabs/lz-evm-messagelib-v2@3.0.114)(@layerzerolabs/lz-evm-protocol-v2@3.0.114)(@layerzerolabs/lz-evm-v1-0.7@3.0.114)(@openzeppelin/contracts-upgradeable@5.4.0)(@openzeppelin/contracts@5.4.0) + '@openzeppelin/contracts': 5.4.0 + '@openzeppelin/contracts-upgradeable': 5.4.0(@openzeppelin/contracts@5.4.0) + dev: true + + /@layerzerolabs/prettier-config-next@2.3.44: + resolution: {integrity: sha512-mIsxKLaelXHXXXvMEAE6Jc8IVydra0PesHquHYwvxFKwDhMhzfrnoRLLzbgCX/Zi1q0GGET/oMAKJTs6OWFPxQ==} + dependencies: + prettier: 3.6.2 + prettier-plugin-packagejson: 2.5.18(prettier@3.6.2) + prettier-plugin-solidity: 1.4.3(prettier@3.6.2) + dev: true + + /@layerzerolabs/protocol-devtools-evm@4.0.0(@ethersproject/abstract-provider@5.8.0)(@ethersproject/abstract-signer@5.8.0)(@ethersproject/bignumber@5.8.0)(@ethersproject/constants@5.8.0)(@ethersproject/contracts@5.8.0)(@ethersproject/providers@5.8.0)(@layerzerolabs/devtools-evm@2.0.1)(@layerzerolabs/devtools@1.0.1)(@layerzerolabs/io-devtools@0.2.1)(@layerzerolabs/lz-definitions@3.0.114)(@layerzerolabs/protocol-devtools@2.0.0)(zod@3.25.76): + resolution: {integrity: sha512-JC61OazTsBnSZ5kaE5+0ajCLzom+CqsUN9Zkqwdg9RQtYdUWer0CmOgUzKjr5RYPmv00R5+pM5AbeWJBztPdKg==} + peerDependencies: + '@ethersproject/abstract-provider': ^5.7.0 + '@ethersproject/abstract-signer': ^5.7.0 + '@ethersproject/bignumber': ^5.7.0 + '@ethersproject/constants': ^5.7.0 + '@ethersproject/contracts': ^5.7.0 + '@ethersproject/providers': ^5.7.0 + '@layerzerolabs/devtools': ~1.0.0 + '@layerzerolabs/devtools-evm': ~2.0.0 + '@layerzerolabs/io-devtools': ~0.2.0 + '@layerzerolabs/lz-definitions': ^3.0.75 + '@layerzerolabs/protocol-devtools': ~2.0.0 + zod: ^3.22.4 + dependencies: + '@ethersproject/abstract-provider': 5.8.0 + '@ethersproject/abstract-signer': 5.8.0 + '@ethersproject/bignumber': 5.8.0 + '@ethersproject/constants': 5.8.0 + '@ethersproject/contracts': 5.8.0 + '@ethersproject/providers': 5.8.0 + '@layerzerolabs/devtools': 1.0.1(@ethersproject/bytes@5.8.0)(@layerzerolabs/io-devtools@0.2.1)(@layerzerolabs/lz-definitions@3.0.114)(zod@3.25.76) + '@layerzerolabs/devtools-evm': 2.0.1(@ethersproject/abi@5.8.0)(@ethersproject/abstract-provider@5.8.0)(@ethersproject/abstract-signer@5.8.0)(@ethersproject/address@5.7.0)(@ethersproject/bignumber@5.8.0)(@ethersproject/constants@5.8.0)(@ethersproject/contracts@5.8.0)(@ethersproject/providers@5.8.0)(@layerzerolabs/devtools@1.0.1)(@layerzerolabs/io-devtools@0.2.1)(@layerzerolabs/lz-definitions@3.0.114)(fp-ts@2.16.10)(zod@3.25.76) + '@layerzerolabs/io-devtools': 0.2.1(ink-gradient@2.0.0)(ink-table@3.1.0)(ink@3.2.0)(react@17.0.2)(yoga-layout-prebuilt@1.10.0)(zod@3.25.76) + '@layerzerolabs/lz-definitions': 3.0.114 + '@layerzerolabs/protocol-devtools': 2.0.0(@layerzerolabs/devtools@1.0.1)(@layerzerolabs/io-devtools@0.2.1)(@layerzerolabs/lz-definitions@3.0.114)(zod@3.25.76) + p-memoize: 4.0.4 + zod: 3.25.76 + dev: true + + /@layerzerolabs/protocol-devtools@2.0.0(@layerzerolabs/devtools@1.0.1)(@layerzerolabs/io-devtools@0.2.1)(@layerzerolabs/lz-definitions@3.0.114)(zod@3.25.76): + resolution: {integrity: sha512-Wae/QAZSvKQpL5EfzNMTFElI6msmJ2YwFofsmYLuQbfHWneuhWNhWB1iy655upiwstFq5Oer/Jft0y/YOgh1PQ==} + peerDependencies: + '@layerzerolabs/devtools': ~1.0.0 + '@layerzerolabs/io-devtools': ~0.2.0 + '@layerzerolabs/lz-definitions': ^3.0.75 + zod: ^3.22.4 + dependencies: + '@layerzerolabs/devtools': 1.0.1(@ethersproject/bytes@5.8.0)(@layerzerolabs/io-devtools@0.2.1)(@layerzerolabs/lz-definitions@3.0.114)(zod@3.25.76) + '@layerzerolabs/io-devtools': 0.2.1(ink-gradient@2.0.0)(ink-table@3.1.0)(ink@3.2.0)(react@17.0.2)(yoga-layout-prebuilt@1.10.0)(zod@3.25.76) + '@layerzerolabs/lz-definitions': 3.0.114 + zod: 3.25.76 + dev: true + + /@layerzerolabs/solhint-config@3.0.114(typescript@5.8.3): + resolution: {integrity: sha512-8GEVcDpmbsow0QwTFoxiw2ml46mz52UPu8kHTcWLMBhW0koECTe6Jgna2K4R2IYzInqch1alqmri9jX9nZwYmg==} + dependencies: + solhint: 4.5.4(typescript@5.8.3) + transitivePeerDependencies: + - typescript + dev: true + + /@layerzerolabs/test-devtools-evm-foundry@6.0.3(@layerzerolabs/lz-evm-messagelib-v2@3.0.114)(@layerzerolabs/lz-evm-protocol-v2@3.0.114)(@layerzerolabs/lz-evm-v1-0.7@3.0.114)(@layerzerolabs/oapp-evm@0.3.2)(@layerzerolabs/oft-evm@3.1.4)(@openzeppelin/contracts-upgradeable@5.4.0)(@openzeppelin/contracts@5.4.0): + resolution: {integrity: sha512-yJQzxcW2mVwnSB4vGmUfxDbR0K72f3jf+An6swmTXXrMvtZ5v9mKOUhN40c3mmrUq+/FJtvg+5sJCll37r369A==} + peerDependencies: + '@layerzerolabs/lz-evm-messagelib-v2': ^3.0.75 + '@layerzerolabs/lz-evm-protocol-v2': ^3.0.75 + '@layerzerolabs/lz-evm-v1-0.7': ^3.0.75 + '@layerzerolabs/oapp-evm': ^0.3.2 + '@layerzerolabs/oft-evm': ^3.1.3 + '@openzeppelin/contracts': ^4.9.5 || ^5.0.0 + '@openzeppelin/contracts-upgradeable': ^4.9.5 || ^5.0.0 + dependencies: + '@layerzerolabs/lz-evm-messagelib-v2': 3.0.114(@axelar-network/axelar-gmp-sdk-solidity@5.10.0)(@chainlink/contracts-ccip@0.7.6)(@eth-optimism/contracts@0.6.0)(@layerzerolabs/lz-evm-protocol-v2@3.0.114)(@layerzerolabs/lz-evm-v1-0.7@3.0.114)(@openzeppelin/contracts-upgradeable@5.4.0)(@openzeppelin/contracts@5.4.0)(hardhat-deploy@0.12.4)(solidity-bytes-utils@0.8.4) + '@layerzerolabs/lz-evm-protocol-v2': 3.0.114(@openzeppelin/contracts-upgradeable@5.4.0)(@openzeppelin/contracts@5.4.0)(hardhat-deploy@0.12.4)(solidity-bytes-utils@0.8.4) + '@layerzerolabs/lz-evm-v1-0.7': 3.0.114(@openzeppelin/contracts-upgradeable@5.4.0)(@openzeppelin/contracts@5.4.0)(hardhat-deploy@0.12.4) + '@layerzerolabs/oapp-evm': 0.3.2(@layerzerolabs/lz-evm-messagelib-v2@3.0.114)(@layerzerolabs/lz-evm-protocol-v2@3.0.114)(@layerzerolabs/lz-evm-v1-0.7@3.0.114)(@openzeppelin/contracts-upgradeable@5.4.0)(@openzeppelin/contracts@5.4.0) + '@layerzerolabs/oft-evm': 3.1.4(@layerzerolabs/lz-evm-messagelib-v2@3.0.114)(@layerzerolabs/lz-evm-protocol-v2@3.0.114)(@layerzerolabs/lz-evm-v1-0.7@3.0.114)(@layerzerolabs/oapp-evm@0.3.2)(@openzeppelin/contracts-upgradeable@5.4.0)(@openzeppelin/contracts@5.4.0) + '@openzeppelin/contracts': 5.4.0 + '@openzeppelin/contracts-upgradeable': 5.4.0(@openzeppelin/contracts@5.4.0) + dev: true + + /@layerzerolabs/test-devtools-evm-hardhat@0.5.2(hardhat@2.26.0)(solidity-bytes-utils@0.8.4): + resolution: {integrity: sha512-mBZRczjNJdMSsHUjl2EQCCXutS4Yo6s6K0Bc32kSl3MNKIHZZMOEf6Hkj1guVSx/m3l3VZBr+3s0xc9FiyoQgQ==} + peerDependencies: + hardhat: ^2.22.10 + solidity-bytes-utils: ^0.8.2 + dependencies: + hardhat: 2.26.0(ts-node@10.9.2)(typescript@5.8.3) + solidity-bytes-utils: 0.8.4 + dev: true + + /@layerzerolabs/toolbox-foundry@0.1.13: + resolution: {integrity: sha512-3rC+BVEPgcHLHPO4qn3KqYUG1vhDtr1m/gsaI1S635MK+19475U8HYATznAzHKwi09cf9uEv5C7fdtHXgIw8sQ==} + dev: true + + /@layerzerolabs/toolbox-hardhat@0.6.11(@ethersproject/abstract-provider@5.8.0)(@ethersproject/abstract-signer@5.8.0)(@ethersproject/bignumber@5.8.0)(@ethersproject/constants@5.8.0)(@ethersproject/providers@5.8.0)(@nomicfoundation/hardhat-ethers@3.1.0)(@nomiclabs/hardhat-ethers@2.2.3)(ethers@5.8.0)(hardhat-deploy@0.12.4)(hardhat@2.26.0)(solidity-bytes-utils@0.8.4): + resolution: {integrity: sha512-ydAtlC/CK0rp9J4NHuBc4+G/vD+uJZAETkb0ULgYXzdJHDP5ncng6x5d/Gr1JDXpx7d9HjvzHHcUt0m0VR3rWQ==} + peerDependencies: + '@nomicfoundation/hardhat-ethers': ^3.0.2 + ethers: ^5.7.2 + hardhat: ^2.22.10 + hardhat-deploy: ^0.12.1 + dependencies: + '@ethersproject/abi': 5.8.0 + '@ethersproject/address': 5.7.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/contracts': 5.8.0 + '@ethersproject/hash': 5.8.0 + '@layerzerolabs/devtools': 1.0.1(@ethersproject/bytes@5.8.0)(@layerzerolabs/io-devtools@0.2.1)(@layerzerolabs/lz-definitions@3.0.114)(zod@3.25.76) + '@layerzerolabs/devtools-evm': 2.0.1(@ethersproject/abi@5.8.0)(@ethersproject/abstract-provider@5.8.0)(@ethersproject/abstract-signer@5.8.0)(@ethersproject/address@5.7.0)(@ethersproject/bignumber@5.8.0)(@ethersproject/constants@5.8.0)(@ethersproject/contracts@5.8.0)(@ethersproject/providers@5.8.0)(@layerzerolabs/devtools@1.0.1)(@layerzerolabs/io-devtools@0.2.1)(@layerzerolabs/lz-definitions@3.0.114)(fp-ts@2.16.10)(zod@3.25.76) + '@layerzerolabs/devtools-evm-hardhat': 3.1.0(@ethersproject/abi@5.8.0)(@ethersproject/abstract-signer@5.8.0)(@ethersproject/contracts@5.8.0)(@ethersproject/providers@5.8.0)(@layerzerolabs/devtools-evm@2.0.1)(@layerzerolabs/devtools@1.0.1)(@layerzerolabs/io-devtools@0.2.1)(@layerzerolabs/lz-definitions@3.0.114)(@nomiclabs/hardhat-ethers@2.2.3)(ethers@5.8.0)(fp-ts@2.16.10)(hardhat-deploy@0.12.4)(hardhat@2.26.0) + '@layerzerolabs/io-devtools': 0.2.1(ink-gradient@2.0.0)(ink-table@3.1.0)(ink@3.2.0)(react@17.0.2)(yoga-layout-prebuilt@1.10.0)(zod@3.25.76) + '@layerzerolabs/lz-definitions': 3.0.114 + '@layerzerolabs/lz-evm-sdk-v1': 3.0.114 + '@layerzerolabs/lz-evm-sdk-v2': 3.0.114 + '@layerzerolabs/lz-v2-utilities': 3.0.114 + '@layerzerolabs/protocol-devtools': 2.0.0(@layerzerolabs/devtools@1.0.1)(@layerzerolabs/io-devtools@0.2.1)(@layerzerolabs/lz-definitions@3.0.114)(zod@3.25.76) + '@layerzerolabs/protocol-devtools-evm': 4.0.0(@ethersproject/abstract-provider@5.8.0)(@ethersproject/abstract-signer@5.8.0)(@ethersproject/bignumber@5.8.0)(@ethersproject/constants@5.8.0)(@ethersproject/contracts@5.8.0)(@ethersproject/providers@5.8.0)(@layerzerolabs/devtools-evm@2.0.1)(@layerzerolabs/devtools@1.0.1)(@layerzerolabs/io-devtools@0.2.1)(@layerzerolabs/lz-definitions@3.0.114)(@layerzerolabs/protocol-devtools@2.0.0)(zod@3.25.76) + '@layerzerolabs/test-devtools-evm-hardhat': 0.5.2(hardhat@2.26.0)(solidity-bytes-utils@0.8.4) + '@layerzerolabs/ua-devtools': 4.0.0(@layerzerolabs/devtools@1.0.1)(@layerzerolabs/io-devtools@0.2.1)(@layerzerolabs/lz-definitions@3.0.114)(@layerzerolabs/lz-v2-utilities@3.0.114)(@layerzerolabs/protocol-devtools@2.0.0)(zod@3.25.76) + '@layerzerolabs/ua-devtools-evm': 6.0.0(@ethersproject/constants@5.8.0)(@ethersproject/contracts@5.8.0)(@layerzerolabs/devtools-evm@2.0.1)(@layerzerolabs/devtools@1.0.1)(@layerzerolabs/io-devtools@0.2.1)(@layerzerolabs/lz-definitions@3.0.114)(@layerzerolabs/lz-v2-utilities@3.0.114)(@layerzerolabs/protocol-devtools-evm@4.0.0)(@layerzerolabs/protocol-devtools@2.0.0)(@layerzerolabs/ua-devtools@4.0.0)(zod@3.25.76) + '@layerzerolabs/ua-devtools-evm-hardhat': 8.0.0(@ethersproject/abi@5.8.0)(@ethersproject/bytes@5.8.0)(@ethersproject/contracts@5.8.0)(@ethersproject/hash@5.8.0)(@layerzerolabs/devtools-evm-hardhat@3.1.0)(@layerzerolabs/devtools-evm@2.0.1)(@layerzerolabs/devtools@1.0.1)(@layerzerolabs/io-devtools@0.2.1)(@layerzerolabs/lz-definitions@3.0.114)(@layerzerolabs/protocol-devtools-evm@4.0.0)(@layerzerolabs/protocol-devtools@2.0.0)(@layerzerolabs/ua-devtools-evm@6.0.0)(@layerzerolabs/ua-devtools@4.0.0)(ethers@5.8.0)(hardhat-deploy@0.12.4)(hardhat@2.26.0) + '@nomicfoundation/hardhat-ethers': 3.1.0(ethers@5.8.0)(hardhat@2.26.0) + ethers: 5.8.0 + fp-ts: 2.16.10 + hardhat: 2.26.0(ts-node@10.9.2)(typescript@5.8.3) + hardhat-deploy: 0.12.4 + ink: 3.2.0(react@17.0.2) + ink-gradient: 2.0.0(ink@3.2.0)(react@17.0.2) + ink-table: 3.1.0(ink@3.2.0)(react@17.0.2) + react: 17.0.2 + yoga-layout-prebuilt: 1.10.0 + zod: 3.25.76 + transitivePeerDependencies: + - '@ethersproject/abstract-provider' + - '@ethersproject/abstract-signer' + - '@ethersproject/bignumber' + - '@ethersproject/constants' + - '@ethersproject/providers' + - '@nomiclabs/hardhat-ethers' + - '@types/react' + - bufferutil + - encoding + - solidity-bytes-utils + - supports-color + - utf-8-validate + dev: true + + /@layerzerolabs/ua-devtools-evm-hardhat@8.0.0(@ethersproject/abi@5.8.0)(@ethersproject/bytes@5.8.0)(@ethersproject/contracts@5.8.0)(@ethersproject/hash@5.8.0)(@layerzerolabs/devtools-evm-hardhat@3.1.0)(@layerzerolabs/devtools-evm@2.0.1)(@layerzerolabs/devtools@1.0.1)(@layerzerolabs/io-devtools@0.2.1)(@layerzerolabs/lz-definitions@3.0.114)(@layerzerolabs/protocol-devtools-evm@4.0.0)(@layerzerolabs/protocol-devtools@2.0.0)(@layerzerolabs/ua-devtools-evm@6.0.0)(@layerzerolabs/ua-devtools@4.0.0)(ethers@5.8.0)(hardhat-deploy@0.12.4)(hardhat@2.26.0): + resolution: {integrity: sha512-NAN7STKBD3fLwgvEoxDE7kCFz/pFJWg5vx3cFKMgMWHCo+XBtc7cL9dWQQTZsl90/WK0U7s4fFTxQS4HWpMCNA==} + peerDependencies: + '@ethersproject/abi': ^5.7.0 + '@ethersproject/bytes': ^5.7.0 + '@ethersproject/contracts': ^5.7.0 + '@ethersproject/hash': ^5.7.0 + '@layerzerolabs/devtools': ~1.0.0 + '@layerzerolabs/devtools-evm': ~2.0.0 + '@layerzerolabs/devtools-evm-hardhat': ~3.1.0 + '@layerzerolabs/io-devtools': ~0.2.0 + '@layerzerolabs/lz-definitions': ^3.0.75 + '@layerzerolabs/protocol-devtools': ~2.0.0 + '@layerzerolabs/protocol-devtools-evm': ~4.0.0 + '@layerzerolabs/ua-devtools': ~4.0.0 + '@layerzerolabs/ua-devtools-evm': ~6.0.0 + ethers: ^5.7.2 + hardhat: ^2.22.10 + hardhat-deploy: ^0.12.1 + dependencies: + '@ethersproject/abi': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/contracts': 5.8.0 + '@ethersproject/hash': 5.8.0 + '@layerzerolabs/devtools': 1.0.1(@ethersproject/bytes@5.8.0)(@layerzerolabs/io-devtools@0.2.1)(@layerzerolabs/lz-definitions@3.0.114)(zod@3.25.76) + '@layerzerolabs/devtools-evm': 2.0.1(@ethersproject/abi@5.8.0)(@ethersproject/abstract-provider@5.8.0)(@ethersproject/abstract-signer@5.8.0)(@ethersproject/address@5.7.0)(@ethersproject/bignumber@5.8.0)(@ethersproject/constants@5.8.0)(@ethersproject/contracts@5.8.0)(@ethersproject/providers@5.8.0)(@layerzerolabs/devtools@1.0.1)(@layerzerolabs/io-devtools@0.2.1)(@layerzerolabs/lz-definitions@3.0.114)(fp-ts@2.16.10)(zod@3.25.76) + '@layerzerolabs/devtools-evm-hardhat': 3.1.0(@ethersproject/abi@5.8.0)(@ethersproject/abstract-signer@5.8.0)(@ethersproject/contracts@5.8.0)(@ethersproject/providers@5.8.0)(@layerzerolabs/devtools-evm@2.0.1)(@layerzerolabs/devtools@1.0.1)(@layerzerolabs/io-devtools@0.2.1)(@layerzerolabs/lz-definitions@3.0.114)(@nomiclabs/hardhat-ethers@2.2.3)(ethers@5.8.0)(fp-ts@2.16.10)(hardhat-deploy@0.12.4)(hardhat@2.26.0) + '@layerzerolabs/io-devtools': 0.2.1(ink-gradient@2.0.0)(ink-table@3.1.0)(ink@3.2.0)(react@17.0.2)(yoga-layout-prebuilt@1.10.0)(zod@3.25.76) + '@layerzerolabs/lz-definitions': 3.0.114 + '@layerzerolabs/protocol-devtools': 2.0.0(@layerzerolabs/devtools@1.0.1)(@layerzerolabs/io-devtools@0.2.1)(@layerzerolabs/lz-definitions@3.0.114)(zod@3.25.76) + '@layerzerolabs/protocol-devtools-evm': 4.0.0(@ethersproject/abstract-provider@5.8.0)(@ethersproject/abstract-signer@5.8.0)(@ethersproject/bignumber@5.8.0)(@ethersproject/constants@5.8.0)(@ethersproject/contracts@5.8.0)(@ethersproject/providers@5.8.0)(@layerzerolabs/devtools-evm@2.0.1)(@layerzerolabs/devtools@1.0.1)(@layerzerolabs/io-devtools@0.2.1)(@layerzerolabs/lz-definitions@3.0.114)(@layerzerolabs/protocol-devtools@2.0.0)(zod@3.25.76) + '@layerzerolabs/ua-devtools': 4.0.0(@layerzerolabs/devtools@1.0.1)(@layerzerolabs/io-devtools@0.2.1)(@layerzerolabs/lz-definitions@3.0.114)(@layerzerolabs/lz-v2-utilities@3.0.114)(@layerzerolabs/protocol-devtools@2.0.0)(zod@3.25.76) + '@layerzerolabs/ua-devtools-evm': 6.0.0(@ethersproject/constants@5.8.0)(@ethersproject/contracts@5.8.0)(@layerzerolabs/devtools-evm@2.0.1)(@layerzerolabs/devtools@1.0.1)(@layerzerolabs/io-devtools@0.2.1)(@layerzerolabs/lz-definitions@3.0.114)(@layerzerolabs/lz-v2-utilities@3.0.114)(@layerzerolabs/protocol-devtools-evm@4.0.0)(@layerzerolabs/protocol-devtools@2.0.0)(@layerzerolabs/ua-devtools@4.0.0)(zod@3.25.76) + ethers: 5.8.0 + hardhat: 2.26.0(ts-node@10.9.2)(typescript@5.8.3) + hardhat-deploy: 0.12.4 + p-memoize: 4.0.4 + typescript: 5.8.3 + dev: true + + /@layerzerolabs/ua-devtools-evm@6.0.0(@ethersproject/constants@5.8.0)(@ethersproject/contracts@5.8.0)(@layerzerolabs/devtools-evm@2.0.1)(@layerzerolabs/devtools@1.0.1)(@layerzerolabs/io-devtools@0.2.1)(@layerzerolabs/lz-definitions@3.0.114)(@layerzerolabs/lz-v2-utilities@3.0.114)(@layerzerolabs/protocol-devtools-evm@4.0.0)(@layerzerolabs/protocol-devtools@2.0.0)(@layerzerolabs/ua-devtools@4.0.0)(zod@3.25.76): + resolution: {integrity: sha512-ZZ+etQSjFephVv4XOG7fK9ldWHuN6FgbMZjcQmMincXIGA62oz30EEdA219YzsRl1pvEUvcKO1PMD1gZjlt8qA==} + peerDependencies: + '@ethersproject/constants': ^5.7.0 + '@ethersproject/contracts': ^5.7.0 + '@layerzerolabs/devtools': ~1.0.0 + '@layerzerolabs/devtools-evm': ~2.0.0 + '@layerzerolabs/io-devtools': ~0.2.0 + '@layerzerolabs/lz-definitions': ^3.0.75 + '@layerzerolabs/lz-v2-utilities': ^3.0.75 + '@layerzerolabs/protocol-devtools': ~2.0.0 + '@layerzerolabs/protocol-devtools-evm': ~4.0.0 + '@layerzerolabs/ua-devtools': ~4.0.0 + zod: ^3.22.4 + dependencies: + '@ethersproject/constants': 5.8.0 + '@ethersproject/contracts': 5.8.0 + '@layerzerolabs/devtools': 1.0.1(@ethersproject/bytes@5.8.0)(@layerzerolabs/io-devtools@0.2.1)(@layerzerolabs/lz-definitions@3.0.114)(zod@3.25.76) + '@layerzerolabs/devtools-evm': 2.0.1(@ethersproject/abi@5.8.0)(@ethersproject/abstract-provider@5.8.0)(@ethersproject/abstract-signer@5.8.0)(@ethersproject/address@5.7.0)(@ethersproject/bignumber@5.8.0)(@ethersproject/constants@5.8.0)(@ethersproject/contracts@5.8.0)(@ethersproject/providers@5.8.0)(@layerzerolabs/devtools@1.0.1)(@layerzerolabs/io-devtools@0.2.1)(@layerzerolabs/lz-definitions@3.0.114)(fp-ts@2.16.10)(zod@3.25.76) + '@layerzerolabs/io-devtools': 0.2.1(ink-gradient@2.0.0)(ink-table@3.1.0)(ink@3.2.0)(react@17.0.2)(yoga-layout-prebuilt@1.10.0)(zod@3.25.76) + '@layerzerolabs/lz-definitions': 3.0.114 + '@layerzerolabs/lz-v2-utilities': 3.0.114 + '@layerzerolabs/protocol-devtools': 2.0.0(@layerzerolabs/devtools@1.0.1)(@layerzerolabs/io-devtools@0.2.1)(@layerzerolabs/lz-definitions@3.0.114)(zod@3.25.76) + '@layerzerolabs/protocol-devtools-evm': 4.0.0(@ethersproject/abstract-provider@5.8.0)(@ethersproject/abstract-signer@5.8.0)(@ethersproject/bignumber@5.8.0)(@ethersproject/constants@5.8.0)(@ethersproject/contracts@5.8.0)(@ethersproject/providers@5.8.0)(@layerzerolabs/devtools-evm@2.0.1)(@layerzerolabs/devtools@1.0.1)(@layerzerolabs/io-devtools@0.2.1)(@layerzerolabs/lz-definitions@3.0.114)(@layerzerolabs/protocol-devtools@2.0.0)(zod@3.25.76) + '@layerzerolabs/ua-devtools': 4.0.0(@layerzerolabs/devtools@1.0.1)(@layerzerolabs/io-devtools@0.2.1)(@layerzerolabs/lz-definitions@3.0.114)(@layerzerolabs/lz-v2-utilities@3.0.114)(@layerzerolabs/protocol-devtools@2.0.0)(zod@3.25.76) + p-memoize: 4.0.4 + zod: 3.25.76 + dev: true + + /@layerzerolabs/ua-devtools@4.0.0(@layerzerolabs/devtools@1.0.1)(@layerzerolabs/io-devtools@0.2.1)(@layerzerolabs/lz-definitions@3.0.114)(@layerzerolabs/lz-v2-utilities@3.0.114)(@layerzerolabs/protocol-devtools@2.0.0)(zod@3.25.76): + resolution: {integrity: sha512-/qw4eGsE8sfg3v0yLu1vD3EXvwKCKC1AKuFAAOfSTYWraYqc8seFdC5rNEQfVj8DohiRbTLlul/qXqySr48atg==} + peerDependencies: + '@layerzerolabs/devtools': ~1.0.0 + '@layerzerolabs/io-devtools': ~0.2.0 + '@layerzerolabs/lz-definitions': ^3.0.75 + '@layerzerolabs/lz-v2-utilities': ^3.0.75 + '@layerzerolabs/protocol-devtools': ~2.0.0 + zod: ^3.22.4 + dependencies: + '@layerzerolabs/devtools': 1.0.1(@ethersproject/bytes@5.8.0)(@layerzerolabs/io-devtools@0.2.1)(@layerzerolabs/lz-definitions@3.0.114)(zod@3.25.76) + '@layerzerolabs/io-devtools': 0.2.1(ink-gradient@2.0.0)(ink-table@3.1.0)(ink@3.2.0)(react@17.0.2)(yoga-layout-prebuilt@1.10.0)(zod@3.25.76) + '@layerzerolabs/lz-definitions': 3.0.114 + '@layerzerolabs/lz-v2-utilities': 3.0.114 + '@layerzerolabs/protocol-devtools': 2.0.0(@layerzerolabs/devtools@1.0.1)(@layerzerolabs/io-devtools@0.2.1)(@layerzerolabs/lz-definitions@3.0.114)(zod@3.25.76) + zod: 3.25.76 + dev: true + + /@mdn/browser-compat-data@5.7.6: + resolution: {integrity: sha512-7xdrMX0Wk7grrTZQwAoy1GkvPMFoizStUoL+VmtUkAxegbCCec+3FKwOM6yc/uGU5+BEczQHXAlWiqvM8JeENg==} + dev: true + + /@napi-rs/wasm-runtime@0.2.12: + resolution: {integrity: sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==} + requiresBuild: true + dependencies: + '@emnapi/core': 1.4.5 + '@emnapi/runtime': 1.4.5 + '@tybys/wasm-util': 0.10.0 + dev: true + optional: true + + /@noble/curves@1.4.2: + resolution: {integrity: sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw==} + dependencies: + '@noble/hashes': 1.4.0 + dev: true + + /@noble/curves@1.9.4: + resolution: {integrity: sha512-2bKONnuM53lINoDrSmK8qP8W271ms7pygDhZt4SiLOoLwBtoHqeCFi6RG42V8zd3mLHuJFhU/Bmaqo4nX0/kBw==} + engines: {node: ^14.21.3 || >=16} + dependencies: + '@noble/hashes': 1.8.0 + dev: true + + /@noble/hashes@1.2.0: + resolution: {integrity: sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ==} + dev: true + + /@noble/hashes@1.4.0: + resolution: {integrity: sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==} + engines: {node: '>= 16'} + dev: true + + /@noble/hashes@1.8.0: + resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==} + engines: {node: ^14.21.3 || >=16} + dev: true + + /@noble/hashes@2.0.0-beta.1: + resolution: {integrity: sha512-xnnogJ6ccNZ55lLgWdjhBqKUdFoznjpFr3oy23n5Qm7h+ZMtt8v4zWvHg9zRW6jcETweplD5F4iUqb0SSPC+Dw==} + engines: {node: '>= 20.19.0'} + dev: true + + /@noble/secp256k1@1.7.1: + resolution: {integrity: sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw==} + dev: true + + /@nodelib/fs.scandir@2.1.5: + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + dev: true + + /@nodelib/fs.stat@2.0.5: + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + dev: true + + /@nodelib/fs.walk@1.2.8: + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.19.1 + dev: true + + /@nolyfill/is-core-module@1.0.39: + resolution: {integrity: sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==} + engines: {node: '>=12.4.0'} + dev: true + + /@nomicfoundation/edr-darwin-arm64@0.11.3: + resolution: {integrity: sha512-w0tksbdtSxz9nuzHKsfx4c2mwaD0+l5qKL2R290QdnN9gi9AV62p9DHkOgfBdyg6/a6ZlnQqnISi7C9avk/6VA==} + engines: {node: '>= 18'} + dev: true + + /@nomicfoundation/edr-darwin-x64@0.11.3: + resolution: {integrity: sha512-QR4jAFrPbOcrO7O2z2ESg+eUeIZPe2bPIlQYgiJ04ltbSGW27FblOzdd5+S3RoOD/dsZGKAvvy6dadBEl0NgoA==} + engines: {node: '>= 18'} + dev: true + + /@nomicfoundation/edr-linux-arm64-gnu@0.11.3: + resolution: {integrity: sha512-Ktjv89RZZiUmOFPspuSBVJ61mBZQ2+HuLmV67InNlh9TSUec/iDjGIwAn59dx0bF/LOSrM7qg5od3KKac4LJDQ==} + engines: {node: '>= 18'} + dev: true + + /@nomicfoundation/edr-linux-arm64-musl@0.11.3: + resolution: {integrity: sha512-B3sLJx1rL2E9pfdD4mApiwOZSrX0a/KQSBWdlq1uAhFKqkl00yZaY4LejgZndsJAa4iKGQJlGnw4HCGeVt0+jA==} + engines: {node: '>= 18'} + dev: true + + /@nomicfoundation/edr-linux-x64-gnu@0.11.3: + resolution: {integrity: sha512-D/4cFKDXH6UYyKPu6J3Y8TzW11UzeQI0+wS9QcJzjlrrfKj0ENW7g9VihD1O2FvXkdkTjcCZYb6ai8MMTCsaVw==} + engines: {node: '>= 18'} + dev: true + + /@nomicfoundation/edr-linux-x64-musl@0.11.3: + resolution: {integrity: sha512-ergXuIb4nIvmf+TqyiDX5tsE49311DrBky6+jNLgsGDTBaN1GS3OFwFS8I6Ri/GGn6xOaT8sKu3q7/m+WdlFzg==} + engines: {node: '>= 18'} + dev: true + + /@nomicfoundation/edr-win32-x64-msvc@0.11.3: + resolution: {integrity: sha512-snvEf+WB3OV0wj2A7kQ+ZQqBquMcrozSLXcdnMdEl7Tmn+KDCbmFKBt3Tk0X3qOU4RKQpLPnTxdM07TJNVtung==} + engines: {node: '>= 18'} + dev: true + + /@nomicfoundation/edr@0.11.3: + resolution: {integrity: sha512-kqILRkAd455Sd6v8mfP3C1/0tCOynJWY+Ir+k/9Boocu2kObCrsFgG+ZWB7fSBVdd9cPVSNrnhWS+V+PEo637g==} + engines: {node: '>= 18'} + dependencies: + '@nomicfoundation/edr-darwin-arm64': 0.11.3 + '@nomicfoundation/edr-darwin-x64': 0.11.3 + '@nomicfoundation/edr-linux-arm64-gnu': 0.11.3 + '@nomicfoundation/edr-linux-arm64-musl': 0.11.3 + '@nomicfoundation/edr-linux-x64-gnu': 0.11.3 + '@nomicfoundation/edr-linux-x64-musl': 0.11.3 + '@nomicfoundation/edr-win32-x64-msvc': 0.11.3 + dev: true + + /@nomicfoundation/hardhat-ethers@3.1.0(ethers@5.8.0)(hardhat@2.26.0): + resolution: {integrity: sha512-jx6fw3Ms7QBwFGT2MU6ICG292z0P81u6g54JjSV105+FbTZOF4FJqPksLfDybxkkOeq28eDxbqq7vpxRYyIlxA==} + peerDependencies: + ethers: ^5.7.2 + hardhat: ^2.26.0 + dependencies: + debug: 4.4.1(supports-color@8.1.1) + ethers: 5.8.0 + hardhat: 2.26.0(ts-node@10.9.2)(typescript@5.8.3) + lodash.isequal: 4.5.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@nomicfoundation/slang@0.18.3: + resolution: {integrity: sha512-YqAWgckqbHM0/CZxi9Nlf4hjk9wUNLC9ngWCWBiqMxPIZmzsVKYuChdlrfeBPQyvQQBoOhbx+7C1005kLVQDZQ==} + dependencies: + '@bytecodealliance/preview2-shim': 0.17.0 + dev: true + + /@nomicfoundation/solidity-analyzer-darwin-arm64@0.1.2: + resolution: {integrity: sha512-JaqcWPDZENCvm++lFFGjrDd8mxtf+CtLd2MiXvMNTBD33dContTZ9TWETwNFwg7JTJT5Q9HEecH7FA+HTSsIUw==} + engines: {node: '>= 12'} + requiresBuild: true + dev: true + optional: true + + /@nomicfoundation/solidity-analyzer-darwin-x64@0.1.2: + resolution: {integrity: sha512-fZNmVztrSXC03e9RONBT+CiksSeYcxI1wlzqyr0L7hsQlK1fzV+f04g2JtQ1c/Fe74ZwdV6aQBdd6Uwl1052sw==} + engines: {node: '>= 12'} + requiresBuild: true + dev: true + optional: true + + /@nomicfoundation/solidity-analyzer-linux-arm64-gnu@0.1.2: + resolution: {integrity: sha512-3d54oc+9ZVBuB6nbp8wHylk4xh0N0Gc+bk+/uJae+rUgbOBwQSfuGIbAZt1wBXs5REkSmynEGcqx6DutoK0tPA==} + engines: {node: '>= 12'} + requiresBuild: true + dev: true + optional: true + + /@nomicfoundation/solidity-analyzer-linux-arm64-musl@0.1.2: + resolution: {integrity: sha512-iDJfR2qf55vgsg7BtJa7iPiFAsYf2d0Tv/0B+vhtnI16+wfQeTbP7teookbGvAo0eJo7aLLm0xfS/GTkvHIucA==} + engines: {node: '>= 12'} + requiresBuild: true + dev: true + optional: true + + /@nomicfoundation/solidity-analyzer-linux-x64-gnu@0.1.2: + resolution: {integrity: sha512-9dlHMAt5/2cpWyuJ9fQNOUXFB/vgSFORg1jpjX1Mh9hJ/MfZXlDdHQ+DpFCs32Zk5pxRBb07yGvSHk9/fezL+g==} + engines: {node: '>= 12'} + requiresBuild: true + dev: true + optional: true + + /@nomicfoundation/solidity-analyzer-linux-x64-musl@0.1.2: + resolution: {integrity: sha512-GzzVeeJob3lfrSlDKQw2bRJ8rBf6mEYaWY+gW0JnTDHINA0s2gPR4km5RLIj1xeZZOYz4zRw+AEeYgLRqB2NXg==} + engines: {node: '>= 12'} + requiresBuild: true + dev: true + optional: true + + /@nomicfoundation/solidity-analyzer-win32-x64-msvc@0.1.2: + resolution: {integrity: sha512-Fdjli4DCcFHb4Zgsz0uEJXZ2K7VEO+w5KVv7HmT7WO10iODdU9csC2az4jrhEsRtiR9Gfd74FlG0NYlw1BMdyA==} + engines: {node: '>= 12'} + requiresBuild: true + dev: true + optional: true + + /@nomicfoundation/solidity-analyzer@0.1.2: + resolution: {integrity: sha512-q4n32/FNKIhQ3zQGGw5CvPF6GTvDCpYwIf7bEY/dZTZbgfDsHyjJwURxUJf3VQuuJj+fDIFl4+KkBVbw4Ef6jA==} + engines: {node: '>= 12'} + optionalDependencies: + '@nomicfoundation/solidity-analyzer-darwin-arm64': 0.1.2 + '@nomicfoundation/solidity-analyzer-darwin-x64': 0.1.2 + '@nomicfoundation/solidity-analyzer-linux-arm64-gnu': 0.1.2 + '@nomicfoundation/solidity-analyzer-linux-arm64-musl': 0.1.2 + '@nomicfoundation/solidity-analyzer-linux-x64-gnu': 0.1.2 + '@nomicfoundation/solidity-analyzer-linux-x64-musl': 0.1.2 + '@nomicfoundation/solidity-analyzer-win32-x64-msvc': 0.1.2 + dev: true + + /@nomiclabs/hardhat-ethers@2.2.3(ethers@5.8.0)(hardhat@2.26.0): + resolution: {integrity: sha512-YhzPdzb612X591FOe68q+qXVXGG2ANZRvDo0RRUtimev85rCrAlv/TLMEZw5c+kq9AbzocLTVX/h2jVIFPL9Xg==} + peerDependencies: + ethers: ^5.7.2 + hardhat: ^2.0.0 + dependencies: + ethers: 5.8.0 + hardhat: 2.26.0(ts-node@10.9.2)(typescript@5.8.3) + dev: true + + /@nomiclabs/hardhat-etherscan@3.1.8(hardhat@2.26.0): + resolution: {integrity: sha512-v5F6IzQhrsjHh6kQz4uNrym49brK9K5bYCq2zQZ729RYRaifI9hHbtmK+KkIVevfhut7huQFEQ77JLRMAzWYjQ==} + deprecated: The @nomiclabs/hardhat-etherscan package is deprecated, please use @nomicfoundation/hardhat-verify instead + peerDependencies: + hardhat: ^2.0.4 + dependencies: + '@ethersproject/abi': 5.8.0 + '@ethersproject/address': 5.8.0 + cbor: 8.1.0 + chalk: 2.4.2 + debug: 4.4.1(supports-color@8.1.1) + fs-extra: 7.0.1 + hardhat: 2.26.0(ts-node@10.9.2)(typescript@5.8.3) + lodash: 4.17.21 + semver: 6.3.1 + table: 6.9.0 + undici: 5.29.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@nomiclabs/hardhat-waffle@2.0.6(@nomiclabs/hardhat-ethers@2.2.3)(@types/sinon-chai@3.2.12)(ethereum-waffle@4.0.10)(ethers@5.8.0)(hardhat@2.26.0): + resolution: {integrity: sha512-+Wz0hwmJGSI17B+BhU/qFRZ1l6/xMW82QGXE/Gi+WTmwgJrQefuBs1lIf7hzQ1hLk6hpkvb/zwcNkpVKRYTQYg==} + peerDependencies: + '@nomiclabs/hardhat-ethers': ^2.0.0 + '@types/sinon-chai': ^3.2.3 + ethereum-waffle: '*' + ethers: ^5.7.2 + hardhat: ^2.0.0 + dependencies: + '@nomiclabs/hardhat-ethers': 2.2.3(ethers@5.8.0)(hardhat@2.26.0) + '@types/sinon-chai': 3.2.12 + ethereum-waffle: 4.0.10(@ensdomains/ens@0.4.5)(@ensdomains/resolver@0.2.4)(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0)(ethers@5.8.0)(typescript@5.8.3) + ethers: 5.8.0 + hardhat: 2.26.0(ts-node@10.9.2)(typescript@5.8.3) + dev: true + + /@offchainlabs/upgrade-executor@1.1.0-beta.0: + resolution: {integrity: sha512-mpn6PHjH/KDDjNX0pXHEKdyv8m6DVGQiI2nGzQn0JbM1nOSHJpWx6fvfjtH7YxHJ6zBZTcsKkqGkFKDtCfoSLw==} + dependencies: + '@openzeppelin/contracts': 4.7.3 + '@openzeppelin/contracts-upgradeable': 4.7.3 + dev: true + + /@openzeppelin/contracts-upgradeable@4.7.3: + resolution: {integrity: sha512-+wuegAMaLcZnLCJIvrVUDzA9z/Wp93f0Dla/4jJvIhijRrPabjQbZe6fWiECLaJyfn5ci9fqf9vTw3xpQOad2A==} + dev: true + + /@openzeppelin/contracts-upgradeable@5.4.0(@openzeppelin/contracts@5.4.0): + resolution: {integrity: sha512-STJKyDzUcYuB35Zub1JpWW58JxvrFFVgQ+Ykdr8A9PGXgtq/obF5uoh07k2XmFyPxfnZdPdBdhkJ/n2YxJ87HQ==} + peerDependencies: + '@openzeppelin/contracts': 5.4.0 + dependencies: + '@openzeppelin/contracts': 5.4.0 + dev: true + + /@openzeppelin/contracts@3.4.2: + resolution: {integrity: sha512-z0zMCjyhhp4y7XKAcDAi3Vgms4T2PstwBdahiO0+9NaGICQKjynK3wduSRplTgk4LXmoO1yfDGO5RbjKYxtuxA==} + dev: true + + /@openzeppelin/contracts@4.3.3: + resolution: {integrity: sha512-tDBopO1c98Yk7Cv/PZlHqrvtVjlgK5R4J6jxLwoO7qxK4xqOiZG+zSkIvGFpPZ0ikc3QOED3plgdqjgNTnBc7g==} + dev: true + + /@openzeppelin/contracts@4.7.3: + resolution: {integrity: sha512-dGRS0agJzu8ybo44pCIf3xBaPQN/65AIXNgK8+4gzKd5kbvlqyxryUYVLJv7fK98Seyd2hDZzVEHSWAh0Bt1Yw==} + dev: true + + /@openzeppelin/contracts@5.4.0: + resolution: {integrity: sha512-eCYgWnLg6WO+X52I16TZt8uEjbtdkgLC0SUX/xnAksjjrQI4Xfn4iBRoI5j55dmlOhDv1Y7BoR3cU7e3WWhC6A==} + dev: true + + /@openzeppelin/defender-base-client@1.54.6(debug@4.4.1): + resolution: {integrity: sha512-PTef+rMxkM5VQ7sLwLKSjp2DBakYQd661ZJiSRywx+q/nIpm3B/HYGcz5wPZCA5O/QcEP6TatXXDoeMwimbcnw==} + deprecated: This package has been deprecated and will no longer be maintained, please use @openzeppelin/defender-sdk package instead. + dependencies: + amazon-cognito-identity-js: 6.3.15 + async-retry: 1.3.3 + axios: 1.10.0(debug@4.4.1) + lodash: 4.17.21 + node-fetch: 2.7.0 + transitivePeerDependencies: + - debug + - encoding + dev: true + + /@openzeppelin/hardhat-upgrades@1.28.0(@nomiclabs/hardhat-ethers@2.2.3)(@nomiclabs/hardhat-etherscan@3.1.8)(ethers@5.8.0)(hardhat@2.26.0): + resolution: {integrity: sha512-7sb/Jf+X+uIufOBnmHR0FJVWuxEs2lpxjJnLNN6eCJCP8nD0v+Ot5lTOW2Qb/GFnh+fLvJtEkhkowz4ZQ57+zQ==} + hasBin: true + peerDependencies: + '@nomiclabs/hardhat-ethers': ^2.0.0 + '@nomiclabs/hardhat-etherscan': ^3.1.0 + '@nomiclabs/harhdat-etherscan': '*' + ethers: ^5.7.2 + hardhat: ^2.0.2 + peerDependenciesMeta: + '@nomiclabs/harhdat-etherscan': + optional: true + dependencies: + '@nomiclabs/hardhat-ethers': 2.2.3(ethers@5.8.0)(hardhat@2.26.0) + '@nomiclabs/hardhat-etherscan': 3.1.8(hardhat@2.26.0) + '@openzeppelin/defender-base-client': 1.54.6(debug@4.4.1) + '@openzeppelin/platform-deploy-client': 0.8.0(debug@4.4.1) + '@openzeppelin/upgrades-core': 1.44.1 + chalk: 4.1.2 + debug: 4.4.1(supports-color@8.1.1) + ethers: 5.8.0 + hardhat: 2.26.0(ts-node@10.9.2)(typescript@5.8.3) + proper-lockfile: 4.1.2 + transitivePeerDependencies: + - encoding + - supports-color + dev: true + + /@openzeppelin/platform-deploy-client@0.8.0(debug@4.4.1): + resolution: {integrity: sha512-POx3AsnKwKSV/ZLOU/gheksj0Lq7Is1q2F3pKmcFjGZiibf+4kjGxr4eSMrT+2qgKYZQH1ZLQZ+SkbguD8fTvA==} + deprecated: '@openzeppelin/platform-deploy-client is deprecated. Please use @openzeppelin/defender-sdk-deploy-client' + dependencies: + '@ethersproject/abi': 5.8.0 + '@openzeppelin/defender-base-client': 1.54.6(debug@4.4.1) + axios: 0.21.4(debug@4.4.1) + lodash: 4.17.21 + node-fetch: 2.7.0 + transitivePeerDependencies: + - debug + - encoding + dev: true + + /@openzeppelin/upgrades-core@1.44.1: + resolution: {integrity: sha512-yqvDj7eC7m5kCDgqCxVFgk9sVo9SXP/fQFaExPousNfAJJbX+20l4fKZp17aXbNTpo1g+2205s6cR9VhFFOCaQ==} + hasBin: true + dependencies: + '@nomicfoundation/slang': 0.18.3 + bignumber.js: 9.3.1 + cbor: 10.0.9 + chalk: 4.1.2 + compare-versions: 6.1.1 + debug: 4.4.1(supports-color@8.1.1) + ethereumjs-util: 7.1.5 + minimatch: 9.0.5 + minimist: 1.2.8 + proper-lockfile: 4.1.2 + solidity-ast: 0.4.60 + transitivePeerDependencies: + - supports-color + dev: true + + /@pkgr/core@0.2.9: + resolution: {integrity: sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + dev: true + + /@pkgr/core@0.3.4: + resolution: {integrity: sha512-MrfbnMgfKexic6mxC4xrSBVQHSvmvhz7qtSDG5cHg4xn8kHXkPltUY44R5u4ghYf+1rXpOvC2drbMcE1rZ3a2A==} + engines: {node: ^14.18.0 || >=16.0.0} + dev: true + + /@pnpm/config.env-replace@1.1.0: + resolution: {integrity: sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==} + engines: {node: '>=12.22.0'} + dev: true + + /@pnpm/network.ca-file@1.0.2: + resolution: {integrity: sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==} + engines: {node: '>=12.22.0'} + dependencies: + graceful-fs: 4.2.10 + dev: true + + /@pnpm/npm-conf@2.3.1: + resolution: {integrity: sha512-c83qWb22rNRuB0UaVCI0uRPNRr8Z0FWnEIvT47jiHAmOIUHbBOg5XvV7pM5x+rKn9HRpjxquDbXYSXr3fAKFcw==} + engines: {node: '>=12'} + dependencies: + '@pnpm/config.env-replace': 1.1.0 + '@pnpm/network.ca-file': 1.0.2 + config-chain: 1.1.13 + dev: true + + /@resolver-engine/core@0.3.3: + resolution: {integrity: sha512-eB8nEbKDJJBi5p5SrvrvILn4a0h42bKtbCTri3ZxCGt6UvoQyp7HnGOfki944bUjBSHKK3RvgfViHn+kqdXtnQ==} + dependencies: + debug: 3.2.7 + is-url: 1.2.4 + request: 2.88.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@resolver-engine/fs@0.3.3: + resolution: {integrity: sha512-wQ9RhPUcny02Wm0IuJwYMyAG8fXVeKdmhm8xizNByD4ryZlx6PP6kRen+t/haF43cMfmaV7T3Cx6ChOdHEhFUQ==} + dependencies: + '@resolver-engine/core': 0.3.3 + debug: 3.2.7 + transitivePeerDependencies: + - supports-color + dev: true + + /@resolver-engine/imports-fs@0.3.3: + resolution: {integrity: sha512-7Pjg/ZAZtxpeyCFlZR5zqYkz+Wdo84ugB5LApwriT8XFeQoLwGUj4tZFFvvCuxaNCcqZzCYbonJgmGObYBzyCA==} + dependencies: + '@resolver-engine/fs': 0.3.3 + '@resolver-engine/imports': 0.3.3 + debug: 3.2.7 + transitivePeerDependencies: + - supports-color + dev: true + + /@resolver-engine/imports@0.3.3: + resolution: {integrity: sha512-anHpS4wN4sRMwsAbMXhMfOD/y4a4Oo0Cw/5+rue7hSwGWsDOQaAU1ClK1OxjUC35/peazxEl8JaSRRS+Xb8t3Q==} + dependencies: + '@resolver-engine/core': 0.3.3 + debug: 3.2.7 + hosted-git-info: 2.8.9 + path-browserify: 1.0.1 + url: 0.11.4 + transitivePeerDependencies: + - supports-color + dev: true + + /@rtsao/scc@1.1.0: + resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==} + dev: true + + /@rushstack/eslint-patch@1.12.0: + resolution: {integrity: sha512-5EwMtOqvJMMa3HbmxLlF74e+3/HhwBTMcvt3nqVJgGCozO6hzIPOBlwm8mGVNR9SN2IJpxSnlxczyDjcn7qIyw==} + dev: true + + /@safe-global/api-kit@1.3.1: + resolution: {integrity: sha512-JKvCNs8p+42+N8pV2MIqoXlBLckTe5CKboVT7t9mTluuA66i5W8+Kr+B5j9D//EIU5vO7iSOOIYnJuA2ck4XRQ==} + dependencies: + '@ethersproject/abstract-signer': 5.8.0 + '@safe-global/safe-core-sdk-types': 2.3.0 + node-fetch: 2.7.0 + transitivePeerDependencies: + - encoding + - supports-color + dev: true + + /@safe-global/protocol-kit@1.3.0(ethers@5.8.0): + resolution: {integrity: sha512-zBhwHpaUggywmnR1Xm5RV22DpyjmVWYP3pnOl4rcf9LAc1k7IVmw6WIt2YVhHRaWGxVYMd4RitJX8Dx2+8eLZQ==} + dependencies: + '@ethersproject/address': 5.8.0 + '@ethersproject/bignumber': 5.8.0 + '@ethersproject/solidity': 5.8.0 + '@safe-global/safe-deployments': 1.37.39 + ethereumjs-util: 7.1.5 + semver: 7.7.2 + web3: 1.10.4 + web3-core: 1.10.4 + web3-utils: 1.10.4 + zksync-web3: 0.14.4(ethers@5.8.0) + transitivePeerDependencies: + - bufferutil + - encoding + - ethers + - supports-color + - utf-8-validate + dev: true + + /@safe-global/safe-core-sdk-types@2.3.0: + resolution: {integrity: sha512-dU0KkDV1KJNf11ajbUjWiSi4ygdyWfhk1M50lTJWUdCn1/2Bsb/hICM8LoEk6DCoFumxaoCet02SmYakXsW2CA==} + deprecated: 'WARNING: This project has been renamed to @safe-global/types-kit. Please, migrate from @safe-global/safe-core-sdk-types@5.1.0 to @safe-global/types-kit@1.0.0.' + dependencies: + '@ethersproject/bignumber': 5.8.0 + '@ethersproject/contracts': 5.8.0 + '@safe-global/safe-deployments': 1.37.39 + web3-core: 1.10.4 + web3-utils: 1.10.4 + transitivePeerDependencies: + - encoding + - supports-color + dev: true + + /@safe-global/safe-deployments@1.37.39: + resolution: {integrity: sha512-vrGtmCJPjUQpvP0jPVvhKeOPVwcVk3St9bvDKcP46Cb38KaGaEd43hcJSpZoF+roogWvJcEAZ0Q4QYjG40uDUQ==} + dependencies: + semver: 7.7.2 + dev: true + + /@scure/base@1.1.9: + resolution: {integrity: sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg==} + dev: true + + /@scure/base@1.2.6: + resolution: {integrity: sha512-g/nm5FgUa//MCj1gV09zTJTaM6KBAHqLN907YVQqf7zC49+DcO4B1so4ZX07Ef10Twr6nuqYEH9GEggFXA4Fmg==} + dev: true + + /@scure/bip32@1.1.5: + resolution: {integrity: sha512-XyNh1rB0SkEqd3tXcXMi+Xe1fvg+kUIcoRIEujP1Jgv7DqW2r9lg3Ah0NkFaCs9sTkQAQA8kw7xiRXzENi9Rtw==} + dependencies: + '@noble/hashes': 1.2.0 + '@noble/secp256k1': 1.7.1 + '@scure/base': 1.1.9 + dev: true + + /@scure/bip32@1.4.0: + resolution: {integrity: sha512-sVUpc0Vq3tXCkDGYVWGIZTRfnvu8LoTDaev7vbwh0omSvVORONr960MQWdKqJDCReIEmTj3PAr73O3aoxz7OPg==} + dependencies: + '@noble/curves': 1.4.2 + '@noble/hashes': 1.4.0 + '@scure/base': 1.1.9 + dev: true + + /@scure/bip39@1.1.1: + resolution: {integrity: sha512-t+wDck2rVkh65Hmv280fYdVdY25J9YeEUIgn2LG1WM6gxFkGzcksoDiUkWVpVp3Oex9xGC68JU2dSbUfwZ2jPg==} + dependencies: + '@noble/hashes': 1.2.0 + '@scure/base': 1.1.9 + dev: true + + /@scure/bip39@1.3.0: + resolution: {integrity: sha512-disdg7gHuTDZtY+ZdkmLpPCk7fxZSu3gBiEGuoC1XYxv9cGx3Z6cpTggCgW6odSOOIXCiDjuGejW+aJKCY/pIQ==} + dependencies: + '@noble/hashes': 1.4.0 + '@scure/base': 1.1.9 + dev: true + + /@sentry/core@5.30.0: + resolution: {integrity: sha512-TmfrII8w1PQZSZgPpUESqjB+jC6MvZJZdLtE/0hZ+SrnKhW3x5WlYLvTXZpcWePYBku7rl2wn1RZu6uT0qCTeg==} + engines: {node: '>=6'} + dependencies: + '@sentry/hub': 5.30.0 + '@sentry/minimal': 5.30.0 + '@sentry/types': 5.30.0 + '@sentry/utils': 5.30.0 + tslib: 1.14.1 + dev: true + + /@sentry/hub@5.30.0: + resolution: {integrity: sha512-2tYrGnzb1gKz2EkMDQcfLrDTvmGcQPuWxLnJKXJvYTQDGLlEvi2tWz1VIHjunmOvJrB5aIQLhm+dcMRwFZDCqQ==} + engines: {node: '>=6'} + dependencies: + '@sentry/types': 5.30.0 + '@sentry/utils': 5.30.0 + tslib: 1.14.1 + dev: true + + /@sentry/minimal@5.30.0: + resolution: {integrity: sha512-BwWb/owZKtkDX+Sc4zCSTNcvZUq7YcH3uAVlmh/gtR9rmUvbzAA3ewLuB3myi4wWRAMEtny6+J/FN/x+2wn9Xw==} + engines: {node: '>=6'} + dependencies: + '@sentry/hub': 5.30.0 + '@sentry/types': 5.30.0 + tslib: 1.14.1 + dev: true + + /@sentry/node@5.30.0: + resolution: {integrity: sha512-Br5oyVBF0fZo6ZS9bxbJZG4ApAjRqAnqFFurMVJJdunNb80brh7a5Qva2kjhm+U6r9NJAB5OmDyPkA1Qnt+QVg==} + engines: {node: '>=6'} + dependencies: + '@sentry/core': 5.30.0 + '@sentry/hub': 5.30.0 + '@sentry/tracing': 5.30.0 + '@sentry/types': 5.30.0 + '@sentry/utils': 5.30.0 + cookie: 0.4.2 + https-proxy-agent: 5.0.1 + lru_map: 0.3.3 + tslib: 1.14.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@sentry/tracing@5.30.0: + resolution: {integrity: sha512-dUFowCr0AIMwiLD7Fs314Mdzcug+gBVo/+NCMyDw8tFxJkwWAKl7Qa2OZxLQ0ZHjakcj1hNKfCQJ9rhyfOl4Aw==} + engines: {node: '>=6'} + dependencies: + '@sentry/hub': 5.30.0 + '@sentry/minimal': 5.30.0 + '@sentry/types': 5.30.0 + '@sentry/utils': 5.30.0 + tslib: 1.14.1 + dev: true + + /@sentry/types@5.30.0: + resolution: {integrity: sha512-R8xOqlSTZ+htqrfteCWU5Nk0CDN5ApUTvrlvBuiH1DyP6czDZ4ktbZB0hAgBlVcK0U+qpD3ag3Tqqpa5Q67rPw==} + engines: {node: '>=6'} + dev: true + + /@sentry/utils@5.30.0: + resolution: {integrity: sha512-zaYmoH0NWWtvnJjC9/CBseXMtKHm/tm40sz3YfJRxeQjyzRqNQPgivpd9R/oDJCYj999mzdW382p/qi2ypjLww==} + engines: {node: '>=6'} + dependencies: + '@sentry/types': 5.30.0 + tslib: 1.14.1 + dev: true + + /@sindresorhus/is@4.6.0: + resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} + engines: {node: '>=10'} + dev: true + + /@sindresorhus/is@5.6.0: + resolution: {integrity: sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==} + engines: {node: '>=14.16'} + dev: true + + /@smithy/types@4.3.1: + resolution: {integrity: sha512-UqKOQBL2x6+HWl3P+3QqFD4ncKq0I8Nuz9QItGv5WuKuMHuuwlhvqcZCoXGfc+P1QmfJE7VieykoYYmrOoFJxA==} + engines: {node: '>=18.0.0'} + dependencies: + tslib: 2.8.1 + dev: true + + /@solidity-parser/parser@0.18.0: + resolution: {integrity: sha512-yfORGUIPgLck41qyN7nbwJRAx17/jAIXCTanHOJZhB6PJ1iAk/84b/xlsVKFSyNyLXIj0dhppoE0+CRws7wlzA==} + dev: true + + /@solidity-parser/parser@0.20.1: + resolution: {integrity: sha512-58I2sRpzaQUN+jJmWbHfbWf9AKfzqCI8JAdFB0vbyY+u8tBRcuTt9LxzasvR0LGQpcRv97eyV7l61FQ3Ib7zVw==} + dev: true + + /@szmarczak/http-timer@4.0.6: + resolution: {integrity: sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==} + engines: {node: '>=10'} + dependencies: + defer-to-connect: 2.0.1 + dev: true + + /@szmarczak/http-timer@5.0.1: + resolution: {integrity: sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==} + engines: {node: '>=14.16'} + dependencies: + defer-to-connect: 2.0.1 + dev: true + + /@trufflesuite/bigint-buffer@1.1.9: + resolution: {integrity: sha512-bdM5cEGCOhDSwminryHJbRmXc1x7dPKg6Pqns3qyTwFlxsqUgxE29lsERS3PlIW1HTjoIGMUqsk1zQQwST1Yxw==} + engines: {node: '>= 10.0.0'} + requiresBuild: true + dependencies: + node-gyp-build: 4.3.0 + dev: true + optional: true + + /@tsconfig/node10@1.0.11: + resolution: {integrity: sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==} + dev: true + + /@tsconfig/node12@1.0.11: + resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} + dev: true + + /@tsconfig/node14@1.0.3: + resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} + dev: true + + /@tsconfig/node16@1.0.4: + resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} + dev: true + + /@tybys/wasm-util@0.10.0: + resolution: {integrity: sha512-VyyPYFlOMNylG45GoAe0xDoLwWuowvf92F9kySqzYh8vmYm7D2u4iUJKa1tOUpS70Ku13ASrOkS4ScXFsTaCNQ==} + requiresBuild: true + dependencies: + tslib: 2.8.1 + dev: true + optional: true + + /@typechain/ethers-v5@10.2.1(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0)(ethers@5.8.0)(typechain@8.3.2)(typescript@5.8.3): + resolution: {integrity: sha512-n3tQmCZjRE6IU4h6lqUGiQ1j866n5MTCBJreNEHHVWXa2u9GJTaeYyU1/k+1qLutkyw+sS6VAN+AbeiTqsxd/A==} + peerDependencies: + '@ethersproject/abi': ^5.0.0 + '@ethersproject/providers': ^5.0.0 + ethers: ^5.7.2 + typechain: ^8.1.1 + typescript: '>=4.3.0' + dependencies: + '@ethersproject/abi': 5.8.0 + '@ethersproject/providers': 5.8.0 + ethers: 5.8.0 + lodash: 4.17.21 + ts-essentials: 7.0.3(typescript@5.8.3) + typechain: 8.3.2(typescript@5.8.3) + typescript: 5.8.3 + dev: true + + /@types/abstract-leveldown@7.2.5: + resolution: {integrity: sha512-/2B0nQF4UdupuxeKTJA2+Rj1D+uDemo6P4kMwKCpbfpnzeVaWSELTsAw4Lxn3VJD6APtRrZOCuYo+4nHUQfTfg==} + dev: true + + /@types/bn.js@4.11.6: + resolution: {integrity: sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==} + dependencies: + '@types/node': 18.18.14 + dev: true + + /@types/bn.js@5.2.0: + resolution: {integrity: sha512-DLbJ1BPqxvQhIGbeu8VbUC1DiAiahHtAYvA0ZEAa4P31F7IaArc8z3C3BRQdWX4mtLQuABG4yzp76ZrS02Ui1Q==} + dependencies: + '@types/node': 18.18.14 + dev: true + + /@types/cacheable-request@6.0.3: + resolution: {integrity: sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==} + dependencies: + '@types/http-cache-semantics': 4.0.4 + '@types/keyv': 3.1.4 + '@types/node': 18.18.14 + '@types/responselike': 1.0.3 + dev: true + + /@types/chai@4.3.20: + resolution: {integrity: sha512-/pC9HAB5I/xMlc5FP77qjCnI16ChlJfW0tGa0IUcFn38VJrTV6DeZ60NU5KZBtaOZqjdpwTWohz5HU1RrhiYxQ==} + dev: true + + /@types/http-cache-semantics@4.0.4: + resolution: {integrity: sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==} + dev: true + + /@types/json-schema@7.0.15: + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + dev: true + + /@types/json5@0.0.29: + resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} + dev: true + + /@types/keyv@3.1.4: + resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} + dependencies: + '@types/node': 18.18.14 + dev: true + + /@types/level-errors@3.0.2: + resolution: {integrity: sha512-gyZHbcQ2X5hNXf/9KS2qGEmgDe9EN2WDM3rJ5Ele467C0nA1sLhtmv1bZiPMDYfAYCfPWft0uQIaTvXbASSTRA==} + dev: true + + /@types/levelup@4.3.3: + resolution: {integrity: sha512-K+OTIjJcZHVlZQN1HmU64VtrC0jC3dXWQozuEIR9zVvltIk90zaGPM2AgT+fIkChpzHhFE3YnvFLCbLtzAmexA==} + dependencies: + '@types/abstract-leveldown': 7.2.5 + '@types/level-errors': 3.0.2 + '@types/node': 18.18.14 + dev: true + + /@types/mkdirp@0.5.2: + resolution: {integrity: sha512-U5icWpv7YnZYGsN4/cmh3WD2onMY0aJIiTE6+51TwJCttdHvtCYmkBNOobHlXwrJRL0nkH9jH4kD+1FAdMN4Tg==} + dependencies: + '@types/node': 18.18.14 + dev: true + + /@types/mocha@10.0.10: + resolution: {integrity: sha512-xPyYSz1cMPnJQhl0CLMH68j3gprKZaTjG3s5Vi+fDgx+uhG9NOXwbVt52eFS8ECyXhyKcjDLCBEqBExKuiZb7Q==} + dev: true + + /@types/node-fetch@2.6.12: + resolution: {integrity: sha512-8nneRWKCg3rMtF69nLQJnOYUcbafYeFSjqkw3jCRLsqkWFlHaoQrr5mXmofFGOx3DKn7UfmBMyov8ySvLRVldA==} + dependencies: + '@types/node': 18.18.14 + form-data: 4.0.4 + dev: true + + /@types/node@11.11.6: + resolution: {integrity: sha512-Exw4yUWMBXM3X+8oqzJNRqZSwUAaS4+7NdvHqQuFi/d+synz++xmX3QIf+BFqneW8N31R8Ky+sikfZUXq07ggQ==} + dev: true + + /@types/node@12.20.55: + resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} + dev: true + + /@types/node@18.18.14: + resolution: {integrity: sha512-iSOeNeXYNYNLLOMDSVPvIFojclvMZ/HDY2dU17kUlcsOsSQETbWIslJbYLZgA+ox8g2XQwSHKTkght1a5X26lQ==} + dependencies: + undici-types: 5.26.5 + dev: true + + /@types/pbkdf2@3.1.2: + resolution: {integrity: sha512-uRwJqmiXmh9++aSu1VNEn3iIxWOhd8AHXNSdlaLfdAAdSTY9jYVeGWnzejM3dvrkbqE3/hyQkQQ29IFATEGlew==} + dependencies: + '@types/node': 18.18.14 + dev: true + + /@types/prettier@2.7.3: + resolution: {integrity: sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==} + dev: true + + /@types/qs@6.14.0: + resolution: {integrity: sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==} + dev: true + + /@types/responselike@1.0.3: + resolution: {integrity: sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==} + dependencies: + '@types/node': 18.18.14 + dev: true + + /@types/secp256k1@4.0.6: + resolution: {integrity: sha512-hHxJU6PAEUn0TP4S/ZOzuTUvJWuZ6eIKeNKb5RBpODvSl6hp1Wrw4s7ATY50rklRCScUDpHzVA/DQdSjJ3UoYQ==} + dependencies: + '@types/node': 18.18.14 + dev: true + + /@types/semver@7.7.0: + resolution: {integrity: sha512-k107IF4+Xr7UHjwDc7Cfd6PRQfbdkiRabXGRjo07b4WyPahFBZCZ1sE+BNxYIJPPg73UkfOsVOLwqVc/6ETrIA==} + dev: true + + /@types/sinon-chai@3.2.12: + resolution: {integrity: sha512-9y0Gflk3b0+NhQZ/oxGtaAJDvRywCa5sIyaVnounqLvmf93yBF4EgIRspePtkMs3Tr844nCclYMlcCNmLCvjuQ==} + dependencies: + '@types/chai': 4.3.20 + '@types/sinon': 17.0.4 + dev: true + + /@types/sinon@17.0.4: + resolution: {integrity: sha512-RHnIrhfPO3+tJT0s7cFaXGZvsL4bbR3/k7z3P312qMS4JaS2Tk+KiwiLx1S0rQ56ERj00u1/BtdyVd0FY+Pdew==} + dependencies: + '@types/sinonjs__fake-timers': 8.1.5 + dev: true + + /@types/sinonjs__fake-timers@8.1.5: + resolution: {integrity: sha512-mQkU2jY8jJEF7YHjHvsQO8+3ughTL1mcnn96igfhONmR+fUPSKIkefQYpSe8bsly2Ep7oQbn/6VG5/9/0qcArQ==} + dev: true + + /@types/tinycolor2@1.4.6: + resolution: {integrity: sha512-iEN8J0BoMnsWBqjVbWH/c0G0Hh7O21lpR2/+PrvAVgWdzL7eexIFm4JN/Wn10PTcmNdtS6U67r499mlWMXOxNw==} + dev: true + + /@types/triple-beam@1.3.5: + resolution: {integrity: sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==} + dev: true + + /@types/yoga-layout@1.9.2: + resolution: {integrity: sha512-S9q47ByT2pPvD65IvrWp7qppVMpk9WGMbVq9wbWZOHg6tnXSD4vyhao6nOSBwwfDdV2p3Kx9evA9vI+XWTfDvw==} + dev: true + + /@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0)(eslint@8.57.1)(typescript@5.8.3): + resolution: {integrity: sha512-94EQTWZ40mzBc42ATNIBimBEDltSJ9RQHCC8vc/PDbxi4k8dVwUAv4o98dk50M1zB+JGFxp43FP7f8+FP8R6Sw==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + '@typescript-eslint/parser': ^7.0.0 + eslint: ^8.56.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@eslint-community/regexpp': 4.12.1 + '@typescript-eslint/parser': 7.18.0(eslint@8.57.1)(typescript@5.8.3) + '@typescript-eslint/scope-manager': 7.18.0 + '@typescript-eslint/type-utils': 7.18.0(eslint@8.57.1)(typescript@5.8.3) + '@typescript-eslint/utils': 7.18.0(eslint@8.57.1)(typescript@5.8.3) + '@typescript-eslint/visitor-keys': 7.18.0 + eslint: 8.57.1 + graphemer: 1.4.0 + ignore: 5.3.2 + natural-compare: 1.4.0 + ts-api-utils: 1.4.3(typescript@5.8.3) + typescript: 5.8.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.8.3): + resolution: {integrity: sha512-4Z+L8I2OqhZV8qA132M4wNL30ypZGYOQVBfMgxDH/K5UX0PNqTu1c6za9ST5r9+tavvHiTWmBnKzpCJ/GlVFtg==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + eslint: ^8.56.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/scope-manager': 7.18.0 + '@typescript-eslint/types': 7.18.0 + '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.8.3) + '@typescript-eslint/visitor-keys': 7.18.0 + debug: 4.4.1(supports-color@8.1.1) + eslint: 8.57.1 + typescript: 5.8.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/scope-manager@5.62.0: + resolution: {integrity: sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/visitor-keys': 5.62.0 + dev: true + + /@typescript-eslint/scope-manager@7.18.0: + resolution: {integrity: sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==} + engines: {node: ^18.18.0 || >=20.0.0} + dependencies: + '@typescript-eslint/types': 7.18.0 + '@typescript-eslint/visitor-keys': 7.18.0 + dev: true + + /@typescript-eslint/type-utils@7.18.0(eslint@8.57.1)(typescript@5.8.3): + resolution: {integrity: sha512-XL0FJXuCLaDuX2sYqZUUSOJ2sG5/i1AAze+axqmLnSkNEVMVYLF+cbwlB2w8D1tinFuSikHmFta+P+HOofrLeA==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + eslint: ^8.56.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.8.3) + '@typescript-eslint/utils': 7.18.0(eslint@8.57.1)(typescript@5.8.3) + debug: 4.4.1(supports-color@8.1.1) + eslint: 8.57.1 + ts-api-utils: 1.4.3(typescript@5.8.3) + typescript: 5.8.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/types@5.62.0: + resolution: {integrity: sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + + /@typescript-eslint/types@7.18.0: + resolution: {integrity: sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==} + engines: {node: ^18.18.0 || >=20.0.0} + dev: true + + /@typescript-eslint/typescript-estree@5.62.0(typescript@5.8.3): + resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/visitor-keys': 5.62.0 + debug: 4.4.1(supports-color@8.1.1) + globby: 11.1.0 + is-glob: 4.0.3 + semver: 7.7.2 + tsutils: 3.21.0(typescript@5.8.3) + typescript: 5.8.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/typescript-estree@7.18.0(typescript@5.8.3): + resolution: {integrity: sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/types': 7.18.0 + '@typescript-eslint/visitor-keys': 7.18.0 + debug: 4.4.1(supports-color@8.1.1) + globby: 11.1.0 + is-glob: 4.0.3 + minimatch: 9.0.5 + semver: 7.7.2 + ts-api-utils: 1.4.3(typescript@5.8.3) + typescript: 5.8.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/utils@5.62.0(eslint@8.57.1)(typescript@5.8.3): + resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + '@eslint-community/eslint-utils': 4.7.0(eslint@8.57.1) + '@types/json-schema': 7.0.15 + '@types/semver': 7.7.0 + '@typescript-eslint/scope-manager': 5.62.0 + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.8.3) + eslint: 8.57.1 + eslint-scope: 5.1.1 + semver: 7.7.2 + transitivePeerDependencies: + - supports-color + - typescript + dev: true + + /@typescript-eslint/utils@7.18.0(eslint@8.57.1)(typescript@5.8.3): + resolution: {integrity: sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + eslint: ^8.56.0 + dependencies: + '@eslint-community/eslint-utils': 4.7.0(eslint@8.57.1) + '@typescript-eslint/scope-manager': 7.18.0 + '@typescript-eslint/types': 7.18.0 + '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.8.3) + eslint: 8.57.1 + transitivePeerDependencies: + - supports-color + - typescript + dev: true + + /@typescript-eslint/visitor-keys@5.62.0: + resolution: {integrity: sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + '@typescript-eslint/types': 5.62.0 + eslint-visitor-keys: 3.4.3 + dev: true + + /@typescript-eslint/visitor-keys@7.18.0: + resolution: {integrity: sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==} + engines: {node: ^18.18.0 || >=20.0.0} + dependencies: + '@typescript-eslint/types': 7.18.0 + eslint-visitor-keys: 3.4.3 + dev: true + + /@ungap/structured-clone@1.3.0: + resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} + dev: true + + /@unrs/resolver-binding-android-arm-eabi@1.11.1: + resolution: {integrity: sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw==} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@unrs/resolver-binding-android-arm64@1.11.1: + resolution: {integrity: sha512-lCxkVtb4wp1v+EoN+HjIG9cIIzPkX5OtM03pQYkG+U5O/wL53LC4QbIeazgiKqluGeVEeBlZahHalCaBvU1a2g==} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@unrs/resolver-binding-darwin-arm64@1.11.1: + resolution: {integrity: sha512-gPVA1UjRu1Y/IsB/dQEsp2V1pm44Of6+LWvbLc9SDk1c2KhhDRDBUkQCYVWe6f26uJb3fOK8saWMgtX8IrMk3g==} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@unrs/resolver-binding-darwin-x64@1.11.1: + resolution: {integrity: sha512-cFzP7rWKd3lZaCsDze07QX1SC24lO8mPty9vdP+YVa3MGdVgPmFc59317b2ioXtgCMKGiCLxJ4HQs62oz6GfRQ==} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@unrs/resolver-binding-freebsd-x64@1.11.1: + resolution: {integrity: sha512-fqtGgak3zX4DCB6PFpsH5+Kmt/8CIi4Bry4rb1ho6Av2QHTREM+47y282Uqiu3ZRF5IQioJQ5qWRV6jduA+iGw==} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@unrs/resolver-binding-linux-arm-gnueabihf@1.11.1: + resolution: {integrity: sha512-u92mvlcYtp9MRKmP+ZvMmtPN34+/3lMHlyMj7wXJDeXxuM0Vgzz0+PPJNsro1m3IZPYChIkn944wW8TYgGKFHw==} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@unrs/resolver-binding-linux-arm-musleabihf@1.11.1: + resolution: {integrity: sha512-cINaoY2z7LVCrfHkIcmvj7osTOtm6VVT16b5oQdS4beibX2SYBwgYLmqhBjA1t51CarSaBuX5YNsWLjsqfW5Cw==} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@unrs/resolver-binding-linux-arm64-gnu@1.11.1: + resolution: {integrity: sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ==} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@unrs/resolver-binding-linux-arm64-musl@1.11.1: + resolution: {integrity: sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w==} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@unrs/resolver-binding-linux-ppc64-gnu@1.11.1: + resolution: {integrity: sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA==} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@unrs/resolver-binding-linux-riscv64-gnu@1.11.1: + resolution: {integrity: sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ==} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@unrs/resolver-binding-linux-riscv64-musl@1.11.1: + resolution: {integrity: sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew==} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@unrs/resolver-binding-linux-s390x-gnu@1.11.1: + resolution: {integrity: sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg==} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@unrs/resolver-binding-linux-x64-gnu@1.11.1: + resolution: {integrity: sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w==} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@unrs/resolver-binding-linux-x64-musl@1.11.1: + resolution: {integrity: sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA==} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@unrs/resolver-binding-wasm32-wasi@1.11.1: + resolution: {integrity: sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + requiresBuild: true + dependencies: + '@napi-rs/wasm-runtime': 0.2.12 + dev: true + optional: true + + /@unrs/resolver-binding-win32-arm64-msvc@1.11.1: + resolution: {integrity: sha512-nRcz5Il4ln0kMhfL8S3hLkxI85BXs3o8EYoattsJNdsX4YUU89iOkVn7g0VHSRxFuVMdM4Q1jEpIId1Ihim/Uw==} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@unrs/resolver-binding-win32-ia32-msvc@1.11.1: + resolution: {integrity: sha512-DCEI6t5i1NmAZp6pFonpD5m7i6aFrpofcp4LA2i8IIq60Jyo28hamKBxNrZcyOwVOZkgsRp9O2sXWBWP8MnvIQ==} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@unrs/resolver-binding-win32-x64-msvc@1.11.1: + resolution: {integrity: sha512-lrW200hZdbfRtztbygyaq/6jP6AKE8qQN2KvPcJ+x7wiD038YtnYtZ82IMNJ69GJibV7bwL3y9FgK+5w/pYt6g==} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /abortcontroller-polyfill@1.7.8: + resolution: {integrity: sha512-9f1iZ2uWh92VcrU9Y8x+LdM4DLj75VE0MJB8zuF1iUnroEptStw+DQ8EQPMUdfe5k+PkB1uUfDQfWbhstH8LrQ==} + dev: true + + /abstract-leveldown@6.2.3: + resolution: {integrity: sha512-BsLm5vFMRUrrLeCcRc+G0t2qOaTzpoJQLOubq2XM72eNpjF5UdU5o/5NvlNhx95XHcAvcl8OMXr4mlg/fRgUXQ==} + engines: {node: '>=6'} + deprecated: Superseded by abstract-level (https://github.com/Level/community#faq) + dependencies: + buffer: 5.7.1 + immediate: 3.3.0 + level-concat-iterator: 2.0.1 + level-supports: 1.0.1 + xtend: 4.0.2 + dev: true + + /abstract-leveldown@6.3.0: + resolution: {integrity: sha512-TU5nlYgta8YrBMNpc9FwQzRbiXsj49gsALsXadbGHt9CROPzX5fB0rWDR5mtdpOOKa5XqRFpbj1QroPAoPzVjQ==} + engines: {node: '>=6'} + deprecated: Superseded by abstract-level (https://github.com/Level/community#faq) + dependencies: + buffer: 5.7.1 + immediate: 3.3.0 + level-concat-iterator: 2.0.1 + level-supports: 1.0.1 + xtend: 4.0.2 + dev: true + + /accepts@1.3.8: + resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} + engines: {node: '>= 0.6'} + dependencies: + mime-types: 2.1.35 + negotiator: 0.6.3 + dev: true + + /acorn-jsx@5.3.2(acorn@8.15.0): + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + acorn: 8.15.0 + dev: true + + /acorn-walk@8.3.4: + resolution: {integrity: sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==} + engines: {node: '>=0.4.0'} + dependencies: + acorn: 8.15.0 + dev: true + + /acorn@8.15.0: + resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} + engines: {node: '>=0.4.0'} + hasBin: true + dev: true + + /adm-zip@0.4.16: + resolution: {integrity: sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg==} + engines: {node: '>=0.3.0'} + dev: true + + /aes-js@3.0.0: + resolution: {integrity: sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==} + dev: true + + /agent-base@6.0.2: + resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} + engines: {node: '>= 6.0.0'} + dependencies: + debug: 4.4.1(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + dev: true + + /aggregate-error@3.1.0: + resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} + engines: {node: '>=8'} + dependencies: + clean-stack: 2.2.0 + indent-string: 4.0.0 + dev: true + + /ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + dev: true + + /ajv@8.17.1: + resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} + dependencies: + fast-deep-equal: 3.1.3 + fast-uri: 3.0.6 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + dev: true + + /amazon-cognito-identity-js@6.3.15: + resolution: {integrity: sha512-G2mzTlGYHKYh9oZDO0Gk94xVQ4iY9GYWBaYScbDYvz05ps6dqi0IvdNx1Lxi7oA3tjS5X+mUN7/svFJJdOB9YA==} + dependencies: + '@aws-crypto/sha256-js': 1.2.2 + buffer: 4.9.2 + fast-base64-decode: 1.0.0 + isomorphic-unfetch: 3.1.0 + js-cookie: 2.2.1 + transitivePeerDependencies: + - encoding + dev: true + + /ansi-align@3.0.1: + resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} + dependencies: + string-width: 4.2.3 + dev: true + + /ansi-colors@4.1.3: + resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} + engines: {node: '>=6'} + dev: true + + /ansi-escapes@4.3.2: + resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} + engines: {node: '>=8'} + dependencies: + type-fest: 0.21.3 + dev: true + + /ansi-regex@2.1.1: + resolution: {integrity: sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==} + engines: {node: '>=0.10.0'} + dev: true + + /ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + dev: true + + /ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + dependencies: + color-convert: 1.9.3 + dev: true + + /ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + dependencies: + color-convert: 2.0.1 + dev: true + + /antlr4@4.13.2: + resolution: {integrity: sha512-QiVbZhyy4xAZ17UPEuG3YTOt8ZaoeOR1CvEAqrEsDBsOqINslaB147i9xqljZqoyf5S+EUlGStaj+t22LT9MOg==} + engines: {node: '>=16'} + dev: true + + /anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + dev: true + + /arg@4.1.3: + resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} + dev: true + + /argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + dev: true + + /array-back@3.1.0: + resolution: {integrity: sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==} + engines: {node: '>=6'} + dev: true + + /array-back@4.0.2: + resolution: {integrity: sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==} + engines: {node: '>=8'} + dev: true + + /array-buffer-byte-length@1.0.2: + resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.4 + is-array-buffer: 3.0.5 + dev: true + + /array-flatten@1.1.1: + resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} + dev: true + + /array-includes@3.1.9: + resolution: {integrity: sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-object-atoms: 1.1.1 + get-intrinsic: 1.3.0 + is-string: 1.1.1 + math-intrinsics: 1.1.0 + dev: true + + /array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + dev: true + + /array.prototype.findlastindex@1.2.6: + resolution: {integrity: sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + es-shim-unscopables: 1.1.0 + dev: true + + /array.prototype.flat@1.3.3: + resolution: {integrity: sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-shim-unscopables: 1.1.0 + dev: true + + /array.prototype.flatmap@1.3.3: + resolution: {integrity: sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-shim-unscopables: 1.1.0 + dev: true + + /arraybuffer.prototype.slice@1.0.4: + resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} + engines: {node: '>= 0.4'} + dependencies: + array-buffer-byte-length: 1.0.2 + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + is-array-buffer: 3.0.5 + dev: true + + /asn1@0.2.6: + resolution: {integrity: sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==} + dependencies: + safer-buffer: 2.1.2 + dev: true + + /assert-plus@1.0.0: + resolution: {integrity: sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==} + engines: {node: '>=0.8'} + dev: true + + /assertion-error@1.1.0: + resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} + dev: true + + /ast-metadata-inferer@0.8.1: + resolution: {integrity: sha512-ht3Dm6Zr7SXv6t1Ra6gFo0+kLDglHGrEbYihTkcycrbHw7WCcuhBzPlJYHEsIpycaUwzsJHje+vUcxXUX4ztTA==} + dependencies: + '@mdn/browser-compat-data': 5.7.6 + dev: true + + /ast-parents@0.0.1: + resolution: {integrity: sha512-XHusKxKz3zoYk1ic8Un640joHbFMhbqneyoZfoKnEGtf2ey9Uh/IdpcQplODdO/kENaMIWsD0nJm4+wX3UNLHA==} + dev: true + + /astral-regex@2.0.0: + resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} + engines: {node: '>=8'} + dev: true + + /async-eventemitter@0.2.4: + resolution: {integrity: sha512-pd20BwL7Yt1zwDFy+8MX8F1+WCT8aQeKj0kQnTrH9WaeRETlRamVhD0JtRPmrV4GfOJ2F9CvdQkZeZhnh2TuHw==} + dependencies: + async: 2.6.4 + dev: true + + /async-function@1.0.0: + resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} + engines: {node: '>= 0.4'} + dev: true + + /async-limiter@1.0.1: + resolution: {integrity: sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==} + dev: true + + /async-retry@1.3.3: + resolution: {integrity: sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==} + dependencies: + retry: 0.13.1 + dev: true + + /async@2.6.4: + resolution: {integrity: sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==} + dependencies: + lodash: 4.17.21 + dev: true + + /async@3.2.6: + resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} + dev: true + + /asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + dev: true + + /auto-bind@4.0.0: + resolution: {integrity: sha512-Hdw8qdNiqdJ8LqT0iK0sVzkFbzg6fhnQqqfWhBDxcHZvU75+B+ayzTy8x+k5Ix0Y92XOhOUlx74ps+bA6BeYMQ==} + engines: {node: '>=8'} + dev: true + + /available-typed-arrays@1.0.7: + resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} + engines: {node: '>= 0.4'} + dependencies: + possible-typed-array-names: 1.1.0 + dev: true + + /aws-sign2@0.7.0: + resolution: {integrity: sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==} + dev: true + + /aws4@1.13.2: + resolution: {integrity: sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==} + dev: true + + /axios@0.21.4(debug@4.4.1): + resolution: {integrity: sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==} + dependencies: + follow-redirects: 1.15.9(debug@4.4.1) + transitivePeerDependencies: + - debug + dev: true + + /axios@1.10.0(debug@4.4.1): + resolution: {integrity: sha512-/1xYAC4MP/HEG+3duIhFr4ZQXR4sQXOIe+o6sdqzeykGLx6Upp/1p8MHqhINOvGeP7xyNHe7tsiJByc4SSVUxw==} + dependencies: + follow-redirects: 1.15.9(debug@4.4.1) + form-data: 4.0.4 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + dev: true + + /balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + dev: true + + /base-x@3.0.11: + resolution: {integrity: sha512-xz7wQ8xDhdyP7tQxwdteLYeFfS68tSMNCZ/Y37WJ4bhGfKPpqEIlmIyueQHqOyoPhE6xNUqjzRr8ra0eF9VRvA==} + dependencies: + safe-buffer: 5.2.1 + dev: true + + /base-x@4.0.1: + resolution: {integrity: sha512-uAZ8x6r6S3aUM9rbHGVOIsR15U/ZSc82b3ymnCPsT45Gk1DDvhDPdIgB5MrhirZWt+5K0EEPQH985kNqZgNPFw==} + dev: true + + /base-x@5.0.1: + resolution: {integrity: sha512-M7uio8Zt++eg3jPj+rHMfCC+IuygQHHCOU+IYsVtik6FWjuYpVt/+MRKcgsAMHh8mMFAwnB+Bs+mTrFiXjMzKg==} + dev: true + + /base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + dev: true + + /bcrypt-pbkdf@1.0.2: + resolution: {integrity: sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==} + dependencies: + tweetnacl: 0.14.5 + dev: true + + /bech32@1.1.4: + resolution: {integrity: sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==} + dev: true + + /bignumber.js@9.3.1: + resolution: {integrity: sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==} + dev: true + + /binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} + dev: true + + /bip39@3.0.4: + resolution: {integrity: sha512-YZKQlb752TrUWqHWj7XAwCSjYEgGAk+/Aas3V7NyjQeZYsztO8JnQUaCWhcnL4T+jL8nvB8typ2jRPzTlgugNw==} + dependencies: + '@types/node': 11.11.6 + create-hash: 1.2.0 + pbkdf2: 3.1.3 + randombytes: 2.1.0 + dev: true + + /blakejs@1.2.1: + resolution: {integrity: sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ==} + dev: true + + /bluebird@3.7.2: + resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==} + dev: true + + /bn.js@4.11.6: + resolution: {integrity: sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA==} + dev: true + + /bn.js@4.12.2: + resolution: {integrity: sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==} + dev: true + + /bn.js@5.2.2: + resolution: {integrity: sha512-v2YAxEmKaBLahNwE1mjp4WON6huMNeuDvagFZW+ASCuA/ku0bXR9hSMw0XpiqMoA3+rmnyck/tPRSFQkoC9Cuw==} + dev: true + + /body-parser@1.20.3: + resolution: {integrity: sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + dependencies: + bytes: 3.1.2 + content-type: 1.0.5 + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + on-finished: 2.4.1 + qs: 6.13.0 + raw-body: 2.5.2 + type-is: 1.6.18 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /boxen@5.1.2: + resolution: {integrity: sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==} + engines: {node: '>=10'} + dependencies: + ansi-align: 3.0.1 + camelcase: 6.3.0 + chalk: 4.1.2 + cli-boxes: 2.2.1 + string-width: 4.2.3 + type-fest: 0.20.2 + widest-line: 3.1.0 + wrap-ansi: 7.0.0 + dev: true + + /brace-expansion@1.1.12: + resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + dev: true + + /brace-expansion@2.0.2: + resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} + dependencies: + balanced-match: 1.0.2 + dev: true + + /braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + dependencies: + fill-range: 7.1.1 + dev: true + + /brorand@1.1.0: + resolution: {integrity: sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==} + dev: true + + /browser-stdout@1.3.1: + resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==} + dev: true + + /browserify-aes@1.2.0: + resolution: {integrity: sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==} + dependencies: + buffer-xor: 1.0.3 + cipher-base: 1.0.6 + create-hash: 1.2.0 + evp_bytestokey: 1.0.3 + inherits: 2.0.4 + safe-buffer: 5.2.1 + dev: true + + /browserslist@4.25.1: + resolution: {integrity: sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + dependencies: + caniuse-lite: 1.0.30001727 + electron-to-chromium: 1.5.187 + node-releases: 2.0.19 + update-browserslist-db: 1.1.3(browserslist@4.25.1) + dev: true + + /bs58@4.0.1: + resolution: {integrity: sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==} + dependencies: + base-x: 3.0.11 + dev: true + + /bs58@5.0.0: + resolution: {integrity: sha512-r+ihvQJvahgYT50JD05dyJNKlmmSlMoOGwn1lCcEzanPglg7TxYjioQUYehQ9mAR/+hOSd2jRc/Z2y5UxBymvQ==} + dependencies: + base-x: 4.0.1 + dev: true + + /bs58@6.0.0: + resolution: {integrity: sha512-PD0wEnEYg6ijszw/u8s+iI3H17cTymlrwkKhDhPZq+Sokl3AU4htyBFTjAeNAlCCmg0f53g6ih3jATyCKftTfw==} + dependencies: + base-x: 5.0.1 + dev: true + + /bs58check@2.1.2: + resolution: {integrity: sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==} + dependencies: + bs58: 4.0.1 + create-hash: 1.2.0 + safe-buffer: 5.2.1 + dev: true + + /buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + dev: true + + /buffer-to-arraybuffer@0.0.5: + resolution: {integrity: sha512-3dthu5CYiVB1DEJp61FtApNnNndTckcqe4pFcLdvHtrpG+kcyekCJKg4MRiDcFW7A6AODnXB9U4dwQiCW5kzJQ==} + dev: true + + /buffer-xor@1.0.3: + resolution: {integrity: sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==} + dev: true + + /buffer-xor@2.0.2: + resolution: {integrity: sha512-eHslX0bin3GB+Lx2p7lEYRShRewuNZL3fUl4qlVJGGiwoPGftmt8JQgk2Y9Ji5/01TnVDo33E5b5O3vUB1HdqQ==} + dependencies: + safe-buffer: 5.2.1 + dev: true + + /buffer@4.9.2: + resolution: {integrity: sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==} + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + isarray: 1.0.0 + dev: true + + /buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + dev: true + + /bufferutil@4.0.5: + resolution: {integrity: sha512-HTm14iMQKK2FjFLRTM5lAVcyaUzOnqbPtesFIvREgXpJHdQm8bWS+GkQgIkfaBYRHuCnea7w8UVNfwiAQhlr9A==} + engines: {node: '>=6.14.2'} + requiresBuild: true + dependencies: + node-gyp-build: 4.8.4 + dev: true + optional: true + + /bufferutil@4.0.9: + resolution: {integrity: sha512-WDtdLmJvAuNNPzByAYpRo2rF1Mmradw6gvWsQKf63476DDXmomT9zUiGypLcG4ibIM67vhAj8jJRdbmEws2Aqw==} + engines: {node: '>=6.14.2'} + requiresBuild: true + dependencies: + node-gyp-build: 4.8.4 + dev: true + + /bufio@1.2.3: + resolution: {integrity: sha512-5Tt66bRzYUSlVZatc0E92uDenreJ+DpTBmSAUwL4VSxJn3e6cUyYwx+PoqML0GRZatgA/VX8ybhxItF8InZgqA==} + engines: {node: '>=8.0.0'} + dev: true + + /bytes@3.1.2: + resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} + engines: {node: '>= 0.8'} + dev: true + + /cacheable-lookup@5.0.4: + resolution: {integrity: sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==} + engines: {node: '>=10.6.0'} + dev: true + + /cacheable-lookup@6.1.0: + resolution: {integrity: sha512-KJ/Dmo1lDDhmW2XDPMo+9oiy/CeqosPguPCrgcVzKyZrL6pM1gU2GmPY/xo6OQPTUaA/c0kwHuywB4E6nmT9ww==} + engines: {node: '>=10.6.0'} + dev: true + + /cacheable-lookup@7.0.0: + resolution: {integrity: sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==} + engines: {node: '>=14.16'} + dev: true + + /cacheable-request@10.2.14: + resolution: {integrity: sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ==} + engines: {node: '>=14.16'} + dependencies: + '@types/http-cache-semantics': 4.0.4 + get-stream: 6.0.1 + http-cache-semantics: 4.2.0 + keyv: 4.5.4 + mimic-response: 4.0.0 + normalize-url: 8.0.2 + responselike: 3.0.0 + dev: true + + /cacheable-request@7.0.4: + resolution: {integrity: sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==} + engines: {node: '>=8'} + dependencies: + clone-response: 1.0.3 + get-stream: 5.2.0 + http-cache-semantics: 4.2.0 + keyv: 4.5.4 + lowercase-keys: 2.0.0 + normalize-url: 6.1.0 + responselike: 2.0.1 + dev: true + + /call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + dev: true + + /call-bind@1.0.8: + resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} + engines: {node: '>= 0.4'} + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + get-intrinsic: 1.3.0 + set-function-length: 1.2.2 + dev: true + + /call-bound@1.0.4: + resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind-apply-helpers: 1.0.2 + get-intrinsic: 1.3.0 + dev: true + + /callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + dev: true + + /camelcase@3.0.0: + resolution: {integrity: sha512-4nhGqUkc4BqbBBB4Q6zLuD7lzzrHYrjKGeYaEji/3tFR5VdJu9v+LilhGIVe8wxEJPPOeWo7eg8dwY13TZ1BNg==} + engines: {node: '>=0.10.0'} + dev: true + + /camelcase@6.3.0: + resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} + engines: {node: '>=10'} + dev: true + + /caniuse-lite@1.0.30001727: + resolution: {integrity: sha512-pB68nIHmbN6L/4C6MH1DokyR3bYqFwjaSs/sWDHGj4CTcFtQUQMuJftVwWkXq7mNWOybD3KhUv3oWHoGxgP14Q==} + dev: true + + /caseless@0.12.0: + resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==} + dev: true + + /cbor@10.0.9: + resolution: {integrity: sha512-KEWYehb/vJkRmigctVQLsz73Us2RNnITo/wOwQV5AtZpLGH1r2PPlsNHdsX460YuHZCyhLklbYzAOuJfOeg34Q==} + engines: {node: '>=20'} + dependencies: + nofilter: 3.1.0 + dev: true + + /cbor@8.1.0: + resolution: {integrity: sha512-DwGjNW9omn6EwP70aXsn7FQJx5kO12tX0bZkaTjzdVFM6/7nhA4t0EENocKGx6D2Bch9PE2KzCUf5SceBdeijg==} + engines: {node: '>=12.19'} + dependencies: + nofilter: 3.1.0 + dev: true + + /chai@4.5.0: + resolution: {integrity: sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==} + engines: {node: '>=4'} + dependencies: + assertion-error: 1.1.0 + check-error: 1.0.3 + deep-eql: 4.1.4 + get-func-name: 2.0.2 + loupe: 2.3.7 + pathval: 1.1.1 + type-detect: 4.1.0 + dev: true + + /chalk@2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + dev: true + + /chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + dev: true + + /check-error@1.0.3: + resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} + dependencies: + get-func-name: 2.0.2 + dev: true + + /chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} + dependencies: + anymatch: 3.1.3 + braces: 3.0.3 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + dev: true + + /chokidar@4.0.3: + resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} + engines: {node: '>= 14.16.0'} + dependencies: + readdirp: 4.1.2 + dev: true + + /chownr@1.1.4: + resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} + dev: true + + /ci-info@2.0.0: + resolution: {integrity: sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==} + dev: true + + /cids@0.7.5: + resolution: {integrity: sha512-zT7mPeghoWAu+ppn8+BS1tQ5qGmbMfB4AregnQjA/qHY3GC1m1ptI9GkWNlgeu38r7CuRdXB47uY2XgAYt6QVA==} + engines: {node: '>=4.0.0', npm: '>=3.0.0'} + deprecated: This module has been superseded by the multiformats module + dependencies: + buffer: 5.7.1 + class-is: 1.1.0 + multibase: 0.6.1 + multicodec: 1.0.4 + multihashes: 0.4.21 + dev: true + + /cipher-base@1.0.6: + resolution: {integrity: sha512-3Ek9H3X6pj5TgenXYtNWdaBon1tgYCaebd+XPg0keyjEbEfkD4KkmAxkQ/i1vYvxdcT5nscLBfq9VJRmCBcFSw==} + engines: {node: '>= 0.10'} + dependencies: + inherits: 2.0.4 + safe-buffer: 5.2.1 + dev: true + + /class-is@1.1.0: + resolution: {integrity: sha512-rhjH9AG1fvabIDoGRVH587413LPjTZgmDF9fOFCbFJQV4yuocX1mHxxvXI4g3cGwbVY9wAYIoKlg1N79frJKQw==} + dev: true + + /clean-stack@2.2.0: + resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} + engines: {node: '>=6'} + dev: true + + /cli-boxes@2.2.1: + resolution: {integrity: sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==} + engines: {node: '>=6'} + dev: true + + /cli-cursor@3.1.0: + resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} + engines: {node: '>=8'} + dependencies: + restore-cursor: 3.1.0 + dev: true + + /cli-table3@0.6.5: + resolution: {integrity: sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==} + engines: {node: 10.* || >= 12.*} + dependencies: + string-width: 4.2.3 + optionalDependencies: + '@colors/colors': 1.5.0 + dev: true + + /cli-truncate@2.1.0: + resolution: {integrity: sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==} + engines: {node: '>=8'} + dependencies: + slice-ansi: 3.0.0 + string-width: 4.2.3 + dev: true + + /cliui@3.2.0: + resolution: {integrity: sha512-0yayqDxWQbqk3ojkYqUKqaAQ6AfNKeKWRNA8kR0WXzAsdHpP4BIaOmMAG87JGuO6qcobyW4GjxHd9PmhEd+T9w==} + dependencies: + string-width: 1.0.2 + strip-ansi: 3.0.1 + wrap-ansi: 2.1.0 + dev: true + + /cliui@7.0.4: + resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + dev: true + + /cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + dev: true + + /clone-response@1.0.3: + resolution: {integrity: sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==} + dependencies: + mimic-response: 1.0.1 + dev: true + + /code-excerpt@3.0.0: + resolution: {integrity: sha512-VHNTVhd7KsLGOqfX3SyeO8RyYPMp1GJOg194VITk04WMYCv4plV68YWe6TJZxd9MhobjtpMRnVky01gqZsalaw==} + engines: {node: '>=10'} + dependencies: + convert-to-spaces: 1.0.2 + dev: true + + /code-point-at@1.1.0: + resolution: {integrity: sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==} + engines: {node: '>=0.10.0'} + dev: true + + /color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + dependencies: + color-name: 1.1.3 + dev: true + + /color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + dependencies: + color-name: 1.1.4 + dev: true + + /color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + dev: true + + /color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + dev: true + + /color-string@1.9.1: + resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} + dependencies: + color-name: 1.1.4 + simple-swizzle: 0.2.2 + dev: true + + /color@3.2.1: + resolution: {integrity: sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==} + dependencies: + color-convert: 1.9.3 + color-string: 1.9.1 + dev: true + + /colorspace@1.1.4: + resolution: {integrity: sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==} + dependencies: + color: 3.2.1 + text-hex: 1.0.0 + dev: true + + /combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + dependencies: + delayed-stream: 1.0.0 + dev: true + + /command-exists@1.2.9: + resolution: {integrity: sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==} + dev: true + + /command-line-args@5.2.1: + resolution: {integrity: sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==} + engines: {node: '>=4.0.0'} + dependencies: + array-back: 3.1.0 + find-replace: 3.0.0 + lodash.camelcase: 4.3.0 + typical: 4.0.0 + dev: true + + /command-line-usage@6.1.3: + resolution: {integrity: sha512-sH5ZSPr+7UStsloltmDh7Ce5fb8XPlHyoPzTpyyMuYCtervL65+ubVZ6Q61cFtFl62UyJlc8/JwERRbAFPUqgw==} + engines: {node: '>=8.0.0'} + dependencies: + array-back: 4.0.2 + chalk: 2.4.2 + table-layout: 1.0.2 + typical: 5.2.0 + dev: true + + /commander@10.0.1: + resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} + engines: {node: '>=14'} + dev: true + + /commander@8.3.0: + resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} + engines: {node: '>= 12'} + dev: true + + /compare-versions@6.1.1: + resolution: {integrity: sha512-4hm4VPpIecmlg59CHXnRDnqGplJFrbLG4aFEl5vl6cK1u76ws3LLvX7ikFnTDl5vo39sjWD6AaDPYodJp/NNHg==} + dev: true + + /concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + dev: true + + /concurrently@9.1.2: + resolution: {integrity: sha512-H9MWcoPsYddwbOGM6difjVwVZHl63nwMEwDJG/L7VGtuaJhb12h2caPG2tVPWs7emuYix252iGfqOyrz1GczTQ==} + engines: {node: '>=18'} + hasBin: true + dependencies: + chalk: 4.1.2 + lodash: 4.17.21 + rxjs: 7.8.2 + shell-quote: 1.8.3 + supports-color: 8.1.1 + tree-kill: 1.2.2 + yargs: 17.7.2 + dev: true + + /config-chain@1.1.13: + resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==} + dependencies: + ini: 1.3.8 + proto-list: 1.2.4 + dev: true + + /content-disposition@0.5.4: + resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} + engines: {node: '>= 0.6'} + dependencies: + safe-buffer: 5.2.1 + dev: true + + /content-hash@2.5.2: + resolution: {integrity: sha512-FvIQKy0S1JaWV10sMsA7TRx8bpU+pqPkhbsfvOJAdjRXvYxEckAwQWGwtRjiaJfh+E0DvcWUGqcdjwMGFjsSdw==} + dependencies: + cids: 0.7.5 + multicodec: 0.5.7 + multihashes: 0.4.21 + dev: true + + /content-type@1.0.5: + resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} + engines: {node: '>= 0.6'} + dev: true + + /convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + dev: true + + /convert-to-spaces@1.0.2: + resolution: {integrity: sha512-cj09EBuObp9gZNQCzc7hByQyrs6jVGE+o9kSJmeUoj+GiPiJvi5LYqEH/Hmme4+MTLHM+Ejtq+FChpjjEnsPdQ==} + engines: {node: '>= 4'} + dev: true + + /cookie-signature@1.0.6: + resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} + dev: true + + /cookie@0.4.2: + resolution: {integrity: sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==} + engines: {node: '>= 0.6'} + dev: true + + /cookie@0.7.1: + resolution: {integrity: sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==} + engines: {node: '>= 0.6'} + dev: true + + /core-js-pure@3.44.0: + resolution: {integrity: sha512-gvMQAGB4dfVUxpYD0k3Fq8J+n5bB6Ytl15lqlZrOIXFzxOhtPaObfkQGHtMRdyjIf7z2IeNULwi1jEwyS+ltKQ==} + requiresBuild: true + dev: true + + /core-util-is@1.0.2: + resolution: {integrity: sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==} + dev: true + + /cors@2.8.5: + resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} + engines: {node: '>= 0.10'} + dependencies: + object-assign: 4.1.1 + vary: 1.1.2 + dev: true + + /cosmiconfig@8.3.6(typescript@5.8.3): + resolution: {integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==} + engines: {node: '>=14'} + peerDependencies: + typescript: '>=4.9.5' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + import-fresh: 3.3.1 + js-yaml: 4.1.0 + parse-json: 5.2.0 + path-type: 4.0.0 + typescript: 5.8.3 + dev: true + + /crc-32@1.2.2: + resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==} + engines: {node: '>=0.8'} + hasBin: true + dev: true + + /create-hash@1.1.3: + resolution: {integrity: sha512-snRpch/kwQhcdlnZKYanNF1m0RDlrCdSKQaH87w1FCFPVPNCQ/Il9QJKAX2jVBZddRdaHBMC+zXa9Gw9tmkNUA==} + dependencies: + cipher-base: 1.0.6 + inherits: 2.0.4 + ripemd160: 2.0.1 + sha.js: 2.4.12 + dev: true + + /create-hash@1.2.0: + resolution: {integrity: sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==} + dependencies: + cipher-base: 1.0.6 + inherits: 2.0.4 + md5.js: 1.3.5 + ripemd160: 2.0.2 + sha.js: 2.4.12 + dev: true + + /create-hmac@1.1.7: + resolution: {integrity: sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==} + dependencies: + cipher-base: 1.0.6 + create-hash: 1.2.0 + inherits: 2.0.4 + ripemd160: 2.0.2 + safe-buffer: 5.2.1 + sha.js: 2.4.12 + dev: true + + /create-require@1.1.1: + resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} + dev: true + + /cross-fetch@4.1.0: + resolution: {integrity: sha512-uKm5PU+MHTootlWEY+mZ4vvXoCn4fLQxT9dSc1sXVMSFkINTJVN8cAQROpwcKm8bJ/c7rgZVIBWzH5T78sNZZw==} + dependencies: + node-fetch: 2.7.0 + transitivePeerDependencies: + - encoding + dev: true + + /cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + dev: true + + /d@1.0.2: + resolution: {integrity: sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==} + engines: {node: '>=0.12'} + dependencies: + es5-ext: 0.10.64 + type: 2.7.3 + dev: true + + /dashdash@1.14.1: + resolution: {integrity: sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==} + engines: {node: '>=0.10'} + dependencies: + assert-plus: 1.0.0 + dev: true + + /data-view-buffer@1.0.2: + resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + dev: true + + /data-view-byte-length@1.0.2: + resolution: {integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + dev: true + + /data-view-byte-offset@1.0.1: + resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + dev: true + + /debug@2.6.9: + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.0.0 + dev: true + + /debug@3.2.7: + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.3 + dev: true + + /debug@4.4.1(supports-color@8.1.1): + resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.3 + supports-color: 8.1.1 + dev: true + + /decamelize@1.2.0: + resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} + engines: {node: '>=0.10.0'} + dev: true + + /decamelize@4.0.0: + resolution: {integrity: sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==} + engines: {node: '>=10'} + dev: true + + /decode-uri-component@0.2.2: + resolution: {integrity: sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==} + engines: {node: '>=0.10'} + dev: true + + /decompress-response@3.3.0: + resolution: {integrity: sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==} + engines: {node: '>=4'} + dependencies: + mimic-response: 1.0.1 + dev: true + + /decompress-response@6.0.0: + resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} + engines: {node: '>=10'} + dependencies: + mimic-response: 3.1.0 + dev: true + + /deep-eql@4.1.4: + resolution: {integrity: sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==} + engines: {node: '>=6'} + dependencies: + type-detect: 4.1.0 + dev: true + + /deep-extend@0.6.0: + resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} + engines: {node: '>=4.0.0'} + dev: true + + /deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + dev: true + + /defer-to-connect@2.0.1: + resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==} + engines: {node: '>=10'} + dev: true + + /deferred-leveldown@5.3.0: + resolution: {integrity: sha512-a59VOT+oDy7vtAbLRCZwWgxu2BaCfd5Hk7wxJd48ei7I+nsg8Orlb9CLG0PMZienk9BSUKgeAqkO2+Lw+1+Ukw==} + engines: {node: '>=6'} + deprecated: Superseded by abstract-level (https://github.com/Level/community#faq) + dependencies: + abstract-leveldown: 6.2.3 + inherits: 2.0.4 + dev: true + + /define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + dependencies: + es-define-property: 1.0.1 + es-errors: 1.3.0 + gopd: 1.2.0 + dev: true + + /define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + dependencies: + define-data-property: 1.1.4 + has-property-descriptors: 1.0.2 + object-keys: 1.1.1 + dev: true + + /delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + dev: true + + /depd@2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + dev: true + + /destroy@1.2.0: + resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + dev: true + + /detect-indent@7.0.1: + resolution: {integrity: sha512-Mc7QhQ8s+cLrnUfU/Ji94vG/r8M26m8f++vyres4ZoojaRDpZ1eSIh/EpzLNwlWuvzSZ3UbDFspjFvTDXe6e/g==} + engines: {node: '>=12.20'} + dev: true + + /detect-newline@4.0.1: + resolution: {integrity: sha512-qE3Veg1YXzGHQhlA6jzebZN2qVf6NX+A7m7qlhCGG30dJixrAQhYOsJjsnBjJkCSmuOPpCk30145fr8FV0bzog==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: true + + /diff@4.0.2: + resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} + engines: {node: '>=0.3.1'} + dev: true + + /diff@5.2.0: + resolution: {integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==} + engines: {node: '>=0.3.1'} + dev: true + + /dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + dependencies: + path-type: 4.0.0 + dev: true + + /doctrine@2.1.0: + resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} + engines: {node: '>=0.10.0'} + dependencies: + esutils: 2.0.3 + dev: true + + /doctrine@3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + dependencies: + esutils: 2.0.3 + dev: true + + /dom-walk@0.1.2: + resolution: {integrity: sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==} + dev: true + + /dotenv@16.6.1: + resolution: {integrity: sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==} + engines: {node: '>=12'} + dev: true + + /dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 + dev: true + + /ecc-jsbn@0.1.2: + resolution: {integrity: sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==} + dependencies: + jsbn: 0.1.1 + safer-buffer: 2.1.2 + dev: true + + /ee-first@1.1.1: + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + dev: true + + /electron-to-chromium@1.5.187: + resolution: {integrity: sha512-cl5Jc9I0KGUoOoSbxvTywTa40uspGJt/BDBoDLoxJRSBpWh4FFXBsjNRHfQrONsV/OoEjDfHUmZQa2d6Ze4YgA==} + dev: true + + /elliptic@6.6.1: + resolution: {integrity: sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g==} + dependencies: + bn.js: 4.12.2 + brorand: 1.1.0 + hash.js: 1.1.7 + hmac-drbg: 1.0.1 + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + minimalistic-crypto-utils: 1.0.1 + dev: true + + /emittery@0.10.0: + resolution: {integrity: sha512-AGvFfs+d0JKCJQ4o01ASQLGPmSCxgfU9RFXvzPvZdjKK8oscynksuJhWrSTSw7j7Ep/sZct5b5ZhYCi8S/t0HQ==} + engines: {node: '>=12'} + dev: true + + /emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + dev: true + + /enabled@2.0.0: + resolution: {integrity: sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==} + dev: true + + /encode-utf8@1.0.3: + resolution: {integrity: sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw==} + dev: true + + /encodeurl@1.0.2: + resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} + engines: {node: '>= 0.8'} + dev: true + + /encodeurl@2.0.0: + resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} + engines: {node: '>= 0.8'} + dev: true + + /encoding-down@6.3.0: + resolution: {integrity: sha512-QKrV0iKR6MZVJV08QY0wp1e7vF6QbhnbQhb07bwpEyuz4uZiZgPlEGdkCROuFkUwdxlFaiPIhjyarH1ee/3vhw==} + engines: {node: '>=6'} + deprecated: Superseded by abstract-level (https://github.com/Level/community#faq) + dependencies: + abstract-leveldown: 6.3.0 + inherits: 2.0.4 + level-codec: 9.0.2 + level-errors: 2.0.1 + dev: true + + /end-of-stream@1.4.5: + resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==} + dependencies: + once: 1.4.0 + dev: true + + /enquirer@2.4.1: + resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} + engines: {node: '>=8.6'} + dependencies: + ansi-colors: 4.1.3 + strip-ansi: 6.0.1 + dev: true + + /env-paths@2.2.1: + resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} + engines: {node: '>=6'} + dev: true + + /errno@0.1.8: + resolution: {integrity: sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==} + hasBin: true + dependencies: + prr: 1.0.1 + dev: true + + /error-ex@1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + dependencies: + is-arrayish: 0.2.1 + dev: true + + /es-abstract@1.24.0: + resolution: {integrity: sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==} + engines: {node: '>= 0.4'} + dependencies: + array-buffer-byte-length: 1.0.2 + arraybuffer.prototype.slice: 1.0.4 + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.4 + data-view-buffer: 1.0.2 + data-view-byte-length: 1.0.2 + data-view-byte-offset: 1.0.1 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + es-set-tostringtag: 2.1.0 + es-to-primitive: 1.3.0 + function.prototype.name: 1.1.8 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 + get-symbol-description: 1.1.0 + globalthis: 1.0.4 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + has-proto: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + internal-slot: 1.1.0 + is-array-buffer: 3.0.5 + is-callable: 1.2.7 + is-data-view: 1.0.2 + is-negative-zero: 2.0.3 + is-regex: 1.2.1 + is-set: 2.0.3 + is-shared-array-buffer: 1.0.4 + is-string: 1.1.1 + is-typed-array: 1.1.15 + is-weakref: 1.1.1 + math-intrinsics: 1.1.0 + object-inspect: 1.13.4 + object-keys: 1.1.1 + object.assign: 4.1.7 + own-keys: 1.0.1 + regexp.prototype.flags: 1.5.4 + safe-array-concat: 1.1.3 + safe-push-apply: 1.0.0 + safe-regex-test: 1.1.0 + set-proto: 1.0.0 + stop-iteration-iterator: 1.1.0 + string.prototype.trim: 1.2.10 + string.prototype.trimend: 1.0.9 + string.prototype.trimstart: 1.0.8 + typed-array-buffer: 1.0.3 + typed-array-byte-length: 1.0.3 + typed-array-byte-offset: 1.0.4 + typed-array-length: 1.0.7 + unbox-primitive: 1.1.0 + which-typed-array: 1.1.19 + dev: true + + /es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + dev: true + + /es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + dev: true + + /es-object-atoms@1.1.1: + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} + engines: {node: '>= 0.4'} + dependencies: + es-errors: 1.3.0 + dev: true + + /es-set-tostringtag@2.1.0: + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} + engines: {node: '>= 0.4'} + dependencies: + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + dev: true + + /es-shim-unscopables@1.1.0: + resolution: {integrity: sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==} + engines: {node: '>= 0.4'} + dependencies: + hasown: 2.0.2 + dev: true + + /es-to-primitive@1.3.0: + resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} + engines: {node: '>= 0.4'} + dependencies: + is-callable: 1.2.7 + is-date-object: 1.1.0 + is-symbol: 1.1.1 + dev: true + + /es5-ext@0.10.64: + resolution: {integrity: sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==} + engines: {node: '>=0.10'} + requiresBuild: true + dependencies: + es6-iterator: 2.0.3 + es6-symbol: 3.1.4 + esniff: 2.0.1 + next-tick: 1.1.0 + dev: true + + /es6-iterator@2.0.3: + resolution: {integrity: sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==} + dependencies: + d: 1.0.2 + es5-ext: 0.10.64 + es6-symbol: 3.1.4 + dev: true + + /es6-promise@4.2.8: + resolution: {integrity: sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==} + dev: true + + /es6-symbol@3.1.4: + resolution: {integrity: sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==} + engines: {node: '>=0.12'} + dependencies: + d: 1.0.2 + ext: 1.7.0 + dev: true + + /escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + dev: true + + /escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + dev: true + + /escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + dev: true + + /escape-string-regexp@2.0.0: + resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} + engines: {node: '>=8'} + dev: true + + /escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + dev: true + + /eslint-config-prettier@9.1.2(eslint@8.57.1): + resolution: {integrity: sha512-iI1f+D2ViGn+uvv5HuHVUamg8ll4tN+JRHGc6IJi4TP9Kl976C57fzPXgseXNs8v0iA8aSJpHsTWjDb9QJamGQ==} + hasBin: true + peerDependencies: + eslint: '>=7.0.0' + dependencies: + eslint: 8.57.1 + dev: true + + /eslint-import-resolver-node@0.3.9: + resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} + dependencies: + debug: 3.2.7 + is-core-module: 2.16.1 + resolve: 1.22.10 + transitivePeerDependencies: + - supports-color + dev: true + + /eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0)(eslint@8.57.1): + resolution: {integrity: sha512-A1rHYb06zjMGAxdLSkN2fXPBwuSaQ0iO5M/hdyS0Ajj1VBaRp0sPD3dn1FhME3c/JluGFbwSxyCfqdSbtQLAHQ==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + eslint: '*' + eslint-plugin-import: '*' + eslint-plugin-import-x: '*' + peerDependenciesMeta: + eslint-plugin-import: + optional: true + eslint-plugin-import-x: + optional: true + dependencies: + '@nolyfill/is-core-module': 1.0.39 + debug: 4.4.1(supports-color@8.1.1) + eslint: 8.57.1 + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@7.18.0)(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1) + get-tsconfig: 4.10.1 + is-bun-module: 2.0.0 + stable-hash: 0.0.5 + tinyglobby: 0.2.14 + unrs-resolver: 1.11.1 + transitivePeerDependencies: + - supports-color + dev: true + + /eslint-module-utils@2.12.1(@typescript-eslint/parser@7.18.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1): + resolution: {integrity: sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: '*' + eslint-import-resolver-node: '*' + eslint-import-resolver-typescript: '*' + eslint-import-resolver-webpack: '*' + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + eslint: + optional: true + eslint-import-resolver-node: + optional: true + eslint-import-resolver-typescript: + optional: true + eslint-import-resolver-webpack: + optional: true + dependencies: + '@typescript-eslint/parser': 7.18.0(eslint@8.57.1)(typescript@5.8.3) + debug: 3.2.7 + eslint: 8.57.1 + eslint-import-resolver-node: 0.3.9 + eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@8.57.1) + transitivePeerDependencies: + - supports-color + dev: true + + /eslint-plugin-autofix@2.2.0(eslint@8.57.1): + resolution: {integrity: sha512-lu8+0r+utyTroROqXIL+a8sUpICi6za22hIzlpb0+x0tQGRnOjhOKU7v8mC/NS/faDoVsw6xW3vUpc+Mcz5NWA==} + engines: {node: '>=18'} + peerDependencies: + eslint: '>=8' + dependencies: + eslint: 8.57.1 + eslint-rule-composer: 0.3.0 + espree: 9.6.1 + esutils: 2.0.3 + string-similarity: 4.0.4 + dev: true + + /eslint-plugin-compat@4.2.0(eslint@8.57.1): + resolution: {integrity: sha512-RDKSYD0maWy5r7zb5cWQS+uSPc26mgOzdORJ8hxILmWM7S/Ncwky7BcAtXVY5iRbKjBdHsWU8Yg7hfoZjtkv7w==} + engines: {node: '>=14.x'} + peerDependencies: + eslint: ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + '@mdn/browser-compat-data': 5.7.6 + ast-metadata-inferer: 0.8.1 + browserslist: 4.25.1 + caniuse-lite: 1.0.30001727 + eslint: 8.57.1 + find-up: 5.0.0 + lodash.memoize: 4.1.2 + semver: 7.7.2 + dev: true + + /eslint-plugin-import@2.32.0(@typescript-eslint/parser@7.18.0)(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1): + resolution: {integrity: sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9 + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + dependencies: + '@rtsao/scc': 1.1.0 + '@typescript-eslint/parser': 7.18.0(eslint@8.57.1)(typescript@5.8.3) + array-includes: 3.1.9 + array.prototype.findlastindex: 1.2.6 + array.prototype.flat: 1.3.3 + array.prototype.flatmap: 1.3.3 + debug: 3.2.7 + doctrine: 2.1.0 + eslint: 8.57.1 + eslint-import-resolver-node: 0.3.9 + eslint-module-utils: 2.12.1(@typescript-eslint/parser@7.18.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1) + hasown: 2.0.2 + is-core-module: 2.16.1 + is-glob: 4.0.3 + minimatch: 3.1.2 + object.fromentries: 2.0.8 + object.groupby: 1.0.3 + object.values: 1.2.1 + semver: 6.3.1 + string.prototype.trimend: 1.0.9 + tsconfig-paths: 3.15.0 + transitivePeerDependencies: + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - supports-color + dev: true + + /eslint-plugin-jest-extended@2.0.3(eslint@8.57.1)(typescript@5.8.3): + resolution: {integrity: sha512-gPhanMUyClZHj4UqvtavRA2s7FqaMdNZQvKLz12gwkxikIKEwr4FgrnFne7/obd0bEIdpHgc0b2zwLK7BGWurw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + dependencies: + '@typescript-eslint/utils': 5.62.0(eslint@8.57.1)(typescript@5.8.3) + eslint: 8.57.1 + transitivePeerDependencies: + - supports-color + - typescript + dev: true + + /eslint-plugin-prettier@5.5.3(eslint-config-prettier@9.1.2)(eslint@8.57.1)(prettier@3.6.2): + resolution: {integrity: sha512-NAdMYww51ehKfDyDhv59/eIItUVzU0Io9H2E8nHNGKEeeqlnci+1gCvrHib6EmZdf6GxF+LCV5K7UC65Ezvw7w==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + '@types/eslint': '>=8.0.0' + eslint: '>=8.0.0' + eslint-config-prettier: '>= 7.0.0 <10.0.0 || >=10.1.0' + prettier: '>=3.0.0' + peerDependenciesMeta: + '@types/eslint': + optional: true + eslint-config-prettier: + optional: true + dependencies: + eslint: 8.57.1 + eslint-config-prettier: 9.1.2(eslint@8.57.1) + prettier: 3.6.2 + prettier-linter-helpers: 1.0.0 + synckit: 0.11.10 + dev: true + + /eslint-plugin-unused-imports@3.2.0(@typescript-eslint/eslint-plugin@7.18.0)(eslint@8.57.1): + resolution: {integrity: sha512-6uXyn6xdINEpxE1MtDjxQsyXB37lfyO2yKGVVgtD7WEWQGORSOZjgrD6hBhvGv4/SO+TOlS+UnC6JppRqbuwGQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + '@typescript-eslint/eslint-plugin': 6 - 7 + eslint: '8' + peerDependenciesMeta: + '@typescript-eslint/eslint-plugin': + optional: true + dependencies: + '@typescript-eslint/eslint-plugin': 7.18.0(@typescript-eslint/parser@7.18.0)(eslint@8.57.1)(typescript@5.8.3) + eslint: 8.57.1 + eslint-rule-composer: 0.3.0 + dev: true + + /eslint-rule-composer@0.3.0: + resolution: {integrity: sha512-bt+Sh8CtDmn2OajxvNO+BX7Wn4CIWMpTRm3MaiKPCQcnnlm0CS2mhui6QaoeQugs+3Kj2ESKEEGJUdVafwhiCg==} + engines: {node: '>=4.0.0'} + dev: true + + /eslint-scope@5.1.1: + resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} + engines: {node: '>=8.0.0'} + dependencies: + esrecurse: 4.3.0 + estraverse: 4.3.0 + dev: true + + /eslint-scope@7.2.2: + resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + dev: true + + /eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + + /eslint@8.57.1: + resolution: {integrity: sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==} + 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 + dependencies: + '@eslint-community/eslint-utils': 4.7.0(eslint@8.57.1) + '@eslint-community/regexpp': 4.12.1 + '@eslint/eslintrc': 2.1.4 + '@eslint/js': 8.57.1 + '@humanwhocodes/config-array': 0.13.0 + '@humanwhocodes/module-importer': 1.0.1 + '@nodelib/fs.walk': 1.2.8 + '@ungap/structured-clone': 1.3.0 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.6 + debug: 4.4.1(supports-color@8.1.1) + doctrine: 3.0.0 + escape-string-regexp: 4.0.0 + eslint-scope: 7.2.2 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 + esquery: 1.6.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 6.0.1 + find-up: 5.0.0 + glob-parent: 6.0.2 + globals: 13.24.0 + graphemer: 1.4.0 + ignore: 5.3.2 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + is-path-inside: 3.0.3 + js-yaml: 4.1.0 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.4.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.4 + strip-ansi: 6.0.1 + text-table: 0.2.0 + transitivePeerDependencies: + - supports-color + dev: true + + /esniff@2.0.1: + resolution: {integrity: sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==} + engines: {node: '>=0.10'} + dependencies: + d: 1.0.2 + es5-ext: 0.10.64 + event-emitter: 0.3.5 + type: 2.7.3 + dev: true + + /espree@9.6.1: + resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + acorn: 8.15.0 + acorn-jsx: 5.3.2(acorn@8.15.0) + eslint-visitor-keys: 3.4.3 + dev: true + + /esquery@1.6.0: + resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} + engines: {node: '>=0.10'} + dependencies: + estraverse: 5.3.0 + dev: true + + /esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + dependencies: + estraverse: 5.3.0 + dev: true + + /estraverse@4.3.0: + resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} + engines: {node: '>=4.0'} + dev: true + + /estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + dev: true + + /esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + dev: true + + /etag@1.8.1: + resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} + engines: {node: '>= 0.6'} + dev: true + + /eth-ens-namehash@2.0.8: + resolution: {integrity: sha512-VWEI1+KJfz4Km//dadyvBBoBeSQ0MHTXPvr8UIXiLW6IanxvAV+DmlZAijZwAyggqGUfwQBeHf7tc9wzc1piSw==} + dependencies: + idna-uts46-hx: 2.3.1 + js-sha3: 0.5.7 + dev: true + + /eth-lib@0.1.29: + resolution: {integrity: sha512-bfttrr3/7gG4E02HoWTDUcDDslN003OlOoBxk9virpAZQ1ja/jDgwkWB8QfJF7ojuEowrqy+lzp9VcJG7/k5bQ==} + dependencies: + bn.js: 4.12.2 + elliptic: 6.6.1 + nano-json-stream-parser: 0.1.2 + servify: 0.1.12 + ws: 3.3.3 + xhr-request-promise: 0.1.3 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: true + + /eth-lib@0.2.8: + resolution: {integrity: sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==} + dependencies: + bn.js: 4.12.2 + elliptic: 6.6.1 + xhr-request-promise: 0.1.3 + dev: true + + /ethereum-bloom-filters@1.2.0: + resolution: {integrity: sha512-28hyiE7HVsWubqhpVLVmZXFd4ITeHi+BUu05o9isf0GUpMtzBUi+8/gFrGaGYzvGAJQmJ3JKj77Mk9G98T84rA==} + dependencies: + '@noble/hashes': 1.8.0 + dev: true + + /ethereum-cryptography@0.1.3: + resolution: {integrity: sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==} + dependencies: + '@types/pbkdf2': 3.1.2 + '@types/secp256k1': 4.0.6 + blakejs: 1.2.1 + browserify-aes: 1.2.0 + bs58check: 2.1.2 + create-hash: 1.2.0 + create-hmac: 1.1.7 + hash.js: 1.1.7 + keccak: 3.0.4 + pbkdf2: 3.1.3 + randombytes: 2.1.0 + safe-buffer: 5.2.1 + scrypt-js: 3.0.1 + secp256k1: 4.0.4 + setimmediate: 1.0.5 + dev: true + + /ethereum-cryptography@1.2.0: + resolution: {integrity: sha512-6yFQC9b5ug6/17CQpCyE3k9eKBMdhyVjzUy1WkiuY/E4vj/SXDBbCw8QEIaXqf0Mf2SnY6RmpDcwlUmBSS0EJw==} + dependencies: + '@noble/hashes': 1.2.0 + '@noble/secp256k1': 1.7.1 + '@scure/bip32': 1.1.5 + '@scure/bip39': 1.1.1 + dev: true + + /ethereum-cryptography@2.2.1: + resolution: {integrity: sha512-r/W8lkHSiTLxUxW8Rf3u4HGB0xQweG2RyETjywylKZSzLWoWAijRz8WCuOtJ6wah+avllXBqZuk29HCCvhEIRg==} + dependencies: + '@noble/curves': 1.4.2 + '@noble/hashes': 1.4.0 + '@scure/bip32': 1.4.0 + '@scure/bip39': 1.3.0 + dev: true + + /ethereum-waffle@4.0.10(@ensdomains/ens@0.4.5)(@ensdomains/resolver@0.2.4)(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0)(ethers@5.8.0)(typescript@5.8.3): + resolution: {integrity: sha512-iw9z1otq7qNkGDNcMoeNeLIATF9yKl1M8AIeu42ElfNBplq0e+5PeasQmm8ybY/elkZ1XyRO0JBQxQdVRb8bqQ==} + engines: {node: '>=10.0'} + hasBin: true + peerDependencies: + ethers: ^5.7.2 + dependencies: + '@ethereum-waffle/chai': 4.0.10(@ensdomains/ens@0.4.5)(@ensdomains/resolver@0.2.4)(ethers@5.8.0) + '@ethereum-waffle/compiler': 4.0.3(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0)(ethers@5.8.0)(solc@0.8.15)(typechain@8.3.2)(typescript@5.8.3) + '@ethereum-waffle/mock-contract': 4.0.4(ethers@5.8.0) + '@ethereum-waffle/provider': 4.0.5(@ensdomains/ens@0.4.5)(@ensdomains/resolver@0.2.4)(ethers@5.8.0) + ethers: 5.8.0 + solc: 0.8.15 + typechain: 8.3.2(typescript@5.8.3) + transitivePeerDependencies: + - '@ensdomains/ens' + - '@ensdomains/resolver' + - '@ethersproject/abi' + - '@ethersproject/providers' + - debug + - encoding + - supports-color + - typescript + dev: true + + /ethereumjs-abi@0.6.8: + resolution: {integrity: sha512-Tx0r/iXI6r+lRsdvkFDlut0N08jWMnKRZ6Gkq+Nmw75lZe4e6o3EkSnkaBP5NF6+m5PTGAr9JP43N3LyeoglsA==} + deprecated: This library has been deprecated and usage is discouraged. + dependencies: + bn.js: 4.12.2 + ethereumjs-util: 6.2.1 + dev: true + + /ethereumjs-util@6.2.1: + resolution: {integrity: sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw==} + dependencies: + '@types/bn.js': 4.11.6 + bn.js: 4.12.2 + create-hash: 1.2.0 + elliptic: 6.6.1 + ethereum-cryptography: 0.1.3 + ethjs-util: 0.1.6 + rlp: 2.2.7 + dev: true + + /ethereumjs-util@7.1.3: + resolution: {integrity: sha512-y+82tEbyASO0K0X1/SRhbJJoAlfcvq8JbrG4a5cjrOks7HS/36efU/0j2flxCPOUM++HFahk33kr/ZxyC4vNuw==} + engines: {node: '>=10.0.0'} + dependencies: + '@types/bn.js': 5.2.0 + bn.js: 5.2.2 + create-hash: 1.2.0 + ethereum-cryptography: 0.1.3 + rlp: 2.2.7 + dev: true + + /ethereumjs-util@7.1.5: + resolution: {integrity: sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==} + engines: {node: '>=10.0.0'} + dependencies: + '@types/bn.js': 5.2.0 + bn.js: 5.2.2 + create-hash: 1.2.0 + ethereum-cryptography: 0.1.3 + rlp: 2.2.7 + dev: true + + /ethers@5.8.0: + resolution: {integrity: sha512-DUq+7fHrCg1aPDFCHx6UIPb3nmt2XMpM7Y/g2gLhsl3lIBqeAfOJIl1qEvRf2uq3BiKxmh6Fh5pfp2ieyek7Kg==} + dependencies: + '@ethersproject/abi': 5.8.0 + '@ethersproject/abstract-provider': 5.8.0 + '@ethersproject/abstract-signer': 5.8.0 + '@ethersproject/address': 5.8.0 + '@ethersproject/base64': 5.8.0 + '@ethersproject/basex': 5.8.0 + '@ethersproject/bignumber': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/constants': 5.8.0 + '@ethersproject/contracts': 5.8.0 + '@ethersproject/hash': 5.8.0 + '@ethersproject/hdnode': 5.8.0 + '@ethersproject/json-wallets': 5.8.0 + '@ethersproject/keccak256': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/networks': 5.8.0 + '@ethersproject/pbkdf2': 5.8.0 + '@ethersproject/properties': 5.8.0 + '@ethersproject/providers': 5.8.0 + '@ethersproject/random': 5.8.0 + '@ethersproject/rlp': 5.8.0 + '@ethersproject/sha2': 5.8.0 + '@ethersproject/signing-key': 5.8.0 + '@ethersproject/solidity': 5.8.0 + '@ethersproject/strings': 5.8.0 + '@ethersproject/transactions': 5.8.0 + '@ethersproject/units': 5.8.0 + '@ethersproject/wallet': 5.8.0 + '@ethersproject/web': 5.8.0 + '@ethersproject/wordlists': 5.8.0 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + dev: true + + /ethjs-unit@0.1.6: + resolution: {integrity: sha512-/Sn9Y0oKl0uqQuvgFk/zQgR7aw1g36qX/jzSQ5lSwlO0GigPymk4eGQfeNTD03w1dPOqfz8V77Cy43jH56pagw==} + engines: {node: '>=6.5.0', npm: '>=3'} + dependencies: + bn.js: 4.11.6 + number-to-bn: 1.7.0 + dev: true + + /ethjs-util@0.1.6: + resolution: {integrity: sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w==} + engines: {node: '>=6.5.0', npm: '>=3'} + dependencies: + is-hex-prefixed: 1.0.0 + strip-hex-prefix: 1.0.0 + dev: true + + /event-emitter@0.3.5: + resolution: {integrity: sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==} + dependencies: + d: 1.0.2 + es5-ext: 0.10.64 + dev: true + + /eventemitter3@4.0.4: + resolution: {integrity: sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ==} + dev: true + + /evp_bytestokey@1.0.3: + resolution: {integrity: sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==} + dependencies: + md5.js: 1.3.5 + safe-buffer: 5.2.1 + dev: true + + /exponential-backoff@3.1.2: + resolution: {integrity: sha512-8QxYTVXUkuy7fIIoitQkPwGonB8F3Zj8eEO8Sqg9Zv/bkI7RJAzowee4gr81Hak/dUTpA2Z7VfQgoijjPNlUZA==} + dev: true + + /express@4.21.2: + resolution: {integrity: sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==} + engines: {node: '>= 0.10.0'} + dependencies: + accepts: 1.3.8 + array-flatten: 1.1.1 + body-parser: 1.20.3 + content-disposition: 0.5.4 + content-type: 1.0.5 + cookie: 0.7.1 + cookie-signature: 1.0.6 + debug: 2.6.9 + depd: 2.0.0 + encodeurl: 2.0.0 + escape-html: 1.0.3 + etag: 1.8.1 + finalhandler: 1.3.1 + fresh: 0.5.2 + http-errors: 2.0.0 + merge-descriptors: 1.0.3 + methods: 1.1.2 + on-finished: 2.4.1 + parseurl: 1.3.3 + path-to-regexp: 0.1.12 + proxy-addr: 2.0.7 + qs: 6.13.0 + range-parser: 1.2.1 + safe-buffer: 5.2.1 + send: 0.19.0 + serve-static: 1.16.2 + setprototypeof: 1.2.0 + statuses: 2.0.1 + type-is: 1.6.18 + utils-merge: 1.0.1 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + dev: true + + /ext@1.7.0: + resolution: {integrity: sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==} + dependencies: + type: 2.7.3 + dev: true + + /extend@3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + dev: true + + /extsprintf@1.3.0: + resolution: {integrity: sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==} + engines: {'0': node >=0.6.0} + dev: true + + /fast-base64-decode@1.0.0: + resolution: {integrity: sha512-qwaScUgUGBYeDNRnbc/KyllVU88Jk1pRHPStuF/lO7B0/RTRLj7U0lkdTAutlBblY08rwZDff6tNU9cjv6j//Q==} + dev: true + + /fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + dev: true + + /fast-diff@1.3.0: + resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} + dev: true + + /fast-glob@3.3.3: + resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} + engines: {node: '>=8.6.0'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.8 + dev: true + + /fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + dev: true + + /fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + dev: true + + /fast-uri@3.0.6: + resolution: {integrity: sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==} + dev: true + + /fastq@1.19.1: + resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} + dependencies: + reusify: 1.1.0 + dev: true + + /fdir@6.4.6(picomatch@4.0.3): + resolution: {integrity: sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + dependencies: + picomatch: 4.0.3 + dev: true + + /fecha@4.2.3: + resolution: {integrity: sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==} + dev: true + + /file-entry-cache@6.0.1: + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} + engines: {node: ^10.12.0 || >=12.0.0} + dependencies: + flat-cache: 3.2.0 + dev: true + + /fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + dependencies: + to-regex-range: 5.0.1 + dev: true + + /finalhandler@1.3.1: + resolution: {integrity: sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==} + engines: {node: '>= 0.8'} + dependencies: + debug: 2.6.9 + encodeurl: 2.0.0 + escape-html: 1.0.3 + on-finished: 2.4.1 + parseurl: 1.3.3 + statuses: 2.0.1 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /find-replace@3.0.0: + resolution: {integrity: sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==} + engines: {node: '>=4.0.0'} + dependencies: + array-back: 3.1.0 + dev: true + + /find-up@1.1.2: + resolution: {integrity: sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA==} + engines: {node: '>=0.10.0'} + dependencies: + path-exists: 2.1.0 + pinkie-promise: 2.0.1 + dev: true + + /find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + dev: true + + /flat-cache@3.2.0: + resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} + engines: {node: ^10.12.0 || >=12.0.0} + dependencies: + flatted: 3.3.3 + keyv: 4.5.4 + rimraf: 3.0.2 + dev: true + + /flat@5.0.2: + resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} + hasBin: true + dev: true + + /flatted@3.3.3: + resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} + dev: true + + /fmix@0.1.0: + resolution: {integrity: sha512-Y6hyofImk9JdzU8k5INtTXX1cu8LDlePWDFU5sftm9H+zKCr5SGrVjdhkvsim646cw5zD0nADj8oHyXMZmCZ9w==} + dependencies: + imul: 1.0.1 + dev: true + + /fn.name@1.1.0: + resolution: {integrity: sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==} + dev: true + + /follow-redirects@1.15.9(debug@4.4.1): + resolution: {integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + dependencies: + debug: 4.4.1(supports-color@8.1.1) + dev: true + + /for-each@0.3.5: + resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} + engines: {node: '>= 0.4'} + dependencies: + is-callable: 1.2.7 + dev: true + + /forever-agent@0.6.1: + resolution: {integrity: sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==} + dev: true + + /form-data-encoder@1.7.1: + resolution: {integrity: sha512-EFRDrsMm/kyqbTQocNvRXMLjc7Es2Vk+IQFx/YW7hkUH1eBl4J1fqiP34l74Yt0pFLCNpc06fkbVk00008mzjg==} + dev: true + + /form-data-encoder@2.1.4: + resolution: {integrity: sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==} + engines: {node: '>= 14.17'} + dev: true + + /form-data@2.3.3: + resolution: {integrity: sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==} + engines: {node: '>= 0.12'} + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + dev: true + + /form-data@4.0.4: + resolution: {integrity: sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==} + engines: {node: '>= 6'} + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + es-set-tostringtag: 2.1.0 + hasown: 2.0.2 + mime-types: 2.1.35 + dev: true + + /forwarded@0.2.0: + resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} + engines: {node: '>= 0.6'} + dev: true + + /fp-ts@1.19.3: + resolution: {integrity: sha512-H5KQDspykdHuztLTg+ajGN0Z2qUjcEf3Ybxc6hLt0k7/zPkn29XnKnxlBPyW2XIddWrGaJBzBl4VLYOtk39yZg==} + dev: true + + /fp-ts@2.16.10: + resolution: {integrity: sha512-vuROzbNVfCmUkZSUbnWSltR1sbheyQbTzug7LB/46fEa1c0EucLeBaCEUE0gF3ZGUGBt9lVUiziGOhhj6K1ORA==} + dev: true + + /fresh@0.5.2: + resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} + engines: {node: '>= 0.6'} + dev: true + + /fs-extra@0.30.0: + resolution: {integrity: sha512-UvSPKyhMn6LEd/WpUaV9C9t3zATuqoqfWc3QdPhPLb58prN9tqYPlPWi8Krxi44loBoUzlobqZ3+8tGpxxSzwA==} + dependencies: + graceful-fs: 4.2.11 + jsonfile: 2.4.0 + klaw: 1.3.1 + path-is-absolute: 1.0.1 + rimraf: 2.7.1 + dev: true + + /fs-extra@10.1.0: + resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} + engines: {node: '>=12'} + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.1 + dev: true + + /fs-extra@4.0.3: + resolution: {integrity: sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==} + dependencies: + graceful-fs: 4.2.11 + jsonfile: 4.0.0 + universalify: 0.1.2 + dev: true + + /fs-extra@7.0.1: + resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} + engines: {node: '>=6 <7 || >=8'} + dependencies: + graceful-fs: 4.2.11 + jsonfile: 4.0.0 + universalify: 0.1.2 + dev: true + + /fs-minipass@1.2.7: + resolution: {integrity: sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==} + dependencies: + minipass: 2.9.0 + dev: true + + /fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + dev: true + + /fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + dev: true + + /function.prototype.name@1.1.8: + resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + functions-have-names: 1.2.3 + hasown: 2.0.2 + is-callable: 1.2.7 + dev: true + + /functional-red-black-tree@1.0.1: + resolution: {integrity: sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==} + dev: true + + /functions-have-names@1.2.3: + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + dev: true + + /ganache@7.4.3: + resolution: {integrity: sha512-RpEDUiCkqbouyE7+NMXG26ynZ+7sGiODU84Kz+FVoXUnQ4qQM4M8wif3Y4qUCt+D/eM1RVeGq0my62FPD6Y1KA==} + hasBin: true + optionalDependencies: + bufferutil: 4.0.5 + utf-8-validate: 5.0.7 + dev: true + bundledDependencies: + - '@trufflesuite/bigint-buffer' + - emittery + - keccak + - leveldown + - secp256k1 + - '@types/bn.js' + - '@types/lru-cache' + - '@types/seedrandom' + + /gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + dev: true + + /get-caller-file@1.0.3: + resolution: {integrity: sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==} + dev: true + + /get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + dev: true + + /get-func-name@2.0.2: + resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} + dev: true + + /get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + math-intrinsics: 1.1.0 + dev: true + + /get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.1 + dev: true + + /get-stream@5.2.0: + resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} + engines: {node: '>=8'} + dependencies: + pump: 3.0.3 + dev: true + + /get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + dev: true + + /get-symbol-description@1.1.0: + resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + dev: true + + /get-tsconfig@4.10.1: + resolution: {integrity: sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==} + dependencies: + resolve-pkg-maps: 1.0.0 + dev: true + + /getpass@0.1.7: + resolution: {integrity: sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==} + dependencies: + assert-plus: 1.0.0 + dev: true + + /git-hooks-list@4.1.1: + resolution: {integrity: sha512-cmP497iLq54AZnv4YRAEMnEyQ1eIn4tGKbmswqwmFV4GBnAqE8NLtWxxdXa++AalfgL5EBH4IxTPyquEuGY/jA==} + dev: true + + /glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + dependencies: + is-glob: 4.0.3 + dev: true + + /glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + dependencies: + is-glob: 4.0.3 + dev: true + + /glob@7.1.7: + resolution: {integrity: sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==} + deprecated: Glob versions prior to v9 are no longer supported + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + dev: true + + /glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Glob versions prior to v9 are no longer supported + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + dev: true + + /glob@8.1.0: + resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} + engines: {node: '>=12'} + deprecated: Glob versions prior to v9 are no longer supported + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 5.1.6 + once: 1.4.0 + dev: true + + /global@4.4.0: + resolution: {integrity: sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==} + dependencies: + min-document: 2.19.0 + process: 0.11.10 + dev: true + + /globals@13.24.0: + resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} + engines: {node: '>=8'} + dependencies: + type-fest: 0.20.2 + dev: true + + /globalthis@1.0.4: + resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} + engines: {node: '>= 0.4'} + dependencies: + define-properties: 1.2.1 + gopd: 1.2.0 + dev: true + + /globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.3.3 + ignore: 5.3.2 + merge2: 1.4.1 + slash: 3.0.0 + dev: true + + /gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + dev: true + + /got@11.8.6: + resolution: {integrity: sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==} + engines: {node: '>=10.19.0'} + dependencies: + '@sindresorhus/is': 4.6.0 + '@szmarczak/http-timer': 4.0.6 + '@types/cacheable-request': 6.0.3 + '@types/responselike': 1.0.3 + cacheable-lookup: 5.0.4 + cacheable-request: 7.0.4 + decompress-response: 6.0.0 + http2-wrapper: 1.0.3 + lowercase-keys: 2.0.0 + p-cancelable: 2.1.1 + responselike: 2.0.1 + dev: true + + /got@12.1.0: + resolution: {integrity: sha512-hBv2ty9QN2RdbJJMK3hesmSkFTjVIHyIDDbssCKnSmq62edGgImJWD10Eb1k77TiV1bxloxqcFAVK8+9pkhOig==} + engines: {node: '>=14.16'} + dependencies: + '@sindresorhus/is': 4.6.0 + '@szmarczak/http-timer': 5.0.1 + '@types/cacheable-request': 6.0.3 + '@types/responselike': 1.0.3 + cacheable-lookup: 6.1.0 + cacheable-request: 7.0.4 + decompress-response: 6.0.0 + form-data-encoder: 1.7.1 + get-stream: 6.0.1 + http2-wrapper: 2.2.1 + lowercase-keys: 3.0.0 + p-cancelable: 3.0.0 + responselike: 2.0.1 + dev: true + + /got@12.6.1: + resolution: {integrity: sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ==} + engines: {node: '>=14.16'} + dependencies: + '@sindresorhus/is': 5.6.0 + '@szmarczak/http-timer': 5.0.1 + cacheable-lookup: 7.0.0 + cacheable-request: 10.2.14 + decompress-response: 6.0.0 + form-data-encoder: 2.1.4 + get-stream: 6.0.1 + http2-wrapper: 2.2.1 + lowercase-keys: 3.0.0 + p-cancelable: 3.0.0 + responselike: 3.0.0 + dev: true + + /graceful-fs@4.2.10: + resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==} + dev: true + + /graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + dev: true + + /gradient-string@1.2.0: + resolution: {integrity: sha512-Lxog7IDMMWNjwo4O0KbdBvSewk4vW6kQe5XaLuuPCyCE65AGQ1P8YqKJa5dq8TYf/Ge31F+KjWzPR5mAJvjlAg==} + engines: {node: '>=4'} + dependencies: + chalk: 2.4.2 + tinygradient: 0.4.3 + dev: true + + /graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + dev: true + + /har-schema@2.0.0: + resolution: {integrity: sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==} + engines: {node: '>=4'} + dev: true + + /har-validator@5.1.5: + resolution: {integrity: sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==} + engines: {node: '>=6'} + deprecated: this library is no longer supported + dependencies: + ajv: 6.12.6 + har-schema: 2.0.0 + dev: true + + /hardhat-contract-sizer@2.10.0(hardhat@2.26.0): + resolution: {integrity: sha512-QiinUgBD5MqJZJh1hl1jc9dNnpJg7eE/w4/4GEnrcmZJJTDbVFNe3+/3Ep24XqISSkYxRz36czcPHKHd/a0dwA==} + peerDependencies: + hardhat: ^2.0.0 + dependencies: + chalk: 4.1.2 + cli-table3: 0.6.5 + hardhat: 2.26.0(ts-node@10.9.2)(typescript@5.8.3) + strip-ansi: 6.0.1 + dev: true + + /hardhat-deploy-ethers@0.3.0-beta.13(ethers@5.8.0)(hardhat@2.26.0): + resolution: {integrity: sha512-PdWVcKB9coqWV1L7JTpfXRCI91Cgwsm7KLmBcwZ8f0COSm1xtABHZTyz3fvF6p42cTnz1VM0QnfDvMFlIRkSNw==} + peerDependencies: + ethers: ^5.7.2 + hardhat: ^2.0.0 + dependencies: + ethers: 5.8.0 + hardhat: 2.26.0(ts-node@10.9.2)(typescript@5.8.3) + dev: true + + /hardhat-deploy@0.12.4: + resolution: {integrity: sha512-bYO8DIyeGxZWlhnMoCBon9HNZb6ji0jQn7ngP1t5UmGhC8rQYhji7B73qETMOFhzt5ECZPr+U52duj3nubsqdQ==} + dependencies: + '@ethersproject/abi': 5.8.0 + '@ethersproject/abstract-signer': 5.8.0 + '@ethersproject/address': 5.8.0 + '@ethersproject/bignumber': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/constants': 5.8.0 + '@ethersproject/contracts': 5.8.0 + '@ethersproject/providers': 5.8.0 + '@ethersproject/solidity': 5.8.0 + '@ethersproject/transactions': 5.8.0 + '@ethersproject/wallet': 5.8.0 + '@types/qs': 6.14.0 + axios: 0.21.4(debug@4.4.1) + chalk: 4.1.2 + chokidar: 3.6.0 + debug: 4.4.1(supports-color@8.1.1) + enquirer: 2.4.1 + ethers: 5.8.0 + form-data: 4.0.4 + fs-extra: 10.1.0 + match-all: 1.2.7 + murmur-128: 0.2.1 + qs: 6.14.0 + zksync-ethers: 5.10.0(ethers@5.8.0) + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: true + + /hardhat@2.26.0(ts-node@10.9.2)(typescript@5.8.3): + resolution: {integrity: sha512-hwEUBvMJzl3Iuru5bfMOEDeF2d7cbMNNF46rkwdo8AeW2GDT4VxFLyYWTi6PTLrZiftHPDiKDlAdAiGvsR9FYA==} + hasBin: true + peerDependencies: + ts-node: '*' + typescript: '*' + peerDependenciesMeta: + ts-node: + optional: true + typescript: + optional: true + dependencies: + '@ethereumjs/util': 9.1.0 + '@ethersproject/abi': 5.8.0 + '@nomicfoundation/edr': 0.11.3 + '@nomicfoundation/solidity-analyzer': 0.1.2 + '@sentry/node': 5.30.0 + adm-zip: 0.4.16 + aggregate-error: 3.1.0 + ansi-escapes: 4.3.2 + boxen: 5.1.2 + chokidar: 4.0.3 + ci-info: 2.0.0 + debug: 4.4.1(supports-color@8.1.1) + enquirer: 2.4.1 + env-paths: 2.2.1 + ethereum-cryptography: 1.2.0 + find-up: 5.0.0 + fp-ts: 1.19.3 + fs-extra: 7.0.1 + immutable: 4.3.7 + io-ts: 1.10.4 + json-stream-stringify: 3.1.6 + keccak: 3.0.4 + lodash: 4.17.21 + micro-eth-signer: 0.16.0 + mnemonist: 0.38.5 + mocha: 10.8.2 + p-map: 4.0.0 + picocolors: 1.1.1 + raw-body: 2.5.2 + resolve: 1.17.0 + semver: 6.3.1 + solc: 0.8.26(debug@4.4.1) + source-map-support: 0.5.21 + stacktrace-parser: 0.1.11 + tinyglobby: 0.2.14 + ts-node: 10.9.2(@types/node@18.18.14)(typescript@5.8.3) + tsort: 0.0.1 + typescript: 5.8.3 + undici: 5.29.0 + uuid: 8.3.2 + ws: 7.5.10 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: true + + /has-bigints@1.1.0: + resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} + engines: {node: '>= 0.4'} + dev: true + + /has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + dev: true + + /has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + dev: true + + /has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + dependencies: + es-define-property: 1.0.1 + dev: true + + /has-proto@1.2.0: + resolution: {integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==} + engines: {node: '>= 0.4'} + dependencies: + dunder-proto: 1.0.1 + dev: true + + /has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + dev: true + + /has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + dependencies: + has-symbols: 1.1.0 + dev: true + + /hash-base@2.0.2: + resolution: {integrity: sha512-0TROgQ1/SxE6KmxWSvXHvRj90/Xo1JvZShofnYF+f6ZsGtR4eES7WfrQzPalmyagfKZCXpVnitiRebZulWsbiw==} + dependencies: + inherits: 2.0.4 + dev: true + + /hash-base@3.1.0: + resolution: {integrity: sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==} + engines: {node: '>=4'} + dependencies: + inherits: 2.0.4 + readable-stream: 3.6.2 + safe-buffer: 5.2.1 + dev: true + + /hash.js@1.1.7: + resolution: {integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==} + dependencies: + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + dev: true + + /hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + dependencies: + function-bind: 1.1.2 + dev: true + + /he@1.2.0: + resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} + hasBin: true + dev: true + + /hmac-drbg@1.0.1: + resolution: {integrity: sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==} + dependencies: + hash.js: 1.1.7 + minimalistic-assert: 1.0.1 + minimalistic-crypto-utils: 1.0.1 + dev: true + + /hosted-git-info@2.8.9: + resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} + dev: true + + /http-cache-semantics@4.2.0: + resolution: {integrity: sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==} + dev: true + + /http-errors@2.0.0: + resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} + engines: {node: '>= 0.8'} + dependencies: + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.1 + toidentifier: 1.0.1 + dev: true + + /http-https@1.0.0: + resolution: {integrity: sha512-o0PWwVCSp3O0wS6FvNr6xfBCHgt0m1tvPLFOCc2iFDKTRAXhB7m8klDf7ErowFH8POa6dVdGatKU5I1YYwzUyg==} + dev: true + + /http-signature@1.2.0: + resolution: {integrity: sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==} + engines: {node: '>=0.8', npm: '>=1.3.7'} + dependencies: + assert-plus: 1.0.0 + jsprim: 1.4.2 + sshpk: 1.18.0 + dev: true + + /http2-wrapper@1.0.3: + resolution: {integrity: sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==} + engines: {node: '>=10.19.0'} + dependencies: + quick-lru: 5.1.1 + resolve-alpn: 1.2.1 + dev: true + + /http2-wrapper@2.2.1: + resolution: {integrity: sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==} + engines: {node: '>=10.19.0'} + dependencies: + quick-lru: 5.1.1 + resolve-alpn: 1.2.1 + dev: true + + /https-proxy-agent@5.0.1: + resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} + engines: {node: '>= 6'} + dependencies: + agent-base: 6.0.2 + debug: 4.4.1(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + dev: true + + /iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} + dependencies: + safer-buffer: 2.1.2 + dev: true + + /idna-uts46-hx@2.3.1: + resolution: {integrity: sha512-PWoF9Keq6laYdIRwwCdhTPl60xRqAloYNMQLiyUnG42VjT53oW07BXIRM+NK7eQjzXjAk2gUvX9caRxlnF9TAA==} + engines: {node: '>=4.0.0'} + dependencies: + punycode: 2.1.0 + dev: true + + /ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + dev: true + + /ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} + dev: true + + /immediate@3.2.3: + resolution: {integrity: sha512-RrGCXRm/fRVqMIhqXrGEX9rRADavPiDFSoMb/k64i9XMk8uH4r/Omi5Ctierj6XzNecwDbO4WuFbDD1zmpl3Tg==} + dev: true + + /immediate@3.3.0: + resolution: {integrity: sha512-HR7EVodfFUdQCTIeySw+WDRFJlPcLOJbXfwwZ7Oom6tjsvZ3bOkCDJHehQC3nxJrv7+f9XecwazynjU8e4Vw3Q==} + dev: true + + /immutable@4.3.7: + resolution: {integrity: sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw==} + dev: true + + /import-fresh@3.3.1: + resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} + engines: {node: '>=6'} + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + dev: true + + /imul@1.0.1: + resolution: {integrity: sha512-WFAgfwPLAjU66EKt6vRdTlKj4nAgIDQzh29JonLa4Bqtl6D8JrIMvWjCnx7xEjVNmP3U0fM5o8ZObk7d0f62bA==} + engines: {node: '>=0.10.0'} + dev: true + + /imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + dev: true + + /indent-string@4.0.0: + resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} + engines: {node: '>=8'} + dev: true + + /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. + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + dev: true + + /inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + dev: true + + /ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + dev: true + + /ink-gradient@2.0.0(ink@3.2.0)(react@17.0.2): + resolution: {integrity: sha512-d2BK/EzzBRoDL54NWkS3JGE4J8xtzwRVWxDAIkQ/eQ60XIzrFMtT5JlUqgV05Qlt32Jvk50qW51YqxGJggTuqA==} + engines: {node: '>=10'} + peerDependencies: + ink: '>=3.0.0' + react: '>=16.8.0' + dependencies: + gradient-string: 1.2.0 + ink: 3.2.0(react@17.0.2) + prop-types: 15.8.1 + react: 17.0.2 + strip-ansi: 6.0.1 + dev: true + + /ink-table@3.1.0(ink@3.2.0)(react@17.0.2): + resolution: {integrity: sha512-qxVb4DIaEaJryvF9uZGydnmP9Hkmas3DCKVpEcBYC0E4eJd3qNgNe+PZKuzgCERFe9LfAS1TNWxCr9+AU4v3YA==} + peerDependencies: + ink: '>=3.0.0' + react: '>=16.8.0' + dependencies: + ink: 3.2.0(react@17.0.2) + object-hash: 2.2.0 + react: 17.0.2 + dev: true + + /ink@3.2.0(react@17.0.2): + resolution: {integrity: sha512-firNp1q3xxTzoItj/eOOSZQnYSlyrWks5llCTVX37nJ59K3eXbQ8PtzCguqo8YI19EELo5QxaKnJd4VxzhU8tg==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '>=16.8.0' + react: '>=16.8.0' + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + ansi-escapes: 4.3.2 + auto-bind: 4.0.0 + chalk: 4.1.2 + cli-boxes: 2.2.1 + cli-cursor: 3.1.0 + cli-truncate: 2.1.0 + code-excerpt: 3.0.0 + indent-string: 4.0.0 + is-ci: 2.0.0 + lodash: 4.17.21 + patch-console: 1.0.0 + react: 17.0.2 + react-devtools-core: 4.28.5 + react-reconciler: 0.26.2(react@17.0.2) + scheduler: 0.20.2 + signal-exit: 3.0.7 + slice-ansi: 3.0.0 + stack-utils: 2.0.6 + string-width: 4.2.3 + type-fest: 0.12.0 + widest-line: 3.1.0 + wrap-ansi: 6.2.0 + ws: 7.5.10 + yoga-layout-prebuilt: 1.10.0 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + dev: true + + /internal-slot@1.1.0: + resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} + engines: {node: '>= 0.4'} + dependencies: + es-errors: 1.3.0 + hasown: 2.0.2 + side-channel: 1.1.0 + dev: true + + /invert-kv@1.0.0: + resolution: {integrity: sha512-xgs2NH9AE66ucSq4cNG1nhSFghr5l6tdL15Pk+jl46bmmBapgoaY/AacXyaDznAqmGL99TiLSQgO/XazFSKYeQ==} + engines: {node: '>=0.10.0'} + dev: true + + /io-ts@1.10.4: + resolution: {integrity: sha512-b23PteSnYXSONJ6JQXRAlvJhuw8KOtkqa87W4wDtvMrud/DTJd5X+NpOOI+O/zZwVq6v0VLAaJ+1EDViKEuN9g==} + dependencies: + fp-ts: 1.19.3 + dev: true + + /ipaddr.js@1.9.1: + resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} + engines: {node: '>= 0.10'} + dev: true + + /is-arguments@1.2.0: + resolution: {integrity: sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + dev: true + + /is-array-buffer@3.0.5: + resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + dev: true + + /is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + dev: true + + /is-arrayish@0.3.2: + resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} + dev: true + + /is-async-function@2.1.1: + resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==} + engines: {node: '>= 0.4'} + dependencies: + async-function: 1.0.0 + call-bound: 1.0.4 + get-proto: 1.0.1 + has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 + dev: true + + /is-bigint@1.1.0: + resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==} + engines: {node: '>= 0.4'} + dependencies: + has-bigints: 1.1.0 + dev: true + + /is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + dependencies: + binary-extensions: 2.3.0 + dev: true + + /is-boolean-object@1.2.2: + resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + dev: true + + /is-bun-module@2.0.0: + resolution: {integrity: sha512-gNCGbnnnnFAUGKeZ9PdbyeGYJqewpmc2aKHUEMO5nQPWU9lOmv7jcmQIv+qHD8fXW6W7qfuCwX4rY9LNRjXrkQ==} + dependencies: + semver: 7.7.2 + dev: true + + /is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + dev: true + + /is-ci@2.0.0: + resolution: {integrity: sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==} + hasBin: true + dependencies: + ci-info: 2.0.0 + dev: true + + /is-core-module@2.16.1: + resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} + engines: {node: '>= 0.4'} + dependencies: + hasown: 2.0.2 + dev: true + + /is-data-view@1.0.2: + resolution: {integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + is-typed-array: 1.1.15 + dev: true + + /is-date-object@1.1.0: + resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + dev: true + + /is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + dev: true + + /is-finalizationregistry@1.1.1: + resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.4 + dev: true + + /is-fullwidth-code-point@1.0.0: + resolution: {integrity: sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==} + engines: {node: '>=0.10.0'} + dependencies: + number-is-nan: 1.0.1 + dev: true + + /is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + dev: true + + /is-function@1.0.2: + resolution: {integrity: sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==} + dev: true + + /is-generator-function@1.1.0: + resolution: {integrity: sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.4 + get-proto: 1.0.1 + has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 + dev: true + + /is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + dependencies: + is-extglob: 2.1.1 + dev: true + + /is-hex-prefixed@1.0.0: + resolution: {integrity: sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA==} + engines: {node: '>=6.5.0', npm: '>=3'} + dev: true + + /is-map@2.0.3: + resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} + engines: {node: '>= 0.4'} + dev: true + + /is-negative-zero@2.0.3: + resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} + engines: {node: '>= 0.4'} + dev: true + + /is-number-object@1.1.1: + resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + dev: true + + /is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + dev: true + + /is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + dev: true + + /is-plain-obj@2.1.0: + resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} + engines: {node: '>=8'} + dev: true + + /is-plain-obj@4.1.0: + resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} + engines: {node: '>=12'} + dev: true + + /is-regex@1.2.1: + resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.4 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + dev: true + + /is-set@2.0.3: + resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} + engines: {node: '>= 0.4'} + dev: true + + /is-shared-array-buffer@1.0.4: + resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.4 + dev: true + + /is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + dev: true + + /is-string@1.1.1: + resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + dev: true + + /is-symbol@1.1.1: + resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.4 + has-symbols: 1.1.0 + safe-regex-test: 1.1.0 + dev: true + + /is-typed-array@1.1.15: + resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} + engines: {node: '>= 0.4'} + dependencies: + which-typed-array: 1.1.19 + dev: true + + /is-typedarray@1.0.0: + resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} + dev: true + + /is-unicode-supported@0.1.0: + resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} + engines: {node: '>=10'} + dev: true + + /is-url@1.2.4: + resolution: {integrity: sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==} + dev: true + + /is-utf8@0.2.1: + resolution: {integrity: sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==} + dev: true + + /is-weakmap@2.0.2: + resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} + engines: {node: '>= 0.4'} + dev: true + + /is-weakref@1.1.1: + resolution: {integrity: sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.4 + dev: true + + /is-weakset@2.0.4: + resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + dev: true + + /isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + dev: true + + /isarray@2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + dev: true + + /isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + dev: true + + /isomorphic-unfetch@3.1.0: + resolution: {integrity: sha512-geDJjpoZ8N0kWexiwkX8F9NkTsXhetLPVbZFQ+JTW239QNOwvB0gniuR1Wc6f0AMTn7/mFGyXvHTifrCp/GH8Q==} + dependencies: + node-fetch: 2.7.0 + unfetch: 4.2.0 + transitivePeerDependencies: + - encoding + dev: true + + /isstream@0.1.2: + resolution: {integrity: sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==} + dev: true + + /js-cookie@2.2.1: + resolution: {integrity: sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ==} + dev: true + + /js-sha3@0.5.7: + resolution: {integrity: sha512-GII20kjaPX0zJ8wzkTbNDYMY7msuZcTWk8S5UOh6806Jq/wz1J8/bnr8uGU0DAUmYDjj2Mr4X1cW8v/GLYnR+g==} + dev: true + + /js-sha3@0.8.0: + resolution: {integrity: sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==} + dev: true + + /js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + dev: true + + /js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + dependencies: + argparse: 2.0.1 + dev: true + + /jsbn@0.1.1: + resolution: {integrity: sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==} + dev: true + + /jsesc@3.1.0: + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} + engines: {node: '>=6'} + hasBin: true + dev: true + + /json-bigint@1.0.0: + resolution: {integrity: sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==} + dependencies: + bignumber.js: 9.3.1 + dev: true + + /json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + dev: true + + /json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + dev: true + + /json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + dev: true + + /json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + dev: true + + /json-schema@0.4.0: + resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==} + dev: true + + /json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + dev: true + + /json-stream-stringify@3.1.6: + resolution: {integrity: sha512-x7fpwxOkbhFCaJDJ8vb1fBY3DdSa4AlITaz+HHILQJzdPMnHEFjxPwVUi1ALIbcIxDE0PNe/0i7frnY8QnBQog==} + engines: {node: '>=7.10.1'} + dev: true + + /json-stringify-safe@5.0.1: + resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} + dev: true + + /json5@1.0.2: + resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} + hasBin: true + dependencies: + minimist: 1.2.8 + dev: true + + /json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + dev: true + + /jsonfile@2.4.0: + resolution: {integrity: sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw==} + optionalDependencies: + graceful-fs: 4.2.11 + dev: true + + /jsonfile@4.0.0: + resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + optionalDependencies: + graceful-fs: 4.2.11 + dev: true + + /jsonfile@6.1.0: + resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + dependencies: + universalify: 2.0.1 + optionalDependencies: + graceful-fs: 4.2.11 + dev: true + + /jsprim@1.4.2: + resolution: {integrity: sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==} + engines: {node: '>=0.6.0'} + dependencies: + assert-plus: 1.0.0 + extsprintf: 1.3.0 + json-schema: 0.4.0 + verror: 1.10.0 + dev: true + + /keccak@3.0.1: + resolution: {integrity: sha512-epq90L9jlFWCW7+pQa6JOnKn2Xgl2mtI664seYR6MHskvI9agt7AnDqmAlp9TqU4/caMYbA08Hi5DMZAl5zdkA==} + engines: {node: '>=10.0.0'} + requiresBuild: true + dependencies: + node-addon-api: 2.0.2 + node-gyp-build: 4.8.4 + dev: true + + /keccak@3.0.4: + resolution: {integrity: sha512-3vKuW0jV8J3XNTzvfyicFR5qvxrSAGl7KIhvgOu5cmWwM7tZRj3fMbj/pfIf4be7aznbc+prBWGjywox/g2Y6Q==} + engines: {node: '>=10.0.0'} + requiresBuild: true + dependencies: + node-addon-api: 2.0.2 + node-gyp-build: 4.8.4 + readable-stream: 3.6.2 + dev: true + + /keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + dependencies: + json-buffer: 3.0.1 + dev: true + + /klaw@1.3.1: + resolution: {integrity: sha512-TED5xi9gGQjGpNnvRWknrwAB1eL5GciPfVFOt3Vk1OJCVDQbzuSfrF3hkUQKlsgKrG1F+0t5W0m+Fje1jIt8rw==} + optionalDependencies: + graceful-fs: 4.2.11 + dev: true + + /kleur@3.0.3: + resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} + engines: {node: '>=6'} + dev: true + + /kuler@2.0.0: + resolution: {integrity: sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==} + dev: true + + /latest-version@7.0.0: + resolution: {integrity: sha512-KvNT4XqAMzdcL6ka6Tl3i2lYeFDgXNCuIX+xNx6ZMVR1dFq+idXd9FLKNMOIx0t9mJ9/HudyX4oZWXZQ0UJHeg==} + engines: {node: '>=14.16'} + dependencies: + package-json: 8.1.1 + dev: true + + /lcid@1.0.0: + resolution: {integrity: sha512-YiGkH6EnGrDGqLMITnGjXtGmNtjoXw9SVUzcaos8RBi7Ps0VBylkq+vOcY9QE5poLasPCR849ucFUkl0UzUyOw==} + engines: {node: '>=0.10.0'} + dependencies: + invert-kv: 1.0.0 + dev: true + + /level-codec@9.0.2: + resolution: {integrity: sha512-UyIwNb1lJBChJnGfjmO0OR+ezh2iVu1Kas3nvBS/BzGnx79dv6g7unpKIDNPMhfdTEGoc7mC8uAu51XEtX+FHQ==} + engines: {node: '>=6'} + deprecated: Superseded by level-transcoder (https://github.com/Level/community#faq) + dependencies: + buffer: 5.7.1 + dev: true + + /level-concat-iterator@2.0.1: + resolution: {integrity: sha512-OTKKOqeav2QWcERMJR7IS9CUo1sHnke2C0gkSmcR7QuEtFNLLzHQAvnMw8ykvEcv0Qtkg0p7FOwP1v9e5Smdcw==} + engines: {node: '>=6'} + deprecated: Superseded by abstract-level (https://github.com/Level/community#faq) + dev: true + + /level-errors@2.0.1: + resolution: {integrity: sha512-UVprBJXite4gPS+3VznfgDSU8PTRuVX0NXwoWW50KLxd2yw4Y1t2JUR5In1itQnudZqRMT9DlAM3Q//9NCjCFw==} + engines: {node: '>=6'} + deprecated: Superseded by abstract-level (https://github.com/Level/community#faq) + dependencies: + errno: 0.1.8 + dev: true + + /level-iterator-stream@4.0.2: + resolution: {integrity: sha512-ZSthfEqzGSOMWoUGhTXdX9jv26d32XJuHz/5YnuHZzH6wldfWMOVwI9TBtKcya4BKTyTt3XVA0A3cF3q5CY30Q==} + engines: {node: '>=6'} + dependencies: + inherits: 2.0.4 + readable-stream: 3.6.2 + xtend: 4.0.2 + dev: true + + /level-mem@5.0.1: + resolution: {integrity: sha512-qd+qUJHXsGSFoHTziptAKXoLX87QjR7v2KMbqncDXPxQuCdsQlzmyX+gwrEHhlzn08vkf8TyipYyMmiC6Gobzg==} + engines: {node: '>=6'} + deprecated: Superseded by memory-level (https://github.com/Level/community#faq) + dependencies: + level-packager: 5.1.1 + memdown: 5.1.0 + dev: true + + /level-packager@5.1.1: + resolution: {integrity: sha512-HMwMaQPlTC1IlcwT3+swhqf/NUO+ZhXVz6TY1zZIIZlIR0YSn8GtAAWmIvKjNY16ZkEg/JcpAuQskxsXqC0yOQ==} + engines: {node: '>=6'} + deprecated: Superseded by abstract-level (https://github.com/Level/community#faq) + dependencies: + encoding-down: 6.3.0 + levelup: 4.4.0 + dev: true + + /level-supports@1.0.1: + resolution: {integrity: sha512-rXM7GYnW8gsl1vedTJIbzOrRv85c/2uCMpiiCzO2fndd06U/kUXEEU9evYn4zFggBOg36IsBW8LzqIpETwwQzg==} + engines: {node: '>=6'} + dependencies: + xtend: 4.0.2 + dev: true + + /level-ws@2.0.0: + resolution: {integrity: sha512-1iv7VXx0G9ec1isqQZ7y5LmoZo/ewAsyDHNA8EFDW5hqH2Kqovm33nSFkSdnLLAK+I5FlT+lo5Cw9itGe+CpQA==} + engines: {node: '>=6'} + dependencies: + inherits: 2.0.4 + readable-stream: 3.6.2 + xtend: 4.0.2 + dev: true + + /levelup@4.4.0: + resolution: {integrity: sha512-94++VFO3qN95cM/d6eBXvd894oJE0w3cInq9USsyQzzoJxmiYzPAocNcuGCPGGjoXqDVJcr3C1jzt1TSjyaiLQ==} + engines: {node: '>=6'} + deprecated: Superseded by abstract-level (https://github.com/Level/community#faq) + dependencies: + deferred-leveldown: 5.3.0 + level-errors: 2.0.1 + level-iterator-stream: 4.0.2 + level-supports: 1.0.1 + xtend: 4.0.2 + dev: true + + /levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + dev: true + + /lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + dev: true + + /load-json-file@1.1.0: + resolution: {integrity: sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A==} + engines: {node: '>=0.10.0'} + dependencies: + graceful-fs: 4.2.11 + parse-json: 2.2.0 + pify: 2.3.0 + pinkie-promise: 2.0.1 + strip-bom: 2.0.0 + dev: true + + /locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + dependencies: + p-locate: 5.0.0 + dev: true + + /lodash.assign@4.2.0: + resolution: {integrity: sha512-hFuH8TY+Yji7Eja3mGiuAxBqLagejScbG8GbG0j6o9vzn0YL14My+ktnqtZgFTosKymC9/44wP6s7xyuLfnClw==} + dev: true + + /lodash.camelcase@4.3.0: + resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} + dev: true + + /lodash.isequal@4.5.0: + resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==} + deprecated: This package is deprecated. Use require('node:util').isDeepStrictEqual instead. + dev: true + + /lodash.memoize@4.1.2: + resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} + dev: true + + /lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + dev: true + + /lodash.truncate@4.4.2: + resolution: {integrity: sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==} + dev: true + + /lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + dev: true + + /log-symbols@4.1.0: + resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} + engines: {node: '>=10'} + dependencies: + chalk: 4.1.2 + is-unicode-supported: 0.1.0 + dev: true + + /logform@2.7.0: + resolution: {integrity: sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ==} + engines: {node: '>= 12.0.0'} + dependencies: + '@colors/colors': 1.6.0 + '@types/triple-beam': 1.3.5 + fecha: 4.2.3 + ms: 2.1.3 + safe-stable-stringify: 2.5.0 + triple-beam: 1.4.1 + dev: true + + /loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + dependencies: + js-tokens: 4.0.0 + dev: true + + /loupe@2.3.7: + resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} + dependencies: + get-func-name: 2.0.2 + dev: true + + /lowercase-keys@2.0.0: + resolution: {integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==} + engines: {node: '>=8'} + dev: true + + /lowercase-keys@3.0.0: + resolution: {integrity: sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: true + + /lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + dependencies: + yallist: 3.1.1 + dev: true + + /lru_map@0.3.3: + resolution: {integrity: sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ==} + dev: true + + /ltgt@2.2.1: + resolution: {integrity: sha512-AI2r85+4MquTw9ZYqabu4nMwy9Oftlfa/e/52t9IjtfG+mGBbTNdAoZ3RQKLHR6r0wQnwZnPIEh/Ya6XTWAKNA==} + dev: true + + /make-error@1.3.6: + resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + dev: true + + /map-age-cleaner@0.1.3: + resolution: {integrity: sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==} + engines: {node: '>=6'} + dependencies: + p-defer: 1.0.0 + dev: true + + /match-all@1.2.7: + resolution: {integrity: sha512-qSpsBKarh55r9KyXzFC3xBLRf2GlGasba2em9kbpRsSlGvdTAqjx3QD0r3FKSARiW+OE4iMHYsolM3aX9n5djw==} + dev: true + + /math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + dev: true + + /mcl-wasm@0.7.9: + resolution: {integrity: sha512-iJIUcQWA88IJB/5L15GnJVnSQJmf/YaxxV6zRavv83HILHaJQb6y0iFyDMdDO0gN8X37tdxmAOrH/P8B6RB8sQ==} + engines: {node: '>=8.9.0'} + dev: true + + /md5.js@1.3.5: + resolution: {integrity: sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==} + dependencies: + hash-base: 3.1.0 + inherits: 2.0.4 + safe-buffer: 5.2.1 + dev: true + + /media-typer@0.3.0: + resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} + engines: {node: '>= 0.6'} + dev: true + + /memdown@5.1.0: + resolution: {integrity: sha512-B3J+UizMRAlEArDjWHTMmadet+UKwHd3UjMgGBkZcKAxAYVPS9o0Yeiha4qvz7iGiL2Sb3igUft6p7nbFWctpw==} + engines: {node: '>=6'} + deprecated: Superseded by memory-level (https://github.com/Level/community#faq) + dependencies: + abstract-leveldown: 6.2.3 + functional-red-black-tree: 1.0.1 + immediate: 3.2.3 + inherits: 2.0.4 + ltgt: 2.2.1 + safe-buffer: 5.2.1 + dev: true + + /memorystream@0.3.1: + resolution: {integrity: sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==} + engines: {node: '>= 0.10.0'} + dev: true + + /merge-descriptors@1.0.3: + resolution: {integrity: sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==} + dev: true + + /merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + dev: true + + /merkle-patricia-tree@4.2.4: + resolution: {integrity: sha512-eHbf/BG6eGNsqqfbLED9rIqbsF4+sykEaBn6OLNs71tjclbMcMOk1tEPmJKcNcNCLkvbpY/lwyOlizWsqPNo8w==} + dependencies: + '@types/levelup': 4.3.3 + ethereumjs-util: 7.1.5 + level-mem: 5.0.1 + level-ws: 2.0.0 + readable-stream: 3.6.2 + semaphore-async-await: 1.5.1 + dev: true + + /methods@1.1.2: + resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} + engines: {node: '>= 0.6'} + dev: true + + /micro-eth-signer@0.16.0: + resolution: {integrity: sha512-rsSJcMGfY+kt3ROlL3U6y5BcjkK2H0zDKUQV6soo1JvjrctKKe+X7rKB0YIuwhWjlhJIoVHLuRYF+GXyyuVXxQ==} + engines: {node: '>= 20.19.0'} + dependencies: + '@noble/curves': 1.9.4 + '@noble/hashes': 2.0.0-beta.1 + micro-packed: 0.7.3 + dev: true + + /micro-ftch@0.3.1: + resolution: {integrity: sha512-/0LLxhzP0tfiR5hcQebtudP56gUurs2CLkGarnCiB/OqEyUFQ6U3paQi/tgLv0hBJYt2rnr9MNpxz4fiiugstg==} + dev: true + + /micro-memoize@4.1.3: + resolution: {integrity: sha512-DzRMi8smUZXT7rCGikRwldEh6eO6qzKiPPopcr1+2EY3AYKpy5fu159PKWwIS9A6IWnrvPKDMcuFtyrroZa8Bw==} + dev: true + + /micro-packed@0.7.3: + resolution: {integrity: sha512-2Milxs+WNC00TRlem41oRswvw31146GiSaoCT7s3Xi2gMUglW5QBeqlQaZeHr5tJx9nm3i57LNXPqxOOaWtTYg==} + dependencies: + '@scure/base': 1.2.6 + dev: true + + /micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + dev: true + + /miller-rabin@4.0.1: + resolution: {integrity: sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==} + hasBin: true + dependencies: + bn.js: 4.12.2 + brorand: 1.1.0 + dev: true + + /mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + dev: true + + /mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + dependencies: + mime-db: 1.52.0 + dev: true + + /mime@1.6.0: + resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} + engines: {node: '>=4'} + hasBin: true + dev: true + + /mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + dev: true + + /mimic-fn@3.1.0: + resolution: {integrity: sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ==} + engines: {node: '>=8'} + dev: true + + /mimic-response@1.0.1: + resolution: {integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==} + engines: {node: '>=4'} + dev: true + + /mimic-response@3.1.0: + resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} + engines: {node: '>=10'} + dev: true + + /mimic-response@4.0.0: + resolution: {integrity: sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: true + + /min-document@2.19.0: + resolution: {integrity: sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ==} + dependencies: + dom-walk: 0.1.2 + dev: true + + /minimalistic-assert@1.0.1: + resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} + dev: true + + /minimalistic-crypto-utils@1.0.1: + resolution: {integrity: sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==} + dev: true + + /minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + dependencies: + brace-expansion: 1.1.12 + dev: true + + /minimatch@5.1.6: + resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} + engines: {node: '>=10'} + dependencies: + brace-expansion: 2.0.2 + dev: true + + /minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} + dependencies: + brace-expansion: 2.0.2 + dev: true + + /minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + dev: true + + /minipass@2.9.0: + resolution: {integrity: sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==} + dependencies: + safe-buffer: 5.2.1 + yallist: 3.1.1 + dev: true + + /minizlib@1.3.3: + resolution: {integrity: sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==} + dependencies: + minipass: 2.9.0 + dev: true + + /mkdirp-promise@5.0.1: + resolution: {integrity: sha512-Hepn5kb1lJPtVW84RFT40YG1OddBNTOVUZR2bzQUHc+Z03en8/3uX0+060JDhcEzyO08HmipsN9DcnFMxhIL9w==} + engines: {node: '>=4'} + deprecated: This package is broken and no longer maintained. 'mkdirp' itself supports promises now, please switch to that. + dependencies: + mkdirp: 3.0.1 + dev: true + + /mkdirp@0.5.6: + resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} + hasBin: true + dependencies: + minimist: 1.2.8 + dev: true + + /mkdirp@1.0.4: + resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} + engines: {node: '>=10'} + hasBin: true + dev: true + + /mkdirp@3.0.1: + resolution: {integrity: sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==} + engines: {node: '>=10'} + hasBin: true + dev: true + + /mnemonist@0.38.5: + resolution: {integrity: sha512-bZTFT5rrPKtPJxj8KSV0WkPyNxl72vQepqqVUAW2ARUpUSF2qXMB6jZj7hW5/k7C1rtpzqbD/IIbJwLXUjCHeg==} + dependencies: + obliterator: 2.0.5 + dev: true + + /mocha@10.8.2: + resolution: {integrity: sha512-VZlYo/WE8t1tstuRmqgeyBgCbJc/lEdopaa+axcKzTBJ+UIdlAB9XnmvTCAH4pwR4ElNInaedhEBmZD8iCSVEg==} + engines: {node: '>= 14.0.0'} + hasBin: true + dependencies: + ansi-colors: 4.1.3 + browser-stdout: 1.3.1 + chokidar: 3.6.0 + debug: 4.4.1(supports-color@8.1.1) + diff: 5.2.0 + escape-string-regexp: 4.0.0 + find-up: 5.0.0 + glob: 8.1.0 + he: 1.2.0 + js-yaml: 4.1.0 + log-symbols: 4.1.0 + minimatch: 5.1.6 + ms: 2.1.3 + serialize-javascript: 6.0.2 + strip-json-comments: 3.1.1 + supports-color: 8.1.1 + workerpool: 6.5.1 + yargs: 16.2.0 + yargs-parser: 20.2.9 + yargs-unparser: 2.0.0 + dev: true + + /mock-fs@4.14.0: + resolution: {integrity: sha512-qYvlv/exQ4+svI3UOvPUpLDF0OMX5euvUH0Ny4N5QyRyhNdgAgUrVH3iUINSzEPLvx0kbo/Bp28GJKIqvE7URw==} + dev: true + + /ms@2.0.0: + resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + dev: true + + /ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + dev: true + + /multibase@0.6.1: + resolution: {integrity: sha512-pFfAwyTjbbQgNc3G7D48JkJxWtoJoBMaR4xQUOuB8RnCgRqaYmWNFeJTTvrJ2w51bjLq2zTby6Rqj9TQ9elSUw==} + deprecated: This module has been superseded by the multiformats module + dependencies: + base-x: 3.0.11 + buffer: 5.7.1 + dev: true + + /multibase@0.7.0: + resolution: {integrity: sha512-TW8q03O0f6PNFTQDvh3xxH03c8CjGaaYrjkl9UQPG6rz53TQzzxJVCIWVjzcbN/Q5Y53Zd0IBQBMVktVgNx4Fg==} + deprecated: This module has been superseded by the multiformats module + dependencies: + base-x: 3.0.11 + buffer: 5.7.1 + dev: true + + /multicodec@0.5.7: + resolution: {integrity: sha512-PscoRxm3f+88fAtELwUnZxGDkduE2HD9Q6GHUOywQLjOGT/HAdhjLDYNZ1e7VR0s0TP0EwZ16LNUTFpoBGivOA==} + deprecated: This module has been superseded by the multiformats module + dependencies: + varint: 5.0.2 + dev: true + + /multicodec@1.0.4: + resolution: {integrity: sha512-NDd7FeS3QamVtbgfvu5h7fd1IlbaC4EQ0/pgU4zqE2vdHCmBGsUa0TiM8/TdSeG6BMPC92OOCf8F1ocE/Wkrrg==} + deprecated: This module has been superseded by the multiformats module + dependencies: + buffer: 5.7.1 + varint: 5.0.2 + dev: true + + /multihashes@0.4.21: + resolution: {integrity: sha512-uVSvmeCWf36pU2nB4/1kzYZjsXD9vofZKpgudqkceYY5g2aZZXJ5r9lxuzoRLl1OAp28XljXsEJ/X/85ZsKmKw==} + dependencies: + buffer: 5.7.1 + multibase: 0.7.0 + varint: 5.0.2 + dev: true + + /murmur-128@0.2.1: + resolution: {integrity: sha512-WseEgiRkI6aMFBbj8Cg9yBj/y+OdipwVC7zUo3W2W1JAJITwouUOtpqsmGSg67EQmwwSyod7hsVsWY5LsrfQVg==} + dependencies: + encode-utf8: 1.0.3 + fmix: 0.1.0 + imul: 1.0.1 + dev: true + + /nano-json-stream-parser@0.1.2: + resolution: {integrity: sha512-9MqxMH/BSJC7dnLsEMPyfN5Dvoo49IsPFYMcHw3Bcfc2kN0lpHRBSzlMSVx4HGyJ7s9B31CyBTVehWJoQ8Ctew==} + dev: true + + /napi-postinstall@0.3.2: + resolution: {integrity: sha512-tWVJxJHmBWLy69PvO96TZMZDrzmw5KeiZBz3RHmiM2XZ9grBJ2WgMAFVVg25nqp3ZjTFUs2Ftw1JhscL3Teliw==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + hasBin: true + dev: true + + /natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + dev: true + + /negotiator@0.6.3: + resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} + engines: {node: '>= 0.6'} + dev: true + + /next-tick@1.1.0: + resolution: {integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==} + dev: true + + /node-addon-api@2.0.2: + resolution: {integrity: sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==} + dev: true + + /node-addon-api@5.1.0: + resolution: {integrity: sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==} + dev: true + + /node-fetch@2.7.0: + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + dependencies: + whatwg-url: 5.0.0 + dev: true + + /node-gyp-build@4.3.0: + resolution: {integrity: sha512-iWjXZvmboq0ja1pUGULQBexmxq8CV4xBhX7VDOTbL7ZR4FOowwY/VOtRxBN/yKxmdGoIp4j5ysNT4u3S2pDQ3Q==} + hasBin: true + requiresBuild: true + dev: true + optional: true + + /node-gyp-build@4.8.4: + resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} + hasBin: true + dev: true + + /node-releases@2.0.19: + resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} + dev: true + + /nofilter@3.1.0: + resolution: {integrity: sha512-l2NNj07e9afPnhAhvgVrCD/oy2Ai1yfLpuo3EpiO1jFTsB4sFz6oIfAfSZyQzVpkZQ9xS8ZS5g1jCBgq4Hwo0g==} + engines: {node: '>=12.19'} + dev: true + + /normalize-package-data@2.5.0: + resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} + dependencies: + hosted-git-info: 2.8.9 + resolve: 1.22.10 + semver: 5.7.2 + validate-npm-package-license: 3.0.4 + dev: true + + /normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + dev: true + + /normalize-url@6.1.0: + resolution: {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==} + engines: {node: '>=10'} + dev: true + + /normalize-url@8.0.2: + resolution: {integrity: sha512-Ee/R3SyN4BuynXcnTaekmaVdbDAEiNrHqjQIA37mHU8G9pf7aaAD4ZX3XjBLo6rsdcxA/gtkcNYZLt30ACgynw==} + engines: {node: '>=14.16'} + dev: true + + /number-is-nan@1.0.1: + resolution: {integrity: sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==} + engines: {node: '>=0.10.0'} + dev: true + + /number-to-bn@1.7.0: + resolution: {integrity: sha512-wsJ9gfSz1/s4ZsJN01lyonwuxA1tml6X1yBDnfpMglypcBRFZZkus26EdPSlqS5GJfYddVZa22p3VNb3z5m5Ig==} + engines: {node: '>=6.5.0', npm: '>=3'} + dependencies: + bn.js: 4.11.6 + strip-hex-prefix: 1.0.0 + dev: true + + /oauth-sign@0.9.0: + resolution: {integrity: sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==} + dev: true + + /object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + dev: true + + /object-hash@2.2.0: + resolution: {integrity: sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==} + engines: {node: '>= 6'} + dev: true + + /object-inspect@1.13.4: + resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} + engines: {node: '>= 0.4'} + dev: true + + /object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + dev: true + + /object.assign@4.1.7: + resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + has-symbols: 1.1.0 + object-keys: 1.1.1 + dev: true + + /object.fromentries@2.0.8: + resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-object-atoms: 1.1.1 + dev: true + + /object.groupby@1.0.3: + resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.0 + dev: true + + /object.values@1.2.1: + resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + dev: true + + /obliterator@2.0.5: + resolution: {integrity: sha512-42CPE9AhahZRsMNslczq0ctAEtqk8Eka26QofnqC346BZdHDySk3LWka23LI7ULIw11NmltpiLagIq8gBozxTw==} + dev: true + + /oboe@2.1.5: + resolution: {integrity: sha512-zRFWiF+FoicxEs3jNI/WYUrVEgA7DeET/InK0XQuudGHRg8iIob3cNPrJTKaz4004uaA9Pbe+Dwa8iluhjLZWA==} + dependencies: + http-https: 1.0.0 + dev: true + + /on-finished@2.4.1: + resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} + engines: {node: '>= 0.8'} + dependencies: + ee-first: 1.1.1 + dev: true + + /once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + dependencies: + wrappy: 1.0.2 + dev: true + + /one-time@1.0.0: + resolution: {integrity: sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==} + dependencies: + fn.name: 1.1.0 + dev: true + + /onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + dependencies: + mimic-fn: 2.1.0 + dev: true + + /optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + engines: {node: '>= 0.8.0'} + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + word-wrap: 1.2.5 + dev: true + + /os-locale@1.4.0: + resolution: {integrity: sha512-PRT7ZORmwu2MEFt4/fv3Q+mEfN4zetKxufQrkShY2oGvUms9r8otu5HfdyIFHkYXjO7laNsoVGmM2MANfuTA8g==} + engines: {node: '>=0.10.0'} + dependencies: + lcid: 1.0.0 + dev: true + + /os-tmpdir@1.0.2: + resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} + engines: {node: '>=0.10.0'} + dev: true + + /own-keys@1.0.1: + resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} + engines: {node: '>= 0.4'} + dependencies: + get-intrinsic: 1.3.0 + object-keys: 1.1.1 + safe-push-apply: 1.0.0 + dev: true + + /p-cancelable@2.1.1: + resolution: {integrity: sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==} + engines: {node: '>=8'} + dev: true + + /p-cancelable@3.0.0: + resolution: {integrity: sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==} + engines: {node: '>=12.20'} + dev: true + + /p-defer@1.0.0: + resolution: {integrity: sha512-wB3wfAxZpk2AzOfUMJNL+d36xothRSyj8EXOa4f6GMqYDN9BJaaSISbsk+wS9abmnebVw95C2Kb5t85UmpCxuw==} + engines: {node: '>=4'} + dev: true + + /p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + dependencies: + p-try: 2.2.0 + dev: true + + /p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + dependencies: + yocto-queue: 0.1.0 + dev: true + + /p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + dependencies: + p-limit: 3.1.0 + dev: true + + /p-map@4.0.0: + resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} + engines: {node: '>=10'} + dependencies: + aggregate-error: 3.1.0 + dev: true + + /p-memoize@4.0.4: + resolution: {integrity: sha512-ijdh0DP4Mk6J4FXlOM6vPPoCjPytcEseW8p/k5SDTSSfGV3E9bpt9Yzfifvzp6iohIieoLTkXRb32OWV0fB2Lw==} + engines: {node: '>=10'} + dependencies: + map-age-cleaner: 0.1.3 + mimic-fn: 3.1.0 + p-settle: 4.1.1 + dev: true + + /p-reflect@2.1.0: + resolution: {integrity: sha512-paHV8NUz8zDHu5lhr/ngGWQiW067DK/+IbJ+RfZ4k+s8y4EKyYCz8pGYWjxCg35eHztpJAt+NUgvN4L+GCbPlg==} + engines: {node: '>=8'} + dev: true + + /p-settle@4.1.1: + resolution: {integrity: sha512-6THGh13mt3gypcNMm0ADqVNCcYa3BK6DWsuJWFCuEKP1rpY+OKGp7gaZwVmLspmic01+fsg/fN57MfvDzZ/PuQ==} + engines: {node: '>=10'} + dependencies: + p-limit: 2.3.0 + p-reflect: 2.1.0 + dev: true + + /p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + dev: true + + /package-json@8.1.1: + resolution: {integrity: sha512-cbH9IAIJHNj9uXi196JVsRlt7cHKak6u/e6AkL/bkRelZ7rlL3X1YKxsZwa36xipOEKAsdtmaG6aAJoM1fx2zA==} + engines: {node: '>=14.16'} + dependencies: + got: 12.6.1 + registry-auth-token: 5.1.0 + registry-url: 6.0.1 + semver: 7.7.2 + dev: true + + /parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + dependencies: + callsites: 3.1.0 + dev: true + + /parse-headers@2.0.6: + resolution: {integrity: sha512-Tz11t3uKztEW5FEVZnj1ox8GKblWn+PvHY9TmJV5Mll2uHEwRdR/5Li1OlXoECjLYkApdhWy44ocONwXLiKO5A==} + dev: true + + /parse-json@2.2.0: + resolution: {integrity: sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==} + engines: {node: '>=0.10.0'} + dependencies: + error-ex: 1.3.2 + dev: true + + /parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + dependencies: + '@babel/code-frame': 7.27.1 + error-ex: 1.3.2 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + dev: true + + /parseurl@1.3.3: + resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} + engines: {node: '>= 0.8'} + dev: true + + /patch-console@1.0.0: + resolution: {integrity: sha512-nxl9nrnLQmh64iTzMfyylSlRozL7kAXIaxw1fVcLYdyhNkJCRUzirRZTikXGJsg+hc4fqpneTK6iU2H1Q8THSA==} + engines: {node: '>=10'} + dev: true + + /path-browserify@1.0.1: + resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} + dev: true + + /path-exists@2.1.0: + resolution: {integrity: sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ==} + engines: {node: '>=0.10.0'} + dependencies: + pinkie-promise: 2.0.1 + dev: true + + /path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + dev: true + + /path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + dev: true + + /path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + dev: true + + /path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + dev: true + + /path-to-regexp@0.1.12: + resolution: {integrity: sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==} + dev: true + + /path-type@1.1.0: + resolution: {integrity: sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg==} + engines: {node: '>=0.10.0'} + dependencies: + graceful-fs: 4.2.11 + pify: 2.3.0 + pinkie-promise: 2.0.1 + dev: true + + /path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + dev: true + + /pathval@1.1.1: + resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} + dev: true + + /pbkdf2@3.1.3: + resolution: {integrity: sha512-wfRLBZ0feWRhCIkoMB6ete7czJcnNnqRpcoWQBLqatqXXmelSRqfdDK4F3u9T2s2cXas/hQJcryI/4lAL+XTlA==} + engines: {node: '>=0.12'} + dependencies: + create-hash: 1.1.3 + create-hmac: 1.1.7 + ripemd160: 2.0.1 + safe-buffer: 5.2.1 + sha.js: 2.4.12 + to-buffer: 1.2.1 + dev: true + + /performance-now@2.1.0: + resolution: {integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==} + dev: true + + /picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + dev: true + + /picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + dev: true + + /picomatch@4.0.3: + resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} + engines: {node: '>=12'} + dev: true + + /pify@2.3.0: + resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} + engines: {node: '>=0.10.0'} + dev: true + + /pinkie-promise@2.0.1: + resolution: {integrity: sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==} + engines: {node: '>=0.10.0'} + dependencies: + pinkie: 2.0.4 + dev: true + + /pinkie@2.0.4: + resolution: {integrity: sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==} + engines: {node: '>=0.10.0'} + dev: true + + /pluralize@8.0.0: + resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} + engines: {node: '>=4'} + dev: true + + /possible-typed-array-names@1.1.0: + resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} + engines: {node: '>= 0.4'} + dev: true + + /prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + dev: true + + /prettier-linter-helpers@1.0.0: + resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} + engines: {node: '>=6.0.0'} + dependencies: + fast-diff: 1.3.0 + dev: true + + /prettier-plugin-packagejson@2.5.18(prettier@3.6.2): + resolution: {integrity: sha512-NKznPGcGrcj4NPGxnh+w78JXPyfB6I4RQSCM0v+CAXwpDG7OEpJQ5zMyfC5NBgKH1k7Skwcj5ak5by2mrHvC5g==} + peerDependencies: + prettier: '>= 1.16.0' + peerDependenciesMeta: + prettier: + optional: true + dependencies: + prettier: 3.6.2 + sort-package-json: 3.4.0 + synckit: 0.11.8 + dev: true + + /prettier-plugin-solidity@1.4.3(prettier@3.6.2): + resolution: {integrity: sha512-Mrr/iiR9f9IaeGRMZY2ApumXcn/C5Gs3S7B7hWB3gigBFML06C0yEyW86oLp0eqiA0qg+46FaChgLPJCj/pIlg==} + engines: {node: '>=18'} + peerDependencies: + prettier: '>=2.3.0' + dependencies: + '@solidity-parser/parser': 0.20.1 + prettier: 3.6.2 + semver: 7.7.2 + dev: true + + /prettier@2.8.8: + resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} + engines: {node: '>=10.13.0'} + hasBin: true + dev: true + + /prettier@3.6.2: + resolution: {integrity: sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==} + engines: {node: '>=14'} + hasBin: true + dev: true + + /process@0.11.10: + resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} + engines: {node: '>= 0.6.0'} + dev: true + + /prompts@2.4.2: + resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} + engines: {node: '>= 6'} + dependencies: + kleur: 3.0.3 + sisteransi: 1.0.5 + dev: true + + /prop-types@15.8.1: + resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + dependencies: + loose-envify: 1.4.0 + object-assign: 4.1.1 + react-is: 16.13.1 + dev: true + + /proper-lockfile@4.1.2: + resolution: {integrity: sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==} + dependencies: + graceful-fs: 4.2.11 + retry: 0.12.0 + signal-exit: 3.0.7 + dev: true + + /proto-list@1.2.4: + resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} + dev: true + + /proxy-addr@2.0.7: + resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} + engines: {node: '>= 0.10'} + dependencies: + forwarded: 0.2.0 + ipaddr.js: 1.9.1 + dev: true + + /proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + dev: true + + /prr@1.0.1: + resolution: {integrity: sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==} + dev: true + + /psl@1.15.0: + resolution: {integrity: sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==} + dependencies: + punycode: 2.3.1 + dev: true + + /pump@3.0.3: + resolution: {integrity: sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==} + dependencies: + end-of-stream: 1.4.5 + once: 1.4.0 + dev: true + + /punycode@1.4.1: + resolution: {integrity: sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==} + dev: true + + /punycode@2.1.0: + resolution: {integrity: sha512-Yxz2kRwT90aPiWEMHVYnEf4+rhwF1tBmmZ4KepCP+Wkium9JxtWnUm1nqGwpiAHr/tnTSeHqr3wb++jgSkXjhA==} + engines: {node: '>=6'} + dev: true + + /punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + dev: true + + /qs@6.13.0: + resolution: {integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==} + engines: {node: '>=0.6'} + dependencies: + side-channel: 1.1.0 + dev: true + + /qs@6.14.0: + resolution: {integrity: sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==} + engines: {node: '>=0.6'} + dependencies: + side-channel: 1.1.0 + dev: true + + /qs@6.5.3: + resolution: {integrity: sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==} + engines: {node: '>=0.6'} + dev: true + + /query-string@5.1.1: + resolution: {integrity: sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==} + engines: {node: '>=0.10.0'} + dependencies: + decode-uri-component: 0.2.2 + object-assign: 4.1.1 + strict-uri-encode: 1.1.0 + dev: true + + /queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + dev: true + + /quick-lru@5.1.1: + resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} + engines: {node: '>=10'} + dev: true + + /randombytes@2.1.0: + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + dependencies: + safe-buffer: 5.2.1 + dev: true + + /range-parser@1.2.1: + resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} + engines: {node: '>= 0.6'} + dev: true + + /raw-body@2.5.2: + resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} + engines: {node: '>= 0.8'} + dependencies: + bytes: 3.1.2 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + unpipe: 1.0.0 + dev: true + + /rc@1.2.8: + resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} + hasBin: true + dependencies: + deep-extend: 0.6.0 + ini: 1.3.8 + minimist: 1.2.8 + strip-json-comments: 2.0.1 + dev: true + + /react-devtools-core@4.28.5: + resolution: {integrity: sha512-cq/o30z9W2Wb4rzBefjv5fBalHU0rJGZCHAkf/RHSBWSSYwh8PlQTqqOJmgIIbBtpj27T6FIPXeomIjZtCNVqA==} + dependencies: + shell-quote: 1.8.3 + ws: 7.5.10 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + dev: true + + /react-is@16.13.1: + resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + dev: true + + /react-reconciler@0.26.2(react@17.0.2): + resolution: {integrity: sha512-nK6kgY28HwrMNwDnMui3dvm3rCFjZrcGiuwLc5COUipBK5hWHLOxMJhSnSomirqWwjPBJKV1QcbkI0VJr7Gl1Q==} + engines: {node: '>=0.10.0'} + peerDependencies: + react: ^17.0.2 + dependencies: + loose-envify: 1.4.0 + object-assign: 4.1.1 + react: 17.0.2 + scheduler: 0.20.2 + dev: true + + /react@17.0.2: + resolution: {integrity: sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==} + engines: {node: '>=0.10.0'} + dependencies: + loose-envify: 1.4.0 + object-assign: 4.1.1 + dev: true + + /read-pkg-up@1.0.1: + resolution: {integrity: sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A==} + engines: {node: '>=0.10.0'} + dependencies: + find-up: 1.1.2 + read-pkg: 1.1.0 + dev: true + + /read-pkg@1.1.0: + resolution: {integrity: sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ==} + engines: {node: '>=0.10.0'} + dependencies: + load-json-file: 1.1.0 + normalize-package-data: 2.5.0 + path-type: 1.1.0 + dev: true + + /readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + dev: true + + /readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + dependencies: + picomatch: 2.3.1 + dev: true + + /readdirp@4.1.2: + resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} + engines: {node: '>= 14.18.0'} + dev: true + + /reduce-flatten@2.0.0: + resolution: {integrity: sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w==} + engines: {node: '>=6'} + dev: true + + /reflect.getprototypeof@1.0.10: + resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 + which-builtin-type: 1.2.1 + dev: true + + /regexp.prototype.flags@1.5.4: + resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-errors: 1.3.0 + get-proto: 1.0.1 + gopd: 1.2.0 + set-function-name: 2.0.2 + dev: true + + /registry-auth-token@5.1.0: + resolution: {integrity: sha512-GdekYuwLXLxMuFTwAPg5UKGLW/UXzQrZvH/Zj791BQif5T05T0RsaLfHc9q3ZOKi7n+BoprPD9mJ0O0k4xzUlw==} + engines: {node: '>=14'} + dependencies: + '@pnpm/npm-conf': 2.3.1 + dev: true + + /registry-url@6.0.1: + resolution: {integrity: sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q==} + engines: {node: '>=12'} + dependencies: + rc: 1.2.8 + dev: true + + /request@2.88.2: + resolution: {integrity: sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==} + engines: {node: '>= 6'} + deprecated: request has been deprecated, see https://github.com/request/request/issues/3142 + dependencies: + aws-sign2: 0.7.0 + aws4: 1.13.2 + caseless: 0.12.0 + combined-stream: 1.0.8 + extend: 3.0.2 + forever-agent: 0.6.1 + form-data: 2.3.3 + har-validator: 5.1.5 + http-signature: 1.2.0 + is-typedarray: 1.0.0 + isstream: 0.1.2 + json-stringify-safe: 5.0.1 + mime-types: 2.1.35 + oauth-sign: 0.9.0 + performance-now: 2.1.0 + qs: 6.5.3 + safe-buffer: 5.2.1 + tough-cookie: 2.5.0 + tunnel-agent: 0.6.0 + uuid: 3.4.0 + dev: true + + /require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + dev: true + + /require-from-string@1.2.1: + resolution: {integrity: sha512-H7AkJWMobeskkttHyhTVtS0fxpFLjxhbfMa6Bk3wimP7sdPRGL3EyCg3sAQenFfAe+xQ+oAc85Nmtvq0ROM83Q==} + engines: {node: '>=0.10.0'} + dev: true + + /require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + dev: true + + /require-main-filename@1.0.1: + resolution: {integrity: sha512-IqSUtOVP4ksd1C/ej5zeEh/BIP2ajqpn8c5x+q99gvcIG/Qf0cud5raVnE/Dwd0ua9TXYDoDc0RE5hBSdz22Ug==} + dev: true + + /resolve-alpn@1.2.1: + resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} + dev: true + + /resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + dev: true + + /resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + dev: true + + /resolve@1.17.0: + resolution: {integrity: sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==} + dependencies: + path-parse: 1.0.7 + dev: true + + /resolve@1.22.10: + resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} + engines: {node: '>= 0.4'} + hasBin: true + dependencies: + is-core-module: 2.16.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + dev: true + + /responselike@2.0.1: + resolution: {integrity: sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==} + dependencies: + lowercase-keys: 2.0.0 + dev: true + + /responselike@3.0.0: + resolution: {integrity: sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==} + engines: {node: '>=14.16'} + dependencies: + lowercase-keys: 3.0.0 + dev: true + + /restore-cursor@3.1.0: + resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} + engines: {node: '>=8'} + dependencies: + onetime: 5.1.2 + signal-exit: 3.0.7 + dev: true + + /retry@0.12.0: + resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} + engines: {node: '>= 4'} + dev: true + + /retry@0.13.1: + resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==} + engines: {node: '>= 4'} + dev: true + + /reusify@1.1.0: + resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + dev: true + + /rimraf@2.7.1: + resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==} + deprecated: Rimraf versions prior to v4 are no longer supported + hasBin: true + dependencies: + glob: 7.2.3 + dev: true + + /rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + deprecated: Rimraf versions prior to v4 are no longer supported + hasBin: true + dependencies: + glob: 7.2.3 + dev: true + + /ripemd160@2.0.1: + resolution: {integrity: sha512-J7f4wutN8mdbV08MJnXibYpCOPHR+yzy+iQ/AsjMv2j8cLavQ8VGagDFUwwTAdF8FmRKVeNpbTTEwNHCW1g94w==} + dependencies: + hash-base: 2.0.2 + inherits: 2.0.4 + dev: true + + /ripemd160@2.0.2: + resolution: {integrity: sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==} + dependencies: + hash-base: 3.1.0 + inherits: 2.0.4 + dev: true + + /rlp@2.2.6: + resolution: {integrity: sha512-HAfAmL6SDYNWPUOJNrM500x4Thn4PZsEy5pijPh40U9WfNk0z15hUYzO9xVIMAdIHdFtD8CBDHd75Td1g36Mjg==} + hasBin: true + dependencies: + bn.js: 4.12.2 + dev: true + + /rlp@2.2.7: + resolution: {integrity: sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ==} + hasBin: true + dependencies: + bn.js: 5.2.2 + dev: true + + /run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + dependencies: + queue-microtask: 1.2.3 + dev: true + + /rustbn.js@0.2.0: + resolution: {integrity: sha512-4VlvkRUuCJvr2J6Y0ImW7NvTCriMi7ErOAqWk1y69vAdoNIzCF3yPmgeNzx+RQTLEDFq5sHfscn1MwHxP9hNfA==} + dev: true + + /rxjs@7.8.2: + resolution: {integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==} + dependencies: + tslib: 2.8.1 + dev: true + + /safe-array-concat@1.1.3: + resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==} + engines: {node: '>=0.4'} + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + has-symbols: 1.1.0 + isarray: 2.0.5 + dev: true + + /safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + dev: true + + /safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + dev: true + + /safe-push-apply@1.0.0: + resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==} + engines: {node: '>= 0.4'} + dependencies: + es-errors: 1.3.0 + isarray: 2.0.5 + dev: true + + /safe-regex-test@1.1.0: + resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-regex: 1.2.1 + dev: true + + /safe-stable-stringify@2.5.0: + resolution: {integrity: sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==} + engines: {node: '>=10'} + dev: true + + /safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + dev: true + + /scheduler@0.20.2: + resolution: {integrity: sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==} + dependencies: + loose-envify: 1.4.0 + object-assign: 4.1.1 + dev: true + + /scrypt-js@3.0.1: + resolution: {integrity: sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==} + dev: true + + /secp256k1@4.0.4: + resolution: {integrity: sha512-6JfvwvjUOn8F/jUoBY2Q1v5WY5XS+rj8qSe0v8Y4ezH4InLgTEeOOPQsRll9OV429Pvo6BCHGavIyJfr3TAhsw==} + engines: {node: '>=18.0.0'} + requiresBuild: true + dependencies: + elliptic: 6.6.1 + node-addon-api: 5.1.0 + node-gyp-build: 4.8.4 + dev: true + + /seedrandom@3.0.5: + resolution: {integrity: sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg==} + dev: true + + /semaphore-async-await@1.5.1: + resolution: {integrity: sha512-b/ptP11hETwYWpeilHXXQiV5UJNJl7ZWWooKRE5eBIYWoom6dZ0SluCIdCtKycsMtZgKWE01/qAw6jblw1YVhg==} + engines: {node: '>=4.1'} + dev: true + + /semver@5.7.2: + resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} + hasBin: true + dev: true + + /semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + dev: true + + /semver@7.7.2: + resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==} + engines: {node: '>=10'} + hasBin: true + dev: true + + /send@0.19.0: + resolution: {integrity: sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==} + engines: {node: '>= 0.8.0'} + dependencies: + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + encodeurl: 1.0.2 + escape-html: 1.0.3 + etag: 1.8.1 + fresh: 0.5.2 + http-errors: 2.0.0 + mime: 1.6.0 + ms: 2.1.3 + on-finished: 2.4.1 + range-parser: 1.2.1 + statuses: 2.0.1 + transitivePeerDependencies: + - supports-color + dev: true + + /serialize-javascript@6.0.2: + resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} + dependencies: + randombytes: 2.1.0 + dev: true + + /serve-static@1.16.2: + resolution: {integrity: sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==} + engines: {node: '>= 0.8.0'} + dependencies: + encodeurl: 2.0.0 + escape-html: 1.0.3 + parseurl: 1.3.3 + send: 0.19.0 + transitivePeerDependencies: + - supports-color + dev: true + + /servify@0.1.12: + resolution: {integrity: sha512-/xE6GvsKKqyo1BAY+KxOWXcLpPsUUyji7Qg3bVD7hh1eRze5bR1uYiuDA/k3Gof1s9BTzQZEJK8sNcNGFIzeWw==} + engines: {node: '>=6'} + dependencies: + body-parser: 1.20.3 + cors: 2.8.5 + express: 4.21.2 + request: 2.88.2 + xhr: 2.6.0 + transitivePeerDependencies: + - supports-color + dev: true + + /set-blocking@2.0.0: + resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} + dev: true + + /set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.3.0 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + dev: true + + /set-function-name@2.0.2: + resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} + engines: {node: '>= 0.4'} + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + functions-have-names: 1.2.3 + has-property-descriptors: 1.0.2 + dev: true + + /set-proto@1.0.0: + resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==} + engines: {node: '>= 0.4'} + dependencies: + dunder-proto: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + dev: true + + /setimmediate@1.0.5: + resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} + dev: true + + /setprototypeof@1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + dev: true + + /sha.js@2.4.12: + resolution: {integrity: sha512-8LzC5+bvI45BjpfXU8V5fdU2mfeKiQe1D1gIMn7XUlF3OTUrpdJpPPH4EMAnF0DsHHdSZqCdSss5qCmJKuiO3w==} + engines: {node: '>= 0.10'} + hasBin: true + dependencies: + inherits: 2.0.4 + safe-buffer: 5.2.1 + to-buffer: 1.2.1 + dev: true + + /shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + dependencies: + shebang-regex: 3.0.0 + dev: true + + /shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + dev: true + + /shell-quote@1.8.3: + resolution: {integrity: sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==} + engines: {node: '>= 0.4'} + dev: true + + /side-channel-list@1.0.0: + resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} + engines: {node: '>= 0.4'} + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + dev: true + + /side-channel-map@1.0.1: + resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + dev: true + + /side-channel-weakmap@1.0.2: + resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + side-channel-map: 1.0.1 + dev: true + + /side-channel@1.1.0: + resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} + engines: {node: '>= 0.4'} + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + side-channel-list: 1.0.0 + side-channel-map: 1.0.1 + side-channel-weakmap: 1.0.2 + dev: true + + /signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + dev: true + + /simple-concat@1.0.1: + resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} + dev: true + + /simple-get@2.8.2: + resolution: {integrity: sha512-Ijd/rV5o+mSBBs4F/x9oDPtTx9Zb6X9brmnXvMW4J7IR15ngi9q5xxqWBKU744jTZiaXtxaPL7uHG6vtN8kUkw==} + dependencies: + decompress-response: 3.3.0 + once: 1.4.0 + simple-concat: 1.0.1 + dev: true + + /simple-swizzle@0.2.2: + resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} + dependencies: + is-arrayish: 0.3.2 + dev: true + + /sisteransi@1.0.5: + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + dev: true + + /slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + dev: true + + /slice-ansi@3.0.0: + resolution: {integrity: sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==} + engines: {node: '>=8'} + dependencies: + ansi-styles: 4.3.0 + astral-regex: 2.0.0 + is-fullwidth-code-point: 3.0.0 + dev: true + + /slice-ansi@4.0.0: + resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + astral-regex: 2.0.0 + is-fullwidth-code-point: 3.0.0 + dev: true + + /solc@0.4.26: + resolution: {integrity: sha512-o+c6FpkiHd+HPjmjEVpQgH7fqZ14tJpXhho+/bQXlXbliLIS/xjXb42Vxh+qQY1WCSTMQ0+a5vR9vi0MfhU6mA==} + hasBin: true + dependencies: + fs-extra: 0.30.0 + memorystream: 0.3.1 + require-from-string: 1.2.1 + semver: 5.7.2 + yargs: 4.8.1 + dev: true + + /solc@0.8.15: + resolution: {integrity: sha512-Riv0GNHNk/SddN/JyEuFKwbcWcEeho15iyupTSHw5Np6WuXA5D8kEHbyzDHi6sqmvLzu2l+8b1YmL8Ytple+8w==} + engines: {node: '>=10.0.0'} + hasBin: true + dependencies: + command-exists: 1.2.9 + commander: 8.3.0 + follow-redirects: 1.15.9(debug@4.4.1) + js-sha3: 0.8.0 + memorystream: 0.3.1 + semver: 5.7.2 + tmp: 0.0.33 + transitivePeerDependencies: + - debug + dev: true + + /solc@0.8.26(debug@4.4.1): + resolution: {integrity: sha512-yiPQNVf5rBFHwN6SIf3TUUvVAFKcQqmSUFeq+fb6pNRCo0ZCgpYOZDi3BVoezCPIAcKrVYd/qXlBLUP9wVrZ9g==} + engines: {node: '>=10.0.0'} + hasBin: true + dependencies: + command-exists: 1.2.9 + commander: 8.3.0 + follow-redirects: 1.15.9(debug@4.4.1) + js-sha3: 0.8.0 + memorystream: 0.3.1 + semver: 5.7.2 + tmp: 0.0.33 + transitivePeerDependencies: + - debug + dev: true + + /solhint@4.5.4(typescript@5.8.3): + resolution: {integrity: sha512-Cu1XiJXub2q1eCr9kkJ9VPv1sGcmj3V7Zb76B0CoezDOB9bu3DxKIFFH7ggCl9fWpEPD6xBmRLfZrYijkVmujQ==} + hasBin: true + dependencies: + '@solidity-parser/parser': 0.18.0 + ajv: 6.12.6 + antlr4: 4.13.2 + ast-parents: 0.0.1 + chalk: 4.1.2 + commander: 10.0.1 + cosmiconfig: 8.3.6(typescript@5.8.3) + fast-diff: 1.3.0 + glob: 8.1.0 + ignore: 5.3.2 + js-yaml: 4.1.0 + latest-version: 7.0.0 + lodash: 4.17.21 + pluralize: 8.0.0 + semver: 7.7.2 + strip-ansi: 6.0.1 + table: 6.9.0 + text-table: 0.2.0 + optionalDependencies: + prettier: 2.8.8 + transitivePeerDependencies: + - typescript + dev: true + + /solidity-ast@0.4.60: + resolution: {integrity: sha512-UwhasmQ37ji1ul8cIp0XlrQ/+SVQhy09gGqJH4jnwdo2TgI6YIByzi0PI5QvIGcIdFOs1pbSmJW1pnWB7AVh2w==} + dev: true + + /solidity-bytes-utils@0.8.4: + resolution: {integrity: sha512-/bjac5YR12i0plOKvGlhE51F5IWGP6rI8DJetCQlXcnwKWz/Hgf/vr+Qlk1BWz56xVcwVhmhCaDkTMnx5xvt0g==} + dev: true + + /sort-object-keys@1.1.3: + resolution: {integrity: sha512-855pvK+VkU7PaKYPc+Jjnmt4EzejQHyhhF33q31qG8x7maDzkeFhAAThdCYay11CISO+qAMwjOBP+fPZe0IPyg==} + dev: true + + /sort-package-json@3.4.0: + resolution: {integrity: sha512-97oFRRMM2/Js4oEA9LJhjyMlde+2ewpZQf53pgue27UkbEXfHJnDzHlUxQ/DWUkzqmp7DFwJp8D+wi/TYeQhpA==} + engines: {node: '>=20'} + hasBin: true + dependencies: + detect-indent: 7.0.1 + detect-newline: 4.0.1 + git-hooks-list: 4.1.1 + is-plain-obj: 4.1.0 + semver: 7.7.2 + sort-object-keys: 1.1.3 + tinyglobby: 0.2.14 + dev: true + + /source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + dev: true + + /source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + dev: true + + /spdx-correct@3.2.0: + resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} + dependencies: + spdx-expression-parse: 3.0.1 + spdx-license-ids: 3.0.21 + dev: true + + /spdx-exceptions@2.5.0: + resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} + dev: true + + /spdx-expression-parse@3.0.1: + resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} + dependencies: + spdx-exceptions: 2.5.0 + spdx-license-ids: 3.0.21 + dev: true + + /spdx-license-ids@3.0.21: + resolution: {integrity: sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg==} + dev: true + + /sshpk@1.18.0: + resolution: {integrity: sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==} + engines: {node: '>=0.10.0'} + hasBin: true + dependencies: + asn1: 0.2.6 + assert-plus: 1.0.0 + bcrypt-pbkdf: 1.0.2 + dashdash: 1.14.1 + ecc-jsbn: 0.1.2 + getpass: 0.1.7 + jsbn: 0.1.1 + safer-buffer: 2.1.2 + tweetnacl: 0.14.5 + dev: true + + /stable-hash@0.0.5: + resolution: {integrity: sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA==} + dev: true + + /stack-trace@0.0.10: + resolution: {integrity: sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==} + dev: true + + /stack-utils@2.0.6: + resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} + engines: {node: '>=10'} + dependencies: + escape-string-regexp: 2.0.0 + dev: true + + /stacktrace-parser@0.1.11: + resolution: {integrity: sha512-WjlahMgHmCJpqzU8bIBy4qtsZdU9lRlcZE3Lvyej6t4tuOuv1vk57OW3MBrj6hXBFx/nNoC9MPMTcr5YA7NQbg==} + engines: {node: '>=6'} + dependencies: + type-fest: 0.7.1 + dev: true + + /statuses@2.0.1: + resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} + engines: {node: '>= 0.8'} + dev: true + + /stop-iteration-iterator@1.1.0: + resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} + engines: {node: '>= 0.4'} + dependencies: + es-errors: 1.3.0 + internal-slot: 1.1.0 + dev: true + + /strict-uri-encode@1.1.0: + resolution: {integrity: sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ==} + engines: {node: '>=0.10.0'} + dev: true + + /string-format@2.0.0: + resolution: {integrity: sha512-bbEs3scLeYNXLecRRuk6uJxdXUSj6le/8rNPHChIJTn2V79aXVTR1EH2OH5zLKKoz0V02fOUKZZcw01pLUShZA==} + dev: true + + /string-similarity@4.0.4: + resolution: {integrity: sha512-/q/8Q4Bl4ZKAPjj8WerIBJWALKkaPRfrvhfF8k/B23i4nzrlRj2/go1m90In7nG/3XDSbOo0+pu6RvCTM9RGMQ==} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. + dev: true + + /string-width@1.0.2: + resolution: {integrity: sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==} + engines: {node: '>=0.10.0'} + dependencies: + code-point-at: 1.1.0 + is-fullwidth-code-point: 1.0.0 + strip-ansi: 3.0.1 + dev: true + + /string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + dev: true + + /string.prototype.trim@1.2.10: + resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-data-property: 1.1.4 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-object-atoms: 1.1.1 + has-property-descriptors: 1.0.2 + dev: true + + /string.prototype.trimend@1.0.9: + resolution: {integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + dev: true + + /string.prototype.trimstart@1.0.8: + resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + dev: true + + /string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + dependencies: + safe-buffer: 5.2.1 + dev: true + + /strip-ansi@3.0.1: + resolution: {integrity: sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==} + engines: {node: '>=0.10.0'} + dependencies: + ansi-regex: 2.1.1 + dev: true + + /strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + dependencies: + ansi-regex: 5.0.1 + dev: true + + /strip-bom@2.0.0: + resolution: {integrity: sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==} + engines: {node: '>=0.10.0'} + dependencies: + is-utf8: 0.2.1 + dev: true + + /strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + dev: true + + /strip-hex-prefix@1.0.0: + resolution: {integrity: sha512-q8d4ue7JGEiVcypji1bALTos+0pWtyGlivAWyPuTkHzuTCJqrK9sWxYQZUq6Nq3cuyv3bm734IhHvHtGGURU6A==} + engines: {node: '>=6.5.0', npm: '>=3'} + dependencies: + is-hex-prefixed: 1.0.0 + dev: true + + /strip-json-comments@2.0.1: + resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} + engines: {node: '>=0.10.0'} + dev: true + + /strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + dev: true + + /supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + dependencies: + has-flag: 3.0.0 + dev: true + + /supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + dependencies: + has-flag: 4.0.0 + dev: true + + /supports-color@8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} + dependencies: + has-flag: 4.0.0 + dev: true + + /supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + dev: true + + /swarm-js@0.1.42: + resolution: {integrity: sha512-BV7c/dVlA3R6ya1lMlSSNPLYrntt0LUq4YMgy3iwpCIc6rZnS5W2wUoctarZ5pXlpKtxDDf9hNziEkcfrxdhqQ==} + dependencies: + bluebird: 3.7.2 + buffer: 5.7.1 + eth-lib: 0.1.29 + fs-extra: 4.0.3 + got: 11.8.6 + mime-types: 2.1.35 + mkdirp-promise: 5.0.1 + mock-fs: 4.14.0 + setimmediate: 1.0.5 + tar: 4.4.19 + xhr-request: 1.1.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: true + + /synckit@0.11.10: + resolution: {integrity: sha512-n6Ze5AGOURWdQ9Kg/wqI1//4OBw9V1zuOTj7uQlpAjtpe2bhgPBpmSFXvapbP3KxcRoqo996J28kdT2ly4w9UA==} + engines: {node: ^14.18.0 || >=16.0.0} + dependencies: + '@pkgr/core': 0.3.4 + dev: true + + /synckit@0.11.8: + resolution: {integrity: sha512-+XZ+r1XGIJGeQk3VvXhT6xx/VpbHsRzsTkGgF6E5RX9TTXD0118l87puaEBZ566FhqblC6U0d4XnubznJDm30A==} + engines: {node: ^14.18.0 || >=16.0.0} + dependencies: + '@pkgr/core': 0.2.9 + dev: true + + /table-layout@1.0.2: + resolution: {integrity: sha512-qd/R7n5rQTRFi+Zf2sk5XVVd9UQl6ZkduPFC3S7WEGJAmetDTjY3qPN50eSKzwuzEyQKy5TN2TiZdkIjos2L6A==} + engines: {node: '>=8.0.0'} + dependencies: + array-back: 4.0.2 + deep-extend: 0.6.0 + typical: 5.2.0 + wordwrapjs: 4.0.1 + dev: true + + /table@6.8.2: + resolution: {integrity: sha512-w2sfv80nrAh2VCbqR5AK27wswXhqcck2AhfnNW76beQXskGZ1V12GwS//yYVa3d3fcvAip2OUnbDAjW2k3v9fA==} + engines: {node: '>=10.0.0'} + dependencies: + ajv: 8.17.1 + lodash.truncate: 4.4.2 + slice-ansi: 4.0.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + dev: true + + /table@6.9.0: + resolution: {integrity: sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A==} + engines: {node: '>=10.0.0'} + dependencies: + ajv: 8.17.1 + lodash.truncate: 4.4.2 + slice-ansi: 4.0.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + dev: true + + /tar@4.4.19: + resolution: {integrity: sha512-a20gEsvHnWe0ygBY8JbxoM4w3SJdhc7ZAuxkLqh+nvNQN2IOt0B5lLgM490X5Hl8FF0dl0tOf2ewFYAlIFgzVA==} + engines: {node: '>=4.5'} + dependencies: + chownr: 1.1.4 + fs-minipass: 1.2.7 + minipass: 2.9.0 + minizlib: 1.3.3 + mkdirp: 0.5.6 + safe-buffer: 5.2.1 + yallist: 3.1.1 + dev: true + + /testrpc@0.0.1: + resolution: {integrity: sha512-afH1hO+SQ/VPlmaLUFj2636QMeDvPCeQMc/9RBMW0IfjNe9gFD9Ra3ShqYkB7py0do1ZcCna/9acHyzTJ+GcNA==} + deprecated: testrpc has been renamed to ganache-cli, please use this package from now on. + dev: true + + /text-hex@1.0.0: + resolution: {integrity: sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==} + dev: true + + /text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + dev: true + + /timed-out@4.0.1: + resolution: {integrity: sha512-G7r3AhovYtr5YKOWQkta8RKAPb+J9IsO4uVmzjl8AZwfhs8UcUwTiD6gcJYSgOtzyjvQKrKYn41syHbUWMkafA==} + engines: {node: '>=0.10.0'} + dev: true + + /tiny-invariant@1.3.3: + resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} + dev: true + + /tinycolor2@1.6.0: + resolution: {integrity: sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==} + dev: true + + /tinyglobby@0.2.14: + resolution: {integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==} + engines: {node: '>=12.0.0'} + dependencies: + fdir: 6.4.6(picomatch@4.0.3) + picomatch: 4.0.3 + dev: true + + /tinygradient@0.4.3: + resolution: {integrity: sha512-tBPYQSs6eWukzzAITBSmqcOwZCKACvRa/XjPPh1mj4mnx4G3Drm51HxyCTU/TKnY8kG4hmTe5QlOh9O82aNtJQ==} + dependencies: + '@types/tinycolor2': 1.4.6 + tinycolor2: 1.6.0 + dev: true + + /tmp@0.0.33: + resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} + engines: {node: '>=0.6.0'} + dependencies: + os-tmpdir: 1.0.2 + dev: true + + /to-buffer@1.2.1: + resolution: {integrity: sha512-tB82LpAIWjhLYbqjx3X4zEeHN6M8CiuOEy2JY8SEQVdYRe3CCHOFaqrBW1doLDrfpWhplcW7BL+bO3/6S3pcDQ==} + engines: {node: '>= 0.4'} + dependencies: + isarray: 2.0.5 + safe-buffer: 5.2.1 + typed-array-buffer: 1.0.3 + dev: true + + /to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + dependencies: + is-number: 7.0.0 + dev: true + + /toidentifier@1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + dev: true + + /tough-cookie@2.5.0: + resolution: {integrity: sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==} + engines: {node: '>=0.8'} + dependencies: + psl: 1.15.0 + punycode: 2.3.1 + dev: true + + /tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + dev: true + + /tree-kill@1.2.2: + resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} + hasBin: true + dev: true + + /triple-beam@1.4.1: + resolution: {integrity: sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==} + engines: {node: '>= 14.0.0'} + dev: true + + /ts-api-utils@1.4.3(typescript@5.8.3): + resolution: {integrity: sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==} + engines: {node: '>=16'} + peerDependencies: + typescript: '>=4.2.0' + dependencies: + typescript: 5.8.3 + dev: true + + /ts-command-line-args@2.5.1: + resolution: {integrity: sha512-H69ZwTw3rFHb5WYpQya40YAX2/w7Ut75uUECbgBIsLmM+BNuYnxsltfyyLMxy6sEeKxgijLTnQtLd0nKd6+IYw==} + hasBin: true + dependencies: + chalk: 4.1.2 + command-line-args: 5.2.1 + command-line-usage: 6.1.3 + string-format: 2.0.0 + dev: true + + /ts-essentials@7.0.3(typescript@5.8.3): + resolution: {integrity: sha512-8+gr5+lqO3G84KdiTSMRLtuyJ+nTBVRKuCrK4lidMPdVeEp0uqC875uE5NMcaA7YYMN7XsNiFQuMvasF8HT/xQ==} + peerDependencies: + typescript: '>=3.7.0' + dependencies: + typescript: 5.8.3 + dev: true + + /ts-node@10.9.2(@types/node@18.18.14)(typescript@5.8.3): + resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} + hasBin: true + peerDependencies: + '@swc/core': '>=1.2.50' + '@swc/wasm': '>=1.2.50' + '@types/node': '*' + typescript: '>=2.7' + peerDependenciesMeta: + '@swc/core': + optional: true + '@swc/wasm': + optional: true + dependencies: + '@cspotcode/source-map-support': 0.8.1 + '@tsconfig/node10': 1.0.11 + '@tsconfig/node12': 1.0.11 + '@tsconfig/node14': 1.0.3 + '@tsconfig/node16': 1.0.4 + '@types/node': 18.18.14 + acorn: 8.15.0 + acorn-walk: 8.3.4 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + typescript: 5.8.3 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + dev: true + + /tsconfig-paths@3.15.0: + resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} + dependencies: + '@types/json5': 0.0.29 + json5: 1.0.2 + minimist: 1.2.8 + strip-bom: 3.0.0 + dev: true + + /tslib@1.14.1: + resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} + dev: true + + /tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + dev: true + + /tsort@0.0.1: + resolution: {integrity: sha512-Tyrf5mxF8Ofs1tNoxA13lFeZ2Zrbd6cKbuH3V+MQ5sb6DtBj5FjrXVsRWT8YvNAQTqNoz66dz1WsbigI22aEnw==} + dev: true + + /tsutils@3.21.0(typescript@5.8.3): + resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} + engines: {node: '>= 6'} + peerDependencies: + typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' + dependencies: + tslib: 1.14.1 + typescript: 5.8.3 + dev: true + + /tunnel-agent@0.6.0: + resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} + dependencies: + safe-buffer: 5.2.1 + dev: true + + /tweetnacl@0.14.5: + resolution: {integrity: sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==} + dev: true + + /type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.2.1 + dev: true + + /type-detect@4.1.0: + resolution: {integrity: sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==} + engines: {node: '>=4'} + dev: true + + /type-fest@0.12.0: + resolution: {integrity: sha512-53RyidyjvkGpnWPMF9bQgFtWp+Sl8O2Rp13VavmJgfAP9WWG6q6TkrKU8iyJdnwnfgHI6k2hTlgqH4aSdjoTbg==} + engines: {node: '>=10'} + dev: true + + /type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + dev: true + + /type-fest@0.21.3: + resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} + engines: {node: '>=10'} + dev: true + + /type-fest@0.7.1: + resolution: {integrity: sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==} + engines: {node: '>=8'} + dev: true + + /type-is@1.6.18: + resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} + engines: {node: '>= 0.6'} + dependencies: + media-typer: 0.3.0 + mime-types: 2.1.35 + dev: true + + /type@2.7.3: + resolution: {integrity: sha512-8j+1QmAbPvLZow5Qpi6NCaN8FB60p/6x8/vfNqOk/hC+HuvFZhL4+WfekuhQLiqFZXOgQdrs3B+XxEmCc6b3FQ==} + dev: true + + /typechain@8.3.2(typescript@5.8.3): + resolution: {integrity: sha512-x/sQYr5w9K7yv3es7jo4KTX05CLxOf7TRWwoHlrjRh8H82G64g+k7VuWPJlgMo6qrjfCulOdfBjiaDtmhFYD/Q==} + hasBin: true + peerDependencies: + typescript: '>=4.3.0' + dependencies: + '@types/prettier': 2.7.3 + debug: 4.4.1(supports-color@8.1.1) + fs-extra: 7.0.1 + glob: 7.1.7 + js-sha3: 0.8.0 + lodash: 4.17.21 + mkdirp: 1.0.4 + prettier: 2.8.8 + ts-command-line-args: 2.5.1 + ts-essentials: 7.0.3(typescript@5.8.3) + typescript: 5.8.3 + transitivePeerDependencies: + - supports-color + dev: true + + /typed-array-buffer@1.0.3: + resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-typed-array: 1.1.15 + dev: true + + /typed-array-byte-length@1.0.3: + resolution: {integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + for-each: 0.3.5 + gopd: 1.2.0 + has-proto: 1.2.0 + is-typed-array: 1.1.15 + dev: true + + /typed-array-byte-offset@1.0.4: + resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==} + engines: {node: '>= 0.4'} + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + for-each: 0.3.5 + gopd: 1.2.0 + has-proto: 1.2.0 + is-typed-array: 1.1.15 + reflect.getprototypeof: 1.0.10 + dev: true + + /typed-array-length@1.0.7: + resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + for-each: 0.3.5 + gopd: 1.2.0 + is-typed-array: 1.1.15 + possible-typed-array-names: 1.1.0 + reflect.getprototypeof: 1.0.10 + dev: true + + /typedarray-to-buffer@3.1.5: + resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} + dependencies: + is-typedarray: 1.0.0 + dev: true + + /typescript@5.8.3: + resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==} + engines: {node: '>=14.17'} + hasBin: true + dev: true + + /typical@4.0.0: + resolution: {integrity: sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==} + engines: {node: '>=8'} + dev: true + + /typical@5.2.0: + resolution: {integrity: sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==} + engines: {node: '>=8'} + dev: true + + /ultron@1.1.1: + resolution: {integrity: sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==} + dev: true + + /unbox-primitive@1.1.0: + resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.4 + has-bigints: 1.1.0 + has-symbols: 1.1.0 + which-boxed-primitive: 1.1.1 + dev: true + + /undici-types@5.26.5: + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + dev: true + + /undici@5.29.0: + resolution: {integrity: sha512-raqeBD6NQK4SkWhQzeYKd1KmIG6dllBOTt55Rmkt4HtI9mwdWtJljnrXjAFUBLTSN67HWrOIZ3EPF4kjUw80Bg==} + engines: {node: '>=14.0'} + dependencies: + '@fastify/busboy': 2.1.1 + dev: true + + /unfetch@4.2.0: + resolution: {integrity: sha512-F9p7yYCn6cIW9El1zi0HI6vqpeIvBsr3dSuRO6Xuppb1u5rXpCPmMvLSyECLhybr9isec8Ohl0hPekMVrEinDA==} + dev: true + + /universalify@0.1.2: + resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} + engines: {node: '>= 4.0.0'} + dev: true + + /universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + dev: true + + /unpipe@1.0.0: + resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} + engines: {node: '>= 0.8'} + dev: true + + /unrs-resolver@1.11.1: + resolution: {integrity: sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg==} + requiresBuild: true + dependencies: + napi-postinstall: 0.3.2 + optionalDependencies: + '@unrs/resolver-binding-android-arm-eabi': 1.11.1 + '@unrs/resolver-binding-android-arm64': 1.11.1 + '@unrs/resolver-binding-darwin-arm64': 1.11.1 + '@unrs/resolver-binding-darwin-x64': 1.11.1 + '@unrs/resolver-binding-freebsd-x64': 1.11.1 + '@unrs/resolver-binding-linux-arm-gnueabihf': 1.11.1 + '@unrs/resolver-binding-linux-arm-musleabihf': 1.11.1 + '@unrs/resolver-binding-linux-arm64-gnu': 1.11.1 + '@unrs/resolver-binding-linux-arm64-musl': 1.11.1 + '@unrs/resolver-binding-linux-ppc64-gnu': 1.11.1 + '@unrs/resolver-binding-linux-riscv64-gnu': 1.11.1 + '@unrs/resolver-binding-linux-riscv64-musl': 1.11.1 + '@unrs/resolver-binding-linux-s390x-gnu': 1.11.1 + '@unrs/resolver-binding-linux-x64-gnu': 1.11.1 + '@unrs/resolver-binding-linux-x64-musl': 1.11.1 + '@unrs/resolver-binding-wasm32-wasi': 1.11.1 + '@unrs/resolver-binding-win32-arm64-msvc': 1.11.1 + '@unrs/resolver-binding-win32-ia32-msvc': 1.11.1 + '@unrs/resolver-binding-win32-x64-msvc': 1.11.1 + dev: true + + /update-browserslist-db@1.1.3(browserslist@4.25.1): + resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + dependencies: + browserslist: 4.25.1 + escalade: 3.2.0 + picocolors: 1.1.1 + dev: true + + /uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + dependencies: + punycode: 2.3.1 + dev: true + + /url-set-query@1.0.0: + resolution: {integrity: sha512-3AChu4NiXquPfeckE5R5cGdiHCMWJx1dwCWOmWIL4KHAziJNOFIYJlpGFeKDvwLPHovZRCxK3cYlwzqI9Vp+Gg==} + dev: true + + /url@0.11.4: + resolution: {integrity: sha512-oCwdVC7mTuWiPyjLUz/COz5TLk6wgp0RCsN+wHZ2Ekneac9w8uuV0njcbbie2ME+Vs+d6duwmYuR3HgQXs1fOg==} + engines: {node: '>= 0.4'} + dependencies: + punycode: 1.4.1 + qs: 6.14.0 + dev: true + + /utf-8-validate@5.0.10: + resolution: {integrity: sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==} + engines: {node: '>=6.14.2'} + requiresBuild: true + dependencies: + node-gyp-build: 4.8.4 + dev: true + + /utf-8-validate@5.0.7: + resolution: {integrity: sha512-vLt1O5Pp+flcArHGIyKEQq883nBt8nN8tVBcoL0qUXj2XT1n7p70yGIq2VK98I5FdZ1YHc0wk/koOnHjnXWk1Q==} + engines: {node: '>=6.14.2'} + requiresBuild: true + dependencies: + node-gyp-build: 4.8.4 + dev: true + optional: true + + /utf8@3.0.0: + resolution: {integrity: sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ==} + dev: true + + /util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + dev: true + + /util@0.12.5: + resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==} + dependencies: + inherits: 2.0.4 + is-arguments: 1.2.0 + is-generator-function: 1.1.0 + is-typed-array: 1.1.15 + which-typed-array: 1.1.19 + dev: true + + /utils-merge@1.0.1: + resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} + engines: {node: '>= 0.4.0'} + dev: true + + /uuid@3.4.0: + resolution: {integrity: sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==} + deprecated: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details. + hasBin: true + dev: true + + /uuid@8.3.2: + resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} + hasBin: true + dev: true + + /uuid@9.0.1: + resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} + hasBin: true + dev: true + + /v8-compile-cache-lib@3.0.1: + resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} + dev: true + + /validate-npm-package-license@3.0.4: + resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + dependencies: + spdx-correct: 3.2.0 + spdx-expression-parse: 3.0.1 + dev: true + + /varint@5.0.2: + resolution: {integrity: sha512-lKxKYG6H03yCZUpAGOPOsMcGxd1RHCu1iKvEHYDPmTyq2HueGhD73ssNBqqQWfvYs04G9iUFRvmAVLW20Jw6ow==} + dev: true + + /vary@1.1.2: + resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} + engines: {node: '>= 0.8'} + dev: true + + /verror@1.10.0: + resolution: {integrity: sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==} + engines: {'0': node >=0.6.0} + dependencies: + assert-plus: 1.0.0 + core-util-is: 1.0.2 + extsprintf: 1.3.0 + dev: true + + /web3-bzz@1.10.4: + resolution: {integrity: sha512-ZZ/X4sJ0Uh2teU9lAGNS8EjveEppoHNQiKlOXAjedsrdWuaMErBPdLQjXfcrYvN6WM6Su9PMsAxf3FXXZ+HwQw==} + engines: {node: '>=8.0.0'} + requiresBuild: true + dependencies: + '@types/node': 12.20.55 + got: 12.1.0 + swarm-js: 0.1.42 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: true + + /web3-core-helpers@1.10.4: + resolution: {integrity: sha512-r+L5ylA17JlD1vwS8rjhWr0qg7zVoVMDvWhajWA5r5+USdh91jRUYosp19Kd1m2vE034v7Dfqe1xYRoH2zvG0g==} + engines: {node: '>=8.0.0'} + dependencies: + web3-eth-iban: 1.10.4 + web3-utils: 1.10.4 + dev: true + + /web3-core-method@1.10.4: + resolution: {integrity: sha512-uZTb7flr+Xl6LaDsyTeE2L1TylokCJwTDrIVfIfnrGmnwLc6bmTWCCrm71sSrQ0hqs6vp/MKbQYIYqUN0J8WyA==} + engines: {node: '>=8.0.0'} + dependencies: + '@ethersproject/transactions': 5.8.0 + web3-core-helpers: 1.10.4 + web3-core-promievent: 1.10.4 + web3-core-subscriptions: 1.10.4 + web3-utils: 1.10.4 + dev: true + + /web3-core-promievent@1.10.4: + resolution: {integrity: sha512-2de5WnJQ72YcIhYwV/jHLc4/cWJnznuoGTJGD29ncFQHAfwW/MItHFSVKPPA5v8AhJe+r6y4Y12EKvZKjQVBvQ==} + engines: {node: '>=8.0.0'} + dependencies: + eventemitter3: 4.0.4 + dev: true + + /web3-core-requestmanager@1.10.4: + resolution: {integrity: sha512-vqP6pKH8RrhT/2MoaU+DY/OsYK9h7HmEBNCdoMj+4ZwujQtw/Mq2JifjwsJ7gits7Q+HWJwx8q6WmQoVZAWugg==} + engines: {node: '>=8.0.0'} + dependencies: + util: 0.12.5 + web3-core-helpers: 1.10.4 + web3-providers-http: 1.10.4 + web3-providers-ipc: 1.10.4 + web3-providers-ws: 1.10.4 + transitivePeerDependencies: + - encoding + - supports-color + dev: true + + /web3-core-subscriptions@1.10.4: + resolution: {integrity: sha512-o0lSQo/N/f7/L76C0HV63+S54loXiE9fUPfHFcTtpJRQNDBVsSDdWRdePbWwR206XlsBqD5VHApck1//jEafTw==} + engines: {node: '>=8.0.0'} + dependencies: + eventemitter3: 4.0.4 + web3-core-helpers: 1.10.4 + dev: true + + /web3-core@1.10.4: + resolution: {integrity: sha512-B6elffYm81MYZDTrat7aEhnhdtVE3lDBUZft16Z8awYMZYJDbnykEbJVS+l3mnA7AQTnSDr/1MjWofGDLBJPww==} + engines: {node: '>=8.0.0'} + dependencies: + '@types/bn.js': 5.2.0 + '@types/node': 12.20.55 + bignumber.js: 9.3.1 + web3-core-helpers: 1.10.4 + web3-core-method: 1.10.4 + web3-core-requestmanager: 1.10.4 + web3-utils: 1.10.4 + transitivePeerDependencies: + - encoding + - supports-color + dev: true + + /web3-eth-abi@1.10.4: + resolution: {integrity: sha512-cZ0q65eJIkd/jyOlQPDjr8X4fU6CRL1eWgdLwbWEpo++MPU/2P4PFk5ZLAdye9T5Sdp+MomePPJ/gHjLMj2VfQ==} + engines: {node: '>=8.0.0'} + dependencies: + '@ethersproject/abi': 5.8.0 + web3-utils: 1.10.4 + dev: true + + /web3-eth-accounts@1.10.4: + resolution: {integrity: sha512-ysy5sVTg9snYS7tJjxVoQAH6DTOTkRGR8emEVCWNGLGiB9txj+qDvSeT0izjurS/g7D5xlMAgrEHLK1Vi6I3yg==} + engines: {node: '>=8.0.0'} + dependencies: + '@ethereumjs/common': 2.6.5 + '@ethereumjs/tx': 3.5.2 + '@ethereumjs/util': 8.1.0 + eth-lib: 0.2.8 + scrypt-js: 3.0.1 + uuid: 9.0.1 + web3-core: 1.10.4 + web3-core-helpers: 1.10.4 + web3-core-method: 1.10.4 + web3-utils: 1.10.4 + transitivePeerDependencies: + - encoding + - supports-color + dev: true + + /web3-eth-contract@1.10.4: + resolution: {integrity: sha512-Q8PfolOJ4eV9TvnTj1TGdZ4RarpSLmHnUnzVxZ/6/NiTfe4maJz99R0ISgwZkntLhLRtw0C7LRJuklzGYCNN3A==} + engines: {node: '>=8.0.0'} + dependencies: + '@types/bn.js': 5.2.0 + web3-core: 1.10.4 + web3-core-helpers: 1.10.4 + web3-core-method: 1.10.4 + web3-core-promievent: 1.10.4 + web3-core-subscriptions: 1.10.4 + web3-eth-abi: 1.10.4 + web3-utils: 1.10.4 + transitivePeerDependencies: + - encoding + - supports-color + dev: true + + /web3-eth-ens@1.10.4: + resolution: {integrity: sha512-LLrvxuFeVooRVZ9e5T6OWKVflHPFgrVjJ/jtisRWcmI7KN/b64+D/wJzXqgmp6CNsMQcE7rpmf4CQmJCrTdsgg==} + engines: {node: '>=8.0.0'} + dependencies: + content-hash: 2.5.2 + eth-ens-namehash: 2.0.8 + web3-core: 1.10.4 + web3-core-helpers: 1.10.4 + web3-core-promievent: 1.10.4 + web3-eth-abi: 1.10.4 + web3-eth-contract: 1.10.4 + web3-utils: 1.10.4 + transitivePeerDependencies: + - encoding + - supports-color + dev: true + + /web3-eth-iban@1.10.4: + resolution: {integrity: sha512-0gE5iNmOkmtBmbKH2aTodeompnNE8jEyvwFJ6s/AF6jkw9ky9Op9cqfzS56AYAbrqEFuClsqB/AoRves7LDELw==} + engines: {node: '>=8.0.0'} + dependencies: + bn.js: 5.2.2 + web3-utils: 1.10.4 + dev: true + + /web3-eth-personal@1.10.4: + resolution: {integrity: sha512-BRa/hs6jU1hKHz+AC/YkM71RP3f0Yci1dPk4paOic53R4ZZG4MgwKRkJhgt3/GPuPliwS46f/i5A7fEGBT4F9w==} + engines: {node: '>=8.0.0'} + dependencies: + '@types/node': 12.20.55 + web3-core: 1.10.4 + web3-core-helpers: 1.10.4 + web3-core-method: 1.10.4 + web3-net: 1.10.4 + web3-utils: 1.10.4 + transitivePeerDependencies: + - encoding + - supports-color + dev: true + + /web3-eth@1.10.4: + resolution: {integrity: sha512-Sql2kYKmgt+T/cgvg7b9ce24uLS7xbFrxE4kuuor1zSCGrjhTJ5rRNG8gTJUkAJGKJc7KgnWmgW+cOfMBPUDSA==} + engines: {node: '>=8.0.0'} + dependencies: + web3-core: 1.10.4 + web3-core-helpers: 1.10.4 + web3-core-method: 1.10.4 + web3-core-subscriptions: 1.10.4 + web3-eth-abi: 1.10.4 + web3-eth-accounts: 1.10.4 + web3-eth-contract: 1.10.4 + web3-eth-ens: 1.10.4 + web3-eth-iban: 1.10.4 + web3-eth-personal: 1.10.4 + web3-net: 1.10.4 + web3-utils: 1.10.4 + transitivePeerDependencies: + - encoding + - supports-color + dev: true + + /web3-net@1.10.4: + resolution: {integrity: sha512-mKINnhOOnZ4koA+yV2OT5s5ztVjIx7IY9a03w6s+yao/BUn+Luuty0/keNemZxTr1E8Ehvtn28vbOtW7Ids+Ow==} + engines: {node: '>=8.0.0'} + dependencies: + web3-core: 1.10.4 + web3-core-method: 1.10.4 + web3-utils: 1.10.4 + transitivePeerDependencies: + - encoding + - supports-color + dev: true + + /web3-providers-http@1.10.4: + resolution: {integrity: sha512-m2P5Idc8hdiO0l60O6DSCPw0kw64Zgi0pMjbEFRmxKIck2Py57RQMu4bxvkxJwkF06SlGaEQF8rFZBmuX7aagQ==} + engines: {node: '>=8.0.0'} + dependencies: + abortcontroller-polyfill: 1.7.8 + cross-fetch: 4.1.0 + es6-promise: 4.2.8 + web3-core-helpers: 1.10.4 + transitivePeerDependencies: + - encoding + dev: true + + /web3-providers-ipc@1.10.4: + resolution: {integrity: sha512-YRF/bpQk9z3WwjT+A6FI/GmWRCASgd+gC0si7f9zbBWLXjwzYAKG73bQBaFRAHex1hl4CVcM5WUMaQXf3Opeuw==} + engines: {node: '>=8.0.0'} + dependencies: + oboe: 2.1.5 + web3-core-helpers: 1.10.4 + dev: true + + /web3-providers-ws@1.10.4: + resolution: {integrity: sha512-j3FBMifyuFFmUIPVQR4pj+t5ILhAexAui0opgcpu9R5LxQrLRUZxHSnU+YO25UycSOa/NAX8A+qkqZNpcFAlxA==} + engines: {node: '>=8.0.0'} + dependencies: + eventemitter3: 4.0.4 + web3-core-helpers: 1.10.4 + websocket: 1.0.35 + transitivePeerDependencies: + - supports-color + dev: true + + /web3-shh@1.10.4: + resolution: {integrity: sha512-cOH6iFFM71lCNwSQrC3niqDXagMqrdfFW85hC9PFUrAr3PUrIem8TNstTc3xna2bwZeWG6OBy99xSIhBvyIACw==} + engines: {node: '>=8.0.0'} + requiresBuild: true + dependencies: + web3-core: 1.10.4 + web3-core-method: 1.10.4 + web3-core-subscriptions: 1.10.4 + web3-net: 1.10.4 + transitivePeerDependencies: + - encoding + - supports-color + dev: true + + /web3-utils@1.10.4: + resolution: {integrity: sha512-tsu8FiKJLk2PzhDl9fXbGUWTkkVXYhtTA+SmEFkKft+9BgwLxfCRpU96sWv7ICC8zixBNd3JURVoiR3dUXgP8A==} + engines: {node: '>=8.0.0'} + dependencies: + '@ethereumjs/util': 8.1.0 + bn.js: 5.2.2 + ethereum-bloom-filters: 1.2.0 + ethereum-cryptography: 2.2.1 + ethjs-unit: 0.1.6 + number-to-bn: 1.7.0 + randombytes: 2.1.0 + utf8: 3.0.0 + dev: true + + /web3@1.10.4: + resolution: {integrity: sha512-kgJvQZjkmjOEKimx/tJQsqWfRDPTTcBfYPa9XletxuHLpHcXdx67w8EFn5AW3eVxCutE9dTVHgGa9VYe8vgsEA==} + engines: {node: '>=8.0.0'} + requiresBuild: true + dependencies: + web3-bzz: 1.10.4 + web3-core: 1.10.4 + web3-eth: 1.10.4 + web3-eth-personal: 1.10.4 + web3-net: 1.10.4 + web3-shh: 1.10.4 + web3-utils: 1.10.4 + transitivePeerDependencies: + - bufferutil + - encoding + - supports-color + - utf-8-validate + dev: true + + /webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + dev: true + + /websocket@1.0.35: + resolution: {integrity: sha512-/REy6amwPZl44DDzvRCkaI1q1bIiQB0mEFQLUrhz3z2EK91cp3n72rAjUlrTP0zV22HJIUOVHQGPxhFRjxjt+Q==} + engines: {node: '>=4.0.0'} + dependencies: + bufferutil: 4.0.9 + debug: 2.6.9 + es5-ext: 0.10.64 + typedarray-to-buffer: 3.1.5 + utf-8-validate: 5.0.10 + yaeti: 0.0.6 + transitivePeerDependencies: + - supports-color + dev: true + + /whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + dev: true + + /which-boxed-primitive@1.1.1: + resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} + engines: {node: '>= 0.4'} + dependencies: + is-bigint: 1.1.0 + is-boolean-object: 1.2.2 + is-number-object: 1.1.1 + is-string: 1.1.1 + is-symbol: 1.1.1 + dev: true + + /which-builtin-type@1.2.1: + resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.4 + function.prototype.name: 1.1.8 + has-tostringtag: 1.0.2 + is-async-function: 2.1.1 + is-date-object: 1.1.0 + is-finalizationregistry: 1.1.1 + is-generator-function: 1.1.0 + is-regex: 1.2.1 + is-weakref: 1.1.1 + isarray: 2.0.5 + which-boxed-primitive: 1.1.1 + which-collection: 1.0.2 + which-typed-array: 1.1.19 + dev: true + + /which-collection@1.0.2: + resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} + engines: {node: '>= 0.4'} + dependencies: + is-map: 2.0.3 + is-set: 2.0.3 + is-weakmap: 2.0.2 + is-weakset: 2.0.4 + dev: true + + /which-module@1.0.0: + resolution: {integrity: sha512-F6+WgncZi/mJDrammbTuHe1q0R5hOXv/mBaiNA2TCNT/LTHusX0V+CJnj9XT8ki5ln2UZyyddDgHfCzyrOH7MQ==} + dev: true + + /which-typed-array@1.1.19: + resolution: {integrity: sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==} + engines: {node: '>= 0.4'} + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.4 + for-each: 0.3.5 + get-proto: 1.0.1 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + dev: true + + /which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + dependencies: + isexe: 2.0.0 + dev: true + + /widest-line@3.1.0: + resolution: {integrity: sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==} + engines: {node: '>=8'} + dependencies: + string-width: 4.2.3 + dev: true + + /window-size@0.2.0: + resolution: {integrity: sha512-UD7d8HFA2+PZsbKyaOCEy8gMh1oDtHgJh1LfgjQ4zVXmYjAT/kvz3PueITKuqDiIXQe7yzpPnxX3lNc+AhQMyw==} + engines: {node: '>= 0.10.0'} + hasBin: true + dev: true + + /winston-transport@4.9.0: + resolution: {integrity: sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A==} + engines: {node: '>= 12.0.0'} + dependencies: + logform: 2.7.0 + readable-stream: 3.6.2 + triple-beam: 1.4.1 + dev: true + + /winston@3.17.0: + resolution: {integrity: sha512-DLiFIXYC5fMPxaRg832S6F5mJYvePtmO5G9v9IgUFPhXm9/GkXarH/TUrBAVzhTCzAj9anE/+GjrgXp/54nOgw==} + engines: {node: '>= 12.0.0'} + dependencies: + '@colors/colors': 1.6.0 + '@dabh/diagnostics': 2.0.3 + async: 3.2.6 + is-stream: 2.0.1 + logform: 2.7.0 + one-time: 1.0.0 + readable-stream: 3.6.2 + safe-stable-stringify: 2.5.0 + stack-trace: 0.0.10 + triple-beam: 1.4.1 + winston-transport: 4.9.0 + dev: true + + /word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + dev: true + + /wordwrapjs@4.0.1: + resolution: {integrity: sha512-kKlNACbvHrkpIw6oPeYDSmdCTu2hdMHoyXLTcUKala++lx5Y+wjJ/e474Jqv5abnVmwxw08DiTuHmw69lJGksA==} + engines: {node: '>=8.0.0'} + dependencies: + reduce-flatten: 2.0.0 + typical: 5.2.0 + dev: true + + /workerpool@6.5.1: + resolution: {integrity: sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA==} + dev: true + + /wrap-ansi@2.1.0: + resolution: {integrity: sha512-vAaEaDM946gbNpH5pLVNR+vX2ht6n0Bt3GXwVB1AuAqZosOvHNF3P7wDnh8KLkSqgUh0uh77le7Owgoz+Z9XBw==} + engines: {node: '>=0.10.0'} + dependencies: + string-width: 1.0.2 + strip-ansi: 3.0.1 + dev: true + + /wrap-ansi@6.2.0: + resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} + engines: {node: '>=8'} + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + dev: true + + /wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + dev: true + + /wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + dev: true + + /ws@3.3.3: + resolution: {integrity: sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + dependencies: + async-limiter: 1.0.1 + safe-buffer: 5.1.2 + ultron: 1.1.1 + dev: true + + /ws@7.5.10: + resolution: {integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==} + engines: {node: '>=8.3.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + dev: true + + /ws@8.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 + dev: true + + /xhr-request-promise@0.1.3: + resolution: {integrity: sha512-YUBytBsuwgitWtdRzXDDkWAXzhdGB8bYm0sSzMPZT7Z2MBjMSTHFsyCT1yCRATY+XC69DUrQraRAEgcoCRaIPg==} + dependencies: + xhr-request: 1.1.0 + dev: true + + /xhr-request@1.1.0: + resolution: {integrity: sha512-Y7qzEaR3FDtL3fP30k9wO/e+FBnBByZeybKOhASsGP30NIkRAAkKD/sCnLvgEfAIEC1rcmK7YG8f4oEnIrrWzA==} + dependencies: + buffer-to-arraybuffer: 0.0.5 + object-assign: 4.1.1 + query-string: 5.1.1 + simple-get: 2.8.2 + timed-out: 4.0.1 + url-set-query: 1.0.0 + xhr: 2.6.0 + dev: true + + /xhr@2.6.0: + resolution: {integrity: sha512-/eCGLb5rxjx5e3mF1A7s+pLlR6CGyqWN91fv1JgER5mVWg1MZmlhBvy9kjcsOdRk8RrIujotWyJamfyrp+WIcA==} + dependencies: + global: 4.4.0 + is-function: 1.0.2 + parse-headers: 2.0.6 + xtend: 4.0.2 + dev: true + + /xtend@4.0.2: + resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} + engines: {node: '>=0.4'} + dev: true + + /y18n@3.2.2: + resolution: {integrity: sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==} + dev: true + + /y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + dev: true + + /yaeti@0.0.6: + resolution: {integrity: sha512-MvQa//+KcZCUkBTIC9blM+CU9J2GzuTytsOUwf2lidtvkx/6gnEp1QvJv34t9vdjhFmha/mUiNDbN0D0mJWdug==} + engines: {node: '>=0.10.32'} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. + dev: true + + /yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + dev: true + + /yargs-parser@2.4.1: + resolution: {integrity: sha512-9pIKIJhnI5tonzG6OnCFlz/yln8xHYcGl+pn3xR0Vzff0vzN1PbNRaelgfgRUwZ3s4i3jvxT9WhmUGL4whnasA==} + dependencies: + camelcase: 3.0.0 + lodash.assign: 4.2.0 + dev: true + + /yargs-parser@20.2.9: + resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} + engines: {node: '>=10'} + dev: true + + /yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + dev: true + + /yargs-unparser@2.0.0: + resolution: {integrity: sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==} + engines: {node: '>=10'} + dependencies: + camelcase: 6.3.0 + decamelize: 4.0.0 + flat: 5.0.2 + is-plain-obj: 2.1.0 + dev: true + + /yargs@16.2.0: + resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} + engines: {node: '>=10'} + dependencies: + cliui: 7.0.4 + escalade: 3.2.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 20.2.9 + dev: true + + /yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + dependencies: + cliui: 8.0.1 + escalade: 3.2.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + dev: true + + /yargs@4.8.1: + resolution: {integrity: sha512-LqodLrnIDM3IFT+Hf/5sxBnEGECrfdC1uIbgZeJmESCSo4HoCAaKEus8MylXHAkdacGc0ye+Qa+dpkuom8uVYA==} + dependencies: + cliui: 3.2.0 + decamelize: 1.2.0 + get-caller-file: 1.0.3 + lodash.assign: 4.2.0 + os-locale: 1.4.0 + read-pkg-up: 1.0.1 + require-directory: 2.1.1 + require-main-filename: 1.0.1 + set-blocking: 2.0.0 + string-width: 1.0.2 + which-module: 1.0.0 + window-size: 0.2.0 + y18n: 3.2.2 + yargs-parser: 2.4.1 + dev: true + + /yn@3.1.1: + resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} + engines: {node: '>=6'} + dev: true + + /yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + dev: true + + /yoga-layout-prebuilt@1.10.0: + resolution: {integrity: sha512-YnOmtSbv4MTf7RGJMK0FvZ+KD8OEe/J5BNnR0GHhD8J/XcG/Qvxgszm0Un6FTHWW4uHlTgP0IztiXQnGyIR45g==} + engines: {node: '>=8'} + dependencies: + '@types/yoga-layout': 1.9.2 + dev: true + + /zksync-ethers@5.10.0(ethers@5.8.0): + resolution: {integrity: sha512-OAjTGAHF9wbdkRGkj7XZuF/a1Sk/FVbwH4pmLjAKlR7mJ7sQtQhBhrPU2dCc67xLaNvEESPfwil19ES5wooYFg==} + engines: {node: '>=16.0.0'} + peerDependencies: + ethers: ^5.7.2 + dependencies: + ethers: 5.8.0 + dev: true + + /zksync-web3@0.14.4(ethers@5.8.0): + resolution: {integrity: sha512-kYehMD/S6Uhe1g434UnaMN+sBr9nQm23Ywn0EUP5BfQCsbjcr3ORuS68PosZw8xUTu3pac7G6YMSnNHk+fwzvg==} + deprecated: This package has been deprecated in favor of zksync-ethers@5.0.0 + peerDependencies: + ethers: ^5.7.2 + dependencies: + ethers: 5.8.0 + dev: true + + /zod@3.25.76: + resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} + dev: true From 2c7855449434c6f92b60d0555483dcfa72e81c7f Mon Sep 17 00:00:00 2001 From: ravinagill15 Date: Fri, 18 Jul 2025 14:27:26 -0700 Subject: [PATCH 13/20] pointing to correct test directory --- plume-oft-adapter-migration/foundry.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plume-oft-adapter-migration/foundry.toml b/plume-oft-adapter-migration/foundry.toml index 325211b4..3a93818b 100644 --- a/plume-oft-adapter-migration/foundry.toml +++ b/plume-oft-adapter-migration/foundry.toml @@ -2,7 +2,7 @@ solc-version = '0.8.22' src = 'contracts' out = 'out' -test = 'test/foundry' +test = 'test' cache_path = 'cache/foundry' optimizer = true optimizer_runs = 20_000 From 2c8ad0e65eb22aa174f23bcea5d45798b27a3db1 Mon Sep 17 00:00:00 2001 From: ravinagill15 Date: Fri, 18 Jul 2025 14:39:53 -0700 Subject: [PATCH 14/20] tests now pass after integrating ozv5 changes and updating imports --- .../test/bridge/AbsBridge.sol | 8 +++---- .../test/bridge/ERC20Bridge.sol | 2 +- .../test/bridge/IEthBridge.sol | 4 ++-- .../test/bridge/IInbox.sol | 2 +- .../test/bridge/IInboxBase.sol | 2 +- .../test/bridge/ISequencerInbox.sol | 2 +- .../test/mocks/BridgeStub.sol | 2 +- .../test/mocks/GasToken.sol | 6 ++--- .../test/mocks/InboxStub.sol | 2 +- .../MockArbNativeOFTAdapterUpgradeable.sol | 18 ++++++++------ .../test/mocks/MockOFT.sol | 4 ++-- .../test/mocks/RollupStub.sol | 2 +- .../test/mocks/UpgradeExecutorMock.sol | 24 +++++++------------ 13 files changed, 36 insertions(+), 42 deletions(-) diff --git a/plume-oft-adapter-migration/test/bridge/AbsBridge.sol b/plume-oft-adapter-migration/test/bridge/AbsBridge.sol index bafd56f9..4d34dac9 100644 --- a/plume-oft-adapter-migration/test/bridge/AbsBridge.sol +++ b/plume-oft-adapter-migration/test/bridge/AbsBridge.sol @@ -5,7 +5,7 @@ pragma solidity ^0.8.4; import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; -import "@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol"; +import "@openzeppelin/contracts/utils/Address.sol"; import { NotContract, @@ -16,7 +16,7 @@ import { InvalidOutboxSet, BadSequencerMessageNumber } from "../libraries/Error.sol"; -import "./IBridge.sol"; +import "../../../contracts/ethereum/bridge/IBridge.sol"; import "./Messages.sol"; import "../libraries/DelegateCallAware.sol"; @@ -29,7 +29,7 @@ import {L1MessageType_batchPostingReport} from "../libraries/MessageTypes.sol"; * outboxes that can make calls from here and withdraw this escrow. */ abstract contract AbsBridge is Initializable, DelegateCallAware, IBridge { - using AddressUpgradeable for address; + using Address for address; struct InOutInfo { uint256 index; @@ -213,7 +213,7 @@ abstract contract AbsBridge is Initializable, DelegateCallAware, IBridge { bytes calldata data ) external returns (bool success, bytes memory returnData) { if (!allowedOutboxes(msg.sender)) revert NotOutbox(msg.sender); - if (data.length > 0 && !to.isContract()) revert NotContract(to); + if (data.length > 0 && to.code.length == 0) revert NotContract(to); address prevOutbox = _activeOutbox; _activeOutbox = msg.sender; // We set and reset active outbox around external call so activeOutbox remains valid during call diff --git a/plume-oft-adapter-migration/test/bridge/ERC20Bridge.sol b/plume-oft-adapter-migration/test/bridge/ERC20Bridge.sol index c67e1ba0..3109154f 100644 --- a/plume-oft-adapter-migration/test/bridge/ERC20Bridge.sol +++ b/plume-oft-adapter-migration/test/bridge/ERC20Bridge.sol @@ -5,7 +5,7 @@ pragma solidity ^0.8.4; import "./AbsBridge.sol"; -import "./IERC20Bridge.sol"; +import "../../../contracts/ethereum/bridge/IERC20Bridge.sol"; import "../libraries/AddressAliasHelper.sol"; import {InvalidTokenSet, CallTargetNotAllowed, CallNotAllowed} from "../libraries/Error.sol"; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; diff --git a/plume-oft-adapter-migration/test/bridge/IEthBridge.sol b/plume-oft-adapter-migration/test/bridge/IEthBridge.sol index aa52d75c..ff13faa4 100644 --- a/plume-oft-adapter-migration/test/bridge/IEthBridge.sol +++ b/plume-oft-adapter-migration/test/bridge/IEthBridge.sol @@ -5,8 +5,8 @@ // solhint-disable-next-line compiler-version pragma solidity >=0.6.9 <0.9.0; -import "./IOwnable.sol"; -import "./IBridge.sol"; +import "../../../contracts/ethereum/bridge/IOwnable.sol"; +import "../../../contracts/ethereum/bridge/IBridge.sol"; interface IEthBridge is IBridge { /** diff --git a/plume-oft-adapter-migration/test/bridge/IInbox.sol b/plume-oft-adapter-migration/test/bridge/IInbox.sol index 2c7672d7..54278431 100644 --- a/plume-oft-adapter-migration/test/bridge/IInbox.sol +++ b/plume-oft-adapter-migration/test/bridge/IInbox.sol @@ -5,7 +5,7 @@ // solhint-disable-next-line compiler-version pragma solidity >=0.6.9 <0.9.0; -import "./IBridge.sol"; +import "../../../contracts/ethereum/bridge/IBridge.sol"; import "./IInboxBase.sol"; interface IInbox is IInboxBase { diff --git a/plume-oft-adapter-migration/test/bridge/IInboxBase.sol b/plume-oft-adapter-migration/test/bridge/IInboxBase.sol index c9775a36..eb56cd96 100644 --- a/plume-oft-adapter-migration/test/bridge/IInboxBase.sol +++ b/plume-oft-adapter-migration/test/bridge/IInboxBase.sol @@ -5,7 +5,7 @@ // solhint-disable-next-line compiler-version pragma solidity >=0.6.9 <0.9.0; -import "./IBridge.sol"; +import "../../../contracts/ethereum/bridge/IBridge.sol"; import "./IDelayedMessageProvider.sol"; import "./ISequencerInbox.sol"; diff --git a/plume-oft-adapter-migration/test/bridge/ISequencerInbox.sol b/plume-oft-adapter-migration/test/bridge/ISequencerInbox.sol index 47db30f0..a0f51b8b 100644 --- a/plume-oft-adapter-migration/test/bridge/ISequencerInbox.sol +++ b/plume-oft-adapter-migration/test/bridge/ISequencerInbox.sol @@ -8,7 +8,7 @@ pragma experimental ABIEncoderV2; import "../libraries/IGasRefunder.sol"; import "./IDelayedMessageProvider.sol"; -import "./IBridge.sol"; +import "../../../contracts/ethereum/bridge/IBridge.sol"; interface ISequencerInbox is IDelayedMessageProvider { struct MaxTimeVariation { diff --git a/plume-oft-adapter-migration/test/mocks/BridgeStub.sol b/plume-oft-adapter-migration/test/mocks/BridgeStub.sol index 7ba6e0bd..97f30314 100644 --- a/plume-oft-adapter-migration/test/mocks/BridgeStub.sol +++ b/plume-oft-adapter-migration/test/mocks/BridgeStub.sol @@ -7,7 +7,7 @@ pragma solidity ^0.8.0; import "./InboxStub.sol"; import {BadSequencerMessageNumber} from "../libraries/Error.sol"; -import "../bridge/IBridge.sol"; +import "../../../contracts/ethereum/bridge/IBridge.sol"; import "../bridge/IEthBridge.sol"; contract BridgeStub is IBridge, IEthBridge { diff --git a/plume-oft-adapter-migration/test/mocks/GasToken.sol b/plume-oft-adapter-migration/test/mocks/GasToken.sol index 5d33053a..2dfb07d8 100644 --- a/plume-oft-adapter-migration/test/mocks/GasToken.sol +++ b/plume-oft-adapter-migration/test/mocks/GasToken.sol @@ -4,11 +4,9 @@ import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; contract GasToken is ERC20, Ownable { - constructor(string memory name_, string memory symbol_) - ERC20(name_, symbol_) - {} + constructor(string memory name_, string memory symbol_) ERC20(name_, symbol_) Ownable(msg.sender) {} function mint(address to, uint256 amount) public onlyOwner { _mint(to, amount); } -} \ No newline at end of file +} diff --git a/plume-oft-adapter-migration/test/mocks/InboxStub.sol b/plume-oft-adapter-migration/test/mocks/InboxStub.sol index 182dda67..514cb527 100644 --- a/plume-oft-adapter-migration/test/mocks/InboxStub.sol +++ b/plume-oft-adapter-migration/test/mocks/InboxStub.sol @@ -6,7 +6,7 @@ pragma solidity ^0.8.0; import "../bridge/IInboxBase.sol"; import "../bridge/IInbox.sol"; -import "../bridge/IBridge.sol"; +import "../../../contracts/ethereum/bridge/IBridge.sol"; import "../bridge/IEthBridge.sol"; import "../bridge/Messages.sol"; diff --git a/plume-oft-adapter-migration/test/mocks/MockArbNativeOFTAdapterUpgradeable.sol b/plume-oft-adapter-migration/test/mocks/MockArbNativeOFTAdapterUpgradeable.sol index 9cc6b111..8924c9d7 100644 --- a/plume-oft-adapter-migration/test/mocks/MockArbNativeOFTAdapterUpgradeable.sol +++ b/plume-oft-adapter-migration/test/mocks/MockArbNativeOFTAdapterUpgradeable.sol @@ -1,30 +1,34 @@ // SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.22; -import { ArbNativeOFTAdapterUpgradeable } from "../../src/L3/ArbNativeOFTAdapterUpgradeable.sol"; +import { ArbNativeOFTAdapterUpgradeable } from "../../../contracts/plume/ArbNativeOFTAdapterUpgradeable.sol"; contract MockArbNativeOFTAdapterUpgradeable is ArbNativeOFTAdapterUpgradeable { /** * @param _localDecimals The decimals of the native on the local chain (this chain). 18 on ETH. * @param _lzEndpoint The LayerZero endpoint address. - * @param _delegate The delegate capable of making OApp configurations inside of the endpoint. */ constructor( uint8 _localDecimals, - address _lzEndpoint, - address _delegate - ) ArbNativeOFTAdapter(_localDecimals, _lzEndpoint, _delegate) {} + address _lzEndpoint + ) ArbNativeOFTAdapterUpgradeable(_localDecimals, _lzEndpoint) {} + + function initialize(address _delegate) public initializer { + __NativeOFTAdapter_init(_delegate); + __Ownable_init(_delegate); + } // @dev expose internal functions for testing purposes function debit( + address _from, uint256 _amountToSendLD, uint256 _minAmountToCreditLD, uint32 _dstEid ) public returns (uint256 amountDebitedLD, uint256 amountToCreditLD) { - return _debit(_amountToSendLD, _minAmountToCreditLD, _dstEid); + return _debit(_from, _amountToSendLD, _minAmountToCreditLD, _dstEid); } function credit(address _to, uint256 _amountToCreditLD, uint32 _srcEid) public returns (uint256 amountReceivedLD) { return _credit(_to, _amountToCreditLD, _srcEid); } -} \ No newline at end of file +} diff --git a/plume-oft-adapter-migration/test/mocks/MockOFT.sol b/plume-oft-adapter-migration/test/mocks/MockOFT.sol index bba6055c..786d2d82 100644 --- a/plume-oft-adapter-migration/test/mocks/MockOFT.sol +++ b/plume-oft-adapter-migration/test/mocks/MockOFT.sol @@ -2,7 +2,7 @@ pragma solidity ^0.8.22; import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol"; -import { OFT } from "@layerzerolabs/lz-evm-oapp-v2/contracts/oft/OFT.sol"; +import { OFT } from "@layerzerolabs/oft-evm/contracts/OFT.sol"; contract MockOFT is OFT { constructor( @@ -10,7 +10,7 @@ contract MockOFT is OFT { string memory _symbol, address _lzEndpoint, address _delegate - ) OFT(_name, _symbol, _lzEndpoint, _delegate) {} + ) OFT(_name, _symbol, _lzEndpoint, _delegate) Ownable(_delegate) {} function mint(address to, uint256 amount) external { _mint(to, amount); diff --git a/plume-oft-adapter-migration/test/mocks/RollupStub.sol b/plume-oft-adapter-migration/test/mocks/RollupStub.sol index 15344747..efd926c6 100644 --- a/plume-oft-adapter-migration/test/mocks/RollupStub.sol +++ b/plume-oft-adapter-migration/test/mocks/RollupStub.sol @@ -1,6 +1,6 @@ pragma solidity ^0.8.0; -import { IOwnable } from "../bridge/IOwnable.sol"; +import { IOwnable } from "../../../contracts/ethereum/bridge/IOwnable.sol"; contract RollupStub is IOwnable { address public owner; diff --git a/plume-oft-adapter-migration/test/mocks/UpgradeExecutorMock.sol b/plume-oft-adapter-migration/test/mocks/UpgradeExecutorMock.sol index 6b7ca9db..0aa7e155 100644 --- a/plume-oft-adapter-migration/test/mocks/UpgradeExecutorMock.sol +++ b/plume-oft-adapter-migration/test/mocks/UpgradeExecutorMock.sol @@ -1,15 +1,16 @@ // SPDX-License-Identifier: Apache-2.0 pragma solidity ^0.8.0; -import "@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol"; -import "@openzeppelin/contracts/security/ReentrancyGuard.sol"; +import "@openzeppelin/contracts/access/AccessControl.sol"; +import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; +import "@openzeppelin/contracts/utils/ReentrancyGuard.sol"; import "@openzeppelin/contracts/utils/Address.sol"; import "@offchainlabs/upgrade-executor/src/IUpgradeExecutor.sol"; contract UpgradeExecutorMock is Initializable, - AccessControlUpgradeable, + AccessControl, ReentrancyGuard, IUpgradeExecutor { @@ -32,14 +33,12 @@ contract UpgradeExecutorMock is function initialize(address admin, address[] memory executors) public initializer { require(admin != address(0), "UpgradeExecutor: zero admin"); - __AccessControl_init(); - _setRoleAdmin(ADMIN_ROLE, ADMIN_ROLE); _setRoleAdmin(EXECUTOR_ROLE, ADMIN_ROLE); - _setupRole(ADMIN_ROLE, admin); + _grantRole(ADMIN_ROLE, admin); for (uint256 i = 0; i < executors.length; ++i) { - _setupRole(EXECUTOR_ROLE, executors[i]); + _grantRole(EXECUTOR_ROLE, executors[i]); } } @@ -54,10 +53,7 @@ contract UpgradeExecutorMock is nonReentrant { // OZ Address library check if the address is a contract and bubble up inner revert reason - address(upgrade).functionDelegateCall( - upgradeCallData, - "UpgradeExecutor: inner delegate call failed without reason" - ); + address(upgrade).functionDelegateCall(upgradeCallData); emit UpgradeExecuted(upgrade, msg.value, upgradeCallData); } @@ -71,11 +67,7 @@ contract UpgradeExecutorMock is nonReentrant { // OZ Address library check if the address is a contract and bubble up inner revert reason - address(target).functionCallWithValue( - targetCallData, - msg.value, - "UpgradeExecutor: inner call failed without reason" - ); + address(target).functionCallWithValue(targetCallData, msg.value); emit TargetCallExecuted(target, msg.value, targetCallData); } From be3c222eb750553988ae5ff0f99b1d7fffd5e26b Mon Sep 17 00:00:00 2001 From: ravinagill15 Date: Fri, 18 Jul 2025 14:51:53 -0700 Subject: [PATCH 15/20] fixed imports --- .../test/ArbNativeOFTAdapterUpgradeable.t.sol | 2 +- plume-oft-adapter-migration/test/bridge/AbsBridge.sol | 2 +- plume-oft-adapter-migration/test/bridge/ERC20Bridge.sol | 2 +- plume-oft-adapter-migration/test/bridge/IEthBridge.sol | 4 ++-- plume-oft-adapter-migration/test/bridge/IInbox.sol | 2 +- plume-oft-adapter-migration/test/bridge/IInboxBase.sol | 2 +- .../test/bridge/ISequencerInbox.sol | 2 +- plume-oft-adapter-migration/test/eth_plume_flow.t.sol | 8 ++++---- plume-oft-adapter-migration/test/mocks/BridgeStub.sol | 2 +- plume-oft-adapter-migration/test/mocks/InboxStub.sol | 2 +- .../test/mocks/MockArbNativeOFTAdapterUpgradeable.sol | 2 +- plume-oft-adapter-migration/test/mocks/RollupStub.sol | 2 +- 12 files changed, 16 insertions(+), 16 deletions(-) diff --git a/plume-oft-adapter-migration/test/ArbNativeOFTAdapterUpgradeable.t.sol b/plume-oft-adapter-migration/test/ArbNativeOFTAdapterUpgradeable.t.sol index 6ea564fa..6d423f08 100644 --- a/plume-oft-adapter-migration/test/ArbNativeOFTAdapterUpgradeable.t.sol +++ b/plume-oft-adapter-migration/test/ArbNativeOFTAdapterUpgradeable.t.sol @@ -1,7 +1,7 @@ pragma solidity ^0.8.22; import { TestHelperOz5 } from "@layerzerolabs/test-devtools-evm-foundry/contracts/TestHelperOz5.sol"; -import { ArbNativeOFTAdapterUpgradeable } from "../../contracts/plume/ArbNativeOFTAdapterUpgradeable.sol"; +import { ArbNativeOFTAdapterUpgradeable } from "../contracts/plume/ArbNativeOFTAdapterUpgradeable.sol"; import { MockArbNativeOFTAdapterUpgradeable } from "./mocks/MockArbNativeOFTAdapterUpgradeable.sol"; import { MockOFT } from "./mocks/MockOFT.sol"; import { MockNativeTokenManager } from "./mocks/MockNativeTokenManager.sol"; diff --git a/plume-oft-adapter-migration/test/bridge/AbsBridge.sol b/plume-oft-adapter-migration/test/bridge/AbsBridge.sol index 4d34dac9..3b1a1859 100644 --- a/plume-oft-adapter-migration/test/bridge/AbsBridge.sol +++ b/plume-oft-adapter-migration/test/bridge/AbsBridge.sol @@ -16,7 +16,7 @@ import { InvalidOutboxSet, BadSequencerMessageNumber } from "../libraries/Error.sol"; -import "../../../contracts/ethereum/bridge/IBridge.sol"; +import "../../contracts/ethereum/bridge/IBridge.sol"; import "./Messages.sol"; import "../libraries/DelegateCallAware.sol"; diff --git a/plume-oft-adapter-migration/test/bridge/ERC20Bridge.sol b/plume-oft-adapter-migration/test/bridge/ERC20Bridge.sol index 3109154f..85f27274 100644 --- a/plume-oft-adapter-migration/test/bridge/ERC20Bridge.sol +++ b/plume-oft-adapter-migration/test/bridge/ERC20Bridge.sol @@ -5,7 +5,7 @@ pragma solidity ^0.8.4; import "./AbsBridge.sol"; -import "../../../contracts/ethereum/bridge/IERC20Bridge.sol"; +import "../../contracts/ethereum/bridge/IERC20Bridge.sol"; import "../libraries/AddressAliasHelper.sol"; import {InvalidTokenSet, CallTargetNotAllowed, CallNotAllowed} from "../libraries/Error.sol"; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; diff --git a/plume-oft-adapter-migration/test/bridge/IEthBridge.sol b/plume-oft-adapter-migration/test/bridge/IEthBridge.sol index ff13faa4..3127e583 100644 --- a/plume-oft-adapter-migration/test/bridge/IEthBridge.sol +++ b/plume-oft-adapter-migration/test/bridge/IEthBridge.sol @@ -5,8 +5,8 @@ // solhint-disable-next-line compiler-version pragma solidity >=0.6.9 <0.9.0; -import "../../../contracts/ethereum/bridge/IOwnable.sol"; -import "../../../contracts/ethereum/bridge/IBridge.sol"; +import "../../contracts/ethereum/bridge/IOwnable.sol"; +import "../../contracts/ethereum/bridge/IBridge.sol"; interface IEthBridge is IBridge { /** diff --git a/plume-oft-adapter-migration/test/bridge/IInbox.sol b/plume-oft-adapter-migration/test/bridge/IInbox.sol index 54278431..9b00974b 100644 --- a/plume-oft-adapter-migration/test/bridge/IInbox.sol +++ b/plume-oft-adapter-migration/test/bridge/IInbox.sol @@ -5,7 +5,7 @@ // solhint-disable-next-line compiler-version pragma solidity >=0.6.9 <0.9.0; -import "../../../contracts/ethereum/bridge/IBridge.sol"; +import "../../contracts/ethereum/bridge/IBridge.sol"; import "./IInboxBase.sol"; interface IInbox is IInboxBase { diff --git a/plume-oft-adapter-migration/test/bridge/IInboxBase.sol b/plume-oft-adapter-migration/test/bridge/IInboxBase.sol index eb56cd96..55efa217 100644 --- a/plume-oft-adapter-migration/test/bridge/IInboxBase.sol +++ b/plume-oft-adapter-migration/test/bridge/IInboxBase.sol @@ -5,7 +5,7 @@ // solhint-disable-next-line compiler-version pragma solidity >=0.6.9 <0.9.0; -import "../../../contracts/ethereum/bridge/IBridge.sol"; +import "../../contracts/ethereum/bridge/IBridge.sol"; import "./IDelayedMessageProvider.sol"; import "./ISequencerInbox.sol"; diff --git a/plume-oft-adapter-migration/test/bridge/ISequencerInbox.sol b/plume-oft-adapter-migration/test/bridge/ISequencerInbox.sol index a0f51b8b..9db0b05c 100644 --- a/plume-oft-adapter-migration/test/bridge/ISequencerInbox.sol +++ b/plume-oft-adapter-migration/test/bridge/ISequencerInbox.sol @@ -8,7 +8,7 @@ pragma experimental ABIEncoderV2; import "../libraries/IGasRefunder.sol"; import "./IDelayedMessageProvider.sol"; -import "../../../contracts/ethereum/bridge/IBridge.sol"; +import "../../contracts/ethereum/bridge/IBridge.sol"; interface ISequencerInbox is IDelayedMessageProvider { struct MaxTimeVariation { diff --git a/plume-oft-adapter-migration/test/eth_plume_flow.t.sol b/plume-oft-adapter-migration/test/eth_plume_flow.t.sol index 3ae46159..f5f8df51 100644 --- a/plume-oft-adapter-migration/test/eth_plume_flow.t.sol +++ b/plume-oft-adapter-migration/test/eth_plume_flow.t.sol @@ -11,16 +11,16 @@ import { ITransparentUpgradeableProxy, TransparentUpgradeableProxy } from "@open import { IAccessControl } from "@openzeppelin/contracts/access/IAccessControl.sol"; import { GasToken } from "./mocks/GasToken.sol"; -import { OrbitERC20OFTAdapterUpgradeable } from "../../contracts/ethereum/OrbitERC20OFTAdapterUpgradeable.sol"; -import { IBridge } from "../../contracts/ethereum/bridge/IBridge.sol"; +import { OrbitERC20OFTAdapterUpgradeable } from "../contracts/ethereum/OrbitERC20OFTAdapterUpgradeable.sol"; +import { IBridge } from "../contracts/ethereum/bridge/IBridge.sol"; import { ERC20Bridge } from "./bridge/ERC20Bridge.sol"; -import { IOwnable } from "../../contracts/ethereum/bridge/IOwnable.sol"; +import { IOwnable } from "../contracts/ethereum/bridge/IOwnable.sol"; import { ISequencerInbox } from "./bridge/ISequencerInbox.sol"; import { SimpleProxy } from "./mocks/SimpleProxy.sol"; import { BridgeStub } from "./mocks/BridgeStub.sol"; import { RollupStub } from "./mocks/RollupStub.sol"; import { UpgradeExecutorMock } from "./mocks/UpgradeExecutorMock.sol"; -import { OrbitNativeOFTAdapterUpgradeable } from "../../contracts/plume/OrbitNativeOFTAdapterUpgradeable.sol"; +import { OrbitNativeOFTAdapterUpgradeable } from "../contracts/plume/OrbitNativeOFTAdapterUpgradeable.sol"; import { IDelayedMessageProvider } from "./bridge/IDelayedMessageProvider.sol"; import { MockNativeTokenManager } from "./mocks/MockNativeTokenManager.sol"; diff --git a/plume-oft-adapter-migration/test/mocks/BridgeStub.sol b/plume-oft-adapter-migration/test/mocks/BridgeStub.sol index 97f30314..b811ab67 100644 --- a/plume-oft-adapter-migration/test/mocks/BridgeStub.sol +++ b/plume-oft-adapter-migration/test/mocks/BridgeStub.sol @@ -7,7 +7,7 @@ pragma solidity ^0.8.0; import "./InboxStub.sol"; import {BadSequencerMessageNumber} from "../libraries/Error.sol"; -import "../../../contracts/ethereum/bridge/IBridge.sol"; +import "../../contracts/ethereum/bridge/IBridge.sol"; import "../bridge/IEthBridge.sol"; contract BridgeStub is IBridge, IEthBridge { diff --git a/plume-oft-adapter-migration/test/mocks/InboxStub.sol b/plume-oft-adapter-migration/test/mocks/InboxStub.sol index 514cb527..95430408 100644 --- a/plume-oft-adapter-migration/test/mocks/InboxStub.sol +++ b/plume-oft-adapter-migration/test/mocks/InboxStub.sol @@ -6,7 +6,7 @@ pragma solidity ^0.8.0; import "../bridge/IInboxBase.sol"; import "../bridge/IInbox.sol"; -import "../../../contracts/ethereum/bridge/IBridge.sol"; +import "../../contracts/ethereum/bridge/IBridge.sol"; import "../bridge/IEthBridge.sol"; import "../bridge/Messages.sol"; diff --git a/plume-oft-adapter-migration/test/mocks/MockArbNativeOFTAdapterUpgradeable.sol b/plume-oft-adapter-migration/test/mocks/MockArbNativeOFTAdapterUpgradeable.sol index 8924c9d7..957a92d8 100644 --- a/plume-oft-adapter-migration/test/mocks/MockArbNativeOFTAdapterUpgradeable.sol +++ b/plume-oft-adapter-migration/test/mocks/MockArbNativeOFTAdapterUpgradeable.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.22; -import { ArbNativeOFTAdapterUpgradeable } from "../../../contracts/plume/ArbNativeOFTAdapterUpgradeable.sol"; +import { ArbNativeOFTAdapterUpgradeable } from "../../contracts/plume/ArbNativeOFTAdapterUpgradeable.sol"; contract MockArbNativeOFTAdapterUpgradeable is ArbNativeOFTAdapterUpgradeable { /** diff --git a/plume-oft-adapter-migration/test/mocks/RollupStub.sol b/plume-oft-adapter-migration/test/mocks/RollupStub.sol index efd926c6..9bbc4053 100644 --- a/plume-oft-adapter-migration/test/mocks/RollupStub.sol +++ b/plume-oft-adapter-migration/test/mocks/RollupStub.sol @@ -1,6 +1,6 @@ pragma solidity ^0.8.0; -import { IOwnable } from "../../../contracts/ethereum/bridge/IOwnable.sol"; +import { IOwnable } from "../../contracts/ethereum/bridge/IOwnable.sol"; contract RollupStub is IOwnable { address public owner; From 3e34785deaba39b38518535756253def4c5346b8 Mon Sep 17 00:00:00 2001 From: ravinagill15 Date: Fri, 18 Jul 2025 15:04:05 -0700 Subject: [PATCH 16/20] mock oft --- .../contracts/plume/PlumeOFTMock.sol | 18 +++++++ .../deploy/PlumeOFTMock.ts | 53 +++++++++++++++++++ 2 files changed, 71 insertions(+) create mode 100644 plume-oft-adapter-migration/contracts/plume/PlumeOFTMock.sol create mode 100644 plume-oft-adapter-migration/deploy/PlumeOFTMock.ts diff --git a/plume-oft-adapter-migration/contracts/plume/PlumeOFTMock.sol b/plume-oft-adapter-migration/contracts/plume/PlumeOFTMock.sol new file mode 100644 index 00000000..efb6d754 --- /dev/null +++ b/plume-oft-adapter-migration/contracts/plume/PlumeOFTMock.sol @@ -0,0 +1,18 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.22; + +import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol"; +import { OFT } from "@layerzerolabs/oft-evm/contracts/OFT.sol"; + +contract PlumeOFTMock is OFT { + constructor( + string memory _name, + string memory _symbol, + address _lzEndpoint, + address _delegate + ) OFT(_name, _symbol, _lzEndpoint, _delegate) Ownable(_delegate) {} + + function mint(address _to, uint256 _amount) public onlyOwner { + _mint(_to, _amount); + } +} \ No newline at end of file diff --git a/plume-oft-adapter-migration/deploy/PlumeOFTMock.ts b/plume-oft-adapter-migration/deploy/PlumeOFTMock.ts new file mode 100644 index 00000000..a9c54be4 --- /dev/null +++ b/plume-oft-adapter-migration/deploy/PlumeOFTMock.ts @@ -0,0 +1,53 @@ +import assert from 'assert' + +import { type DeployFunction } from 'hardhat-deploy/types' + +const contractName = 'PlumeOFTMock' + +const deploy: DeployFunction = async (hre) => { + const { getNamedAccounts, deployments } = hre + + const { deploy } = deployments + const { deployer } = await getNamedAccounts() + + assert(deployer, 'Missing named deployer account') + + console.log(`Network: ${hre.network.name}`) + console.log(`Deployer: ${deployer}`) + + // This is an external deployment pulled in from @layerzerolabs/lz-evm-sdk-v2 + // + // @layerzerolabs/toolbox-hardhat takes care of plugging in the external deployments + // from @layerzerolabs packages based on the configuration in your hardhat config + // + // For this to work correctly, your network config must define an eid property + // set to `EndpointId` as defined in @layerzerolabs/lz-definitions + // + // For example: + // + // networks: { + // 'optimism-testnet': { + // ... + // eid: EndpointId.OPTSEP_V2_TESTNET + // } + // } + const endpointV2Deployment = await hre.deployments.get('EndpointV2') + + const { address } = await deploy(contractName, { + from: deployer, + args: [ + 'MyOFT', // name + 'MOFT', // symbol + endpointV2Deployment.address, // LayerZero's EndpointV2 address + deployer, // owner + ], + log: true, + skipIfAlreadyDeployed: false, + }) + + console.log(`Deployed contract: ${contractName}, network: ${hre.network.name}, address: ${address}`) +} + +deploy.tags = [contractName] + +export default deploy \ No newline at end of file From 3a92453b6d0a4f4e782992f5c3a2f3f1a24aff31 Mon Sep 17 00:00:00 2001 From: ravinagill15 Date: Fri, 18 Jul 2025 15:08:05 -0700 Subject: [PATCH 17/20] hardhat config and lz config updates --- plume-oft-adapter-migration/hardhat.config.ts | 14 +++--- .../layerzero.config.ts | 45 +++++++++++++------ 2 files changed, 38 insertions(+), 21 deletions(-) diff --git a/plume-oft-adapter-migration/hardhat.config.ts b/plume-oft-adapter-migration/hardhat.config.ts index 8191c4cf..388f3ae6 100644 --- a/plume-oft-adapter-migration/hardhat.config.ts +++ b/plume-oft-adapter-migration/hardhat.config.ts @@ -58,14 +58,14 @@ const config: HardhatUserConfig = { ], }, networks: { - 'optimism-testnet': { - eid: EndpointId.OPTSEP_V2_TESTNET, - url: process.env.RPC_URL_OP_SEPOLIA || 'https://optimism-sepolia.gateway.tenderly.co', + 'ethereum-mainnet': { + eid: EndpointId.ETHEREUM_V2_MAINNET, + url: process.env.RPC_URL_ETH_MAINNET || 'https://1rpc.io/eth', accounts, }, - 'arbitrum-testnet': { - eid: EndpointId.ARBSEP_V2_TESTNET, - url: process.env.RPC_URL_ARB_SEPOLIA || 'https://arbitrum-sepolia.gateway.tenderly.co', + 'plume-mainnet': { + eid: EndpointId.PLUMEPHOENIX_V2_MAINNET, + url: process.env.RPC_URL_PLUME_MAINNET || 'https://rpc.plume.org', accounts, }, hardhat: { @@ -86,4 +86,4 @@ const config: HardhatUserConfig = { }, } -export default config +export default config \ No newline at end of file diff --git a/plume-oft-adapter-migration/layerzero.config.ts b/plume-oft-adapter-migration/layerzero.config.ts index baa1c7a4..4da8de83 100644 --- a/plume-oft-adapter-migration/layerzero.config.ts +++ b/plume-oft-adapter-migration/layerzero.config.ts @@ -5,14 +5,24 @@ import { OAppEnforcedOption } from '@layerzerolabs/toolbox-hardhat' import type { OmniPointHardhat } from '@layerzerolabs/toolbox-hardhat' -const optimismContract: OmniPointHardhat = { - eid: EndpointId.OPTSEP_V2_TESTNET, - contractName: 'MyOFTUpgradeableMock', // Note: change this to 'MyOFTUpgradeable' or your production contract name +const ethereumContract: OmniPointHardhat = { + eid: EndpointId.ETHEREUM_V2_MAINNET, + contractName: 'OrbitERC20OFTAdapterUpgradeable', } -const arbitrumContract: OmniPointHardhat = { - eid: EndpointId.ARBSEP_V2_TESTNET, - contractName: 'MyOFTUpgradeableMock', // Note: change this to 'MyOFTUpgradeable' or your production contract name +const plumeContract: OmniPointHardhat = { + eid: EndpointId.PLUMEPHOENIX_V2_MAINNET, + contractName: 'OrbitNativeOFTAdapterUpgradeable', +} + +const existingEthereumPlumeOFTAdapterContract: OmniPointHardhat = { + eid: EndpointId.ETHEREUM_V2_MAINNET, + address: '0xbDA8a2285F4C3e75b37E467C4DB9bC633FfbD29d', +} + +const plumeDummyContract: OmniPointHardhat = { + eid: EndpointId.PLUMEPHOENIX_V2_MAINNET, + contractName: 'PlumeOFTMock', } // To connect all the above chains to each other, we need the following pathways: @@ -33,20 +43,27 @@ const EVM_ENFORCED_OPTIONS: OAppEnforcedOption[] = [ // i.e. if you declare A,B there's no need to declare B,A const pathways: TwoWayConfig[] = [ [ - optimismContract, // Chain A contract - arbitrumContract, // Chain C contract - [['LayerZero Labs'], []], // [ requiredDVN[], [ optionalDVN[], threshold ] ] - [1, 1], // [A to B confirmations, B to A confirmations] - [EVM_ENFORCED_OPTIONS, EVM_ENFORCED_OPTIONS], // Chain C enforcedOptions, Chain A enforcedOptions + ethereumContract, // Chain A contract + plumeContract, // Chain C contract + [['LayerZero Labs'], []], // [ requiredDVN[], [ optionalDVN[], threshold ] ] // TODO update dvns + [1, 1], // [A to B confirmations, B to A confirmations] // TODO update confirmations + [EVM_ENFORCED_OPTIONS, EVM_ENFORCED_OPTIONS], // Chain C enforcedOptions, Chain A enforcedOptions // TODO confirm this + ], + [ + // TODO this cannot be done by LZ -- Plume owns existing PlumeOFTAdapter contract on Ethereum + existingEthereumPlumeOFTAdapterContract, // Chain A contract + plumeDummyContract, // Chain C contract + [['LayerZero Labs'], []], // [ requiredDVN[], [ optionalDVN[], threshold ] ] // TODO update dvns + [1, 1], // [A to B confirmations, B to A confirmations] // TODO update confirmations + [EVM_ENFORCED_OPTIONS, EVM_ENFORCED_OPTIONS], // Chain C enforcedOptions, Chain A enforcedOptions // TODO confirm this ], ] -// Note: you should not use the values 1, 1 for confirmations. Choose the right number of confirmations based on the finalization that you require from the source/destination chains. export default async function () { // Generate the connections config based on the pathways const connections = await generateConnectionsConfig(pathways) return { - contracts: [{ contract: optimismContract }, { contract: arbitrumContract }], + contracts: [{ contract: ethereumContract }, { contract: plumeContract }], connections, } -} +} \ No newline at end of file From 359dddd46740c411f04c442224bf493e39264c1d Mon Sep 17 00:00:00 2001 From: ravinagill15 Date: Thu, 31 Jul 2025 13:06:49 -0700 Subject: [PATCH 18/20] adel reviews -- deploying proxy for OrbitNativeOFTAdapterUpgradeable --- .../deploy/OrbitERC20OFTAdapterUpgradeable.ts | 2 +- .../OrbitNativeOFTAdapterUpgradeable.ts | 66 ++++++++----------- 2 files changed, 28 insertions(+), 40 deletions(-) diff --git a/plume-oft-adapter-migration/deploy/OrbitERC20OFTAdapterUpgradeable.ts b/plume-oft-adapter-migration/deploy/OrbitERC20OFTAdapterUpgradeable.ts index 4138ccd8..671ea547 100644 --- a/plume-oft-adapter-migration/deploy/OrbitERC20OFTAdapterUpgradeable.ts +++ b/plume-oft-adapter-migration/deploy/OrbitERC20OFTAdapterUpgradeable.ts @@ -36,4 +36,4 @@ const deploy: DeployFunction = async (hre) => { deploy.tags = [contractName] -export default deploy \ No newline at end of file +export default deploy diff --git a/plume-oft-adapter-migration/deploy/OrbitNativeOFTAdapterUpgradeable.ts b/plume-oft-adapter-migration/deploy/OrbitNativeOFTAdapterUpgradeable.ts index 784697b7..c42df35b 100644 --- a/plume-oft-adapter-migration/deploy/OrbitNativeOFTAdapterUpgradeable.ts +++ b/plume-oft-adapter-migration/deploy/OrbitNativeOFTAdapterUpgradeable.ts @@ -1,51 +1,39 @@ -import assert from 'assert' - import { type DeployFunction } from 'hardhat-deploy/types' +import { EndpointId, endpointIdToNetwork } from '@layerzerolabs/lz-definitions' +import { getDeploymentAddressAndAbi } from '@layerzerolabs/lz-evm-sdk-v2' + const contractName = 'OrbitNativeOFTAdapterUpgradeable' const deploy: DeployFunction = async (hre) => { - const { getNamedAccounts, deployments } = hre - - const { deploy } = deployments - const { deployer } = await getNamedAccounts() - - assert(deployer, 'Missing named deployer account') - - console.log(`Network: ${hre.network.name}`) - console.log(`Deployer: ${deployer}`) - - // This is an external deployment pulled in from @layerzerolabs/lz-evm-sdk-v2 - // - // @layerzerolabs/toolbox-hardhat takes care of plugging in the external deployments - // from @layerzerolabs packages based on the configuration in your hardhat config - // - // For this to work correctly, your network config must define an eid property - // set to `EndpointId` as defined in @layerzerolabs/lz-definitions - // - // For example: - // - // networks: { - // fuji: { - // ... - // eid: EndpointId.AVALANCHE_V2_TESTNET - // } - // } - const endpointV2Deployment = await hre.deployments.get('EndpointV2') - - const { address } = await deploy(contractName, { - from: deployer, - args: [ - 18, - endpointV2Deployment.address, // LayerZero's EndpointV2 address - ], + const { deploy } = hre.deployments + const signer = (await hre.ethers.getSigners())[0] + console.log(`deploying ${contractName} on network: ${hre.network.name} with ${signer.address}`) + + const eid = hre.network.config.eid as EndpointId + const lzNetworkName = endpointIdToNetwork(eid) + + const { address } = getDeploymentAddressAndAbi(lzNetworkName, 'EndpointV2') + + await deploy(contractName, { + from: signer.address, + args: [18, address], log: true, + waitConfirmations: 1, skipIfAlreadyDeployed: false, + proxy: { + proxyContract: 'OpenZeppelinTransparentProxy', + owner: signer.address, + execute: { + init: { + methodName: 'initialize', + args: [signer.address], + }, + }, + }, }) - - console.log(`Deployed contract: ${contractName}, network: ${hre.network.name}, address: ${address}`) } deploy.tags = [contractName] -export default deploy \ No newline at end of file +export default deploy From 933cd3bf52be176dda0a9bba57ec2d302b8cae96 Mon Sep 17 00:00:00 2001 From: ravinagill15 Date: Wed, 13 Aug 2025 12:38:36 -0700 Subject: [PATCH 19/20] dan reviews --- .../contracts/plume/ArbNativeOFTAdapterUpgradeable.sol | 8 +++----- .../deploy/OrbitERC20OFTAdapterUpgradeable.ts | 6 +++++- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/plume-oft-adapter-migration/contracts/plume/ArbNativeOFTAdapterUpgradeable.sol b/plume-oft-adapter-migration/contracts/plume/ArbNativeOFTAdapterUpgradeable.sol index 524b0727..50c56b35 100644 --- a/plume-oft-adapter-migration/contracts/plume/ArbNativeOFTAdapterUpgradeable.sol +++ b/plume-oft-adapter-migration/contracts/plume/ArbNativeOFTAdapterUpgradeable.sol @@ -20,7 +20,9 @@ abstract contract ArbNativeOFTAdapterUpgradeable is OFTCoreUpgradeable { constructor( uint8 _localDecimals, address _lzEndpoint - ) OFTCoreUpgradeable(_localDecimals, _lzEndpoint) {} + ) OFTCoreUpgradeable(_localDecimals, _lzEndpoint) { + _disableInitializers(); + } /** * @dev Initializes the OFTAdapter with the provided delegate. @@ -142,8 +144,4 @@ abstract contract ArbNativeOFTAdapterUpgradeable is OFTCoreUpgradeable { function _payNative(uint256 _nativeFee) internal pure override returns (uint256 nativeFee) { return _nativeFee; } - - function oftVersion() external pure virtual override returns (bytes4 interfaceId, uint64 version) { - return (type(IOFT).interfaceId, 1); - } } \ No newline at end of file diff --git a/plume-oft-adapter-migration/deploy/OrbitERC20OFTAdapterUpgradeable.ts b/plume-oft-adapter-migration/deploy/OrbitERC20OFTAdapterUpgradeable.ts index 671ea547..dedad84d 100644 --- a/plume-oft-adapter-migration/deploy/OrbitERC20OFTAdapterUpgradeable.ts +++ b/plume-oft-adapter-migration/deploy/OrbitERC20OFTAdapterUpgradeable.ts @@ -17,7 +17,11 @@ const deploy: DeployFunction = async (hre) => { await deploy(contractName, { from: signer.address, - args: ['0x4C1746A800D224393fE2470C70A35717eD4eA5F1', address, '0x35381f63091926750F43b2A7401B083263aDEF83'], // replace '0xtoken' with the address of the ERC-20 token and '0xbridge' with the address of the bridge + args: [ + '0x4C1746A800D224393fE2470C70A35717eD4eA5F1', // token address + address, // endpoint address + '0x35381f63091926750F43b2A7401B083263aDEF83', // bridge address + ], log: true, waitConfirmations: 1, skipIfAlreadyDeployed: false, From e614db262d7d185df5fd25aecd689541dda3f4d4 Mon Sep 17 00:00:00 2001 From: ravinagill15 Date: Wed, 13 Aug 2025 12:42:58 -0700 Subject: [PATCH 20/20] dan review --- .../test/mocks/MockArbNativeOFTAdapterUpgradeable.sol | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/plume-oft-adapter-migration/test/mocks/MockArbNativeOFTAdapterUpgradeable.sol b/plume-oft-adapter-migration/test/mocks/MockArbNativeOFTAdapterUpgradeable.sol index 957a92d8..7c5d2ce4 100644 --- a/plume-oft-adapter-migration/test/mocks/MockArbNativeOFTAdapterUpgradeable.sol +++ b/plume-oft-adapter-migration/test/mocks/MockArbNativeOFTAdapterUpgradeable.sol @@ -11,7 +11,9 @@ contract MockArbNativeOFTAdapterUpgradeable is ArbNativeOFTAdapterUpgradeable { constructor( uint8 _localDecimals, address _lzEndpoint - ) ArbNativeOFTAdapterUpgradeable(_localDecimals, _lzEndpoint) {} + ) ArbNativeOFTAdapterUpgradeable(_localDecimals, _lzEndpoint) { + _disableInitializers(); + } function initialize(address _delegate) public initializer { __NativeOFTAdapter_init(_delegate);