diff --git a/.gitignore b/.gitignore
index c672773e..75ca30bf 100644
--- a/.gitignore
+++ b/.gitignore
@@ -8,3 +8,9 @@ typechain-types
# Hardhat files
cache
artifacts
+*.bin
+*.abi
+
+# Inception LRT custom ignore
+*.tgz
+/projects/tests/omnivault-rebalancer/contracts/
diff --git a/.prettierrc b/.prettierrc
new file mode 100644
index 00000000..402cde5f
--- /dev/null
+++ b/.prettierrc
@@ -0,0 +1,36 @@
+{
+ "arrowParens": "avoid",
+ "bracketSameLine": true,
+ "bracketSpacing": true,
+ "endOfLine": "crlf",
+ "semi": true,
+ "experimentalTernaries": false,
+ "singleQuote": false,
+ "jsxSingleQuote": false,
+ "quoteProps": "as-needed",
+ "trailingComma": "all",
+ "singleAttributePerLine": false,
+ "htmlWhitespaceSensitivity": "css",
+ "vueIndentScriptAndStyle": false,
+ "proseWrap": "preserve",
+ "insertPragma": false,
+ "printWidth": 120,
+ "requirePragma": false,
+ "tabWidth": 2,
+ "useTabs": false,
+ "embeddedLanguageFormatting": "auto",
+ "plugins": ["prettier-plugin-solidity"],
+ "overrides": [
+ {
+ "files": "*.sol",
+ "options": {
+ "parser": "solidity-parse",
+ "printWidth": 80,
+ "tabWidth": 4,
+ "useTabs": false,
+ "singleQuote": false,
+ "bracketSpacing": false
+ }
+ }
+ ]
+}
diff --git a/OmniStaking_Architecture.jpg b/OmniStaking_Architecture.jpg
new file mode 100644
index 00000000..3ec5015a
Binary files /dev/null and b/OmniStaking_Architecture.jpg differ
diff --git a/README.md b/README.md
index e69de29b..c197c8d3 100644
--- a/README.md
+++ b/README.md
@@ -0,0 +1,64 @@
+
+
+# OmniStaking
+
+OmniStaking is a cross-chain staking system designed to maintain the balance of Inception Tokens across Layer 1 (L1) and multiple Layer 2 (L2) networks. By managing both data and ETH transfers between chains, OmniStaking ensures that the protocol maintains a consistent supply of Inception Tokens across all deployed chains, creating a unified and decentralized staking ecosystem.
+
+## Overview
+
+OmniStaking operates through a sequence of cross-chain communications involving several key contracts and components:
+
+1. **InceptionOmniVault**: This contract initiates the transfer process. Operators (backend) interact with it to send either:
+ - **Data Messages**: For reporting asset balances, using `sendAssetsInfoToL1()`.
+ - **ETH Transfers**: For transferring ETH across chains, using `sendEthCrossChain()`.
+
+2. **LZCrossChainAdapterL2**: This contract, specific to L2 chains, is responsible for processing and transmitting cross-chain messages. It receives calls from `InceptionOmniVault` and initiates cross-chain transfers using the LayerZero protocol.
+
+3. **LZCrossChainAdapterL1**: After a specified delay (e.g., 7 days for mainnets or 20 minutes for testnets), messages or ETH transfers from L2 arrive at this L1 contract. Here, the contract:
+ - Decodes data messages.
+ - Relays the decoded information or ETH to the **NativeRebalancer**.
+
+4. **NativeRebalancer**: This L1 contract aggregates data from all L2 chains. When data from each L2 is received, users can call `updateTreasuryData` on **NativeRebalancer**. This function recalculates the token supply, minting or burning tokens to maintain the invariant:
+
+$$
+\text{sum(Inception Tokens on L2s)} = \text{Inception Tokens on L1}
+$$
+
+## Message Flow
+
+### L2 to L1 (Data and ETH Transfer)
+
+1. **Data Transfer**:
+ - The operator calls `sendAssetsInfoToL1()` on **InceptionOmniVault**.
+ - This data message is forwarded to **LZCrossChainAdapterL2**, which encodes and sends the data across chains.
+
+2. **ETH Transfer**:
+ - The operator initiates `sendEthCrossChain()` on **InceptionOmniVault**.
+ - **LZCrossChainAdapterL2** processes and sends the ETH transfer request to **LZCrossChainAdapterL1**.
+
+### L1 Reception and Balancing
+
+After the specified waiting period, **LZCrossChainAdapterL1** receives the cross-chain message or ETH transfer:
+
+1. **Data Message**: **LZCrossChainAdapterL1** decodes the data and relays it to **NativeRebalancer**.
+2. **ETH Transfer**: The ETH is directly forwarded as specified in the initial transfer request.
+
+Once all L2 data has been received, users call `updateTreasuryData()` on **NativeRebalancer**, which mints or burns Inception Tokens on L1 as needed to ensure cross-chain token balance.
+
+## Components
+
+- **InceptionOmniVault**: Initiates L2 to L1 cross-chain transfers.
+- **LZCrossChainAdapterL2**: Manages cross-chain messaging from L2 to L1.
+- **LZCrossChainAdapterL1**: Receives and processes messages or ETH on L1.
+- **NativeRebalancer**: Maintains the Inception Token invariant across chains by adjusting L1 supply.
+
+## Invariant Guarantee
+
+OmniStaking maintains the invariant:
+
+$$
+\text{sum(Inception Tokens on L2s)} = \text{Inception Tokens on L1}
+$$
+
+
+This ensures that the total supply of Inception Tokens is balanced across all chains in the OmniStaking ecosystem.
diff --git a/hh.config.ts b/hh.config.ts
index 2ea1bfb4..4d926ab5 100644
--- a/hh.config.ts
+++ b/hh.config.ts
@@ -13,13 +13,15 @@ export const CONFIG = {
gas: 8000000,
gasPrice,
accounts,
+ eid: 30101
},
holesky: {
url: process.env.HOLESKY_RPC || "https://rpc.ankr.com/eth_holesky",
chainId: 17000,
- gasPrice,
gas: 8000000,
+ gasPrice,
accounts,
+ eid: 40217,
verify: {
etherscan: {
apiKey: process.env.ETHERSCAN_API_KEY,
@@ -27,6 +29,58 @@ export const CONFIG = {
},
},
},
+ arbitrum: {
+ url: process.env.RPC_URL_ARBITRUM,
+ chainId: 42161,
+ gas: 8000000,
+ gasPrice,
+ accounts,
+ eid: 30110,
+ },
+ sepolia: {
+ url: process.env.RPC_URL_SEPOLIA,
+ chainId: 11155111,
+ gas: 800000,
+ gasPrice,
+ accounts,
+ eid: 40161,
+ verify: {
+ etherscan: {
+ apiKey: process.env.ETHERSCAN_API_KEY,
+ apiUrl: "https://api-sepolia.etherscan.io",
+ },
+ },
+ },
+ optimism: {
+ url: process.env.RPC_URL_OPTIMISM,
+ chainId: 10,
+ gas: 8000000,
+ gasPrice,
+ accounts,
+ eid: 30111,
+ verify: {
+ etherscan: {
+ apiKey: process.env.OPTIMISM_API_KEY,
+ apiUrl: "https://api-optimistic.etherscan.io/api",
+ },
+ },
+ },
+ arbitrumSepolia: {
+ url: process.env.RPC_URL_ARBITRUM_TESTNET,
+ chainId: 421614,
+ gas: 8000000,
+ gasPrice,
+ accounts,
+ eid: 40231,
+ },
+ optimismSepolia: {
+ url: process.env.RPC_URL_OPTIMISM_SEPOLIA,
+ chainId: 11155420,
+ gas: 8000000,
+ gasPrice,
+ accounts,
+ eid: 40232,
+ },
local: {
url: process.env.LOCAL_RPC || "http://127.0.0.1:8545",
chainId: 1337,
@@ -35,8 +89,20 @@ export const CONFIG = {
},
hardhat: {
forking: {
- url: `${process.env.MAINNET_RPC}`,
- blockNumber: 20871635,
+ url: `${process.env.RPC_URL_SEPOLIA}`,
+ },
+ accounts: process.env.DEPLOYER_PRIVATE_KEY
+ ? [{ privateKey: process.env.DEPLOYER_PRIVATE_KEY, balance: "10000000000000000000" }]
+ : []
+ },
+ },
+ solidity: {
+ version: "0.8.26",
+ settings: {
+ viaIR: true,
+ optimizer: {
+ enabled: true,
+ runs: 200,
},
},
},
@@ -83,8 +149,13 @@ export const CONFIG = {
},
etherscan: {
apiKey: {
- holesky: "PP5CDPZBG6AF6FBGE9CJNYGCRYXYN549M1",
+ holesky: process.env.HOLESKY_ETHERSCAN_API_KEY,
mainnet: process.env.ETHERSCAN_API_KEY,
+ sepolia: process.env.ETHERSCAN_API_KEY,
+ arbitrum: process.env.ARBISCAN_API_KEY,
+ arbitrumSepolia: process.env.ARBISCAN_API_KEY,
+ optimism: process.env.OPTIMISM_API_KEY,
+ optimismSepolia: process.env.OPTIMISM_API_KEY,
},
customChains: [
{
@@ -95,6 +166,23 @@ export const CONFIG = {
browserURL: "https://holesky.etherscan.io",
},
},
+ {
+ network: "arbitrumSepolia",
+ chainId: 421614,
+ urls: {
+ apiURL: "https://api-sepolia.arbiscan.io/api",
+ browserURL: "https://sepolia.arbiscan.io",
+ },
+ },
+
+ {
+ network: "optimismSepolia",
+ chainId: 11155420,
+ urls: {
+ apiURL: "https://api-sepolia-optimistic.etherscan.io/api",
+ browserURL: "https://sepolia-optimism.etherscan.io/",
+ },
+ },
],
},
sourcify: {
diff --git a/package.json b/package.json
index c794817b..43339344 100644
--- a/package.json
+++ b/package.json
@@ -16,8 +16,8 @@
"license": "MIT",
"private": true,
"scripts": {
- "prettier:sol": "prettier --write --plugin=prettier-plugin-solidity './**/*.sol'",
+ "prettier:sol": "prettier --write --plugin=prettier-plugin-solidity ./**/*.sol",
"prettier:ts": "prettier --write ./**/*.ts",
"prettier:js": "prettier --write ./**/*.js"
}
-}
+}
\ No newline at end of file
diff --git a/projects/bridge-lz/.env.example b/projects/bridge-lz/.env.example
new file mode 100644
index 00000000..0c0b77a9
--- /dev/null
+++ b/projects/bridge-lz/.env.example
@@ -0,0 +1,4 @@
+DEPLOYER_PRIVATE_KEY=
+RPC_URL_SEPOLIA=
+RPC_URL_ARBITRUM_SEPOLIA=
+RPC_URL_OPTIMISM_SEPOLIA=
\ No newline at end of file
diff --git a/projects/bridge-lz/.gitignore b/projects/bridge-lz/.gitignore
new file mode 100644
index 00000000..3d92981f
--- /dev/null
+++ b/projects/bridge-lz/.gitignore
@@ -0,0 +1,17 @@
+node_modules
+.env
+coverage
+coverage.json
+typechain
+typechain-types
+
+# Hardhat files
+cache
+artifacts
+*.bin
+*.abi
+
+# Inception LRT custom ignore
+deployment_checkpoint.json
+*.tgz
+deployments
\ No newline at end of file
diff --git a/projects/bridge-lz/.nvmrc b/projects/bridge-lz/.nvmrc
new file mode 100644
index 00000000..b714151e
--- /dev/null
+++ b/projects/bridge-lz/.nvmrc
@@ -0,0 +1 @@
+v18.18.0
\ No newline at end of file
diff --git a/projects/bridge-lz/.prettierignore b/projects/bridge-lz/.prettierignore
new file mode 100644
index 00000000..6e8232f5
--- /dev/null
+++ b/projects/bridge-lz/.prettierignore
@@ -0,0 +1,10 @@
+artifacts/
+cache/
+dist/
+node_modules/
+out/
+*.log
+*ignore
+*.yaml
+*.lock
+package-lock.json
\ No newline at end of file
diff --git a/projects/bridge-lz/.prettierrc.js b/projects/bridge-lz/.prettierrc.js
new file mode 100644
index 00000000..2ac11bf4
--- /dev/null
+++ b/projects/bridge-lz/.prettierrc.js
@@ -0,0 +1,3 @@
+// module.exports = {
+// ...require('@layerzerolabs/prettier-config-next'),
+// };
diff --git a/projects/bridge-lz/README.md b/projects/bridge-lz/README.md
new file mode 100644
index 00000000..b4c2fc5a
--- /dev/null
+++ b/projects/bridge-lz/README.md
@@ -0,0 +1,108 @@
+
+
+
+
+
+
+
+ Homepage | Docs | Developers
+
+
+OApp Example
+
+
+ Quickstart | Configuration | Message Execution Options | Endpoint Addresses
+
+
+Template project for getting started with LayerZero's OApp
contract development.
+
+## 1) Developing Contracts
+
+#### Installing dependencies
+
+We recommend using `pnpm` as a package manager (but you can of course use a package manager of your choice):
+
+```bash
+pnpm install
+```
+
+#### 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
+```
+
+Or adjust the `package.json` to for example remove `forge` build:
+
+```diff
+- "compile": "$npm_execpath run compile:forge && $npm_execpath run compile:hardhat",
+- "compile:forge": "forge build",
+- "compile:hardhat": "hardhat compile",
++ "compile": "hardhat compile"
+```
+
+#### Running tests
+
+Similarly 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
+```
+
+Or adjust the `package.json` to for example remove `hardhat` tests:
+
+```diff
+- "test": "$npm_execpath test:forge && $npm_execpath test:hardhat",
+- "test:forge": "forge test",
+- "test:hardhat": "$npm_execpath hardhat test"
++ "test": "forge test"
+```
+
+## 2) Deploying Contracts
+
+Set up deployer wallet/account:
+
+- Rename `.env.example` -> `.env`
+- Choose your preferred means of setting up your deployer wallet/account:
+
+```
+MNEMONIC="test test test test test test test test test test test junk"
+or...
+PRIVATE_KEY="0xabc...def"
+```
+
+To deploy your contracts to your desired blockchains, run the following command in your project's folder:
+
+```bash
+npx hardhat lz:deploy
+```
+
+More information about available CLI arguments can be found using the `--help` flag:
+
+```bash
+npx hardhat lz:deploy --help
+```
+
+By following these steps, you can focus more on creating innovative omnichain solutions and less on the complexities of cross-chain communication.
+
+
+
+
+ Join our community on Discord | Follow us on Twitter
+
diff --git a/projects/bridge-lz/contracts/LZCrossChainAdapterL1.sol b/projects/bridge-lz/contracts/LZCrossChainAdapterL1.sol
new file mode 100644
index 00000000..da9fd6c0
--- /dev/null
+++ b/projects/bridge-lz/contracts/LZCrossChainAdapterL1.sol
@@ -0,0 +1,73 @@
+// SPDX-License-Identifier: MIT
+pragma solidity 0.8.27;
+
+import {Origin} from "@layerzerolabs/oapp-evm/contracts/oapp/OApp.sol";
+import {Ownable2StepUpgradeable} from "@openzeppelin/contracts-upgradeable/access/Ownable2StepUpgradeable.sol";
+import {Initializable} from "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol";
+
+import {AbstractCrossChainAdapter} from "./abstract/AbstractCrossChainAdapter.sol";
+import {AbstractLZCrossChainAdapter} from "./abstract/AbstractLZCrossChainAdapter.sol";
+import {AbstractCrossChainAdapterL1} from "./abstract/AbstractCrossChainAdapterL1.sol";
+import {OAppReceiverUpgradeable} from "./OAppReceiverUpgradeable.sol";
+
+/**
+ * @title LZCrossChainAdapterL1
+ * @dev Layer 1 adapter for cross-chain messaging using LayerZero's communication framework.
+ * This contract initializes mappings between Endpoint IDs (EIDs) and chain IDs and processes
+ * incoming messages with optional ETH transfers and payload handling. Extends LayerZero and
+ * cross-chain adapter functionalities for L1 environments.
+ */
+contract LZCrossChainAdapterL1 is
+ AbstractLZCrossChainAdapter,
+ AbstractCrossChainAdapterL1,
+ Initializable,
+ Ownable2StepUpgradeable
+{
+ modifier onlyOwnerRestricted()
+ override(AbstractCrossChainAdapter, AbstractLZCrossChainAdapter) {
+ _checkOwner();
+ _;
+ }
+
+ modifier onlyTargetReceiverRestricted() override {
+ require(
+ msg.sender == targetReceiver || msg.sender == owner(),
+ NotTargetReceiver(msg.sender)
+ );
+ _;
+ }
+
+ function initialize(
+ address _endpoint,
+ address _delegate,
+ uint32[] memory _eIds,
+ uint256[] memory _chainIds
+ ) public initializer {
+ __Ownable_init(msg.sender);
+ __OAppUpgradeable_init(_endpoint, _delegate);
+
+ require(_eIds.length == _chainIds.length, ArraysLengthsMismatch());
+
+ for (uint256 i = 0; i < _eIds.length; i++) {
+ setChainIdFromEid(_eIds[i], _chainIds[i]);
+ }
+ }
+
+ function _lzReceive(
+ Origin calldata origin,
+ bytes32 /*_guid*/,
+ bytes calldata payload,
+ address /*_executor*/,
+ bytes calldata /*_extraData*/
+ ) internal virtual override(OAppReceiverUpgradeable) {
+ uint256 chainId = getChainIdFromEid(origin.srcEid);
+
+ if (msg.value > 0) {
+ _handleCrossChainEth(chainId);
+ }
+
+ if (payload.length > 0) {
+ _handleCrossChainData(chainId, payload);
+ }
+ }
+}
diff --git a/projects/bridge-lz/contracts/LZCrossChainAdapterL2.sol b/projects/bridge-lz/contracts/LZCrossChainAdapterL2.sol
new file mode 100644
index 00000000..93d3b1a0
--- /dev/null
+++ b/projects/bridge-lz/contracts/LZCrossChainAdapterL2.sol
@@ -0,0 +1,85 @@
+// SPDX-License-Identifier: MIT
+pragma solidity 0.8.27;
+
+import {AbstractLZCrossChainAdapter} from "./abstract/AbstractLZCrossChainAdapter.sol";
+import {AbstractCrossChainAdapterL2} from "./abstract/AbstractCrossChainAdapterL2.sol";
+import {AbstractCrossChainAdapter} from "./abstract/AbstractCrossChainAdapter.sol";
+import {Initializable} from "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol";
+import {Ownable2StepUpgradeable} from "@openzeppelin/contracts-upgradeable/access/Ownable2StepUpgradeable.sol";
+
+import {Origin} from "@layerzerolabs/oapp-evm/contracts/oapp/OApp.sol";
+
+/**
+ * @title LZCrossChainAdapterL2
+ * @dev Layer 2 adapter for LayerZero cross-chain communication, supporting ETH transfers and data messaging with Layer 1.
+ * This contract manages endpoint and chain ID mappings, enables quoting for cross-chain transactions, and provides functions for
+ * data transfer to L1.
+ */
+
+contract LZCrossChainAdapterL2 is
+ AbstractLZCrossChainAdapter,
+ AbstractCrossChainAdapterL2,
+ Initializable,
+ Ownable2StepUpgradeable
+{
+ modifier onlyOwnerRestricted()
+ override(AbstractCrossChainAdapter, AbstractLZCrossChainAdapter) {
+ _checkOwner();
+ _;
+ }
+
+ modifier onlyTargetReceiverRestricted() override {
+ require(
+ msg.sender == targetReceiver || msg.sender == owner(),
+ NotTargetReceiver(msg.sender)
+ );
+ _;
+ }
+
+ uint32 private l1ChainId;
+
+ function initialize(
+ address _endpoint,
+ address _delegate,
+ uint32 _l1ChainId,
+ uint32[] memory _eIds,
+ uint256[] memory _chainIds
+ ) public initializer {
+ __Ownable_init(msg.sender);
+ __OAppUpgradeable_init(_endpoint, _delegate);
+ require(_eIds.length == _chainIds.length, ArraysLengthsMismatch());
+ l1ChainId = _l1ChainId;
+
+ for (uint256 i = 0; i < _eIds.length; i++) {
+ setChainIdFromEid(_eIds[i], _chainIds[i]);
+ }
+ }
+
+ function quote(
+ bytes calldata _payload,
+ bytes memory _options
+ ) external view override returns (uint256) {
+ return _quote(l1ChainId, _payload, _options);
+ }
+
+ function sendDataL1(
+ bytes calldata _payload,
+ bytes memory _options
+ ) external payable override onlyTargetReceiverRestricted {
+ _sendCrosschain(l1ChainId, _payload, _options);
+ }
+
+ function _lzReceive(
+ Origin calldata origin,
+ bytes32 /*_guid*/,
+ bytes calldata,
+ address /*_executor*/,
+ bytes calldata /*_extraData*/
+ ) internal virtual override {
+ uint256 chainId = getChainIdFromEid(origin.srcEid);
+
+ if (msg.value > 0) {
+ _handleCrossChainEth(chainId);
+ }
+ }
+}
diff --git a/projects/bridge-lz/contracts/OAppCoreUpgradeable.sol b/projects/bridge-lz/contracts/OAppCoreUpgradeable.sol
new file mode 100644
index 00000000..017d86de
--- /dev/null
+++ b/projects/bridge-lz/contracts/OAppCoreUpgradeable.sol
@@ -0,0 +1,74 @@
+// SPDX-License-Identifier: MIT
+
+pragma solidity ^0.8.23;
+
+import {IOAppCoreUpgradeable, ILayerZeroEndpointV2} from "./interfaces/IOAppCoreUpgradeable.sol";
+
+/**
+ * @title OAppCoreUpgradeable
+ * @author InceptionLRT
+ * @dev Abstract contract implementing the IOAppCore interface with basic OApp configurations.
+ */
+abstract contract OAppCoreUpgradeable is IOAppCoreUpgradeable {
+ // The LayerZero endpoint associated with the given OApp
+ ILayerZeroEndpointV2 public endpoint;
+
+ // Mapping to store peers associated with corresponding endpoints
+ mapping(uint32 eid => bytes32 peer) public peers;
+
+ /**
+ * @dev Initializer to initialize the OAppCore with the provided endpoint and delegate.
+ * @param _endpoint The address of the LOCAL Layer Zero endpoint.
+ * @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.
+ */
+ function __OAppCoreUpgradeable_init(
+ address _endpoint,
+ address _delegate
+ ) internal {
+ endpoint = ILayerZeroEndpointV2(_endpoint);
+ if (_delegate == address(0)) revert InvalidDelegate();
+ endpoint.setDelegate(_delegate);
+ }
+
+ /**
+ * @notice Sets the peer address (OApp instance) for a corresponding endpoint.
+ * @param _eid The endpoint ID.
+ * @param _peer The address of the peer to be associated with the corresponding endpoint.
+ *
+ * @dev Only the owner/admin of the OApp can call this function.
+ * @dev Indicates that the peer is trusted to send LayerZero messages to this OApp.
+ * @dev Set this to bytes32(0) to remove the peer address.
+ * @dev Peer is a bytes32 to accommodate non-evm chains.
+ */
+ // function setPeer(uint32 _eid, bytes32 _peer) public virtual {}
+
+ /**
+ * @notice Sets the peer address (OApp instance) for a corresponding endpoint.
+ * @param _eid The endpoint ID.
+ * @param _peer The address of the peer to be associated with the corresponding endpoint.
+ *
+ * @dev Indicates that the peer is trusted to send LayerZero messages to this OApp.
+ * @dev Set this to bytes32(0) to remove the peer address.
+ * @dev Peer is a bytes32 to accommodate non-evm chains.
+ */
+ function _setPeer(uint32 _eid, bytes32 _peer) internal virtual {
+ peers[_eid] = _peer;
+ emit PeerSet(_eid, _peer);
+ }
+
+ /**
+ * @notice Internal function to get the peer address associated with a specific endpoint; reverts if NOT set.
+ * ie. the peer is set to bytes32(0).
+ * @param _eid The endpoint ID.
+ * @return peer The address of the peer associated with the specified endpoint.
+ */
+ function _getPeerOrRevert(
+ uint32 _eid
+ ) internal view virtual returns (bytes32) {
+ bytes32 peer = peers[_eid];
+ if (peer == bytes32(0)) revert NoPeer(_eid);
+ return peer;
+ }
+}
diff --git a/projects/bridge-lz/contracts/OAppReceiverUpgradeable.sol b/projects/bridge-lz/contracts/OAppReceiverUpgradeable.sol
new file mode 100644
index 00000000..c0cfdc8d
--- /dev/null
+++ b/projects/bridge-lz/contracts/OAppReceiverUpgradeable.sol
@@ -0,0 +1,136 @@
+// SPDX-License-Identifier: MIT
+pragma solidity ^0.8.23;
+
+import {IOAppReceiverUpgradeable, Origin} from "./interfaces/IOAppReceiverUpgradeable.sol";
+import {OAppCoreUpgradeable} from "./OAppCoreUpgradeable.sol";
+
+/**
+ * @title OAppReceiverUpgradeable
+ * @author InceptionLRT
+ * @dev Abstract contract implementing the ILayerZeroReceiver interface and extending OAppCore for OApp receivers.
+ */
+abstract contract OAppReceiverUpgradeable is
+ IOAppReceiverUpgradeable,
+ OAppCoreUpgradeable
+{
+ // Custom error message for when the caller is not the registered endpoint/
+ error OnlyEndpoint(address addr);
+
+ // @dev The version of the OAppReceiver implementation.
+ // @dev Version is bumped when changes are made to this contract.
+ uint64 internal constant RECEIVER_VERSION = 2;
+
+ /**
+ * @notice Retrieves the OApp version information.
+ * @return senderVersion The version of the OAppSender.sol contract.
+ * @return receiverVersion The version of the OAppReceiver.sol contract.
+ *
+ * @dev Providing 0 as the default for OAppSender version. Indicates that the OAppSender is not implemented.
+ * ie. this is a RECEIVE only OApp.
+ * @dev If the OApp uses both OAppSender and OAppReceiver, then this needs to be override returning the correct versions.
+ */
+ function oAppVersion()
+ public
+ view
+ virtual
+ returns (uint64 senderVersion, uint64 receiverVersion)
+ {
+ return (0, RECEIVER_VERSION);
+ }
+
+ /**
+ * @notice Indicates whether an address is an approved composeMsg sender to the Endpoint.
+ * @dev _origin The origin information containing the source endpoint and sender address.
+ * - srcEid: The source chain endpoint ID.
+ * - sender: The sender address on the src chain.
+ * - nonce: The nonce of the message.
+ * @dev _message The lzReceive payload.
+ * @param _sender The sender address.
+ * @return isSender Is a valid sender.
+ *
+ * @dev Applications can optionally choose to implement separate composeMsg senders that are NOT the bridging layer.
+ * @dev The default sender IS the OAppReceiver implementer.
+ */
+ function isComposeMsgSender(
+ Origin calldata /*_origin*/,
+ bytes calldata /*_message*/,
+ address _sender
+ ) public view virtual returns (bool) {
+ return _sender == address(this);
+ }
+
+ /**
+ * @notice Checks if the path initialization is allowed based on the provided origin.
+ * @param origin The origin information containing the source endpoint and sender address.
+ * @return Whether the path has been initialized.
+ *
+ * @dev This indicates to the endpoint that the OApp has enabled msgs for this particular path to be received.
+ * @dev This defaults to assuming if a peer has been set, its initialized.
+ * Can be overridden by the OApp if there is other logic to determine this.
+ */
+ function allowInitializePath(
+ Origin calldata origin
+ ) public view virtual returns (bool) {
+ return peers[origin.srcEid] == origin.sender;
+ }
+
+ /**
+ * @notice Retrieves the next nonce for a given source endpoint and sender address.
+ * @dev _srcEid The source endpoint ID.
+ * @dev _sender The sender address.
+ * @return nonce The next nonce.
+ *
+ * @dev The path nonce starts from 1. If 0 is returned it means that there is NO nonce ordered enforcement.
+ * @dev Is required by the off-chain executor to determine the OApp expects msg execution is ordered.
+ * @dev This is also enforced by the OApp.
+ * @dev By default this is NOT enabled. ie. nextNonce is hardcoded to return 0.
+ */
+ function nextNonce(
+ uint32 /*_srcEid*/,
+ bytes32 /*_sender*/
+ ) public view virtual returns (uint64 nonce) {
+ return 0;
+ }
+
+ /**
+ * @dev Entry point for receiving messages or packets from the endpoint.
+ * @param _origin The origin information containing the source endpoint and sender address.
+ * - srcEid: The source chain endpoint ID.
+ * - sender: The sender address on the src chain.
+ * - nonce: The nonce of the message.
+ * @param _guid The unique identifier for the received LayerZero message.
+ * @param _message The payload of the received message.
+ * @param _executor The address of the executor for the received message.
+ * @param _extraData Additional arbitrary data provided by the corresponding executor.
+ *
+ * @dev Entry point for receiving msg/packet from the LayerZero endpoint.
+ */
+ function lzReceive(
+ Origin calldata _origin,
+ bytes32 _guid,
+ bytes calldata _message,
+ address _executor,
+ bytes calldata _extraData
+ ) public payable virtual {
+ // Ensures that only the endpoint can attempt to lzReceive() messages to this OApp.
+ if (address(endpoint) != msg.sender) revert OnlyEndpoint(msg.sender);
+
+ // Ensure that the sender matches the expected peer for the source endpoint.
+ if (_getPeerOrRevert(_origin.srcEid) != _origin.sender)
+ revert OnlyPeer(_origin.srcEid, _origin.sender);
+
+ // Call the internal OApp implementation of lzReceive.
+ _lzReceive(_origin, _guid, _message, _executor, _extraData);
+ }
+
+ /**
+ * @dev Internal function to implement lzReceive logic without needing to copy the basic parameter validation.
+ */
+ function _lzReceive(
+ Origin calldata _origin,
+ bytes32 _guid,
+ bytes calldata _message,
+ address _executor,
+ bytes calldata _extraData
+ ) internal virtual;
+}
diff --git a/projects/bridge-lz/contracts/OAppSenderUpgradeable.sol b/projects/bridge-lz/contracts/OAppSenderUpgradeable.sol
new file mode 100644
index 00000000..ee842806
--- /dev/null
+++ b/projects/bridge-lz/contracts/OAppSenderUpgradeable.sol
@@ -0,0 +1,149 @@
+// SPDX-License-Identifier: MIT
+
+pragma solidity ^0.8.23;
+
+import {OAppCoreUpgradeable} from "./OAppCoreUpgradeable.sol";
+import {SafeERC20, IERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
+import {MessagingParams, MessagingFee, MessagingReceipt} from "@layerzerolabs/lz-evm-protocol-v2/contracts/interfaces/ILayerZeroEndpointV2.sol";
+
+/**
+ * @title OAppSenderUpgradeable
+ * @author InceptionLRT
+ * @dev Abstract contract implementing the OAppSender functionality for sending messages to a LayerZero endpoint.
+ */
+abstract contract OAppSenderUpgradeable is OAppCoreUpgradeable {
+ using SafeERC20 for IERC20;
+
+ // Custom error messages
+ error NotEnoughNative(uint256 msgValue);
+ error LzTokenUnavailable();
+
+ // @dev The version of the OAppSender implementation.
+ // @dev Version is bumped when changes are made to this contract.
+ uint64 internal constant SENDER_VERSION = 1;
+
+ /**
+ * @notice Retrieves the OApp version information.
+ * @return senderVersion The version of the OAppSender.sol contract.
+ * @return receiverVersion The version of the OAppReceiver.sol contract.
+ *
+ * @dev Providing 0 as the default for OAppReceiver version. Indicates that the OAppReceiver is not implemented.
+ * ie. this is a SEND only OApp.
+ * @dev If the OApp uses both OAppSender and OAppReceiver, then this needs to be override returning the correct versions
+ */
+ function oAppVersion()
+ public
+ view
+ virtual
+ returns (uint64 senderVersion, uint64 receiverVersion)
+ {
+ return (SENDER_VERSION, 0);
+ }
+
+ /**
+ * @dev Internal function to interact with the LayerZero EndpointV2.quote() for fee calculation.
+ * @param _dstEid The destination endpoint ID.
+ * @param _message The message payload.
+ * @param _options Additional options for the message.
+ * @param _payInLzToken Flag indicating whether to pay the fee in LZ tokens.
+ * @return fee The calculated MessagingFee for the message.
+ * - nativeFee: The native fee for the message.
+ * - lzTokenFee: The LZ token fee for the message.
+ */
+ function _quote(
+ uint32 _dstEid,
+ bytes memory _message,
+ bytes memory _options,
+ bool _payInLzToken
+ ) internal view virtual returns (MessagingFee memory fee) {
+ return
+ endpoint.quote(
+ MessagingParams(
+ _dstEid,
+ _getPeerOrRevert(_dstEid),
+ _message,
+ _options,
+ _payInLzToken
+ ),
+ address(this)
+ );
+ }
+
+ /**
+ * @dev Internal function to interact with the LayerZero EndpointV2.send() for sending a message.
+ * @param _dstEid The destination endpoint ID.
+ * @param _message The message payload.
+ * @param _options Additional options for the message.
+ * @param _fee The calculated LayerZero fee for the message.
+ * - nativeFee: The native fee.
+ * - lzTokenFee: The lzToken fee.
+ * @param _refundAddress The address to receive any excess fee values sent to the endpoint.
+ * @return receipt The receipt for the sent message.
+ * - guid: The unique identifier for the sent message.
+ * - nonce: The nonce of the sent message.
+ * - fee: The LayerZero fee incurred for the message.
+ */
+ function _lzSend(
+ uint32 _dstEid,
+ bytes memory _message,
+ bytes memory _options,
+ MessagingFee memory _fee,
+ address _refundAddress
+ ) internal virtual returns (MessagingReceipt memory receipt) {
+ // @dev Push corresponding fees to the endpoint, any excess is sent back to the _refundAddress from the endpoint.
+
+ uint256 messageValue = _payNative(_fee.nativeFee);
+ if (_fee.lzTokenFee > 0) _payLzToken(_fee.lzTokenFee);
+
+ return
+ // solhint-disable-next-line check-send-result
+ endpoint.send{value: messageValue}(
+ MessagingParams(
+ _dstEid,
+ _getPeerOrRevert(_dstEid),
+ _message,
+ _options,
+ _fee.lzTokenFee > 0
+ ),
+ _refundAddress
+ );
+ }
+
+ /**
+ * @dev Internal function to pay the native fee associated with the message.
+ * @param _nativeFee The native fee to be paid.
+ * @return nativeFee The amount of native currency paid.
+ *
+ * @dev If the OApp needs to initiate MULTIPLE LayerZero messages in a single transaction,
+ * this will need to be overridden because msg.value would contain multiple lzFees.
+ * @dev Should be overridden in the event the LayerZero endpoint requires a different native currency.
+ * @dev Some EVMs use an ERC20 as a method for paying transactions/gasFees.
+ * @dev The endpoint is EITHER/OR, ie. it will NOT support both types of native payment at a time.
+ */
+ function _payNative(
+ uint256 _nativeFee
+ ) internal virtual returns (uint256 nativeFee) {
+ if (msg.value != _nativeFee) revert NotEnoughNative(msg.value);
+ return _nativeFee;
+ }
+
+ /**
+ * @dev Internal function to pay the LZ token fee associated with the message.
+ * @param _lzTokenFee The LZ token fee to be paid.
+ *
+ * @dev If the caller is trying to pay in the specified lzToken, then the lzTokenFee is passed to the endpoint.
+ * @dev Any excess sent, is passed back to the specified _refundAddress in the _lzSend().
+ */
+ function _payLzToken(uint256 _lzTokenFee) internal virtual {
+ // @dev Cannot cache the token because it is not immutable in the endpoint.
+ address lzToken = endpoint.lzToken();
+ if (lzToken == address(0)) revert LzTokenUnavailable();
+
+ // Pay LZ token fee by sending tokens to the endpoint.
+ IERC20(lzToken).safeTransferFrom(
+ msg.sender,
+ address(endpoint),
+ _lzTokenFee
+ );
+ }
+}
diff --git a/projects/bridge-lz/contracts/OAppUpgradeable.sol b/projects/bridge-lz/contracts/OAppUpgradeable.sol
new file mode 100644
index 00000000..1450e9d9
--- /dev/null
+++ b/projects/bridge-lz/contracts/OAppUpgradeable.sol
@@ -0,0 +1,47 @@
+// SPDX-License-Identifier: MIT
+pragma solidity ^0.8.23;
+
+// @dev Import the 'MessagingFee' and 'MessagingReceipt' so it's exposed to OApp implementers
+// solhint-disable-next-line no-unused-import
+import {OAppSenderUpgradeable, MessagingFee, MessagingReceipt} from "./OAppSenderUpgradeable.sol";
+// @dev Import the 'Origin' so it's exposed to OApp implementers
+// solhint-disable-next-line no-unused-import
+import {OAppReceiverUpgradeable, Origin} from "./OAppReceiverUpgradeable.sol";
+import {OAppCoreUpgradeable} from "./OAppCoreUpgradeable.sol";
+
+/**
+ * @title OAppUpgradeable
+ * @author InceptionLRT
+ * @dev Abstract contract serving as the base for OApp implementation, combining OAppSender and OAppReceiver functionality.
+ */
+abstract contract OAppUpgradeable is
+ OAppSenderUpgradeable,
+ OAppReceiverUpgradeable
+{
+ /**
+ * @dev Initializer to initialize the OApp with the provided endpoint and owner.
+ * @param _endpoint The address of the LOCAL LayerZero endpoint.
+ * @param _delegate The delegate capable of making OApp configurations inside of the endpoint.
+ */
+ function __OAppUpgradeable_init(
+ address _endpoint,
+ address _delegate
+ ) internal {
+ __OAppCoreUpgradeable_init(_endpoint, _delegate);
+ }
+
+ /**
+ * @notice Retrieves the OApp version information.
+ * @return senderVersion The version of the OAppSender.sol implementation.
+ * @return receiverVersion The version of the OAppReceiver.sol implementation.
+ */
+ function oAppVersion()
+ public
+ pure
+ virtual
+ override(OAppSenderUpgradeable, OAppReceiverUpgradeable)
+ returns (uint64 senderVersion, uint64 receiverVersion)
+ {
+ return (SENDER_VERSION, RECEIVER_VERSION);
+ }
+}
diff --git a/projects/bridge-lz/contracts/OptionsCreator.sol b/projects/bridge-lz/contracts/OptionsCreator.sol
new file mode 100644
index 00000000..fcfbae7a
--- /dev/null
+++ b/projects/bridge-lz/contracts/OptionsCreator.sol
@@ -0,0 +1,23 @@
+// SPDX-License-Identifier: MIT
+pragma solidity 0.8.27;
+
+import {OptionsBuilder} from "@layerzerolabs/oapp-evm/contracts/oapp/libs/OptionsBuilder.sol";
+
+contract OptionsCreator {
+ using OptionsBuilder for bytes;
+
+ /// @notice Creates options for executing `lzReceive` on the destination chain.
+ /// @param _gas The gas amount for the `lzReceive` execution.
+ /// @param _value The msg.value for the `lzReceive` execution.
+ /// @return bytes-encoded option set for `lzReceive` executor.
+ function createLzReceiveOption(
+ uint256 _gas,
+ uint256 _value
+ ) public pure returns (bytes memory) {
+ return
+ OptionsBuilder.newOptions().addExecutorLzReceiveOption(
+ uint128(_gas),
+ uint128(_value)
+ );
+ }
+}
diff --git a/projects/bridge-lz/contracts/SampleApp.sol b/projects/bridge-lz/contracts/SampleApp.sol
new file mode 100644
index 00000000..95c1488f
--- /dev/null
+++ b/projects/bridge-lz/contracts/SampleApp.sol
@@ -0,0 +1,120 @@
+// SPDX-License-Identifier: MIT
+
+pragma solidity ^0.8.22;
+
+import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";
+import {OApp, MessagingFee, Origin} from "@layerzerolabs/oapp-evm/contracts/oapp/OApp.sol";
+import {MessagingReceipt} from "@layerzerolabs/oapp-evm/contracts/oapp/OAppSender.sol";
+import {OptionsBuilder} from "@layerzerolabs/oapp-evm/contracts/oapp/libs/OptionsBuilder.sol";
+
+contract SampleApp is OApp {
+ using OptionsBuilder for bytes;
+
+ constructor(
+ address _endpoint,
+ address _delegate
+ ) OApp(_endpoint, _delegate) Ownable(_delegate) {}
+
+ event DataSent();
+ event EthSent(uint256 amount);
+ event DataReceived();
+ event EthReceived(uint256 amount);
+
+ string public data = "Nothing received yet.";
+
+ function sendData(
+ uint32 _dstEid,
+ string memory _message,
+ uint256 _gas
+ ) external payable {
+ bytes memory options = createLzReceiveOption(_gas, 0);
+ bytes memory _payload = abi.encode(_message);
+ _lzSend(
+ _dstEid,
+ _payload,
+ options,
+ MessagingFee(msg.value, 0),
+ payable(msg.sender)
+ );
+
+ emit DataSent();
+ }
+
+ function sendEth(
+ uint32 _dstEid,
+ uint256 _value,
+ uint256 _gas
+ ) external payable {
+ bytes memory options = createLzReceiveOption(_gas, _value);
+ _lzSend(
+ _dstEid,
+ "",
+ options,
+ MessagingFee(msg.value, 0),
+ payable(msg.sender)
+ );
+
+ emit EthSent(_value);
+ }
+
+ function quoteData(
+ uint32 _dstEid,
+ string memory _message,
+ uint256 _gas
+ ) public view returns (uint256) {
+ bytes memory payload = abi.encode(_message);
+ bytes memory options = createLzReceiveOption(_gas, 0);
+ MessagingFee memory fee = _quote(_dstEid, payload, options, false);
+ return fee.nativeFee;
+ }
+
+ function quoteSendEth(
+ uint32 _dstEid,
+ uint256 _value,
+ uint256 _gas
+ ) public view returns (uint256) {
+ bytes memory options = createLzReceiveOption(_gas, _value);
+ MessagingFee memory fee = _quote(_dstEid, "", options, false);
+ return fee.nativeFee;
+ }
+
+ function setPeer(uint32 _eid, bytes32 _peer) public override {
+ _setPeer(_eid, _peer);
+ }
+
+ function createLzReceiveOption(
+ uint256 _gas,
+ uint256 _value
+ ) public pure returns (bytes memory) {
+ return
+ OptionsBuilder.newOptions().addExecutorLzReceiveOption(
+ uint128(_gas),
+ uint128(_value)
+ );
+ }
+
+ /**
+ * @dev Internal function override to handle incoming messages from another chain.
+ * @dev _origin A struct containing information about the message sender.
+ * @dev _guid A unique global packet identifier for the message.
+ * @param payload The encoded message payload being received.
+ *
+ * @dev The following params are unused in the current implementation of the OApp.
+ * @dev _executor The address of the Executor responsible for processing the message.
+ * @dev _extraData Arbitrary data appended by the Executor to the message.
+ *
+ * Decodes the received payload and processes it as per the business logic defined in the function.
+ */
+ function _lzReceive(
+ Origin calldata /*_origin*/,
+ bytes32 /*_guid*/,
+ bytes calldata payload,
+ address /*_executor*/,
+ bytes calldata /*_extraData*/
+ ) internal override {
+ data = abi.decode(payload, (string));
+ if (msg.value > 0) {
+ emit EthReceived(msg.value);
+ }
+ }
+}
diff --git a/projects/bridge-lz/contracts/abstract/AbstractCrossChainAdapter.sol b/projects/bridge-lz/contracts/abstract/AbstractCrossChainAdapter.sol
new file mode 100644
index 00000000..6db05be6
--- /dev/null
+++ b/projects/bridge-lz/contracts/abstract/AbstractCrossChainAdapter.sol
@@ -0,0 +1,58 @@
+// SPDX-License-Identifier: MIT
+pragma solidity 0.8.27;
+
+import {Address} from "@openzeppelin/contracts/utils/Address.sol";
+import {Initializable} from "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol";
+import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol";
+import {OAppUpgradeable} from "../OAppUpgradeable.sol";
+
+import {ICrossChainBridge} from "../interfaces/ICrossChainBridge.sol";
+
+/**
+ * @title AbstractCrossChainAdapter
+ * @author InceptionLRT
+ * @dev This abstract contract provides core functionality for cross-chain ETH transfers.
+ * It allows designated target receivers to handle incoming cross-chain ETH deposits
+ * and provides recovery of contract-held ETH to a specified receiver.
+ * This contract is intended to be inherited by contracts implementing specific cross-chain bridge logic.
+ */
+abstract contract AbstractCrossChainAdapter is ICrossChainBridge {
+ /// NOTE: targetReceiver is a term encompassing both Rebalancer on L1 or InceptionOmniTargetReceiver on L2
+ address public targetReceiver;
+
+ modifier onlyOwnerRestricted() virtual;
+
+ modifier onlyTargetReceiver() {
+ if (msg.sender != targetReceiver) {
+ revert NotTargetReceiver(msg.sender);
+ }
+ _;
+ }
+
+ function setTargetReceiver(
+ address _newTargetReceiver
+ ) external override onlyOwnerRestricted {
+ require(_newTargetReceiver != address(0), SettingZeroAddress());
+ emit TargetReceiverChanged(targetReceiver, _newTargetReceiver);
+ targetReceiver = _newTargetReceiver;
+ }
+
+ function recoverFunds() external override onlyOwnerRestricted {
+ require(targetReceiver != address(0), TargetReceiverNotSet());
+ uint256 amount = address(this).balance;
+ (bool success, ) = targetReceiver.call{value: amount}("");
+ require(success, TransferToTargetReceiverFailed());
+ emit RecoverFundsInitiated(amount);
+ }
+
+ //primary function for receiving ETH from other chain
+ function _handleCrossChainEth(uint256 _chainId) internal {
+ emit CrossChainEthDeposit(_chainId, msg.value);
+ Address.sendValue(payable(targetReceiver), msg.value);
+ }
+
+ /// @dev fallback function just in case a cross-chain adapter messes up sending ETH to the right function
+ receive() external payable override {
+ emit ReceiveTriggered(msg.sender, msg.value);
+ }
+}
diff --git a/projects/bridge-lz/contracts/abstract/AbstractCrossChainAdapterL1.sol b/projects/bridge-lz/contracts/abstract/AbstractCrossChainAdapterL1.sol
new file mode 100644
index 00000000..9309e9ee
--- /dev/null
+++ b/projects/bridge-lz/contracts/abstract/AbstractCrossChainAdapterL1.sol
@@ -0,0 +1,48 @@
+// SPDX-License-Identifier: MIT
+pragma solidity 0.8.27;
+
+import {ICrossChainBridgeL1} from "../interfaces/ICrossChainBridgeL1.sol";
+import {AbstractCrossChainAdapter} from "./AbstractCrossChainAdapter.sol";
+import {IRebalancer} from "../interfaces/IRebalancer.sol";
+
+/**
+ * @title AbstractCrossChainAdapter
+ * @author InceptionLRT
+ * @dev This abstract contract extends `AbstractCrossChainAdapter` with functionality specific to receiving
+ * cross-chain data from Layer 2 to Layer 1. It decodes and processes data from incoming cross-chain messages,
+ * updating the designated `targetReceiver` with timestamped balance and supply information.
+ * Intended for use by Layer 1 cross-chain bridge adapters.
+ */
+abstract contract AbstractCrossChainAdapterL1 is
+ AbstractCrossChainAdapter,
+ ICrossChainBridgeL1
+{
+ function _handleCrossChainData(
+ uint256 _chainId,
+ bytes calldata _payload
+ ) internal {
+ require(targetReceiver != address(0), TargetReceiverNotSet());
+ (
+ uint256 timestamp,
+ uint256 totalSupply,
+ uint256 balance
+ ) = _decodeCalldata(_payload);
+ IRebalancer(targetReceiver).handleL2Info(
+ _chainId,
+ timestamp,
+ balance,
+ totalSupply
+ );
+ emit CrossChainInfoReceived(_chainId, timestamp, balance, totalSupply);
+ }
+
+ function _decodeCalldata(
+ bytes calldata payload
+ ) internal pure returns (uint256, uint256, uint256) {
+ (uint256 timestamp, uint256 balance, uint256 totalSupply) = abi.decode(
+ payload,
+ (uint256, uint256, uint256)
+ );
+ return (timestamp, balance, totalSupply);
+ }
+}
diff --git a/projects/bridge-lz/contracts/abstract/AbstractCrossChainAdapterL2.sol b/projects/bridge-lz/contracts/abstract/AbstractCrossChainAdapterL2.sol
new file mode 100644
index 00000000..71189fc2
--- /dev/null
+++ b/projects/bridge-lz/contracts/abstract/AbstractCrossChainAdapterL2.sol
@@ -0,0 +1,19 @@
+// SPDX-License-Identifier: MIT
+pragma solidity 0.8.27;
+
+import {ICrossChainBridgeL2} from "../interfaces/ICrossChainBridgeL2.sol";
+import {AbstractCrossChainAdapter} from "./AbstractCrossChainAdapter.sol";
+
+/**
+ * @title AbstractCrossChainAdapterL2
+ * @dev This abstract contract is a placeholder for Layer 2 cross-chain bridge functionality. It extends
+ * `AbstractCrossChainAdapter` and implements `ICrossChainBridgeL2`, serving as a placeholder for functionalities of Layer 2
+ * cross-chain adapters.
+ */
+
+abstract contract AbstractCrossChainAdapterL2 is
+ AbstractCrossChainAdapter,
+ ICrossChainBridgeL2
+{
+ //EMPTY... for now
+}
diff --git a/projects/bridge-lz/contracts/abstract/AbstractLZCrossChainAdapter.sol b/projects/bridge-lz/contracts/abstract/AbstractLZCrossChainAdapter.sol
new file mode 100644
index 00000000..fe54f423
--- /dev/null
+++ b/projects/bridge-lz/contracts/abstract/AbstractLZCrossChainAdapter.sol
@@ -0,0 +1,122 @@
+// SPDX-License-Identifier: MIT
+pragma solidity 0.8.27;
+
+import {Initializable} from "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol";
+import {Address} from "@openzeppelin/contracts/utils/Address.sol";
+import {Origin, MessagingReceipt, MessagingFee} from "@layerzerolabs/oapp-evm/contracts/oapp/OApp.sol";
+import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol";
+
+import {AbstractCrossChainAdapter} from "../abstract/AbstractCrossChainAdapter.sol";
+import {ICrossChainBridge} from "../interfaces/ICrossChainBridge.sol";
+import {OAppUpgradeable} from "../OAppUpgradeable.sol";
+
+/**
+ * @title AbstractLZCrossChainAdapter
+ * @dev Provides foundational cross-chain messaging functionality using LayerZero's messaging protocols.
+ * This contract includes methods to send and quote cross-chain ETH transactions, map LayerZero Endpoint IDs (EIDs)
+ * to chain IDs, and configure peer contracts for cross-chain interaction. It is intended to be inherited by specific
+ * cross-chain adapter implementations.
+ */
+abstract contract AbstractLZCrossChainAdapter is
+ ICrossChainBridge,
+ OAppUpgradeable
+{
+ error NoDestEidFoundForChainId(uint256 chainId);
+ error ArraysLengthsMismatch();
+ error OptionsTooShort();
+
+ mapping(uint32 => uint256) public eidToChainId;
+ mapping(uint256 => uint32) public chainIdToEid;
+
+ modifier onlyOwnerRestricted() virtual;
+ modifier onlyTargetReceiverRestricted() virtual;
+
+ function sendEthCrossChain(
+ uint256 _chainId,
+ bytes memory _options
+ ) external payable override onlyTargetReceiverRestricted {
+ _sendCrosschain(_chainId, new bytes(0), _options);
+ }
+
+ function _quote(
+ uint256 _chainId,
+ bytes calldata _payload,
+ bytes memory _options
+ ) internal view returns (uint256) {
+ uint32 dstEid = getEidFromChainId(_chainId);
+ if (dstEid == 0) revert NoDestEidFoundForChainId(_chainId);
+ MessagingFee memory fee = _quote(dstEid, _payload, _options, false);
+ return fee.nativeFee;
+ }
+
+ function quoteSendEth(
+ uint256 _chainId,
+ bytes memory _options
+ ) external view override returns (uint256) {
+ uint32 dstEid = getEidFromChainId(_chainId);
+ if (dstEid == 0) revert NoDestEidFoundForChainId(_chainId);
+
+ bytes memory emptyPayload = "";
+ MessagingFee memory fee = _quote(dstEid, emptyPayload, _options, false);
+ return fee.nativeFee;
+ }
+
+ function setChainIdFromEid(
+ uint32 _eid,
+ uint256 _chainId
+ ) public onlyOwnerRestricted {
+ eidToChainId[_eid] = _chainId;
+ chainIdToEid[_chainId] = _eid;
+ emit ChainIdAdded(_chainId);
+ }
+
+ function getChainIdFromEid(uint32 _eid) public view returns (uint256) {
+ return eidToChainId[_eid];
+ }
+
+ function getEidFromChainId(uint256 _chainId) public view returns (uint32) {
+ return chainIdToEid[_chainId];
+ }
+
+ function setPeer(
+ uint32 _eid,
+ bytes32 _peer
+ ) public override onlyOwnerRestricted {
+ _setPeer(_eid, _peer);
+ }
+
+ function _sendCrosschain(
+ uint256 _chainId,
+ bytes memory _payload,
+ bytes memory _options
+ ) internal {
+ uint32 dstEid = getEidFromChainId(_chainId);
+ MessagingReceipt memory receipt = _lzSend(
+ dstEid,
+ _payload,
+ _options,
+ MessagingFee(msg.value, 0),
+ payable(msg.sender)
+ );
+
+ uint256 fee = receipt.fee.nativeFee - this.getValueFromOpts(_options);
+ emit CrossChainMessageSent(
+ _chainId,
+ this.getValueFromOpts(_options),
+ _payload,
+ fee
+ );
+ }
+
+ function getValueFromOpts(
+ bytes calldata _options
+ ) public pure override returns (uint256) {
+ require(_options.length >= 16, OptionsTooShort());
+ if (_options.length <= 32) {
+ return 0;
+ }
+ uint256 valueStart = _options.length - 16;
+ uint256 valueEnd = _options.length;
+ return uint256(uint128(bytes16(_options[valueStart:valueEnd])));
+ }
+}
diff --git a/projects/bridge-lz/contracts/interfaces/ICrossChainBridge.sol b/projects/bridge-lz/contracts/interfaces/ICrossChainBridge.sol
new file mode 100644
index 00000000..52d5c71c
--- /dev/null
+++ b/projects/bridge-lz/contracts/interfaces/ICrossChainBridge.sol
@@ -0,0 +1,50 @@
+// SPDX-License-Identifier: MIT
+pragma solidity 0.8.27;
+
+interface ICrossChainBridge {
+ event TargetReceiverChanged(
+ address prevTargetReceiver,
+ address newTargetReceiver
+ );
+ event RecoverFundsInitiated(uint256 amount);
+ event ReceiveTriggered(address caller, uint256 amount);
+ event CrossChainEthDeposit(uint256 chainId, uint256 amount);
+ event ChainIdAdded(uint256 _chainId);
+ event CrossChainMessageReceived(
+ uint256 indexed chainId,
+ uint256 value,
+ bytes data
+ );
+ event CrossChainMessageSent(
+ uint256 indexed chainId,
+ uint256 value,
+ bytes data,
+ uint256 fee
+ );
+
+ error TargetReceiverNotSet();
+ error TransferToTargetReceiverFailed();
+ error SettingZeroAddress();
+ error NotTargetReceiver(address caller);
+ error ChainIdNotFound(uint256 chainId);
+
+ function setTargetReceiver(address _newTargetReceiver) external;
+
+ function recoverFunds() external;
+
+ function quoteSendEth(
+ uint256 _chainId,
+ bytes memory _options
+ ) external view returns (uint256);
+
+ function sendEthCrossChain(
+ uint256 _chainId,
+ bytes memory _options
+ ) external payable;
+
+ function getValueFromOpts(
+ bytes calldata _options
+ ) external view returns (uint256);
+
+ receive() external payable;
+}
diff --git a/projects/bridge-lz/contracts/interfaces/ICrossChainBridgeL1.sol b/projects/bridge-lz/contracts/interfaces/ICrossChainBridgeL1.sol
new file mode 100644
index 00000000..aac1a99f
--- /dev/null
+++ b/projects/bridge-lz/contracts/interfaces/ICrossChainBridgeL1.sol
@@ -0,0 +1,13 @@
+// SPDX-License-Identifier: MIT
+pragma solidity 0.8.27;
+
+import {ICrossChainBridge} from "./ICrossChainBridge.sol";
+
+interface ICrossChainBridgeL1 is ICrossChainBridge {
+ event CrossChainInfoReceived(
+ uint256 indexed chainId,
+ uint256 timestamp,
+ uint256 balance,
+ uint256 totalSupply
+ );
+}
diff --git a/projects/bridge-lz/contracts/interfaces/ICrossChainBridgeL2.sol b/projects/bridge-lz/contracts/interfaces/ICrossChainBridgeL2.sol
new file mode 100644
index 00000000..dec30710
--- /dev/null
+++ b/projects/bridge-lz/contracts/interfaces/ICrossChainBridgeL2.sol
@@ -0,0 +1,16 @@
+// SPDX-License-Identifier: MIT
+pragma solidity 0.8.27;
+
+import {ICrossChainBridge} from "./ICrossChainBridge.sol";
+
+interface ICrossChainBridgeL2 is ICrossChainBridge {
+ function quote(
+ bytes calldata _payload,
+ bytes memory _options
+ ) external view returns (uint256);
+
+ function sendDataL1(
+ bytes calldata _payload,
+ bytes memory _options
+ ) external payable;
+}
diff --git a/projects/bridge-lz/contracts/interfaces/IOAppCoreUpgradeable.sol b/projects/bridge-lz/contracts/interfaces/IOAppCoreUpgradeable.sol
new file mode 100644
index 00000000..57732cf0
--- /dev/null
+++ b/projects/bridge-lz/contracts/interfaces/IOAppCoreUpgradeable.sol
@@ -0,0 +1,49 @@
+// SPDX-License-Identifier: MIT
+
+pragma solidity ^0.8.23;
+
+import {ILayerZeroEndpointV2} from "@layerzerolabs/lz-evm-protocol-v2/contracts/interfaces/ILayerZeroEndpointV2.sol";
+
+/**
+ * @title IOAppCoreUpgrageable
+ */
+interface IOAppCoreUpgradeable {
+ // Custom error messages
+ error OnlyPeer(uint32 eid, bytes32 sender);
+ error NoPeer(uint32 eid);
+ error InvalidEndpointCall();
+ error InvalidDelegate();
+
+ // Event emitted when a peer (OApp) is set for a corresponding endpoint
+ event PeerSet(uint32 eid, bytes32 peer);
+
+ /**
+ * @notice Retrieves the OApp version information.
+ * @return senderVersion The version of the OAppSender.sol contract.
+ * @return receiverVersion The version of the OAppReceiver.sol contract.
+ */
+ function oAppVersion()
+ external
+ view
+ returns (uint64 senderVersion, uint64 receiverVersion);
+
+ /**
+ * @notice Retrieves the LayerZero endpoint associated with the OApp.
+ * @return iEndpoint The LayerZero endpoint as an interface.
+ */
+ function endpoint() external view returns (ILayerZeroEndpointV2 iEndpoint);
+
+ /**
+ * @notice Retrieves the peer (OApp) associated with a corresponding endpoint.
+ * @param _eid The endpoint ID.
+ * @return peer The peer address (OApp instance) associated with the corresponding endpoint.
+ */
+ function peers(uint32 _eid) external view returns (bytes32 peer);
+
+ /**
+ * @notice Sets the peer address (OApp instance) for a corresponding endpoint.
+ * @param _eid The endpoint ID.
+ * @param _peer The address of the peer to be associated with the corresponding endpoint.
+ */
+ function setPeer(uint32 _eid, bytes32 _peer) external;
+}
diff --git a/projects/bridge-lz/contracts/interfaces/IOAppReceiverUpgradeable.sol b/projects/bridge-lz/contracts/interfaces/IOAppReceiverUpgradeable.sol
new file mode 100644
index 00000000..f6565760
--- /dev/null
+++ b/projects/bridge-lz/contracts/interfaces/IOAppReceiverUpgradeable.sol
@@ -0,0 +1,29 @@
+// SPDX-License-Identifier: MIT
+
+pragma solidity ^0.8.23;
+
+import {ILayerZeroReceiver, Origin} from "@layerzerolabs/lz-evm-protocol-v2/contracts/interfaces/ILayerZeroReceiver.sol";
+
+/**
+ * @title IOAppReceiverUpgradeable
+ */
+interface IOAppReceiverUpgradeable is ILayerZeroReceiver {
+ /**
+ * @notice Indicates whether an address is an approved composeMsg sender to the Endpoint.
+ * @param _origin The origin information containing the source endpoint and sender address.
+ * - srcEid: The source chain endpoint ID.
+ * - sender: The sender address on the src chain.
+ * - nonce: The nonce of the message.
+ * @param _message The lzReceive payload.
+ * @param _sender The sender address.
+ * @return isSender Is a valid sender.
+ *
+ * @dev Applications can optionally choose to implement a separate composeMsg sender that is NOT the bridging layer.
+ * @dev The default sender IS the OAppReceiver implementer.
+ */
+ function isComposeMsgSender(
+ Origin calldata _origin,
+ bytes calldata _message,
+ address _sender
+ ) external view returns (bool isSender);
+}
diff --git a/projects/bridge-lz/contracts/interfaces/IRebalancer.sol b/projects/bridge-lz/contracts/interfaces/IRebalancer.sol
new file mode 100644
index 00000000..2b14bb4c
--- /dev/null
+++ b/projects/bridge-lz/contracts/interfaces/IRebalancer.sol
@@ -0,0 +1,90 @@
+// SPDX-License-Identifier: MIT
+pragma solidity ^0.8.27;
+
+interface IRebalancer {
+ struct Transaction {
+ uint256 timestamp;
+ uint256 ethBalance;
+ uint256 inceptionTokenBalance;
+ }
+
+ // Events
+ event L2InfoReceived(
+ uint256 indexed networkId,
+ uint256 timestamp,
+ uint256 ethBalance,
+ uint256 inceptionTokenBalance
+ );
+ event ETHReceived(address sender, uint256 amount);
+ event ETHDepositedToLiquidPool(address liquidPool, uint256 amountETH);
+ event InceptionTokenDepositedToLockbox(uint256 mintAmount);
+ event TreasuryUpdateMint(uint256 mintAmount);
+ event TreasuryUpdateBurn(uint256 mintAmount);
+ event LockboxChanged(address prevLockbox, address newLockbox);
+ event InceptionTokenChanged(
+ address prevInceptionToken,
+ address newInceptionToken
+ );
+ event LiqPoolChanged(address prevLiqPool, address newLiqPool);
+ event OperatorChanged(address prevOperator, address newOperator);
+ event AdapterAdded(uint256 indexed chainId, address newAdapter);
+ event DefaultBridgeChanged(
+ address indexed prevDefaultAdapter,
+ address indexed newDefaultAdapter
+ );
+ event ChainIdAdded(uint256 chainId);
+ event ChainIdDeleted(uint256 chainId, uint256 index);
+
+ error MsgNotFromBridge(address caller);
+ error ChainIdAlreadyExists(uint256 chainId);
+ error ChainIdNotFound(uint256 chainId);
+ error BridgeAlreadyExists(uint256 chainId);
+ error NoBridgeForThisChainId(uint256 chainId);
+ error TimeCannotBeInFuture(uint256 timestamp);
+ error TimeBeforePrevRecord(uint256 timestamp);
+ error SettingZeroAddress();
+ error TransferToLockboxFailed();
+ error InceptionTokenAddressNotSet();
+ error LiquidityPoolNotSet();
+ error CrosschainBridgeNotSet();
+ error MissingOneOrMoreL2Transactions(uint256 chainId);
+ error StakeAmountExceedsEthBalance(uint256 staked, uint256 availableEth);
+ error SendAmountExceedsEthBalance(uint256 amountToSend);
+ error StakeAmountExceedsMaxTVL();
+ error OnlyOperator();
+ error OnlyAdapter();
+ error NoRebalancingRequired();
+ error IndexOutOfBounds(uint256 index, uint256 length);
+ error NoAdapterAvailable(uint256 _chainId);
+
+ function handleL2Info(
+ uint256 _chainId,
+ uint256 _timestamp,
+ uint256 _balance,
+ uint256 _totalSupply
+ ) external;
+
+ function getTransactionData(
+ uint256 _chainId
+ ) external view returns (Transaction memory);
+
+ function setDefaultAdapter(address payable _newDefaultAdapter) external;
+
+ function setInceptionToken(address _inceptionTokenAddress) external;
+
+ function setLockboxAddress(address _lockboxAddress) external;
+
+ function updateTreasuryData() external;
+
+ function inceptionToken() external view returns (address);
+
+ function lockboxAddress() external view returns (address);
+
+ function liqPool() external view returns (address payable);
+
+ function ratioFeed() external view returns (address);
+
+ function operator() external view returns (address);
+
+ function defaultAdapter() external view returns (address payable);
+}
diff --git a/projects/bridge-lz/contracts/mock/EndpointMock.sol b/projects/bridge-lz/contracts/mock/EndpointMock.sol
new file mode 100644
index 00000000..f277277f
--- /dev/null
+++ b/projects/bridge-lz/contracts/mock/EndpointMock.sol
@@ -0,0 +1,844 @@
+// SPDX-License-Identifier: UNLICENSED
+pragma solidity ^0.8.22;
+
+import {SafeCast} from "@openzeppelin/contracts/utils/math/SafeCast.sol";
+import {ILayerZeroEndpointV2, MessagingParams, MessagingReceipt, MessagingFee, Origin} from "@layerzerolabs/lz-evm-protocol-v2/contracts/interfaces/ILayerZeroEndpointV2.sol";
+import {ExecutionState} from "@layerzerolabs/lz-evm-protocol-v2/contracts/EndpointV2ViewUpgradeable.sol";
+import {ILayerZeroReceiver} from "@layerzerolabs/lz-evm-protocol-v2/contracts/interfaces/ILayerZeroReceiver.sol";
+import {SetConfigParam} from "@layerzerolabs/lz-evm-protocol-v2/contracts/interfaces/IMessageLibManager.sol";
+import {MessagingContext} from "@layerzerolabs/lz-evm-protocol-v2/contracts/MessagingContext.sol";
+import {Packet} from "@layerzerolabs/lz-evm-protocol-v2/contracts/interfaces/ISendLib.sol";
+import {OFTMsgCodec} from "@layerzerolabs/oft-evm/contracts/libs/OFTMsgCodec.sol";
+import {Origin} from "@layerzerolabs/oapp-evm/contracts/oapp/OAppReceiver.sol";
+import {Errors} from "@layerzerolabs/lz-evm-protocol-v2/contracts/libs/Errors.sol";
+import {GUID} from "@layerzerolabs/lz-evm-protocol-v2/contracts/libs/GUID.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 {WorkerOptions} from "@layerzerolabs/lz-evm-messagelib-v2/contracts/SendLibBase.sol";
+import {IExecutorFeeLib} from "@layerzerolabs/lz-evm-messagelib-v2/contracts/interfaces/IExecutorFeeLib.sol";
+import {DVNOptions} from "@layerzerolabs/lz-evm-messagelib-v2/contracts/uln/libs/DVNOptions.sol";
+import {UlnOptions} from "@layerzerolabs/lz-evm-messagelib-v2/contracts/uln/libs/UlnOptions.sol";
+import {CalldataBytesLib} from "@layerzerolabs/lz-evm-protocol-v2/contracts/libs/CalldataBytesLib.sol";
+import "hardhat/console.sol";
+
+contract EndpointMock is ILayerZeroEndpointV2, MessagingContext {
+ using ExecutorOptions for bytes;
+ using OFTMsgCodec for bytes;
+ using OFTMsgCodec for bytes32;
+ using OFTMsgCodec for address;
+ using SafeCast for uint256;
+ using CalldataBytesLib for bytes;
+
+ bytes32 public constant EMPTY_PAYLOAD_HASH = bytes32(0);
+
+ uint32 public immutable eid;
+ mapping(address => address) public lzEndpointLookup;
+
+ mapping(address receiver => mapping(uint32 srcEid => mapping(bytes32 sender => uint64 nonce)))
+ public lazyInboundNonce;
+ mapping(address receiver => mapping(uint32 srcEid => mapping(bytes32 sender => mapping(uint64 inboundNonce => bytes32 payloadHash))))
+ public inboundPayloadHash;
+ mapping(address sender => mapping(uint32 dstEid => mapping(bytes32 receiver => uint64 nonce)))
+ public outboundNonce;
+
+ RelayerFeeConfig public relayerFeeConfig;
+ ProtocolFeeConfig protocolFeeConfig;
+ uint256 public verifierFee;
+
+ struct ProtocolFeeConfig {
+ uint256 zroFee;
+ uint256 nativeBP;
+ }
+
+ struct RelayerFeeConfig {
+ uint128 dstPriceRatio; // 10^10
+ uint128 dstGasPriceInWei;
+ uint128 dstNativeAmtCap;
+ uint64 baseGas;
+ uint64 gasPerByte;
+ }
+
+ uint8 internal constant _NOT_ENTERED = 1;
+ uint8 internal constant _ENTERED = 2;
+ uint8 internal _receive_entered_state = 1;
+ modifier receiveNonReentrant() {
+ require(
+ _receive_entered_state == _NOT_ENTERED,
+ "LayerZeroMock: no receive reentrancy"
+ );
+ _receive_entered_state = _ENTERED;
+ _;
+ _receive_entered_state = _NOT_ENTERED;
+ }
+
+ event ValueTransferFailed(address indexed to, uint256 indexed quantity);
+
+ constructor(uint32 _eid) {
+ eid = _eid;
+ // init config
+ relayerFeeConfig = RelayerFeeConfig({
+ dstPriceRatio: 1e10, // 1:1, same chain, same native coin
+ dstGasPriceInWei: 1e10,
+ dstNativeAmtCap: 1e19,
+ baseGas: 100,
+ gasPerByte: 1
+ });
+ protocolFeeConfig = ProtocolFeeConfig({zroFee: 1e18, nativeBP: 1000}); // BP 0.1
+ verifierFee = 1e16;
+ }
+
+ function send(
+ MessagingParams calldata _params,
+ address _refundAddress
+ )
+ public
+ payable
+ sendContext(_params.dstEid, msg.sender)
+ returns (MessagingReceipt memory receipt)
+ {
+ if (_params.payInLzToken) revert Errors.LZ_LzTokenUnavailable();
+
+ address lzEndpoint = lzEndpointLookup[
+ _params.receiver.bytes32ToAddress()
+ ];
+ require(
+ lzEndpoint != address(0),
+ "LayerZeroMock: destination LayerZero Endpoint not found"
+ );
+
+ // get the correct outbound nonce
+ uint64 latestNonce = _outbound(
+ msg.sender,
+ _params.dstEid,
+ _params.receiver
+ );
+
+ Packet memory packet = Packet({
+ nonce: latestNonce,
+ srcEid: eid,
+ sender: msg.sender,
+ dstEid: _params.dstEid,
+ receiver: _params.receiver,
+ guid: GUID.generate(
+ latestNonce,
+ eid,
+ msg.sender,
+ _params.dstEid,
+ _params.receiver
+ ),
+ message: _params.message
+ });
+ receipt.guid = packet.guid;
+ receipt.nonce = packet.nonce;
+ receipt.fee = _quote(_params, msg.sender);
+ require(
+ msg.value >= receipt.fee.nativeFee,
+ "LayerZeroMock: not enough native for fees"
+ );
+
+ // refund if they send too much
+ uint256 amount = msg.value - receipt.fee.nativeFee;
+ if (amount > 0) {
+ (bool success, ) = _refundAddress.call{value: amount}("");
+ require(success, "LayerZeroMock: failed to refund");
+ }
+
+ uint256 totalGas;
+ uint256 dstAmount;
+ (totalGas, dstAmount) = executeNativeAirDropAndReturnLzGas(
+ _params.options
+ );
+
+ // TODO fix
+ // composed calls with correct gas
+
+ Origin memory origin = Origin({
+ srcEid: packet.srcEid,
+ sender: packet.sender.addressToBytes32(),
+ nonce: packet.nonce
+ });
+
+ bytes memory payload = PacketV1Codec.encodePayload(packet);
+ bytes32 payloadHash = keccak256(payload);
+
+ EndpointMock(lzEndpoint).receivePayload{value: dstAmount}(
+ origin,
+ packet.receiver.bytes32ToAddress(),
+ payloadHash,
+ packet.message,
+ totalGas,
+ dstAmount,
+ packet.guid
+ );
+ }
+
+ function receivePayload(
+ Origin calldata _origin,
+ address _receiver,
+ bytes32 _payloadHash,
+ bytes calldata _message,
+ uint256 _gas,
+ uint256 _msgValue,
+ bytes32 _guid
+ ) external payable receiveNonReentrant {
+ inboundPayloadHash[_receiver][_origin.srcEid][_origin.sender][
+ _origin.nonce
+ ] = _payloadHash;
+ console.log("EndpointMock :: message.value:", _msgValue);
+ if (_msgValue > 0) {
+ ILayerZeroReceiver(_receiver).lzReceive{
+ value: _msgValue,
+ gas: _gas
+ }(_origin, _guid, _message, address(0), "");
+ } else {
+ ILayerZeroReceiver(_receiver).lzReceive{gas: _gas}(
+ _origin,
+ _guid,
+ _message,
+ address(0),
+ ""
+ );
+ }
+ }
+
+ function getExecutorFee(
+ uint256 _payloadSize,
+ bytes calldata _options
+ ) public view returns (uint256) {
+ uint256 nativeFee;
+ // 2) get Executor fee
+ // a) decodeLzReceiveOption
+ // b) decodeNativeDropOption
+ // c) decodeLzComposeOption
+ (uint256 totalDstAmount, uint256 totalGas) = _decodeExecutorOptions(
+ _options
+ );
+ uint256 remoteGasTotal = relayerFeeConfig.dstGasPriceInWei *
+ (relayerFeeConfig.baseGas + totalGas);
+ nativeFee += totalDstAmount + remoteGasTotal;
+
+ // tokenConversionRate = dstPrice / localPrice
+ // basePrice = totalRemoteToken * tokenConversionRate
+ uint256 basePrice = (nativeFee * relayerFeeConfig.dstPriceRatio) /
+ 10 ** 10;
+
+ // pricePerByte = (dstGasPriceInWei * gasPerBytes) * tokenConversionRate
+ uint256 pricePerByte = ((relayerFeeConfig.dstGasPriceInWei *
+ relayerFeeConfig.gasPerByte *
+ relayerFeeConfig.dstPriceRatio) / 10 ** 10) * _payloadSize;
+
+ return basePrice + pricePerByte;
+ }
+
+ function _quote(
+ MessagingParams calldata _params,
+ address /*_sender*/
+ ) internal view returns (MessagingFee memory messagingFee) {
+ (bytes memory executorOptions, ) = splitOptions(_params.options);
+
+ // 2) get Executor fee
+ uint256 executorFee = this.getExecutorFee(
+ _params.message.length,
+ executorOptions
+ );
+
+ // 1) get Verifier fee
+ // 3) get Treasury fee
+ uint256 treasuryAndVerifierFee = _getTreasuryAndVerifierFees(
+ executorFee,
+ verifierFee
+ );
+
+ messagingFee.lzTokenFee = 0;
+ messagingFee.nativeFee = executorFee + treasuryAndVerifierFee;
+ }
+
+ function _getTreasuryAndVerifierFees(
+ uint256 _executorFee,
+ uint256 _verifierFee
+ ) internal view returns (uint256) {
+ return
+ ((_executorFee + _verifierFee) * protocolFeeConfig.nativeBP) /
+ 10000;
+ }
+
+ function _outbound(
+ address _sender,
+ uint32 _dstEid,
+ bytes32 _receiver
+ ) internal returns (uint64 nonce) {
+ unchecked {
+ nonce = ++outboundNonce[_sender][_dstEid][_receiver];
+ }
+ }
+
+ function setDestLzEndpoint(
+ address destAddr,
+ address lzEndpointAddr
+ ) external {
+ lzEndpointLookup[destAddr] = lzEndpointAddr;
+ }
+
+ function _decodeExecutorOptions(
+ bytes calldata _options
+ ) internal view returns (uint256 dstAmount, uint256 totalGas) {
+ if (_options.length == 0) {
+ revert IExecutorFeeLib.Executor_NoOptions();
+ }
+
+ uint256 cursor = 0;
+ totalGas = relayerFeeConfig.baseGas;
+
+ while (cursor < _options.length) {
+ (
+ uint8 optionType,
+ bytes calldata option,
+ uint256 newCursor
+ ) = _options.nextExecutorOption(cursor);
+ cursor = newCursor;
+
+ if (optionType == ExecutorOptions.OPTION_TYPE_LZRECEIVE) {
+ (uint128 gas, uint128 value) = ExecutorOptions
+ .decodeLzReceiveOption(option);
+ dstAmount += value;
+ totalGas += gas;
+ } else if (optionType == ExecutorOptions.OPTION_TYPE_NATIVE_DROP) {
+ (uint128 nativeDropAmount, ) = ExecutorOptions
+ .decodeNativeDropOption(option);
+ dstAmount += nativeDropAmount;
+ } else if (optionType == ExecutorOptions.OPTION_TYPE_LZCOMPOSE) {
+ (, uint128 gas, uint128 value) = ExecutorOptions
+ .decodeLzComposeOption(option);
+ dstAmount += value;
+ totalGas += gas;
+ } else {
+ revert IExecutorFeeLib.Executor_UnsupportedOptionType(
+ optionType
+ );
+ }
+ }
+
+ if (cursor != _options.length)
+ revert IExecutorFeeLib.Executor_InvalidExecutorOptions(cursor);
+ if (dstAmount > relayerFeeConfig.dstNativeAmtCap)
+ revert IExecutorFeeLib.Executor_NativeAmountExceedsCap(
+ dstAmount,
+ relayerFeeConfig.dstNativeAmtCap
+ );
+ }
+
+ function splitOptions(
+ bytes calldata _options
+ ) internal pure returns (bytes memory, WorkerOptions[] memory) {
+ (bytes memory executorOpts, bytes memory dvnOpts) = decode(_options);
+
+ if (dvnOpts.length == 0) {
+ return (executorOpts, new WorkerOptions[](0));
+ }
+
+ WorkerOptions[] memory workerOpts = new WorkerOptions[](1);
+ workerOpts[0] = WorkerOptions(DVNOptions.WORKER_ID, dvnOpts);
+ return (executorOpts, workerOpts);
+ }
+
+ function decode(
+ bytes calldata _options
+ )
+ internal
+ pure
+ returns (bytes memory executorOptions, bytes memory dvnOptions)
+ {
+ // at least 2 bytes for the option type, but can have no options
+ if (_options.length < 2)
+ revert UlnOptions.LZ_ULN_InvalidWorkerOptions(0);
+
+ uint16 optionsType = uint16(bytes2(_options[0:2]));
+ uint256 cursor = 2;
+
+ // type3 options: [worker_option][worker_option]...
+ // worker_option: [worker_id][option_size][option]
+ // worker_id: uint8, option_size: uint16, option: bytes
+ if (optionsType == UlnOptions.TYPE_3) {
+ unchecked {
+ uint256 start = cursor;
+ uint8 lastWorkerId; // worker_id starts from 1, so 0 is an invalid worker_id
+
+ // heuristic: we assume that the options are mostly EXECUTOR options only
+ // checking the workerID can reduce gas usage for most cases
+ while (cursor < _options.length) {
+ uint8 workerId = uint8(bytes1(_options[cursor:cursor + 1]));
+ if (workerId == 0)
+ revert UlnOptions.LZ_ULN_InvalidWorkerId(0);
+
+ // workerId must equal to the lastWorkerId for the first option
+ // so it is always skipped in the first option
+ // this operation slices out options whenever the scan finds a different workerId
+ if (lastWorkerId == 0) {
+ lastWorkerId = workerId;
+ } else if (workerId != lastWorkerId) {
+ bytes calldata op = _options[start:cursor]; // slice out the last worker's options
+ (executorOptions, dvnOptions) = _insertWorkerOptions(
+ executorOptions,
+ dvnOptions,
+ lastWorkerId,
+ op
+ );
+
+ // reset the start cursor and lastWorkerId
+ start = cursor;
+ lastWorkerId = workerId;
+ }
+
+ ++cursor; // for workerId
+
+ uint16 size = uint16(bytes2(_options[cursor:cursor + 2]));
+ if (size == 0)
+ revert UlnOptions.LZ_ULN_InvalidWorkerOptions(cursor);
+ cursor += size + 2;
+ }
+
+ // the options length must be the same as the cursor at the end
+ if (cursor != _options.length)
+ revert UlnOptions.LZ_ULN_InvalidWorkerOptions(cursor);
+
+ // if we have reached the end of the options and the options are not empty
+ // we need to process the last worker's options
+ if (_options.length > 2) {
+ bytes calldata op = _options[start:cursor];
+ (executorOptions, dvnOptions) = _insertWorkerOptions(
+ executorOptions,
+ dvnOptions,
+ lastWorkerId,
+ op
+ );
+ }
+ }
+ } else {
+ executorOptions = decodeLegacyOptions(optionsType, _options);
+ }
+ }
+
+ function _insertWorkerOptions(
+ bytes memory _executorOptions,
+ bytes memory _dvnOptions,
+ uint8 _workerId,
+ bytes calldata _newOptions
+ ) private pure returns (bytes memory, bytes memory) {
+ if (_workerId == ExecutorOptions.WORKER_ID) {
+ _executorOptions = _executorOptions.length == 0
+ ? _newOptions
+ : abi.encodePacked(_executorOptions, _newOptions);
+ } else if (_workerId == DVNOptions.WORKER_ID) {
+ _dvnOptions = _dvnOptions.length == 0
+ ? _newOptions
+ : abi.encodePacked(_dvnOptions, _newOptions);
+ } else {
+ revert UlnOptions.LZ_ULN_InvalidWorkerId(_workerId);
+ }
+ return (_executorOptions, _dvnOptions);
+ }
+
+ function decodeLegacyOptions(
+ uint16 _optionType,
+ bytes calldata _options
+ ) internal pure returns (bytes memory executorOptions) {
+ if (_optionType == UlnOptions.TYPE_1) {
+ if (_options.length != 34)
+ revert UlnOptions.LZ_ULN_InvalidLegacyType1Option();
+
+ // execution gas
+ uint128 executionGas = uint256(bytes32(_options[2:2 + 32]))
+ .toUint128();
+
+ // dont use the encode function in the ExecutorOptions lib for saving gas by calling abi.encodePacked once
+ // the result is a lzReceive option: [executor_id][option_size][option_type][execution_gas]
+ // option_type: uint8, execution_gas: uint128
+ // option_size = len(option_type) + len(execution_gas) = 1 + 16 = 17
+ executorOptions = abi.encodePacked(
+ ExecutorOptions.WORKER_ID,
+ uint16(17), // 16 + 1, 16 for option_length, + 1 for option_type
+ ExecutorOptions.OPTION_TYPE_LZRECEIVE,
+ executionGas
+ );
+ } else if (_optionType == UlnOptions.TYPE_2) {
+ // receiver size <= 32
+ if (_options.length <= 66 || _options.length > 98)
+ revert UlnOptions.LZ_ULN_InvalidLegacyType2Option();
+
+ // execution gas
+ uint128 executionGas = uint256(bytes32(_options[2:2 + 32]))
+ .toUint128();
+
+ // nativeDrop (amount + receiver)
+ uint128 amount = uint256(bytes32(_options[34:34 + 32])).toUint128(); // offset 2 + 32
+ bytes32 receiver;
+ unchecked {
+ uint256 receiverLen = _options.length - 66; // offset 2 + 32 + 32
+ receiver = bytes32(_options[66:]);
+ receiver = receiver >> (8 * (32 - receiverLen)); // padding 0 to the left
+ }
+
+ // dont use the encode function in the ExecutorOptions lib for saving gas by calling abi.encodePacked once
+ // the result has one lzReceive option and one nativeDrop option:
+ // [executor_id][lzReceive_option_size][option_type][execution_gas] +
+ // [executor_id][nativeDrop_option_size][option_type][nativeDrop_amount][receiver]
+ // option_type: uint8, execution_gas: uint128, nativeDrop_amount: uint128, receiver: bytes32
+ // lzReceive_option_size = len(option_type) + len(execution_gas) = 1 + 16 = 17
+ // nativeDrop_option_size = len(option_type) + len(nativeDrop_amount) + len(receiver) = 1 + 16 + 32 = 49
+ executorOptions = abi.encodePacked(
+ ExecutorOptions.WORKER_ID,
+ uint16(17), // 16 + 1, 16 for option_length, + 1 for option_type
+ ExecutorOptions.OPTION_TYPE_LZRECEIVE,
+ executionGas,
+ ExecutorOptions.WORKER_ID,
+ uint16(49), // 48 + 1, 32 + 16 for option_length, + 1 for option_type
+ ExecutorOptions.OPTION_TYPE_NATIVE_DROP,
+ amount,
+ receiver
+ );
+ } else {
+ revert UlnOptions.LZ_ULN_UnsupportedOptionType(_optionType);
+ }
+ }
+
+ // NOT IMPLEMENTING
+ function burn(
+ address _oapp,
+ uint32 _srcEid,
+ bytes32 _sender,
+ uint64 _nonce,
+ bytes32 _payloadHash
+ ) external {}
+
+ function clear(
+ address _oapp,
+ Origin calldata _origin,
+ bytes32 _guid,
+ bytes calldata _message
+ ) external {}
+
+ mapping(address from => mapping(address to => mapping(bytes32 guid => mapping(uint16 index => bytes32 messageHash))))
+ public composeQueue;
+
+ function defaultReceiveLibrary(
+ uint32 /*_eid*/
+ ) external pure returns (address) {
+ return address(0);
+ }
+
+ function defaultReceiveLibraryTimeout(
+ uint32 /*_eid*/
+ ) external pure returns (address lib, uint256 expiry) {
+ return (address(0), 0);
+ }
+
+ function defaultSendLibrary(
+ uint32 /*_eid*/
+ ) external pure returns (address) {
+ return address(0);
+ }
+
+ function executable(
+ Origin calldata /*_origin*/,
+ address /*receiver*/
+ ) external pure returns (ExecutionState) {
+ return ExecutionState.NotExecutable;
+ }
+
+ function getConfig(
+ address /*_oapp*/,
+ address /*_lib*/,
+ uint32 /*_eid*/,
+ uint32 /*_configType*/
+ ) external pure returns (bytes memory config) {
+ return bytes("0x");
+ }
+
+ function getReceiveLibrary(
+ address /*receiver*/,
+ uint32 /*_eid*/
+ ) external pure returns (address lib, bool isDefault) {
+ return (address(0), false);
+ }
+
+ function getRegisteredLibraries() external pure returns (address[] memory) {
+ address[] memory addresses = new address[](1);
+ addresses[0] = address(0);
+ return addresses;
+ }
+
+ function getSendLibrary(
+ address /*_sender*/,
+ uint32 /*_eid*/
+ ) external pure returns (address lib) {
+ return address(0);
+ }
+
+ function inboundNonce(
+ address _receiver,
+ uint32 _srcEid,
+ bytes32 _sender
+ ) external view returns (uint64) {
+ return lazyInboundNonce[_receiver][_srcEid][_sender];
+ }
+
+ function isDefaultSendLibrary(
+ address /*_sender*/,
+ uint32 /*_eid*/
+ ) external pure returns (bool) {
+ return false;
+ }
+
+ function isRegisteredLibrary(
+ address /*_lib*/
+ ) external pure returns (bool) {
+ return false;
+ }
+
+ function isSupportedEid(uint32 /*_eid*/) external pure returns (bool) {
+ return false;
+ }
+
+ function lzCompose(
+ address /*_from,*/,
+ address /*_to,*/,
+ bytes32 /*_guid,*/,
+ uint16 /*_index,*/,
+ bytes calldata /*_message,*/,
+ bytes calldata /*_extraData*/
+ ) external payable {}
+
+ function lzReceive(
+ Origin calldata /*_origin,*/,
+ address /*_receiver,*/,
+ bytes32 /*_guid,*/,
+ bytes calldata /*_message,*/,
+ bytes calldata /*_extraData*/
+ ) external payable {}
+
+ function lzToken() external pure returns (address) {
+ return address(0);
+ }
+
+ function nativeToken() external pure returns (address) {
+ return address(0);
+ }
+
+ function nextGuid(
+ address /*_sender,*/,
+ uint32 /*_dstEid,*/,
+ bytes32 /*_receiver*/
+ ) external pure returns (bytes32) {
+ return 0;
+ }
+
+ function nilify(
+ address /*_oapp,*/,
+ uint32 /*_srcEid,*/,
+ bytes32 /*_sender,*/,
+ uint64 /*_nonce,*/,
+ bytes32 /*_payloadHash*/
+ ) external {}
+
+ function quote(
+ MessagingParams calldata _params,
+ address _sender
+ ) external view returns (MessagingFee memory) {
+ return _quote(_params, _sender);
+ }
+
+ mapping(address receiver => mapping(uint32 srcEid => Timeout))
+ public receiveLibraryTimeout;
+
+ function registerLibrary(address /*_lib*/) public {}
+
+ function sendCompose(
+ address,
+ /*_to*/ bytes32,
+ /*_guid*/ uint16,
+ /*_index*/ bytes calldata /*_message*/
+ ) external {}
+
+ function setConfig(
+ address,
+ /*_oapp*/ address,
+ /*_lib*/ SetConfigParam[] calldata /*_params*/
+ ) external {}
+
+ function setDefaultReceiveLibrary(
+ uint32 /*_eid*/,
+ address /*_newLib*/,
+ uint256 /*_gracePeriod*/
+ ) external {}
+
+ function setDefaultReceiveLibraryTimeout(
+ uint32 /*_eid*/,
+ address /*_lib*/,
+ uint256 /*_expiry*/
+ ) external {}
+
+ function setDefaultSendLibrary(
+ uint32 /*_eid*/,
+ address /*_newLib*/
+ ) external {}
+
+ function setDelegate(address /*_delegate*/) external {}
+
+ function setLzToken(address /*_lzToken*/) external {}
+
+ function setReceiveLibrary(
+ address,
+ /*_oapp*/ uint32,
+ /*_eid*/ address,
+ /*_newLib*/ uint256 /*_gracePeriod*/
+ ) external {}
+
+ function setReceiveLibraryTimeout(
+ address,
+ /*_oapp*/ uint32,
+ /*_eid*/ address,
+ /*_lib*/ uint256 /*_gracePeriod*/
+ ) external {}
+
+ function setSendLibrary(
+ address,
+ /*_oapp*/ uint32,
+ /*_eid*/ address /*_newLib*/
+ ) external {}
+
+ function skip(
+ address,
+ /*_oapp*/ uint32,
+ /*_srcEid*/ bytes32,
+ /*_sender*/ uint64 /*_nonce*/
+ ) external {}
+
+ function verifiable(
+ Origin calldata /*_origin*/,
+ address /*_receiver*/,
+ address /*_receiveLib*/,
+ bytes32 /*_payloadHash*/
+ ) external pure returns (bool) {
+ return false;
+ }
+
+ function verify(
+ Origin calldata /*origin*/,
+ address /*_receiver*/,
+ bytes32 /*_payloadHash*/
+ ) external {}
+
+ // Helper Functions
+ function executeNativeAirDropAndReturnLzGas(
+ bytes calldata _options
+ ) public returns (uint256 totalGas, uint256 dstAmount) {
+ (bytes memory executorOpts, ) = decode(_options);
+ return this._executeNativeAirDropAndReturnLzGas(executorOpts);
+ }
+
+ function _executeNativeAirDropAndReturnLzGas(
+ bytes calldata _options
+ ) public returns (uint256 totalGas, uint256 dstAmount) {
+ if (_options.length == 0) {
+ revert IExecutorFeeLib.Executor_NoOptions();
+ }
+
+ uint256 cursor = 0;
+ while (cursor < _options.length) {
+ (
+ uint8 optionType,
+ bytes calldata option,
+ uint256 newCursor
+ ) = _options.nextExecutorOption(cursor);
+ cursor = newCursor;
+
+ if (optionType == ExecutorOptions.OPTION_TYPE_LZRECEIVE) {
+ (uint128 gas, uint128 value) = ExecutorOptions
+ .decodeLzReceiveOption(option);
+ totalGas += gas;
+ dstAmount += value;
+ } else if (optionType == ExecutorOptions.OPTION_TYPE_NATIVE_DROP) {
+ (uint128 nativeDropAmount, bytes32 receiver) = ExecutorOptions
+ .decodeNativeDropOption(option);
+ (bool success, ) = receiver.bytes32ToAddress().call{
+ value: nativeDropAmount
+ }("");
+ if (!success) {
+ emit ValueTransferFailed(
+ receiver.bytes32ToAddress(),
+ nativeDropAmount
+ );
+ }
+ } else {
+ revert IExecutorFeeLib.Executor_UnsupportedOptionType(
+ optionType
+ );
+ }
+ }
+
+ if (cursor != _options.length)
+ revert IExecutorFeeLib.Executor_InvalidExecutorOptions(cursor);
+ }
+
+ function _initializable(
+ Origin calldata _origin,
+ address _receiver,
+ uint64 _lazyInboundNonce
+ ) internal view returns (bool) {
+ return
+ _lazyInboundNonce > 0 || // allowInitializePath already checked
+ ILayerZeroReceiver(_receiver).allowInitializePath(_origin);
+ }
+
+ /// @dev bytes(0) payloadHash can never be submitted
+ function _verifiable(
+ Origin calldata _origin,
+ address _receiver,
+ uint64 _lazyInboundNonce
+ ) internal view returns (bool) {
+ return
+ _origin.nonce > _lazyInboundNonce || // either initializing an empty slot or reverifying
+ inboundPayloadHash[_receiver][_origin.srcEid][_origin.sender][
+ _origin.nonce
+ ] !=
+ EMPTY_PAYLOAD_HASH; // only allow reverifying if it hasn't been executed
+ }
+
+ // ========================= VIEW FUNCTIONS FOR OFFCHAIN ONLY =========================
+ // Not involved in any state transition function.
+ // ====================================================================================
+ function initializable(
+ Origin calldata _origin,
+ address _receiver
+ ) external view returns (bool) {
+ return
+ _initializable(
+ _origin,
+ _receiver,
+ lazyInboundNonce[_receiver][_origin.srcEid][_origin.sender]
+ );
+ }
+
+ function verifiable(
+ Origin calldata _origin,
+ address _receiver
+ ) external view returns (bool) {
+ return
+ _verifiable(
+ _origin,
+ _receiver,
+ lazyInboundNonce[_receiver][_origin.srcEid][_origin.sender]
+ );
+ }
+
+ /// @dev called when the endpoint checks if the msgLib attempting to verify the msg is the configured msgLib of the Oapp
+ /// @dev this check provides the ability for Oapp to lock in a trusted msgLib
+ /// @dev it will fist check if the msgLib is the currently configured one. then check if the msgLib is the one in grace period of msgLib versioning upgrade
+ function isValidReceiveLibrary(
+ address _receiver,
+ uint32 _srcEid,
+ address _actualReceiveLib
+ ) public view returns (bool) {
+ return true;
+ }
+}
diff --git a/projects/bridge-lz/deploy/LZCrossChainAdapterL1.ts b/projects/bridge-lz/deploy/LZCrossChainAdapterL1.ts
new file mode 100644
index 00000000..163e68bf
--- /dev/null
+++ b/projects/bridge-lz/deploy/LZCrossChainAdapterL1.ts
@@ -0,0 +1,124 @@
+import assert from 'assert';
+import { DeployFunction } from 'hardhat-deploy/types';
+import { ethers, run, network } from 'hardhat';
+
+const contractName = 'LZCrossChainAdapterL1';
+
+const deploy: DeployFunction = async (hre) => {
+ const { getNamedAccounts, deployments } = hre;
+ const { deploy, save } = deployments;
+ const { deployer } = await getNamedAccounts();
+
+ assert(deployer, 'Missing named deployer account');
+ console.log(`Deployer Address: ${deployer}`);
+
+ // Check TARGET_NETWORK or default to the actual network name
+ const targetNetwork = process.env.TARGET_NETWORK || network.name;
+ const validNetworksForVerification = ['ethereum', 'sepolia', 'arbitrum', 'arbitrum-sepolia'];
+
+ const isSepoliaDeployment = targetNetwork === 'sepolia';
+
+ // 1. Deploy the CrossChainBridge implementation contract
+ console.log('Deploying implementation contract...');
+ const implementationDeployment = await deploy(contractName, {
+ from: deployer,
+ args: [],
+ log: true,
+ skipIfAlreadyDeployed: false,
+ });
+
+ const implementationAddress = implementationDeployment.address;
+ console.log(`Deployed ${contractName} implementation at: ${implementationAddress}`);
+
+ // 2. Deploy ProxyAdmin using Hardhat's deploy function
+ console.log('Deploying ProxyAdmin...');
+ let proxyAdminAddress;
+ const existingProxyAdmin = await deployments.getOrNull('ProxyAdmin');
+ if (!existingProxyAdmin) {
+ try {
+ const proxyAdminDeployment = await deploy('ProxyAdmin', {
+ from: deployer,
+ args: [deployer],
+ log: true,
+ skipIfAlreadyDeployed: true,
+ });
+ proxyAdminAddress = proxyAdminDeployment.address;
+ } catch (error) {
+ console.error('Error deploying ProxyAdmin:', error);
+ return;
+ }
+ } else {
+ proxyAdminAddress = existingProxyAdmin.address;
+ }
+
+ // 3. Get the address of the EndpointV2 contract (assuming it's deployed)
+ console.log('Fetching EndpointV2 contract...');
+ const endpointV2Deployment = await deployments.get('EndpointV2');
+
+ const eIds = [40161, 40231, 40232, 40217, 30110, 30111, 30101];
+ const chainIds = [11155111, 421614, 11155420, 17000, 42161, 10, 1];
+
+ // 4. Encode the initialize function call for the proxy
+ console.log('Encoding initialize function call...');
+ const initializeData = (await ethers.getContractFactory(contractName)).interface.encodeFunctionData(
+ 'initialize',
+ [
+ endpointV2Deployment.address,
+ deployer,
+ eIds,
+ chainIds
+ ]
+ );
+
+ let proxyDeployment;
+ try {
+ proxyDeployment = await deploy('TransparentUpgradeableProxy', {
+ contract: 'contracts/proxy/TransparentUpgradeableProxy.sol:TransparentUpgradeableProxy',
+ from: deployer,
+ args: [implementationAddress, proxyAdminAddress, initializeData],
+ log: true,
+ skipIfAlreadyDeployed: false,
+ });
+
+ const existingDeployment = await deployments.getOrNull(contractName);
+ await save(contractName, {
+ abi: implementationDeployment.abi,
+ address: proxyDeployment.address,
+ ...existingDeployment,
+ });
+
+ console.log(`${contractName} deployed as upgradeable contract through proxy at network: ${targetNetwork}, address: ${proxyDeployment.address}`);
+ } catch (error) {
+ console.error('Error during TransparentUpgradeableProxy deployment:', error);
+ return;
+ }
+
+ // 7. Verify contracts if network or forced verification allows
+ const shouldVerify = validNetworksForVerification.includes(targetNetwork) || isSepoliaDeployment;
+ if (shouldVerify) {
+ console.log('Verifying contracts...');
+ try {
+ // Verify the CrossChainBridge implementation contract
+ await run('verify:verify', {
+ address: implementationAddress,
+ constructorArguments: [],
+ });
+ console.log('Verified CrossChainBridge implementation!');
+
+ // Verify the TransparentUpgradeableProxy contract
+ await run('verify:verify', {
+ address: proxyDeployment.address,
+ constructorArguments: [implementationAddress, proxyAdminAddress, initializeData],
+ });
+ console.log('Verified TransparentUpgradeableProxy!');
+ } catch (error) {
+ console.error('Verification error:', error);
+ }
+ } else {
+ console.log(`Skipping verification. Network '${targetNetwork}' is not supported for verification.`);
+ }
+};
+
+deploy.tags = ['l1'];
+
+export default deploy;
diff --git a/projects/bridge-lz/deploy/LZCrossChainAdapterL2.ts b/projects/bridge-lz/deploy/LZCrossChainAdapterL2.ts
new file mode 100644
index 00000000..fb1d2f86
--- /dev/null
+++ b/projects/bridge-lz/deploy/LZCrossChainAdapterL2.ts
@@ -0,0 +1,127 @@
+import assert from 'assert';
+import { DeployFunction } from 'hardhat-deploy/types';
+import { ethers, run, network } from 'hardhat';
+
+const contractName = 'LZCrossChainAdapterL2';
+
+const deploy: DeployFunction = async (hre) => {
+ const { getNamedAccounts, deployments } = hre;
+ const { deploy, save } = deployments;
+ const { deployer } = await getNamedAccounts();
+
+ assert(deployer, 'Missing named deployer account');
+ console.log(`Deployer Address: ${deployer}`);
+
+ // Check TARGET_NETWORK or default to the actual network name
+ const targetNetwork = process.env.TARGET_NETWORK || network.name;
+ const validNetworksForVerification = ['ethereum', 'sepolia', 'arbitrum', 'arbitrum-sepolia'];
+
+ const isSepoliaDeployment = targetNetwork === 'sepolia';
+
+ // 1. Deploy the CrossChainBridge implementation contract
+ console.log('Deploying implementation contract...');
+ const implementationDeployment = await deploy(contractName, {
+ from: deployer,
+ args: [],
+ log: true,
+ skipIfAlreadyDeployed: false,
+ });
+
+ const implementationAddress = implementationDeployment.address;
+ console.log(`Deployed ${contractName} implementation at: ${implementationAddress}`);
+
+ // 2. Deploy ProxyAdmin using Hardhat's deploy function
+ console.log('Deploying ProxyAdmin...');
+ let proxyAdminAddress;
+ const existingProxyAdmin = await deployments.getOrNull('ProxyAdmin');
+ if (!existingProxyAdmin) {
+ try {
+ const proxyAdminDeployment = await deploy('ProxyAdmin', {
+ from: deployer,
+ args: [deployer],
+ log: true,
+ skipIfAlreadyDeployed: true,
+ });
+ proxyAdminAddress = proxyAdminDeployment.address;
+ } catch (error) {
+ console.error('Error deploying ProxyAdmin:', error);
+ return;
+ }
+ } else {
+ proxyAdminAddress = existingProxyAdmin.address;
+ }
+
+ // 3. Get the address of the EndpointV2 contract (assuming it's deployed)
+ console.log('Fetching EndpointV2 contract...');
+ const endpointV2Deployment = await deployments.get('EndpointV2');
+
+ const eIds = [40161, 40231, 40232, 40217, 30110, 30111, 30101];
+ const chainIds = [11155111, 421614, 11155420, 17000, 42161, 10, 1];
+
+ const l1ChainId = 11155111; //Sepolia Chain ID
+ // 4. Encode the initialize function call for the proxy
+ console.log('Encoding initialize function call...');
+ const initializeData = (await ethers.getContractFactory(contractName)).interface.encodeFunctionData(
+ 'initialize',
+ [
+ endpointV2Deployment.address, // LayerZero's EndpointV2 address
+ deployer, // Owner address
+ l1ChainId, // _l1ChainId
+ eIds, // eIds array
+ chainIds // chainIds array
+ ]
+ );
+
+ let proxyDeployment;
+ try {
+ proxyDeployment = await deploy('TransparentUpgradeableProxy', {
+ contract: 'contracts/proxy/TransparentUpgradeableProxy.sol:TransparentUpgradeableProxy',
+ from: deployer,
+ args: [implementationAddress, proxyAdminAddress, initializeData],
+ log: true,
+ skipIfAlreadyDeployed: false,
+ });
+
+ // Save the proxy contract's deployment with the correct ABI without overwriting
+ const existingDeployment = await deployments.getOrNull(contractName);
+ await save(contractName, {
+ abi: implementationDeployment.abi,
+ address: proxyDeployment.address,
+ ...existingDeployment,
+ });
+
+ console.log(`${contractName} deployed as upgradeable contract through proxy at network: ${targetNetwork}, address: ${proxyDeployment.address}`);
+ } catch (error) {
+ console.error('Error during TransparentUpgradeableProxy deployment:', error);
+ return;
+ }
+
+ // 7. Verify contracts if network or forced verification allows
+ const shouldVerify = validNetworksForVerification.includes(targetNetwork) || isSepoliaDeployment;
+ if (shouldVerify) {
+ console.log('Verifying contracts...');
+ try {
+ // Verify the CrossChainBridge implementation contract
+ await run('verify:verify', {
+ address: implementationAddress,
+ constructorArguments: [],
+ });
+ console.log('Verified CrossChainBridge implementation!');
+
+ // Verify the TransparentUpgradeableProxy contract
+ await run('verify:verify', {
+ address: proxyDeployment.address,
+ constructorArguments: [implementationAddress, proxyAdminAddress, initializeData],
+ });
+ console.log('Verified TransparentUpgradeableProxy!');
+ } catch (error) {
+ console.error('Verification error:', error);
+ }
+ } else {
+ console.log(`Skipping verification. Network '${targetNetwork}' is not supported for verification.`);
+ }
+};
+
+deploy.tags = ['l2'];
+
+export default deploy;
diff --git a/projects/bridge-lz/deploy/SampleApp.ts b/projects/bridge-lz/deploy/SampleApp.ts
new file mode 100644
index 00000000..e9bf6bff
--- /dev/null
+++ b/projects/bridge-lz/deploy/SampleApp.ts
@@ -0,0 +1,46 @@
+import assert from 'assert'
+import { type DeployFunction } from 'hardhat-deploy/types'
+import { ethers } from 'hardhat'
+
+const contractName = 'SampleApp'
+
+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}`)
+
+ // Get the current gas price
+ const gasPrice = await ethers.provider.getGasPrice()
+ console.log(`Current gas price: ${ethers.utils.formatUnits(gasPrice, 'gwei')} gwei`)
+
+ const endpointV2Deployment = await hre.deployments.get('EndpointV2')
+ const endpointAddress = endpointV2Deployment.address
+
+ // Estimate the gas for the deployment
+ const contractFactory = await ethers.getContractFactory(contractName)
+ const deployTransaction = contractFactory.getDeployTransaction(endpointAddress, deployer)
+
+ const estimatedGas = await ethers.provider.estimateGas(deployTransaction)
+ const estimatedCostInEth = ethers.utils.formatEther(estimatedGas.mul(gasPrice))
+
+ console.log(`Estimated gas for deployment: ${estimatedGas.toString()}`)
+ console.log(`Estimated deployment cost at current gas price: ${estimatedCostInEth} ETH`)
+
+ const { address } = await deploy(contractName, {
+ from: deployer,
+ args: [endpointAddress, deployer],
+ log: true,
+ skipIfAlreadyDeployed: false,
+ })
+
+ console.log(`Deployed contract: ${contractName}, network: ${hre.network.name}, address: ${address}`)
+}
+
+deploy.tags = ["sample"]
+
+export default deploy
diff --git a/projects/bridge-lz/hardhat.config.ts b/projects/bridge-lz/hardhat.config.ts
new file mode 100644
index 00000000..0f328758
--- /dev/null
+++ b/projects/bridge-lz/hardhat.config.ts
@@ -0,0 +1,34 @@
+import 'dotenv/config'
+
+import { CONFIG } from "../../hh.config";
+import 'hardhat-deploy'
+import 'hardhat-contract-sizer'
+import '@nomiclabs/hardhat-ethers'
+import '@layerzerolabs/toolbox-hardhat'
+import '@nomicfoundation/hardhat-verify';
+import { HardhatUserConfig, HttpNetworkAccountsUserConfig } from 'hardhat/types'
+
+
+const accounts: HttpNetworkAccountsUserConfig | undefined = [`${process.env.DEPLOYER_PRIVATE_KEY}`]
+
+const config: HardhatUserConfig = {
+ ...(CONFIG as HardhatUserConfig),
+ paths: {
+ cache: 'cache/hardhat',
+ },
+ solidity: {
+ compilers: [
+ {
+ version: '0.8.27',
+ settings: {
+ optimizer: {
+ enabled: true,
+ runs: 200,
+ },
+ },
+ },
+ ],
+ },
+}
+
+export default config
diff --git a/projects/bridge-lz/how-to-deploy.md b/projects/bridge-lz/how-to-deploy.md
new file mode 100644
index 00000000..259554b9
--- /dev/null
+++ b/projects/bridge-lz/how-to-deploy.md
@@ -0,0 +1,32 @@
+# How to deploy all
+
+## Deploy LZCrossChainBridges
+0. Ensure /bridge-lz project has no `deployments` folder.
+1. Deploy the Sepolia bridge by running the command below, choosing `sepolia` as network and `l1` as tag.
+>npx hardhat lz:deploy
+>npx @layerzerolabs/verify-contract -d "./deployments" --contracts "LZCrossChainAdapterL1" -n "sepolia" -u "https://api-sepolia.etherscan.io/api" -k "5ECZSNXK68TW6UVFTETFJK7YDC7KBSFHGC"
+2. Deploy the Arbitrum-Sepolia and Optimism-Sepolia bridges by running the command below, choosing `arbitrum sepolia` and `optimism sepolia` as networks and `l2` as tag.
+>npx hardhat lz:deploy
+3. Verify Arbitrum and Optimism LZCrossChainBridgeL2 contracts:
+>npx @layerzerolabs/verify-contract -d "./deployments" --contracts "LZCrossChainAdapterL2" -n "arbitrum-sepolia" -u "https://api-sepolia.arbiscan.io/api" -k "RDRJNYQ7NDDSNCX3FJGKC81M5Q8PA55K6U"
+>npx @layerzerolabs/verify-contract -d "./deployments" --contracts "LZCrossChainAdapterL2" -n "optimism-sepolia" -u "https://api-optimistic.etherscan.io/api" -k "C3JF1ZDIQ4TT388IVSIW8WHAZRKZH5R9XJ"
+4. Write down their addresses in the repository's root: `deployment_checkpoint_sepolia.json`, `deployment_checkpoint_optimism-sepolia.json` and `deployment_checkpoint_arbitrum-sepolia.json`
+5. Set peers manually, running these commands from this folder:
+> npx hardhat run scripts/set-peers-l1.ts --network sepolia
+
+> npx hardhat run scripts/set-peers-l2-arb.ts --network arbitrum-sepolia
+
+> npx hardhat run scripts/set-peers-l2-opt.ts --network optimism-sepolia
+
+6. Deploy all other contracts:
+>cd projects/restaking-pool
+>yarn hardhat run scripts/deploy-omni-staking.ts --network sepolia
+
+>cd projects/vaults
+>npx hardhat run scripts/deploy-omni-staking-l2.ts --network arbitrumSepolia
+7. Now it's time to fire the test
+>cd projects/restaking-pool
+
+>npx hardhat run scripts/call/send-eth-to-l1.ts --network arbitrumSepolia
+
+>npx hardhat run scripts/call/send-data-to-l1.ts --network arbitrumSepolia
\ No newline at end of file
diff --git a/projects/bridge-lz/layerzero.config.ts b/projects/bridge-lz/layerzero.config.ts
new file mode 100644
index 00000000..3951d82a
--- /dev/null
+++ b/projects/bridge-lz/layerzero.config.ts
@@ -0,0 +1,54 @@
+import type { OAppOmniGraphHardhat, OmniPointHardhat } from '@layerzerolabs/toolbox-hardhat'
+
+const sepoliaContract: OmniPointHardhat = {
+ eid: 40161,
+ contractName: 'CrossChainBridge',
+}
+
+const arbitrumContract: OmniPointHardhat = {
+ eid: 40231,
+ contractName: 'CrossChainBridge',
+}
+
+const optimismContract: OmniPointHardhat = {
+ eid: 40232,
+ contractName: 'CrossChainBridge',
+}
+
+
+const config: OAppOmniGraphHardhat = {
+ contracts: [
+ {
+ contract: sepoliaContract,
+ },
+ {
+ contract: arbitrumContract,
+ },
+ {
+ contract: optimismContract,
+ }
+ ],
+ connections: [
+ {
+ from: sepoliaContract,
+ to: optimismContract,
+ },
+ {
+ from: optimismContract,
+ to: sepoliaContract,
+
+ },
+ {
+ from: sepoliaContract,
+ to: arbitrumContract,
+
+ },
+ {
+ from: arbitrumContract,
+ to: sepoliaContract,
+
+ }
+ ],
+}
+
+export default config
diff --git a/projects/bridge-lz/package.json b/projects/bridge-lz/package.json
new file mode 100644
index 00000000..f971ac35
--- /dev/null
+++ b/projects/bridge-lz/package.json
@@ -0,0 +1,84 @@
+{
+ "name": "@layerzerolabs/oapp-example",
+ "version": "0.3.0",
+ "private": true,
+ "license": "MIT",
+ "scripts": {
+ "clean": "rm -rf artifacts cache out",
+ "compile": "$npm_execpath run compile:hardhat",
+ "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:hardhat",
+ "test:hardhat": "hardhat test"
+ },
+ "resolutions": {
+ "ethers": "^5.7.2",
+ "hardhat-deploy": "^0.12.1"
+ },
+ "devDependencies": {
+ "@babel/core": "^7.23.9",
+ "@layerzerolabs/eslint-config-next": "~2.3.39",
+ "@layerzerolabs/lz-definitions": "^2.3.39",
+ "@layerzerolabs/lz-evm-messagelib-v2": "^2.3.39",
+ "@layerzerolabs/lz-evm-protocol-v2": "^2.3.39",
+ "@layerzerolabs/lz-evm-v1-0.7": "^2.3.39",
+ "@layerzerolabs/lz-v2-utilities": "^2.3.39",
+ "@layerzerolabs/oapp-evm": "^0.0.4",
+ "@layerzerolabs/oft-evm": "^0.1.0",
+ "@layerzerolabs/prettier-config-next": "^2.3.39",
+ "@layerzerolabs/solhint-config": "^2.3.39",
+ "@layerzerolabs/test-devtools-evm-foundry": "~1.0.0",
+ "@layerzerolabs/toolbox-foundry": "~0.1.9",
+ "@layerzerolabs/toolbox-hardhat": "~0.4.0",
+ "@nomicfoundation/hardhat-chai-matchers": "^2.0.0",
+ "@nomicfoundation/hardhat-ethers": "^3.0.5",
+ "@nomicfoundation/hardhat-ignition": "^0.15.5",
+ "@nomicfoundation/hardhat-ignition-ethers": "^0.15.5",
+ "@nomicfoundation/hardhat-network-helpers": "^1.0.0",
+ "@nomicfoundation/hardhat-toolbox": "^5.0.0",
+ "@nomicfoundation/hardhat-verify": "^2.0.0",
+ "@nomicfoundation/ignition-core": "^0.15.5",
+ "@nomiclabs/hardhat-ethers": "^2.2.3",
+ "@openzeppelin/contracts": "^5.0.2",
+ "@openzeppelin/contracts-upgradeable": "^5.0.2",
+ "@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",
+ "dotenv": "^16.4.5",
+ "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",
+ "mocha": "^10.2.0",
+ "openzeppelin-4": "npm:@openzeppelin/contracts@4.5.0",
+ "openzeppelin-4-upgradeable": "npm:@openzeppelin/contracts-upgradeable@4.5.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"
+ },
+ "dependencies": {
+ "@layerzerolabs/verify-contract": "^1.1.31"
+ }
+}
diff --git a/projects/bridge-lz/scripts/call-on-opt.ts b/projects/bridge-lz/scripts/call-on-opt.ts
new file mode 100644
index 00000000..12e79354
--- /dev/null
+++ b/projects/bridge-lz/scripts/call-on-opt.ts
@@ -0,0 +1,44 @@
+const { ethers } = require("hardhat");
+
+const Options = require("@layerzerolabs/lz-v2-utilities").Options;
+const options = Options.newOptions().addExecutorLzReceiveOption(200000, 0).toHex().toString();
+
+async function main() {
+ // const myOAppAddressA = "0xB9B9AfA6B41c26A4EC360248ebC7787d60f85AFd";
+ const myOAppAddressA = "0x64c1e6D05750657AE1b1Cb056Fc41E6D654716dC";
+ // const MyOAppA = await ethers.getContractAt("MyOApp", myOAppAddressA);
+ const MyOAppA = await ethers.getContractAt("CrosschainBridge", myOAppAddressA);
+
+ // Set peers before quoting
+ const destinationEid = 40161;
+
+ // Define message and options
+ const message = ethers.utils.toUtf8Bytes("");
+ const options = Options.newOptions().addExecutorLzReceiveOption(200000, 1000).toHex().toString();
+
+
+ // Estimate fees
+ const [nativeFee] = await MyOAppA.quote(destinationEid, message, options, false);
+
+ console.log(`nativeFee: ${nativeFee}`);
+
+
+ // Send message with some ETH for messaging fees
+ const tx = await MyOAppA.sendCrosschain(destinationEid, message, options, {
+ value: nativeFee, // Ensure to provide enough fee
+ gasLimit: 500000, // You can set a manual gas limit
+ });
+
+ console.log("Transaction sent:", tx.hash);
+
+ // Wait for the transaction to be confirmed
+ await tx.wait();
+ console.log("Message sent successfully!");
+}
+
+main()
+ .then(() => process.exit(0))
+ .catch(error => {
+ console.error(error);
+ process.exit(1);
+ });
diff --git a/projects/bridge-lz/scripts/call-on-sep.ts b/projects/bridge-lz/scripts/call-on-sep.ts
new file mode 100644
index 00000000..b2e9ca4b
--- /dev/null
+++ b/projects/bridge-lz/scripts/call-on-sep.ts
@@ -0,0 +1,41 @@
+const { ethers } = require("hardhat");
+
+async function main() {
+ const [deployer] = await ethers.getSigners();
+
+ // Replace with your deployed contract addresses
+ const myOAppAddressA = "0x07E146B89606828A34D7d096E21be78207700a69"; //0x07E146B89606828A34D7d096E21be78207700a69
+ const MyOAppA = await ethers.getContractAt("MyOApp", myOAppAddressA);
+
+ const myOAppAddressB = "0xB9B9AfA6B41c26A4EC360248ebC7787d60f85AFd";
+ const MyOAppB = await ethers.getContractAt("MyOApp", myOAppAddressB);
+
+ // Set peers before quoting
+ const destinationEid = 40232;
+
+ // Define message and options
+ const message = "Hello from L1!";
+ const options = "0x"; // Empty options in hex format
+
+ // Estimate fees
+ const [nativeFee] = await MyOAppA.quote(destinationEid, message, options, false);
+
+ // Send message with some ETH for messaging fees
+ const tx = await MyOAppA.send(destinationEid, message, options, {
+ value: nativeFee.toString(), // Ensure to provide enough fee
+ gasLimit: 500000, // You can set a manual gas limit
+ });
+
+ console.log("Transaction sent:", tx.hash);
+
+ // Wait for the transaction to be confirmed
+ await tx.wait();
+ console.log("Message sent successfully!");
+}
+
+main()
+ .then(() => process.exit(0))
+ .catch(error => {
+ console.error(error);
+ process.exit(1);
+ });
diff --git a/projects/bridge-lz/scripts/calls/send-crosschain.ts b/projects/bridge-lz/scripts/calls/send-crosschain.ts
new file mode 100644
index 00000000..d740921e
--- /dev/null
+++ b/projects/bridge-lz/scripts/calls/send-crosschain.ts
@@ -0,0 +1,57 @@
+import { ethers } from "hardhat";
+import fs from "fs";
+import path from "path";
+
+async function main() {
+ const [deployer] = await ethers.getSigners();
+ console.log(`Deployer Address: ${deployer.address}`);
+
+ // Load the checkpoint data to get the LZCrossChainBridge contract address
+ const checkpointFilePath = path.join(__dirname, "../../../../deployment_checkpoint_optimism-sepolia.json");
+
+ // Ensure the deployment checkpoint file exists
+ if (!fs.existsSync(checkpointFilePath)) {
+ throw new Error(`Checkpoint file not found: ${checkpointFilePath}`);
+ }
+
+ // Read the deployment checkpoint data
+ const checkpointData = JSON.parse(fs.readFileSync(checkpointFilePath, "utf8"));
+
+ // Retrieve the LZCrossChainBridge address
+ const lzCrossChainBridgeAddress = checkpointData.LZCrossChainBridge;
+ if (!lzCrossChainBridgeAddress) {
+ throw new Error('LZCrossChainBridge address not found in deployment_checkpoint_optimism-sepolia.json');
+ }
+
+ // Get the LZCrossChainBridge contract instance
+ const LZCrossChainBridge = await ethers.getContractAt("ICrossChainBridge", lzCrossChainBridgeAddress);
+
+ // Prepare parameters for the sendCrosschain call
+ const destinationChainId = 40161;
+ const payload = "0x"; // Empty data
+ const options = "0x"; // Empty options
+ const ethToSend = ethers.parseUnits("0.002", "ether"); // Sending 0.002 ETH
+
+ // Step 1: Call .quote() to get the fee estimate and extract MessagingFee.nativeFee
+ console.log(`Calling .quote() to get fee estimate for the crosschain transaction...`);
+ const feeEstimate = await LZCrossChainBridge.quote(destinationChainId, payload, options, false);
+ const nativeFee = ethers.toBigInt(feeEstimate); // Cast the result as BigInt
+ console.log(`Estimated fee: ${ethers.formatEther(nativeFee)} ETH`);
+
+ // Step 2: Add ethToSend to the fee estimate
+ const totalValueToSend = nativeFee + ethToSend;
+ console.log(`Total ETH to send (fee + value): ${ethers.formatEther(totalValueToSend)} ETH`);
+
+ // Step 3: Call sendCrosschain with the calculated total value
+ console.log(`Calling sendCrosschain() on LZCrossChainBridge at: ${lzCrossChainBridgeAddress}`);
+ const tx = await LZCrossChainBridge.sendCrosschain(destinationChainId, payload, options, { value: totalValueToSend });
+ await tx.wait();
+
+ console.log(`sendCrosschain() successfully called. Tx hash: ${tx.hash}`);
+}
+
+// Run the script
+main().catch((error) => {
+ console.error("Error:", error);
+ process.exit(1);
+});
diff --git a/projects/bridge-lz/scripts/calls/sendEthToL1.ts b/projects/bridge-lz/scripts/calls/sendEthToL1.ts
new file mode 100644
index 00000000..2ca6aa6e
--- /dev/null
+++ b/projects/bridge-lz/scripts/calls/sendEthToL1.ts
@@ -0,0 +1,74 @@
+import { ethers } from "hardhat";
+import fs from "fs";
+import path from "path";
+
+const Options = require("@layerzerolabs/lz-v2-utilities").Options;
+const options = Options.newOptions().addExecutorLzReceiveOption(200000, 0).toHex().toString();
+
+async function main() {
+
+ const [deployer] = await ethers.getSigners();
+ console.log(`deployer: ${deployer.address}`);
+
+ // Path to the JSON file
+ const checkpointFilePath = path.join(__dirname, '../../../../deployment_checkpoint_optimism-sepolia.json');
+
+ // Check if the file exists
+ if (!fs.existsSync(checkpointFilePath)) {
+ throw new Error(`File not found: ${checkpointFilePath}`);
+ }
+
+ // Read and parse the JSON file
+ const checkpointData = JSON.parse(fs.readFileSync(checkpointFilePath, 'utf8'));
+
+ // Get the CrossChainAdapterOptimismL2 address
+ const crossChainAdapterAddress = checkpointData.CrossChainAdapterOptimismL2;
+ if (!crossChainAdapterAddress) {
+ throw new Error('CrossChainAdapterOptimismL2 address not found in deployment_checkpoint_optimism-sepolia.json');
+ }
+
+
+
+ // Attach to the CrossChainAdapterOptimismL2 contract
+ const CrossChainAdapterOptimismL2 = await ethers.getContractAt("CrossChainAdapterOptimismL2", crossChainAdapterAddress);
+
+ const operator = await CrossChainAdapterOptimismL2.operator();
+ console.log(`Operator Address: ${operator}`);
+
+ // Output the vault address before the transaction
+ const vaultAddress = await CrossChainAdapterOptimismL2.vault();
+ console.log(`Vault Address: ${vaultAddress}`);
+
+ // Define message and options
+ const message = "1";
+ const options = Options.newOptions().toHex().toString();
+
+ console.log(`options: ${options}`);
+
+
+ console.log(`Calling sendEthToL1 with 0.0002 ETH to contract at address ${crossChainAdapterAddress}...`);
+
+ const destinationEid = 40161;
+
+ try {
+ // Call sendEthToL1 with 0.0002 ETH
+ const tx = await CrossChainAdapterOptimismL2.sendEthToL1_2(destinationEid, message, options, {
+ value: "650750093439552"
+ });
+
+ console.log("Transaction sent:", tx.hash);
+
+ // Wait for the transaction to be mined
+ await tx.wait();
+ console.log("Transaction confirmed!");
+ } catch (e) {
+ console.error(e);
+ }
+
+
+}
+
+main().catch((error) => {
+ console.error(error);
+ process.exit(1);
+});
diff --git a/projects/bridge-lz/scripts/deploy-options-creator_temp.ts b/projects/bridge-lz/scripts/deploy-options-creator_temp.ts
new file mode 100644
index 00000000..e1c7a1c7
--- /dev/null
+++ b/projects/bridge-lz/scripts/deploy-options-creator_temp.ts
@@ -0,0 +1,43 @@
+import { ethers, run } from "hardhat";
+
+async function main() {
+ // Compile and get the contract factory
+ const OptionsCreator = await ethers.getContractFactory("OptionsCreator");
+
+ console.log("Deploying OptionsCreator contract...");
+
+ // Deploy the contract
+ const optionsCreator = await OptionsCreator.deploy();
+
+ // Wait for the contract to be mined
+ await optionsCreator.waitForDeployment();
+
+ // Get the deployment transaction hash
+ const txHash = optionsCreator.deployTransaction.hash;
+
+ // Wait for 5 confirmations
+ console.log("Waiting for 5 confirmations...");
+ await ethers.provider.waitForTransaction(txHash, 5);
+
+ console.log("OptionsCreator deployed to:", await optionsCreator.getAddress());
+
+ // Verify the contract on Etherscan
+ try {
+ console.log("Waiting for Etherscan indexing...");
+ await new Promise((resolve) => setTimeout(resolve, 60000)); // Wait 60 seconds to allow Etherscan to index
+
+ console.log("Verifying OptionsCreator contract on Etherscan...");
+ await run("verify:verify", {
+ address: await optionsCreator.getAddress(),
+ constructorArguments: [],
+ });
+ console.log("Contract verified successfully!");
+ } catch (error) {
+ console.error("Verification failed:", error);
+ }
+}
+
+main().catch((error) => {
+ console.error(error);
+ process.exitCode = 1;
+});
diff --git a/projects/bridge-lz/scripts/l1-deploy-dummy-processor.ts b/projects/bridge-lz/scripts/l1-deploy-dummy-processor.ts
new file mode 100644
index 00000000..cf804ccd
--- /dev/null
+++ b/projects/bridge-lz/scripts/l1-deploy-dummy-processor.ts
@@ -0,0 +1,37 @@
+import { ethers } from "hardhat";
+import fs from "fs";
+import path from "path";
+
+async function main() {
+ const [deployer] = await ethers.getSigners();
+ console.log(`Deployer address: ${deployer.address}`);
+
+ // Deploy the DummyDataProcessor contract
+ const DummyDataProcessor = await ethers.getContractFactory("DummyDataProcessor");
+ const dummyDataProcessor = await DummyDataProcessor.deploy();
+ await dummyDataProcessor.deployed();
+
+ console.log(`DummyDataProcessor deployed at: ${dummyDataProcessor.address}`);
+
+ // Path to the JSON file
+ const checkpointFilePath = path.join(__dirname, '../deployment_checkpoint_sepolia.json');
+
+ // Check if the file exists
+ if (!fs.existsSync(checkpointFilePath)) {
+ throw new Error(`File not found: ${checkpointFilePath}`);
+ }
+
+ // Read the JSON file
+ const checkpointData = JSON.parse(fs.readFileSync(checkpointFilePath, 'utf8'));
+
+ // Update the JSON file with the deployed contract address
+ checkpointData.DummyDataProcessor = dummyDataProcessor.address;
+ fs.writeFileSync(checkpointFilePath, JSON.stringify(checkpointData, null, 2), 'utf8');
+
+ console.log(`Updated deployment_checkpoint_sepolia.json with DummyDataProcessor: ${dummyDataProcessor.address}`);
+}
+
+main().catch((error) => {
+ console.error(error);
+ process.exit(1);
+});
diff --git a/projects/bridge-lz/scripts/livetest/call-on-opt.ts b/projects/bridge-lz/scripts/livetest/call-on-opt.ts
new file mode 100644
index 00000000..4eaa31f9
--- /dev/null
+++ b/projects/bridge-lz/scripts/livetest/call-on-opt.ts
@@ -0,0 +1,68 @@
+const { ethers } = require("hardhat");
+
+const Options = require("@layerzerolabs/lz-v2-utilities").Options;
+const options = Options.newOptions().addExecutorLzReceiveOption(200000, 0).toHex().toString();
+
+async function main() {
+ // const myOAppAddressA = "0xB9B9AfA6B41c26A4EC360248ebC7787d60f85AFd";
+ const myOAppAddressA = "0x9FfCcD2684236AA029e3EE2aFD36f785CB7cF4E2";
+ // const MyOAppA = await ethers.getContractAt("MyOApp", myOAppAddressA);
+ const MyOAppA = await ethers.getContractAt("LZCrossChainBridge", myOAppAddressA);
+
+ // Destination - Ethereum Sepolia, so we're setting its Chain ID
+ const chainId = 11155111;
+ //LZ Endpoint ID for Ethereum Sepolia
+ const eId = 40161;
+
+ // let's set the eid and chainId
+ // const txSetChainId = await MyOAppA.setChainIdFromEid(eId, chainId);
+ // txSetChainId.wait();
+ // console.log("Chain ID and eID set");
+
+
+ // Define message and options
+
+ // Define the message with BigInt values
+ const timestamp = Math.floor(Date.now() / 1000) - 200; // Current timestamp in seconds
+ const balance = ethers.utils.parseUnits("1000", 18); // BigInt Balance
+ const totalSupply = ethers.utils.parseUnits("50000", 18); // BigInt Total supply
+
+ // ABI encode the BigInt values
+ // const message = ethers.utils.defaultAbiCoder.encode(
+ // ["uint256", "uint256", "uint256"],
+ // [timestamp, balance, totalSupply]
+ // );
+
+ const message = ethers.utils.defaultAbiCoder.encode(
+ ["uint256", "uint256", "uint256"],
+ [timestamp, balance, totalSupply]
+ );
+
+ const options = Options.newOptions().addExecutorLzReceiveOption(200000, 2000).toHex().toString();
+
+
+ // Estimate fees
+ const nativeFee = await MyOAppA.quote(chainId, message, options, false);
+
+ console.log(`nativeFee: ${nativeFee}`);
+
+
+ // Send message with some ETH for messaging fees
+ const tx = await MyOAppA.sendCrosschain(chainId, message, options, {
+ value: nativeFee, // Ensure to provide enough fee
+ gasLimit: 500000, // You can set a manual gas limit
+ });
+
+ console.log("Transaction sent:", tx.hash);
+
+ // Wait for the transaction to be confirmed
+ await tx.wait();
+ console.log("Message sent successfully!");
+}
+
+main()
+ .then(() => process.exit(0))
+ .catch(error => {
+ console.error(error);
+ process.exit(1);
+ });
diff --git a/projects/bridge-lz/scripts/mainnet/set-peers-l1.ts b/projects/bridge-lz/scripts/mainnet/set-peers-l1.ts
new file mode 100644
index 00000000..aa8caaf4
--- /dev/null
+++ b/projects/bridge-lz/scripts/mainnet/set-peers-l1.ts
@@ -0,0 +1,33 @@
+const { ethers } = require("hardhat");
+const fs = require("fs");
+const path = require("path");
+
+async function main() {
+ const [deployer] = await ethers.getSigners();
+
+ // Fetch addresses from the checkpoint files
+ const CrossChainBridgeEthereumAddress = ""; //TODO! Insert LZCrossChainBridgeL1 address here
+ const CrossChainBridgeOptimismAddress = ""; //TODO! Insert LZCrossChainBridgeL2 Optimism address here
+ const CrossChainBridgeArbitrumAddress = ""; //TODO! Insert LZCrossChainBridgeL2 Optimism address here
+
+ if (!CrossChainBridgeEthereumAddress || !CrossChainBridgeOptimismAddress || !CrossChainBridgeArbitrumAddress) {
+ throw new Error("CrossChainBridge addresses not found in the checkpoint files.");
+ }
+
+ // Get contract instances
+ const CrossChainBridgeSepolia = await ethers.getContractAt("LZCrossChainAdapterL1", CrossChainBridgeEthereumAddress);
+ const eIDArbitrumSepolia = 30110; //Arbitrum Mainnet eID
+ const eIDOptimismSepolia = 30111; //Sepolia Mainnet eID
+
+ // Set peer for OptimismSepolia
+ await CrossChainBridgeSepolia.connect(deployer).setPeer(eIDOptimismSepolia, ethers.utils.zeroPad(CrossChainBridgeOptimismAddress, 32));
+ await CrossChainBridgeSepolia.connect(deployer).setPeer(eIDArbitrumSepolia, ethers.utils.zeroPad(CrossChainBridgeArbitrumAddress, 32));
+ console.log("Peers set successfully");
+}
+
+main()
+ .then(() => process.exit(0))
+ .catch(error => {
+ console.error(error);
+ process.exit(1);
+ });
diff --git a/projects/bridge-lz/scripts/mainnet/set-peers-l2-arb.ts b/projects/bridge-lz/scripts/mainnet/set-peers-l2-arb.ts
new file mode 100644
index 00000000..bf26c796
--- /dev/null
+++ b/projects/bridge-lz/scripts/mainnet/set-peers-l2-arb.ts
@@ -0,0 +1,29 @@
+const { ethers } = require("hardhat");
+const fs = require("fs");
+const path = require("path");
+
+async function main() {
+ const [deployer] = await ethers.getSigners();
+
+ const CrossChainBridgeEthereumAddress = ""; //TODO! Insert LZCrossChainBridgeL1 address here
+ const CrossChainBridgeArbitrumAddress = ""; //TODO! Insert LZCrossChainBridgeL2 Arbitrum address here
+
+ if (!CrossChainBridgeEthereumAddress || !CrossChainBridgeArbitrumAddress) {
+ throw new Error("CrossChainBridge addresses not found in the checkpoint files.");
+ }
+
+ // Get contract instance
+ const CrossChainBridgeOptimism = await ethers.getContractAt("LZCrossChainAdapterL2", CrossChainBridgeArbitrumAddress);
+ const eIdSepolia = 30101; //Ethereum Mainnet eID
+
+ // Set peer for Ethereum Mainnet
+ await CrossChainBridgeOptimism.connect(deployer).setPeer(eIdSepolia, ethers.utils.zeroPad(CrossChainBridgeEthereumAddress, 32));
+ console.log(`Bridge at address ${CrossChainBridgeArbitrumAddress} was set successfully with peer at address ${CrossChainBridgeEthereumAddress} at Ethereum`);
+}
+
+main()
+ .then(() => process.exit(0))
+ .catch(error => {
+ console.error(error);
+ process.exit(1);
+ });
diff --git a/projects/bridge-lz/scripts/mainnet/set-peers-l2-opt.ts b/projects/bridge-lz/scripts/mainnet/set-peers-l2-opt.ts
new file mode 100644
index 00000000..c8f8d5e4
--- /dev/null
+++ b/projects/bridge-lz/scripts/mainnet/set-peers-l2-opt.ts
@@ -0,0 +1,29 @@
+const { ethers } = require("hardhat");
+const fs = require("fs");
+const path = require("path");
+
+async function main() {
+ const [deployer] = await ethers.getSigners();
+
+ const CrossChainBridgeEthereumAddress = ""; //TODO! Insert LZCrossChainBridgeL1 address here
+ const CrossChainBridgeOptimismAddress = ""; //TODO! Insert LZCrossChainBridgeL2 Optimism address here
+
+ if (!CrossChainBridgeEthereumAddress || !CrossChainBridgeOptimismAddress) {
+ throw new Error("CrossChainBridge addresses not found in the checkpoint files.");
+ }
+
+ // Get contract instance
+ const CrossChainBridgeOptimism = await ethers.getContractAt("LZCrossChainAdapterL2", CrossChainBridgeOptimismAddress);
+ const eIdSepolia = 30101; //Ethereum Mainnet eID
+
+ // Set peer for Ethereum Mainnet
+ await CrossChainBridgeOptimism.connect(deployer).setPeer(eIdSepolia, ethers.utils.zeroPad(CrossChainBridgeEthereumAddress, 32));
+ console.log(`Bridge at address ${CrossChainBridgeOptimismAddress} was set successfully with peer at address ${CrossChainBridgeEthereumAddress} at Ethereum`);
+}
+
+main()
+ .then(() => process.exit(0))
+ .catch(error => {
+ console.error(error);
+ process.exit(1);
+ });
diff --git a/projects/bridge-lz/scripts/set-chain-ids.ts b/projects/bridge-lz/scripts/set-chain-ids.ts
new file mode 100644
index 00000000..408a49c3
--- /dev/null
+++ b/projects/bridge-lz/scripts/set-chain-ids.ts
@@ -0,0 +1,41 @@
+const { ethers } = require("hardhat");
+
+const Options = require("@layerzerolabs/lz-v2-utilities").Options;
+const options = Options.newOptions().addExecutorLzReceiveOption(200000, 0).toHex().toString();
+
+async function main() {
+ const myOAppAddressA = "0x3f2dF8698b09c02Ea7aeBC5aC3E56a05afb870cf";
+ const MyOAppA = await ethers.getContractAt("LZCrossChainBridge", myOAppAddressA);
+
+ // Destination - Ethereum Sepolia, so we're setting its Chain ID
+ const chainId = 11155111;
+ //LZ Endpoint ID for Ethereum Sepolia
+ const eId = 40161;
+
+ //LZ Endpoint ID for Optimism Sepolia
+ const chainIdOpt = 11155420;
+ const eIdOpt = 40232;
+
+
+ //LZ Endpoint ID for Arbitrum Sepolia
+ const chainIdArb = 421614;
+ const eIdArb = 40231;
+
+ // let's set the eid and chainId
+ let txSetChainId = await MyOAppA.setChainIdFromEid(eId, chainId);
+ txSetChainId.wait();
+ txSetChainId = await MyOAppA.setChainIdFromEid(eIdOpt, chainIdOpt);
+ txSetChainId.wait();
+ txSetChainId = await MyOAppA.setChainIdFromEid(eIdArb, chainIdArb);
+ txSetChainId.wait();
+ console.log("Chain IDs and eIDs set");
+
+
+}
+
+main()
+ .then(() => process.exit(0))
+ .catch(error => {
+ console.error(error);
+ process.exit(1);
+ });
diff --git a/projects/bridge-lz/scripts/testnet/set-peers-l1.ts b/projects/bridge-lz/scripts/testnet/set-peers-l1.ts
new file mode 100644
index 00000000..44d74f61
--- /dev/null
+++ b/projects/bridge-lz/scripts/testnet/set-peers-l1.ts
@@ -0,0 +1,54 @@
+const { ethers } = require("hardhat");
+const fs = require("fs");
+const path = require("path");
+
+async function main() {
+ const [deployer] = await ethers.getSigners();
+
+ // Paths to the checkpoint files
+ const checkpointSepoliaFilePath = path.join(__dirname, '../../../deployment_checkpoint_sepolia.json');
+ const checkpointOptimismFilePath = path.join(__dirname, '../../../deployment_checkpoint_optimism-sepolia.json');
+ const checkpointArbitrumFilePath = path.join(__dirname, '../../../deployment_checkpoint_arbitrum-sepolia.json');
+
+ // Check if checkpoint files exist
+ if (!fs.existsSync(checkpointSepoliaFilePath)) {
+ throw new Error(`Checkpoint file not found: ${checkpointSepoliaFilePath}`);
+ }
+ if (!fs.existsSync(checkpointOptimismFilePath)) {
+ throw new Error(`Checkpoint file not found: ${checkpointOptimismFilePath}`);
+ }
+ if (!fs.existsSync(checkpointArbitrumFilePath)) {
+ throw new Error(`Checkpoint file not found: ${checkpointArbitrumFilePath}`);
+ }
+
+ // Read and parse the JSON files
+ const checkpointDataSepolia = JSON.parse(fs.readFileSync(checkpointSepoliaFilePath, 'utf8'));
+ const checkpointDataOptimism = JSON.parse(fs.readFileSync(checkpointOptimismFilePath, 'utf8'));
+ const checkpointDataArbitrum = JSON.parse(fs.readFileSync(checkpointArbitrumFilePath, 'utf8'));
+
+ // Fetch addresses from the checkpoint files
+ const CrossChainBridgeSepoliaAddress = checkpointDataSepolia.LZCrossChainAdapterL1;
+ const CrossChainBridgeOptimismSepoliaAddress = checkpointDataOptimism.LZCrossChainAdapterL2;
+ const CrossChainBridgeArbitrumSepoliaAddress = checkpointDataArbitrum.LZCrossChainAdapterL2;
+
+ if (!CrossChainBridgeSepoliaAddress || !CrossChainBridgeOptimismSepoliaAddress || !CrossChainBridgeArbitrumSepoliaAddress) {
+ throw new Error("CrossChainBridge addresses not found in the checkpoint files.");
+ }
+
+ // Get contract instances
+ const CrossChainBridgeSepolia = await ethers.getContractAt("LZCrossChainAdapterL1", CrossChainBridgeSepoliaAddress);
+ const eIDArbitrumSepolia = 40231;
+ const eIDOptimismSepolia = 40232;
+
+ // Set peer for OptimismSepolia
+ await CrossChainBridgeSepolia.connect(deployer).setPeer(eIDOptimismSepolia, ethers.utils.zeroPad(CrossChainBridgeOptimismSepoliaAddress, 32));
+ await CrossChainBridgeSepolia.connect(deployer).setPeer(eIDArbitrumSepolia, ethers.utils.zeroPad(CrossChainBridgeArbitrumSepoliaAddress, 32));
+ console.log("Peers set successfully");
+}
+
+main()
+ .then(() => process.exit(0))
+ .catch(error => {
+ console.error(error);
+ process.exit(1);
+ });
diff --git a/projects/bridge-lz/scripts/testnet/set-peers-l2-arb.ts b/projects/bridge-lz/scripts/testnet/set-peers-l2-arb.ts
new file mode 100644
index 00000000..0298a7f2
--- /dev/null
+++ b/projects/bridge-lz/scripts/testnet/set-peers-l2-arb.ts
@@ -0,0 +1,46 @@
+const { ethers } = require("hardhat");
+const fs = require("fs");
+const path = require("path");
+
+async function main() {
+ const [deployer] = await ethers.getSigners();
+
+ // Paths to the checkpoint files
+ const checkpointSepoliaFilePath = path.join(__dirname, '../../../deployment_checkpoint_sepolia.json');
+ const checkpointArbitrumFilePath = path.join(__dirname, '../../../deployment_checkpoint_arbitrum-sepolia.json');
+
+ // Check if checkpoint files exist
+ if (!fs.existsSync(checkpointSepoliaFilePath)) {
+ throw new Error(`Checkpoint file not found: ${checkpointSepoliaFilePath}`);
+ }
+ if (!fs.existsSync(checkpointArbitrumFilePath)) {
+ throw new Error(`Checkpoint file not found: ${checkpointArbitrumFilePath}`);
+ }
+
+ // Read and parse the JSON files
+ const checkpointDataSepolia = JSON.parse(fs.readFileSync(checkpointSepoliaFilePath, 'utf8'));
+ const checkpointDataArbitrum = JSON.parse(fs.readFileSync(checkpointArbitrumFilePath, 'utf8'));
+
+ // Fetch addresses from the checkpoint files
+ const CrossChainBridgeSepoliaAddress = checkpointDataSepolia.LZCrossChainAdapterL1;
+ const CrossChainBridgeArbitrumSepoliaAddress = checkpointDataArbitrum.LZCrossChainAdapterL2;
+
+ if (!CrossChainBridgeSepoliaAddress || !CrossChainBridgeArbitrumSepoliaAddress) {
+ throw new Error("CrossChainBridge addresses not found in the checkpoint files.");
+ }
+
+ // Get contract instances
+ const CrossChainBridgeSepolia = await ethers.getContractAt("LZCrossChainAdapterL2", CrossChainBridgeArbitrumSepoliaAddress);
+ const eIdSepolia = 40161; // Endpoint ID for Sepolia
+
+ // Set peer for Sepolia
+ await CrossChainBridgeSepolia.connect(deployer).setPeer(eIdSepolia, ethers.utils.zeroPad(CrossChainBridgeSepoliaAddress, 32));
+ console.log("Peers set successfully");
+}
+
+main()
+ .then(() => process.exit(0))
+ .catch(error => {
+ console.error(error);
+ process.exit(1);
+ });
diff --git a/projects/bridge-lz/scripts/testnet/set-peers-l2-opt.ts b/projects/bridge-lz/scripts/testnet/set-peers-l2-opt.ts
new file mode 100644
index 00000000..58fad32b
--- /dev/null
+++ b/projects/bridge-lz/scripts/testnet/set-peers-l2-opt.ts
@@ -0,0 +1,46 @@
+const { ethers } = require("hardhat");
+const fs = require("fs");
+const path = require("path");
+
+async function main() {
+ const [deployer] = await ethers.getSigners();
+
+ // Paths to the checkpoint files
+ const checkpointSepoliaFilePath = path.join(__dirname, '../../../deployment_checkpoint_sepolia.json');
+ const checkpointOptimismFilePath = path.join(__dirname, '../../../deployment_checkpoint_optimism-sepolia.json');
+
+ // Check if checkpoint files exist
+ if (!fs.existsSync(checkpointSepoliaFilePath)) {
+ throw new Error(`Checkpoint file not found: ${checkpointSepoliaFilePath}`);
+ }
+ if (!fs.existsSync(checkpointOptimismFilePath)) {
+ throw new Error(`Checkpoint file not found: ${checkpointOptimismFilePath}`);
+ }
+
+ // Read and parse the JSON files
+ const checkpointDataSepolia = JSON.parse(fs.readFileSync(checkpointSepoliaFilePath, 'utf8'));
+ const checkpointDataOptimism = JSON.parse(fs.readFileSync(checkpointOptimismFilePath, 'utf8'));
+
+ // Fetch addresses from the checkpoint files
+ const CrossChainBridgeSepoliaAddress = checkpointDataSepolia.LZCrossChainAdapterL1;
+ const CrossChainBridgeOptimismSepoliaAddress = checkpointDataOptimism.LZCrossChainAdapterL2;
+
+ if (!CrossChainBridgeSepoliaAddress || !CrossChainBridgeOptimismSepoliaAddress) {
+ throw new Error("CrossChainBridge addresses not found in the checkpoint files.");
+ }
+
+ // Get contract instances
+ const CrossChainBridgeOptimismSepolia = await ethers.getContractAt("LZCrossChainAdapterL2", CrossChainBridgeOptimismSepoliaAddress);
+ const eIdSepolia = 40161;
+
+ // Set peer for Sepolia
+ await CrossChainBridgeOptimismSepolia.connect(deployer).setPeer(eIdSepolia, ethers.utils.zeroPad(CrossChainBridgeSepoliaAddress, 32));
+ console.log(`Bridge at address ${CrossChainBridgeOptimismSepoliaAddress} was set successfully with peer at address ${CrossChainBridgeSepoliaAddress} at Sepolia`);
+}
+
+main()
+ .then(() => process.exit(0))
+ .catch(error => {
+ console.error(error);
+ process.exit(1);
+ });
diff --git a/projects/bridge-lz/scripts/updates/update-l1-tx-storage.ts b/projects/bridge-lz/scripts/updates/update-l1-tx-storage.ts
new file mode 100644
index 00000000..dc95ecb0
--- /dev/null
+++ b/projects/bridge-lz/scripts/updates/update-l1-tx-storage.ts
@@ -0,0 +1,58 @@
+const { ethers } = require("hardhat");
+const fs = require("fs");
+const path = require("path");
+
+async function main() {
+ const [deployer] = await ethers.getSigners();
+
+ // Path to the JSON file
+ const checkpointFilePath = path.join(__dirname, '../../deployment_checkpoint_sepolia.json');
+
+ // Check if file exists
+ if (!fs.existsSync(checkpointFilePath)) {
+ throw new Error(`File not found: ${checkpointFilePath}`);
+ }
+
+ // Read and parse the JSON file
+ const checkpointData = JSON.parse(fs.readFileSync(checkpointFilePath, 'utf8'));
+
+ const optimismAdapterL1Address = checkpointData.CrossChainAdapterOptimismL1;
+ if (!optimismAdapterL1Address) {
+ throw new Error('Missing CrossChainAdapterOptimismL1 address in deployment_checkpoint_sepolia.json');
+ }
+
+ const transactionStorageAddress = checkpointData.TransactionStorage;
+ if (!transactionStorageAddress) {
+ throw new Error('Missing transactionStorage address in deployment_checkpoint_sepolia.json');
+ }
+
+ // Attach to the TransactionStorage contract
+ const TransactionStorage = await ethers.getContractAt("ITransactionStorage", transactionStorageAddress);
+
+ // Output the owner of the TransactionStorage contract
+ const owner = await TransactionStorage.owner();
+ console.log(`Owner of the TransactionStorage contract (${transactionStorageAddress}) is: ${owner}`);
+ console.log(`You're executing using: ${deployer.address}`);
+
+
+ console.log(`Replacing adapter on TransactionStorage contract (${transactionStorageAddress})...`);
+
+ // Call replaceAdapter function with chainId 10 (Optimism)
+ const chainId = 10; // Optimism chain ID
+ try {
+ const tx = await TransactionStorage.replaceAdapter(chainId, optimismAdapterL1Address);
+ await tx.wait();
+ console.log(`Adapter replaced successfully for chainId ${chainId} with address ${optimismAdapterL1Address}`);
+ } catch (error) {
+ console.error("Transaction failed: ", error);
+ }
+
+
+}
+
+main()
+ .then(() => process.exit(0))
+ .catch(error => {
+ console.error(error);
+ process.exit(1);
+ });
diff --git a/projects/bridge-lz/scripts/updates/update-l2-iov.ts b/projects/bridge-lz/scripts/updates/update-l2-iov.ts
new file mode 100644
index 00000000..9b559f68
--- /dev/null
+++ b/projects/bridge-lz/scripts/updates/update-l2-iov.ts
@@ -0,0 +1,43 @@
+import { ethers } from "hardhat";
+import fs from "fs";
+import path from "path";
+
+async function main() {
+ const [deployer] = await ethers.getSigners();
+
+ // Path to the JSON file
+ const checkpointFilePath = path.join(__dirname, '../../deployment_checkpoint_optimism-sepolia.json');
+
+ // Check if the file exists
+ if (!fs.existsSync(checkpointFilePath)) {
+ throw new Error(`File not found: ${checkpointFilePath}`);
+ }
+
+ // Read and parse the JSON file
+ const checkpointData = JSON.parse(fs.readFileSync(checkpointFilePath, 'utf8'));
+
+ // Get the CrossChainAdapterOptimismL2 address
+ const crossChainAdapterL2Address: string = checkpointData.CrossChainAdapterOptimismL2;
+ if (!crossChainAdapterL2Address) {
+ throw new Error('Missing CrossChainAdapterOptimismL2 address in deployment_checkpoint_optimism_sepolia.json');
+ }
+
+ const inceptionOmniVaultAddress: string = checkpointData.InceptionOmniVault;
+ const InceptionOmniVault = await ethers.getContractAt("IInceptionOmniVault", inceptionOmniVaultAddress);
+
+ console.log(`Setting CrossChainAdapter on InceptionOmniVault (${inceptionOmniVaultAddress})...`);
+
+ // Call setCrossChainAdapter with the address from the JSON file
+ const tx = await InceptionOmniVault.connect(deployer).setCrossChainAdapter(crossChainAdapterL2Address);
+
+ // Wait for the transaction to be mined
+ await tx.wait();
+ console.log(`CrossChainAdapter set to: ${crossChainAdapterL2Address}`);
+}
+
+main()
+ .then(() => process.exit(0))
+ .catch((error) => {
+ console.error(error);
+ process.exit(1);
+ });
diff --git a/projects/bridge-lz/scripts/wasDeployment/CrossChainAdapterOptimismL1.ts b/projects/bridge-lz/scripts/wasDeployment/CrossChainAdapterOptimismL1.ts
new file mode 100644
index 00000000..c77ba6d7
--- /dev/null
+++ b/projects/bridge-lz/scripts/wasDeployment/CrossChainAdapterOptimismL1.ts
@@ -0,0 +1,70 @@
+import assert from 'assert';
+import { type DeployFunction } from 'hardhat-deploy/types';
+import fs from 'fs';
+import path from 'path';
+
+const contractName = 'CrossChainAdapterOptimismL1';
+
+const deploy: DeployFunction = async (hre) => {
+ const { getNamedAccounts, deployments, network } = hre;
+ const { deploy } = deployments;
+ const { deployer } = await getNamedAccounts();
+
+ assert(deployer, 'Missing named deployer account');
+
+ // Check if the network is 'sepolia'
+ if (network.name !== 'sepolia') {
+ throw new Error(`Deployment is only allowed on the 'sepolia' network. Current network: ${network.name}`);
+ }
+
+ // Define the path to the checkpoint file
+ const checkpointFilePath = path.join(__dirname, '../deployment_checkpoint_sepolia.json');
+
+ // Check if the file exists, if not, create an empty JSON structure
+ let checkpointData = {};
+ if (fs.existsSync(checkpointFilePath)) {
+ checkpointData = JSON.parse(fs.readFileSync(checkpointFilePath, 'utf8'));
+ }
+
+ const rebalancer = checkpointData.Rebalancer;
+ const transactionStorage = checkpointData.TransactionStorage;
+
+ if (!rebalancer || !transactionStorage) {
+ throw new Error('Missing Rebalancer or TransactionStorage address in deployment_checkpoint_sepolia.json');
+ }
+
+ console.log(`Network: ${network.name}`);
+ console.log(`Deployer and Operator: ${deployer}`);
+ console.log(`Rebalancer Address: ${rebalancer}`);
+ console.log(`TransactionStorage Address: ${transactionStorage}`);
+
+ // Fetch the external LayerZero EndpointV2 deployment
+ const endpointV2Deployment = await hre.deployments.get('EndpointV2');
+
+ const operator = deployer; // Set deployer as operator
+
+ const { address } = await deploy(contractName, {
+ from: deployer,
+ args: [
+ endpointV2Deployment.address, // LayerZero's EndpointV2 address
+ deployer, // Delegate address (deployer as owner)
+ rebalancer, // Rebalancer address from JSON
+ transactionStorage, // Transaction storage address from JSON
+ operator, // Operator (deployer)
+ ],
+ log: true,
+ skipIfAlreadyDeployed: false,
+ });
+
+ console.log(`Deployed contract: ${contractName}, network: ${network.name}, address: ${address}`);
+
+ // Write the new deployed address to deployment_checkpoint_sepolia.json
+ checkpointData.CrossChainAdapterOptimismL1 = address;
+ fs.writeFileSync(checkpointFilePath, JSON.stringify(checkpointData, null, 2), 'utf8');
+
+ console.log(`Updated deployment_checkpoint_sepolia.json with CrossChainAdapterOptimismL1: ${address}`);
+};
+
+deploy.tags = [contractName];
+
+export default deploy;
diff --git a/projects/bridge-lz/scripts/wasDeployment/CrossChainAdapterOptimismL2.ts b/projects/bridge-lz/scripts/wasDeployment/CrossChainAdapterOptimismL2.ts
new file mode 100644
index 00000000..dec7bc31
--- /dev/null
+++ b/projects/bridge-lz/scripts/wasDeployment/CrossChainAdapterOptimismL2.ts
@@ -0,0 +1,64 @@
+import assert from 'assert';
+import { type DeployFunction } from 'hardhat-deploy/types';
+import fs from 'fs';
+import path from 'path';
+
+const contractName = 'CrossChainAdapterOptimismL2';
+
+const deploy: DeployFunction = async (hre) => {
+ const { getNamedAccounts, deployments, network } = hre;
+ const { deploy } = deployments;
+ const { deployer } = await getNamedAccounts();
+
+ assert(deployer, 'Missing named deployer account');
+
+ // Define the path to the checkpoint file
+ const checkpointFilePath = path.join(__dirname, '../deployment_checkpoint_optimism-sepolia.json');
+
+ // Check if the file exists, if not, throw an error
+ if (!fs.existsSync(checkpointFilePath)) {
+ throw new Error(`File not found: ${checkpointFilePath}`);
+ }
+
+ // Read the JSON file to get rebalancer, transactionStorage, and vault addresses
+ const checkpointData = JSON.parse(fs.readFileSync(checkpointFilePath, 'utf8'));
+
+ const vault = checkpointData.InceptionOmniVault;
+
+ if (!vault) {
+ throw new Error('Missing InceptionOmniVault address in deployment_checkpoint_optimism_sepolia.json');
+ }
+
+ console.log(`Network: ${network.name}`);
+ console.log(`Deployer and Operator: ${deployer}`);
+ console.log(`Vault Address: ${vault}`);
+
+ // Fetch the external LayerZero EndpointV2 deployment
+ const endpointV2Deployment = await hre.deployments.get('EndpointV2');
+
+ const operator = deployer; // Set deployer as operator
+
+ const { address } = await deploy(contractName, {
+ from: deployer,
+ args: [
+ endpointV2Deployment.address, // LayerZero's EndpointV2 address
+ deployer, // Delegate address (deployer as owner)
+ vault, // Vault address from JSON
+ operator, // Operator (deployer)
+ ],
+ log: true,
+ skipIfAlreadyDeployed: false,
+ });
+
+ console.log(`Deployed contract: ${contractName}, network: ${network.name}, address: ${address}`);
+
+ // Write the new deployed address to deployment_checkpoint_optimism_sepolia.json
+ checkpointData.CrossChainAdapterOptimismL2 = address;
+ fs.writeFileSync(checkpointFilePath, JSON.stringify(checkpointData, null, 2), 'utf8');
+
+ console.log(`Updated deployment_checkpoint_optimism_sepolia.json with CrossChainAdapterOptimismL2: ${address}`);
+};
+
+deploy.tags = [contractName];
+
+export default deploy;
diff --git a/projects/bridge-lz/scripts/wasDeployment/MyOApp.ts b/projects/bridge-lz/scripts/wasDeployment/MyOApp.ts
new file mode 100644
index 00000000..b3854fa9
--- /dev/null
+++ b/projects/bridge-lz/scripts/wasDeployment/MyOApp.ts
@@ -0,0 +1,53 @@
+import assert from 'assert'
+
+import { type DeployFunction } from 'hardhat-deploy/types'
+
+// TODO declare your contract name here
+const contractName = 'MyOApp'
+
+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: [
+ 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
diff --git a/projects/bridge-lz/solhint.config.js b/projects/bridge-lz/solhint.config.js
new file mode 100644
index 00000000..52efe629
--- /dev/null
+++ b/projects/bridge-lz/solhint.config.js
@@ -0,0 +1 @@
+module.exports = require('@layerzerolabs/solhint-config');
diff --git a/projects/bridge-lz/test/hardhat/MyOApp.test.ts b/projects/bridge-lz/test/hardhat/MyOApp.test.ts
new file mode 100644
index 00000000..d1a2ef94
--- /dev/null
+++ b/projects/bridge-lz/test/hardhat/MyOApp.test.ts
@@ -0,0 +1,83 @@
+import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'
+import { expect } from 'chai'
+import { Contract, ContractFactory } from 'ethers'
+import { deployments, ethers } from 'hardhat'
+
+import { Options } from '@layerzerolabs/lz-v2-utilities'
+
+describe('MyOApp Test', function () {
+ // 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 MyOApp: ContractFactory
+ let EndpointV2Mock: ContractFactory
+ let ownerA: SignerWithAddress
+ let ownerB: SignerWithAddress
+ let endpointOwner: SignerWithAddress
+ let myOAppA: Contract
+ let myOAppB: Contract
+ let mockEndpointV2A: Contract
+ let mockEndpointV2B: Contract
+
+ // Before hook for setup that runs once before all tests in the block
+ before(async function () {
+ // Contract factory for our tested contract
+ MyOApp = await ethers.getContractFactory('MyOApp')
+
+ // Fetching the first three signers (accounts) from Hardhat's local Ethereum network
+ const signers = await ethers.getSigners()
+
+ ownerA = signers.at(0)!
+ ownerB = signers.at(1)!
+ endpointOwner = signers.at(2)!
+
+ // 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 LZ EndpointV2 with the given Endpoint ID
+ mockEndpointV2A = await EndpointV2Mock.deploy(eidA)
+ mockEndpointV2B = await EndpointV2Mock.deploy(eidB)
+
+ // Deploying two instances of MyOApp contract and linking them to the mock LZEndpoint
+ myOAppA = await MyOApp.deploy(mockEndpointV2A.address, ownerA.address)
+ myOAppB = await MyOApp.deploy(mockEndpointV2B.address, ownerB.address)
+
+ // Setting destination endpoints in the LZEndpoint mock for each MyOApp instance
+ await mockEndpointV2A.setDestLzEndpoint(myOAppB.address, mockEndpointV2B.address)
+ await mockEndpointV2B.setDestLzEndpoint(myOAppA.address, mockEndpointV2A.address)
+
+ // Setting each MyOApp instance as a peer of the other
+ await myOAppA.connect(ownerA).setPeer(eidB, ethers.utils.zeroPad(myOAppB.address, 32))
+ await myOAppB.connect(ownerB).setPeer(eidA, ethers.utils.zeroPad(myOAppA.address, 32))
+ })
+
+ // A test case to verify message sending functionality
+ it('should send a message to each destination OApp', async function () {
+ // Assert initial state of data in both MyOApp instances
+ expect(await myOAppA.data()).to.equal('Nothing received yet.')
+ expect(await myOAppB.data()).to.equal('Nothing received yet.')
+ const options = Options.newOptions().addExecutorLzReceiveOption(200000, 0).toHex().toString()
+
+ // Define native fee and quote for the message send operation
+ let nativeFee = 0
+ ;[nativeFee] = await myOAppA.quote(eidB, 'Test message.', options, false)
+
+ // Execute send operation from myOAppA
+ await myOAppA.send(eidB, 'Test message.', options, { value: nativeFee.toString() })
+
+ // Assert the resulting state of data in both MyOApp instances
+ expect(await myOAppA.data()).to.equal('Nothing received yet.')
+ expect(await myOAppB.data()).to.equal('Test message.')
+ })
+})
diff --git a/projects/bridge-lz/tsconfig.json b/projects/bridge-lz/tsconfig.json
new file mode 100644
index 00000000..21d541fa
--- /dev/null
+++ b/projects/bridge-lz/tsconfig.json
@@ -0,0 +1,14 @@
+{
+ "exclude": ["node_modules"],
+ "include": ["deploy", "test", "tasks", "hardhat.config.ts"],
+ "compilerOptions": {
+ "target": "es2020",
+ "module": "commonjs",
+ "esModuleInterop": true,
+ "forceConsistentCasingInFileNames": true,
+ "strict": true,
+ "skipLibCheck": true,
+ "resolveJsonModule": true,
+ "types": ["node", "mocha"]
+ }
+}
diff --git a/projects/bridge-lz/yarn.lock b/projects/bridge-lz/yarn.lock
new file mode 100644
index 00000000..d691e585
--- /dev/null
+++ b/projects/bridge-lz/yarn.lock
@@ -0,0 +1,7462 @@
+# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
+# yarn lockfile v1
+
+
+"@ampproject/remapping@^2.2.0":
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.3.0.tgz#ed441b6fa600072520ce18b43d2c8cc8caecc7f4"
+ integrity sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==
+ dependencies:
+ "@jridgewell/gen-mapping" "^0.3.5"
+ "@jridgewell/trace-mapping" "^0.3.24"
+
+"@babel/code-frame@^7.0.0":
+ version "7.25.7"
+ resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.25.7.tgz"
+ integrity sha512-0xZJFNE5XMpENsgfHYTw8FbX4kv53mFLn2i3XPoq69LyhYSCBJtitaHx9QnsVTrsogI4Z3+HtEfZ2/GFPOtf5g==
+ dependencies:
+ "@babel/highlight" "^7.25.7"
+ picocolors "^1.0.0"
+
+"@babel/code-frame@^7.25.7", "@babel/code-frame@^7.25.9":
+ version "7.26.0"
+ resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.26.0.tgz#9374b5cd068d128dac0b94ff482594273b1c2815"
+ integrity sha512-INCKxTtbXtcNbUZ3YXutwMpEleqttcswhAdee7dhuoVrD2cnuc3PqtERBtxkX5nziX9vnBL8WXmSGwv8CuPV6g==
+ dependencies:
+ "@babel/helper-validator-identifier" "^7.25.9"
+ js-tokens "^4.0.0"
+ picocolors "^1.0.0"
+
+"@babel/compat-data@^7.25.9":
+ version "7.26.0"
+ resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.26.0.tgz#f02ba6d34e88fadd5e8861e8b38902f43cc1c819"
+ integrity sha512-qETICbZSLe7uXv9VE8T/RWOdIE5qqyTucOt4zLYMafj2MRO271VGgLd4RACJMeBO37UPWhXiKMBk7YlJ0fOzQA==
+
+"@babel/core@^7.23.9":
+ version "7.25.8"
+ resolved "https://registry.npmjs.org/@babel/core/-/core-7.25.8.tgz"
+ integrity sha512-Oixnb+DzmRT30qu9d3tJSQkxuygWm32DFykT4bRoORPa9hZ/L4KhVB/XiRm6KG+roIEM7DBQlmg27kw2HZkdZg==
+ dependencies:
+ "@ampproject/remapping" "^2.2.0"
+ "@babel/code-frame" "^7.25.7"
+ "@babel/generator" "^7.25.7"
+ "@babel/helper-compilation-targets" "^7.25.7"
+ "@babel/helper-module-transforms" "^7.25.7"
+ "@babel/helpers" "^7.25.7"
+ "@babel/parser" "^7.25.8"
+ "@babel/template" "^7.25.7"
+ "@babel/traverse" "^7.25.7"
+ "@babel/types" "^7.25.8"
+ convert-source-map "^2.0.0"
+ debug "^4.1.0"
+ gensync "^1.0.0-beta.2"
+ json5 "^2.2.3"
+ semver "^6.3.1"
+
+"@babel/generator@^7.25.7", "@babel/generator@^7.25.9":
+ version "7.26.0"
+ resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.26.0.tgz#505cc7c90d92513f458a477e5ef0703e7c91b8d7"
+ integrity sha512-/AIkAmInnWwgEAJGQr9vY0c66Mj6kjkE2ZPB1PurTRaRAh3U+J45sAQMjQDJdh4WbR3l0x5xkimXBKyBXXAu2w==
+ dependencies:
+ "@babel/parser" "^7.26.0"
+ "@babel/types" "^7.26.0"
+ "@jridgewell/gen-mapping" "^0.3.5"
+ "@jridgewell/trace-mapping" "^0.3.25"
+ jsesc "^3.0.2"
+
+"@babel/helper-compilation-targets@^7.25.7":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.9.tgz#55af025ce365be3cdc0c1c1e56c6af617ce88875"
+ integrity sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==
+ dependencies:
+ "@babel/compat-data" "^7.25.9"
+ "@babel/helper-validator-option" "^7.25.9"
+ browserslist "^4.24.0"
+ lru-cache "^5.1.1"
+ semver "^6.3.1"
+
+"@babel/helper-module-imports@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz#e7f8d20602ebdbf9ebbea0a0751fb0f2a4141715"
+ integrity sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==
+ dependencies:
+ "@babel/traverse" "^7.25.9"
+ "@babel/types" "^7.25.9"
+
+"@babel/helper-module-transforms@^7.25.7":
+ version "7.26.0"
+ resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz#8ce54ec9d592695e58d84cd884b7b5c6a2fdeeae"
+ integrity sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==
+ dependencies:
+ "@babel/helper-module-imports" "^7.25.9"
+ "@babel/helper-validator-identifier" "^7.25.9"
+ "@babel/traverse" "^7.25.9"
+
+"@babel/helper-string-parser@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz#1aabb72ee72ed35789b4bbcad3ca2862ce614e8c"
+ integrity sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==
+
+"@babel/helper-validator-identifier@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz#24b64e2c3ec7cd3b3c547729b8d16871f22cbdc7"
+ integrity sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==
+
+"@babel/helper-validator-option@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz#86e45bd8a49ab7e03f276577f96179653d41da72"
+ integrity sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==
+
+"@babel/helpers@^7.25.7":
+ version "7.26.0"
+ resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.26.0.tgz#30e621f1eba5aa45fe6f4868d2e9154d884119a4"
+ integrity sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==
+ dependencies:
+ "@babel/template" "^7.25.9"
+ "@babel/types" "^7.26.0"
+
+"@babel/highlight@^7.25.7":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.25.9.tgz#8141ce68fc73757946f983b343f1231f4691acc6"
+ integrity sha512-llL88JShoCsth8fF8R4SJnIn+WLvR6ccFxu1H3FlMhDontdcmZWf2HgIZ7AIqV3Xcck1idlohrN4EUBQz6klbw==
+ dependencies:
+ "@babel/helper-validator-identifier" "^7.25.9"
+ chalk "^2.4.2"
+ js-tokens "^4.0.0"
+ picocolors "^1.0.0"
+
+"@babel/parser@^7.25.8":
+ version "7.26.1"
+ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.26.1.tgz#44e02499960df2cdce2c456372a3e8e0c3c5c975"
+ integrity sha512-reoQYNiAJreZNsJzyrDNzFQ+IQ5JFiIzAHJg9bn94S3l+4++J7RsIhNMoB+lgP/9tpmiAQqspv+xfdxTSzREOw==
+ dependencies:
+ "@babel/types" "^7.26.0"
+
+"@babel/parser@^7.25.9", "@babel/parser@^7.26.0":
+ version "7.26.0"
+ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.26.0.tgz#710a75a7d805a8f72753154e451474e9795b121c"
+ integrity sha512-aP8x5pIw3xvYr/sXT+SEUwyhrXT8rUJRZltK/qN3Db80dcKpTett8cJxHyjk+xYSVXvNnl2SfcJVjbwxpOSscA==
+ dependencies:
+ "@babel/types" "^7.26.0"
+
+"@babel/template@^7.25.7", "@babel/template@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.25.9.tgz#ecb62d81a8a6f5dc5fe8abfc3901fc52ddf15016"
+ integrity sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==
+ dependencies:
+ "@babel/code-frame" "^7.25.9"
+ "@babel/parser" "^7.25.9"
+ "@babel/types" "^7.25.9"
+
+"@babel/traverse@^7.25.7", "@babel/traverse@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.25.9.tgz#a50f8fe49e7f69f53de5bea7e413cd35c5e13c84"
+ integrity sha512-ZCuvfwOwlz/bawvAuvcj8rrithP2/N55Tzz342AkTvq4qaWbGfmCk/tKhNaV2cthijKrPAA8SRJV5WWe7IBMJw==
+ dependencies:
+ "@babel/code-frame" "^7.25.9"
+ "@babel/generator" "^7.25.9"
+ "@babel/parser" "^7.25.9"
+ "@babel/template" "^7.25.9"
+ "@babel/types" "^7.25.9"
+ debug "^4.3.1"
+ globals "^11.1.0"
+
+"@babel/types@^7.25.8", "@babel/types@^7.25.9", "@babel/types@^7.26.0":
+ version "7.26.0"
+ resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.26.0.tgz#deabd08d6b753bc8e0f198f8709fb575e31774ff"
+ integrity sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==
+ dependencies:
+ "@babel/helper-string-parser" "^7.25.9"
+ "@babel/helper-validator-identifier" "^7.25.9"
+
+"@colors/colors@1.5.0":
+ version "1.5.0"
+ resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.5.0.tgz#bb504579c1cae923e6576a4f5da43d25f97bdbd9"
+ integrity sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==
+
+"@colors/colors@1.6.0", "@colors/colors@^1.6.0":
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.6.0.tgz#ec6cd237440700bc23ca23087f513c75508958b0"
+ integrity sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==
+
+"@cspotcode/source-map-support@^0.8.0":
+ version "0.8.1"
+ resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1"
+ integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==
+ dependencies:
+ "@jridgewell/trace-mapping" "0.3.9"
+
+"@dabh/diagnostics@^2.0.2":
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/@dabh/diagnostics/-/diagnostics-2.0.3.tgz#7f7e97ee9a725dffc7808d93668cc984e1dc477a"
+ integrity sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==
+ dependencies:
+ colorspace "1.1.x"
+ enabled "2.0.x"
+ kuler "^2.0.0"
+
+"@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0":
+ version "4.4.0"
+ resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59"
+ integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==
+ dependencies:
+ eslint-visitor-keys "^3.3.0"
+
+"@eslint-community/regexpp@^4.10.0", "@eslint-community/regexpp@^4.6.1":
+ version "4.11.1"
+ resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.11.1.tgz#a547badfc719eb3e5f4b556325e542fbe9d7a18f"
+ integrity sha512-m4DVN9ZqskZoLU5GlWZadwDnYo3vAEydiUayB9widCl9ffWx2IvPnp6n3on5rJmziJSw9Bv+Z3ChDVdMwXCY8Q==
+
+"@eslint/eslintrc@^2.1.4":
+ version "2.1.4"
+ resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.4.tgz#388a269f0f25c1b6adc317b5a2c55714894c70ad"
+ integrity sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==
+ dependencies:
+ ajv "^6.12.4"
+ debug "^4.3.2"
+ espree "^9.6.0"
+ globals "^13.19.0"
+ ignore "^5.2.0"
+ import-fresh "^3.2.1"
+ js-yaml "^4.1.0"
+ minimatch "^3.1.2"
+ strip-json-comments "^3.1.1"
+
+"@eslint/js@8.57.1":
+ version "8.57.1"
+ resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.57.1.tgz#de633db3ec2ef6a3c89e2f19038063e8a122e2c2"
+ integrity sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==
+
+"@ethereumjs/common@2.6.5", "@ethereumjs/common@^2.6.4":
+ version "2.6.5"
+ resolved "https://registry.yarnpkg.com/@ethereumjs/common/-/common-2.6.5.tgz#0a75a22a046272579d91919cb12d84f2756e8d30"
+ integrity sha512-lRyVQOeCDaIVtgfbowla32pzeDv2Obr8oR8Put5RdUBNRGr1VGPGQNGP6elWIpgK3YdpzqTOh4GyUGOureVeeA==
+ dependencies:
+ crc-32 "^1.2.0"
+ ethereumjs-util "^7.1.5"
+
+"@ethereumjs/rlp@^4.0.1":
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/@ethereumjs/rlp/-/rlp-4.0.1.tgz#626fabfd9081baab3d0a3074b0c7ecaf674aaa41"
+ integrity sha512-tqsQiBQDQdmPWE1xkkBq4rlSW5QZpLOUJ5RJh2/9fug+q9tnUhuZoVLk7s0scUIKTOzEtR72DFBXI4WiZcMpvw==
+
+"@ethereumjs/tx@3.5.2":
+ version "3.5.2"
+ resolved "https://registry.yarnpkg.com/@ethereumjs/tx/-/tx-3.5.2.tgz#197b9b6299582ad84f9527ca961466fce2296c1c"
+ integrity sha512-gQDNJWKrSDGu2w7w0PzVXVBNMzb7wwdDOmOqczmhNjqFxFuIbhVJDwiGEnxFNC2/b8ifcZzY7MLcluizohRzNw==
+ dependencies:
+ "@ethereumjs/common" "^2.6.4"
+ ethereumjs-util "^7.1.5"
+
+"@ethereumjs/util@^8.1.0":
+ version "8.1.0"
+ resolved "https://registry.yarnpkg.com/@ethereumjs/util/-/util-8.1.0.tgz#299df97fb6b034e0577ce9f94c7d9d1004409ed4"
+ integrity sha512-zQ0IqbdX8FZ9aw11vP+dZkKDkS+kgIvQPHnSAXzP9pLu+Rfu3D3XEeLbicvoXJTYnhZiPmsZUxgdzXwNKxRPbA==
+ dependencies:
+ "@ethereumjs/rlp" "^4.0.1"
+ ethereum-cryptography "^2.0.0"
+ micro-ftch "^0.3.1"
+
+"@ethersproject/abi@5.7.0", "@ethersproject/abi@^5.1.2", "@ethersproject/abi@^5.6.3", "@ethersproject/abi@^5.7.0":
+ version "5.7.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.7.0.tgz#b3f3e045bbbeed1af3947335c247ad625a44e449"
+ integrity sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA==
+ dependencies:
+ "@ethersproject/address" "^5.7.0"
+ "@ethersproject/bignumber" "^5.7.0"
+ "@ethersproject/bytes" "^5.7.0"
+ "@ethersproject/constants" "^5.7.0"
+ "@ethersproject/hash" "^5.7.0"
+ "@ethersproject/keccak256" "^5.7.0"
+ "@ethersproject/logger" "^5.7.0"
+ "@ethersproject/properties" "^5.7.0"
+ "@ethersproject/strings" "^5.7.0"
+
+"@ethersproject/abstract-provider@5.7.0", "@ethersproject/abstract-provider@^5.7.0":
+ version "5.7.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz#b0a8550f88b6bf9d51f90e4795d48294630cb9ef"
+ integrity sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw==
+ dependencies:
+ "@ethersproject/bignumber" "^5.7.0"
+ "@ethersproject/bytes" "^5.7.0"
+ "@ethersproject/logger" "^5.7.0"
+ "@ethersproject/networks" "^5.7.0"
+ "@ethersproject/properties" "^5.7.0"
+ "@ethersproject/transactions" "^5.7.0"
+ "@ethersproject/web" "^5.7.0"
+
+"@ethersproject/abstract-signer@5.7.0", "@ethersproject/abstract-signer@^5.7.0":
+ version "5.7.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/abstract-signer/-/abstract-signer-5.7.0.tgz#13f4f32117868452191a4649723cb086d2b596b2"
+ integrity sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ==
+ dependencies:
+ "@ethersproject/abstract-provider" "^5.7.0"
+ "@ethersproject/bignumber" "^5.7.0"
+ "@ethersproject/bytes" "^5.7.0"
+ "@ethersproject/logger" "^5.7.0"
+ "@ethersproject/properties" "^5.7.0"
+
+"@ethersproject/address@5.6.1":
+ version "5.6.1"
+ resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.6.1.tgz#ab57818d9aefee919c5721d28cd31fd95eff413d"
+ integrity sha512-uOgF0kS5MJv9ZvCz7x6T2EXJSzotiybApn4XlOgoTX0xdtyVIJ7pF+6cGPxiEq/dpBiTfMiw7Yc81JcwhSYA0Q==
+ dependencies:
+ "@ethersproject/bignumber" "^5.6.2"
+ "@ethersproject/bytes" "^5.6.1"
+ "@ethersproject/keccak256" "^5.6.1"
+ "@ethersproject/logger" "^5.6.0"
+ "@ethersproject/rlp" "^5.6.1"
+
+"@ethersproject/address@5.7.0", "@ethersproject/address@^5.0.2", "@ethersproject/address@^5.7.0", "@ethersproject/address@~5.7.0":
+ version "5.7.0"
+ resolved "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz"
+ integrity sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==
+ dependencies:
+ "@ethersproject/bignumber" "^5.7.0"
+ "@ethersproject/bytes" "^5.7.0"
+ "@ethersproject/keccak256" "^5.7.0"
+ "@ethersproject/logger" "^5.7.0"
+ "@ethersproject/rlp" "^5.7.0"
+
+"@ethersproject/base64@5.7.0", "@ethersproject/base64@^5.7.0":
+ version "5.7.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/base64/-/base64-5.7.0.tgz#ac4ee92aa36c1628173e221d0d01f53692059e1c"
+ integrity sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ==
+ dependencies:
+ "@ethersproject/bytes" "^5.7.0"
+
+"@ethersproject/basex@5.7.0", "@ethersproject/basex@^5.7.0":
+ version "5.7.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/basex/-/basex-5.7.0.tgz#97034dc7e8938a8ca943ab20f8a5e492ece4020b"
+ integrity sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw==
+ dependencies:
+ "@ethersproject/bytes" "^5.7.0"
+ "@ethersproject/properties" "^5.7.0"
+
+"@ethersproject/bignumber@5.7.0", "@ethersproject/bignumber@^5.6.2", "@ethersproject/bignumber@^5.7.0":
+ version "5.7.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.7.0.tgz#e2f03837f268ba655ffba03a57853e18a18dc9c2"
+ integrity sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw==
+ dependencies:
+ "@ethersproject/bytes" "^5.7.0"
+ "@ethersproject/logger" "^5.7.0"
+ bn.js "^5.2.1"
+
+"@ethersproject/bytes@5.7.0", "@ethersproject/bytes@^5.6.1", "@ethersproject/bytes@^5.7.0":
+ version "5.7.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.7.0.tgz#a00f6ea8d7e7534d6d87f47188af1148d71f155d"
+ integrity sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A==
+ dependencies:
+ "@ethersproject/logger" "^5.7.0"
+
+"@ethersproject/constants@5.7.0", "@ethersproject/constants@^5.7.0":
+ version "5.7.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.7.0.tgz#df80a9705a7e08984161f09014ea012d1c75295e"
+ integrity sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA==
+ dependencies:
+ "@ethersproject/bignumber" "^5.7.0"
+
+"@ethersproject/contracts@5.7.0", "@ethersproject/contracts@^5.7.0":
+ version "5.7.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/contracts/-/contracts-5.7.0.tgz#c305e775abd07e48aa590e1a877ed5c316f8bd1e"
+ integrity sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg==
+ dependencies:
+ "@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/bytes" "^5.7.0"
+ "@ethersproject/constants" "^5.7.0"
+ "@ethersproject/logger" "^5.7.0"
+ "@ethersproject/properties" "^5.7.0"
+ "@ethersproject/transactions" "^5.7.0"
+
+"@ethersproject/hash@5.7.0", "@ethersproject/hash@^5.7.0":
+ version "5.7.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/hash/-/hash-5.7.0.tgz#eb7aca84a588508369562e16e514b539ba5240a7"
+ integrity sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g==
+ dependencies:
+ "@ethersproject/abstract-signer" "^5.7.0"
+ "@ethersproject/address" "^5.7.0"
+ "@ethersproject/base64" "^5.7.0"
+ "@ethersproject/bignumber" "^5.7.0"
+ "@ethersproject/bytes" "^5.7.0"
+ "@ethersproject/keccak256" "^5.7.0"
+ "@ethersproject/logger" "^5.7.0"
+ "@ethersproject/properties" "^5.7.0"
+ "@ethersproject/strings" "^5.7.0"
+
+"@ethersproject/hdnode@5.7.0", "@ethersproject/hdnode@^5.7.0":
+ version "5.7.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/hdnode/-/hdnode-5.7.0.tgz#e627ddc6b466bc77aebf1a6b9e47405ca5aef9cf"
+ integrity sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg==
+ dependencies:
+ "@ethersproject/abstract-signer" "^5.7.0"
+ "@ethersproject/basex" "^5.7.0"
+ "@ethersproject/bignumber" "^5.7.0"
+ "@ethersproject/bytes" "^5.7.0"
+ "@ethersproject/logger" "^5.7.0"
+ "@ethersproject/pbkdf2" "^5.7.0"
+ "@ethersproject/properties" "^5.7.0"
+ "@ethersproject/sha2" "^5.7.0"
+ "@ethersproject/signing-key" "^5.7.0"
+ "@ethersproject/strings" "^5.7.0"
+ "@ethersproject/transactions" "^5.7.0"
+ "@ethersproject/wordlists" "^5.7.0"
+
+"@ethersproject/json-wallets@5.7.0", "@ethersproject/json-wallets@^5.7.0":
+ version "5.7.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/json-wallets/-/json-wallets-5.7.0.tgz#5e3355287b548c32b368d91014919ebebddd5360"
+ integrity sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g==
+ dependencies:
+ "@ethersproject/abstract-signer" "^5.7.0"
+ "@ethersproject/address" "^5.7.0"
+ "@ethersproject/bytes" "^5.7.0"
+ "@ethersproject/hdnode" "^5.7.0"
+ "@ethersproject/keccak256" "^5.7.0"
+ "@ethersproject/logger" "^5.7.0"
+ "@ethersproject/pbkdf2" "^5.7.0"
+ "@ethersproject/properties" "^5.7.0"
+ "@ethersproject/random" "^5.7.0"
+ "@ethersproject/strings" "^5.7.0"
+ "@ethersproject/transactions" "^5.7.0"
+ aes-js "3.0.0"
+ scrypt-js "3.0.1"
+
+"@ethersproject/keccak256@5.7.0", "@ethersproject/keccak256@^5.6.1", "@ethersproject/keccak256@^5.7.0":
+ version "5.7.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.7.0.tgz#3186350c6e1cd6aba7940384ec7d6d9db01f335a"
+ integrity sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg==
+ dependencies:
+ "@ethersproject/bytes" "^5.7.0"
+ js-sha3 "0.8.0"
+
+"@ethersproject/logger@5.7.0", "@ethersproject/logger@^5.6.0", "@ethersproject/logger@^5.7.0":
+ version "5.7.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.7.0.tgz#6ce9ae168e74fecf287be17062b590852c311892"
+ integrity sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig==
+
+"@ethersproject/networks@5.7.1", "@ethersproject/networks@^5.7.0":
+ version "5.7.1"
+ resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.7.1.tgz#118e1a981d757d45ccea6bb58d9fd3d9db14ead6"
+ integrity sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ==
+ dependencies:
+ "@ethersproject/logger" "^5.7.0"
+
+"@ethersproject/pbkdf2@5.7.0", "@ethersproject/pbkdf2@^5.7.0":
+ version "5.7.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/pbkdf2/-/pbkdf2-5.7.0.tgz#d2267d0a1f6e123f3771007338c47cccd83d3102"
+ integrity sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw==
+ dependencies:
+ "@ethersproject/bytes" "^5.7.0"
+ "@ethersproject/sha2" "^5.7.0"
+
+"@ethersproject/properties@5.7.0", "@ethersproject/properties@^5.7.0":
+ version "5.7.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.7.0.tgz#a6e12cb0439b878aaf470f1902a176033067ed30"
+ integrity sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw==
+ dependencies:
+ "@ethersproject/logger" "^5.7.0"
+
+"@ethersproject/providers@5.7.2", "@ethersproject/providers@^5.7.0", "@ethersproject/providers@^5.7.2":
+ version "5.7.2"
+ resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.7.2.tgz#f8b1a4f275d7ce58cf0a2eec222269a08beb18cb"
+ integrity sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg==
+ dependencies:
+ "@ethersproject/abstract-provider" "^5.7.0"
+ "@ethersproject/abstract-signer" "^5.7.0"
+ "@ethersproject/address" "^5.7.0"
+ "@ethersproject/base64" "^5.7.0"
+ "@ethersproject/basex" "^5.7.0"
+ "@ethersproject/bignumber" "^5.7.0"
+ "@ethersproject/bytes" "^5.7.0"
+ "@ethersproject/constants" "^5.7.0"
+ "@ethersproject/hash" "^5.7.0"
+ "@ethersproject/logger" "^5.7.0"
+ "@ethersproject/networks" "^5.7.0"
+ "@ethersproject/properties" "^5.7.0"
+ "@ethersproject/random" "^5.7.0"
+ "@ethersproject/rlp" "^5.7.0"
+ "@ethersproject/sha2" "^5.7.0"
+ "@ethersproject/strings" "^5.7.0"
+ "@ethersproject/transactions" "^5.7.0"
+ "@ethersproject/web" "^5.7.0"
+ bech32 "1.1.4"
+ ws "7.4.6"
+
+"@ethersproject/random@5.7.0", "@ethersproject/random@^5.7.0":
+ version "5.7.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/random/-/random-5.7.0.tgz#af19dcbc2484aae078bb03656ec05df66253280c"
+ integrity sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ==
+ dependencies:
+ "@ethersproject/bytes" "^5.7.0"
+ "@ethersproject/logger" "^5.7.0"
+
+"@ethersproject/rlp@5.7.0", "@ethersproject/rlp@^5.6.1", "@ethersproject/rlp@^5.7.0":
+ version "5.7.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/rlp/-/rlp-5.7.0.tgz#de39e4d5918b9d74d46de93af80b7685a9c21304"
+ integrity sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w==
+ dependencies:
+ "@ethersproject/bytes" "^5.7.0"
+ "@ethersproject/logger" "^5.7.0"
+
+"@ethersproject/sha2@5.7.0", "@ethersproject/sha2@^5.7.0":
+ version "5.7.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/sha2/-/sha2-5.7.0.tgz#9a5f7a7824ef784f7f7680984e593a800480c9fb"
+ integrity sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw==
+ dependencies:
+ "@ethersproject/bytes" "^5.7.0"
+ "@ethersproject/logger" "^5.7.0"
+ hash.js "1.1.7"
+
+"@ethersproject/signing-key@5.7.0", "@ethersproject/signing-key@^5.7.0":
+ version "5.7.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/signing-key/-/signing-key-5.7.0.tgz#06b2df39411b00bc57c7c09b01d1e41cf1b16ab3"
+ integrity sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q==
+ dependencies:
+ "@ethersproject/bytes" "^5.7.0"
+ "@ethersproject/logger" "^5.7.0"
+ "@ethersproject/properties" "^5.7.0"
+ bn.js "^5.2.1"
+ elliptic "6.5.4"
+ hash.js "1.1.7"
+
+"@ethersproject/solidity@5.7.0", "@ethersproject/solidity@^5.7.0":
+ version "5.7.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/solidity/-/solidity-5.7.0.tgz#5e9c911d8a2acce2a5ebb48a5e2e0af20b631cb8"
+ integrity sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA==
+ dependencies:
+ "@ethersproject/bignumber" "^5.7.0"
+ "@ethersproject/bytes" "^5.7.0"
+ "@ethersproject/keccak256" "^5.7.0"
+ "@ethersproject/logger" "^5.7.0"
+ "@ethersproject/sha2" "^5.7.0"
+ "@ethersproject/strings" "^5.7.0"
+
+"@ethersproject/strings@5.7.0", "@ethersproject/strings@^5.7.0":
+ version "5.7.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.7.0.tgz#54c9d2a7c57ae8f1205c88a9d3a56471e14d5ed2"
+ integrity sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg==
+ dependencies:
+ "@ethersproject/bytes" "^5.7.0"
+ "@ethersproject/constants" "^5.7.0"
+ "@ethersproject/logger" "^5.7.0"
+
+"@ethersproject/transactions@5.7.0", "@ethersproject/transactions@^5.6.2", "@ethersproject/transactions@^5.7.0":
+ version "5.7.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.7.0.tgz#91318fc24063e057885a6af13fdb703e1f993d3b"
+ integrity sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ==
+ dependencies:
+ "@ethersproject/address" "^5.7.0"
+ "@ethersproject/bignumber" "^5.7.0"
+ "@ethersproject/bytes" "^5.7.0"
+ "@ethersproject/constants" "^5.7.0"
+ "@ethersproject/keccak256" "^5.7.0"
+ "@ethersproject/logger" "^5.7.0"
+ "@ethersproject/properties" "^5.7.0"
+ "@ethersproject/rlp" "^5.7.0"
+ "@ethersproject/signing-key" "^5.7.0"
+
+"@ethersproject/units@5.7.0":
+ version "5.7.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/units/-/units-5.7.0.tgz#637b563d7e14f42deeee39245275d477aae1d8b1"
+ integrity sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg==
+ dependencies:
+ "@ethersproject/bignumber" "^5.7.0"
+ "@ethersproject/constants" "^5.7.0"
+ "@ethersproject/logger" "^5.7.0"
+
+"@ethersproject/wallet@5.7.0", "@ethersproject/wallet@^5.7.0":
+ version "5.7.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/wallet/-/wallet-5.7.0.tgz#4e5d0790d96fe21d61d38fb40324e6c7ef350b2d"
+ integrity sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA==
+ dependencies:
+ "@ethersproject/abstract-provider" "^5.7.0"
+ "@ethersproject/abstract-signer" "^5.7.0"
+ "@ethersproject/address" "^5.7.0"
+ "@ethersproject/bignumber" "^5.7.0"
+ "@ethersproject/bytes" "^5.7.0"
+ "@ethersproject/hash" "^5.7.0"
+ "@ethersproject/hdnode" "^5.7.0"
+ "@ethersproject/json-wallets" "^5.7.0"
+ "@ethersproject/keccak256" "^5.7.0"
+ "@ethersproject/logger" "^5.7.0"
+ "@ethersproject/properties" "^5.7.0"
+ "@ethersproject/random" "^5.7.0"
+ "@ethersproject/signing-key" "^5.7.0"
+ "@ethersproject/transactions" "^5.7.0"
+ "@ethersproject/wordlists" "^5.7.0"
+
+"@ethersproject/web@5.7.1", "@ethersproject/web@^5.7.0":
+ version "5.7.1"
+ resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.7.1.tgz#de1f285b373149bee5928f4eb7bcb87ee5fbb4ae"
+ integrity sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w==
+ dependencies:
+ "@ethersproject/base64" "^5.7.0"
+ "@ethersproject/bytes" "^5.7.0"
+ "@ethersproject/logger" "^5.7.0"
+ "@ethersproject/properties" "^5.7.0"
+ "@ethersproject/strings" "^5.7.0"
+
+"@ethersproject/wordlists@5.7.0", "@ethersproject/wordlists@^5.7.0":
+ version "5.7.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/wordlists/-/wordlists-5.7.0.tgz#8fb2c07185d68c3e09eb3bfd6e779ba2774627f5"
+ integrity sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA==
+ dependencies:
+ "@ethersproject/bytes" "^5.7.0"
+ "@ethersproject/hash" "^5.7.0"
+ "@ethersproject/logger" "^5.7.0"
+ "@ethersproject/properties" "^5.7.0"
+ "@ethersproject/strings" "^5.7.0"
+
+"@fastify/busboy@^2.0.0":
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/@fastify/busboy/-/busboy-2.1.1.tgz#b9da6a878a371829a0502c9b6c1c143ef6663f4d"
+ integrity sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==
+
+"@humanwhocodes/config-array@^0.13.0":
+ version "0.13.0"
+ resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.13.0.tgz#fb907624df3256d04b9aa2df50d7aa97ec648748"
+ integrity sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==
+ dependencies:
+ "@humanwhocodes/object-schema" "^2.0.3"
+ debug "^4.3.1"
+ minimatch "^3.0.5"
+
+"@humanwhocodes/module-importer@^1.0.1":
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c"
+ integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==
+
+"@humanwhocodes/object-schema@^2.0.3":
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz#4a2868d75d6d6963e423bcf90b7fd1be343409d3"
+ integrity sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==
+
+"@jridgewell/gen-mapping@^0.3.5":
+ version "0.3.5"
+ resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz#dcce6aff74bdf6dad1a95802b69b04a2fcb1fb36"
+ integrity sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==
+ dependencies:
+ "@jridgewell/set-array" "^1.2.1"
+ "@jridgewell/sourcemap-codec" "^1.4.10"
+ "@jridgewell/trace-mapping" "^0.3.24"
+
+"@jridgewell/resolve-uri@^3.0.3", "@jridgewell/resolve-uri@^3.1.0":
+ version "3.1.2"
+ resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6"
+ integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==
+
+"@jridgewell/set-array@^1.2.1":
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.2.1.tgz#558fb6472ed16a4c850b889530e6b36438c49280"
+ integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==
+
+"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14":
+ version "1.5.0"
+ resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a"
+ integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==
+
+"@jridgewell/trace-mapping@0.3.9":
+ version "0.3.9"
+ resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9"
+ integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==
+ dependencies:
+ "@jridgewell/resolve-uri" "^3.0.3"
+ "@jridgewell/sourcemap-codec" "^1.4.10"
+
+"@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25":
+ version "0.3.25"
+ resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz"
+ integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==
+ dependencies:
+ "@jridgewell/resolve-uri" "^3.1.0"
+ "@jridgewell/sourcemap-codec" "^1.4.14"
+
+"@layerzerolabs/devtools-evm-hardhat@~1.2.0":
+ version "1.2.3"
+ resolved "https://registry.yarnpkg.com/@layerzerolabs/devtools-evm-hardhat/-/devtools-evm-hardhat-1.2.3.tgz#70915a337d784f01e599b7a2f53f47a9dc07cb94"
+ integrity sha512-kIVMvLb1BZ+7rcPjjfl3iDnrszLfH+RnD9H4PWsbazqEOWizNQnO0+u9Aj9/KMTyly6hl5e5gZINZoTwkrPi+w==
+ dependencies:
+ "@layerzerolabs/export-deployments" "~0.0.12"
+ "@safe-global/protocol-kit" "^1.3.0"
+ micro-memoize "~4.1.2"
+ p-memoize "~4.0.4"
+ zod "^3.22.4"
+
+"@layerzerolabs/devtools-evm@~0.4.2":
+ version "0.4.2"
+ resolved "https://registry.yarnpkg.com/@layerzerolabs/devtools-evm/-/devtools-evm-0.4.2.tgz#929caea2abae7dae7236bccc240c39a6da5481a5"
+ integrity sha512-/X9Bsvbi9SyaPeL7dkXClnKwsE1roU+OCtOo1Sg/dtM3+xQOa1MBGycAYjuLPg8yV1mgxL7yYKniAsGnsZ7IeQ==
+ dependencies:
+ "@safe-global/api-kit" "^1.3.0"
+ "@safe-global/protocol-kit" "^1.3.0"
+ ethers "^5.7.2"
+ p-memoize "~4.0.4"
+
+"@layerzerolabs/devtools@~0.3.25":
+ version "0.3.28"
+ resolved "https://registry.yarnpkg.com/@layerzerolabs/devtools/-/devtools-0.3.28.tgz#4e03eb275ec14117a888e885bd05644696f5f2ec"
+ integrity sha512-3Sfy93Tphrs3Jm5igxyo0cn6oMbIX4ry2jAe5gzKNdsqwtglSQzKFBhvgeurOpeSW4QVUNR+SFhM29Mr2dR1ag==
+ dependencies:
+ bs58 "^6.0.0"
+ exponential-backoff "~3.1.1"
+ js-yaml "~4.1.0"
+
+"@layerzerolabs/eslint-config-next@~2.3.39":
+ version "2.3.44"
+ resolved "https://registry.yarnpkg.com/@layerzerolabs/eslint-config-next/-/eslint-config-next-2.3.44.tgz#2cf232171dd09dccf757e3173421afc392a9997c"
+ integrity sha512-WlBSy47LGPILdrNgzPiRtQf/hAY62IN37ncUsQwcr8T7cyX1HZREx2qljuXpvduLDAKn5otsm0XIqHuCRUHEFg==
+ dependencies:
+ "@typescript-eslint/eslint-plugin" "^7.5.0"
+ "@typescript-eslint/parser" "^7.5.0"
+ eslint "^8.55.0"
+ eslint-config-prettier "^9.1.0"
+ eslint-import-resolver-typescript "^3.6.1"
+ eslint-plugin-autofix "^2.0.0"
+ eslint-plugin-compat "^4.2.0"
+ eslint-plugin-import "^2.29.0"
+ eslint-plugin-prettier "^5.0.1"
+ eslint-plugin-unused-imports "^3.2.0"
+ prettier "^3.2.4"
+
+"@layerzerolabs/evm-sdks-core@^2.3.44":
+ version "2.3.44"
+ resolved "https://registry.yarnpkg.com/@layerzerolabs/evm-sdks-core/-/evm-sdks-core-2.3.44.tgz#6dac1e691c97348bf546a8a392f7be6f6e92aa60"
+ integrity sha512-T0XDKtoox8qDrlzo6H+fpFRNj2wlh8uKH5QN4RvwK1DShkL+3fmnA52LWPfI6jX17ONN9M8lrjYhIfo1mQKy1w==
+ dependencies:
+ ethers "^5.7.2"
+
+"@layerzerolabs/export-deployments@~0.0.12":
+ version "0.0.12"
+ resolved "https://registry.yarnpkg.com/@layerzerolabs/export-deployments/-/export-deployments-0.0.12.tgz#31b951b6f8209359c437292ef3fcc8144f89ca59"
+ integrity sha512-W4lwpUP2uY0W1+dleAKulzuwXXM7qt2g2IQuohWbn+QBu0OeVMJ8BFnXvcV2DBxYPXyaolHbaGAA/NFF70ngYQ==
+ dependencies:
+ typescript "^5.4.4"
+
+"@layerzerolabs/io-devtools@~0.1.12":
+ version "0.1.13"
+ resolved "https://registry.yarnpkg.com/@layerzerolabs/io-devtools/-/io-devtools-0.1.13.tgz#04e8c478db63e463d7e20f836228aa2c80c0a2b2"
+ integrity sha512-TbamgFnrV+79O4siwsH+zS8SBwL69lrAwFSf056HmI/hPrWVwYMK+uzVu92PI2mMfXuImMPfuU19TsC2mVv7dg==
+ dependencies:
+ chalk "^4.1.2"
+ logform "^2.6.0"
+ prompts "^2.4.2"
+ table "~6.8.2"
+ winston "^3.11.0"
+
+"@layerzerolabs/lz-definitions@^2.3.39":
+ version "2.3.44"
+ resolved "https://registry.yarnpkg.com/@layerzerolabs/lz-definitions/-/lz-definitions-2.3.44.tgz#7500995b86a1022e7f57d76e75fff4a16c19327d"
+ integrity sha512-8dH7rbHCVG+GDOizCb4RrtHEFHr5wud9Lf9Kxs/MLThgu7VWcXvy78KYHMQ4S7AXoFnyzMPaiEU/LS8kRWfhag==
+ dependencies:
+ tiny-invariant "^1.3.1"
+
+"@layerzerolabs/lz-evm-messagelib-v2@^2.3.39":
+ version "2.3.44"
+ resolved "https://registry.yarnpkg.com/@layerzerolabs/lz-evm-messagelib-v2/-/lz-evm-messagelib-v2-2.3.44.tgz#3684bf9de5cf19e417626970ca09528496d70fc1"
+ integrity sha512-2HZMjV0KZH0e3W2KL/H8HvE3I7QMJw1no46IQ5LpGSvxIm5Ri45tnQAynbmEbRyKXrRSP3Brkvkc2U7VrfZ/Cg==
+
+"@layerzerolabs/lz-evm-protocol-v2@^2.3.39":
+ version "2.3.44"
+ resolved "https://registry.yarnpkg.com/@layerzerolabs/lz-evm-protocol-v2/-/lz-evm-protocol-v2-2.3.44.tgz#63c967dcb6aeaa4275fa51c6976b27133f9c16ff"
+ integrity sha512-oNtwl4HGCogFVOr45T3FfrkB0/CRW2eGAEScBw/FY/6mlncnS4dqlvrCJ3SFlK17cu1w9q0ztD3NzS9sUrb7vw==
+
+"@layerzerolabs/lz-evm-sdk-v1@^2.3.39":
+ version "2.3.44"
+ resolved "https://registry.yarnpkg.com/@layerzerolabs/lz-evm-sdk-v1/-/lz-evm-sdk-v1-2.3.44.tgz#bd7e42df1289b3a50b1f3b0857455ba26e825eb2"
+ integrity sha512-jHnFqSqRQGD11TuPcpwCSY87FfVqGTdZj/1xFUTdW7r/zyZYTTr2pE/wZG5qWNZrO5VkPqgp2ttaZC6UM87+0w==
+ dependencies:
+ "@ethersproject/abi" "^5.7.0"
+ "@ethersproject/providers" "^5.7.0"
+ "@layerzerolabs/evm-sdks-core" "^2.3.44"
+ ethers "^5.7.2"
+
+"@layerzerolabs/lz-evm-sdk-v2@^2.3.39":
+ version "2.3.44"
+ resolved "https://registry.yarnpkg.com/@layerzerolabs/lz-evm-sdk-v2/-/lz-evm-sdk-v2-2.3.44.tgz#ad4bf9a077fb5f157ec93015c7f5e8d4587c083e"
+ integrity sha512-j99rAzalyaYx3sDn06Dfc7bLsQfLCRbx3qhgIhBxOfe9T9bYKRXV6UAD+dHFpwdFOU0UxioQKosKCGgIwSNKAw==
+ dependencies:
+ "@layerzerolabs/evm-sdks-core" "^2.3.44"
+ ethers "^5.7.2"
+
+"@layerzerolabs/lz-evm-v1-0.7@^2.3.39":
+ version "2.3.44"
+ resolved "https://registry.yarnpkg.com/@layerzerolabs/lz-evm-v1-0.7/-/lz-evm-v1-0.7-2.3.44.tgz#79536a0a18bd92bd31a75c9b8d6b01d5a3566ce9"
+ integrity sha512-gxPUv5yk5TLy4Rp4KwFqiPHGpVOPMtnwUi+LvRysnGgkqopOJRCzzvWqEv6M2YMUAsof+Vmr3UYWxKcilvv97g==
+
+"@layerzerolabs/lz-v2-utilities@^2.3.39":
+ version "2.3.44"
+ resolved "https://registry.yarnpkg.com/@layerzerolabs/lz-v2-utilities/-/lz-v2-utilities-2.3.44.tgz#d1937c68060147e3856ea7368cba72c7cff88ad8"
+ integrity sha512-0p7tdJCf6BSmN38tAnO7WyOoC84NDTCQt1MqPBomXTyIux1RLpkS82jcxv92+E+1LNulhHIx5W62gaKKx27B2A==
+ dependencies:
+ "@ethersproject/abi" "^5.7.0"
+ "@ethersproject/address" "^5.7.0"
+ "@ethersproject/bignumber" "^5.7.0"
+ "@ethersproject/bytes" "^5.7.0"
+ "@ethersproject/keccak256" "^5.7.0"
+ "@ethersproject/solidity" "^5.7.0"
+ bs58 "^5.0.0"
+ tiny-invariant "^1.3.1"
+
+"@layerzerolabs/oapp-evm@^0.0.4":
+ version "0.0.4"
+ resolved "https://registry.yarnpkg.com/@layerzerolabs/oapp-evm/-/oapp-evm-0.0.4.tgz#af86216842c7da5a270eeff04a6b16320f113f7b"
+ integrity sha512-h0papPd9mQAPsWoQuzZk3dIcLWLrJ8tnDNPg7Hn8aa+v7HPY1lo6Zmyn3t7RmzfKnvrjnjKWDTbX2zgesu4hYg==
+ dependencies:
+ ethers "^5.7.2"
+
+"@layerzerolabs/oft-evm@^0.1.0":
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/@layerzerolabs/oft-evm/-/oft-evm-0.1.0.tgz#3c47dd99674c568bd1e34b73e5a05c3e09966fc1"
+ integrity sha512-8LiotgJjbQN+wexOtpUPh2vgYDgec2ac0ypKKbBIE2kt1DWAxvKxI8nGuE6RRjBnvvMS3qNGmJQFxzwcOKHq+g==
+
+"@layerzerolabs/prettier-config-next@^2.3.39":
+ version "2.3.44"
+ resolved "https://registry.yarnpkg.com/@layerzerolabs/prettier-config-next/-/prettier-config-next-2.3.44.tgz#d508a4e25d42265728d4dca0aefa9c6dc01c8169"
+ integrity sha512-mIsxKLaelXHXXXvMEAE6Jc8IVydra0PesHquHYwvxFKwDhMhzfrnoRLLzbgCX/Zi1q0GGET/oMAKJTs6OWFPxQ==
+ dependencies:
+ prettier "^3.2.4"
+ prettier-plugin-packagejson "^2.4.7"
+ prettier-plugin-solidity "^1.2.0"
+
+"@layerzerolabs/protocol-devtools-evm@~1.2.1":
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/@layerzerolabs/protocol-devtools-evm/-/protocol-devtools-evm-1.2.1.tgz#671ed4038cbea4f2ceaef0353ad7d783b3c398dc"
+ integrity sha512-VyjpO4LJ+eiszxImXWst6lfJQNm0dv7XAf8m7vI6ZJk8Tg48QswBYoNZwlDDLBvMWv3vz+uf5HHn1AspVModyA==
+ dependencies:
+ p-memoize "~4.0.4"
+
+"@layerzerolabs/protocol-devtools@~0.4.3":
+ version "0.4.3"
+ resolved "https://registry.yarnpkg.com/@layerzerolabs/protocol-devtools/-/protocol-devtools-0.4.3.tgz#578912ce63127adadd0c24286f478c0998c84e3e"
+ integrity sha512-72qMcXw99wpe3v6qyh6ynFW66U6rnYuAzKXKz6R7q5JdYI/sAbnVNxuANq7ON0hffs3d24ea6qX4f6T+Lo6zJQ==
+
+"@layerzerolabs/solhint-config@^2.3.39":
+ version "2.3.44"
+ resolved "https://registry.yarnpkg.com/@layerzerolabs/solhint-config/-/solhint-config-2.3.44.tgz#4befb663fd78c2377162c00ed9eed6e901482352"
+ integrity sha512-1FnAwiV6FNH2KAcVWd36u7xthcs4+HI6BvU8BLp8boxEppYylxm1KFCcWSyHij9Ct5bUScKTPI6jwks/FzTU3A==
+ dependencies:
+ solhint "^4.0.0"
+
+"@layerzerolabs/test-devtools-evm-foundry@~1.0.0":
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/@layerzerolabs/test-devtools-evm-foundry/-/test-devtools-evm-foundry-1.0.0.tgz#6e34e4c188c849ce7a8296dc2bccaece82798444"
+ integrity sha512-7TwAz1G7lGf7NXHzg9rVJgRkXd5MIvBdBv55LnFnlC6JrMpZPXVK8L8C70/apuEtba1RE2nUbMLOzS5vrOLudA==
+
+"@layerzerolabs/test-devtools-evm-hardhat@~0.3.0":
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/@layerzerolabs/test-devtools-evm-hardhat/-/test-devtools-evm-hardhat-0.3.0.tgz#f9666dca38145b198b3d83be5a5f179fb722822d"
+ integrity sha512-776SF+Rp6+8PPMjl5WYglgfas6IyqZ2g7dU73seQC9VaPfbM+6XORtOCLVUxl6Hrp43edAI0dZuIm6xWhVFiYQ==
+
+"@layerzerolabs/toolbox-foundry@~0.1.9":
+ version "0.1.9"
+ resolved "https://registry.yarnpkg.com/@layerzerolabs/toolbox-foundry/-/toolbox-foundry-0.1.9.tgz#8ddf9cf39db272fe096050160e30d7318b418d26"
+ integrity sha512-OVOT7Nt3uaX3VaqA3zqKP+ZIfsSo2X7c3jbrBb0I0ewsxNung+pYrYtCUhSoLLHQ1eOteh08C8Pq8A/Tbud/tg==
+
+"@layerzerolabs/toolbox-hardhat@~0.4.0":
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/@layerzerolabs/toolbox-hardhat/-/toolbox-hardhat-0.4.0.tgz#6f137478ed5ac5080fd33771cf6e2cb254c71863"
+ integrity sha512-WTc22nlEX4HwBUSvsVA/RzkZKp4wkY0f9k8m/NKXY7BrikdpilkWXJ+jgE1hG7tPY55bKd6CNHm41P5bTqIh4w==
+ dependencies:
+ "@ethersproject/abi" "^5.7.0"
+ "@ethersproject/address" "~5.7.0"
+ "@ethersproject/bytes" "^5.7.0"
+ "@ethersproject/contracts" "^5.7.0"
+ "@ethersproject/hash" "^5.7.0"
+ "@layerzerolabs/devtools" "~0.3.25"
+ "@layerzerolabs/devtools-evm" "~0.4.2"
+ "@layerzerolabs/devtools-evm-hardhat" "~1.2.0"
+ "@layerzerolabs/io-devtools" "~0.1.12"
+ "@layerzerolabs/lz-definitions" "^2.3.39"
+ "@layerzerolabs/lz-evm-sdk-v1" "^2.3.39"
+ "@layerzerolabs/lz-evm-sdk-v2" "^2.3.39"
+ "@layerzerolabs/lz-v2-utilities" "^2.3.39"
+ "@layerzerolabs/protocol-devtools" "~0.4.3"
+ "@layerzerolabs/protocol-devtools-evm" "~1.2.1"
+ "@layerzerolabs/test-devtools-evm-hardhat" "~0.3.0"
+ "@layerzerolabs/ua-devtools" "~1.0.5"
+ "@layerzerolabs/ua-devtools-evm" "~3.0.1"
+ "@layerzerolabs/ua-devtools-evm-hardhat" "~4.0.0"
+ fp-ts "^2.16.2"
+ ink "^3.2.0"
+ ink-gradient "^2.0.0"
+ ink-table "^3.1.0"
+ react "^17.0.2"
+ yoga-layout-prebuilt "^1.10.0"
+ zod "^3.22.4"
+
+"@layerzerolabs/ua-devtools-evm-hardhat@~4.0.0":
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/@layerzerolabs/ua-devtools-evm-hardhat/-/ua-devtools-evm-hardhat-4.0.1.tgz#2c939cb95025c5fd5134a6d87d276d2d545291c3"
+ integrity sha512-j1K/e8LYfhNSuxYxcLKul9cHVDuBBwAeob85mj0Yfro+hLYQVlSOY/iTuubLpn51ynw60lGJQxewVzIW7U6DWg==
+ dependencies:
+ p-memoize "~4.0.4"
+ typescript "^5.4.4"
+
+"@layerzerolabs/ua-devtools-evm@~3.0.1":
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/@layerzerolabs/ua-devtools-evm/-/ua-devtools-evm-3.0.1.tgz#7758a23aa16e2e0977375591cc95599fe721aa94"
+ integrity sha512-r/Voc1vmB9OEXc18sA/7prQdmZOqO7eR2/8CeiH7T3yCSA2vjjgByn2wxbmYy828gIw8wcx7GEky5F4gpvRnow==
+ dependencies:
+ p-memoize "~4.0.4"
+
+"@layerzerolabs/ua-devtools@~1.0.5":
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/@layerzerolabs/ua-devtools/-/ua-devtools-1.0.5.tgz#c600d6ecee33903e5f3a7aa7b2f1d73a783630e9"
+ integrity sha512-RQ8GnAH3OEQeocgZSEGBO36guQirDLs+89NidH6vVebMTcjPQ5oVAJDem3Y+AQvX7avd+ijW0IPZ2fZ2SBA3fA==
+
+"@layerzerolabs/verify-contract@^1.1.31":
+ version "1.1.31"
+ resolved "https://registry.yarnpkg.com/@layerzerolabs/verify-contract/-/verify-contract-1.1.31.tgz#22732070459c268b917e4a5cdbcdde770cc1602f"
+ integrity sha512-gY6VLgGC7Li9nv9XxTlSNIvE/aye/fymYL3d2r934Nd8HBax8lbX+24TBfeKugFdgy7uA5kQxjxg0Ia2DD2+vQ==
+
+"@mdn/browser-compat-data@^5.2.34", "@mdn/browser-compat-data@^5.3.13":
+ version "5.6.9"
+ resolved "https://registry.yarnpkg.com/@mdn/browser-compat-data/-/browser-compat-data-5.6.9.tgz#93392e2cbe56886d5953b615b9b38518ad54b40d"
+ integrity sha512-xbpYnhcx48qe1p8qimSCUu79QPhK6STaj5mUJ7A0VRCxgfZ5boJ4L/Vy9e5lOPquPSQ1tWZ6mOO+01VzLJg2iA==
+
+"@metamask/eth-sig-util@^4.0.0":
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/@metamask/eth-sig-util/-/eth-sig-util-4.0.1.tgz#3ad61f6ea9ad73ba5b19db780d40d9aae5157088"
+ integrity sha512-tghyZKLHZjcdlDqCA3gNZmLeR0XvOE9U1qoQO9ohyAZT6Pya+H9vkBPcsyXytmYLNgVoin7CKCmweo/R43V+tQ==
+ dependencies:
+ ethereumjs-abi "^0.6.8"
+ ethereumjs-util "^6.2.1"
+ ethjs-util "^0.1.6"
+ tweetnacl "^1.0.3"
+ tweetnacl-util "^0.15.1"
+
+"@noble/curves@1.4.2", "@noble/curves@~1.4.0":
+ version "1.4.2"
+ resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.4.2.tgz#40309198c76ed71bc6dbf7ba24e81ceb4d0d1fe9"
+ integrity sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw==
+ dependencies:
+ "@noble/hashes" "1.4.0"
+
+"@noble/hashes@1.2.0", "@noble/hashes@~1.2.0":
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.2.0.tgz#a3150eeb09cc7ab207ebf6d7b9ad311a9bdbed12"
+ integrity sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ==
+
+"@noble/hashes@1.4.0", "@noble/hashes@~1.4.0":
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.4.0.tgz#45814aa329f30e4fe0ba49426f49dfccdd066426"
+ integrity sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==
+
+"@noble/hashes@^1.4.0":
+ version "1.5.0"
+ resolved "https://registry.npmjs.org/@noble/hashes/-/hashes-1.5.0.tgz"
+ integrity sha512-1j6kQFb7QRru7eKN3ZDvRcP13rugwdxZqCjbiAVZfIJwgj2A65UmT4TgARXGlXgnRkORLTDTrO19ZErt7+QXgA==
+
+"@noble/secp256k1@1.7.1", "@noble/secp256k1@~1.7.0":
+ version "1.7.1"
+ resolved "https://registry.yarnpkg.com/@noble/secp256k1/-/secp256k1-1.7.1.tgz#b251c70f824ce3ca7f8dc3df08d58f005cc0507c"
+ integrity sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw==
+
+"@nodelib/fs.scandir@2.1.5":
+ version "2.1.5"
+ resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5"
+ integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==
+ dependencies:
+ "@nodelib/fs.stat" "2.0.5"
+ run-parallel "^1.1.9"
+
+"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2":
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b"
+ integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==
+
+"@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8":
+ version "1.2.8"
+ resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a"
+ integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==
+ dependencies:
+ "@nodelib/fs.scandir" "2.1.5"
+ fastq "^1.6.0"
+
+"@nolyfill/is-core-module@1.0.39":
+ version "1.0.39"
+ resolved "https://registry.yarnpkg.com/@nolyfill/is-core-module/-/is-core-module-1.0.39.tgz#3dc35ba0f1e66b403c00b39344f870298ebb1c8e"
+ integrity sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==
+
+"@nomicfoundation/edr-darwin-arm64@0.6.4":
+ version "0.6.4"
+ resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-darwin-arm64/-/edr-darwin-arm64-0.6.4.tgz#6eaa64a6ea5201e4c92b121f2b7fd197b26e450a"
+ integrity sha512-QNQErISLgssV9+qia8sIjRANqtbW8snSDvjspixT/kSQ5ZSGxxctTg7x72wPSrcu8+EBEveIe5uqENIp5GH8HQ==
+
+"@nomicfoundation/edr-darwin-x64@0.6.4":
+ version "0.6.4"
+ resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-darwin-x64/-/edr-darwin-x64-0.6.4.tgz#d15ca89e9deef7d0a710cf90e79f3cc270a5a999"
+ integrity sha512-cjVmREiwByyc9+oGfvAh49IAw+oVJHF9WWYRD+Tm/ZlSpnEVWxrGNBak2bd/JSYjn+mZE7gmWS4SMRi4nKaLUg==
+
+"@nomicfoundation/edr-linux-arm64-gnu@0.6.4":
+ version "0.6.4"
+ resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-linux-arm64-gnu/-/edr-linux-arm64-gnu-0.6.4.tgz#e73c41ca015dfddb5f4cb6cd3d9b2cbe5cc28989"
+ integrity sha512-96o9kRIVD6W5VkgKvUOGpWyUGInVQ5BRlME2Fa36YoNsRQMaKtmYJEU0ACosYES6ZTpYC8U5sjMulvPtVoEfOA==
+
+"@nomicfoundation/edr-linux-arm64-musl@0.6.4":
+ version "0.6.4"
+ resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-linux-arm64-musl/-/edr-linux-arm64-musl-0.6.4.tgz#90906f733e4ad26657baeb22d28855d934ab7541"
+ integrity sha512-+JVEW9e5plHrUfQlSgkEj/UONrIU6rADTEk+Yp9pbe+mzNkJdfJYhs5JYiLQRP4OjxH4QOrXI97bKU6FcEbt5Q==
+
+"@nomicfoundation/edr-linux-x64-gnu@0.6.4":
+ version "0.6.4"
+ resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-linux-x64-gnu/-/edr-linux-x64-gnu-0.6.4.tgz#11b8bd73df145a192e5a08199e5e81995fcde502"
+ integrity sha512-nzYWW+fO3EZItOeP4CrdMgDXfaGBIBkKg0Y/7ySpUxLqzut40O4Mb0/+quqLAFkacUSWMlFp8nsmypJfOH5zoA==
+
+"@nomicfoundation/edr-linux-x64-musl@0.6.4":
+ version "0.6.4"
+ resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-linux-x64-musl/-/edr-linux-x64-musl-0.6.4.tgz#a34b9a2c9e34853207824dc81622668a069ca642"
+ integrity sha512-QFRoE9qSQ2boRrVeQ1HdzU+XN7NUgwZ1SIy5DQt4d7jCP+5qTNsq8LBNcqhRBOATgO63nsweNUhxX/Suj5r1Sw==
+
+"@nomicfoundation/edr-win32-x64-msvc@0.6.4":
+ version "0.6.4"
+ resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-win32-x64-msvc/-/edr-win32-x64-msvc-0.6.4.tgz#ca035c6f66ae9f88fa3ef123a1f3a2099cce7a5a"
+ integrity sha512-2yopjelNkkCvIjUgBGhrn153IBPLwnsDeNiq6oA0WkeM8tGmQi4td+PGi9jAriUDAkc59Yoi2q9hYA6efiY7Zw==
+
+"@nomicfoundation/edr@^0.6.3":
+ version "0.6.4"
+ resolved "https://registry.yarnpkg.com/@nomicfoundation/edr/-/edr-0.6.4.tgz#1cd336c46a60f5af774e6cf0f1943f49f63dded6"
+ integrity sha512-YgrSuT3yo5ZQkbvBGqQ7hG+RDvz3YygSkddg4tb1Z0Y6pLXFzwrcEwWaJCFAVeeZxdxGfCgGMUYgRVneK+WXkw==
+ dependencies:
+ "@nomicfoundation/edr-darwin-arm64" "0.6.4"
+ "@nomicfoundation/edr-darwin-x64" "0.6.4"
+ "@nomicfoundation/edr-linux-arm64-gnu" "0.6.4"
+ "@nomicfoundation/edr-linux-arm64-musl" "0.6.4"
+ "@nomicfoundation/edr-linux-x64-gnu" "0.6.4"
+ "@nomicfoundation/edr-linux-x64-musl" "0.6.4"
+ "@nomicfoundation/edr-win32-x64-msvc" "0.6.4"
+
+"@nomicfoundation/ethereumjs-common@4.0.4":
+ version "4.0.4"
+ resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-common/-/ethereumjs-common-4.0.4.tgz#9901f513af2d4802da87c66d6f255b510bef5acb"
+ integrity sha512-9Rgb658lcWsjiicr5GzNCjI1llow/7r0k50dLL95OJ+6iZJcVbi15r3Y0xh2cIO+zgX0WIHcbzIu6FeQf9KPrg==
+ dependencies:
+ "@nomicfoundation/ethereumjs-util" "9.0.4"
+
+"@nomicfoundation/ethereumjs-rlp@5.0.4":
+ version "5.0.4"
+ resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-rlp/-/ethereumjs-rlp-5.0.4.tgz#66c95256fc3c909f6fb18f6a586475fc9762fa30"
+ integrity sha512-8H1S3s8F6QueOc/X92SdrA4RDenpiAEqMg5vJH99kcQaCy/a3Q6fgseo75mgWlbanGJXSlAPtnCeG9jvfTYXlw==
+
+"@nomicfoundation/ethereumjs-tx@5.0.4":
+ version "5.0.4"
+ resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-tx/-/ethereumjs-tx-5.0.4.tgz#b0ceb58c98cc34367d40a30d255d6315b2f456da"
+ integrity sha512-Xjv8wAKJGMrP1f0n2PeyfFCCojHd7iS3s/Ab7qzF1S64kxZ8Z22LCMynArYsVqiFx6rzYy548HNVEyI+AYN/kw==
+ dependencies:
+ "@nomicfoundation/ethereumjs-common" "4.0.4"
+ "@nomicfoundation/ethereumjs-rlp" "5.0.4"
+ "@nomicfoundation/ethereumjs-util" "9.0.4"
+ ethereum-cryptography "0.1.3"
+
+"@nomicfoundation/ethereumjs-util@9.0.4":
+ version "9.0.4"
+ resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-util/-/ethereumjs-util-9.0.4.tgz#84c5274e82018b154244c877b76bc049a4ed7b38"
+ integrity sha512-sLOzjnSrlx9Bb9EFNtHzK/FJFsfg2re6bsGqinFinH1gCqVfz9YYlXiMWwDM4C/L4ywuHFCYwfKTVr/QHQcU0Q==
+ dependencies:
+ "@nomicfoundation/ethereumjs-rlp" "5.0.4"
+ ethereum-cryptography "0.1.3"
+
+"@nomicfoundation/hardhat-chai-matchers@^2.0.0":
+ version "2.0.8"
+ resolved "https://registry.yarnpkg.com/@nomicfoundation/hardhat-chai-matchers/-/hardhat-chai-matchers-2.0.8.tgz#9c7cfc4ad0f0a5e9cf16aba8ab668c02f6e273aa"
+ integrity sha512-Z5PiCXH4xhNLASROlSUOADfhfpfhYO6D7Hn9xp8PddmHey0jq704cr6kfU8TRrQ4PUZbpfsZadPj+pCfZdjPIg==
+ dependencies:
+ "@types/chai-as-promised" "^7.1.3"
+ chai-as-promised "^7.1.1"
+ deep-eql "^4.0.1"
+ ordinal "^1.0.3"
+
+"@nomicfoundation/hardhat-ethers@^3.0.5":
+ version "3.0.8"
+ resolved "https://registry.yarnpkg.com/@nomicfoundation/hardhat-ethers/-/hardhat-ethers-3.0.8.tgz#af078f566373abeb77e11cbe69fe3dd47f8bfc27"
+ integrity sha512-zhOZ4hdRORls31DTOqg+GmEZM0ujly8GGIuRY7t7szEk2zW/arY1qDug/py8AEktT00v5K+b6RvbVog+va51IA==
+ dependencies:
+ debug "^4.1.1"
+ lodash.isequal "^4.5.0"
+
+"@nomicfoundation/hardhat-ignition-ethers@^0.15.5":
+ version "0.15.6"
+ resolved "https://registry.npmjs.org/@nomicfoundation/hardhat-ignition-ethers/-/hardhat-ignition-ethers-0.15.6.tgz"
+ integrity sha512-+jXDGWdfkuIGm0W+aFEZ9SLQz2MIj7Cf4j7ANTXUIIbK8sUkvnVOhTTAQEdqa0KgGEb45XS88BPg0w8fixwrXQ==
+
+"@nomicfoundation/hardhat-ignition@^0.15.5":
+ version "0.15.6"
+ resolved "https://registry.npmjs.org/@nomicfoundation/hardhat-ignition/-/hardhat-ignition-0.15.6.tgz"
+ integrity sha512-PcMf4xlYvwHYej2jcuOd/rBNNMM5FO11vh9c+MF8+m7NxV4b6NOameL3uscoD7ghg0H2GNgnGXgQ67ryRqtdIQ==
+ dependencies:
+ "@nomicfoundation/ignition-core" "^0.15.6"
+ "@nomicfoundation/ignition-ui" "^0.15.6"
+ chalk "^4.0.0"
+ debug "^4.3.2"
+ fs-extra "^10.0.0"
+ json5 "^2.2.3"
+ prompts "^2.4.2"
+
+"@nomicfoundation/hardhat-network-helpers@^1.0.0":
+ version "1.0.12"
+ resolved "https://registry.yarnpkg.com/@nomicfoundation/hardhat-network-helpers/-/hardhat-network-helpers-1.0.12.tgz#2c0abec0c50b75f9d0d71776e49e3b5ef746d289"
+ integrity sha512-xTNQNI/9xkHvjmCJnJOTyqDSl8uq1rKb2WOVmixQxFtRd7Oa3ecO8zM0cyC2YmOK+jHB9WPZ+F/ijkHg1CoORA==
+ dependencies:
+ ethereumjs-util "^7.1.4"
+
+"@nomicfoundation/hardhat-toolbox@^5.0.0":
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/@nomicfoundation/hardhat-toolbox/-/hardhat-toolbox-5.0.0.tgz#165b47f8a3d2bf668cc5d453ce7f496a1156948d"
+ integrity sha512-FnUtUC5PsakCbwiVNsqlXVIWG5JIb5CEZoSXbJUsEBun22Bivx2jhF1/q9iQbzuaGpJKFQyOhemPB2+XlEE6pQ==
+
+"@nomicfoundation/hardhat-verify@^2.0.0":
+ version "2.0.11"
+ resolved "https://registry.yarnpkg.com/@nomicfoundation/hardhat-verify/-/hardhat-verify-2.0.11.tgz#4ce12b592e01ee93a81933924609c233ed00d951"
+ integrity sha512-lGIo4dNjVQFdsiEgZp3KP6ntLiF7xJEJsbNHfSyIiFCyI0Yv0518ElsFtMC5uCuHEChiBBMrib9jWQvHHT+X3Q==
+ dependencies:
+ "@ethersproject/abi" "^5.1.2"
+ "@ethersproject/address" "^5.0.2"
+ cbor "^8.1.0"
+ chalk "^2.4.2"
+ debug "^4.1.1"
+ lodash.clonedeep "^4.5.0"
+ semver "^6.3.0"
+ table "^6.8.0"
+ undici "^5.14.0"
+
+"@nomicfoundation/ignition-core@^0.15.5", "@nomicfoundation/ignition-core@^0.15.6":
+ version "0.15.7"
+ resolved "https://registry.yarnpkg.com/@nomicfoundation/ignition-core/-/ignition-core-0.15.7.tgz#ce205990f347737537b6a6c744ff1a245a2a3dc7"
+ integrity sha512-C4/0V/q2gNxKDt88cMr+Oxlf4NINQ7QgmJyciQ1/6UdCRUg+/Pgdgpd3vgGXQVTotq50Q/BU4ofNUAD/8HRqtg==
+ dependencies:
+ "@ethersproject/address" "5.6.1"
+ "@nomicfoundation/solidity-analyzer" "^0.1.1"
+ cbor "^9.0.0"
+ debug "^4.3.2"
+ ethers "^6.7.0"
+ fs-extra "^10.0.0"
+ immer "10.0.2"
+ lodash "4.17.21"
+ ndjson "2.0.0"
+
+"@nomicfoundation/ignition-ui@^0.15.6":
+ version "0.15.7"
+ resolved "https://registry.yarnpkg.com/@nomicfoundation/ignition-ui/-/ignition-ui-0.15.7.tgz#586371dd25d10360337a7363683dfb229b8c8622"
+ integrity sha512-pj2LmXylgbHOTNrkFqFrre/FAOjcwYl4VKIKVH/QMMBH/DatbiT8aC5n9o2fbLD8uwlPEesD+uXZuKCE71KFBg==
+
+"@nomicfoundation/solidity-analyzer-darwin-arm64@0.1.2":
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-darwin-arm64/-/solidity-analyzer-darwin-arm64-0.1.2.tgz#3a9c3b20d51360b20affb8f753e756d553d49557"
+ integrity sha512-JaqcWPDZENCvm++lFFGjrDd8mxtf+CtLd2MiXvMNTBD33dContTZ9TWETwNFwg7JTJT5Q9HEecH7FA+HTSsIUw==
+
+"@nomicfoundation/solidity-analyzer-darwin-x64@0.1.2":
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-darwin-x64/-/solidity-analyzer-darwin-x64-0.1.2.tgz#74dcfabeb4ca373d95bd0d13692f44fcef133c28"
+ integrity sha512-fZNmVztrSXC03e9RONBT+CiksSeYcxI1wlzqyr0L7hsQlK1fzV+f04g2JtQ1c/Fe74ZwdV6aQBdd6Uwl1052sw==
+
+"@nomicfoundation/solidity-analyzer-linux-arm64-gnu@0.1.2":
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-arm64-gnu/-/solidity-analyzer-linux-arm64-gnu-0.1.2.tgz#4af5849a89e5a8f511acc04f28eb5d4460ba2b6a"
+ integrity sha512-3d54oc+9ZVBuB6nbp8wHylk4xh0N0Gc+bk+/uJae+rUgbOBwQSfuGIbAZt1wBXs5REkSmynEGcqx6DutoK0tPA==
+
+"@nomicfoundation/solidity-analyzer-linux-arm64-musl@0.1.2":
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-arm64-musl/-/solidity-analyzer-linux-arm64-musl-0.1.2.tgz#54036808a9a327b2ff84446c130a6687ee702a8e"
+ integrity sha512-iDJfR2qf55vgsg7BtJa7iPiFAsYf2d0Tv/0B+vhtnI16+wfQeTbP7teookbGvAo0eJo7aLLm0xfS/GTkvHIucA==
+
+"@nomicfoundation/solidity-analyzer-linux-x64-gnu@0.1.2":
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-x64-gnu/-/solidity-analyzer-linux-x64-gnu-0.1.2.tgz#466cda0d6e43691986c944b909fc6dbb8cfc594e"
+ integrity sha512-9dlHMAt5/2cpWyuJ9fQNOUXFB/vgSFORg1jpjX1Mh9hJ/MfZXlDdHQ+DpFCs32Zk5pxRBb07yGvSHk9/fezL+g==
+
+"@nomicfoundation/solidity-analyzer-linux-x64-musl@0.1.2":
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-x64-musl/-/solidity-analyzer-linux-x64-musl-0.1.2.tgz#2b35826987a6e94444140ac92310baa088ee7f94"
+ integrity sha512-GzzVeeJob3lfrSlDKQw2bRJ8rBf6mEYaWY+gW0JnTDHINA0s2gPR4km5RLIj1xeZZOYz4zRw+AEeYgLRqB2NXg==
+
+"@nomicfoundation/solidity-analyzer-win32-x64-msvc@0.1.2":
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-win32-x64-msvc/-/solidity-analyzer-win32-x64-msvc-0.1.2.tgz#e6363d13b8709ca66f330562337dbc01ce8bbbd9"
+ integrity sha512-Fdjli4DCcFHb4Zgsz0uEJXZ2K7VEO+w5KVv7HmT7WO10iODdU9csC2az4jrhEsRtiR9Gfd74FlG0NYlw1BMdyA==
+
+"@nomicfoundation/solidity-analyzer@^0.1.0", "@nomicfoundation/solidity-analyzer@^0.1.1":
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer/-/solidity-analyzer-0.1.2.tgz#8bcea7d300157bf3a770a851d9f5c5e2db34ac55"
+ integrity sha512-q4n32/FNKIhQ3zQGGw5CvPF6GTvDCpYwIf7bEY/dZTZbgfDsHyjJwURxUJf3VQuuJj+fDIFl4+KkBVbw4Ef6jA==
+ 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"
+
+"@nomiclabs/hardhat-ethers@^2.2.3":
+ version "2.2.3"
+ resolved "https://registry.yarnpkg.com/@nomiclabs/hardhat-ethers/-/hardhat-ethers-2.2.3.tgz#b41053e360c31a32c2640c9a45ee981a7e603fe0"
+ integrity sha512-YhzPdzb612X591FOe68q+qXVXGG2ANZRvDo0RRUtimev85rCrAlv/TLMEZw5c+kq9AbzocLTVX/h2jVIFPL9Xg==
+
+"@openzeppelin/contracts-upgradeable@^5.0.2":
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/@openzeppelin/contracts-upgradeable/-/contracts-upgradeable-5.1.0.tgz#4d37648b7402929c53e2ff6e45749ecff91eb2b6"
+ integrity sha512-AIElwP5Ck+cslNE+Hkemf5SxjJoF4wBvvjxc27Rp+9jaPs/CLIaUBMYe1FNzhdiN0cYuwGRmYaRHmmntuiju4Q==
+
+"@openzeppelin/contracts@^5.0.2":
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/@openzeppelin/contracts/-/contracts-5.1.0.tgz#4e61162f2a2bf414c4e10c45eca98ce5f1aadbd4"
+ integrity sha512-p1ULhl7BXzjjbha5aqst+QMLY+4/LCWADXOCsmLHRM77AqiPjnd9vvUN9sosUfhL9JGKpZ0TjEGxgvnizmWGSA==
+
+"@pkgr/core@^0.1.0":
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/@pkgr/core/-/core-0.1.1.tgz#1ec17e2edbec25c8306d424ecfbf13c7de1aaa31"
+ integrity sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==
+
+"@pnpm/config.env-replace@^1.1.0":
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/@pnpm/config.env-replace/-/config.env-replace-1.1.0.tgz#ab29da53df41e8948a00f2433f085f54de8b3a4c"
+ integrity sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==
+
+"@pnpm/network.ca-file@^1.0.1":
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/@pnpm/network.ca-file/-/network.ca-file-1.0.2.tgz#2ab05e09c1af0cdf2fcf5035bea1484e222f7983"
+ integrity sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==
+ dependencies:
+ graceful-fs "4.2.10"
+
+"@pnpm/npm-conf@^2.1.0":
+ version "2.3.1"
+ resolved "https://registry.yarnpkg.com/@pnpm/npm-conf/-/npm-conf-2.3.1.tgz#bb375a571a0bd63ab0a23bece33033c683e9b6b0"
+ integrity sha512-c83qWb22rNRuB0UaVCI0uRPNRr8Z0FWnEIvT47jiHAmOIUHbBOg5XvV7pM5x+rKn9HRpjxquDbXYSXr3fAKFcw==
+ dependencies:
+ "@pnpm/config.env-replace" "^1.1.0"
+ "@pnpm/network.ca-file" "^1.0.1"
+ config-chain "^1.1.11"
+
+"@rtsao/scc@^1.1.0":
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/@rtsao/scc/-/scc-1.1.0.tgz#927dd2fae9bc3361403ac2c7a00c32ddce9ad7e8"
+ integrity sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==
+
+"@rushstack/eslint-patch@^1.7.0":
+ version "1.10.4"
+ resolved "https://registry.yarnpkg.com/@rushstack/eslint-patch/-/eslint-patch-1.10.4.tgz#427d5549943a9c6fce808e39ea64dbe60d4047f1"
+ integrity sha512-WJgX9nzTqknM393q1QJDJmoW28kUfEnybeTfVNcNAPnIx210RXm2DiXiHzfNPJNIUUb1tJnz/l4QGtJ30PgWmA==
+
+"@safe-global/api-kit@^1.3.0":
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/@safe-global/api-kit/-/api-kit-1.3.1.tgz#108f5ba2f3770354abcec91225cc1ae21ee417a8"
+ integrity sha512-JKvCNs8p+42+N8pV2MIqoXlBLckTe5CKboVT7t9mTluuA66i5W8+Kr+B5j9D//EIU5vO7iSOOIYnJuA2ck4XRQ==
+ dependencies:
+ "@ethersproject/abstract-signer" "^5.7.0"
+ "@safe-global/safe-core-sdk-types" "^2.3.0"
+ node-fetch "^2.6.6"
+
+"@safe-global/protocol-kit@^1.3.0":
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/@safe-global/protocol-kit/-/protocol-kit-1.3.0.tgz#fb84a3797a4afc74ac7fc218e796037d6e3cc3cc"
+ integrity sha512-zBhwHpaUggywmnR1Xm5RV22DpyjmVWYP3pnOl4rcf9LAc1k7IVmw6WIt2YVhHRaWGxVYMd4RitJX8Dx2+8eLZQ==
+ dependencies:
+ "@ethersproject/address" "^5.7.0"
+ "@ethersproject/bignumber" "^5.7.0"
+ "@ethersproject/solidity" "^5.7.0"
+ "@safe-global/safe-deployments" "^1.26.0"
+ ethereumjs-util "^7.1.5"
+ semver "^7.5.4"
+ web3 "^1.8.1"
+ web3-core "^1.8.1"
+ web3-utils "^1.8.1"
+ zksync-web3 "^0.14.3"
+
+"@safe-global/safe-core-sdk-types@^2.3.0":
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/@safe-global/safe-core-sdk-types/-/safe-core-sdk-types-2.3.0.tgz#e3be109e58a2d224d1b89052563b04f3efed4bec"
+ integrity sha512-dU0KkDV1KJNf11ajbUjWiSi4ygdyWfhk1M50lTJWUdCn1/2Bsb/hICM8LoEk6DCoFumxaoCet02SmYakXsW2CA==
+ dependencies:
+ "@ethersproject/bignumber" "^5.7.0"
+ "@ethersproject/contracts" "^5.7.0"
+ "@safe-global/safe-deployments" "^1.26.0"
+ web3-core "^1.8.1"
+ web3-utils "^1.8.1"
+
+"@safe-global/safe-deployments@^1.26.0":
+ version "1.37.13"
+ resolved "https://registry.yarnpkg.com/@safe-global/safe-deployments/-/safe-deployments-1.37.13.tgz#9965d6c5669db526a472a0576828063aa50234df"
+ integrity sha512-DXDbyW+pSK5W+eyrT7I2VHgHjCUhiXgcmSjekCzwmzrRXB5sW36DLLDwfC5c1gvo26ix6NcIGRSk2sf68BHdeg==
+ dependencies:
+ semver "^7.6.2"
+
+"@scure/base@~1.1.0", "@scure/base@~1.1.6":
+ version "1.1.9"
+ resolved "https://registry.yarnpkg.com/@scure/base/-/base-1.1.9.tgz#e5e142fbbfe251091f9c5f1dd4c834ac04c3dbd1"
+ integrity sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg==
+
+"@scure/bip32@1.1.5":
+ version "1.1.5"
+ resolved "https://registry.yarnpkg.com/@scure/bip32/-/bip32-1.1.5.tgz#d2ccae16dcc2e75bc1d75f5ef3c66a338d1ba300"
+ integrity sha512-XyNh1rB0SkEqd3tXcXMi+Xe1fvg+kUIcoRIEujP1Jgv7DqW2r9lg3Ah0NkFaCs9sTkQAQA8kw7xiRXzENi9Rtw==
+ dependencies:
+ "@noble/hashes" "~1.2.0"
+ "@noble/secp256k1" "~1.7.0"
+ "@scure/base" "~1.1.0"
+
+"@scure/bip32@1.4.0":
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/@scure/bip32/-/bip32-1.4.0.tgz#4e1f1e196abedcef395b33b9674a042524e20d67"
+ integrity sha512-sVUpc0Vq3tXCkDGYVWGIZTRfnvu8LoTDaev7vbwh0omSvVORONr960MQWdKqJDCReIEmTj3PAr73O3aoxz7OPg==
+ dependencies:
+ "@noble/curves" "~1.4.0"
+ "@noble/hashes" "~1.4.0"
+ "@scure/base" "~1.1.6"
+
+"@scure/bip39@1.1.1":
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/@scure/bip39/-/bip39-1.1.1.tgz#b54557b2e86214319405db819c4b6a370cf340c5"
+ integrity sha512-t+wDck2rVkh65Hmv280fYdVdY25J9YeEUIgn2LG1WM6gxFkGzcksoDiUkWVpVp3Oex9xGC68JU2dSbUfwZ2jPg==
+ dependencies:
+ "@noble/hashes" "~1.2.0"
+ "@scure/base" "~1.1.0"
+
+"@scure/bip39@1.3.0":
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/@scure/bip39/-/bip39-1.3.0.tgz#0f258c16823ddd00739461ac31398b4e7d6a18c3"
+ integrity sha512-disdg7gHuTDZtY+ZdkmLpPCk7fxZSu3gBiEGuoC1XYxv9cGx3Z6cpTggCgW6odSOOIXCiDjuGejW+aJKCY/pIQ==
+ dependencies:
+ "@noble/hashes" "~1.4.0"
+ "@scure/base" "~1.1.6"
+
+"@sentry/core@5.30.0":
+ version "5.30.0"
+ resolved "https://registry.yarnpkg.com/@sentry/core/-/core-5.30.0.tgz#6b203664f69e75106ee8b5a2fe1d717379b331f3"
+ integrity sha512-TmfrII8w1PQZSZgPpUESqjB+jC6MvZJZdLtE/0hZ+SrnKhW3x5WlYLvTXZpcWePYBku7rl2wn1RZu6uT0qCTeg==
+ dependencies:
+ "@sentry/hub" "5.30.0"
+ "@sentry/minimal" "5.30.0"
+ "@sentry/types" "5.30.0"
+ "@sentry/utils" "5.30.0"
+ tslib "^1.9.3"
+
+"@sentry/hub@5.30.0":
+ version "5.30.0"
+ resolved "https://registry.yarnpkg.com/@sentry/hub/-/hub-5.30.0.tgz#2453be9b9cb903404366e198bd30c7ca74cdc100"
+ integrity sha512-2tYrGnzb1gKz2EkMDQcfLrDTvmGcQPuWxLnJKXJvYTQDGLlEvi2tWz1VIHjunmOvJrB5aIQLhm+dcMRwFZDCqQ==
+ dependencies:
+ "@sentry/types" "5.30.0"
+ "@sentry/utils" "5.30.0"
+ tslib "^1.9.3"
+
+"@sentry/minimal@5.30.0":
+ version "5.30.0"
+ resolved "https://registry.yarnpkg.com/@sentry/minimal/-/minimal-5.30.0.tgz#ce3d3a6a273428e0084adcb800bc12e72d34637b"
+ integrity sha512-BwWb/owZKtkDX+Sc4zCSTNcvZUq7YcH3uAVlmh/gtR9rmUvbzAA3ewLuB3myi4wWRAMEtny6+J/FN/x+2wn9Xw==
+ dependencies:
+ "@sentry/hub" "5.30.0"
+ "@sentry/types" "5.30.0"
+ tslib "^1.9.3"
+
+"@sentry/node@^5.18.1":
+ version "5.30.0"
+ resolved "https://registry.yarnpkg.com/@sentry/node/-/node-5.30.0.tgz#4ca479e799b1021285d7fe12ac0858951c11cd48"
+ integrity sha512-Br5oyVBF0fZo6ZS9bxbJZG4ApAjRqAnqFFurMVJJdunNb80brh7a5Qva2kjhm+U6r9NJAB5OmDyPkA1Qnt+QVg==
+ 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.1"
+ https-proxy-agent "^5.0.0"
+ lru_map "^0.3.3"
+ tslib "^1.9.3"
+
+"@sentry/tracing@5.30.0":
+ version "5.30.0"
+ resolved "https://registry.yarnpkg.com/@sentry/tracing/-/tracing-5.30.0.tgz#501d21f00c3f3be7f7635d8710da70d9419d4e1f"
+ integrity sha512-dUFowCr0AIMwiLD7Fs314Mdzcug+gBVo/+NCMyDw8tFxJkwWAKl7Qa2OZxLQ0ZHjakcj1hNKfCQJ9rhyfOl4Aw==
+ dependencies:
+ "@sentry/hub" "5.30.0"
+ "@sentry/minimal" "5.30.0"
+ "@sentry/types" "5.30.0"
+ "@sentry/utils" "5.30.0"
+ tslib "^1.9.3"
+
+"@sentry/types@5.30.0":
+ version "5.30.0"
+ resolved "https://registry.yarnpkg.com/@sentry/types/-/types-5.30.0.tgz#19709bbe12a1a0115bc790b8942917da5636f402"
+ integrity sha512-R8xOqlSTZ+htqrfteCWU5Nk0CDN5ApUTvrlvBuiH1DyP6czDZ4ktbZB0hAgBlVcK0U+qpD3ag3Tqqpa5Q67rPw==
+
+"@sentry/utils@5.30.0":
+ version "5.30.0"
+ resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-5.30.0.tgz#9a5bd7ccff85ccfe7856d493bffa64cabc41e980"
+ integrity sha512-zaYmoH0NWWtvnJjC9/CBseXMtKHm/tm40sz3YfJRxeQjyzRqNQPgivpd9R/oDJCYj999mzdW382p/qi2ypjLww==
+ dependencies:
+ "@sentry/types" "5.30.0"
+ tslib "^1.9.3"
+
+"@sindresorhus/is@^4.0.0", "@sindresorhus/is@^4.6.0":
+ version "4.6.0"
+ resolved "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz"
+ integrity sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==
+
+"@sindresorhus/is@^5.2.0":
+ version "5.6.0"
+ resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-5.6.0.tgz#41dd6093d34652cddb5d5bdeee04eafc33826668"
+ integrity sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==
+
+"@solidity-parser/parser@^0.18.0":
+ version "0.18.0"
+ resolved "https://registry.yarnpkg.com/@solidity-parser/parser/-/parser-0.18.0.tgz#8e77a02a09ecce957255a2f48c9a7178ec191908"
+ integrity sha512-yfORGUIPgLck41qyN7nbwJRAx17/jAIXCTanHOJZhB6PJ1iAk/84b/xlsVKFSyNyLXIj0dhppoE0+CRws7wlzA==
+
+"@szmarczak/http-timer@^4.0.5":
+ version "4.0.6"
+ resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-4.0.6.tgz#b4a914bb62e7c272d4e5989fe4440f812ab1d807"
+ integrity sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==
+ dependencies:
+ defer-to-connect "^2.0.0"
+
+"@szmarczak/http-timer@^5.0.1":
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-5.0.1.tgz#c7c1bf1141cdd4751b0399c8fc7b8b664cd5be3a"
+ integrity sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==
+ dependencies:
+ defer-to-connect "^2.0.1"
+
+"@tsconfig/node10@^1.0.7":
+ version "1.0.11"
+ resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.11.tgz#6ee46400685f130e278128c7b38b7e031ff5b2f2"
+ integrity sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==
+
+"@tsconfig/node12@^1.0.7":
+ version "1.0.11"
+ resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.11.tgz#ee3def1f27d9ed66dac6e46a295cffb0152e058d"
+ integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==
+
+"@tsconfig/node14@^1.0.0":
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.3.tgz#e4386316284f00b98435bf40f72f75a09dabf6c1"
+ integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==
+
+"@tsconfig/node16@^1.0.2":
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.4.tgz#0b92dcc0cc1c81f6f306a381f28e31b1a56536e9"
+ integrity sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==
+
+"@types/bn.js@^4.11.3":
+ version "4.11.6"
+ resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-4.11.6.tgz#c306c70d9358aaea33cd4eda092a742b9505967c"
+ integrity sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==
+ dependencies:
+ "@types/node" "*"
+
+"@types/bn.js@^5.1.0", "@types/bn.js@^5.1.1":
+ version "5.1.6"
+ resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-5.1.6.tgz#9ba818eec0c85e4d3c679518428afdf611d03203"
+ integrity sha512-Xh8vSwUeMKeYYrj3cX4lGQgFSF/N03r+tv4AiLl1SucqV+uTQpxRcnM8AkXKHwYP9ZPXOYXRr2KPXpVlIvqh9w==
+ dependencies:
+ "@types/node" "*"
+
+"@types/cacheable-request@^6.0.1", "@types/cacheable-request@^6.0.2":
+ version "6.0.3"
+ resolved "https://registry.yarnpkg.com/@types/cacheable-request/-/cacheable-request-6.0.3.tgz#a430b3260466ca7b5ca5bfd735693b36e7a9d183"
+ integrity sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==
+ dependencies:
+ "@types/http-cache-semantics" "*"
+ "@types/keyv" "^3.1.4"
+ "@types/node" "*"
+ "@types/responselike" "^1.0.0"
+
+"@types/chai-as-promised@^7.1.3":
+ version "7.1.8"
+ resolved "https://registry.yarnpkg.com/@types/chai-as-promised/-/chai-as-promised-7.1.8.tgz#f2b3d82d53c59626b5d6bbc087667ccb4b677fe9"
+ integrity sha512-ThlRVIJhr69FLlh6IctTXFkmhtP3NpMZ2QGq69StYLyKZFp/HOp1VdKZj7RvfNWYYcJ1xlbLGLLWj1UvP5u/Gw==
+ dependencies:
+ "@types/chai" "*"
+
+"@types/chai@*", "@types/chai@^4.3.11":
+ version "4.3.20"
+ resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.3.20.tgz#cb291577ed342ca92600430841a00329ba05cecc"
+ integrity sha512-/pC9HAB5I/xMlc5FP77qjCnI16ChlJfW0tGa0IUcFn38VJrTV6DeZ60NU5KZBtaOZqjdpwTWohz5HU1RrhiYxQ==
+
+"@types/http-cache-semantics@*", "@types/http-cache-semantics@^4.0.2":
+ version "4.0.4"
+ resolved "https://registry.yarnpkg.com/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz#b979ebad3919799c979b17c72621c0bc0a31c6c4"
+ integrity sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==
+
+"@types/json-schema@^7.0.9":
+ version "7.0.15"
+ resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841"
+ integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==
+
+"@types/json5@^0.0.29":
+ version "0.0.29"
+ resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee"
+ integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==
+
+"@types/keyv@^3.1.4":
+ version "3.1.4"
+ resolved "https://registry.yarnpkg.com/@types/keyv/-/keyv-3.1.4.tgz#3ccdb1c6751b0c7e52300bcdacd5bcbf8faa75b6"
+ integrity sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==
+ dependencies:
+ "@types/node" "*"
+
+"@types/lru-cache@^5.1.0":
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/@types/lru-cache/-/lru-cache-5.1.1.tgz#c48c2e27b65d2a153b19bfc1a317e30872e01eef"
+ integrity sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw==
+
+"@types/mocha@^10.0.6":
+ version "10.0.9"
+ resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-10.0.9.tgz#101e9da88d2c02e5ac8952982c23b224524d662a"
+ integrity sha512-sicdRoWtYevwxjOHNMPTl3vSfJM6oyW8o1wXeI7uww6b6xHg8eBznQDNSGBCDJmsE8UMxP05JgZRtsKbTqt//Q==
+
+"@types/node@*", "@types/node@~18.18.14":
+ version "18.18.14"
+ resolved "https://registry.npmjs.org/@types/node/-/node-18.18.14.tgz"
+ integrity sha512-iSOeNeXYNYNLLOMDSVPvIFojclvMZ/HDY2dU17kUlcsOsSQETbWIslJbYLZgA+ox8g2XQwSHKTkght1a5X26lQ==
+ dependencies:
+ undici-types "~5.26.4"
+
+"@types/node@^12.12.6":
+ version "12.20.55"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-12.20.55.tgz#c329cbd434c42164f846b909bd6f85b5537f6240"
+ integrity sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==
+
+"@types/pbkdf2@^3.0.0":
+ version "3.1.2"
+ resolved "https://registry.yarnpkg.com/@types/pbkdf2/-/pbkdf2-3.1.2.tgz#2dc43808e9985a2c69ff02e2d2027bd4fe33e8dc"
+ integrity sha512-uRwJqmiXmh9++aSu1VNEn3iIxWOhd8AHXNSdlaLfdAAdSTY9jYVeGWnzejM3dvrkbqE3/hyQkQQ29IFATEGlew==
+ dependencies:
+ "@types/node" "*"
+
+"@types/qs@^6.9.7":
+ version "6.9.16"
+ resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.16.tgz#52bba125a07c0482d26747d5d4947a64daf8f794"
+ integrity sha512-7i+zxXdPD0T4cKDuxCUXJ4wHcsJLwENa6Z3dCu8cfCK743OGy5Nu1RmAGqDPsoTDINVEcdXKRvR/zre+P2Ku1A==
+
+"@types/responselike@^1.0.0":
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/@types/responselike/-/responselike-1.0.3.tgz#cc29706f0a397cfe6df89debfe4bf5cea159db50"
+ integrity sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==
+ dependencies:
+ "@types/node" "*"
+
+"@types/secp256k1@^4.0.1":
+ version "4.0.6"
+ resolved "https://registry.yarnpkg.com/@types/secp256k1/-/secp256k1-4.0.6.tgz#d60ba2349a51c2cbc5e816dcd831a42029d376bf"
+ integrity sha512-hHxJU6PAEUn0TP4S/ZOzuTUvJWuZ6eIKeNKb5RBpODvSl6hp1Wrw4s7ATY50rklRCScUDpHzVA/DQdSjJ3UoYQ==
+ dependencies:
+ "@types/node" "*"
+
+"@types/semver@^7.3.12":
+ version "7.5.8"
+ resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.8.tgz#8268a8c57a3e4abd25c165ecd36237db7948a55e"
+ integrity sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==
+
+"@types/tinycolor2@^1.4.0":
+ version "1.4.6"
+ resolved "https://registry.yarnpkg.com/@types/tinycolor2/-/tinycolor2-1.4.6.tgz#670cbc0caf4e58dd61d1e3a6f26386e473087f06"
+ integrity sha512-iEN8J0BoMnsWBqjVbWH/c0G0Hh7O21lpR2/+PrvAVgWdzL7eexIFm4JN/Wn10PTcmNdtS6U67r499mlWMXOxNw==
+
+"@types/triple-beam@^1.3.2":
+ version "1.3.5"
+ resolved "https://registry.yarnpkg.com/@types/triple-beam/-/triple-beam-1.3.5.tgz#74fef9ffbaa198eb8b588be029f38b00299caa2c"
+ integrity sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==
+
+"@types/yoga-layout@1.9.2":
+ version "1.9.2"
+ resolved "https://registry.yarnpkg.com/@types/yoga-layout/-/yoga-layout-1.9.2.tgz#efaf9e991a7390dc081a0b679185979a83a9639a"
+ integrity sha512-S9q47ByT2pPvD65IvrWp7qppVMpk9WGMbVq9wbWZOHg6tnXSD4vyhao6nOSBwwfDdV2p3Kx9evA9vI+XWTfDvw==
+
+"@typescript-eslint/eslint-plugin@^7.5.0":
+ version "7.18.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.18.0.tgz#b16d3cf3ee76bf572fdf511e79c248bdec619ea3"
+ integrity sha512-94EQTWZ40mzBc42ATNIBimBEDltSJ9RQHCC8vc/PDbxi4k8dVwUAv4o98dk50M1zB+JGFxp43FP7f8+FP8R6Sw==
+ dependencies:
+ "@eslint-community/regexpp" "^4.10.0"
+ "@typescript-eslint/scope-manager" "7.18.0"
+ "@typescript-eslint/type-utils" "7.18.0"
+ "@typescript-eslint/utils" "7.18.0"
+ "@typescript-eslint/visitor-keys" "7.18.0"
+ graphemer "^1.4.0"
+ ignore "^5.3.1"
+ natural-compare "^1.4.0"
+ ts-api-utils "^1.3.0"
+
+"@typescript-eslint/parser@^7.5.0":
+ version "7.18.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-7.18.0.tgz#83928d0f1b7f4afa974098c64b5ce6f9051f96a0"
+ integrity sha512-4Z+L8I2OqhZV8qA132M4wNL30ypZGYOQVBfMgxDH/K5UX0PNqTu1c6za9ST5r9+tavvHiTWmBnKzpCJ/GlVFtg==
+ dependencies:
+ "@typescript-eslint/scope-manager" "7.18.0"
+ "@typescript-eslint/types" "7.18.0"
+ "@typescript-eslint/typescript-estree" "7.18.0"
+ "@typescript-eslint/visitor-keys" "7.18.0"
+ debug "^4.3.4"
+
+"@typescript-eslint/scope-manager@5.62.0":
+ version "5.62.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz#d9457ccc6a0b8d6b37d0eb252a23022478c5460c"
+ integrity sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==
+ dependencies:
+ "@typescript-eslint/types" "5.62.0"
+ "@typescript-eslint/visitor-keys" "5.62.0"
+
+"@typescript-eslint/scope-manager@7.18.0":
+ version "7.18.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-7.18.0.tgz#c928e7a9fc2c0b3ed92ab3112c614d6bd9951c83"
+ integrity sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==
+ dependencies:
+ "@typescript-eslint/types" "7.18.0"
+ "@typescript-eslint/visitor-keys" "7.18.0"
+
+"@typescript-eslint/type-utils@7.18.0":
+ version "7.18.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-7.18.0.tgz#2165ffaee00b1fbbdd2d40aa85232dab6998f53b"
+ integrity sha512-XL0FJXuCLaDuX2sYqZUUSOJ2sG5/i1AAze+axqmLnSkNEVMVYLF+cbwlB2w8D1tinFuSikHmFta+P+HOofrLeA==
+ dependencies:
+ "@typescript-eslint/typescript-estree" "7.18.0"
+ "@typescript-eslint/utils" "7.18.0"
+ debug "^4.3.4"
+ ts-api-utils "^1.3.0"
+
+"@typescript-eslint/types@5.62.0":
+ version "5.62.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.62.0.tgz#258607e60effa309f067608931c3df6fed41fd2f"
+ integrity sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==
+
+"@typescript-eslint/types@7.18.0":
+ version "7.18.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-7.18.0.tgz#b90a57ccdea71797ffffa0321e744f379ec838c9"
+ integrity sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==
+
+"@typescript-eslint/typescript-estree@5.62.0":
+ version "5.62.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz#7d17794b77fabcac615d6a48fb143330d962eb9b"
+ integrity sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==
+ dependencies:
+ "@typescript-eslint/types" "5.62.0"
+ "@typescript-eslint/visitor-keys" "5.62.0"
+ debug "^4.3.4"
+ globby "^11.1.0"
+ is-glob "^4.0.3"
+ semver "^7.3.7"
+ tsutils "^3.21.0"
+
+"@typescript-eslint/typescript-estree@7.18.0":
+ version "7.18.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-7.18.0.tgz#b5868d486c51ce8f312309ba79bdb9f331b37931"
+ integrity sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA==
+ dependencies:
+ "@typescript-eslint/types" "7.18.0"
+ "@typescript-eslint/visitor-keys" "7.18.0"
+ debug "^4.3.4"
+ globby "^11.1.0"
+ is-glob "^4.0.3"
+ minimatch "^9.0.4"
+ semver "^7.6.0"
+ ts-api-utils "^1.3.0"
+
+"@typescript-eslint/utils@7.18.0":
+ version "7.18.0"
+ resolved "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.18.0.tgz"
+ integrity sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw==
+ dependencies:
+ "@eslint-community/eslint-utils" "^4.4.0"
+ "@typescript-eslint/scope-manager" "7.18.0"
+ "@typescript-eslint/types" "7.18.0"
+ "@typescript-eslint/typescript-estree" "7.18.0"
+
+"@typescript-eslint/utils@^5.10.0":
+ version "5.62.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.62.0.tgz#141e809c71636e4a75daa39faed2fb5f4b10df86"
+ integrity sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==
+ dependencies:
+ "@eslint-community/eslint-utils" "^4.2.0"
+ "@types/json-schema" "^7.0.9"
+ "@types/semver" "^7.3.12"
+ "@typescript-eslint/scope-manager" "5.62.0"
+ "@typescript-eslint/types" "5.62.0"
+ "@typescript-eslint/typescript-estree" "5.62.0"
+ eslint-scope "^5.1.1"
+ semver "^7.3.7"
+
+"@typescript-eslint/visitor-keys@5.62.0":
+ version "5.62.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz#2174011917ce582875954ffe2f6912d5931e353e"
+ integrity sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==
+ dependencies:
+ "@typescript-eslint/types" "5.62.0"
+ eslint-visitor-keys "^3.3.0"
+
+"@typescript-eslint/visitor-keys@7.18.0":
+ version "7.18.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-7.18.0.tgz#0564629b6124d67607378d0f0332a0495b25e7d7"
+ integrity sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==
+ dependencies:
+ "@typescript-eslint/types" "7.18.0"
+ eslint-visitor-keys "^3.4.3"
+
+"@ungap/structured-clone@^1.2.0":
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406"
+ integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==
+
+abort-controller@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392"
+ integrity sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==
+ dependencies:
+ event-target-shim "^5.0.0"
+
+abortcontroller-polyfill@^1.7.5:
+ version "1.7.5"
+ resolved "https://registry.yarnpkg.com/abortcontroller-polyfill/-/abortcontroller-polyfill-1.7.5.tgz#6738495f4e901fbb57b6c0611d0c75f76c485bed"
+ integrity sha512-JMJ5soJWP18htbbxJjG7bG6yuI6pRhgJ0scHHTfkUjf6wjP912xZWvM+A4sJK3gqd9E8fcPbDnOefbA9Th/FIQ==
+
+accepts@~1.3.8:
+ version "1.3.8"
+ resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e"
+ integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==
+ dependencies:
+ mime-types "~2.1.34"
+ negotiator "0.6.3"
+
+acorn-jsx@^5.3.2:
+ version "5.3.2"
+ resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937"
+ integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==
+
+acorn-walk@^8.1.1:
+ version "8.3.4"
+ resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.4.tgz#794dd169c3977edf4ba4ea47583587c5866236b7"
+ integrity sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==
+ dependencies:
+ acorn "^8.11.0"
+
+acorn@^8.11.0, acorn@^8.4.1, acorn@^8.9.0:
+ version "8.13.0"
+ resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.13.0.tgz#2a30d670818ad16ddd6a35d3842dacec9e5d7ca3"
+ integrity sha512-8zSiw54Oxrdym50NlZ9sUusyO1Z1ZchgRLWRaK6c86XJFClyCgFKetdowBg5bKxyp/u+CDBJG4Mpp0m3HLZl9w==
+
+adm-zip@^0.4.16:
+ version "0.4.16"
+ resolved "https://registry.yarnpkg.com/adm-zip/-/adm-zip-0.4.16.tgz#cf4c508fdffab02c269cbc7f471a875f05570365"
+ integrity sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg==
+
+aes-js@3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/aes-js/-/aes-js-3.0.0.tgz#e21df10ad6c2053295bcbb8dab40b09dbea87e4d"
+ integrity sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==
+
+agent-base@6:
+ version "6.0.2"
+ resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77"
+ integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==
+ dependencies:
+ debug "4"
+
+aggregate-error@^3.0.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a"
+ integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==
+ dependencies:
+ clean-stack "^2.0.0"
+ indent-string "^4.0.0"
+
+ajv@^6.12.3, ajv@^6.12.4, ajv@^6.12.6:
+ version "6.12.6"
+ resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4"
+ integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==
+ dependencies:
+ fast-deep-equal "^3.1.1"
+ fast-json-stable-stringify "^2.0.0"
+ json-schema-traverse "^0.4.1"
+ uri-js "^4.2.2"
+
+ajv@^8.0.1:
+ version "8.17.1"
+ resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.17.1.tgz#37d9a5c776af6bc92d7f4f9510eba4c0a60d11a6"
+ integrity sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==
+ dependencies:
+ fast-deep-equal "^3.1.3"
+ fast-uri "^3.0.1"
+ json-schema-traverse "^1.0.0"
+ require-from-string "^2.0.2"
+
+ansi-align@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-3.0.1.tgz#0cdf12e111ace773a86e9a1fad1225c43cb19a59"
+ integrity sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==
+ dependencies:
+ string-width "^4.1.0"
+
+ansi-colors@^4.1.1, ansi-colors@^4.1.3:
+ version "4.1.3"
+ resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b"
+ integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==
+
+ansi-escapes@^4.2.1, ansi-escapes@^4.3.0:
+ version "4.3.2"
+ resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e"
+ integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==
+ dependencies:
+ type-fest "^0.21.3"
+
+ansi-regex@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304"
+ integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==
+
+ansi-styles@^3.2.1:
+ version "3.2.1"
+ resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d"
+ integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==
+ dependencies:
+ color-convert "^1.9.0"
+
+ansi-styles@^4.0.0, ansi-styles@^4.1.0:
+ version "4.3.0"
+ resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937"
+ integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==
+ dependencies:
+ color-convert "^2.0.1"
+
+antlr4@^4.13.1-patch-1:
+ version "4.13.2"
+ resolved "https://registry.yarnpkg.com/antlr4/-/antlr4-4.13.2.tgz#0d084ad0e32620482a9c3a0e2470c02e72e4006d"
+ integrity sha512-QiVbZhyy4xAZ17UPEuG3YTOt8ZaoeOR1CvEAqrEsDBsOqINslaB147i9xqljZqoyf5S+EUlGStaj+t22LT9MOg==
+
+anymatch@~3.1.2:
+ version "3.1.3"
+ resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e"
+ integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==
+ dependencies:
+ normalize-path "^3.0.0"
+ picomatch "^2.0.4"
+
+arg@^4.1.0:
+ version "4.1.3"
+ resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089"
+ integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==
+
+argparse@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38"
+ integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==
+
+array-buffer-byte-length@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz#1e5583ec16763540a27ae52eed99ff899223568f"
+ integrity sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==
+ dependencies:
+ call-bind "^1.0.5"
+ is-array-buffer "^3.0.4"
+
+array-flatten@1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2"
+ integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==
+
+array-includes@^3.1.8:
+ version "3.1.8"
+ resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.8.tgz#5e370cbe172fdd5dd6530c1d4aadda25281ba97d"
+ integrity sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==
+ dependencies:
+ call-bind "^1.0.7"
+ define-properties "^1.2.1"
+ es-abstract "^1.23.2"
+ es-object-atoms "^1.0.0"
+ get-intrinsic "^1.2.4"
+ is-string "^1.0.7"
+
+array-union@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d"
+ integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==
+
+array.prototype.findlastindex@^1.2.5:
+ version "1.2.5"
+ resolved "https://registry.yarnpkg.com/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz#8c35a755c72908719453f87145ca011e39334d0d"
+ integrity sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==
+ dependencies:
+ call-bind "^1.0.7"
+ define-properties "^1.2.1"
+ es-abstract "^1.23.2"
+ es-errors "^1.3.0"
+ es-object-atoms "^1.0.0"
+ es-shim-unscopables "^1.0.2"
+
+array.prototype.flat@^1.3.2:
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz#1476217df8cff17d72ee8f3ba06738db5b387d18"
+ integrity sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.2.0"
+ es-abstract "^1.22.1"
+ es-shim-unscopables "^1.0.0"
+
+array.prototype.flatmap@^1.3.2:
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz#c9a7c6831db8e719d6ce639190146c24bbd3e527"
+ integrity sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.2.0"
+ es-abstract "^1.22.1"
+ es-shim-unscopables "^1.0.0"
+
+arraybuffer.prototype.slice@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz#097972f4255e41bc3425e37dc3f6421cf9aefde6"
+ integrity sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==
+ dependencies:
+ array-buffer-byte-length "^1.0.1"
+ call-bind "^1.0.5"
+ define-properties "^1.2.1"
+ es-abstract "^1.22.3"
+ es-errors "^1.2.1"
+ get-intrinsic "^1.2.3"
+ is-array-buffer "^3.0.4"
+ is-shared-array-buffer "^1.0.2"
+
+asn1@~0.2.3:
+ version "0.2.6"
+ resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.6.tgz#0d3a7bb6e64e02a90c0303b31f292868ea09a08d"
+ integrity sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==
+ dependencies:
+ safer-buffer "~2.1.0"
+
+assert-plus@1.0.0, assert-plus@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525"
+ integrity sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==
+
+assertion-error@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b"
+ integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==
+
+ast-metadata-inferer@^0.8.0:
+ version "0.8.0"
+ resolved "https://registry.yarnpkg.com/ast-metadata-inferer/-/ast-metadata-inferer-0.8.0.tgz#0f94c3425e310d8da45823ab2161142e3f134343"
+ integrity sha512-jOMKcHht9LxYIEQu+RVd22vtgrPaVCtDRQ/16IGmurdzxvYbDd5ynxjnyrzLnieG96eTcAyaoj/wN/4/1FyyeA==
+ dependencies:
+ "@mdn/browser-compat-data" "^5.2.34"
+
+ast-parents@^0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/ast-parents/-/ast-parents-0.0.1.tgz#508fd0f05d0c48775d9eccda2e174423261e8dd3"
+ integrity sha512-XHusKxKz3zoYk1ic8Un640joHbFMhbqneyoZfoKnEGtf2ey9Uh/IdpcQplODdO/kENaMIWsD0nJm4+wX3UNLHA==
+
+astral-regex@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31"
+ integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==
+
+async-limiter@~1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd"
+ integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==
+
+async@^3.2.3:
+ version "3.2.6"
+ resolved "https://registry.yarnpkg.com/async/-/async-3.2.6.tgz#1b0728e14929d51b85b449b7f06e27c1145e38ce"
+ integrity sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==
+
+asynckit@^0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
+ integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==
+
+auto-bind@4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/auto-bind/-/auto-bind-4.0.0.tgz#e3589fc6c2da8f7ca43ba9f84fa52a744fc997fb"
+ integrity sha512-Hdw8qdNiqdJ8LqT0iK0sVzkFbzg6fhnQqqfWhBDxcHZvU75+B+ayzTy8x+k5Ix0Y92XOhOUlx74ps+bA6BeYMQ==
+
+available-typed-arrays@^1.0.7:
+ version "1.0.7"
+ resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz#a5cc375d6a03c2efc87a553f3e0b1522def14846"
+ integrity sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==
+ dependencies:
+ possible-typed-array-names "^1.0.0"
+
+aws-sign2@~0.7.0:
+ version "0.7.0"
+ resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8"
+ integrity sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==
+
+aws4@^1.8.0:
+ version "1.13.2"
+ resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.13.2.tgz#0aa167216965ac9474ccfa83892cfb6b3e1e52ef"
+ integrity sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==
+
+axios@^0.21.1:
+ version "0.21.4"
+ resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.4.tgz#c67b90dc0568e5c1cf2b0b858c43ba28e2eda575"
+ integrity sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==
+ dependencies:
+ follow-redirects "^1.14.0"
+
+balanced-match@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee"
+ integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==
+
+base-x@^3.0.2, base-x@^3.0.8:
+ version "3.0.10"
+ resolved "https://registry.npmjs.org/base-x/-/base-x-3.0.10.tgz"
+ integrity sha512-7d0s06rR9rYaIWHkpfLIFICM/tkSVdoPC9qYAQRpxn9DdKNWNsKC0uk++akckyLq16Tx2WIinnZ6WRriAt6njQ==
+ dependencies:
+ safe-buffer "^5.0.1"
+
+base-x@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/base-x/-/base-x-4.0.0.tgz#d0e3b7753450c73f8ad2389b5c018a4af7b2224a"
+ integrity sha512-FuwxlW4H5kh37X/oW59pwTzzTKRzfrrQwhmyspRM7swOEZcHtDZSCt45U6oKgtuFE+WYPblePMVIPR4RZrh/hw==
+
+base-x@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/base-x/-/base-x-5.0.0.tgz#6d835ceae379130e1a4cb846a70ac4746f28ea9b"
+ integrity sha512-sMW3VGSX1QWVFA6l8U62MLKz29rRfpTlYdCqLdpLo1/Yd4zZwSbnUaDfciIAowAqvq7YFnWq9hrhdg1KYgc1lQ==
+
+base64-js@^1.3.1:
+ version "1.5.1"
+ resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a"
+ integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==
+
+bcrypt-pbkdf@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e"
+ integrity sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==
+ dependencies:
+ tweetnacl "^0.14.3"
+
+bech32@1.1.4:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/bech32/-/bech32-1.1.4.tgz#e38c9f37bf179b8eb16ae3a772b40c356d4832e9"
+ integrity sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==
+
+bignumber.js@^9.0.0:
+ version "9.1.2"
+ resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.1.2.tgz#b7c4242259c008903b13707983b5f4bbd31eda0c"
+ integrity sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==
+
+binary-extensions@^2.0.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522"
+ integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==
+
+blakejs@^1.1.0:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/blakejs/-/blakejs-1.2.1.tgz#5057e4206eadb4a97f7c0b6e197a505042fc3814"
+ integrity sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ==
+
+bluebird@^3.5.0:
+ version "3.7.2"
+ resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f"
+ integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==
+
+bn.js@4.11.6:
+ version "4.11.6"
+ resolved "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz"
+ integrity sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA==
+
+bn.js@^4.11.0, bn.js@^4.11.6, bn.js@^4.11.8, bn.js@^4.11.9:
+ version "4.12.0"
+ resolved "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz"
+ integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==
+
+bn.js@^5.1.2, bn.js@^5.2.0, bn.js@^5.2.1:
+ version "5.2.1"
+ resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.1.tgz#0bc527a6a0d18d0aa8d5b0538ce4a77dccfa7b70"
+ integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==
+
+body-parser@1.20.3, body-parser@^1.16.0:
+ version "1.20.3"
+ resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.3.tgz#1953431221c6fb5cd63c4b36d53fab0928e548c6"
+ integrity sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==
+ 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"
+
+boxen@^5.1.2:
+ version "5.1.2"
+ resolved "https://registry.yarnpkg.com/boxen/-/boxen-5.1.2.tgz#788cb686fc83c1f486dfa8a40c68fc2b831d2b50"
+ integrity sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==
+ dependencies:
+ ansi-align "^3.0.0"
+ camelcase "^6.2.0"
+ chalk "^4.1.0"
+ cli-boxes "^2.2.1"
+ string-width "^4.2.2"
+ type-fest "^0.20.2"
+ widest-line "^3.1.0"
+ wrap-ansi "^7.0.0"
+
+brace-expansion@^1.1.7:
+ version "1.1.11"
+ resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
+ integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==
+ dependencies:
+ balanced-match "^1.0.0"
+ concat-map "0.0.1"
+
+brace-expansion@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae"
+ integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==
+ dependencies:
+ balanced-match "^1.0.0"
+
+braces@^3.0.3, braces@~3.0.2:
+ version "3.0.3"
+ resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789"
+ integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==
+ dependencies:
+ fill-range "^7.1.1"
+
+brorand@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f"
+ integrity sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==
+
+browser-stdout@^1.3.1:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60"
+ integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==
+
+browserify-aes@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48"
+ integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==
+ dependencies:
+ buffer-xor "^1.0.3"
+ cipher-base "^1.0.0"
+ create-hash "^1.1.0"
+ evp_bytestokey "^1.0.3"
+ inherits "^2.0.1"
+ safe-buffer "^5.0.1"
+
+browserslist@^4.21.10, browserslist@^4.24.0:
+ version "4.24.0"
+ resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.24.0.tgz"
+ integrity sha512-Rmb62sR1Zpjql25eSanFGEhAxcFwfA1K0GuQcLoaJBAcENegrQut3hYdhXFF1obQfiDyqIW/cLM5HSJ/9k884A==
+ dependencies:
+ caniuse-lite "^1.0.30001663"
+ electron-to-chromium "^1.5.28"
+ node-releases "^2.0.18"
+ update-browserslist-db "^1.1.0"
+
+bs58@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/bs58/-/bs58-4.0.1.tgz#be161e76c354f6f788ae4071f63f34e8c4f0a42a"
+ integrity sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==
+ dependencies:
+ base-x "^3.0.2"
+
+bs58@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/bs58/-/bs58-5.0.0.tgz#865575b4d13c09ea2a84622df6c8cbeb54ffc279"
+ integrity sha512-r+ihvQJvahgYT50JD05dyJNKlmmSlMoOGwn1lCcEzanPglg7TxYjioQUYehQ9mAR/+hOSd2jRc/Z2y5UxBymvQ==
+ dependencies:
+ base-x "^4.0.0"
+
+bs58@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/bs58/-/bs58-6.0.0.tgz#a2cda0130558535dd281a2f8697df79caaf425d8"
+ integrity sha512-PD0wEnEYg6ijszw/u8s+iI3H17cTymlrwkKhDhPZq+Sokl3AU4htyBFTjAeNAlCCmg0f53g6ih3jATyCKftTfw==
+ dependencies:
+ base-x "^5.0.0"
+
+bs58check@^2.1.2:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/bs58check/-/bs58check-2.1.2.tgz#53b018291228d82a5aa08e7d796fdafda54aebfc"
+ integrity sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==
+ dependencies:
+ bs58 "^4.0.0"
+ create-hash "^1.1.0"
+ safe-buffer "^5.1.2"
+
+buffer-from@^1.0.0:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5"
+ integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==
+
+buffer-to-arraybuffer@^0.0.5:
+ version "0.0.5"
+ resolved "https://registry.yarnpkg.com/buffer-to-arraybuffer/-/buffer-to-arraybuffer-0.0.5.tgz#6064a40fa76eb43c723aba9ef8f6e1216d10511a"
+ integrity sha512-3dthu5CYiVB1DEJp61FtApNnNndTckcqe4pFcLdvHtrpG+kcyekCJKg4MRiDcFW7A6AODnXB9U4dwQiCW5kzJQ==
+
+buffer-xor@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9"
+ integrity sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==
+
+buffer@^5.0.5, buffer@^5.5.0, buffer@^5.6.0:
+ version "5.7.1"
+ resolved "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz"
+ integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==
+ dependencies:
+ base64-js "^1.3.1"
+ ieee754 "^1.1.13"
+
+buffer@^6.0.3:
+ version "6.0.3"
+ resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6"
+ integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==
+ dependencies:
+ base64-js "^1.3.1"
+ ieee754 "^1.2.1"
+
+bufferutil@^4.0.1:
+ version "4.0.8"
+ resolved "https://registry.yarnpkg.com/bufferutil/-/bufferutil-4.0.8.tgz#1de6a71092d65d7766c4d8a522b261a6e787e8ea"
+ integrity sha512-4T53u4PdgsXqKaIctwF8ifXlRTTmEPJ8iEPWFdGZvcf7sbwYo6FKFEX9eNNAnzFZ7EzJAQ3CJeOtCRA4rDp7Pw==
+ dependencies:
+ node-gyp-build "^4.3.0"
+
+bytes@3.1.2:
+ version "3.1.2"
+ resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5"
+ integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==
+
+cacheable-lookup@^5.0.3:
+ version "5.0.4"
+ resolved "https://registry.yarnpkg.com/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz#5a6b865b2c44357be3d5ebc2a467b032719a7005"
+ integrity sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==
+
+cacheable-lookup@^6.0.4:
+ version "6.1.0"
+ resolved "https://registry.yarnpkg.com/cacheable-lookup/-/cacheable-lookup-6.1.0.tgz#0330a543471c61faa4e9035db583aad753b36385"
+ integrity sha512-KJ/Dmo1lDDhmW2XDPMo+9oiy/CeqosPguPCrgcVzKyZrL6pM1gU2GmPY/xo6OQPTUaA/c0kwHuywB4E6nmT9ww==
+
+cacheable-lookup@^7.0.0:
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz#3476a8215d046e5a3202a9209dd13fec1f933a27"
+ integrity sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==
+
+cacheable-request@^10.2.8:
+ version "10.2.14"
+ resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-10.2.14.tgz#eb915b665fda41b79652782df3f553449c406b9d"
+ integrity sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ==
+ dependencies:
+ "@types/http-cache-semantics" "^4.0.2"
+ get-stream "^6.0.1"
+ http-cache-semantics "^4.1.1"
+ keyv "^4.5.3"
+ mimic-response "^4.0.0"
+ normalize-url "^8.0.0"
+ responselike "^3.0.0"
+
+cacheable-request@^7.0.2:
+ version "7.0.4"
+ resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-7.0.4.tgz#7a33ebf08613178b403635be7b899d3e69bbe817"
+ integrity sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==
+ dependencies:
+ clone-response "^1.0.2"
+ get-stream "^5.1.0"
+ http-cache-semantics "^4.0.0"
+ keyv "^4.0.0"
+ lowercase-keys "^2.0.0"
+ normalize-url "^6.0.1"
+ responselike "^2.0.0"
+
+call-bind@^1.0.2, call-bind@^1.0.5, call-bind@^1.0.6, call-bind@^1.0.7:
+ version "1.0.7"
+ resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9"
+ integrity sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==
+ dependencies:
+ es-define-property "^1.0.0"
+ es-errors "^1.3.0"
+ function-bind "^1.1.2"
+ get-intrinsic "^1.2.4"
+ set-function-length "^1.2.1"
+
+callsites@^3.0.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73"
+ integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==
+
+camelcase@^6.0.0, camelcase@^6.2.0:
+ version "6.3.0"
+ resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a"
+ integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==
+
+caniuse-lite@^1.0.30001524:
+ version "1.0.30001669"
+ resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001669.tgz#fda8f1d29a8bfdc42de0c170d7f34a9cf19ed7a3"
+ integrity sha512-DlWzFDJqstqtIVx1zeSpIMLjunf5SmwOw0N2Ck/QSQdS8PLS4+9HrLaYei4w8BIAL7IB/UEDu889d8vhCTPA0w==
+
+caniuse-lite@^1.0.30001663:
+ version "1.0.30001673"
+ resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001673.tgz#5aa291557af1c71340e809987367410aab7a5a9e"
+ integrity sha512-WTrjUCSMp3LYX0nE12ECkV0a+e6LC85E0Auz75555/qr78Oc8YWhEPNfDd6SHdtlCMSzqtuXY0uyEMNRcsKpKw==
+
+caseless@~0.12.0:
+ version "0.12.0"
+ resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc"
+ integrity sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==
+
+cbor@^8.1.0:
+ version "8.1.0"
+ resolved "https://registry.yarnpkg.com/cbor/-/cbor-8.1.0.tgz#cfc56437e770b73417a2ecbfc9caf6b771af60d5"
+ integrity sha512-DwGjNW9omn6EwP70aXsn7FQJx5kO12tX0bZkaTjzdVFM6/7nhA4t0EENocKGx6D2Bch9PE2KzCUf5SceBdeijg==
+ dependencies:
+ nofilter "^3.1.0"
+
+cbor@^9.0.0:
+ version "9.0.2"
+ resolved "https://registry.yarnpkg.com/cbor/-/cbor-9.0.2.tgz#536b4f2d544411e70ec2b19a2453f10f83cd9fdb"
+ integrity sha512-JPypkxsB10s9QOWwa6zwPzqE1Md3vqpPc+cai4sAecuCsRyAtAl/pMyhPlMbT/xtPnm2dznJZYRLui57qiRhaQ==
+ dependencies:
+ nofilter "^3.1.0"
+
+chai-as-promised@^7.1.1:
+ version "7.1.2"
+ resolved "https://registry.yarnpkg.com/chai-as-promised/-/chai-as-promised-7.1.2.tgz#70cd73b74afd519754161386421fb71832c6d041"
+ integrity sha512-aBDHZxRzYnUYuIAIPBH2s511DjlKPzXNlXSGFC8CwmroWQLfrW0LtE1nK3MAwwNhJPa9raEjNCmRoFpG0Hurdw==
+ dependencies:
+ check-error "^1.0.2"
+
+chai@^4.4.1:
+ version "4.5.0"
+ resolved "https://registry.yarnpkg.com/chai/-/chai-4.5.0.tgz#707e49923afdd9b13a8b0b47d33d732d13812fd8"
+ integrity sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==
+ dependencies:
+ assertion-error "^1.1.0"
+ check-error "^1.0.3"
+ deep-eql "^4.1.3"
+ get-func-name "^2.0.2"
+ loupe "^2.3.6"
+ pathval "^1.1.1"
+ type-detect "^4.1.0"
+
+chalk@^2.4.1, chalk@^2.4.2:
+ version "2.4.2"
+ resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424"
+ integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==
+ dependencies:
+ ansi-styles "^3.2.1"
+ escape-string-regexp "^1.0.5"
+ supports-color "^5.3.0"
+
+chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.2:
+ version "4.1.2"
+ resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01"
+ integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==
+ dependencies:
+ ansi-styles "^4.1.0"
+ supports-color "^7.1.0"
+
+check-error@^1.0.2, check-error@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.3.tgz#a6502e4312a7ee969f646e83bb3ddd56281bd694"
+ integrity sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==
+ dependencies:
+ get-func-name "^2.0.2"
+
+chokidar@^3.5.2, chokidar@^3.5.3:
+ version "3.6.0"
+ resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz"
+ integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==
+ dependencies:
+ anymatch "~3.1.2"
+ braces "~3.0.2"
+ glob-parent "~5.1.2"
+ is-binary-path "~2.1.0"
+ is-glob "~4.0.1"
+ normalize-path "~3.0.0"
+ readdirp "~3.6.0"
+ optionalDependencies:
+ fsevents "~2.3.2"
+
+chokidar@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-4.0.1.tgz#4a6dff66798fb0f72a94f616abbd7e1a19f31d41"
+ integrity sha512-n8enUVCED/KVRQlab1hr3MVpcVMvxtZjmEa956u+4YijlmQED223XMSYj2tLuKvr4jcCTzNNMpQDUer72MMmzA==
+ dependencies:
+ readdirp "^4.0.1"
+
+chownr@^1.1.4:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b"
+ integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==
+
+ci-info@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46"
+ integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==
+
+cids@^0.7.1:
+ version "0.7.5"
+ resolved "https://registry.yarnpkg.com/cids/-/cids-0.7.5.tgz#60a08138a99bfb69b6be4ceb63bfef7a396b28b2"
+ integrity sha512-zT7mPeghoWAu+ppn8+BS1tQ5qGmbMfB4AregnQjA/qHY3GC1m1ptI9GkWNlgeu38r7CuRdXB47uY2XgAYt6QVA==
+ dependencies:
+ buffer "^5.5.0"
+ class-is "^1.1.0"
+ multibase "~0.6.0"
+ multicodec "^1.0.0"
+ multihashes "~0.4.15"
+
+cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de"
+ integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==
+ dependencies:
+ inherits "^2.0.1"
+ safe-buffer "^5.0.1"
+
+class-is@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/class-is/-/class-is-1.1.0.tgz#9d3c0fba0440d211d843cec3dedfa48055005825"
+ integrity sha512-rhjH9AG1fvabIDoGRVH587413LPjTZgmDF9fOFCbFJQV4yuocX1mHxxvXI4g3cGwbVY9wAYIoKlg1N79frJKQw==
+
+clean-stack@^2.0.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b"
+ integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==
+
+cli-boxes@^2.2.0, cli-boxes@^2.2.1:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-2.2.1.tgz#ddd5035d25094fce220e9cab40a45840a440318f"
+ integrity sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==
+
+cli-cursor@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307"
+ integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==
+ dependencies:
+ restore-cursor "^3.1.0"
+
+cli-table3@^0.6.0:
+ version "0.6.5"
+ resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.6.5.tgz#013b91351762739c16a9567c21a04632e449bf2f"
+ integrity sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==
+ dependencies:
+ string-width "^4.2.0"
+ optionalDependencies:
+ "@colors/colors" "1.5.0"
+
+cli-truncate@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-2.1.0.tgz#c39e28bf05edcde5be3b98992a22deed5a2b93c7"
+ integrity sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==
+ dependencies:
+ slice-ansi "^3.0.0"
+ string-width "^4.2.0"
+
+cliui@^7.0.2:
+ version "7.0.4"
+ resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f"
+ integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==
+ dependencies:
+ string-width "^4.2.0"
+ strip-ansi "^6.0.0"
+ wrap-ansi "^7.0.0"
+
+clone-response@^1.0.2:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.3.tgz#af2032aa47816399cf5f0a1d0db902f517abb8c3"
+ integrity sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==
+ dependencies:
+ mimic-response "^1.0.0"
+
+code-excerpt@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/code-excerpt/-/code-excerpt-3.0.0.tgz#fcfb6748c03dba8431c19f5474747fad3f250f10"
+ integrity sha512-VHNTVhd7KsLGOqfX3SyeO8RyYPMp1GJOg194VITk04WMYCv4plV68YWe6TJZxd9MhobjtpMRnVky01gqZsalaw==
+ dependencies:
+ convert-to-spaces "^1.0.1"
+
+color-convert@^1.9.0, color-convert@^1.9.3:
+ version "1.9.3"
+ resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8"
+ integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==
+ dependencies:
+ color-name "1.1.3"
+
+color-convert@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3"
+ integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==
+ dependencies:
+ color-name "~1.1.4"
+
+color-name@1.1.3:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25"
+ integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==
+
+color-name@^1.0.0, color-name@~1.1.4:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2"
+ integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
+
+color-string@^1.6.0:
+ version "1.9.1"
+ resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.9.1.tgz#4467f9146f036f855b764dfb5bf8582bf342c7a4"
+ integrity sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==
+ dependencies:
+ color-name "^1.0.0"
+ simple-swizzle "^0.2.2"
+
+color@^3.1.3:
+ version "3.2.1"
+ resolved "https://registry.yarnpkg.com/color/-/color-3.2.1.tgz#3544dc198caf4490c3ecc9a790b54fe9ff45e164"
+ integrity sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==
+ dependencies:
+ color-convert "^1.9.3"
+ color-string "^1.6.0"
+
+colorspace@1.1.x:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/colorspace/-/colorspace-1.1.4.tgz#8d442d1186152f60453bf8070cd66eb364e59243"
+ integrity sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==
+ dependencies:
+ color "^3.1.3"
+ text-hex "1.0.x"
+
+combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6:
+ version "1.0.8"
+ resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f"
+ integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==
+ dependencies:
+ delayed-stream "~1.0.0"
+
+command-exists@^1.2.8:
+ version "1.2.9"
+ resolved "https://registry.yarnpkg.com/command-exists/-/command-exists-1.2.9.tgz#c50725af3808c8ab0260fd60b01fbfa25b954f69"
+ integrity sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==
+
+commander@^10.0.0:
+ version "10.0.1"
+ resolved "https://registry.yarnpkg.com/commander/-/commander-10.0.1.tgz#881ee46b4f77d1c1dccc5823433aa39b022cbe06"
+ integrity sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==
+
+commander@^8.1.0:
+ version "8.3.0"
+ resolved "https://registry.yarnpkg.com/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66"
+ integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==
+
+concat-map@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
+ integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==
+
+config-chain@^1.1.11:
+ version "1.1.13"
+ resolved "https://registry.yarnpkg.com/config-chain/-/config-chain-1.1.13.tgz#fad0795aa6a6cdaff9ed1b68e9dff94372c232f4"
+ integrity sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==
+ dependencies:
+ ini "^1.3.4"
+ proto-list "~1.2.1"
+
+content-disposition@0.5.4:
+ version "0.5.4"
+ resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe"
+ integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==
+ dependencies:
+ safe-buffer "5.2.1"
+
+content-hash@^2.5.2:
+ version "2.5.2"
+ resolved "https://registry.yarnpkg.com/content-hash/-/content-hash-2.5.2.tgz#bbc2655e7c21f14fd3bfc7b7d4bfe6e454c9e211"
+ integrity sha512-FvIQKy0S1JaWV10sMsA7TRx8bpU+pqPkhbsfvOJAdjRXvYxEckAwQWGwtRjiaJfh+E0DvcWUGqcdjwMGFjsSdw==
+ dependencies:
+ cids "^0.7.1"
+ multicodec "^0.5.5"
+ multihashes "^0.4.15"
+
+content-type@~1.0.4, content-type@~1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918"
+ integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==
+
+convert-source-map@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a"
+ integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==
+
+convert-to-spaces@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/convert-to-spaces/-/convert-to-spaces-1.0.2.tgz#7e3e48bbe6d997b1417ddca2868204b4d3d85715"
+ integrity sha512-cj09EBuObp9gZNQCzc7hByQyrs6jVGE+o9kSJmeUoj+GiPiJvi5LYqEH/Hmme4+MTLHM+Ejtq+FChpjjEnsPdQ==
+
+cookie-signature@1.0.6:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c"
+ integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==
+
+cookie@0.7.1:
+ version "0.7.1"
+ resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.7.1.tgz#2f73c42142d5d5cf71310a74fc4ae61670e5dbc9"
+ integrity sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==
+
+cookie@^0.4.1:
+ version "0.4.2"
+ resolved "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz"
+ integrity sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==
+
+core-util-is@1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
+ integrity sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==
+
+cors@^2.8.1:
+ version "2.8.5"
+ resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29"
+ integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==
+ dependencies:
+ object-assign "^4"
+ vary "^1"
+
+cosmiconfig@^8.0.0:
+ version "8.3.6"
+ resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-8.3.6.tgz#060a2b871d66dba6c8538ea1118ba1ac16f5fae3"
+ integrity sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==
+ dependencies:
+ import-fresh "^3.3.0"
+ js-yaml "^4.1.0"
+ parse-json "^5.2.0"
+ path-type "^4.0.0"
+
+crc-32@^1.2.0:
+ version "1.2.2"
+ resolved "https://registry.yarnpkg.com/crc-32/-/crc-32-1.2.2.tgz#3cad35a934b8bf71f25ca524b6da51fb7eace2ff"
+ integrity sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==
+
+create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196"
+ integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==
+ dependencies:
+ cipher-base "^1.0.1"
+ inherits "^2.0.1"
+ md5.js "^1.3.4"
+ ripemd160 "^2.0.1"
+ sha.js "^2.4.0"
+
+create-hmac@^1.1.4, create-hmac@^1.1.7:
+ version "1.1.7"
+ resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff"
+ integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==
+ dependencies:
+ cipher-base "^1.0.3"
+ create-hash "^1.1.0"
+ inherits "^2.0.1"
+ ripemd160 "^2.0.0"
+ safe-buffer "^5.0.1"
+ sha.js "^2.4.8"
+
+create-require@^1.1.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333"
+ integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==
+
+cross-fetch@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-4.0.0.tgz#f037aef1580bb3a1a35164ea2a848ba81b445983"
+ integrity sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==
+ dependencies:
+ node-fetch "^2.6.12"
+
+cross-spawn@^7.0.2:
+ version "7.0.3"
+ resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6"
+ integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==
+ dependencies:
+ path-key "^3.1.0"
+ shebang-command "^2.0.0"
+ which "^2.0.1"
+
+d@1, d@^1.0.1, d@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/d/-/d-1.0.2.tgz#2aefd554b81981e7dccf72d6842ae725cb17e5de"
+ integrity sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==
+ dependencies:
+ es5-ext "^0.10.64"
+ type "^2.7.2"
+
+dashdash@^1.12.0:
+ version "1.14.1"
+ resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0"
+ integrity sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==
+ dependencies:
+ assert-plus "^1.0.0"
+
+data-view-buffer@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/data-view-buffer/-/data-view-buffer-1.0.1.tgz#8ea6326efec17a2e42620696e671d7d5a8bc66b2"
+ integrity sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==
+ dependencies:
+ call-bind "^1.0.6"
+ es-errors "^1.3.0"
+ is-data-view "^1.0.1"
+
+data-view-byte-length@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz#90721ca95ff280677eb793749fce1011347669e2"
+ integrity sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==
+ dependencies:
+ call-bind "^1.0.7"
+ es-errors "^1.3.0"
+ is-data-view "^1.0.1"
+
+data-view-byte-offset@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz#5e0bbfb4828ed2d1b9b400cd8a7d119bca0ff18a"
+ integrity sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==
+ dependencies:
+ call-bind "^1.0.6"
+ es-errors "^1.3.0"
+ is-data-view "^1.0.1"
+
+debug@2.6.9, debug@^2.2.0:
+ version "2.6.9"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
+ integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==
+ dependencies:
+ ms "2.0.0"
+
+debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4, debug@^4.3.5:
+ version "4.3.7"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.7.tgz#87945b4151a011d76d95a198d7111c865c360a52"
+ integrity sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==
+ dependencies:
+ ms "^2.1.3"
+
+debug@^3.2.7:
+ version "3.2.7"
+ resolved "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz"
+ integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==
+ dependencies:
+ ms "^2.1.1"
+
+decamelize@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837"
+ integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==
+
+decode-uri-component@^0.2.0:
+ version "0.2.2"
+ resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.2.tgz#e69dbe25d37941171dd540e024c444cd5188e1e9"
+ integrity sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==
+
+decompress-response@^3.3.0:
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3"
+ integrity sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==
+ dependencies:
+ mimic-response "^1.0.0"
+
+decompress-response@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-6.0.0.tgz#ca387612ddb7e104bd16d85aab00d5ecf09c66fc"
+ integrity sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==
+ dependencies:
+ mimic-response "^3.1.0"
+
+deep-eql@^4.0.1, deep-eql@^4.1.3:
+ version "4.1.4"
+ resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-4.1.4.tgz#d0d3912865911bb8fac5afb4e3acfa6a28dc72b7"
+ integrity sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==
+ dependencies:
+ type-detect "^4.0.0"
+
+deep-extend@^0.6.0:
+ version "0.6.0"
+ resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac"
+ integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==
+
+deep-is@^0.1.3:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831"
+ integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==
+
+defer-to-connect@^2.0.0, defer-to-connect@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-2.0.1.tgz#8016bdb4143e4632b77a3449c6236277de520587"
+ integrity sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==
+
+define-data-property@^1.0.1, define-data-property@^1.1.4:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e"
+ integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==
+ dependencies:
+ es-define-property "^1.0.0"
+ es-errors "^1.3.0"
+ gopd "^1.0.1"
+
+define-properties@^1.2.0, define-properties@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c"
+ integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==
+ dependencies:
+ define-data-property "^1.0.1"
+ has-property-descriptors "^1.0.0"
+ object-keys "^1.1.1"
+
+delayed-stream@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
+ integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==
+
+depd@2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df"
+ integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==
+
+destroy@1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015"
+ integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==
+
+detect-indent@^7.0.1:
+ version "7.0.1"
+ resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-7.0.1.tgz#cbb060a12842b9c4d333f1cac4aa4da1bb66bc25"
+ integrity sha512-Mc7QhQ8s+cLrnUfU/Ji94vG/r8M26m8f++vyres4ZoojaRDpZ1eSIh/EpzLNwlWuvzSZ3UbDFspjFvTDXe6e/g==
+
+detect-newline@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-4.0.1.tgz#fcefdb5713e1fb8cb2839b8b6ee22e6716ab8f23"
+ integrity sha512-qE3Veg1YXzGHQhlA6jzebZN2qVf6NX+A7m7qlhCGG30dJixrAQhYOsJjsnBjJkCSmuOPpCk30145fr8FV0bzog==
+
+diff@^4.0.1:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d"
+ integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==
+
+diff@^5.2.0:
+ version "5.2.0"
+ resolved "https://registry.yarnpkg.com/diff/-/diff-5.2.0.tgz#26ded047cd1179b78b9537d5ef725503ce1ae531"
+ integrity sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==
+
+dir-glob@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f"
+ integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==
+ dependencies:
+ path-type "^4.0.0"
+
+doctrine@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d"
+ integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==
+ dependencies:
+ esutils "^2.0.2"
+
+doctrine@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961"
+ integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==
+ dependencies:
+ esutils "^2.0.2"
+
+dom-walk@^0.1.0:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.2.tgz#0c548bef048f4d1f2a97249002236060daa3fd84"
+ integrity sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==
+
+dotenv@^16.4.5:
+ version "16.4.5"
+ resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.4.5.tgz#cdd3b3b604cb327e286b4762e13502f717cb099f"
+ integrity sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==
+
+"ds-test@github:dapphub/ds-test":
+ version "1.0.0"
+ resolved "https://codeload.github.com/dapphub/ds-test/tar.gz/e282159d5170298eb2455a6c05280ab5a73a4ef0"
+
+ecc-jsbn@~0.1.1:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9"
+ integrity sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==
+ dependencies:
+ jsbn "~0.1.0"
+ safer-buffer "^2.1.0"
+
+ee-first@1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
+ integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==
+
+electron-to-chromium@^1.5.28:
+ version "1.5.47"
+ resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.47.tgz#ef0751bc19b28be8ee44cd8405309de3bf3b20c7"
+ integrity sha512-zS5Yer0MOYw4rtK2iq43cJagHZ8sXN0jDHDKzB+86gSBSAI4v07S97mcq+Gs2vclAxSh1j7vOAHxSVgduiiuVQ==
+
+elliptic@6.5.4:
+ version "6.5.4"
+ resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb"
+ integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==
+ dependencies:
+ bn.js "^4.11.9"
+ brorand "^1.1.0"
+ hash.js "^1.0.0"
+ hmac-drbg "^1.0.1"
+ inherits "^2.0.4"
+ minimalistic-assert "^1.0.1"
+ minimalistic-crypto-utils "^1.0.1"
+
+elliptic@^6.4.0, elliptic@^6.5.2, elliptic@^6.5.7:
+ version "6.5.7"
+ resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.7.tgz#8ec4da2cb2939926a1b9a73619d768207e647c8b"
+ integrity sha512-ESVCtTwiA+XhY3wyh24QqRGBoP3rEdDUl3EDUUo9tft074fi19IrdpH7hLCMMP3CIj7jb3W96rn8lt/BqIlt5Q==
+ dependencies:
+ bn.js "^4.11.9"
+ brorand "^1.1.0"
+ hash.js "^1.0.0"
+ hmac-drbg "^1.0.1"
+ inherits "^2.0.4"
+ minimalistic-assert "^1.0.1"
+ minimalistic-crypto-utils "^1.0.1"
+
+emoji-regex@^8.0.0:
+ version "8.0.0"
+ resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37"
+ integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==
+
+enabled@2.0.x:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/enabled/-/enabled-2.0.0.tgz#f9dd92ec2d6f4bbc0d5d1e64e21d61cd4665e7c2"
+ integrity sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==
+
+encode-utf8@^1.0.2:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/encode-utf8/-/encode-utf8-1.0.3.tgz#f30fdd31da07fb596f281beb2f6b027851994cda"
+ integrity sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw==
+
+encodeurl@~1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59"
+ integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==
+
+encodeurl@~2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-2.0.0.tgz#7b8ea898077d7e409d3ac45474ea38eaf0857a58"
+ integrity sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==
+
+end-of-stream@^1.1.0:
+ version "1.4.4"
+ resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0"
+ integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==
+ dependencies:
+ once "^1.4.0"
+
+enhanced-resolve@^5.15.0:
+ version "5.17.1"
+ resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz#67bfbbcc2f81d511be77d686a90267ef7f898a15"
+ integrity sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==
+ dependencies:
+ graceful-fs "^4.2.4"
+ tapable "^2.2.0"
+
+enquirer@^2.3.0, enquirer@^2.3.6:
+ version "2.4.1"
+ resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.4.1.tgz#93334b3fbd74fc7097b224ab4a8fb7e40bf4ae56"
+ integrity sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==
+ dependencies:
+ ansi-colors "^4.1.1"
+ strip-ansi "^6.0.1"
+
+env-paths@^2.2.0:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2"
+ integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==
+
+error-ex@^1.3.1:
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf"
+ integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==
+ dependencies:
+ is-arrayish "^0.2.1"
+
+es-abstract@^1.22.1, es-abstract@^1.22.3, es-abstract@^1.23.0, es-abstract@^1.23.2:
+ version "1.23.3"
+ resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.23.3.tgz#8f0c5a35cd215312573c5a27c87dfd6c881a0aa0"
+ integrity sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==
+ dependencies:
+ array-buffer-byte-length "^1.0.1"
+ arraybuffer.prototype.slice "^1.0.3"
+ available-typed-arrays "^1.0.7"
+ call-bind "^1.0.7"
+ data-view-buffer "^1.0.1"
+ data-view-byte-length "^1.0.1"
+ data-view-byte-offset "^1.0.0"
+ es-define-property "^1.0.0"
+ es-errors "^1.3.0"
+ es-object-atoms "^1.0.0"
+ es-set-tostringtag "^2.0.3"
+ es-to-primitive "^1.2.1"
+ function.prototype.name "^1.1.6"
+ get-intrinsic "^1.2.4"
+ get-symbol-description "^1.0.2"
+ globalthis "^1.0.3"
+ gopd "^1.0.1"
+ has-property-descriptors "^1.0.2"
+ has-proto "^1.0.3"
+ has-symbols "^1.0.3"
+ hasown "^2.0.2"
+ internal-slot "^1.0.7"
+ is-array-buffer "^3.0.4"
+ is-callable "^1.2.7"
+ is-data-view "^1.0.1"
+ is-negative-zero "^2.0.3"
+ is-regex "^1.1.4"
+ is-shared-array-buffer "^1.0.3"
+ is-string "^1.0.7"
+ is-typed-array "^1.1.13"
+ is-weakref "^1.0.2"
+ object-inspect "^1.13.1"
+ object-keys "^1.1.1"
+ object.assign "^4.1.5"
+ regexp.prototype.flags "^1.5.2"
+ safe-array-concat "^1.1.2"
+ safe-regex-test "^1.0.3"
+ string.prototype.trim "^1.2.9"
+ string.prototype.trimend "^1.0.8"
+ string.prototype.trimstart "^1.0.8"
+ typed-array-buffer "^1.0.2"
+ typed-array-byte-length "^1.0.1"
+ typed-array-byte-offset "^1.0.2"
+ typed-array-length "^1.0.6"
+ unbox-primitive "^1.0.2"
+ which-typed-array "^1.1.15"
+
+es-define-property@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.0.tgz#c7faefbdff8b2696cf5f46921edfb77cc4ba3845"
+ integrity sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==
+ dependencies:
+ get-intrinsic "^1.2.4"
+
+es-errors@^1.2.1, es-errors@^1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f"
+ integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==
+
+es-object-atoms@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.0.0.tgz#ddb55cd47ac2e240701260bc2a8e31ecb643d941"
+ integrity sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==
+ dependencies:
+ es-errors "^1.3.0"
+
+es-set-tostringtag@^2.0.3:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz#8bb60f0a440c2e4281962428438d58545af39777"
+ integrity sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==
+ dependencies:
+ get-intrinsic "^1.2.4"
+ has-tostringtag "^1.0.2"
+ hasown "^2.0.1"
+
+es-shim-unscopables@^1.0.0, es-shim-unscopables@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz#1f6942e71ecc7835ed1c8a83006d8771a63a3763"
+ integrity sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==
+ dependencies:
+ hasown "^2.0.0"
+
+es-to-primitive@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a"
+ integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==
+ dependencies:
+ is-callable "^1.1.4"
+ is-date-object "^1.0.1"
+ is-symbol "^1.0.2"
+
+es5-ext@^0.10.35, es5-ext@^0.10.62, es5-ext@^0.10.63, es5-ext@^0.10.64, es5-ext@~0.10.14:
+ version "0.10.64"
+ resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.64.tgz#12e4ffb48f1ba2ea777f1fcdd1918ef73ea21714"
+ integrity sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==
+ dependencies:
+ es6-iterator "^2.0.3"
+ es6-symbol "^3.1.3"
+ esniff "^2.0.1"
+ next-tick "^1.1.0"
+
+es6-iterator@^2.0.3:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7"
+ integrity sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==
+ dependencies:
+ d "1"
+ es5-ext "^0.10.35"
+ es6-symbol "^3.1.1"
+
+es6-promise@^4.2.8:
+ version "4.2.8"
+ resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a"
+ integrity sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==
+
+es6-symbol@^3.1.1, es6-symbol@^3.1.3:
+ version "3.1.4"
+ resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.4.tgz#f4e7d28013770b4208ecbf3e0bf14d3bcb557b8c"
+ integrity sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==
+ dependencies:
+ d "^1.0.2"
+ ext "^1.7.0"
+
+escalade@^3.1.1, escalade@^3.2.0:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5"
+ integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==
+
+escape-html@~1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988"
+ integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==
+
+escape-string-regexp@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
+ integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==
+
+escape-string-regexp@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344"
+ integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==
+
+escape-string-regexp@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34"
+ integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==
+
+eslint-config-prettier@^9.1.0:
+ version "9.1.0"
+ resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz#31af3d94578645966c082fcb71a5846d3c94867f"
+ integrity sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==
+
+eslint-import-resolver-node@^0.3.9:
+ version "0.3.9"
+ resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz#d4eaac52b8a2e7c3cd1903eb00f7e053356118ac"
+ integrity sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==
+ dependencies:
+ debug "^3.2.7"
+ is-core-module "^2.13.0"
+ resolve "^1.22.4"
+
+eslint-import-resolver-typescript@^3.6.1:
+ version "3.6.3"
+ resolved "https://registry.yarnpkg.com/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.6.3.tgz#bb8e388f6afc0f940ce5d2c5fd4a3d147f038d9e"
+ integrity sha512-ud9aw4szY9cCT1EWWdGv1L1XR6hh2PaRWif0j2QjQ0pgTY/69iw+W0Z4qZv5wHahOl8isEr+k/JnyAqNQkLkIA==
+ dependencies:
+ "@nolyfill/is-core-module" "1.0.39"
+ debug "^4.3.5"
+ enhanced-resolve "^5.15.0"
+ eslint-module-utils "^2.8.1"
+ fast-glob "^3.3.2"
+ get-tsconfig "^4.7.5"
+ is-bun-module "^1.0.2"
+ is-glob "^4.0.3"
+
+eslint-module-utils@^2.12.0, eslint-module-utils@^2.8.1:
+ version "2.12.0"
+ resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.12.0.tgz#fe4cfb948d61f49203d7b08871982b65b9af0b0b"
+ integrity sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==
+ dependencies:
+ debug "^3.2.7"
+
+eslint-plugin-autofix@^2.0.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/eslint-plugin-autofix/-/eslint-plugin-autofix-2.2.0.tgz#afe77d47f2790c45561edeedde039ed2e1009392"
+ integrity sha512-lu8+0r+utyTroROqXIL+a8sUpICi6za22hIzlpb0+x0tQGRnOjhOKU7v8mC/NS/faDoVsw6xW3vUpc+Mcz5NWA==
+ dependencies:
+ eslint-rule-composer "^0.3.0"
+ espree "^9.0.0"
+ esutils "^2.0.2"
+ string-similarity "^4.0.3"
+
+eslint-plugin-compat@^4.2.0:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/eslint-plugin-compat/-/eslint-plugin-compat-4.2.0.tgz#eeaf80daa1afe495c88a47e9281295acae45c0aa"
+ integrity sha512-RDKSYD0maWy5r7zb5cWQS+uSPc26mgOzdORJ8hxILmWM7S/Ncwky7BcAtXVY5iRbKjBdHsWU8Yg7hfoZjtkv7w==
+ dependencies:
+ "@mdn/browser-compat-data" "^5.3.13"
+ ast-metadata-inferer "^0.8.0"
+ browserslist "^4.21.10"
+ caniuse-lite "^1.0.30001524"
+ find-up "^5.0.0"
+ lodash.memoize "^4.1.2"
+ semver "^7.5.4"
+
+eslint-plugin-import@^2.29.0:
+ version "2.31.0"
+ resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.31.0.tgz#310ce7e720ca1d9c0bb3f69adfd1c6bdd7d9e0e7"
+ integrity sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==
+ dependencies:
+ "@rtsao/scc" "^1.1.0"
+ array-includes "^3.1.8"
+ array.prototype.findlastindex "^1.2.5"
+ array.prototype.flat "^1.3.2"
+ array.prototype.flatmap "^1.3.2"
+ debug "^3.2.7"
+ doctrine "^2.1.0"
+ eslint-import-resolver-node "^0.3.9"
+ eslint-module-utils "^2.12.0"
+ hasown "^2.0.2"
+ is-core-module "^2.15.1"
+ is-glob "^4.0.3"
+ minimatch "^3.1.2"
+ object.fromentries "^2.0.8"
+ object.groupby "^1.0.3"
+ object.values "^1.2.0"
+ semver "^6.3.1"
+ string.prototype.trimend "^1.0.8"
+ tsconfig-paths "^3.15.0"
+
+eslint-plugin-jest-extended@~2.0.0:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/eslint-plugin-jest-extended/-/eslint-plugin-jest-extended-2.0.3.tgz#e48ec3466bd4c698cef7e9d74963868a6962cd01"
+ integrity sha512-gPhanMUyClZHj4UqvtavRA2s7FqaMdNZQvKLz12gwkxikIKEwr4FgrnFne7/obd0bEIdpHgc0b2zwLK7BGWurw==
+ dependencies:
+ "@typescript-eslint/utils" "^5.10.0"
+
+eslint-plugin-prettier@^5.0.1:
+ version "5.2.1"
+ resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-5.2.1.tgz#d1c8f972d8f60e414c25465c163d16f209411f95"
+ integrity sha512-gH3iR3g4JfF+yYPaJYkN7jEl9QbweL/YfkoRlNnuIEHEz1vHVlCmWOS+eGGiRuzHQXdJFCOTxRgvju9b8VUmrw==
+ dependencies:
+ prettier-linter-helpers "^1.0.0"
+ synckit "^0.9.1"
+
+eslint-plugin-unused-imports@^3.2.0:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/eslint-plugin-unused-imports/-/eslint-plugin-unused-imports-3.2.0.tgz#63a98c9ad5f622cd9f830f70bc77739f25ccfe0d"
+ integrity sha512-6uXyn6xdINEpxE1MtDjxQsyXB37lfyO2yKGVVgtD7WEWQGORSOZjgrD6hBhvGv4/SO+TOlS+UnC6JppRqbuwGQ==
+ dependencies:
+ eslint-rule-composer "^0.3.0"
+
+eslint-rule-composer@^0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/eslint-rule-composer/-/eslint-rule-composer-0.3.0.tgz#79320c927b0c5c0d3d3d2b76c8b4a488f25bbaf9"
+ integrity sha512-bt+Sh8CtDmn2OajxvNO+BX7Wn4CIWMpTRm3MaiKPCQcnnlm0CS2mhui6QaoeQugs+3Kj2ESKEEGJUdVafwhiCg==
+
+eslint-scope@^5.1.1:
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c"
+ integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==
+ dependencies:
+ esrecurse "^4.3.0"
+ estraverse "^4.1.1"
+
+eslint-scope@^7.2.2:
+ version "7.2.2"
+ resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.2.tgz#deb4f92563390f32006894af62a22dba1c46423f"
+ integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==
+ dependencies:
+ esrecurse "^4.3.0"
+ estraverse "^5.2.0"
+
+eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3:
+ version "3.4.3"
+ resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800"
+ integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==
+
+eslint@^8.55.0:
+ version "8.57.1"
+ resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.57.1.tgz#7df109654aba7e3bbe5c8eae533c5e461d3c6ca9"
+ integrity sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==
+ dependencies:
+ "@eslint-community/eslint-utils" "^4.2.0"
+ "@eslint-community/regexpp" "^4.6.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.2.0"
+ ajv "^6.12.4"
+ chalk "^4.0.0"
+ cross-spawn "^7.0.2"
+ debug "^4.3.2"
+ 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.4.2"
+ esutils "^2.0.2"
+ fast-deep-equal "^3.1.3"
+ file-entry-cache "^6.0.1"
+ find-up "^5.0.0"
+ glob-parent "^6.0.2"
+ globals "^13.19.0"
+ graphemer "^1.4.0"
+ ignore "^5.2.0"
+ imurmurhash "^0.1.4"
+ is-glob "^4.0.0"
+ 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.3"
+ strip-ansi "^6.0.1"
+ text-table "^0.2.0"
+
+esniff@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/esniff/-/esniff-2.0.1.tgz#a4d4b43a5c71c7ec51c51098c1d8a29081f9b308"
+ integrity sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==
+ dependencies:
+ d "^1.0.1"
+ es5-ext "^0.10.62"
+ event-emitter "^0.3.5"
+ type "^2.7.2"
+
+espree@^9.0.0, espree@^9.6.0, espree@^9.6.1:
+ version "9.6.1"
+ resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f"
+ integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==
+ dependencies:
+ acorn "^8.9.0"
+ acorn-jsx "^5.3.2"
+ eslint-visitor-keys "^3.4.1"
+
+esquery@^1.4.2:
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.6.0.tgz#91419234f804d852a82dceec3e16cdc22cf9dae7"
+ integrity sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==
+ dependencies:
+ estraverse "^5.1.0"
+
+esrecurse@^4.3.0:
+ version "4.3.0"
+ resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921"
+ integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==
+ dependencies:
+ estraverse "^5.2.0"
+
+estraverse@^4.1.1:
+ version "4.3.0"
+ resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d"
+ integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==
+
+estraverse@^5.1.0, estraverse@^5.2.0:
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123"
+ integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==
+
+esutils@^2.0.2:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64"
+ integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==
+
+etag@~1.8.1:
+ version "1.8.1"
+ resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887"
+ integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==
+
+eth-ens-namehash@2.0.8:
+ version "2.0.8"
+ resolved "https://registry.yarnpkg.com/eth-ens-namehash/-/eth-ens-namehash-2.0.8.tgz#229ac46eca86d52e0c991e7cb2aef83ff0f68bcf"
+ integrity sha512-VWEI1+KJfz4Km//dadyvBBoBeSQ0MHTXPvr8UIXiLW6IanxvAV+DmlZAijZwAyggqGUfwQBeHf7tc9wzc1piSw==
+ dependencies:
+ idna-uts46-hx "^2.3.1"
+ js-sha3 "^0.5.7"
+
+eth-lib@0.2.8:
+ version "0.2.8"
+ resolved "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz"
+ integrity sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==
+ dependencies:
+ bn.js "^4.11.6"
+ elliptic "^6.4.0"
+ xhr-request-promise "^0.1.2"
+
+eth-lib@^0.1.26:
+ version "0.1.29"
+ resolved "https://registry.yarnpkg.com/eth-lib/-/eth-lib-0.1.29.tgz#0c11f5060d42da9f931eab6199084734f4dbd1d9"
+ integrity sha512-bfttrr3/7gG4E02HoWTDUcDDslN003OlOoBxk9virpAZQ1ja/jDgwkWB8QfJF7ojuEowrqy+lzp9VcJG7/k5bQ==
+ dependencies:
+ bn.js "^4.11.6"
+ elliptic "^6.4.0"
+ nano-json-stream-parser "^0.1.2"
+ servify "^0.1.12"
+ ws "^3.0.0"
+ xhr-request-promise "^0.1.2"
+
+ethereum-bloom-filters@^1.0.6:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/ethereum-bloom-filters/-/ethereum-bloom-filters-1.2.0.tgz#8294f074c1a6cbd32c39d2cc77ce86ff14797dab"
+ integrity sha512-28hyiE7HVsWubqhpVLVmZXFd4ITeHi+BUu05o9isf0GUpMtzBUi+8/gFrGaGYzvGAJQmJ3JKj77Mk9G98T84rA==
+ dependencies:
+ "@noble/hashes" "^1.4.0"
+
+ethereum-cryptography@0.1.3, ethereum-cryptography@^0.1.3:
+ version "0.1.3"
+ resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz#8d6143cfc3d74bf79bbd8edecdf29e4ae20dd191"
+ integrity sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==
+ dependencies:
+ "@types/pbkdf2" "^3.0.0"
+ "@types/secp256k1" "^4.0.1"
+ blakejs "^1.1.0"
+ 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.0"
+ pbkdf2 "^3.0.17"
+ randombytes "^2.1.0"
+ safe-buffer "^5.1.2"
+ scrypt-js "^3.0.0"
+ secp256k1 "^4.0.1"
+ setimmediate "^1.0.5"
+
+ethereum-cryptography@^1.0.3:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-1.2.0.tgz#5ccfa183e85fdaf9f9b299a79430c044268c9b3a"
+ 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"
+
+ethereum-cryptography@^2.0.0, ethereum-cryptography@^2.1.2:
+ version "2.2.1"
+ resolved "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-2.2.1.tgz"
+ 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"
+
+ethereumjs-abi@^0.6.8:
+ version "0.6.8"
+ resolved "https://registry.yarnpkg.com/ethereumjs-abi/-/ethereumjs-abi-0.6.8.tgz#71bc152db099f70e62f108b7cdfca1b362c6fcae"
+ integrity sha512-Tx0r/iXI6r+lRsdvkFDlut0N08jWMnKRZ6Gkq+Nmw75lZe4e6o3EkSnkaBP5NF6+m5PTGAr9JP43N3LyeoglsA==
+ dependencies:
+ bn.js "^4.11.8"
+ ethereumjs-util "^6.0.0"
+
+ethereumjs-util@^6.0.0, ethereumjs-util@^6.2.1:
+ version "6.2.1"
+ resolved "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz"
+ integrity sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw==
+ dependencies:
+ "@types/bn.js" "^4.11.3"
+ bn.js "^4.11.0"
+ create-hash "^1.1.2"
+ elliptic "^6.5.2"
+ ethereum-cryptography "^0.1.3"
+ ethjs-util "0.1.6"
+ rlp "^2.2.3"
+
+ethereumjs-util@^7.1.4, ethereumjs-util@^7.1.5:
+ version "7.1.5"
+ resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz#9ecf04861e4fbbeed7465ece5f23317ad1129181"
+ integrity sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==
+ dependencies:
+ "@types/bn.js" "^5.1.0"
+ bn.js "^5.1.2"
+ create-hash "^1.1.2"
+ ethereum-cryptography "^0.1.3"
+ rlp "^2.2.4"
+
+ethers@^5.7.0, ethers@^5.7.2, ethers@^6.7.0, ethers@~5.7.0:
+ version "5.7.2"
+ resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.7.2.tgz#3a7deeabbb8c030d4126b24f84e525466145872e"
+ integrity sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==
+ dependencies:
+ "@ethersproject/abi" "5.7.0"
+ "@ethersproject/abstract-provider" "5.7.0"
+ "@ethersproject/abstract-signer" "5.7.0"
+ "@ethersproject/address" "5.7.0"
+ "@ethersproject/base64" "5.7.0"
+ "@ethersproject/basex" "5.7.0"
+ "@ethersproject/bignumber" "5.7.0"
+ "@ethersproject/bytes" "5.7.0"
+ "@ethersproject/constants" "5.7.0"
+ "@ethersproject/contracts" "5.7.0"
+ "@ethersproject/hash" "5.7.0"
+ "@ethersproject/hdnode" "5.7.0"
+ "@ethersproject/json-wallets" "5.7.0"
+ "@ethersproject/keccak256" "5.7.0"
+ "@ethersproject/logger" "5.7.0"
+ "@ethersproject/networks" "5.7.1"
+ "@ethersproject/pbkdf2" "5.7.0"
+ "@ethersproject/properties" "5.7.0"
+ "@ethersproject/providers" "5.7.2"
+ "@ethersproject/random" "5.7.0"
+ "@ethersproject/rlp" "5.7.0"
+ "@ethersproject/sha2" "5.7.0"
+ "@ethersproject/signing-key" "5.7.0"
+ "@ethersproject/solidity" "5.7.0"
+ "@ethersproject/strings" "5.7.0"
+ "@ethersproject/transactions" "5.7.0"
+ "@ethersproject/units" "5.7.0"
+ "@ethersproject/wallet" "5.7.0"
+ "@ethersproject/web" "5.7.1"
+ "@ethersproject/wordlists" "5.7.0"
+
+ethjs-unit@0.1.6:
+ version "0.1.6"
+ resolved "https://registry.yarnpkg.com/ethjs-unit/-/ethjs-unit-0.1.6.tgz#c665921e476e87bce2a9d588a6fe0405b2c41699"
+ integrity sha512-/Sn9Y0oKl0uqQuvgFk/zQgR7aw1g36qX/jzSQ5lSwlO0GigPymk4eGQfeNTD03w1dPOqfz8V77Cy43jH56pagw==
+ dependencies:
+ bn.js "4.11.6"
+ number-to-bn "1.7.0"
+
+ethjs-util@0.1.6, ethjs-util@^0.1.6:
+ version "0.1.6"
+ resolved "https://registry.yarnpkg.com/ethjs-util/-/ethjs-util-0.1.6.tgz#f308b62f185f9fe6237132fb2a9818866a5cd536"
+ integrity sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w==
+ dependencies:
+ is-hex-prefixed "1.0.0"
+ strip-hex-prefix "1.0.0"
+
+event-emitter@^0.3.5:
+ version "0.3.5"
+ resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.5.tgz#df8c69eef1647923c7157b9ce83840610b02cc39"
+ integrity sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==
+ dependencies:
+ d "1"
+ es5-ext "~0.10.14"
+
+event-target-shim@^5.0.0:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789"
+ integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==
+
+eventemitter3@4.0.4:
+ version "4.0.4"
+ resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.4.tgz#b5463ace635a083d018bdc7c917b4c5f10a85384"
+ integrity sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ==
+
+events@^3.3.0:
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400"
+ integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==
+
+evp_bytestokey@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02"
+ integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==
+ dependencies:
+ md5.js "^1.3.4"
+ safe-buffer "^5.1.1"
+
+exponential-backoff@~3.1.1:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/exponential-backoff/-/exponential-backoff-3.1.1.tgz#64ac7526fe341ab18a39016cd22c787d01e00bf6"
+ integrity sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==
+
+express@^4.14.0:
+ version "4.21.1"
+ resolved "https://registry.yarnpkg.com/express/-/express-4.21.1.tgz#9dae5dda832f16b4eec941a4e44aa89ec481b281"
+ integrity sha512-YSFlK1Ee0/GC8QaO91tHcDxJiE/X4FbpAyQWkxAvG6AXCuR65YzK8ua6D9hvi/TzUfZMpc+BwuM1IPw8fmQBiQ==
+ dependencies:
+ accepts "~1.3.8"
+ array-flatten "1.1.1"
+ body-parser "1.20.3"
+ content-disposition "0.5.4"
+ content-type "~1.0.4"
+ 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.10"
+ 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"
+
+ext@^1.7.0:
+ version "1.7.0"
+ resolved "https://registry.yarnpkg.com/ext/-/ext-1.7.0.tgz#0ea4383c0103d60e70be99e9a7f11027a33c4f5f"
+ integrity sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==
+ dependencies:
+ type "^2.7.2"
+
+extend@~3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa"
+ integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==
+
+extsprintf@1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05"
+ integrity sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==
+
+extsprintf@^1.2.0:
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.1.tgz#8d172c064867f235c0c84a596806d279bf4bcc07"
+ integrity sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA==
+
+fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3:
+ version "3.1.3"
+ resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525"
+ integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==
+
+fast-diff@^1.1.2, fast-diff@^1.2.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.3.0.tgz#ece407fa550a64d638536cd727e129c61616e0f0"
+ integrity sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==
+
+fast-glob@^3.2.9, fast-glob@^3.3.0, fast-glob@^3.3.2:
+ version "3.3.2"
+ resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129"
+ integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==
+ dependencies:
+ "@nodelib/fs.stat" "^2.0.2"
+ "@nodelib/fs.walk" "^1.2.3"
+ glob-parent "^5.1.2"
+ merge2 "^1.3.0"
+ micromatch "^4.0.4"
+
+fast-json-stable-stringify@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633"
+ integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==
+
+fast-levenshtein@^2.0.6:
+ version "2.0.6"
+ resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917"
+ integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==
+
+fast-uri@^3.0.1:
+ version "3.0.3"
+ resolved "https://registry.yarnpkg.com/fast-uri/-/fast-uri-3.0.3.tgz#892a1c91802d5d7860de728f18608a0573142241"
+ integrity sha512-aLrHthzCjH5He4Z2H9YZ+v6Ujb9ocRuW6ZzkJQOrTxleEijANq4v1TsaPaVG1PZcuurEzrLcWRyYBYXD5cEiaw==
+
+fastq@^1.6.0:
+ version "1.17.1"
+ resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.17.1.tgz#2a523f07a4e7b1e81a42b91b8bf2254107753b47"
+ integrity sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==
+ dependencies:
+ reusify "^1.0.4"
+
+fecha@^4.2.0:
+ version "4.2.3"
+ resolved "https://registry.yarnpkg.com/fecha/-/fecha-4.2.3.tgz#4d9ccdbc61e8629b259fdca67e65891448d569fd"
+ integrity sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==
+
+file-entry-cache@^6.0.1:
+ version "6.0.1"
+ resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027"
+ integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==
+ dependencies:
+ flat-cache "^3.0.4"
+
+fill-range@^7.1.1:
+ version "7.1.1"
+ resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292"
+ integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==
+ dependencies:
+ to-regex-range "^5.0.1"
+
+finalhandler@1.3.1:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.3.1.tgz#0c575f1d1d324ddd1da35ad7ece3df7d19088019"
+ integrity sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==
+ 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"
+
+find-up@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7"
+ integrity sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==
+ dependencies:
+ locate-path "^2.0.0"
+
+find-up@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc"
+ integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==
+ dependencies:
+ locate-path "^6.0.0"
+ path-exists "^4.0.0"
+
+flat-cache@^3.0.4:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.2.0.tgz#2c0c2d5040c99b1632771a9d105725c0115363ee"
+ integrity sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==
+ dependencies:
+ flatted "^3.2.9"
+ keyv "^4.5.3"
+ rimraf "^3.0.2"
+
+flat@^5.0.2:
+ version "5.0.2"
+ resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241"
+ integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==
+
+flatted@^3.2.9:
+ version "3.3.1"
+ resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.1.tgz#21db470729a6734d4997002f439cb308987f567a"
+ integrity sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==
+
+fmix@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/fmix/-/fmix-0.1.0.tgz#c7bbf124dec42c9d191cfb947d0a9778dd986c0c"
+ integrity sha512-Y6hyofImk9JdzU8k5INtTXX1cu8LDlePWDFU5sftm9H+zKCr5SGrVjdhkvsim646cw5zD0nADj8oHyXMZmCZ9w==
+ dependencies:
+ imul "^1.0.0"
+
+fn.name@1.x.x:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/fn.name/-/fn.name-1.1.0.tgz#26cad8017967aea8731bc42961d04a3d5988accc"
+ integrity sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==
+
+follow-redirects@^1.12.1, follow-redirects@^1.14.0:
+ version "1.15.9"
+ resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.9.tgz#a604fa10e443bf98ca94228d9eebcc2e8a2c8ee1"
+ integrity sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==
+
+for-each@^0.3.3:
+ version "0.3.3"
+ resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e"
+ integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==
+ dependencies:
+ is-callable "^1.1.3"
+
+forever-agent@~0.6.1:
+ version "0.6.1"
+ resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91"
+ integrity sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==
+
+forge-std@^1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/forge-std/-/forge-std-1.1.2.tgz#f4a0eda103538d56f9c563f3cd1fa2fd01bd9378"
+ integrity sha512-Wfb0iAS9PcfjMKtGpWQw9mXzJxrWD62kJCUqqLcyuI0+VRtJ3j20XembjF3kS20qELYdXft1vD/SPFVWVKMFOw==
+
+form-data-encoder@1.7.1:
+ version "1.7.1"
+ resolved "https://registry.yarnpkg.com/form-data-encoder/-/form-data-encoder-1.7.1.tgz#ac80660e4f87ee0d3d3c3638b7da8278ddb8ec96"
+ integrity sha512-EFRDrsMm/kyqbTQocNvRXMLjc7Es2Vk+IQFx/YW7hkUH1eBl4J1fqiP34l74Yt0pFLCNpc06fkbVk00008mzjg==
+
+form-data-encoder@^2.1.2:
+ version "2.1.4"
+ resolved "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-2.1.4.tgz"
+ integrity sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==
+
+form-data@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.1.tgz#ba1076daaaa5bfd7e99c1a6cb02aa0a5cff90d48"
+ integrity sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==
+ dependencies:
+ asynckit "^0.4.0"
+ combined-stream "^1.0.8"
+ mime-types "^2.1.12"
+
+form-data@~2.3.2:
+ version "2.3.3"
+ resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6"
+ integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==
+ dependencies:
+ asynckit "^0.4.0"
+ combined-stream "^1.0.6"
+ mime-types "^2.1.12"
+
+forwarded@0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811"
+ integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==
+
+fp-ts@1.19.3:
+ version "1.19.3"
+ resolved "https://registry.npmjs.org/fp-ts/-/fp-ts-1.19.3.tgz"
+ integrity sha512-H5KQDspykdHuztLTg+ajGN0Z2qUjcEf3Ybxc6hLt0k7/zPkn29XnKnxlBPyW2XIddWrGaJBzBl4VLYOtk39yZg==
+
+fp-ts@^1.0.0:
+ version "1.19.5"
+ resolved "https://registry.yarnpkg.com/fp-ts/-/fp-ts-1.19.5.tgz#3da865e585dfa1fdfd51785417357ac50afc520a"
+ integrity sha512-wDNqTimnzs8QqpldiId9OavWK2NptormjXnRJTQecNjzwfyp6P/8s/zG8e4h3ja3oqkKaY72UlTjQYt/1yXf9A==
+
+fp-ts@^2.16.2:
+ version "2.16.9"
+ resolved "https://registry.yarnpkg.com/fp-ts/-/fp-ts-2.16.9.tgz#99628fc5e0bb3b432c4a16d8f4455247380bae8a"
+ integrity sha512-+I2+FnVB+tVaxcYyQkHUq7ZdKScaBlX53A41mxQtpIccsfyv8PzdzP7fzp2AY832T4aoK6UZ5WRX/ebGd8uZuQ==
+
+fresh@0.5.2:
+ version "0.5.2"
+ resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7"
+ integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==
+
+fs-extra@^10.0.0:
+ version "10.1.0"
+ resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf"
+ integrity sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==
+ dependencies:
+ graceful-fs "^4.2.0"
+ jsonfile "^6.0.1"
+ universalify "^2.0.0"
+
+fs-extra@^4.0.2:
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-4.0.3.tgz#0d852122e5bc5beb453fb028e9c0c9bf36340c94"
+ integrity sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==
+ dependencies:
+ graceful-fs "^4.1.2"
+ jsonfile "^4.0.0"
+ universalify "^0.1.0"
+
+fs-extra@^7.0.1:
+ version "7.0.1"
+ resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9"
+ integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==
+ dependencies:
+ graceful-fs "^4.1.2"
+ jsonfile "^4.0.0"
+ universalify "^0.1.0"
+
+fs-minipass@^1.2.7:
+ version "1.2.7"
+ resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.7.tgz#ccff8570841e7fe4265693da88936c55aed7f7c7"
+ integrity sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==
+ dependencies:
+ minipass "^2.6.0"
+
+fs.realpath@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
+ integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==
+
+fsevents@~2.3.2:
+ version "2.3.3"
+ resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6"
+ integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==
+
+function-bind@^1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c"
+ integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==
+
+function.prototype.name@^1.1.6:
+ version "1.1.6"
+ resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.6.tgz#cdf315b7d90ee77a4c6ee216c3c3362da07533fd"
+ integrity sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.2.0"
+ es-abstract "^1.22.1"
+ functions-have-names "^1.2.3"
+
+functions-have-names@^1.2.3:
+ version "1.2.3"
+ resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834"
+ integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==
+
+gensync@^1.0.0-beta.2:
+ version "1.0.0-beta.2"
+ resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0"
+ integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==
+
+get-caller-file@^2.0.5:
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e"
+ integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==
+
+get-func-name@^2.0.1, get-func-name@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.2.tgz#0d7cf20cd13fda808669ffa88f4ffc7a3943fc41"
+ integrity sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==
+
+get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.3, get-intrinsic@^1.2.4:
+ version "1.2.4"
+ resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd"
+ integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==
+ dependencies:
+ es-errors "^1.3.0"
+ function-bind "^1.1.2"
+ has-proto "^1.0.1"
+ has-symbols "^1.0.3"
+ hasown "^2.0.0"
+
+get-stdin@^9.0.0:
+ version "9.0.0"
+ resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-9.0.0.tgz#3983ff82e03d56f1b2ea0d3e60325f39d703a575"
+ integrity sha512-dVKBjfWisLAicarI2Sf+JuBE/DghV4UzNAVe9yhEJuzeREd3JhOTE9cUaJTeSa77fsbQUK3pcOpJfM59+VKZaA==
+
+get-stream@^5.1.0:
+ version "5.2.0"
+ resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3"
+ integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==
+ dependencies:
+ pump "^3.0.0"
+
+get-stream@^6.0.1:
+ version "6.0.1"
+ resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7"
+ integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==
+
+get-symbol-description@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.2.tgz#533744d5aa20aca4e079c8e5daf7fd44202821f5"
+ integrity sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==
+ dependencies:
+ call-bind "^1.0.5"
+ es-errors "^1.3.0"
+ get-intrinsic "^1.2.4"
+
+get-tsconfig@^4.7.5:
+ version "4.8.1"
+ resolved "https://registry.yarnpkg.com/get-tsconfig/-/get-tsconfig-4.8.1.tgz#8995eb391ae6e1638d251118c7b56de7eb425471"
+ integrity sha512-k9PN+cFBmaLWtVz29SkUoqU5O0slLuHJXt/2P+tMVFT+phsSGXGkp9t3rQIqdz0e+06EHNGs3oM6ZX1s2zHxRg==
+ dependencies:
+ resolve-pkg-maps "^1.0.0"
+
+getpass@^0.1.1:
+ version "0.1.7"
+ resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa"
+ integrity sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==
+ dependencies:
+ assert-plus "^1.0.0"
+
+git-hooks-list@^3.0.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/git-hooks-list/-/git-hooks-list-3.1.0.tgz#386dc531dcc17474cf094743ff30987a3d3e70fc"
+ integrity sha512-LF8VeHeR7v+wAbXqfgRlTSX/1BJR9Q1vEMR8JAz1cEg6GX07+zyj3sAdDvYjj/xnlIfVuGgj4qBei1K3hKH+PA==
+
+glob-parent@^5.1.2, glob-parent@~5.1.2:
+ version "5.1.2"
+ resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4"
+ integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==
+ dependencies:
+ is-glob "^4.0.1"
+
+glob-parent@^6.0.2:
+ version "6.0.2"
+ resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3"
+ integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==
+ dependencies:
+ is-glob "^4.0.3"
+
+glob@7.2.0, glob@^7.1.3:
+ version "7.2.0"
+ resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023"
+ integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==
+ dependencies:
+ fs.realpath "^1.0.0"
+ inflight "^1.0.4"
+ inherits "2"
+ minimatch "^3.0.4"
+ once "^1.3.0"
+ path-is-absolute "^1.0.0"
+
+glob@^8.0.3, glob@^8.1.0:
+ version "8.1.0"
+ resolved "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz"
+ integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==
+ dependencies:
+ fs.realpath "^1.0.0"
+ inflight "^1.0.4"
+ inherits "2"
+ minimatch "^5.0.1"
+ once "^1.3.0"
+
+global@~4.4.0:
+ version "4.4.0"
+ resolved "https://registry.yarnpkg.com/global/-/global-4.4.0.tgz#3e7b105179006a323ed71aafca3e9c57a5cc6406"
+ integrity sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==
+ dependencies:
+ min-document "^2.19.0"
+ process "^0.11.10"
+
+globals@^11.1.0:
+ version "11.12.0"
+ resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e"
+ integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==
+
+globals@^13.19.0:
+ version "13.24.0"
+ resolved "https://registry.yarnpkg.com/globals/-/globals-13.24.0.tgz#8432a19d78ce0c1e833949c36adb345400bb1171"
+ integrity sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==
+ dependencies:
+ type-fest "^0.20.2"
+
+globalthis@^1.0.3:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.4.tgz#7430ed3a975d97bfb59bcce41f5cabbafa651236"
+ integrity sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==
+ dependencies:
+ define-properties "^1.2.1"
+ gopd "^1.0.1"
+
+globby@^11.1.0:
+ version "11.1.0"
+ resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b"
+ integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==
+ dependencies:
+ array-union "^2.1.0"
+ dir-glob "^3.0.1"
+ fast-glob "^3.2.9"
+ ignore "^5.2.0"
+ merge2 "^1.4.1"
+ slash "^3.0.0"
+
+globby@^13.1.2:
+ version "13.2.2"
+ resolved "https://registry.yarnpkg.com/globby/-/globby-13.2.2.tgz#63b90b1bf68619c2135475cbd4e71e66aa090592"
+ integrity sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==
+ dependencies:
+ dir-glob "^3.0.1"
+ fast-glob "^3.3.0"
+ ignore "^5.2.4"
+ merge2 "^1.4.1"
+ slash "^4.0.0"
+
+gopd@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c"
+ integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==
+ dependencies:
+ get-intrinsic "^1.1.3"
+
+got@12.1.0:
+ version "12.1.0"
+ resolved "https://registry.npmjs.org/got/-/got-12.1.0.tgz"
+ integrity sha512-hBv2ty9QN2RdbJJMK3hesmSkFTjVIHyIDDbssCKnSmq62edGgImJWD10Eb1k77TiV1bxloxqcFAVK8+9pkhOig==
+ dependencies:
+ "@sindresorhus/is" "^4.6.0"
+ "@szmarczak/http-timer" "^5.0.1"
+ "@types/cacheable-request" "^6.0.2"
+ "@types/responselike" "^1.0.0"
+ cacheable-lookup "^6.0.4"
+ cacheable-request "^7.0.2"
+ decompress-response "^6.0.0"
+ form-data-encoder "1.7.1"
+ get-stream "^6.0.1"
+ http2-wrapper "^2.1.10"
+ lowercase-keys "^3.0.0"
+ p-cancelable "^3.0.0"
+ responselike "^2.0.0"
+
+got@^11.8.5:
+ version "11.8.6"
+ resolved "https://registry.yarnpkg.com/got/-/got-11.8.6.tgz#276e827ead8772eddbcfc97170590b841823233a"
+ integrity sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==
+ dependencies:
+ "@sindresorhus/is" "^4.0.0"
+ "@szmarczak/http-timer" "^4.0.5"
+ "@types/cacheable-request" "^6.0.1"
+ "@types/responselike" "^1.0.0"
+ cacheable-lookup "^5.0.3"
+ cacheable-request "^7.0.2"
+ decompress-response "^6.0.0"
+ http2-wrapper "^1.0.0-beta.5.2"
+ lowercase-keys "^2.0.0"
+ p-cancelable "^2.0.0"
+ responselike "^2.0.0"
+
+got@^12.1.0:
+ version "12.6.1"
+ resolved "https://registry.yarnpkg.com/got/-/got-12.6.1.tgz#8869560d1383353204b5a9435f782df9c091f549"
+ integrity sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ==
+ dependencies:
+ "@sindresorhus/is" "^5.2.0"
+ "@szmarczak/http-timer" "^5.0.1"
+ cacheable-lookup "^7.0.0"
+ cacheable-request "^10.2.8"
+ decompress-response "^6.0.0"
+ form-data-encoder "^2.1.2"
+ get-stream "^6.0.1"
+ http2-wrapper "^2.1.10"
+ lowercase-keys "^3.0.0"
+ p-cancelable "^3.0.0"
+ responselike "^3.0.0"
+
+graceful-fs@4.2.10:
+ version "4.2.10"
+ resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz"
+ integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==
+
+graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4:
+ version "4.2.11"
+ resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3"
+ integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==
+
+gradient-string@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/gradient-string/-/gradient-string-1.2.0.tgz#93f39f2c7c8dcb095608c2ccf0aac24aa315fbac"
+ integrity sha512-Lxog7IDMMWNjwo4O0KbdBvSewk4vW6kQe5XaLuuPCyCE65AGQ1P8YqKJa5dq8TYf/Ge31F+KjWzPR5mAJvjlAg==
+ dependencies:
+ chalk "^2.4.1"
+ tinygradient "^0.4.1"
+
+graphemer@^1.4.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6"
+ integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==
+
+har-schema@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92"
+ integrity sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==
+
+har-validator@~5.1.3:
+ version "5.1.5"
+ resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.5.tgz#1f0803b9f8cb20c0fa13822df1ecddb36bde1efd"
+ integrity sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==
+ dependencies:
+ ajv "^6.12.3"
+ har-schema "^2.0.0"
+
+hardhat-contract-sizer@^2.10.0:
+ version "2.10.0"
+ resolved "https://registry.yarnpkg.com/hardhat-contract-sizer/-/hardhat-contract-sizer-2.10.0.tgz#72646f43bfe50e9a5702c9720c9bc3e77d93a2c9"
+ integrity sha512-QiinUgBD5MqJZJh1hl1jc9dNnpJg7eE/w4/4GEnrcmZJJTDbVFNe3+/3Ep24XqISSkYxRz36czcPHKHd/a0dwA==
+ dependencies:
+ chalk "^4.0.0"
+ cli-table3 "^0.6.0"
+ strip-ansi "^6.0.0"
+
+hardhat-deploy@^0.12.1:
+ version "0.12.4"
+ resolved "https://registry.yarnpkg.com/hardhat-deploy/-/hardhat-deploy-0.12.4.tgz#5ebef37f1004f52a74987213b0465ad7c9433fb2"
+ integrity sha512-bYO8DIyeGxZWlhnMoCBon9HNZb6ji0jQn7ngP1t5UmGhC8rQYhji7B73qETMOFhzt5ECZPr+U52duj3nubsqdQ==
+ dependencies:
+ "@ethersproject/abi" "^5.7.0"
+ "@ethersproject/abstract-signer" "^5.7.0"
+ "@ethersproject/address" "^5.7.0"
+ "@ethersproject/bignumber" "^5.7.0"
+ "@ethersproject/bytes" "^5.7.0"
+ "@ethersproject/constants" "^5.7.0"
+ "@ethersproject/contracts" "^5.7.0"
+ "@ethersproject/providers" "^5.7.2"
+ "@ethersproject/solidity" "^5.7.0"
+ "@ethersproject/transactions" "^5.7.0"
+ "@ethersproject/wallet" "^5.7.0"
+ "@types/qs" "^6.9.7"
+ axios "^0.21.1"
+ chalk "^4.1.2"
+ chokidar "^3.5.2"
+ debug "^4.3.2"
+ enquirer "^2.3.6"
+ ethers "^5.7.0"
+ form-data "^4.0.0"
+ fs-extra "^10.0.0"
+ match-all "^1.2.6"
+ murmur-128 "^0.2.1"
+ qs "^6.9.4"
+ zksync-ethers "^5.0.0"
+
+hardhat@^2.22.10:
+ version "2.22.13"
+ resolved "https://registry.npmjs.org/hardhat/-/hardhat-2.22.13.tgz"
+ integrity sha512-psVJX4FSXDpSXwsU8OcKTJN04pQEj9cFBMX5OPko+OFwbIoiOpvRmafa954/UaA1934npTj8sV3gaTSdx9bPbA==
+ dependencies:
+ "@ethersproject/abi" "^5.1.2"
+ "@metamask/eth-sig-util" "^4.0.0"
+ "@nomicfoundation/edr" "^0.6.3"
+ "@nomicfoundation/ethereumjs-common" "4.0.4"
+ "@nomicfoundation/ethereumjs-tx" "5.0.4"
+ "@nomicfoundation/ethereumjs-util" "9.0.4"
+ "@nomicfoundation/solidity-analyzer" "^0.1.0"
+ "@sentry/node" "^5.18.1"
+ "@types/bn.js" "^5.1.0"
+ "@types/lru-cache" "^5.1.0"
+ adm-zip "^0.4.16"
+ aggregate-error "^3.0.0"
+ ansi-escapes "^4.3.0"
+ boxen "^5.1.2"
+ chalk "^2.4.2"
+ chokidar "^4.0.0"
+ ci-info "^2.0.0"
+ debug "^4.1.1"
+ enquirer "^2.3.0"
+ env-paths "^2.2.0"
+ ethereum-cryptography "^1.0.3"
+ ethereumjs-abi "^0.6.8"
+ find-up "^2.1.0"
+ fp-ts "1.19.3"
+ fs-extra "^7.0.1"
+ glob "7.2.0"
+ immutable "^4.0.0-rc.12"
+ io-ts "1.10.4"
+ json-stream-stringify "^3.1.4"
+ keccak "^3.0.2"
+ lodash "^4.17.11"
+ mnemonist "^0.38.0"
+ mocha "^10.0.0"
+ p-map "^4.0.0"
+ raw-body "^2.4.1"
+ resolve "1.17.0"
+ semver "^6.3.0"
+ solc "0.8.26"
+ source-map-support "^0.5.13"
+ stacktrace-parser "^0.1.10"
+ tsort "0.0.1"
+ undici "^5.14.0"
+ uuid "^8.3.2"
+ ws "^7.4.6"
+
+has-bigints@^1.0.1, has-bigints@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa"
+ integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==
+
+has-flag@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
+ integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==
+
+has-flag@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b"
+ integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==
+
+has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854"
+ integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==
+ dependencies:
+ es-define-property "^1.0.0"
+
+has-proto@^1.0.1, has-proto@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.3.tgz#b31ddfe9b0e6e9914536a6ab286426d0214f77fd"
+ integrity sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==
+
+has-symbols@^1.0.2, has-symbols@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8"
+ integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==
+
+has-tostringtag@^1.0.0, has-tostringtag@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc"
+ integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==
+ dependencies:
+ has-symbols "^1.0.3"
+
+hash-base@^3.0.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.1.0.tgz#55c381d9e06e1d2997a883b4a3fddfe7f0d3af33"
+ integrity sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==
+ dependencies:
+ inherits "^2.0.4"
+ readable-stream "^3.6.0"
+ safe-buffer "^5.2.0"
+
+hash.js@1.1.7, hash.js@^1.0.0, hash.js@^1.0.3, hash.js@^1.1.7:
+ version "1.1.7"
+ resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42"
+ integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==
+ dependencies:
+ inherits "^2.0.3"
+ minimalistic-assert "^1.0.1"
+
+hasown@^2.0.0, hasown@^2.0.1, hasown@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003"
+ integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==
+ dependencies:
+ function-bind "^1.1.2"
+
+he@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f"
+ integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==
+
+hmac-drbg@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1"
+ integrity sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==
+ dependencies:
+ hash.js "^1.0.3"
+ minimalistic-assert "^1.0.0"
+ minimalistic-crypto-utils "^1.0.1"
+
+http-cache-semantics@^4.0.0, http-cache-semantics@^4.1.1:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz#abe02fcb2985460bf0323be664436ec3476a6d5a"
+ integrity sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==
+
+http-errors@2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3"
+ integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==
+ dependencies:
+ depd "2.0.0"
+ inherits "2.0.4"
+ setprototypeof "1.2.0"
+ statuses "2.0.1"
+ toidentifier "1.0.1"
+
+http-https@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/http-https/-/http-https-1.0.0.tgz#2f908dd5f1db4068c058cd6e6d4ce392c913389b"
+ integrity sha512-o0PWwVCSp3O0wS6FvNr6xfBCHgt0m1tvPLFOCc2iFDKTRAXhB7m8klDf7ErowFH8POa6dVdGatKU5I1YYwzUyg==
+
+http-signature@~1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1"
+ integrity sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==
+ dependencies:
+ assert-plus "^1.0.0"
+ jsprim "^1.2.2"
+ sshpk "^1.7.0"
+
+http2-wrapper@^1.0.0-beta.5.2:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/http2-wrapper/-/http2-wrapper-1.0.3.tgz#b8f55e0c1f25d4ebd08b3b0c2c079f9590800b3d"
+ integrity sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==
+ dependencies:
+ quick-lru "^5.1.1"
+ resolve-alpn "^1.0.0"
+
+http2-wrapper@^2.1.10:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/http2-wrapper/-/http2-wrapper-2.2.1.tgz#310968153dcdedb160d8b72114363ef5fce1f64a"
+ integrity sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==
+ dependencies:
+ quick-lru "^5.1.1"
+ resolve-alpn "^1.2.0"
+
+https-proxy-agent@^5.0.0:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6"
+ integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==
+ dependencies:
+ agent-base "6"
+ debug "4"
+
+iconv-lite@0.4.24:
+ version "0.4.24"
+ resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b"
+ integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==
+ dependencies:
+ safer-buffer ">= 2.1.2 < 3"
+
+idna-uts46-hx@^2.3.1:
+ version "2.3.1"
+ resolved "https://registry.yarnpkg.com/idna-uts46-hx/-/idna-uts46-hx-2.3.1.tgz#a1dc5c4df37eee522bf66d969cc980e00e8711f9"
+ integrity sha512-PWoF9Keq6laYdIRwwCdhTPl60xRqAloYNMQLiyUnG42VjT53oW07BXIRM+NK7eQjzXjAk2gUvX9caRxlnF9TAA==
+ dependencies:
+ punycode "2.1.0"
+
+ieee754@^1.1.13, ieee754@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352"
+ integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==
+
+ignore@^5.2.0, ignore@^5.2.4, ignore@^5.3.1:
+ version "5.3.2"
+ resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5"
+ integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==
+
+immer@10.0.2:
+ version "10.0.2"
+ resolved "https://registry.yarnpkg.com/immer/-/immer-10.0.2.tgz#11636c5b77acf529e059582d76faf338beb56141"
+ integrity sha512-Rx3CqeqQ19sxUtYV9CU911Vhy8/721wRFnJv3REVGWUmoAcIwzifTsdmJte/MV+0/XpM35LZdQMBGkRIoLPwQA==
+
+immutable@^4.0.0-rc.12:
+ version "4.3.7"
+ resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.3.7.tgz#c70145fc90d89fb02021e65c84eb0226e4e5a381"
+ integrity sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw==
+
+import-fresh@^3.2.1, import-fresh@^3.3.0:
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b"
+ integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==
+ dependencies:
+ parent-module "^1.0.0"
+ resolve-from "^4.0.0"
+
+imul@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/imul/-/imul-1.0.1.tgz#9d5867161e8b3de96c2c38d5dc7cb102f35e2ac9"
+ integrity sha512-WFAgfwPLAjU66EKt6vRdTlKj4nAgIDQzh29JonLa4Bqtl6D8JrIMvWjCnx7xEjVNmP3U0fM5o8ZObk7d0f62bA==
+
+imurmurhash@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea"
+ integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==
+
+indent-string@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251"
+ integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==
+
+inflight@^1.0.4:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
+ integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==
+ dependencies:
+ once "^1.3.0"
+ wrappy "1"
+
+inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
+ integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
+
+ini@^1.3.4, ini@~1.3.0:
+ version "1.3.8"
+ resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c"
+ integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==
+
+ink-gradient@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/ink-gradient/-/ink-gradient-2.0.0.tgz#2e2b040ab41f96f61b397d87cd56fd6ce9ef59cc"
+ integrity sha512-d2BK/EzzBRoDL54NWkS3JGE4J8xtzwRVWxDAIkQ/eQ60XIzrFMtT5JlUqgV05Qlt32Jvk50qW51YqxGJggTuqA==
+ dependencies:
+ gradient-string "^1.2.0"
+ prop-types "^15.7.2"
+ strip-ansi "^6.0.0"
+
+ink-table@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/ink-table/-/ink-table-3.1.0.tgz#d450624e344702b5cb7cadcb25783c58555c7c54"
+ integrity sha512-qxVb4DIaEaJryvF9uZGydnmP9Hkmas3DCKVpEcBYC0E4eJd3qNgNe+PZKuzgCERFe9LfAS1TNWxCr9+AU4v3YA==
+ dependencies:
+ object-hash "^2.0.3"
+
+ink@^3.2.0:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/ink/-/ink-3.2.0.tgz#434793630dc57d611c8fe8fffa1db6b56f1a16bb"
+ integrity sha512-firNp1q3xxTzoItj/eOOSZQnYSlyrWks5llCTVX37nJ59K3eXbQ8PtzCguqo8YI19EELo5QxaKnJd4VxzhU8tg==
+ dependencies:
+ ansi-escapes "^4.2.1"
+ auto-bind "4.0.0"
+ chalk "^4.1.0"
+ cli-boxes "^2.2.0"
+ 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.20"
+ patch-console "^1.0.0"
+ react-devtools-core "^4.19.1"
+ react-reconciler "^0.26.2"
+ scheduler "^0.20.2"
+ signal-exit "^3.0.2"
+ slice-ansi "^3.0.0"
+ stack-utils "^2.0.2"
+ string-width "^4.2.2"
+ type-fest "^0.12.0"
+ widest-line "^3.1.0"
+ wrap-ansi "^6.2.0"
+ ws "^7.5.5"
+ yoga-layout-prebuilt "^1.9.6"
+
+internal-slot@^1.0.7:
+ version "1.0.7"
+ resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.7.tgz#c06dcca3ed874249881007b0a5523b172a190802"
+ integrity sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==
+ dependencies:
+ es-errors "^1.3.0"
+ hasown "^2.0.0"
+ side-channel "^1.0.4"
+
+io-ts@1.10.4:
+ version "1.10.4"
+ resolved "https://registry.yarnpkg.com/io-ts/-/io-ts-1.10.4.tgz#cd5401b138de88e4f920adbcb7026e2d1967e6e2"
+ integrity sha512-b23PteSnYXSONJ6JQXRAlvJhuw8KOtkqa87W4wDtvMrud/DTJd5X+NpOOI+O/zZwVq6v0VLAaJ+1EDViKEuN9g==
+ dependencies:
+ fp-ts "^1.0.0"
+
+ipaddr.js@1.9.1:
+ version "1.9.1"
+ resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3"
+ integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==
+
+is-arguments@^1.0.4:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b"
+ integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==
+ dependencies:
+ call-bind "^1.0.2"
+ has-tostringtag "^1.0.0"
+
+is-array-buffer@^3.0.4:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.4.tgz#7a1f92b3d61edd2bc65d24f130530ea93d7fae98"
+ integrity sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==
+ dependencies:
+ call-bind "^1.0.2"
+ get-intrinsic "^1.2.1"
+
+is-arrayish@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d"
+ integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==
+
+is-arrayish@^0.3.1:
+ version "0.3.2"
+ resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03"
+ integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==
+
+is-bigint@^1.0.1:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3"
+ integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==
+ dependencies:
+ has-bigints "^1.0.1"
+
+is-binary-path@~2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09"
+ integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==
+ dependencies:
+ binary-extensions "^2.0.0"
+
+is-boolean-object@^1.1.0:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719"
+ integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==
+ dependencies:
+ call-bind "^1.0.2"
+ has-tostringtag "^1.0.0"
+
+is-bun-module@^1.0.2:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/is-bun-module/-/is-bun-module-1.2.1.tgz#495e706f42e29f086fd5fe1ac3c51f106062b9fc"
+ integrity sha512-AmidtEM6D6NmUiLOvvU7+IePxjEjOzra2h0pSrsfSAcXwl/83zLLXDByafUJy9k/rKK0pvXMLdwKwGHlX2Ke6Q==
+ dependencies:
+ semver "^7.6.3"
+
+is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7:
+ version "1.2.7"
+ resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055"
+ integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==
+
+is-ci@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c"
+ integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==
+ dependencies:
+ ci-info "^2.0.0"
+
+is-core-module@^2.13.0, is-core-module@^2.15.1:
+ version "2.15.1"
+ resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.15.1.tgz#a7363a25bee942fefab0de13bf6aa372c82dcc37"
+ integrity sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==
+ dependencies:
+ hasown "^2.0.2"
+
+is-data-view@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/is-data-view/-/is-data-view-1.0.1.tgz#4b4d3a511b70f3dc26d42c03ca9ca515d847759f"
+ integrity sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==
+ dependencies:
+ is-typed-array "^1.1.13"
+
+is-date-object@^1.0.1:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f"
+ integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==
+ dependencies:
+ has-tostringtag "^1.0.0"
+
+is-extglob@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
+ integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==
+
+is-fullwidth-code-point@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d"
+ integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==
+
+is-function@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/is-function/-/is-function-1.0.2.tgz#4f097f30abf6efadac9833b17ca5dc03f8144e08"
+ integrity sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==
+
+is-generator-function@^1.0.7:
+ version "1.0.10"
+ resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72"
+ integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==
+ dependencies:
+ has-tostringtag "^1.0.0"
+
+is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1:
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084"
+ integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==
+ dependencies:
+ is-extglob "^2.1.1"
+
+is-hex-prefixed@1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz#7d8d37e6ad77e5d127148913c573e082d777f554"
+ integrity sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA==
+
+is-negative-zero@^2.0.3:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.3.tgz#ced903a027aca6381b777a5743069d7376a49747"
+ integrity sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==
+
+is-number-object@^1.0.4:
+ version "1.0.7"
+ resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc"
+ integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==
+ dependencies:
+ has-tostringtag "^1.0.0"
+
+is-number@^7.0.0:
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b"
+ integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==
+
+is-path-inside@^3.0.3:
+ version "3.0.3"
+ resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283"
+ integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==
+
+is-plain-obj@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287"
+ integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==
+
+is-plain-obj@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-4.1.0.tgz#d65025edec3657ce032fd7db63c97883eaed71f0"
+ integrity sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==
+
+is-regex@^1.1.4:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958"
+ integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==
+ dependencies:
+ call-bind "^1.0.2"
+ has-tostringtag "^1.0.0"
+
+is-shared-array-buffer@^1.0.2, is-shared-array-buffer@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz#1237f1cba059cdb62431d378dcc37d9680181688"
+ integrity sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==
+ dependencies:
+ call-bind "^1.0.7"
+
+is-stream@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077"
+ integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==
+
+is-string@^1.0.5, is-string@^1.0.7:
+ version "1.0.7"
+ resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd"
+ integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==
+ dependencies:
+ has-tostringtag "^1.0.0"
+
+is-symbol@^1.0.2, is-symbol@^1.0.3:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c"
+ integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==
+ dependencies:
+ has-symbols "^1.0.2"
+
+is-typed-array@^1.1.13, is-typed-array@^1.1.3:
+ version "1.1.13"
+ resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.13.tgz#d6c5ca56df62334959322d7d7dd1cca50debe229"
+ integrity sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==
+ dependencies:
+ which-typed-array "^1.1.14"
+
+is-typedarray@^1.0.0, is-typedarray@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a"
+ integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==
+
+is-unicode-supported@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7"
+ integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==
+
+is-weakref@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2"
+ integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==
+ dependencies:
+ call-bind "^1.0.2"
+
+isarray@^2.0.5:
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723"
+ integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==
+
+isexe@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
+ integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==
+
+isstream@~0.1.2:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a"
+ integrity sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==
+
+js-sha3@0.8.0:
+ version "0.8.0"
+ resolved "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz"
+ integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==
+
+js-sha3@^0.5.7:
+ version "0.5.7"
+ resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.5.7.tgz#0d4ffd8002d5333aabaf4a23eed2f6374c9f28e7"
+ integrity sha512-GII20kjaPX0zJ8wzkTbNDYMY7msuZcTWk8S5UOh6806Jq/wz1J8/bnr8uGU0DAUmYDjj2Mr4X1cW8v/GLYnR+g==
+
+"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
+ integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==
+
+js-yaml@^4.1.0, js-yaml@~4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602"
+ integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==
+ dependencies:
+ argparse "^2.0.1"
+
+jsbn@~0.1.0:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513"
+ integrity sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==
+
+jsesc@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-3.0.2.tgz#bb8b09a6597ba426425f2e4a07245c3d00b9343e"
+ integrity sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==
+
+json-buffer@3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13"
+ integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==
+
+json-parse-even-better-errors@^2.3.0:
+ version "2.3.1"
+ resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d"
+ integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==
+
+json-schema-traverse@^0.4.1:
+ version "0.4.1"
+ resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660"
+ integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==
+
+json-schema-traverse@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2"
+ integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==
+
+json-schema@0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.4.0.tgz#f7de4cf6efab838ebaeb3236474cbba5a1930ab5"
+ integrity sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==
+
+json-stable-stringify-without-jsonify@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651"
+ integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==
+
+json-stream-stringify@^3.1.4:
+ version "3.1.6"
+ resolved "https://registry.yarnpkg.com/json-stream-stringify/-/json-stream-stringify-3.1.6.tgz#ebe32193876fb99d4ec9f612389a8d8e2b5d54d4"
+ integrity sha512-x7fpwxOkbhFCaJDJ8vb1fBY3DdSa4AlITaz+HHILQJzdPMnHEFjxPwVUi1ALIbcIxDE0PNe/0i7frnY8QnBQog==
+
+json-stringify-safe@^5.0.1, json-stringify-safe@~5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb"
+ integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==
+
+json5@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593"
+ integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==
+ dependencies:
+ minimist "^1.2.0"
+
+json5@^2.2.3:
+ version "2.2.3"
+ resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283"
+ integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==
+
+jsonfile@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb"
+ integrity sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==
+ optionalDependencies:
+ graceful-fs "^4.1.6"
+
+jsonfile@^6.0.1:
+ version "6.1.0"
+ resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae"
+ integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==
+ dependencies:
+ universalify "^2.0.0"
+ optionalDependencies:
+ graceful-fs "^4.1.6"
+
+jsprim@^1.2.2:
+ version "1.4.2"
+ resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.2.tgz#712c65533a15c878ba59e9ed5f0e26d5b77c5feb"
+ integrity sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==
+ dependencies:
+ assert-plus "1.0.0"
+ extsprintf "1.3.0"
+ json-schema "0.4.0"
+ verror "1.10.0"
+
+keccak@^3.0.0, keccak@^3.0.2:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/keccak/-/keccak-3.0.4.tgz#edc09b89e633c0549da444432ecf062ffadee86d"
+ integrity sha512-3vKuW0jV8J3XNTzvfyicFR5qvxrSAGl7KIhvgOu5cmWwM7tZRj3fMbj/pfIf4be7aznbc+prBWGjywox/g2Y6Q==
+ dependencies:
+ node-addon-api "^2.0.0"
+ node-gyp-build "^4.2.0"
+ readable-stream "^3.6.0"
+
+keyv@^4.0.0, keyv@^4.5.3:
+ version "4.5.4"
+ resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93"
+ integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==
+ dependencies:
+ json-buffer "3.0.1"
+
+kleur@^3.0.3:
+ version "3.0.3"
+ resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e"
+ integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==
+
+kuler@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/kuler/-/kuler-2.0.0.tgz#e2c570a3800388fb44407e851531c1d670b061b3"
+ integrity sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==
+
+latest-version@^7.0.0:
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-7.0.0.tgz#843201591ea81a4d404932eeb61240fe04e9e5da"
+ integrity sha512-KvNT4XqAMzdcL6ka6Tl3i2lYeFDgXNCuIX+xNx6ZMVR1dFq+idXd9FLKNMOIx0t9mJ9/HudyX4oZWXZQ0UJHeg==
+ dependencies:
+ package-json "^8.1.0"
+
+levn@^0.4.1:
+ version "0.4.1"
+ resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade"
+ integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==
+ dependencies:
+ prelude-ls "^1.2.1"
+ type-check "~0.4.0"
+
+lines-and-columns@^1.1.6:
+ version "1.2.4"
+ resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632"
+ integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==
+
+locate-path@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e"
+ integrity sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==
+ dependencies:
+ p-locate "^2.0.0"
+ path-exists "^3.0.0"
+
+locate-path@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286"
+ integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==
+ dependencies:
+ p-locate "^5.0.0"
+
+lodash.clonedeep@^4.5.0:
+ version "4.5.0"
+ resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef"
+ integrity sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==
+
+lodash.isequal@^4.5.0:
+ version "4.5.0"
+ resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0"
+ integrity sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==
+
+lodash.memoize@^4.1.2:
+ version "4.1.2"
+ resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe"
+ integrity sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==
+
+lodash.merge@^4.6.2:
+ version "4.6.2"
+ resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a"
+ integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==
+
+lodash.truncate@^4.4.2:
+ version "4.4.2"
+ resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193"
+ integrity sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==
+
+lodash@4.17.21, lodash@^4.17.11, lodash@^4.17.20, lodash@^4.17.21:
+ version "4.17.21"
+ resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
+ integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
+
+log-symbols@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503"
+ integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==
+ dependencies:
+ chalk "^4.1.0"
+ is-unicode-supported "^0.1.0"
+
+logform@^2.6.0, logform@^2.6.1:
+ version "2.6.1"
+ resolved "https://registry.yarnpkg.com/logform/-/logform-2.6.1.tgz#71403a7d8cae04b2b734147963236205db9b3df0"
+ integrity sha512-CdaO738xRapbKIMVn2m4F6KTj4j7ooJ8POVnebSgKo3KBz5axNXRAL7ZdRjIV6NOr2Uf4vjtRkxrFETOioCqSA==
+ dependencies:
+ "@colors/colors" "1.6.0"
+ "@types/triple-beam" "^1.3.2"
+ fecha "^4.2.0"
+ ms "^2.1.1"
+ safe-stable-stringify "^2.3.1"
+ triple-beam "^1.3.0"
+
+loose-envify@^1.1.0, loose-envify@^1.4.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf"
+ integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==
+ dependencies:
+ js-tokens "^3.0.0 || ^4.0.0"
+
+loupe@^2.3.6:
+ version "2.3.7"
+ resolved "https://registry.yarnpkg.com/loupe/-/loupe-2.3.7.tgz#6e69b7d4db7d3ab436328013d37d1c8c3540c697"
+ integrity sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==
+ dependencies:
+ get-func-name "^2.0.1"
+
+lowercase-keys@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479"
+ integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==
+
+lowercase-keys@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-3.0.0.tgz#c5e7d442e37ead247ae9db117a9d0a467c89d4f2"
+ integrity sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==
+
+lru-cache@^5.1.1:
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920"
+ integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==
+ dependencies:
+ yallist "^3.0.2"
+
+lru_map@^0.3.3:
+ version "0.3.3"
+ resolved "https://registry.npmjs.org/lru_map/-/lru_map-0.3.3.tgz"
+ integrity sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ==
+
+make-error@^1.1.1:
+ version "1.3.6"
+ resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2"
+ integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==
+
+map-age-cleaner@^0.1.3:
+ version "0.1.3"
+ resolved "https://registry.yarnpkg.com/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz#7d583a7306434c055fe474b0f45078e6e1b4b92a"
+ integrity sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==
+ dependencies:
+ p-defer "^1.0.0"
+
+match-all@^1.2.6:
+ version "1.2.6"
+ resolved "https://registry.yarnpkg.com/match-all/-/match-all-1.2.6.tgz#66d276ad6b49655551e63d3a6ee53e8be0566f8d"
+ integrity sha512-0EESkXiTkWzrQQntBu2uzKvLu6vVkUGz40nGPbSZuegcfE5UuSzNjLaIu76zJWuaT/2I3Z/8M06OlUOZLGwLlQ==
+
+md5.js@^1.3.4:
+ version "1.3.5"
+ resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f"
+ integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==
+ dependencies:
+ hash-base "^3.0.0"
+ inherits "^2.0.1"
+ safe-buffer "^5.1.2"
+
+media-typer@0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748"
+ integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==
+
+memorystream@^0.3.1:
+ version "0.3.1"
+ resolved "https://registry.yarnpkg.com/memorystream/-/memorystream-0.3.1.tgz#86d7090b30ce455d63fbae12dda51a47ddcaf9b2"
+ integrity sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==
+
+merge-descriptors@1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.3.tgz#d80319a65f3c7935351e5cfdac8f9318504dbed5"
+ integrity sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==
+
+merge2@^1.3.0, merge2@^1.4.1:
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae"
+ integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==
+
+methods@~1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee"
+ integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==
+
+micro-ftch@^0.3.1:
+ version "0.3.1"
+ resolved "https://registry.yarnpkg.com/micro-ftch/-/micro-ftch-0.3.1.tgz#6cb83388de4c1f279a034fb0cf96dfc050853c5f"
+ integrity sha512-/0LLxhzP0tfiR5hcQebtudP56gUurs2CLkGarnCiB/OqEyUFQ6U3paQi/tgLv0hBJYt2rnr9MNpxz4fiiugstg==
+
+micro-memoize@~4.1.2:
+ version "4.1.2"
+ resolved "https://registry.yarnpkg.com/micro-memoize/-/micro-memoize-4.1.2.tgz#ce719c1ba1e41592f1cd91c64c5f41dcbf135f36"
+ integrity sha512-+HzcV2H+rbSJzApgkj0NdTakkC+bnyeiUxgT6/m7mjcz1CmM22KYFKp+EVj1sWe4UYcnriJr5uqHQD/gMHLD+g==
+
+micromatch@^4.0.4:
+ version "4.0.8"
+ resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202"
+ integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==
+ dependencies:
+ braces "^3.0.3"
+ picomatch "^2.3.1"
+
+mime-db@1.52.0:
+ version "1.52.0"
+ resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70"
+ integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==
+
+mime-types@^2.1.12, mime-types@^2.1.16, mime-types@~2.1.19, mime-types@~2.1.24, mime-types@~2.1.34:
+ version "2.1.35"
+ resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a"
+ integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==
+ dependencies:
+ mime-db "1.52.0"
+
+mime@1.6.0:
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1"
+ integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==
+
+mimic-fn@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b"
+ integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==
+
+mimic-fn@^3.0.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-3.1.0.tgz#65755145bbf3e36954b949c16450427451d5ca74"
+ integrity sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ==
+
+mimic-response@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b"
+ integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==
+
+mimic-response@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9"
+ integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==
+
+mimic-response@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-4.0.0.tgz#35468b19e7c75d10f5165ea25e75a5ceea7cf70f"
+ integrity sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==
+
+min-document@^2.19.0:
+ version "2.19.0"
+ resolved "https://registry.yarnpkg.com/min-document/-/min-document-2.19.0.tgz#7bd282e3f5842ed295bb748cdd9f1ffa2c824685"
+ integrity sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ==
+ dependencies:
+ dom-walk "^0.1.0"
+
+minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7"
+ integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==
+
+minimalistic-crypto-utils@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a"
+ integrity sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==
+
+minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.2:
+ version "3.1.2"
+ resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz"
+ integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==
+ dependencies:
+ brace-expansion "^1.1.7"
+
+minimatch@^5.0.1, minimatch@^5.1.6:
+ version "5.1.6"
+ resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96"
+ integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==
+ dependencies:
+ brace-expansion "^2.0.1"
+
+minimatch@^9.0.4:
+ version "9.0.5"
+ resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.5.tgz#d74f9dd6b57d83d8e98cfb82133b03978bc929e5"
+ integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==
+ dependencies:
+ brace-expansion "^2.0.1"
+
+minimist@^1.2.0, minimist@^1.2.5, minimist@^1.2.6:
+ version "1.2.8"
+ resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c"
+ integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==
+
+minipass@^2.6.0, minipass@^2.9.0:
+ version "2.9.0"
+ resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.9.0.tgz#e713762e7d3e32fed803115cf93e04bca9fcc9a6"
+ integrity sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==
+ dependencies:
+ safe-buffer "^5.1.2"
+ yallist "^3.0.0"
+
+minizlib@^1.3.3:
+ version "1.3.3"
+ resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.3.3.tgz#2290de96818a34c29551c8a8d301216bd65a861d"
+ integrity sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==
+ dependencies:
+ minipass "^2.9.0"
+
+mkdirp-promise@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/mkdirp-promise/-/mkdirp-promise-5.0.1.tgz#e9b8f68e552c68a9c1713b84883f7a1dd039b8a1"
+ integrity sha512-Hepn5kb1lJPtVW84RFT40YG1OddBNTOVUZR2bzQUHc+Z03en8/3uX0+060JDhcEzyO08HmipsN9DcnFMxhIL9w==
+ dependencies:
+ mkdirp "*"
+
+mkdirp@*, mkdirp@^0.5.5:
+ version "0.5.6"
+ resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6"
+ integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==
+ dependencies:
+ minimist "^1.2.6"
+
+mnemonist@^0.38.0:
+ version "0.38.5"
+ resolved "https://registry.yarnpkg.com/mnemonist/-/mnemonist-0.38.5.tgz#4adc7f4200491237fe0fa689ac0b86539685cade"
+ integrity sha512-bZTFT5rrPKtPJxj8KSV0WkPyNxl72vQepqqVUAW2ARUpUSF2qXMB6jZj7hW5/k7C1rtpzqbD/IIbJwLXUjCHeg==
+ dependencies:
+ obliterator "^2.0.0"
+
+mocha@^10.0.0, mocha@^10.2.0:
+ version "10.7.3"
+ resolved "https://registry.yarnpkg.com/mocha/-/mocha-10.7.3.tgz#ae32003cabbd52b59aece17846056a68eb4b0752"
+ integrity sha512-uQWxAu44wwiACGqjbPYmjo7Lg8sFrS3dQe7PP2FQI+woptP4vZXSMcfMyFL/e1yFEeEpV4RtyTpZROOKmxis+A==
+ dependencies:
+ ansi-colors "^4.1.3"
+ browser-stdout "^1.3.1"
+ chokidar "^3.5.3"
+ debug "^4.3.5"
+ 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"
+
+mock-fs@^4.1.0:
+ version "4.14.0"
+ resolved "https://registry.yarnpkg.com/mock-fs/-/mock-fs-4.14.0.tgz#ce5124d2c601421255985e6e94da80a7357b1b18"
+ integrity sha512-qYvlv/exQ4+svI3UOvPUpLDF0OMX5euvUH0Ny4N5QyRyhNdgAgUrVH3iUINSzEPLvx0kbo/Bp28GJKIqvE7URw==
+
+ms@2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
+ integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==
+
+ms@2.1.3, ms@^2.1.1, ms@^2.1.3:
+ version "2.1.3"
+ resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz"
+ integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==
+
+multibase@^0.7.0:
+ version "0.7.0"
+ resolved "https://registry.yarnpkg.com/multibase/-/multibase-0.7.0.tgz#1adfc1c50abe05eefeb5091ac0c2728d6b84581b"
+ integrity sha512-TW8q03O0f6PNFTQDvh3xxH03c8CjGaaYrjkl9UQPG6rz53TQzzxJVCIWVjzcbN/Q5Y53Zd0IBQBMVktVgNx4Fg==
+ dependencies:
+ base-x "^3.0.8"
+ buffer "^5.5.0"
+
+multibase@~0.6.0:
+ version "0.6.1"
+ resolved "https://registry.yarnpkg.com/multibase/-/multibase-0.6.1.tgz#b76df6298536cc17b9f6a6db53ec88f85f8cc12b"
+ integrity sha512-pFfAwyTjbbQgNc3G7D48JkJxWtoJoBMaR4xQUOuB8RnCgRqaYmWNFeJTTvrJ2w51bjLq2zTby6Rqj9TQ9elSUw==
+ dependencies:
+ base-x "^3.0.8"
+ buffer "^5.5.0"
+
+multicodec@^0.5.5:
+ version "0.5.7"
+ resolved "https://registry.yarnpkg.com/multicodec/-/multicodec-0.5.7.tgz#1fb3f9dd866a10a55d226e194abba2dcc1ee9ffd"
+ integrity sha512-PscoRxm3f+88fAtELwUnZxGDkduE2HD9Q6GHUOywQLjOGT/HAdhjLDYNZ1e7VR0s0TP0EwZ16LNUTFpoBGivOA==
+ dependencies:
+ varint "^5.0.0"
+
+multicodec@^1.0.0:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/multicodec/-/multicodec-1.0.4.tgz#46ac064657c40380c28367c90304d8ed175a714f"
+ integrity sha512-NDd7FeS3QamVtbgfvu5h7fd1IlbaC4EQ0/pgU4zqE2vdHCmBGsUa0TiM8/TdSeG6BMPC92OOCf8F1ocE/Wkrrg==
+ dependencies:
+ buffer "^5.6.0"
+ varint "^5.0.0"
+
+multihashes@^0.4.15, multihashes@~0.4.15:
+ version "0.4.21"
+ resolved "https://registry.yarnpkg.com/multihashes/-/multihashes-0.4.21.tgz#dc02d525579f334a7909ade8a122dabb58ccfcb5"
+ integrity sha512-uVSvmeCWf36pU2nB4/1kzYZjsXD9vofZKpgudqkceYY5g2aZZXJ5r9lxuzoRLl1OAp28XljXsEJ/X/85ZsKmKw==
+ dependencies:
+ buffer "^5.5.0"
+ multibase "^0.7.0"
+ varint "^5.0.0"
+
+murmur-128@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/murmur-128/-/murmur-128-0.2.1.tgz#a9f6568781d2350ecb1bf80c14968cadbeaa4b4d"
+ integrity sha512-WseEgiRkI6aMFBbj8Cg9yBj/y+OdipwVC7zUo3W2W1JAJITwouUOtpqsmGSg67EQmwwSyod7hsVsWY5LsrfQVg==
+ dependencies:
+ encode-utf8 "^1.0.2"
+ fmix "^0.1.0"
+ imul "^1.0.0"
+
+nano-json-stream-parser@^0.1.2:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/nano-json-stream-parser/-/nano-json-stream-parser-0.1.2.tgz#0cc8f6d0e2b622b479c40d499c46d64b755c6f5f"
+ integrity sha512-9MqxMH/BSJC7dnLsEMPyfN5Dvoo49IsPFYMcHw3Bcfc2kN0lpHRBSzlMSVx4HGyJ7s9B31CyBTVehWJoQ8Ctew==
+
+natural-compare@^1.4.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
+ integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==
+
+ndjson@2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/ndjson/-/ndjson-2.0.0.tgz#320ac86f6fe53f5681897349b86ac6f43bfa3a19"
+ integrity sha512-nGl7LRGrzugTtaFcJMhLbpzJM6XdivmbkdlaGcrk/LXg2KL/YBC6z1g70xh0/al+oFuVFP8N8kiWRucmeEH/qQ==
+ dependencies:
+ json-stringify-safe "^5.0.1"
+ minimist "^1.2.5"
+ readable-stream "^3.6.0"
+ split2 "^3.0.0"
+ through2 "^4.0.0"
+
+negotiator@0.6.3:
+ version "0.6.3"
+ resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd"
+ integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==
+
+next-tick@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.1.0.tgz#1836ee30ad56d67ef281b22bd199f709449b35eb"
+ integrity sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==
+
+node-addon-api@^2.0.0:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-2.0.2.tgz#432cfa82962ce494b132e9d72a15b29f71ff5d32"
+ integrity sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==
+
+node-addon-api@^5.0.0:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-5.1.0.tgz#49da1ca055e109a23d537e9de43c09cca21eb762"
+ integrity sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==
+
+node-fetch@^2.6.12, node-fetch@^2.6.6:
+ version "2.7.0"
+ resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d"
+ integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==
+ dependencies:
+ whatwg-url "^5.0.0"
+
+node-gyp-build@^4.2.0, node-gyp-build@^4.3.0:
+ version "4.8.2"
+ resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.8.2.tgz#4f802b71c1ab2ca16af830e6c1ea7dd1ad9496fa"
+ integrity sha512-IRUxE4BVsHWXkV/SFOut4qTlagw2aM8T5/vnTsmrHJvVoKueJHRc/JaFND7QDDc61kLYUJ6qlZM3sqTSyx2dTw==
+
+node-releases@^2.0.18:
+ version "2.0.18"
+ resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.18.tgz#f010e8d35e2fe8d6b2944f03f70213ecedc4ca3f"
+ integrity sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==
+
+nofilter@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/nofilter/-/nofilter-3.1.0.tgz#c757ba68801d41ff930ba2ec55bab52ca184aa66"
+ integrity sha512-l2NNj07e9afPnhAhvgVrCD/oy2Ai1yfLpuo3EpiO1jFTsB4sFz6oIfAfSZyQzVpkZQ9xS8ZS5g1jCBgq4Hwo0g==
+
+normalize-path@^3.0.0, normalize-path@~3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65"
+ integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==
+
+normalize-url@^6.0.1:
+ version "6.1.0"
+ resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-6.1.0.tgz#40d0885b535deffe3f3147bec877d05fe4c5668a"
+ integrity sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==
+
+normalize-url@^8.0.0:
+ version "8.0.1"
+ resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-8.0.1.tgz#9b7d96af9836577c58f5883e939365fa15623a4a"
+ integrity sha512-IO9QvjUMWxPQQhs60oOu10CRkWCiZzSUkzbXGGV9pviYl1fXYcvkzQ5jV9z8Y6un8ARoVRl4EtC6v6jNqbaJ/w==
+
+number-to-bn@1.7.0:
+ version "1.7.0"
+ resolved "https://registry.yarnpkg.com/number-to-bn/-/number-to-bn-1.7.0.tgz#bb3623592f7e5f9e0030b1977bd41a0c53fe1ea0"
+ integrity sha512-wsJ9gfSz1/s4ZsJN01lyonwuxA1tml6X1yBDnfpMglypcBRFZZkus26EdPSlqS5GJfYddVZa22p3VNb3z5m5Ig==
+ dependencies:
+ bn.js "4.11.6"
+ strip-hex-prefix "1.0.0"
+
+oauth-sign@~0.9.0:
+ version "0.9.0"
+ resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455"
+ integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==
+
+object-assign@^4, object-assign@^4.1.0, object-assign@^4.1.1:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
+ integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==
+
+object-hash@^2.0.3:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-2.2.0.tgz#5ad518581eefc443bd763472b8ff2e9c2c0d54a5"
+ integrity sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==
+
+object-inspect@^1.13.1:
+ version "1.13.2"
+ resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.2.tgz#dea0088467fb991e67af4058147a24824a3043ff"
+ integrity sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==
+
+object-keys@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e"
+ integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==
+
+object.assign@^4.1.5:
+ version "4.1.5"
+ resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.5.tgz#3a833f9ab7fdb80fc9e8d2300c803d216d8fdbb0"
+ integrity sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==
+ dependencies:
+ call-bind "^1.0.5"
+ define-properties "^1.2.1"
+ has-symbols "^1.0.3"
+ object-keys "^1.1.1"
+
+object.fromentries@^2.0.8:
+ version "2.0.8"
+ resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.8.tgz#f7195d8a9b97bd95cbc1999ea939ecd1a2b00c65"
+ integrity sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==
+ dependencies:
+ call-bind "^1.0.7"
+ define-properties "^1.2.1"
+ es-abstract "^1.23.2"
+ es-object-atoms "^1.0.0"
+
+object.groupby@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/object.groupby/-/object.groupby-1.0.3.tgz#9b125c36238129f6f7b61954a1e7176148d5002e"
+ integrity sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==
+ dependencies:
+ call-bind "^1.0.7"
+ define-properties "^1.2.1"
+ es-abstract "^1.23.2"
+
+object.values@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.2.0.tgz#65405a9d92cee68ac2d303002e0b8470a4d9ab1b"
+ integrity sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==
+ dependencies:
+ call-bind "^1.0.7"
+ define-properties "^1.2.1"
+ es-object-atoms "^1.0.0"
+
+obliterator@^2.0.0:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/obliterator/-/obliterator-2.0.4.tgz#fa650e019b2d075d745e44f1effeb13a2adbe816"
+ integrity sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ==
+
+oboe@2.1.5:
+ version "2.1.5"
+ resolved "https://registry.yarnpkg.com/oboe/-/oboe-2.1.5.tgz#5554284c543a2266d7a38f17e073821fbde393cd"
+ integrity sha512-zRFWiF+FoicxEs3jNI/WYUrVEgA7DeET/InK0XQuudGHRg8iIob3cNPrJTKaz4004uaA9Pbe+Dwa8iluhjLZWA==
+ dependencies:
+ http-https "^1.0.0"
+
+on-finished@2.4.1:
+ version "2.4.1"
+ resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f"
+ integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==
+ dependencies:
+ ee-first "1.1.1"
+
+once@^1.3.0, once@^1.3.1, once@^1.4.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
+ integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==
+ dependencies:
+ wrappy "1"
+
+one-time@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/one-time/-/one-time-1.0.0.tgz#e06bc174aed214ed58edede573b433bbf827cb45"
+ integrity sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==
+ dependencies:
+ fn.name "1.x.x"
+
+onetime@^5.1.0:
+ version "5.1.2"
+ resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e"
+ integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==
+ dependencies:
+ mimic-fn "^2.1.0"
+
+"openzeppelin-4-upgradeable@npm:@openzeppelin/contracts-upgradeable@4.5.0":
+ version "4.5.0"
+ resolved "https://registry.yarnpkg.com/@openzeppelin/contracts-upgradeable/-/contracts-upgradeable-4.5.0.tgz#1aceb1303611e3b8e416e031bb9f8f211fbbbf8b"
+ integrity sha512-5540xxycH2aDFI3e+5Mqd0GDeozkSKSEaNWoM65l90OYxZxOs9YQMqa+b4fR+363BXXSXoC1DTXut2TuqViwPA==
+
+"openzeppelin-4@npm:@openzeppelin/contracts@4.5.0":
+ version "4.5.0"
+ resolved "https://registry.yarnpkg.com/@openzeppelin/contracts/-/contracts-4.5.0.tgz#3fd75d57de172b3743cdfc1206883f56430409cc"
+ integrity sha512-fdkzKPYMjrRiPK6K4y64e6GzULR7R7RwxSigHS8DDp7aWDeoReqsQI+cxHV1UuhAqX69L1lAaWDxenfP+xiqzA==
+
+optionator@^0.9.3:
+ version "0.9.4"
+ resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.4.tgz#7ea1c1a5d91d764fb282139c88fe11e182a3a734"
+ integrity sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==
+ dependencies:
+ deep-is "^0.1.3"
+ fast-levenshtein "^2.0.6"
+ levn "^0.4.1"
+ prelude-ls "^1.2.1"
+ type-check "^0.4.0"
+ word-wrap "^1.2.5"
+
+ordinal@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/ordinal/-/ordinal-1.0.3.tgz#1a3c7726a61728112f50944ad7c35c06ae3a0d4d"
+ integrity sha512-cMddMgb2QElm8G7vdaa02jhUNbTSrhsgAGUz1OokD83uJTwSUn+nKoNoKVVaRa08yF6sgfO7Maou1+bgLd9rdQ==
+
+os-tmpdir@~1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274"
+ integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==
+
+p-cancelable@^2.0.0:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-2.1.1.tgz#aab7fbd416582fa32a3db49859c122487c5ed2cf"
+ integrity sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==
+
+p-cancelable@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-3.0.0.tgz#63826694b54d61ca1c20ebcb6d3ecf5e14cd8050"
+ integrity sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==
+
+p-defer@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c"
+ integrity sha512-wB3wfAxZpk2AzOfUMJNL+d36xothRSyj8EXOa4f6GMqYDN9BJaaSISbsk+wS9abmnebVw95C2Kb5t85UmpCxuw==
+
+p-limit@^1.1.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8"
+ integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==
+ dependencies:
+ p-try "^1.0.0"
+
+p-limit@^2.2.2:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1"
+ integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==
+ dependencies:
+ p-try "^2.0.0"
+
+p-limit@^3.0.2:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b"
+ integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==
+ dependencies:
+ yocto-queue "^0.1.0"
+
+p-locate@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43"
+ integrity sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==
+ dependencies:
+ p-limit "^1.1.0"
+
+p-locate@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834"
+ integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==
+ dependencies:
+ p-limit "^3.0.2"
+
+p-map@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b"
+ integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==
+ dependencies:
+ aggregate-error "^3.0.0"
+
+p-memoize@~4.0.4:
+ version "4.0.4"
+ resolved "https://registry.yarnpkg.com/p-memoize/-/p-memoize-4.0.4.tgz#90a4c4668866737fc5c8364c56b06f6ca44afb15"
+ integrity sha512-ijdh0DP4Mk6J4FXlOM6vPPoCjPytcEseW8p/k5SDTSSfGV3E9bpt9Yzfifvzp6iohIieoLTkXRb32OWV0fB2Lw==
+ dependencies:
+ map-age-cleaner "^0.1.3"
+ mimic-fn "^3.0.0"
+ p-settle "^4.1.1"
+
+p-reflect@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/p-reflect/-/p-reflect-2.1.0.tgz#5d67c7b3c577c4e780b9451fc9129675bd99fe67"
+ integrity sha512-paHV8NUz8zDHu5lhr/ngGWQiW067DK/+IbJ+RfZ4k+s8y4EKyYCz8pGYWjxCg35eHztpJAt+NUgvN4L+GCbPlg==
+
+p-settle@^4.1.1:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/p-settle/-/p-settle-4.1.1.tgz#37fbceb2b02c9efc28658fc8d36949922266035f"
+ integrity sha512-6THGh13mt3gypcNMm0ADqVNCcYa3BK6DWsuJWFCuEKP1rpY+OKGp7gaZwVmLspmic01+fsg/fN57MfvDzZ/PuQ==
+ dependencies:
+ p-limit "^2.2.2"
+ p-reflect "^2.1.0"
+
+p-try@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3"
+ integrity sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==
+
+p-try@^2.0.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6"
+ integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==
+
+package-json@^8.1.0:
+ version "8.1.1"
+ resolved "https://registry.yarnpkg.com/package-json/-/package-json-8.1.1.tgz#3e9948e43df40d1e8e78a85485f1070bf8f03dc8"
+ integrity sha512-cbH9IAIJHNj9uXi196JVsRlt7cHKak6u/e6AkL/bkRelZ7rlL3X1YKxsZwa36xipOEKAsdtmaG6aAJoM1fx2zA==
+ dependencies:
+ got "^12.1.0"
+ registry-auth-token "^5.0.1"
+ registry-url "^6.0.0"
+ semver "^7.3.7"
+
+parent-module@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2"
+ integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==
+ dependencies:
+ callsites "^3.0.0"
+
+parse-headers@^2.0.0:
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/parse-headers/-/parse-headers-2.0.5.tgz#069793f9356a54008571eb7f9761153e6c770da9"
+ integrity sha512-ft3iAoLOB/MlwbNXgzy43SWGP6sQki2jQvAyBg/zDFAgr9bfNWZIUj42Kw2eJIl8kEi4PbgE6U1Zau/HwI75HA==
+
+parse-json@^5.2.0:
+ version "5.2.0"
+ resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd"
+ integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==
+ dependencies:
+ "@babel/code-frame" "^7.0.0"
+ error-ex "^1.3.1"
+ json-parse-even-better-errors "^2.3.0"
+ lines-and-columns "^1.1.6"
+
+parseurl@~1.3.3:
+ version "1.3.3"
+ resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4"
+ integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==
+
+patch-console@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/patch-console/-/patch-console-1.0.0.tgz#19b9f028713feb8a3c023702a8cc8cb9f7466f9d"
+ integrity sha512-nxl9nrnLQmh64iTzMfyylSlRozL7kAXIaxw1fVcLYdyhNkJCRUzirRZTikXGJsg+hc4fqpneTK6iU2H1Q8THSA==
+
+path-exists@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515"
+ integrity sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==
+
+path-exists@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3"
+ integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==
+
+path-is-absolute@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
+ integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==
+
+path-key@^3.1.0:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375"
+ integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==
+
+path-parse@^1.0.6, path-parse@^1.0.7:
+ version "1.0.7"
+ resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735"
+ integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==
+
+path-to-regexp@0.1.10:
+ version "0.1.10"
+ resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.10.tgz#67e9108c5c0551b9e5326064387de4763c4d5f8b"
+ integrity sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==
+
+path-type@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b"
+ integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==
+
+pathval@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.1.tgz#8534e77a77ce7ac5a2512ea21e0fdb8fcf6c3d8d"
+ integrity sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==
+
+pbkdf2@^3.0.17:
+ version "3.1.2"
+ resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.2.tgz#dd822aa0887580e52f1a039dc3eda108efae3075"
+ integrity sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==
+ dependencies:
+ create-hash "^1.1.2"
+ create-hmac "^1.1.4"
+ ripemd160 "^2.0.1"
+ safe-buffer "^5.0.1"
+ sha.js "^2.4.8"
+
+performance-now@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b"
+ integrity sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==
+
+picocolors@^1.0.0, picocolors@^1.1.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b"
+ integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==
+
+picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1:
+ version "2.3.1"
+ resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42"
+ integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==
+
+pluralize@^8.0.0:
+ version "8.0.0"
+ resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-8.0.0.tgz#1a6fa16a38d12a1901e0320fa017051c539ce3b1"
+ integrity sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==
+
+possible-typed-array-names@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz#89bb63c6fada2c3e90adc4a647beeeb39cc7bf8f"
+ integrity sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==
+
+prelude-ls@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396"
+ integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==
+
+prettier-linter-helpers@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz#d23d41fe1375646de2d0104d3454a3008802cf7b"
+ integrity sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==
+ dependencies:
+ fast-diff "^1.1.2"
+
+prettier-plugin-packagejson@^2.4.7:
+ version "2.5.3"
+ resolved "https://registry.yarnpkg.com/prettier-plugin-packagejson/-/prettier-plugin-packagejson-2.5.3.tgz#a3f9eb02ece197db6b7696be5df43ddc2397ad81"
+ integrity sha512-ATMEEXr+ywls1kgrZEWl4SBPEm0uDdyDAjyNzUC0/Z8WZTD3RqbJcQDR+Dau+wYkW9KHK6zqQIsFyfn+9aduWg==
+ dependencies:
+ sort-package-json "2.10.1"
+ synckit "0.9.2"
+
+prettier-plugin-solidity@^1.2.0:
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/prettier-plugin-solidity/-/prettier-plugin-solidity-1.4.1.tgz#8060baf18853a9e34d2e09e47e87b4f19e15afe9"
+ integrity sha512-Mq8EtfacVZ/0+uDKTtHZGW3Aa7vEbX/BNx63hmVg6YTiTXSiuKP0amj0G6pGwjmLaOfymWh3QgXEZkjQbU8QRg==
+ dependencies:
+ "@solidity-parser/parser" "^0.18.0"
+ semver "^7.5.4"
+
+prettier@^2.8.3:
+ version "2.8.8"
+ resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.8.tgz#e8c5d7e98a4305ffe3de2e1fc4aca1a71c28b1da"
+ integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==
+
+prettier@^3.2.4, prettier@^3.2.5:
+ version "3.3.3"
+ resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.3.3.tgz#30c54fe0be0d8d12e6ae61dbb10109ea00d53105"
+ integrity sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==
+
+process@^0.11.10:
+ version "0.11.10"
+ resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182"
+ integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==
+
+prompts@^2.4.2:
+ version "2.4.2"
+ resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069"
+ integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==
+ dependencies:
+ kleur "^3.0.3"
+ sisteransi "^1.0.5"
+
+prop-types@^15.7.2:
+ version "15.8.1"
+ resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5"
+ integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==
+ dependencies:
+ loose-envify "^1.4.0"
+ object-assign "^4.1.1"
+ react-is "^16.13.1"
+
+proto-list@~1.2.1:
+ version "1.2.4"
+ resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849"
+ integrity sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==
+
+proxy-addr@~2.0.7:
+ version "2.0.7"
+ resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025"
+ integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==
+ dependencies:
+ forwarded "0.2.0"
+ ipaddr.js "1.9.1"
+
+psl@^1.1.28:
+ version "1.9.0"
+ resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7"
+ integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==
+
+pump@^3.0.0:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.2.tgz#836f3edd6bc2ee599256c924ffe0d88573ddcbf8"
+ integrity sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==
+ dependencies:
+ end-of-stream "^1.1.0"
+ once "^1.3.1"
+
+punycode@2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.0.tgz#5f863edc89b96db09074bad7947bf09056ca4e7d"
+ integrity sha512-Yxz2kRwT90aPiWEMHVYnEf4+rhwF1tBmmZ4KepCP+Wkium9JxtWnUm1nqGwpiAHr/tnTSeHqr3wb++jgSkXjhA==
+
+punycode@^2.1.0, punycode@^2.1.1:
+ version "2.3.1"
+ resolved "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz"
+ integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==
+
+qs@6.13.0, qs@^6.9.4:
+ version "6.13.0"
+ resolved "https://registry.yarnpkg.com/qs/-/qs-6.13.0.tgz#6ca3bd58439f7e245655798997787b0d88a51906"
+ integrity sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==
+ dependencies:
+ side-channel "^1.0.6"
+
+qs@~6.5.2:
+ version "6.5.3"
+ resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.3.tgz#3aeeffc91967ef6e35c0e488ef46fb296ab76aad"
+ integrity sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==
+
+query-string@^5.0.1:
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/query-string/-/query-string-5.1.1.tgz#a78c012b71c17e05f2e3fa2319dd330682efb3cb"
+ integrity sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==
+ dependencies:
+ decode-uri-component "^0.2.0"
+ object-assign "^4.1.0"
+ strict-uri-encode "^1.0.0"
+
+queue-microtask@^1.2.2:
+ version "1.2.3"
+ resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243"
+ integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==
+
+quick-lru@^5.1.1:
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-5.1.1.tgz#366493e6b3e42a3a6885e2e99d18f80fb7a8c932"
+ integrity sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==
+
+randombytes@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a"
+ integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==
+ dependencies:
+ safe-buffer "^5.1.0"
+
+range-parser@~1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031"
+ integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==
+
+raw-body@2.5.2, raw-body@^2.4.1:
+ version "2.5.2"
+ resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.2.tgz#99febd83b90e08975087e8f1f9419a149366b68a"
+ integrity sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==
+ dependencies:
+ bytes "3.1.2"
+ http-errors "2.0.0"
+ iconv-lite "0.4.24"
+ unpipe "1.0.0"
+
+rc@1.2.8:
+ version "1.2.8"
+ resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed"
+ integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==
+ dependencies:
+ deep-extend "^0.6.0"
+ ini "~1.3.0"
+ minimist "^1.2.0"
+ strip-json-comments "~2.0.1"
+
+react-devtools-core@^4.19.1:
+ version "4.28.5"
+ resolved "https://registry.yarnpkg.com/react-devtools-core/-/react-devtools-core-4.28.5.tgz#c8442b91f068cdf0c899c543907f7f27d79c2508"
+ integrity sha512-cq/o30z9W2Wb4rzBefjv5fBalHU0rJGZCHAkf/RHSBWSSYwh8PlQTqqOJmgIIbBtpj27T6FIPXeomIjZtCNVqA==
+ dependencies:
+ shell-quote "^1.6.1"
+ ws "^7"
+
+react-is@^16.13.1:
+ version "16.13.1"
+ resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4"
+ integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==
+
+react-reconciler@^0.26.2:
+ version "0.26.2"
+ resolved "https://registry.yarnpkg.com/react-reconciler/-/react-reconciler-0.26.2.tgz#bbad0e2d1309423f76cf3c3309ac6c96e05e9d91"
+ integrity sha512-nK6kgY28HwrMNwDnMui3dvm3rCFjZrcGiuwLc5COUipBK5hWHLOxMJhSnSomirqWwjPBJKV1QcbkI0VJr7Gl1Q==
+ dependencies:
+ loose-envify "^1.1.0"
+ object-assign "^4.1.1"
+ scheduler "^0.20.2"
+
+react@^17.0.2:
+ version "17.0.2"
+ resolved "https://registry.yarnpkg.com/react/-/react-17.0.2.tgz#d0b5cc516d29eb3eee383f75b62864cfb6800037"
+ integrity sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==
+ dependencies:
+ loose-envify "^1.1.0"
+ object-assign "^4.1.1"
+
+readable-stream@3, readable-stream@^3.0.0, readable-stream@^3.4.0, readable-stream@^3.6.0:
+ version "3.6.2"
+ resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967"
+ integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==
+ dependencies:
+ inherits "^2.0.3"
+ string_decoder "^1.1.1"
+ util-deprecate "^1.0.1"
+
+readable-stream@^4.5.2:
+ version "4.5.2"
+ resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-4.5.2.tgz#9e7fc4c45099baeed934bff6eb97ba6cf2729e09"
+ integrity sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==
+ dependencies:
+ abort-controller "^3.0.0"
+ buffer "^6.0.3"
+ events "^3.3.0"
+ process "^0.11.10"
+ string_decoder "^1.3.0"
+
+readdirp@^4.0.1:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-4.0.2.tgz#388fccb8b75665da3abffe2d8f8ed59fe74c230a"
+ integrity sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA==
+
+readdirp@~3.6.0:
+ version "3.6.0"
+ resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7"
+ integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==
+ dependencies:
+ picomatch "^2.2.1"
+
+regexp.prototype.flags@^1.5.2:
+ version "1.5.3"
+ resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.3.tgz#b3ae40b1d2499b8350ab2c3fe6ef3845d3a96f42"
+ integrity sha512-vqlC04+RQoFalODCbCumG2xIOvapzVMHwsyIGM/SIE8fRhFFsXeH8/QQ+s0T0kDAhKc4k30s73/0ydkHQz6HlQ==
+ dependencies:
+ call-bind "^1.0.7"
+ define-properties "^1.2.1"
+ es-errors "^1.3.0"
+ set-function-name "^2.0.2"
+
+registry-auth-token@^5.0.1:
+ version "5.0.2"
+ resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-5.0.2.tgz#8b026cc507c8552ebbe06724136267e63302f756"
+ integrity sha512-o/3ikDxtXaA59BmZuZrJZDJv8NMDGSj+6j6XaeBmHw8eY1i1qd9+6H+LjVvQXx3HN6aRCGa1cUdJ9RaJZUugnQ==
+ dependencies:
+ "@pnpm/npm-conf" "^2.1.0"
+
+registry-url@^6.0.0:
+ version "6.0.1"
+ resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-6.0.1.tgz#056d9343680f2f64400032b1e199faa692286c58"
+ integrity sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q==
+ dependencies:
+ rc "1.2.8"
+
+request@^2.79.0:
+ version "2.88.2"
+ resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3"
+ integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==
+ dependencies:
+ aws-sign2 "~0.7.0"
+ aws4 "^1.8.0"
+ caseless "~0.12.0"
+ combined-stream "~1.0.6"
+ extend "~3.0.2"
+ forever-agent "~0.6.1"
+ form-data "~2.3.2"
+ har-validator "~5.1.3"
+ http-signature "~1.2.0"
+ is-typedarray "~1.0.0"
+ isstream "~0.1.2"
+ json-stringify-safe "~5.0.1"
+ mime-types "~2.1.19"
+ oauth-sign "~0.9.0"
+ performance-now "^2.1.0"
+ qs "~6.5.2"
+ safe-buffer "^5.1.2"
+ tough-cookie "~2.5.0"
+ tunnel-agent "^0.6.0"
+ uuid "^3.3.2"
+
+require-directory@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42"
+ integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==
+
+require-from-string@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909"
+ integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==
+
+resolve-alpn@^1.0.0, resolve-alpn@^1.2.0:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/resolve-alpn/-/resolve-alpn-1.2.1.tgz#b7adbdac3546aaaec20b45e7d8265927072726f9"
+ integrity sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==
+
+resolve-from@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6"
+ integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==
+
+resolve-pkg-maps@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz#616b3dc2c57056b5588c31cdf4b3d64db133720f"
+ integrity sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==
+
+resolve@1.17.0:
+ version "1.17.0"
+ resolved "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz"
+ integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==
+ dependencies:
+ path-parse "^1.0.6"
+
+resolve@^1.22.4:
+ version "1.22.8"
+ resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d"
+ integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==
+ dependencies:
+ is-core-module "^2.13.0"
+ path-parse "^1.0.7"
+ supports-preserve-symlinks-flag "^1.0.0"
+
+responselike@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/responselike/-/responselike-2.0.1.tgz#9a0bc8fdc252f3fb1cca68b016591059ba1422bc"
+ integrity sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==
+ dependencies:
+ lowercase-keys "^2.0.0"
+
+responselike@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/responselike/-/responselike-3.0.0.tgz#20decb6c298aff0dbee1c355ca95461d42823626"
+ integrity sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==
+ dependencies:
+ lowercase-keys "^3.0.0"
+
+restore-cursor@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e"
+ integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==
+ dependencies:
+ onetime "^5.1.0"
+ signal-exit "^3.0.2"
+
+reusify@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76"
+ integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==
+
+rimraf@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a"
+ integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==
+ dependencies:
+ glob "^7.1.3"
+
+ripemd160@^2.0.0, ripemd160@^2.0.1:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c"
+ integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==
+ dependencies:
+ hash-base "^3.0.0"
+ inherits "^2.0.1"
+
+rlp@^2.2.3, rlp@^2.2.4:
+ version "2.2.7"
+ resolved "https://registry.yarnpkg.com/rlp/-/rlp-2.2.7.tgz#33f31c4afac81124ac4b283e2bd4d9720b30beaf"
+ integrity sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ==
+ dependencies:
+ bn.js "^5.2.0"
+
+run-parallel@^1.1.9:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee"
+ integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==
+ dependencies:
+ queue-microtask "^1.2.2"
+
+safe-array-concat@^1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.1.2.tgz#81d77ee0c4e8b863635227c721278dd524c20edb"
+ integrity sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==
+ dependencies:
+ call-bind "^1.0.7"
+ get-intrinsic "^1.2.4"
+ has-symbols "^1.0.3"
+ isarray "^2.0.5"
+
+safe-buffer@5.2.1, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@^5.2.1, safe-buffer@~5.2.0:
+ version "5.2.1"
+ resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6"
+ integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
+
+safe-buffer@~5.1.0:
+ version "5.1.2"
+ resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
+ integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==
+
+safe-regex-test@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.3.tgz#a5b4c0f06e0ab50ea2c395c14d8371232924c377"
+ integrity sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==
+ dependencies:
+ call-bind "^1.0.6"
+ es-errors "^1.3.0"
+ is-regex "^1.1.4"
+
+safe-stable-stringify@^2.3.1:
+ version "2.5.0"
+ resolved "https://registry.yarnpkg.com/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz#4ca2f8e385f2831c432a719b108a3bf7af42a1dd"
+ integrity sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==
+
+"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
+ integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
+
+scheduler@^0.20.2:
+ version "0.20.2"
+ resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.20.2.tgz#4baee39436e34aa93b4874bddcbf0fe8b8b50e91"
+ integrity sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==
+ dependencies:
+ loose-envify "^1.1.0"
+ object-assign "^4.1.1"
+
+scrypt-js@3.0.1, scrypt-js@^3.0.0, scrypt-js@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/scrypt-js/-/scrypt-js-3.0.1.tgz#d314a57c2aef69d1ad98a138a21fe9eafa9ee312"
+ integrity sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==
+
+secp256k1@^4.0.1:
+ version "4.0.4"
+ resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-4.0.4.tgz#58f0bfe1830fe777d9ca1ffc7574962a8189f8ab"
+ integrity sha512-6JfvwvjUOn8F/jUoBY2Q1v5WY5XS+rj8qSe0v8Y4ezH4InLgTEeOOPQsRll9OV429Pvo6BCHGavIyJfr3TAhsw==
+ dependencies:
+ elliptic "^6.5.7"
+ node-addon-api "^5.0.0"
+ node-gyp-build "^4.2.0"
+
+semver@^5.5.0:
+ version "5.7.2"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8"
+ integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==
+
+semver@^6.3.0, semver@^6.3.1:
+ version "6.3.1"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4"
+ integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==
+
+semver@^7.3.7, semver@^7.5.2, semver@^7.5.4, semver@^7.6.0, semver@^7.6.2, semver@^7.6.3:
+ version "7.6.3"
+ resolved "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz"
+ integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==
+
+send@0.19.0:
+ version "0.19.0"
+ resolved "https://registry.yarnpkg.com/send/-/send-0.19.0.tgz#bbc5a388c8ea6c048967049dbeac0e4a3f09d7f8"
+ integrity sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==
+ 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"
+
+serialize-javascript@^6.0.2:
+ version "6.0.2"
+ resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.2.tgz#defa1e055c83bf6d59ea805d8da862254eb6a6c2"
+ integrity sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==
+ dependencies:
+ randombytes "^2.1.0"
+
+serve-static@1.16.2:
+ version "1.16.2"
+ resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.16.2.tgz#b6a5343da47f6bdd2673848bf45754941e803296"
+ integrity sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==
+ dependencies:
+ encodeurl "~2.0.0"
+ escape-html "~1.0.3"
+ parseurl "~1.3.3"
+ send "0.19.0"
+
+servify@^0.1.12:
+ version "0.1.12"
+ resolved "https://registry.yarnpkg.com/servify/-/servify-0.1.12.tgz#142ab7bee1f1d033b66d0707086085b17c06db95"
+ integrity sha512-/xE6GvsKKqyo1BAY+KxOWXcLpPsUUyji7Qg3bVD7hh1eRze5bR1uYiuDA/k3Gof1s9BTzQZEJK8sNcNGFIzeWw==
+ dependencies:
+ body-parser "^1.16.0"
+ cors "^2.8.1"
+ express "^4.14.0"
+ request "^2.79.0"
+ xhr "^2.3.3"
+
+set-function-length@^1.2.1:
+ version "1.2.2"
+ resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449"
+ integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==
+ dependencies:
+ define-data-property "^1.1.4"
+ es-errors "^1.3.0"
+ function-bind "^1.1.2"
+ get-intrinsic "^1.2.4"
+ gopd "^1.0.1"
+ has-property-descriptors "^1.0.2"
+
+set-function-name@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.2.tgz#16a705c5a0dc2f5e638ca96d8a8cd4e1c2b90985"
+ integrity sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==
+ dependencies:
+ define-data-property "^1.1.4"
+ es-errors "^1.3.0"
+ functions-have-names "^1.2.3"
+ has-property-descriptors "^1.0.2"
+
+setimmediate@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285"
+ integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==
+
+setprototypeof@1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424"
+ integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==
+
+sha.js@^2.4.0, sha.js@^2.4.8:
+ version "2.4.11"
+ resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7"
+ integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==
+ dependencies:
+ inherits "^2.0.1"
+ safe-buffer "^5.0.1"
+
+shebang-command@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea"
+ integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==
+ dependencies:
+ shebang-regex "^3.0.0"
+
+shebang-regex@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172"
+ integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==
+
+shell-quote@^1.6.1:
+ version "1.8.1"
+ resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.8.1.tgz#6dbf4db75515ad5bac63b4f1894c3a154c766680"
+ integrity sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==
+
+side-channel@^1.0.4, side-channel@^1.0.6:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.6.tgz#abd25fb7cd24baf45466406b1096b7831c9215f2"
+ integrity sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==
+ dependencies:
+ call-bind "^1.0.7"
+ es-errors "^1.3.0"
+ get-intrinsic "^1.2.4"
+ object-inspect "^1.13.1"
+
+signal-exit@^3.0.2:
+ version "3.0.7"
+ resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9"
+ integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==
+
+simple-concat@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f"
+ integrity sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==
+
+simple-get@^2.7.0:
+ version "2.8.2"
+ resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-2.8.2.tgz#5708fb0919d440657326cd5fe7d2599d07705019"
+ integrity sha512-Ijd/rV5o+mSBBs4F/x9oDPtTx9Zb6X9brmnXvMW4J7IR15ngi9q5xxqWBKU744jTZiaXtxaPL7uHG6vtN8kUkw==
+ dependencies:
+ decompress-response "^3.3.0"
+ once "^1.3.1"
+ simple-concat "^1.0.0"
+
+simple-swizzle@^0.2.2:
+ version "0.2.2"
+ resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a"
+ integrity sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==
+ dependencies:
+ is-arrayish "^0.3.1"
+
+sisteransi@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed"
+ integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==
+
+slash@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634"
+ integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==
+
+slash@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/slash/-/slash-4.0.0.tgz#2422372176c4c6c5addb5e2ada885af984b396a7"
+ integrity sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==
+
+slice-ansi@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-3.0.0.tgz#31ddc10930a1b7e0b67b08c96c2f49b77a789787"
+ integrity sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==
+ dependencies:
+ ansi-styles "^4.0.0"
+ astral-regex "^2.0.0"
+ is-fullwidth-code-point "^3.0.0"
+
+slice-ansi@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b"
+ integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==
+ dependencies:
+ ansi-styles "^4.0.0"
+ astral-regex "^2.0.0"
+ is-fullwidth-code-point "^3.0.0"
+
+solc@0.8.26:
+ version "0.8.26"
+ resolved "https://registry.yarnpkg.com/solc/-/solc-0.8.26.tgz#afc78078953f6ab3e727c338a2fefcd80dd5b01a"
+ integrity sha512-yiPQNVf5rBFHwN6SIf3TUUvVAFKcQqmSUFeq+fb6pNRCo0ZCgpYOZDi3BVoezCPIAcKrVYd/qXlBLUP9wVrZ9g==
+ dependencies:
+ command-exists "^1.2.8"
+ commander "^8.1.0"
+ follow-redirects "^1.12.1"
+ js-sha3 "0.8.0"
+ memorystream "^0.3.1"
+ semver "^5.5.0"
+ tmp "0.0.33"
+
+solhint@^4.0.0, solhint@^4.1.1:
+ version "4.5.4"
+ resolved "https://registry.yarnpkg.com/solhint/-/solhint-4.5.4.tgz#171cf33f46c36b8499efe60c0e425f6883a54e50"
+ integrity sha512-Cu1XiJXub2q1eCr9kkJ9VPv1sGcmj3V7Zb76B0CoezDOB9bu3DxKIFFH7ggCl9fWpEPD6xBmRLfZrYijkVmujQ==
+ dependencies:
+ "@solidity-parser/parser" "^0.18.0"
+ ajv "^6.12.6"
+ antlr4 "^4.13.1-patch-1"
+ ast-parents "^0.0.1"
+ chalk "^4.1.2"
+ commander "^10.0.0"
+ cosmiconfig "^8.0.0"
+ fast-diff "^1.2.0"
+ glob "^8.0.3"
+ ignore "^5.2.4"
+ js-yaml "^4.1.0"
+ latest-version "^7.0.0"
+ lodash "^4.17.21"
+ pluralize "^8.0.0"
+ semver "^7.5.2"
+ strip-ansi "^6.0.1"
+ table "^6.8.1"
+ text-table "^0.2.0"
+ optionalDependencies:
+ prettier "^2.8.3"
+
+solidity-bytes-utils@^0.8.2:
+ version "0.8.2"
+ resolved "https://registry.yarnpkg.com/solidity-bytes-utils/-/solidity-bytes-utils-0.8.2.tgz#763d6a02fd093e93b3a97b742e97d540e66c29bd"
+ integrity sha512-cqXPYAV2auhpdKSTPuqji0CwpSceZDu95CzqSM/9tDJ2MoMaMsdHTpOIWtVw31BIqqGPNmIChCswzbw0tHaMTw==
+ dependencies:
+ ds-test "github:dapphub/ds-test"
+ forge-std "^1.1.2"
+
+sort-object-keys@^1.1.3:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/sort-object-keys/-/sort-object-keys-1.1.3.tgz#bff833fe85cab147b34742e45863453c1e190b45"
+ integrity sha512-855pvK+VkU7PaKYPc+Jjnmt4EzejQHyhhF33q31qG8x7maDzkeFhAAThdCYay11CISO+qAMwjOBP+fPZe0IPyg==
+
+sort-package-json@2.10.1:
+ version "2.10.1"
+ resolved "https://registry.yarnpkg.com/sort-package-json/-/sort-package-json-2.10.1.tgz#18e7fa0172233cb2d4d926f7c99e6bfcf4d1d25c"
+ integrity sha512-d76wfhgUuGypKqY72Unm5LFnMpACbdxXsLPcL27pOsSrmVqH3PztFp1uq+Z22suk15h7vXmTesuh2aEjdCqb5w==
+ dependencies:
+ detect-indent "^7.0.1"
+ detect-newline "^4.0.0"
+ get-stdin "^9.0.0"
+ git-hooks-list "^3.0.0"
+ globby "^13.1.2"
+ is-plain-obj "^4.1.0"
+ semver "^7.6.0"
+ sort-object-keys "^1.1.3"
+
+source-map-support@^0.5.13:
+ version "0.5.21"
+ resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f"
+ integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==
+ dependencies:
+ buffer-from "^1.0.0"
+ source-map "^0.6.0"
+
+source-map@^0.6.0:
+ version "0.6.1"
+ resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
+ integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
+
+split2@^3.0.0:
+ version "3.2.2"
+ resolved "https://registry.yarnpkg.com/split2/-/split2-3.2.2.tgz#bf2cf2a37d838312c249c89206fd7a17dd12365f"
+ integrity sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==
+ dependencies:
+ readable-stream "^3.0.0"
+
+sshpk@^1.7.0:
+ version "1.18.0"
+ resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.18.0.tgz#1663e55cddf4d688b86a46b77f0d5fe363aba028"
+ integrity sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==
+ dependencies:
+ asn1 "~0.2.3"
+ assert-plus "^1.0.0"
+ bcrypt-pbkdf "^1.0.0"
+ dashdash "^1.12.0"
+ ecc-jsbn "~0.1.1"
+ getpass "^0.1.1"
+ jsbn "~0.1.0"
+ safer-buffer "^2.0.2"
+ tweetnacl "~0.14.0"
+
+stack-trace@0.0.x:
+ version "0.0.10"
+ resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0"
+ integrity sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==
+
+stack-utils@^2.0.2:
+ version "2.0.6"
+ resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.6.tgz#aaf0748169c02fc33c8232abccf933f54a1cc34f"
+ integrity sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==
+ dependencies:
+ escape-string-regexp "^2.0.0"
+
+stacktrace-parser@^0.1.10:
+ version "0.1.10"
+ resolved "https://registry.yarnpkg.com/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz#29fb0cae4e0d0b85155879402857a1639eb6051a"
+ integrity sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg==
+ dependencies:
+ type-fest "^0.7.1"
+
+statuses@2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63"
+ integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==
+
+strict-uri-encode@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713"
+ integrity sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ==
+
+string-similarity@^4.0.3:
+ version "4.0.4"
+ resolved "https://registry.yarnpkg.com/string-similarity/-/string-similarity-4.0.4.tgz#42d01ab0b34660ea8a018da8f56a3309bb8b2a5b"
+ integrity sha512-/q/8Q4Bl4ZKAPjj8WerIBJWALKkaPRfrvhfF8k/B23i4nzrlRj2/go1m90In7nG/3XDSbOo0+pu6RvCTM9RGMQ==
+
+string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2, string-width@^4.2.3:
+ version "4.2.3"
+ resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010"
+ integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
+ dependencies:
+ emoji-regex "^8.0.0"
+ is-fullwidth-code-point "^3.0.0"
+ strip-ansi "^6.0.1"
+
+string.prototype.trim@^1.2.9:
+ version "1.2.9"
+ resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz#b6fa326d72d2c78b6df02f7759c73f8f6274faa4"
+ integrity sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==
+ dependencies:
+ call-bind "^1.0.7"
+ define-properties "^1.2.1"
+ es-abstract "^1.23.0"
+ es-object-atoms "^1.0.0"
+
+string.prototype.trimend@^1.0.8:
+ version "1.0.8"
+ resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz#3651b8513719e8a9f48de7f2f77640b26652b229"
+ integrity sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==
+ dependencies:
+ call-bind "^1.0.7"
+ define-properties "^1.2.1"
+ es-object-atoms "^1.0.0"
+
+string.prototype.trimstart@^1.0.8:
+ version "1.0.8"
+ resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz#7ee834dda8c7c17eff3118472bb35bfedaa34dde"
+ integrity sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==
+ dependencies:
+ call-bind "^1.0.7"
+ define-properties "^1.2.1"
+ es-object-atoms "^1.0.0"
+
+string_decoder@^1.1.1, string_decoder@^1.3.0:
+ version "1.3.0"
+ resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz"
+ integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==
+ dependencies:
+ safe-buffer "~5.2.0"
+
+strip-ansi@^6.0.0, strip-ansi@^6.0.1:
+ version "6.0.1"
+ resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
+ integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
+ dependencies:
+ ansi-regex "^5.0.1"
+
+strip-bom@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3"
+ integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==
+
+strip-hex-prefix@1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz#0c5f155fef1151373377de9dbb588da05500e36f"
+ integrity sha512-q8d4ue7JGEiVcypji1bALTos+0pWtyGlivAWyPuTkHzuTCJqrK9sWxYQZUq6Nq3cuyv3bm734IhHvHtGGURU6A==
+ dependencies:
+ is-hex-prefixed "1.0.0"
+
+strip-json-comments@^3.1.1:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006"
+ integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==
+
+strip-json-comments@~2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a"
+ integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==
+
+supports-color@^5.3.0:
+ version "5.5.0"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f"
+ integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==
+ dependencies:
+ has-flag "^3.0.0"
+
+supports-color@^7.1.0:
+ version "7.2.0"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da"
+ integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==
+ dependencies:
+ has-flag "^4.0.0"
+
+supports-color@^8.1.1:
+ version "8.1.1"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c"
+ integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==
+ dependencies:
+ has-flag "^4.0.0"
+
+supports-preserve-symlinks-flag@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09"
+ integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==
+
+swarm-js@^0.1.40:
+ version "0.1.42"
+ resolved "https://registry.yarnpkg.com/swarm-js/-/swarm-js-0.1.42.tgz#497995c62df6696f6e22372f457120e43e727979"
+ integrity sha512-BV7c/dVlA3R6ya1lMlSSNPLYrntt0LUq4YMgy3iwpCIc6rZnS5W2wUoctarZ5pXlpKtxDDf9hNziEkcfrxdhqQ==
+ dependencies:
+ bluebird "^3.5.0"
+ buffer "^5.0.5"
+ eth-lib "^0.1.26"
+ fs-extra "^4.0.2"
+ got "^11.8.5"
+ mime-types "^2.1.16"
+ mkdirp-promise "^5.0.1"
+ mock-fs "^4.1.0"
+ setimmediate "^1.0.5"
+ tar "^4.0.2"
+ xhr-request "^1.0.1"
+
+synckit@0.9.2, synckit@^0.9.1:
+ version "0.9.2"
+ resolved "https://registry.yarnpkg.com/synckit/-/synckit-0.9.2.tgz#a3a935eca7922d48b9e7d6c61822ee6c3ae4ec62"
+ integrity sha512-vrozgXDQwYO72vHjUb/HnFbQx1exDjoKzqx23aXEg2a9VIg2TSFZ8FmeZpTjUCFMYw7mpX4BE2SFu8wI7asYsw==
+ dependencies:
+ "@pkgr/core" "^0.1.0"
+ tslib "^2.6.2"
+
+table@^6.8.0, table@^6.8.1, table@~6.8.2:
+ version "6.8.2"
+ resolved "https://registry.yarnpkg.com/table/-/table-6.8.2.tgz#c5504ccf201213fa227248bdc8c5569716ac6c58"
+ integrity sha512-w2sfv80nrAh2VCbqR5AK27wswXhqcck2AhfnNW76beQXskGZ1V12GwS//yYVa3d3fcvAip2OUnbDAjW2k3v9fA==
+ dependencies:
+ ajv "^8.0.1"
+ lodash.truncate "^4.4.2"
+ slice-ansi "^4.0.0"
+ string-width "^4.2.3"
+ strip-ansi "^6.0.1"
+
+tapable@^2.2.0:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0"
+ integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==
+
+tar@^4.0.2:
+ version "4.4.19"
+ resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.19.tgz#2e4d7263df26f2b914dee10c825ab132123742f3"
+ integrity sha512-a20gEsvHnWe0ygBY8JbxoM4w3SJdhc7ZAuxkLqh+nvNQN2IOt0B5lLgM490X5Hl8FF0dl0tOf2ewFYAlIFgzVA==
+ dependencies:
+ chownr "^1.1.4"
+ fs-minipass "^1.2.7"
+ minipass "^2.9.0"
+ minizlib "^1.3.3"
+ mkdirp "^0.5.5"
+ safe-buffer "^5.2.1"
+ yallist "^3.1.1"
+
+text-hex@1.0.x:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/text-hex/-/text-hex-1.0.0.tgz#69dc9c1b17446ee79a92bf5b884bb4b9127506f5"
+ integrity sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==
+
+text-table@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4"
+ integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==
+
+through2@^4.0.0:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/through2/-/through2-4.0.2.tgz#a7ce3ac2a7a8b0b966c80e7c49f0484c3b239764"
+ integrity sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==
+ dependencies:
+ readable-stream "3"
+
+timed-out@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f"
+ integrity sha512-G7r3AhovYtr5YKOWQkta8RKAPb+J9IsO4uVmzjl8AZwfhs8UcUwTiD6gcJYSgOtzyjvQKrKYn41syHbUWMkafA==
+
+tiny-invariant@^1.3.1:
+ version "1.3.3"
+ resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.3.3.tgz#46680b7a873a0d5d10005995eb90a70d74d60127"
+ integrity sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==
+
+tinycolor2@^1.0.0:
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/tinycolor2/-/tinycolor2-1.6.0.tgz#f98007460169b0263b97072c5ae92484ce02d09e"
+ integrity sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==
+
+tinygradient@^0.4.1:
+ version "0.4.3"
+ resolved "https://registry.yarnpkg.com/tinygradient/-/tinygradient-0.4.3.tgz#0a8dfde56f8865deec4c435a51bd5b0c0dec59fa"
+ integrity sha512-tBPYQSs6eWukzzAITBSmqcOwZCKACvRa/XjPPh1mj4mnx4G3Drm51HxyCTU/TKnY8kG4hmTe5QlOh9O82aNtJQ==
+ dependencies:
+ "@types/tinycolor2" "^1.4.0"
+ tinycolor2 "^1.0.0"
+
+tmp@0.0.33:
+ version "0.0.33"
+ resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9"
+ integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==
+ dependencies:
+ os-tmpdir "~1.0.2"
+
+to-regex-range@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4"
+ integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==
+ dependencies:
+ is-number "^7.0.0"
+
+toidentifier@1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35"
+ integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==
+
+tough-cookie@~2.5.0:
+ version "2.5.0"
+ resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2"
+ integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==
+ dependencies:
+ psl "^1.1.28"
+ punycode "^2.1.1"
+
+tr46@~0.0.3:
+ version "0.0.3"
+ resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a"
+ integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==
+
+triple-beam@^1.3.0:
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/triple-beam/-/triple-beam-1.4.1.tgz#6fde70271dc6e5d73ca0c3b24e2d92afb7441984"
+ integrity sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==
+
+ts-api-utils@^1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.3.0.tgz#4b490e27129f1e8e686b45cc4ab63714dc60eea1"
+ integrity sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==
+
+ts-node@^10.9.2:
+ version "10.9.2"
+ resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.2.tgz#70f021c9e185bccdca820e26dc413805c101c71f"
+ integrity sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==
+ dependencies:
+ "@cspotcode/source-map-support" "^0.8.0"
+ "@tsconfig/node10" "^1.0.7"
+ "@tsconfig/node12" "^1.0.7"
+ "@tsconfig/node14" "^1.0.0"
+ "@tsconfig/node16" "^1.0.2"
+ acorn "^8.4.1"
+ acorn-walk "^8.1.1"
+ arg "^4.1.0"
+ create-require "^1.1.0"
+ diff "^4.0.1"
+ make-error "^1.1.1"
+ v8-compile-cache-lib "^3.0.1"
+ yn "3.1.1"
+
+tsconfig-paths@^3.15.0:
+ version "3.15.0"
+ resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz#5299ec605e55b1abb23ec939ef15edaf483070d4"
+ integrity sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==
+ dependencies:
+ "@types/json5" "^0.0.29"
+ json5 "^1.0.2"
+ minimist "^1.2.6"
+ strip-bom "^3.0.0"
+
+tslib@^1.8.1, tslib@^1.9.3:
+ version "1.14.1"
+ resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00"
+ integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==
+
+tslib@^2.6.2:
+ version "2.8.0"
+ resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.0.tgz#d124c86c3c05a40a91e6fdea4021bd31d377971b"
+ integrity sha512-jWVzBLplnCmoaTr13V9dYbiQ99wvZRd0vNWaDRg+aVYRcjDF3nDksxFDE/+fkXnKhpnUUkmx5pK/v8mCtLVqZA==
+
+tsort@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/tsort/-/tsort-0.0.1.tgz#e2280f5e817f8bf4275657fd0f9aebd44f5a2786"
+ integrity sha512-Tyrf5mxF8Ofs1tNoxA13lFeZ2Zrbd6cKbuH3V+MQ5sb6DtBj5FjrXVsRWT8YvNAQTqNoz66dz1WsbigI22aEnw==
+
+tsutils@^3.21.0:
+ version "3.21.0"
+ resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623"
+ integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==
+ dependencies:
+ tslib "^1.8.1"
+
+tunnel-agent@^0.6.0:
+ version "0.6.0"
+ resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd"
+ integrity sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==
+ dependencies:
+ safe-buffer "^5.0.1"
+
+tweetnacl-util@^0.15.1:
+ version "0.15.1"
+ resolved "https://registry.yarnpkg.com/tweetnacl-util/-/tweetnacl-util-0.15.1.tgz#b80fcdb5c97bcc508be18c44a4be50f022eea00b"
+ integrity sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw==
+
+tweetnacl@^0.14.3, tweetnacl@~0.14.0:
+ version "0.14.5"
+ resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64"
+ integrity sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==
+
+tweetnacl@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-1.0.3.tgz#ac0af71680458d8a6378d0d0d050ab1407d35596"
+ integrity sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==
+
+type-check@^0.4.0, type-check@~0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1"
+ integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==
+ dependencies:
+ prelude-ls "^1.2.1"
+
+type-detect@^4.0.0, type-detect@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.1.0.tgz#deb2453e8f08dcae7ae98c626b13dddb0155906c"
+ integrity sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==
+
+type-fest@^0.12.0:
+ version "0.12.0"
+ resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.12.0.tgz#f57a27ab81c68d136a51fd71467eff94157fa1ee"
+ integrity sha512-53RyidyjvkGpnWPMF9bQgFtWp+Sl8O2Rp13VavmJgfAP9WWG6q6TkrKU8iyJdnwnfgHI6k2hTlgqH4aSdjoTbg==
+
+type-fest@^0.20.2:
+ version "0.20.2"
+ resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4"
+ integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==
+
+type-fest@^0.21.3:
+ version "0.21.3"
+ resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37"
+ integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==
+
+type-fest@^0.7.1:
+ version "0.7.1"
+ resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.7.1.tgz#8dda65feaf03ed78f0a3f9678f1869147f7c5c48"
+ integrity sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==
+
+type-is@~1.6.18:
+ version "1.6.18"
+ resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131"
+ integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==
+ dependencies:
+ media-typer "0.3.0"
+ mime-types "~2.1.24"
+
+type@^2.7.2:
+ version "2.7.3"
+ resolved "https://registry.yarnpkg.com/type/-/type-2.7.3.tgz#436981652129285cc3ba94f392886c2637ea0486"
+ integrity sha512-8j+1QmAbPvLZow5Qpi6NCaN8FB60p/6x8/vfNqOk/hC+HuvFZhL4+WfekuhQLiqFZXOgQdrs3B+XxEmCc6b3FQ==
+
+typed-array-buffer@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz#1867c5d83b20fcb5ccf32649e5e2fc7424474ff3"
+ integrity sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==
+ dependencies:
+ call-bind "^1.0.7"
+ es-errors "^1.3.0"
+ is-typed-array "^1.1.13"
+
+typed-array-byte-length@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz#d92972d3cff99a3fa2e765a28fcdc0f1d89dec67"
+ integrity sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==
+ dependencies:
+ call-bind "^1.0.7"
+ for-each "^0.3.3"
+ gopd "^1.0.1"
+ has-proto "^1.0.3"
+ is-typed-array "^1.1.13"
+
+typed-array-byte-offset@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz#f9ec1acb9259f395093e4567eb3c28a580d02063"
+ integrity sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==
+ dependencies:
+ available-typed-arrays "^1.0.7"
+ call-bind "^1.0.7"
+ for-each "^0.3.3"
+ gopd "^1.0.1"
+ has-proto "^1.0.3"
+ is-typed-array "^1.1.13"
+
+typed-array-length@^1.0.6:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.6.tgz#57155207c76e64a3457482dfdc1c9d1d3c4c73a3"
+ integrity sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==
+ dependencies:
+ call-bind "^1.0.7"
+ for-each "^0.3.3"
+ gopd "^1.0.1"
+ has-proto "^1.0.3"
+ is-typed-array "^1.1.13"
+ possible-typed-array-names "^1.0.0"
+
+typedarray-to-buffer@^3.1.5:
+ version "3.1.5"
+ resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080"
+ integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==
+ dependencies:
+ is-typedarray "^1.0.0"
+
+typescript@^5.4.4:
+ version "5.6.3"
+ resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.6.3.tgz#5f3449e31c9d94febb17de03cc081dd56d81db5b"
+ integrity sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==
+
+ultron@~1.1.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.1.1.tgz#9fe1536a10a664a65266a1e3ccf85fd36302bc9c"
+ integrity sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==
+
+unbox-primitive@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e"
+ integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==
+ dependencies:
+ call-bind "^1.0.2"
+ has-bigints "^1.0.2"
+ has-symbols "^1.0.3"
+ which-boxed-primitive "^1.0.2"
+
+undici-types@~5.26.4:
+ version "5.26.5"
+ resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617"
+ integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==
+
+undici@^5.14.0:
+ version "5.28.4"
+ resolved "https://registry.yarnpkg.com/undici/-/undici-5.28.4.tgz#6b280408edb6a1a604a9b20340f45b422e373068"
+ integrity sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==
+ dependencies:
+ "@fastify/busboy" "^2.0.0"
+
+universalify@^0.1.0:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66"
+ integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==
+
+universalify@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.1.tgz#168efc2180964e6386d061e094df61afe239b18d"
+ integrity sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==
+
+unpipe@1.0.0, unpipe@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec"
+ integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==
+
+update-browserslist-db@^1.1.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz#80846fba1d79e82547fb661f8d141e0945755fe5"
+ integrity sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==
+ dependencies:
+ escalade "^3.2.0"
+ picocolors "^1.1.0"
+
+uri-js@^4.2.2:
+ version "4.4.1"
+ resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e"
+ integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==
+ dependencies:
+ punycode "^2.1.0"
+
+url-set-query@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/url-set-query/-/url-set-query-1.0.0.tgz#016e8cfd7c20ee05cafe7795e892bd0702faa339"
+ integrity sha512-3AChu4NiXquPfeckE5R5cGdiHCMWJx1dwCWOmWIL4KHAziJNOFIYJlpGFeKDvwLPHovZRCxK3cYlwzqI9Vp+Gg==
+
+utf-8-validate@^5.0.2:
+ version "5.0.10"
+ resolved "https://registry.yarnpkg.com/utf-8-validate/-/utf-8-validate-5.0.10.tgz#d7d10ea39318171ca982718b6b96a8d2442571a2"
+ integrity sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==
+ dependencies:
+ node-gyp-build "^4.3.0"
+
+utf8@3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/utf8/-/utf8-3.0.0.tgz#f052eed1364d696e769ef058b183df88c87f69d1"
+ integrity sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ==
+
+util-deprecate@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
+ integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==
+
+util@^0.12.5:
+ version "0.12.5"
+ resolved "https://registry.yarnpkg.com/util/-/util-0.12.5.tgz#5f17a6059b73db61a875668781a1c2b136bd6fbc"
+ integrity sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==
+ dependencies:
+ inherits "^2.0.3"
+ is-arguments "^1.0.4"
+ is-generator-function "^1.0.7"
+ is-typed-array "^1.1.3"
+ which-typed-array "^1.1.2"
+
+utils-merge@1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713"
+ integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==
+
+uuid@^3.3.2:
+ version "3.4.0"
+ resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee"
+ integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==
+
+uuid@^8.3.2:
+ version "8.3.2"
+ resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2"
+ integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==
+
+uuid@^9.0.0:
+ version "9.0.1"
+ resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.1.tgz#e188d4c8853cc722220392c424cd637f32293f30"
+ integrity sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==
+
+v8-compile-cache-lib@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf"
+ integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==
+
+varint@^5.0.0:
+ version "5.0.2"
+ resolved "https://registry.yarnpkg.com/varint/-/varint-5.0.2.tgz#5b47f8a947eb668b848e034dcfa87d0ff8a7f7a4"
+ integrity sha512-lKxKYG6H03yCZUpAGOPOsMcGxd1RHCu1iKvEHYDPmTyq2HueGhD73ssNBqqQWfvYs04G9iUFRvmAVLW20Jw6ow==
+
+vary@^1, vary@~1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc"
+ integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==
+
+verror@1.10.0:
+ version "1.10.0"
+ resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400"
+ integrity sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==
+ dependencies:
+ assert-plus "^1.0.0"
+ core-util-is "1.0.2"
+ extsprintf "^1.2.0"
+
+web3-bzz@1.10.4:
+ version "1.10.4"
+ resolved "https://registry.yarnpkg.com/web3-bzz/-/web3-bzz-1.10.4.tgz#dcc787970767d9004c73d11d0eeef774ce16b880"
+ integrity sha512-ZZ/X4sJ0Uh2teU9lAGNS8EjveEppoHNQiKlOXAjedsrdWuaMErBPdLQjXfcrYvN6WM6Su9PMsAxf3FXXZ+HwQw==
+ dependencies:
+ "@types/node" "^12.12.6"
+ got "12.1.0"
+ swarm-js "^0.1.40"
+
+web3-core-helpers@1.10.4:
+ version "1.10.4"
+ resolved "https://registry.yarnpkg.com/web3-core-helpers/-/web3-core-helpers-1.10.4.tgz#bd2b4140df2016d5dd3bb2b925fc29ad8678677c"
+ integrity sha512-r+L5ylA17JlD1vwS8rjhWr0qg7zVoVMDvWhajWA5r5+USdh91jRUYosp19Kd1m2vE034v7Dfqe1xYRoH2zvG0g==
+ dependencies:
+ web3-eth-iban "1.10.4"
+ web3-utils "1.10.4"
+
+web3-core-method@1.10.4:
+ version "1.10.4"
+ resolved "https://registry.yarnpkg.com/web3-core-method/-/web3-core-method-1.10.4.tgz#566b52f006d3cbb13b21b72b8d2108999bf5d6bf"
+ integrity sha512-uZTb7flr+Xl6LaDsyTeE2L1TylokCJwTDrIVfIfnrGmnwLc6bmTWCCrm71sSrQ0hqs6vp/MKbQYIYqUN0J8WyA==
+ dependencies:
+ "@ethersproject/transactions" "^5.6.2"
+ web3-core-helpers "1.10.4"
+ web3-core-promievent "1.10.4"
+ web3-core-subscriptions "1.10.4"
+ web3-utils "1.10.4"
+
+web3-core-promievent@1.10.4:
+ version "1.10.4"
+ resolved "https://registry.yarnpkg.com/web3-core-promievent/-/web3-core-promievent-1.10.4.tgz#629b970b7934430b03c5033c79f3bb3893027e22"
+ integrity sha512-2de5WnJQ72YcIhYwV/jHLc4/cWJnznuoGTJGD29ncFQHAfwW/MItHFSVKPPA5v8AhJe+r6y4Y12EKvZKjQVBvQ==
+ dependencies:
+ eventemitter3 "4.0.4"
+
+web3-core-requestmanager@1.10.4:
+ version "1.10.4"
+ resolved "https://registry.yarnpkg.com/web3-core-requestmanager/-/web3-core-requestmanager-1.10.4.tgz#eb1f147e6b9df84e3a37e602162f8925bdb4bb9a"
+ integrity sha512-vqP6pKH8RrhT/2MoaU+DY/OsYK9h7HmEBNCdoMj+4ZwujQtw/Mq2JifjwsJ7gits7Q+HWJwx8q6WmQoVZAWugg==
+ 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"
+
+web3-core-subscriptions@1.10.4:
+ version "1.10.4"
+ resolved "https://registry.yarnpkg.com/web3-core-subscriptions/-/web3-core-subscriptions-1.10.4.tgz#2f4dcb404237e92802a563265d11a33934dc38e6"
+ integrity sha512-o0lSQo/N/f7/L76C0HV63+S54loXiE9fUPfHFcTtpJRQNDBVsSDdWRdePbWwR206XlsBqD5VHApck1//jEafTw==
+ dependencies:
+ eventemitter3 "4.0.4"
+ web3-core-helpers "1.10.4"
+
+web3-core@1.10.4, web3-core@^1.8.1:
+ version "1.10.4"
+ resolved "https://registry.yarnpkg.com/web3-core/-/web3-core-1.10.4.tgz#639de68b8b9871d2dc8892e0dd4e380cb1361a98"
+ integrity sha512-B6elffYm81MYZDTrat7aEhnhdtVE3lDBUZft16Z8awYMZYJDbnykEbJVS+l3mnA7AQTnSDr/1MjWofGDLBJPww==
+ dependencies:
+ "@types/bn.js" "^5.1.1"
+ "@types/node" "^12.12.6"
+ bignumber.js "^9.0.0"
+ web3-core-helpers "1.10.4"
+ web3-core-method "1.10.4"
+ web3-core-requestmanager "1.10.4"
+ web3-utils "1.10.4"
+
+web3-eth-abi@1.10.4:
+ version "1.10.4"
+ resolved "https://registry.yarnpkg.com/web3-eth-abi/-/web3-eth-abi-1.10.4.tgz#16c19d0bde0aaf8c1a56cb7743a83156d148d798"
+ integrity sha512-cZ0q65eJIkd/jyOlQPDjr8X4fU6CRL1eWgdLwbWEpo++MPU/2P4PFk5ZLAdye9T5Sdp+MomePPJ/gHjLMj2VfQ==
+ dependencies:
+ "@ethersproject/abi" "^5.6.3"
+ web3-utils "1.10.4"
+
+web3-eth-accounts@1.10.4:
+ version "1.10.4"
+ resolved "https://registry.yarnpkg.com/web3-eth-accounts/-/web3-eth-accounts-1.10.4.tgz#df30e85a7cd70e475f8cf52361befba408829e34"
+ integrity sha512-ysy5sVTg9snYS7tJjxVoQAH6DTOTkRGR8emEVCWNGLGiB9txj+qDvSeT0izjurS/g7D5xlMAgrEHLK1Vi6I3yg==
+ 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.0"
+ web3-core "1.10.4"
+ web3-core-helpers "1.10.4"
+ web3-core-method "1.10.4"
+ web3-utils "1.10.4"
+
+web3-eth-contract@1.10.4:
+ version "1.10.4"
+ resolved "https://registry.yarnpkg.com/web3-eth-contract/-/web3-eth-contract-1.10.4.tgz#22d39f04e11d9ff4e726e8025a56d78e843a2c3d"
+ integrity sha512-Q8PfolOJ4eV9TvnTj1TGdZ4RarpSLmHnUnzVxZ/6/NiTfe4maJz99R0ISgwZkntLhLRtw0C7LRJuklzGYCNN3A==
+ dependencies:
+ "@types/bn.js" "^5.1.1"
+ 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"
+
+web3-eth-ens@1.10.4:
+ version "1.10.4"
+ resolved "https://registry.yarnpkg.com/web3-eth-ens/-/web3-eth-ens-1.10.4.tgz#3d991adac52bc8e598f1f1b8528337fa6291004c"
+ integrity sha512-LLrvxuFeVooRVZ9e5T6OWKVflHPFgrVjJ/jtisRWcmI7KN/b64+D/wJzXqgmp6CNsMQcE7rpmf4CQmJCrTdsgg==
+ 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"
+
+web3-eth-iban@1.10.4:
+ version "1.10.4"
+ resolved "https://registry.yarnpkg.com/web3-eth-iban/-/web3-eth-iban-1.10.4.tgz#bc61b4a1930d19b1df8762c606d669902558e54d"
+ integrity sha512-0gE5iNmOkmtBmbKH2aTodeompnNE8jEyvwFJ6s/AF6jkw9ky9Op9cqfzS56AYAbrqEFuClsqB/AoRves7LDELw==
+ dependencies:
+ bn.js "^5.2.1"
+ web3-utils "1.10.4"
+
+web3-eth-personal@1.10.4:
+ version "1.10.4"
+ resolved "https://registry.yarnpkg.com/web3-eth-personal/-/web3-eth-personal-1.10.4.tgz#e2ee920f47e84848288e03442659cdbb2c4deea2"
+ integrity sha512-BRa/hs6jU1hKHz+AC/YkM71RP3f0Yci1dPk4paOic53R4ZZG4MgwKRkJhgt3/GPuPliwS46f/i5A7fEGBT4F9w==
+ dependencies:
+ "@types/node" "^12.12.6"
+ 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"
+
+web3-eth@1.10.4:
+ version "1.10.4"
+ resolved "https://registry.yarnpkg.com/web3-eth/-/web3-eth-1.10.4.tgz#3a908c635cb5d935bd30473e452f3bd7f2ee66a5"
+ integrity sha512-Sql2kYKmgt+T/cgvg7b9ce24uLS7xbFrxE4kuuor1zSCGrjhTJ5rRNG8gTJUkAJGKJc7KgnWmgW+cOfMBPUDSA==
+ 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"
+
+web3-net@1.10.4:
+ version "1.10.4"
+ resolved "https://registry.yarnpkg.com/web3-net/-/web3-net-1.10.4.tgz#20e12c60e4477d4298979d8d5d66b9abf8e66a09"
+ integrity sha512-mKINnhOOnZ4koA+yV2OT5s5ztVjIx7IY9a03w6s+yao/BUn+Luuty0/keNemZxTr1E8Ehvtn28vbOtW7Ids+Ow==
+ dependencies:
+ web3-core "1.10.4"
+ web3-core-method "1.10.4"
+ web3-utils "1.10.4"
+
+web3-providers-http@1.10.4:
+ version "1.10.4"
+ resolved "https://registry.yarnpkg.com/web3-providers-http/-/web3-providers-http-1.10.4.tgz#ca7aa58aeaf8123500c24ffe0595896319f830e8"
+ integrity sha512-m2P5Idc8hdiO0l60O6DSCPw0kw64Zgi0pMjbEFRmxKIck2Py57RQMu4bxvkxJwkF06SlGaEQF8rFZBmuX7aagQ==
+ dependencies:
+ abortcontroller-polyfill "^1.7.5"
+ cross-fetch "^4.0.0"
+ es6-promise "^4.2.8"
+ web3-core-helpers "1.10.4"
+
+web3-providers-ipc@1.10.4:
+ version "1.10.4"
+ resolved "https://registry.yarnpkg.com/web3-providers-ipc/-/web3-providers-ipc-1.10.4.tgz#2e03437909e4e7771d646ff05518efae44b783c3"
+ integrity sha512-YRF/bpQk9z3WwjT+A6FI/GmWRCASgd+gC0si7f9zbBWLXjwzYAKG73bQBaFRAHex1hl4CVcM5WUMaQXf3Opeuw==
+ dependencies:
+ oboe "2.1.5"
+ web3-core-helpers "1.10.4"
+
+web3-providers-ws@1.10.4:
+ version "1.10.4"
+ resolved "https://registry.yarnpkg.com/web3-providers-ws/-/web3-providers-ws-1.10.4.tgz#55d0c3ba36c6a79d105f02e20a707eb3978e7f82"
+ integrity sha512-j3FBMifyuFFmUIPVQR4pj+t5ILhAexAui0opgcpu9R5LxQrLRUZxHSnU+YO25UycSOa/NAX8A+qkqZNpcFAlxA==
+ dependencies:
+ eventemitter3 "4.0.4"
+ web3-core-helpers "1.10.4"
+ websocket "^1.0.32"
+
+web3-shh@1.10.4:
+ version "1.10.4"
+ resolved "https://registry.yarnpkg.com/web3-shh/-/web3-shh-1.10.4.tgz#9852d6f3d05678e31e49235a60fea10ca7a9e21d"
+ integrity sha512-cOH6iFFM71lCNwSQrC3niqDXagMqrdfFW85hC9PFUrAr3PUrIem8TNstTc3xna2bwZeWG6OBy99xSIhBvyIACw==
+ dependencies:
+ web3-core "1.10.4"
+ web3-core-method "1.10.4"
+ web3-core-subscriptions "1.10.4"
+ web3-net "1.10.4"
+
+web3-utils@1.10.4, web3-utils@^1.8.1:
+ version "1.10.4"
+ resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.10.4.tgz#0daee7d6841641655d8b3726baf33b08eda1cbec"
+ integrity sha512-tsu8FiKJLk2PzhDl9fXbGUWTkkVXYhtTA+SmEFkKft+9BgwLxfCRpU96sWv7ICC8zixBNd3JURVoiR3dUXgP8A==
+ dependencies:
+ "@ethereumjs/util" "^8.1.0"
+ bn.js "^5.2.1"
+ ethereum-bloom-filters "^1.0.6"
+ ethereum-cryptography "^2.1.2"
+ ethjs-unit "0.1.6"
+ number-to-bn "1.7.0"
+ randombytes "^2.1.0"
+ utf8 "3.0.0"
+
+web3@^1.8.1:
+ version "1.10.4"
+ resolved "https://registry.yarnpkg.com/web3/-/web3-1.10.4.tgz#5d5e59b976eaf758b060fe1a296da5fe87bdc79c"
+ integrity sha512-kgJvQZjkmjOEKimx/tJQsqWfRDPTTcBfYPa9XletxuHLpHcXdx67w8EFn5AW3eVxCutE9dTVHgGa9VYe8vgsEA==
+ 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"
+
+webidl-conversions@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871"
+ integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==
+
+websocket@^1.0.32:
+ version "1.0.35"
+ resolved "https://registry.yarnpkg.com/websocket/-/websocket-1.0.35.tgz#374197207d7d4cc4c36cbf8a1bb886ee52a07885"
+ integrity sha512-/REy6amwPZl44DDzvRCkaI1q1bIiQB0mEFQLUrhz3z2EK91cp3n72rAjUlrTP0zV22HJIUOVHQGPxhFRjxjt+Q==
+ dependencies:
+ bufferutil "^4.0.1"
+ debug "^2.2.0"
+ es5-ext "^0.10.63"
+ typedarray-to-buffer "^3.1.5"
+ utf-8-validate "^5.0.2"
+ yaeti "^0.0.6"
+
+whatwg-url@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d"
+ integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==
+ dependencies:
+ tr46 "~0.0.3"
+ webidl-conversions "^3.0.0"
+
+which-boxed-primitive@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6"
+ integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==
+ dependencies:
+ is-bigint "^1.0.1"
+ is-boolean-object "^1.1.0"
+ is-number-object "^1.0.4"
+ is-string "^1.0.5"
+ is-symbol "^1.0.3"
+
+which-typed-array@^1.1.14, which-typed-array@^1.1.15, which-typed-array@^1.1.2:
+ version "1.1.15"
+ resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.15.tgz#264859e9b11a649b388bfaaf4f767df1f779b38d"
+ integrity sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==
+ dependencies:
+ available-typed-arrays "^1.0.7"
+ call-bind "^1.0.7"
+ for-each "^0.3.3"
+ gopd "^1.0.1"
+ has-tostringtag "^1.0.2"
+
+which@^2.0.1:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1"
+ integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==
+ dependencies:
+ isexe "^2.0.0"
+
+widest-line@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-3.1.0.tgz#8292333bbf66cb45ff0de1603b136b7ae1496eca"
+ integrity sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==
+ dependencies:
+ string-width "^4.0.0"
+
+winston-transport@^4.7.0:
+ version "4.8.0"
+ resolved "https://registry.yarnpkg.com/winston-transport/-/winston-transport-4.8.0.tgz#a15080deaeb80338455ac52c863418c74fcf38ea"
+ integrity sha512-qxSTKswC6llEMZKgCQdaWgDuMJQnhuvF5f2Nk3SNXc4byfQ+voo2mX1Px9dkNOuR8p0KAjfPG29PuYUSIb+vSA==
+ dependencies:
+ logform "^2.6.1"
+ readable-stream "^4.5.2"
+ triple-beam "^1.3.0"
+
+winston@^3.11.0:
+ version "3.15.0"
+ resolved "https://registry.yarnpkg.com/winston/-/winston-3.15.0.tgz#4df7b70be091bc1a38a4f45b969fa79589b73ff5"
+ integrity sha512-RhruH2Cj0bV0WgNL+lOfoUBI4DVfdUNjVnJGVovWZmrcKtrFTTRzgXYK2O9cymSGjrERCtaAeHwMNnUWXlwZow==
+ dependencies:
+ "@colors/colors" "^1.6.0"
+ "@dabh/diagnostics" "^2.0.2"
+ async "^3.2.3"
+ is-stream "^2.0.0"
+ logform "^2.6.0"
+ one-time "^1.0.0"
+ readable-stream "^3.4.0"
+ safe-stable-stringify "^2.3.1"
+ stack-trace "0.0.x"
+ triple-beam "^1.3.0"
+ winston-transport "^4.7.0"
+
+word-wrap@^1.2.5:
+ version "1.2.5"
+ resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34"
+ integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==
+
+workerpool@^6.5.1:
+ version "6.5.1"
+ resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.5.1.tgz#060f73b39d0caf97c6db64da004cd01b4c099544"
+ integrity sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA==
+
+wrap-ansi@^6.2.0:
+ version "6.2.0"
+ resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53"
+ integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==
+ dependencies:
+ ansi-styles "^4.0.0"
+ string-width "^4.1.0"
+ strip-ansi "^6.0.0"
+
+wrap-ansi@^7.0.0:
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43"
+ integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==
+ dependencies:
+ ansi-styles "^4.0.0"
+ string-width "^4.1.0"
+ strip-ansi "^6.0.0"
+
+wrappy@1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
+ integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==
+
+ws@7.4.6, ws@^7, ws@^7.4.6:
+ version "7.4.6"
+ resolved "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz"
+ integrity sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==
+
+ws@^3.0.0:
+ version "3.3.3"
+ resolved "https://registry.yarnpkg.com/ws/-/ws-3.3.3.tgz#f1cf84fe2d5e901ebce94efaece785f187a228f2"
+ integrity sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==
+ dependencies:
+ async-limiter "~1.0.0"
+ safe-buffer "~5.1.0"
+ ultron "~1.1.0"
+
+ws@^7.5.5:
+ version "7.5.10"
+ resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.10.tgz#58b5c20dc281633f6c19113f39b349bd8bd558d9"
+ integrity sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==
+
+xhr-request-promise@^0.1.2:
+ version "0.1.3"
+ resolved "https://registry.yarnpkg.com/xhr-request-promise/-/xhr-request-promise-0.1.3.tgz#2d5f4b16d8c6c893be97f1a62b0ed4cf3ca5f96c"
+ integrity sha512-YUBytBsuwgitWtdRzXDDkWAXzhdGB8bYm0sSzMPZT7Z2MBjMSTHFsyCT1yCRATY+XC69DUrQraRAEgcoCRaIPg==
+ dependencies:
+ xhr-request "^1.1.0"
+
+xhr-request@^1.0.1, xhr-request@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/xhr-request/-/xhr-request-1.1.0.tgz#f4a7c1868b9f198723444d82dcae317643f2e2ed"
+ integrity sha512-Y7qzEaR3FDtL3fP30k9wO/e+FBnBByZeybKOhASsGP30NIkRAAkKD/sCnLvgEfAIEC1rcmK7YG8f4oEnIrrWzA==
+ dependencies:
+ buffer-to-arraybuffer "^0.0.5"
+ object-assign "^4.1.1"
+ query-string "^5.0.1"
+ simple-get "^2.7.0"
+ timed-out "^4.0.1"
+ url-set-query "^1.0.0"
+ xhr "^2.0.4"
+
+xhr@^2.0.4, xhr@^2.3.3:
+ version "2.6.0"
+ resolved "https://registry.yarnpkg.com/xhr/-/xhr-2.6.0.tgz#b69d4395e792b4173d6b7df077f0fc5e4e2b249d"
+ integrity sha512-/eCGLb5rxjx5e3mF1A7s+pLlR6CGyqWN91fv1JgER5mVWg1MZmlhBvy9kjcsOdRk8RrIujotWyJamfyrp+WIcA==
+ dependencies:
+ global "~4.4.0"
+ is-function "^1.0.1"
+ parse-headers "^2.0.0"
+ xtend "^4.0.0"
+
+xtend@^4.0.0:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54"
+ integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==
+
+y18n@^5.0.5:
+ version "5.0.8"
+ resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55"
+ integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==
+
+yaeti@^0.0.6:
+ version "0.0.6"
+ resolved "https://registry.yarnpkg.com/yaeti/-/yaeti-0.0.6.tgz#f26f484d72684cf42bedfb76970aa1608fbf9577"
+ integrity sha512-MvQa//+KcZCUkBTIC9blM+CU9J2GzuTytsOUwf2lidtvkx/6gnEp1QvJv34t9vdjhFmha/mUiNDbN0D0mJWdug==
+
+yallist@^3.0.0, yallist@^3.0.2, yallist@^3.1.1:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd"
+ integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==
+
+yargs-parser@^20.2.2, yargs-parser@^20.2.9:
+ version "20.2.9"
+ resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee"
+ integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==
+
+yargs-unparser@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz#f131f9226911ae5d9ad38c432fe809366c2325eb"
+ integrity sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==
+ dependencies:
+ camelcase "^6.0.0"
+ decamelize "^4.0.0"
+ flat "^5.0.2"
+ is-plain-obj "^2.1.0"
+
+yargs@^16.2.0:
+ version "16.2.0"
+ resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66"
+ integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==
+ dependencies:
+ cliui "^7.0.2"
+ escalade "^3.1.1"
+ get-caller-file "^2.0.5"
+ require-directory "^2.1.1"
+ string-width "^4.2.0"
+ y18n "^5.0.5"
+ yargs-parser "^20.2.2"
+
+yn@3.1.1:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50"
+ integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==
+
+yocto-queue@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b"
+ integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==
+
+yoga-layout-prebuilt@^1.10.0, yoga-layout-prebuilt@^1.9.6:
+ version "1.10.0"
+ resolved "https://registry.yarnpkg.com/yoga-layout-prebuilt/-/yoga-layout-prebuilt-1.10.0.tgz#2936fbaf4b3628ee0b3e3b1df44936d6c146faa6"
+ integrity sha512-YnOmtSbv4MTf7RGJMK0FvZ+KD8OEe/J5BNnR0GHhD8J/XcG/Qvxgszm0Un6FTHWW4uHlTgP0IztiXQnGyIR45g==
+ dependencies:
+ "@types/yoga-layout" "1.9.2"
+
+zksync-ethers@^5.0.0:
+ version "5.9.2"
+ resolved "https://registry.yarnpkg.com/zksync-ethers/-/zksync-ethers-5.9.2.tgz#1c5f34cb25ac0b040fd1a6118f2ba1c2c3bda090"
+ integrity sha512-Y2Mx6ovvxO6UdC2dePLguVzvNToOY8iLWeq5ne+jgGSJxAi/f4He/NF6FNsf6x1aWX0o8dy4Df8RcOQXAkj5qw==
+ dependencies:
+ ethers "~5.7.0"
+
+zksync-web3@^0.14.3:
+ version "0.14.4"
+ resolved "https://registry.yarnpkg.com/zksync-web3/-/zksync-web3-0.14.4.tgz#0b70a7e1a9d45cc57c0971736079185746d46b1f"
+ integrity sha512-kYehMD/S6Uhe1g434UnaMN+sBr9nQm23Ywn0EUP5BfQCsbjcr3ORuS68PosZw8xUTu3pac7G6YMSnNHk+fwzvg==
+
+zod@^3.22.4:
+ version "3.23.8"
+ resolved "https://registry.yarnpkg.com/zod/-/zod-3.23.8.tgz#e37b957b5d52079769fb8097099b592f0ef4067d"
+ integrity sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==
diff --git a/projects/rate-providers/contracts/RateProvider.sol b/projects/rate-providers/contracts/RateProvider.sol
index 5b92191b..6330885d 100644
--- a/projects/rate-providers/contracts/RateProvider.sol
+++ b/projects/rate-providers/contracts/RateProvider.sol
@@ -13,7 +13,7 @@ interface IRateProvider {
/**
* @title RateProvider
- * @author GenesisLRT
+ * @author InceptionLRT
* @notice Redemption rate provider for balancer.
*/
contract InEthRateProvider is IRateProvider {
diff --git a/projects/rate-providers/package.json b/projects/rate-providers/package.json
index 26e34538..cf1cffd1 100644
--- a/projects/rate-providers/package.json
+++ b/projects/rate-providers/package.json
@@ -1,5 +1,6 @@
{
"name": "hardhat-project",
+ "version": "1.0.0",
"devDependencies": {
"@nomicfoundation/hardhat-chai-matchers": "^2.0.0",
"@nomicfoundation/hardhat-ethers": "^3.0.0",
@@ -18,4 +19,4 @@
"solidity-coverage": "^0.8.1",
"typechain": "^8.3.0"
}
-}
+}
\ No newline at end of file
diff --git a/projects/restaking-pool/.openzeppelin/sepolia.json b/projects/restaking-pool/.openzeppelin/sepolia.json
new file mode 100644
index 00000000..9a94a7fd
--- /dev/null
+++ b/projects/restaking-pool/.openzeppelin/sepolia.json
@@ -0,0 +1,291 @@
+{
+ "manifestVersion": "3.2",
+ "proxies": [
+ {
+ "address": "0x41D7935C6D733De81C24982929a15B07991738fB",
+ "txHash": "0xc17cb3c1d64b68106479eec4eeceefa8bfdce4092449469e17a99886036ee44c",
+ "kind": "transparent"
+ },
+ {
+ "address": "0xA68c6f12E69b4DE5e5916FC33e41Da0672D85b94",
+ "txHash": "0xf0a9d03803b021ed91d60e3649372b5f07ca92fad0a4017de69db0f103fc6e76",
+ "kind": "transparent"
+ },
+ {
+ "address": "0xa64D61b9148448Ce36C501f6Cb78Fe9fe3ed929A",
+ "txHash": "0x3ffc944d7780aa54ec832d0c07cb243b92750e1910dbf1b802dc5a5cd9f0ac46",
+ "kind": "transparent"
+ },
+ {
+ "address": "0x712D2D174d83c73b47021C7b483b8A3311a900a1",
+ "txHash": "0x1fa0662286dfdb338ab2ca481a5b4951ec4f53431445b28948b42dda1aaf61aa",
+ "kind": "transparent"
+ },
+ {
+ "address": "0x10322282E0cBd8047AC06a10CC01E4BBaD0Bbb25",
+ "txHash": "0x96f9636b3296a4b04298ab117ae3e8093c56b6ff490eaed8744d97b0b8c12cc5",
+ "kind": "transparent"
+ }
+ ],
+ "impls": {
+ "7675dfba73362e7c8833cf4e2bf71076740b99e4be11ee21111c947534434bce": {
+ "address": "0x87a02957F7AdAA7a0c31237443a964d3bfc2Bb9F",
+ "txHash": "0xeda63c35859ecdb783dd0a4b752b50e6a7dc5ec8fb383a8740ea1d30f5c4e5ea",
+ "layout": {
+ "solcVersion": "0.8.26",
+ "storage": [],
+ "types": {
+ "t_bool": {
+ "label": "bool",
+ "numberOfBytes": "1"
+ },
+ "t_struct(InitializableStorage)64_storage": {
+ "label": "struct Initializable.InitializableStorage",
+ "members": [
+ {
+ "label": "_initialized",
+ "type": "t_uint64",
+ "offset": 0,
+ "slot": "0"
+ },
+ {
+ "label": "_initializing",
+ "type": "t_bool",
+ "offset": 8,
+ "slot": "0"
+ }
+ ],
+ "numberOfBytes": "32"
+ },
+ "t_uint64": {
+ "label": "uint64",
+ "numberOfBytes": "8"
+ }
+ },
+ "namespaces": {
+ "erc7201:openzeppelin.storage.Initializable": [
+ {
+ "contract": "Initializable",
+ "label": "_initialized",
+ "type": "t_uint64",
+ "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:69",
+ "offset": 0,
+ "slot": "0"
+ },
+ {
+ "contract": "Initializable",
+ "label": "_initializing",
+ "type": "t_bool",
+ "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:73",
+ "offset": 8,
+ "slot": "0"
+ }
+ ]
+ }
+ }
+ },
+ "6486ba5e9e84e615e41ea3cf8c03d783232a4eff34b03bf7e2604e599b164d18": {
+ "address": "0x87bbA3c0F709ed064c2465Ea3A7Edb3e29686bBa",
+ "txHash": "0x49d367f10807d470a613e22a01f6636ee877bb0d1e716f208d150ee7dd586d2a",
+ "layout": {
+ "solcVersion": "0.8.27",
+ "storage": [
+ {
+ "label": "inETHAddress",
+ "offset": 0,
+ "slot": "0",
+ "type": "t_address",
+ "contract": "Rebalancer",
+ "src": "contracts/Rebalancer.sol:21"
+ },
+ {
+ "label": "lockboxAddress",
+ "offset": 0,
+ "slot": "1",
+ "type": "t_address",
+ "contract": "Rebalancer",
+ "src": "contracts/Rebalancer.sol:22"
+ },
+ {
+ "label": "liqPool",
+ "offset": 0,
+ "slot": "2",
+ "type": "t_address_payable",
+ "contract": "Rebalancer",
+ "src": "contracts/Rebalancer.sol:23"
+ },
+ {
+ "label": "ratioFeed",
+ "offset": 0,
+ "slot": "3",
+ "type": "t_address",
+ "contract": "Rebalancer",
+ "src": "contracts/Rebalancer.sol:24"
+ },
+ {
+ "label": "operator",
+ "offset": 0,
+ "slot": "4",
+ "type": "t_address",
+ "contract": "Rebalancer",
+ "src": "contracts/Rebalancer.sol:25"
+ },
+ {
+ "label": "txs",
+ "offset": 0,
+ "slot": "5",
+ "type": "t_mapping(t_uint256,t_struct(Transaction)1835_storage)",
+ "contract": "Rebalancer",
+ "src": "contracts/Rebalancer.sol:29"
+ },
+ {
+ "label": "adapters",
+ "offset": 0,
+ "slot": "6",
+ "type": "t_mapping(t_uint256,t_address_payable)",
+ "contract": "Rebalancer",
+ "src": "contracts/Rebalancer.sol:30"
+ },
+ {
+ "label": "defaultAdapter",
+ "offset": 0,
+ "slot": "7",
+ "type": "t_address_payable",
+ "contract": "Rebalancer",
+ "src": "contracts/Rebalancer.sol:31"
+ },
+ {
+ "label": "chainIds",
+ "offset": 0,
+ "slot": "8",
+ "type": "t_array(t_uint32)dyn_storage",
+ "contract": "Rebalancer",
+ "src": "contracts/Rebalancer.sol:32"
+ }
+ ],
+ "types": {
+ "t_address": {
+ "label": "address",
+ "numberOfBytes": "20"
+ },
+ "t_bool": {
+ "label": "bool",
+ "numberOfBytes": "1"
+ },
+ "t_struct(InitializableStorage)64_storage": {
+ "label": "struct Initializable.InitializableStorage",
+ "members": [
+ {
+ "label": "_initialized",
+ "type": "t_uint64",
+ "offset": 0,
+ "slot": "0"
+ },
+ {
+ "label": "_initializing",
+ "type": "t_bool",
+ "offset": 8,
+ "slot": "0"
+ }
+ ],
+ "numberOfBytes": "32"
+ },
+ "t_struct(OwnableStorage)14_storage": {
+ "label": "struct OwnableUpgradeable.OwnableStorage",
+ "members": [
+ {
+ "label": "_owner",
+ "type": "t_address",
+ "offset": 0,
+ "slot": "0"
+ }
+ ],
+ "numberOfBytes": "32"
+ },
+ "t_uint64": {
+ "label": "uint64",
+ "numberOfBytes": "8"
+ },
+ "t_address_payable": {
+ "label": "address payable",
+ "numberOfBytes": "20"
+ },
+ "t_array(t_uint32)dyn_storage": {
+ "label": "uint32[]",
+ "numberOfBytes": "32"
+ },
+ "t_mapping(t_uint256,t_address_payable)": {
+ "label": "mapping(uint256 => address payable)",
+ "numberOfBytes": "32"
+ },
+ "t_mapping(t_uint256,t_struct(Transaction)1835_storage)": {
+ "label": "mapping(uint256 => struct IRebalancer.Transaction)",
+ "numberOfBytes": "32"
+ },
+ "t_struct(Transaction)1835_storage": {
+ "label": "struct IRebalancer.Transaction",
+ "members": [
+ {
+ "label": "timestamp",
+ "type": "t_uint256",
+ "offset": 0,
+ "slot": "0"
+ },
+ {
+ "label": "ethBalance",
+ "type": "t_uint256",
+ "offset": 0,
+ "slot": "1"
+ },
+ {
+ "label": "inEthBalance",
+ "type": "t_uint256",
+ "offset": 0,
+ "slot": "2"
+ }
+ ],
+ "numberOfBytes": "96"
+ },
+ "t_uint256": {
+ "label": "uint256",
+ "numberOfBytes": "32"
+ },
+ "t_uint32": {
+ "label": "uint32",
+ "numberOfBytes": "4"
+ }
+ },
+ "namespaces": {
+ "erc7201:openzeppelin.storage.Ownable": [
+ {
+ "contract": "OwnableUpgradeable",
+ "label": "_owner",
+ "type": "t_address",
+ "src": "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol:24",
+ "offset": 0,
+ "slot": "0"
+ }
+ ],
+ "erc7201:openzeppelin.storage.Initializable": [
+ {
+ "contract": "Initializable",
+ "label": "_initialized",
+ "type": "t_uint64",
+ "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:69",
+ "offset": 0,
+ "slot": "0"
+ },
+ {
+ "contract": "Initializable",
+ "label": "_initializing",
+ "type": "t_bool",
+ "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:73",
+ "offset": 8,
+ "slot": "0"
+ }
+ ]
+ }
+ }
+ }
+ }
+}
diff --git a/projects/restaking-pool/contracts/Configurable.sol b/projects/restaking-pool/contracts/Configurable.sol
index 675a5655..5e6c463d 100644
--- a/projects/restaking-pool/contracts/Configurable.sol
+++ b/projects/restaking-pool/contracts/Configurable.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: MIT
-pragma solidity ^0.8.20;
+pragma solidity ^0.8.26;
import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol";
import "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol";
@@ -12,7 +12,7 @@ import "./interfaces/IProtocolConfig.sol";
abstract contract Configurable is Initializable, ContextUpgradeable {
error OnlyGovernanceAllowed();
error OnlyOperatorAllowed();
- error OnlyRestakingPoolAllowed();
+ error OnlyMinterAllowed();
IProtocolConfig private _config;
uint256[50 - 1] private __reserved;
@@ -31,9 +31,12 @@ abstract contract Configurable is Initializable, ContextUpgradeable {
_;
}
- modifier onlyRestakingPool() virtual {
- if (_msgSender() != address(_config.getRestakingPool())) {
- revert OnlyRestakingPoolAllowed();
+ modifier onlyMinter() virtual {
+ if (
+ (_msgSender() != address(_config.getRestakingPool()) &&
+ (_msgSender() != address(_config.getRebalancer())))
+ ) {
+ revert OnlyMinterAllowed();
}
_;
}
diff --git a/projects/restaking-pool/contracts/FeeCollector.sol b/projects/restaking-pool/contracts/FeeCollector.sol
index 81573233..9a354f0b 100644
--- a/projects/restaking-pool/contracts/FeeCollector.sol
+++ b/projects/restaking-pool/contracts/FeeCollector.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: MIT
-pragma solidity ^0.8.20;
+pragma solidity ^0.8.26;
import "@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol";
@@ -8,7 +8,7 @@ import "./interfaces/IFeeCollector.sol";
/**
* @title MEV & Tips fee recipient
- * @author GenesisLRT
+ * @author InceptionLRT
* @notice Contract receives EL (tips/MEV) rewards and send them to RestakingPool
*/
contract FeeCollector is
diff --git a/projects/restaking-pool/contracts/NativeRebalancer.sol b/projects/restaking-pool/contracts/NativeRebalancer.sol
new file mode 100644
index 00000000..2f8b97bf
--- /dev/null
+++ b/projects/restaking-pool/contracts/NativeRebalancer.sol
@@ -0,0 +1,405 @@
+// SPDX-License-Identifier: MIT
+pragma solidity 0.8.27;
+
+import {Ownable2StepUpgradeable} from "@openzeppelin/contracts-upgradeable/access/Ownable2StepUpgradeable.sol";
+import {Initializable} from "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol";
+import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
+
+import {IRestakingPool} from "./interfaces/IRestakingPool.sol";
+import {IInceptionToken} from "./interfaces/IInceptionToken.sol";
+import {IInceptionRatioFeed} from "./interfaces/IInceptionRatioFeed.sol";
+import {ICrossChainBridgeL1} from "./interfaces/ICrossChainBridgeL1.sol";
+import {INativeRebalancer} from "./interfaces/INativeRebalancer.sol";
+
+/**
+ * @author The InceptionLRT team
+ * @title NativeRebalancer
+ * @dev This contract handles staking, manages treasury data and facilitates cross-chain ETH transfers.
+ */
+contract NativeRebalancer is
+ Initializable,
+ Ownable2StepUpgradeable,
+ INativeRebalancer
+{
+ address public inceptionToken;
+ address public lockboxAddress;
+ address payable public liqPool;
+ address public ratioFeed;
+ address public operator;
+ uint256 public constant MULTIPLIER = 1e18;
+ mapping(uint256 => Transaction) public txs;
+ mapping(uint256 => address payable) adapters;
+ address payable public defaultAdapter;
+ uint256[] public chainIds;
+
+ modifier onlyOperator() {
+ require(
+ msg.sender == operator || msg.sender == owner(),
+ OnlyOperator()
+ );
+ _;
+ }
+
+ modifier onlyAdapter(uint256 _chainId) {
+ require(msg.sender == _getAdapter(_chainId), OnlyAdapter());
+ _;
+ }
+
+ /**
+ * @notice Initializes the contract with essential addresses and parameters.
+ * @param _inceptionToken The address of the InceptionToken token.
+ * @param _lockbox The address of the lockbox.
+ * @param _liqPool The address of the liquidity pool.
+ * @param _defaultAdapter The address of the CrossChainBridgeL1.
+ * @param _ratioFeed The address of the ratio feed contract.
+ * @param _operator The address of the operator who will manage this contract.
+ */
+ function initialize(
+ address _inceptionToken,
+ address _lockbox,
+ address payable _liqPool,
+ address payable _defaultAdapter,
+ address _ratioFeed,
+ address _operator
+ ) public initializer {
+ __Ownable_init(msg.sender);
+
+ require(_inceptionToken != address(0), SettingZeroAddress());
+ require(_lockbox != address(0), SettingZeroAddress());
+ require(_liqPool != address(0), SettingZeroAddress());
+ require(_defaultAdapter != address(0), SettingZeroAddress());
+ require(_ratioFeed != address(0), SettingZeroAddress());
+ require(_operator != address(0), SettingZeroAddress());
+
+ inceptionToken = _inceptionToken;
+ lockboxAddress = _lockbox;
+ liqPool = _liqPool;
+ defaultAdapter = _defaultAdapter;
+ ratioFeed = _ratioFeed;
+ operator = _operator;
+ }
+
+ /**
+ * @notice Updates the InceptionToken address.
+ * @param _inceptionToken The new InceptionToken address.
+ */
+ function setInceptionToken(address _inceptionToken) external onlyOwner {
+ require(_inceptionToken != address(0), SettingZeroAddress());
+ emit InceptionTokenChanged(inceptionToken, _inceptionToken);
+ inceptionToken = _inceptionToken;
+ }
+
+ /**
+ * @notice Updates the Lockbox address.
+ * @param _lockboxAddress The new Lockbox address.
+ */
+ function setLockboxAddress(address _lockboxAddress) external onlyOwner {
+ require(_lockboxAddress != address(0), SettingZeroAddress());
+ emit LockboxChanged(lockboxAddress, _lockboxAddress);
+ lockboxAddress = _lockboxAddress;
+ }
+
+ /**
+ * @notice Updates the liquidity pool address.
+ * @param _liqPool The new liquidity pool address.
+ */
+ function setLiqPool(address payable _liqPool) external onlyOwner {
+ require(_liqPool != address(0), SettingZeroAddress());
+ emit LiqPoolChanged(liqPool, _liqPool);
+ liqPool = _liqPool;
+ }
+
+ /**
+ * @notice Updates the operator address.
+ * @param _operator The new operator address.
+ */
+ function setOperator(address _operator) external onlyOwner {
+ require(_operator != address(0), SettingZeroAddress());
+ emit OperatorChanged(operator, _operator);
+ operator = _operator;
+ }
+
+ /**
+ * @notice Updates the treasury data by comparing the total L2 inETH balance and adjusting the treasury accordingly.
+ */
+ function updateTreasuryData() public {
+ uint256 totalL2InETH = 0;
+
+ uint256[] memory allChainIds = chainIds;
+
+ for (uint i = 0; i < allChainIds.length; i++) {
+ uint256 chainId = allChainIds[i];
+ Transaction memory txData = getTransactionData(chainId);
+ require(
+ txData.timestamp != 0,
+ MissingOneOrMoreL2Transactions(chainId)
+ );
+ totalL2InETH += txData.inceptionTokenBalance;
+ }
+
+ uint256 lastUpdateTotalL2InEth = _lastUpdateTotalL2InEth();
+
+ if (lastUpdateTotalL2InEth < totalL2InETH) {
+ uint amountToMint = totalL2InETH - lastUpdateTotalL2InEth;
+ _mintInceptionToken(amountToMint);
+ } else if (lastUpdateTotalL2InEth > totalL2InETH) {
+ uint amountToBurn = lastUpdateTotalL2InEth - totalL2InETH;
+ _burnInceptionToken(amountToBurn);
+ } else {
+ revert NoRebalancingRequired();
+ }
+
+ uint256 inETHBalance = IERC20(inceptionToken).balanceOf(address(this));
+ if (inETHBalance > 0) {
+ require(
+ IERC20(inceptionToken).transfer(lockboxAddress, inETHBalance),
+ TransferToLockboxFailed()
+ );
+ emit InceptionTokenDepositedToLockbox(inETHBalance);
+ }
+ }
+
+ function _mintInceptionToken(uint256 _amountToMint) internal {
+ require(inceptionToken != address(0), InceptionTokenAddressNotSet());
+ IInceptionToken cToken = IInceptionToken(inceptionToken);
+ cToken.mint(lockboxAddress, _amountToMint);
+ emit TreasuryUpdateMint(_amountToMint);
+ }
+
+ function _burnInceptionToken(uint256 _amountToBurn) internal {
+ require(inceptionToken != address(0), InceptionTokenAddressNotSet());
+ IInceptionToken cToken = IInceptionToken(inceptionToken);
+ cToken.burn(lockboxAddress, _amountToBurn);
+ emit TreasuryUpdateBurn(_amountToBurn);
+ }
+
+ function _lastUpdateTotalL2InEth() internal view returns (uint256) {
+ return IERC20(inceptionToken).balanceOf(lockboxAddress);
+ }
+
+ /**
+ * @dev Triggered by a cron job.
+ * @notice Stakes a specified amount of ETH into the Liquidity Pool.
+ * @param _amount The amount of ETH to stake.
+ */
+ function stake(uint256 _amount) external onlyOperator {
+ require(liqPool != address(0), LiquidityPoolNotSet());
+ require(
+ _amount <= address(this).balance,
+ StakeAmountExceedsEthBalance(_amount, address(this).balance)
+ );
+ require(
+ _amount <= IRestakingPool(liqPool).availableToStake(),
+ StakeAmountExceedsMaxTVL()
+ );
+ IRestakingPool(liqPool).stake{value: _amount}();
+
+ uint256 inceptionTokenBalance = IERC20(inceptionToken).balanceOf(
+ address(this)
+ );
+ require(
+ IERC20(inceptionToken).transfer(
+ lockboxAddress,
+ inceptionTokenBalance
+ ),
+ TransferToLockboxFailed()
+ );
+ emit InceptionTokenDepositedToLockbox(inceptionTokenBalance);
+ }
+
+ /**
+ * @dev msg.value is used to pay for cross-chain fees (calculated externally)
+ * @notice Sends ETH to an L2 chain through a cross-chain defaultAdapter.
+ * @param _chainId The ID of the destination L2 chain.
+ * @param _callValue The amount of ETH to send to L2.
+ */
+ function sendEthToL2(
+ uint256 _chainId,
+ uint256 _callValue,
+ bytes memory _options
+ ) external payable onlyOperator {
+ address payable adapter = payable(_getAdapter(_chainId));
+ require(adapter != address(0), CrosschainBridgeNotSet());
+ require(
+ _callValue + msg.value <= address(this).balance,
+ SendAmountExceedsEthBalance(_callValue)
+ );
+
+ ICrossChainBridgeL1(adapter).sendEthCrossChain{
+ value: _callValue + msg.value
+ }(_chainId, _options);
+ }
+
+ /**
+ * @notice Calculates fees to send ETH to other chain. The `SEND_VALUE` encoded in options is not included in the return
+ * @param _chainId chain ID of the network to simulate sending ETH to
+ * @param _options encoded params for cross-chain message. Includes `SEND_VALUE` which is substracted from the end result
+ * @return fee required to pay for cross-chain transaction, without the value to be sent itself
+ */
+ function quoteSendEthToL2(
+ uint256 _chainId,
+ bytes calldata _options
+ ) external view returns (uint256 fee) {
+ address payable adapter = payable(_getAdapter(_chainId));
+ require(adapter != address(0), CrosschainBridgeNotSet());
+ return
+ ICrossChainBridgeL1(adapter).quoteSendEth(_chainId, _options) -
+ ICrossChainBridgeL1(adapter).getValueFromOpts(_options);
+ }
+
+ /**
+ * @notice Handles Layer 2 information and updates the transaction data for a specific Chain ID.
+ * @dev Verifies that the caller is the correct defaultAdapter and that the timestamp is valid.
+ * @param _chainId The Chain ID of the transaction.
+ * @param _timestamp The timestamp when the transaction occurred.
+ * @param _balance The ETH balance involved in the transaction.
+ * @param _totalSupply The total inETH supply for the transaction.
+ */
+ function handleL2Info(
+ uint256 _chainId,
+ uint256 _timestamp,
+ uint256 _balance,
+ uint256 _totalSupply
+ ) external onlyAdapter(_chainId) {
+ require(
+ _timestamp <= block.timestamp,
+ TimeCannotBeInFuture(_timestamp)
+ );
+
+ Transaction memory lastUpdate = txs[_chainId];
+
+ if (lastUpdate.timestamp != 0) {
+ require(
+ _timestamp > lastUpdate.timestamp,
+ TimeBeforePrevRecord(_timestamp)
+ );
+ }
+
+ Transaction memory newUpdate = Transaction({
+ timestamp: _timestamp,
+ ethBalance: _balance,
+ inceptionTokenBalance: _totalSupply
+ });
+
+ txs[_chainId] = newUpdate;
+
+ emit L2InfoReceived(_chainId, _timestamp, _balance, _totalSupply);
+ }
+
+ /**
+ * @notice Retrieves the transaction for a specific Chain ID. NB! Only one (last) transaction is stored.
+ * @param _chainId The Chain ID for which to retrieve the last transaction data.
+ * @return The transaction data (timestamp, ETH balance, inETH balance).
+ */
+ function getTransactionData(
+ uint256 _chainId
+ ) public view returns (Transaction memory) {
+ return txs[_chainId];
+ }
+
+ /**
+ * @dev Replaces the crosschain bridges
+ * @param _newAdapter The address of the defaultAdapter.
+ */
+ function addAdapter(
+ uint256 _chainId,
+ address payable _newAdapter
+ ) external onlyOwner {
+ require(_newAdapter != address(0), SettingZeroAddress());
+ adapters[_chainId] = _newAdapter;
+ _addChainId(_chainId);
+
+ emit AdapterAdded(_chainId, _newAdapter);
+ }
+
+ /**
+ * @notice set the so-called defaultAdapter - the adapter to be used for every chain unless a
+ specific adapter for specific chainId is set
+ * @param _newDefaultAdapter Address of the default cross-chain adapter
+ **/
+ function setDefaultAdapter(
+ address payable _newDefaultAdapter
+ ) external override onlyOwner {
+ require(_newDefaultAdapter != address(0), SettingZeroAddress());
+
+ emit DefaultBridgeChanged(defaultAdapter, _newDefaultAdapter);
+ defaultAdapter = _newDefaultAdapter;
+ }
+
+ function addChainId(uint256 _newChainId) external onlyOperator {
+ _addChainId(_newChainId);
+ }
+
+ /**
+ * @notice Removes a specific `chainId` from the `chainIds` array.
+ * @param _chainId The Chain ID to delete.
+ */
+ function deleteChainId(uint256 _chainId) public onlyOperator {
+ uint256 index;
+ bool found = false;
+
+ // Find the _chainId in the array
+ for (uint256 i = 0; i < chainIds.length; i++) {
+ if (chainIds[i] == _chainId) {
+ index = i;
+ found = true;
+ break;
+ }
+ }
+
+ require(found, ChainIdNotFound(_chainId));
+
+ // Move the last element into the place of the one to delete
+ chainIds[index] = chainIds[chainIds.length - 1];
+ chainIds.pop();
+ emit ChainIdDeleted(_chainId, index);
+ }
+
+ /**
+ * @notice Fetches the adapter assigned to a specific chain ID
+ * @param _chainId The Chain ID
+ * @return adapter address of the adapter for the specified chainId. Returns 0 if non set
+ * @return isDefault whether the returned adapter is default or not (from the mapping)
+ */
+ function getAdapter(
+ uint256 _chainId
+ ) external view returns (address payable adapter, bool isDefault) {
+ adapter = _getAdapter(_chainId);
+ if (adapter == defaultAdapter) {
+ isDefault = true;
+ }
+ }
+
+ function _getAdapter(
+ uint256 _chainId
+ ) internal view returns (address payable adapter) {
+ adapter = adapters[_chainId];
+ if (adapter == address(0)) {
+ adapter = defaultAdapter;
+ }
+
+ require(adapter != address(0), NoAdapterAvailable(_chainId));
+ }
+
+ /**
+ * @notice Adds a new Chain ID to the storage.
+ * @dev Ensures that the Chain ID does not already exist in the list.
+ * @param _newChainId The Chain ID to add.
+ */
+ function _addChainId(uint256 _newChainId) internal {
+ for (uint i = 0; i < chainIds.length; i++) {
+ if (chainIds[i] == _newChainId) {
+ return;
+ }
+ }
+ chainIds.push(_newChainId);
+ emit ChainIdAdded(_newChainId);
+ }
+
+ /**
+ * @notice Receives ETH sent to this contract, just in case.
+ */
+ receive() external payable {
+ emit ETHReceived(msg.sender, msg.value);
+ }
+}
diff --git a/projects/restaking-pool/contracts/ProtocolConfig.sol b/projects/restaking-pool/contracts/ProtocolConfig.sol
index 0e05aba5..8b44bcd1 100644
--- a/projects/restaking-pool/contracts/ProtocolConfig.sol
+++ b/projects/restaking-pool/contracts/ProtocolConfig.sol
@@ -1,16 +1,17 @@
// SPDX-License-Identifier: MIT
-pragma solidity ^0.8.20;
+pragma solidity ^0.8.26;
import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol";
import "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol";
import "@openzeppelin/contracts/utils/StorageSlot.sol";
+import {INativeRebalancer} from "./interfaces/INativeRebalancer.sol";
import "./interfaces/IProtocolConfig.sol";
import "./restaker/IRestakerDeployer.sol";
/**
- * @title General variables of Genesis Liquid Restaking protocol.
- * @author GenesisLRT
+ * @title General variables of InceptionLRT Liquid Restaking protocol.
+ * @author InceptionLRT V2
*/
contract ProtocolConfig is Initializable, ContextUpgradeable, IProtocolConfig {
using StorageSlot for bytes32;
@@ -42,6 +43,10 @@ contract ProtocolConfig is Initializable, ContextUpgradeable, IProtocolConfig {
keccak256(
abi.encode(uint256(keccak256("genesis.config.RestakerDepoyer")) - 1)
) & ~bytes32(uint256(0xff));
+ bytes32 internal constant _REBALANCER_SLOT =
+ keccak256(
+ abi.encode(uint256(keccak256("genesis.config.Rebalancer")) - 1)
+ ) & ~bytes32(uint256(0xff));
modifier onlyGovernance() virtual {
if (_msgSender() != getGovernance()) {
@@ -51,8 +56,8 @@ contract ProtocolConfig is Initializable, ContextUpgradeable, IProtocolConfig {
}
/*******************************************************************************
- CONSTRUCTOR
- *******************************************************************************/
+ CONSTRUCTOR
+ *******************************************************************************/
/// @dev https://docs.openzeppelin.com/upgrades-plugins/1.x/writing-upgradeable#initializing_the_implementation_contract
/// @custom:oz-upgrades-unsafe-allow constructor
@@ -83,8 +88,8 @@ contract ProtocolConfig is Initializable, ContextUpgradeable, IProtocolConfig {
}
/*******************************************************************************
- WRITE FUNCTIONS
- *******************************************************************************/
+ WRITE FUNCTIONS
+ *******************************************************************************/
function setGovernance(address newValue) external onlyGovernance {
_setGovernance(newValue);
@@ -128,6 +133,12 @@ contract ProtocolConfig is Initializable, ContextUpgradeable, IProtocolConfig {
_RESTAKING_POOL_SLOT.getAddressSlot().value = address(newValue);
}
+ function setRebalancer(INativeRebalancer newValue) external onlyGovernance {
+ _requireNotZero(address(newValue));
+ emit RebalancerChanged(getRebalancer(), newValue);
+ _REBALANCER_SLOT.getAddressSlot().value = address(newValue);
+ }
+
function setCToken(ICToken newValue) external onlyGovernance {
_requireNotZero(address(newValue));
emit CTokenChanged(getCToken(), newValue);
@@ -149,8 +160,8 @@ contract ProtocolConfig is Initializable, ContextUpgradeable, IProtocolConfig {
}
/*******************************************************************************
- READ FUNCTIONS
- *******************************************************************************/
+ READ FUNCTIONS
+ *******************************************************************************/
function getGovernance() public view virtual returns (address) {
return _GOVERNANCE_SLOT.getAddressSlot().value;
@@ -168,6 +179,10 @@ contract ProtocolConfig is Initializable, ContextUpgradeable, IProtocolConfig {
return IRestakingPool(_RESTAKING_POOL_SLOT.getAddressSlot().value);
}
+ function getRebalancer() public view override returns (INativeRebalancer) {
+ return INativeRebalancer(_REBALANCER_SLOT.getAddressSlot().value);
+ }
+
function getRatioFeed() public view override returns (IRatioFeed) {
return IRatioFeed(_RATIO_FEED_SLOT.getAddressSlot().value);
}
diff --git a/projects/restaking-pool/contracts/RatioFeed.sol b/projects/restaking-pool/contracts/RatioFeed.sol
index b61571f4..c511fed0 100644
--- a/projects/restaking-pool/contracts/RatioFeed.sol
+++ b/projects/restaking-pool/contracts/RatioFeed.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: MIT
-pragma solidity ^0.8.6;
+pragma solidity ^0.8.26;
import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol";
@@ -9,7 +9,7 @@ import "./interfaces/IProtocolConfig.sol";
/**
* @title Stores ratio of inETH
- * @author GenesisLRT
+ * @author InceptionLRT
*/
contract RatioFeed is Configurable, IRatioFeed {
uint32 public constant MAX_THRESHOLD = uint32(1e8); // 100000000
@@ -150,12 +150,19 @@ contract RatioFeed is Configurable, IRatioFeed {
*******************************************************************************/
/**
- * @notice Get ratio of a token.
+ * @notice Deprecated. Left for compatibility
*/
function getRatio(address token) public view override returns (uint256) {
return _ratios[token];
}
+ /**
+ * @notice Get ratio of a token.
+ */
+ function getRatioFor(address token) public view override returns (uint256) {
+ return _ratios[token];
+ }
+
/**
* @notice Returns APR based on ratio changes for `day`s
*/
diff --git a/projects/restaking-pool/contracts/RestakingPool.sol b/projects/restaking-pool/contracts/RestakingPool.sol
index ab70979f..eac39408 100644
--- a/projects/restaking-pool/contracts/RestakingPool.sol
+++ b/projects/restaking-pool/contracts/RestakingPool.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: MIT
-pragma solidity ^0.8.20;
+pragma solidity 0.8.27;
import {ReentrancyGuardUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol";
import {Configurable} from "./Configurable.sol";
@@ -161,7 +161,10 @@ contract RestakingPool is
revert PoolStakeAmGreaterThanAvailable();
uint256 stakeBonus;
- if (stakeBonusAmount > 0) {
+ if (
+ stakeBonusAmount > 0 &&
+ msg.sender != address(config().getRebalancer())
+ ) {
uint256 capacity = getFlashCapacity();
if (capacity < amount) {
stakeBonus = _calculateStakeBonus(0, amount);
diff --git a/projects/restaking-pool/contracts/cToken.sol b/projects/restaking-pool/contracts/cToken.sol
index 1b517d63..823acebe 100644
--- a/projects/restaking-pool/contracts/cToken.sol
+++ b/projects/restaking-pool/contracts/cToken.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: MIT
-pragma solidity ^0.8.20;
+pragma solidity ^0.8.26;
import "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/ERC20PausableUpgradeable.sol";
import "@openzeppelin/contracts/utils/math/Math.sol";
@@ -9,7 +9,7 @@ import "./interfaces/ICToken.sol";
/**
* @title Staked token.
- * @author GenesisLRT
+ * @author InceptionLRT
* @notice cToken accumulates interest through their exchange ratio — over time, cToken becomes convertible into an increasing
* amount of ETH, even while the number of cTokens in your wallet stays the same.
*
@@ -74,7 +74,7 @@ contract cToken is Configurable, ERC20PausableUpgradeable, ICToken {
function mint(
address account,
uint256 shares
- ) external override whenNotPaused onlyRestakingPool {
+ ) external override whenNotPaused onlyMinter {
_mint(account, shares);
}
@@ -86,7 +86,7 @@ contract cToken is Configurable, ERC20PausableUpgradeable, ICToken {
function burn(
address account,
uint256 shares
- ) external override whenNotPaused onlyRestakingPool {
+ ) external override whenNotPaused onlyMinter {
_burn(account, shares);
}
@@ -122,8 +122,8 @@ contract cToken is Configurable, ERC20PausableUpgradeable, ICToken {
}
/**
- * @dev Returns the total amount of the ETH that is “managed” by Genesis.
- * @return totalManagedEth Total ETH amount into Genesis protocol.
+ * @dev Returns the total amount of the ETH that is “managed” by InceptionLRT.
+ * @return totalManagedEth Total ETH amount into InceptionLRT protocol.
*/
function totalAssets()
external
diff --git a/projects/restaking-pool/contracts/interfaces/ICrossChainBridge.sol b/projects/restaking-pool/contracts/interfaces/ICrossChainBridge.sol
new file mode 100644
index 00000000..52d5c71c
--- /dev/null
+++ b/projects/restaking-pool/contracts/interfaces/ICrossChainBridge.sol
@@ -0,0 +1,50 @@
+// SPDX-License-Identifier: MIT
+pragma solidity 0.8.27;
+
+interface ICrossChainBridge {
+ event TargetReceiverChanged(
+ address prevTargetReceiver,
+ address newTargetReceiver
+ );
+ event RecoverFundsInitiated(uint256 amount);
+ event ReceiveTriggered(address caller, uint256 amount);
+ event CrossChainEthDeposit(uint256 chainId, uint256 amount);
+ event ChainIdAdded(uint256 _chainId);
+ event CrossChainMessageReceived(
+ uint256 indexed chainId,
+ uint256 value,
+ bytes data
+ );
+ event CrossChainMessageSent(
+ uint256 indexed chainId,
+ uint256 value,
+ bytes data,
+ uint256 fee
+ );
+
+ error TargetReceiverNotSet();
+ error TransferToTargetReceiverFailed();
+ error SettingZeroAddress();
+ error NotTargetReceiver(address caller);
+ error ChainIdNotFound(uint256 chainId);
+
+ function setTargetReceiver(address _newTargetReceiver) external;
+
+ function recoverFunds() external;
+
+ function quoteSendEth(
+ uint256 _chainId,
+ bytes memory _options
+ ) external view returns (uint256);
+
+ function sendEthCrossChain(
+ uint256 _chainId,
+ bytes memory _options
+ ) external payable;
+
+ function getValueFromOpts(
+ bytes calldata _options
+ ) external view returns (uint256);
+
+ receive() external payable;
+}
diff --git a/projects/restaking-pool/contracts/interfaces/ICrossChainBridgeL1.sol b/projects/restaking-pool/contracts/interfaces/ICrossChainBridgeL1.sol
new file mode 100644
index 00000000..aac1a99f
--- /dev/null
+++ b/projects/restaking-pool/contracts/interfaces/ICrossChainBridgeL1.sol
@@ -0,0 +1,13 @@
+// SPDX-License-Identifier: MIT
+pragma solidity 0.8.27;
+
+import {ICrossChainBridge} from "./ICrossChainBridge.sol";
+
+interface ICrossChainBridgeL1 is ICrossChainBridge {
+ event CrossChainInfoReceived(
+ uint256 indexed chainId,
+ uint256 timestamp,
+ uint256 balance,
+ uint256 totalSupply
+ );
+}
diff --git a/projects/restaking-pool/contracts/interfaces/IERC20.sol b/projects/restaking-pool/contracts/interfaces/IERC20.sol
new file mode 100644
index 00000000..21284f1b
--- /dev/null
+++ b/projects/restaking-pool/contracts/interfaces/IERC20.sol
@@ -0,0 +1,36 @@
+// SPDX-License-Identifier: MIT
+pragma solidity ^0.8.20;
+
+interface IERC20Mintable {
+ function mint(address account, uint256 amount) external;
+
+ function burn(address account, uint256 amount) external;
+
+ function chargeFrom(
+ address sender,
+ address recipient,
+ uint256 amount
+ ) external returns (bool);
+}
+
+interface IERC20Pegged {
+ function getOrigin() external view returns (uint256, address);
+}
+
+interface IERC20Extra {
+ function name() external returns (string memory);
+
+ function decimals() external returns (uint8);
+
+ function symbol() external returns (string memory);
+}
+
+interface IERC20MetadataChangeable {
+ event NameChanged(string prevValue, string newValue);
+
+ event SymbolChanged(string prevValue, string newValue);
+
+ function changeName(bytes32) external;
+
+ function changeSymbol(bytes32) external;
+}
diff --git a/projects/restaking-pool/contracts/interfaces/IInceptionBridge.sol b/projects/restaking-pool/contracts/interfaces/IInceptionBridge.sol
new file mode 100644
index 00000000..2dff907b
--- /dev/null
+++ b/projects/restaking-pool/contracts/interfaces/IInceptionBridge.sol
@@ -0,0 +1,81 @@
+// SPDX-License-Identifier: MIT
+pragma solidity ^0.8.20;
+
+import "./IERC20.sol";
+
+interface IInceptionBridgeStorage {
+ struct Metadata {
+ bytes32 name;
+ bytes32 symbol;
+ uint256 originChain;
+ address originAddress;
+ }
+
+ event ShortCapChanged(
+ address indexed token,
+ uint256 prevValue,
+ uint256 newValue
+ );
+ event LongCapChanged(
+ address indexed token,
+ uint256 prevValue,
+ uint256 newValue
+ );
+
+ event ShortCapDurationChanged(uint256 prevValue, uint256 newValue);
+ event LongCapDurationChanged(uint256 prevValue, uint256 newValue);
+
+ event BridgeAdded(address indexed bridge, uint256 destinationChain);
+ event BridgeRemoved(address indexed bridge, uint256 destinationChain);
+
+ event DestinationAdded(
+ address indexed fromToken,
+ address indexed toToken,
+ uint256 toChain
+ );
+ event DestinationRemoved(
+ address indexed fromToken,
+ address indexed toToken,
+ uint256 toChain
+ );
+
+ event NotaryChanged(address indexed prevValue, address indexed newValue);
+
+ event XERC20LockboxAdded(address indexed token, address indexed lockbox);
+}
+
+interface IInceptionBridge {
+ event Deposited(
+ uint256 destinationChain,
+ address indexed destinationBridge,
+ address indexed sender,
+ address indexed receiver,
+ address fromToken,
+ address toToken,
+ uint256 amount,
+ uint256 nonce,
+ IInceptionBridgeStorage.Metadata metadata
+ );
+
+ event Withdrawn(
+ bytes32 receiptHash,
+ address indexed sender,
+ address indexed receiver,
+ address fromToken,
+ address toToken,
+ uint256 amount
+ );
+
+ function deposit(
+ address fromToken,
+ uint256 destinationChain,
+ address receiver,
+ uint256 amount
+ ) external;
+
+ function withdraw(
+ bytes calldata encodedProof,
+ bytes calldata rawReceipt,
+ bytes memory receiptRootSignature
+ ) external;
+}
diff --git a/projects/restaking-pool/contracts/interfaces/IInceptionRatioFeed.sol b/projects/restaking-pool/contracts/interfaces/IInceptionRatioFeed.sol
new file mode 100644
index 00000000..d57a8dbc
--- /dev/null
+++ b/projects/restaking-pool/contracts/interfaces/IInceptionRatioFeed.sol
@@ -0,0 +1,43 @@
+// SPDX-License-Identifier: MIT
+pragma solidity ^0.8.20;
+
+interface IInceptionRatioFeedErrors {
+ error OperatorUnauthorizedAccount(address account);
+
+ error InconsistentInputData();
+
+ error NullParams();
+
+ error RatioThresholdNotSet();
+
+ error NewRatioThresholdInvalid();
+
+ error IncorrectDay(uint256 day);
+
+ error IncorrectToken(address token);
+}
+
+interface IInceptionRatioFeed {
+ event OperatorUpdated(address prevValue, address newValue);
+
+ event RatioUpdated(
+ address indexed tokenAddress,
+ uint256 prevValue,
+ uint256 newValue
+ );
+
+ event RatioNotUpdated(
+ address indexed tokenAddress,
+ uint256 failedRatio,
+ string reason
+ );
+
+ event RatioThresholdChanged(uint256 prevValue, uint256 newValue);
+
+ function updateRatioBatch(
+ address[] calldata addresses,
+ uint256[] calldata ratios
+ ) external;
+
+ function getRatioFor(address) external view returns (uint256);
+}
diff --git a/projects/restaking-pool/contracts/interfaces/IInceptionToken.sol b/projects/restaking-pool/contracts/interfaces/IInceptionToken.sol
new file mode 100644
index 00000000..0815d0bc
--- /dev/null
+++ b/projects/restaking-pool/contracts/interfaces/IInceptionToken.sol
@@ -0,0 +1,14 @@
+// SPDX-License-Identifier: MIT
+pragma solidity ^0.8.20;
+
+interface IInceptionToken {
+ function mint(address account, uint256 shares) external;
+ function burn(address account, uint256 shares) external;
+ function convertToAmount(uint256 shares) external pure returns (uint256);
+ function convertToShares(uint256 amount) external pure returns (uint256);
+ function changeName(string memory newName) external;
+ function changeSymbol(string memory newSymbol) external;
+ function name() external view returns (string memory);
+ function symbol() external view returns (string memory);
+ function balanceOf(address account) external view returns (uint256);
+}
diff --git a/projects/restaking-pool/contracts/interfaces/ILZCrossChainAdapterL1.sol b/projects/restaking-pool/contracts/interfaces/ILZCrossChainAdapterL1.sol
new file mode 100644
index 00000000..988776bb
--- /dev/null
+++ b/projects/restaking-pool/contracts/interfaces/ILZCrossChainAdapterL1.sol
@@ -0,0 +1,56 @@
+// SPDX-License-Identifier: MIT
+pragma solidity ^0.8.27;
+
+interface ILZCrossChainAdapterL1 {
+ event TargetReceiverChanged(
+ address prevTargetReceiver,
+ address newTargetReceiver
+ );
+ event RecoverFundsInitiated(uint256 amount);
+ event ReceiveTriggered(address caller, uint256 amount);
+ event CrossChainEthDeposit(uint256 chainId, uint256 amount);
+ event ChainIdAdded(uint256 _chainId);
+ event CrossChainMessageSent(
+ uint256 indexed chainId,
+ uint256 value,
+ bytes data,
+ uint256 fee
+ );
+
+ // Custom Errors
+ error TargetReceiverNotSet();
+ error TransferToTargetReceiverFailed();
+ error SettingZeroAddress();
+ error NotTargetReceiver(address caller);
+ error ChainIdNotFound(uint256 chainId);
+ error NoDestEidFoundForChainId(uint256 chainId);
+ error ArraysLengthsMismatch();
+
+ // State Variables
+ function targetReceiver() external view returns (address);
+
+ function eidToChainId(uint32 eid) external view returns (uint256);
+
+ function chainIdToEid(uint256 chainId) external view returns (uint32);
+
+ // Public Functions
+ function setTargetReceiver(address _newTargetReceiver) external;
+
+ function recoverFunds() external;
+
+ function sendEthCrossChain(
+ uint256 _chainId,
+ bytes memory _options
+ ) external payable;
+
+ function quoteSendEth(
+ uint256 _chainId,
+ bytes memory _options
+ ) external view returns (uint256);
+
+ function setChainIdFromEid(uint32 _eid, uint256 _chainId) external;
+
+ function getChainIdFromEid(uint32 _eid) external view returns (uint256);
+
+ function getEidFromChainId(uint256 _chainId) external view returns (uint32);
+}
diff --git a/projects/restaking-pool/contracts/interfaces/INativeRebalancer.sol b/projects/restaking-pool/contracts/interfaces/INativeRebalancer.sol
new file mode 100644
index 00000000..95d1b03d
--- /dev/null
+++ b/projects/restaking-pool/contracts/interfaces/INativeRebalancer.sol
@@ -0,0 +1,90 @@
+// SPDX-License-Identifier: MIT
+pragma solidity ^0.8.27;
+
+interface INativeRebalancer {
+ struct Transaction {
+ uint256 timestamp;
+ uint256 ethBalance;
+ uint256 inceptionTokenBalance;
+ }
+
+ // Events
+ event L2InfoReceived(
+ uint256 indexed networkId,
+ uint256 timestamp,
+ uint256 ethBalance,
+ uint256 inceptionTokenBalance
+ );
+ event ETHReceived(address sender, uint256 amount);
+ event ETHDepositedToLiquidPool(address liquidPool, uint256 amountETH);
+ event InceptionTokenDepositedToLockbox(uint256 mintAmount);
+ event TreasuryUpdateMint(uint256 mintAmount);
+ event TreasuryUpdateBurn(uint256 mintAmount);
+ event LockboxChanged(address prevLockbox, address newLockbox);
+ event InceptionTokenChanged(
+ address prevInceptionToken,
+ address newInceptionToken
+ );
+ event LiqPoolChanged(address prevLiqPool, address newLiqPool);
+ event OperatorChanged(address prevOperator, address newOperator);
+ event AdapterAdded(uint256 indexed chainId, address newAdapter);
+ event DefaultBridgeChanged(
+ address indexed prevDefaultAdapter,
+ address indexed newDefaultAdapter
+ );
+ event ChainIdAdded(uint256 chainId);
+ event ChainIdDeleted(uint256 chainId, uint256 index);
+
+ error MsgNotFromBridge(address caller);
+ error ChainIdAlreadyExists(uint256 chainId);
+ error ChainIdNotFound(uint256 chainId);
+ error BridgeAlreadyExists(uint256 chainId);
+ error NoBridgeForThisChainId(uint256 chainId);
+ error TimeCannotBeInFuture(uint256 timestamp);
+ error TimeBeforePrevRecord(uint256 timestamp);
+ error SettingZeroAddress();
+ error TransferToLockboxFailed();
+ error InceptionTokenAddressNotSet();
+ error LiquidityPoolNotSet();
+ error CrosschainBridgeNotSet();
+ error MissingOneOrMoreL2Transactions(uint256 chainId);
+ error StakeAmountExceedsEthBalance(uint256 staked, uint256 availableEth);
+ error SendAmountExceedsEthBalance(uint256 amountToSend);
+ error StakeAmountExceedsMaxTVL();
+ error OnlyOperator();
+ error OnlyAdapter();
+ error NoRebalancingRequired();
+ error IndexOutOfBounds(uint256 index, uint256 length);
+ error NoAdapterAvailable(uint256 _chainId);
+
+ function handleL2Info(
+ uint256 _chainId,
+ uint256 _timestamp,
+ uint256 _balance,
+ uint256 _totalSupply
+ ) external;
+
+ function getTransactionData(
+ uint256 _chainId
+ ) external view returns (Transaction memory);
+
+ function setDefaultAdapter(address payable _newDefaultAdapter) external;
+
+ function setInceptionToken(address _inceptionTokenAddress) external;
+
+ function setLockboxAddress(address _lockboxAddress) external;
+
+ function updateTreasuryData() external;
+
+ function inceptionToken() external view returns (address);
+
+ function lockboxAddress() external view returns (address);
+
+ function liqPool() external view returns (address payable);
+
+ function ratioFeed() external view returns (address);
+
+ function operator() external view returns (address);
+
+ function defaultAdapter() external view returns (address payable);
+}
diff --git a/projects/restaking-pool/contracts/interfaces/IProtocolConfig.sol b/projects/restaking-pool/contracts/interfaces/IProtocolConfig.sol
index 98e0904d..78625899 100644
--- a/projects/restaking-pool/contracts/interfaces/IProtocolConfig.sol
+++ b/projects/restaking-pool/contracts/interfaces/IProtocolConfig.sol
@@ -1,11 +1,12 @@
// SPDX-License-Identifier: MIT
-pragma solidity ^0.8.20;
+pragma solidity ^0.8.26;
import "./IRatioFeed.sol";
import "./ICToken.sol";
import "./IRestakingPool.sol";
import "./IEigenPodManager.sol";
import "../restaker/IRestakerDeployer.sol";
+import "./INativeRebalancer.sol";
interface IProtocolConfig {
/* errors */
@@ -23,6 +24,10 @@ interface IProtocolConfig {
IRestakingPool prevValue,
IRestakingPool newValue
);
+ event RebalancerChanged(
+ INativeRebalancer prevValue,
+ INativeRebalancer newValue
+ );
event EigenManagerChanged(
IEigenPodManager prevValue,
IEigenPodManager newValue
@@ -46,6 +51,11 @@ interface IProtocolConfig {
function getRestakingPool() external view returns (IRestakingPool pool);
+ function getRebalancer()
+ external
+ view
+ returns (INativeRebalancer rebalancer);
+
function getRestakerDeployer()
external
view
diff --git a/projects/restaking-pool/contracts/interfaces/IRatioFeed.sol b/projects/restaking-pool/contracts/interfaces/IRatioFeed.sol
index 23e9d3ff..b058e561 100644
--- a/projects/restaking-pool/contracts/interfaces/IRatioFeed.sol
+++ b/projects/restaking-pool/contracts/interfaces/IRatioFeed.sol
@@ -33,4 +33,5 @@ interface IRatioFeed {
function updateRatio(address token, uint256 ratio) external;
function getRatio(address token) external view returns (uint256 ratio);
+ function getRatioFor(address token) external view returns (uint256 ratio);
}
diff --git a/projects/restaking-pool/contracts/interfaces/IRestakingPool.sol b/projects/restaking-pool/contracts/interfaces/IRestakingPool.sol
index 1f1a0e61..e1d10362 100644
--- a/projects/restaking-pool/contracts/interfaces/IRestakingPool.sol
+++ b/projects/restaking-pool/contracts/interfaces/IRestakingPool.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: MIT
-pragma solidity ^0.8.7;
+pragma solidity ^0.8.26;
interface IRestakingPool {
/* structs */
@@ -132,4 +132,8 @@ interface IRestakingPool {
string memory provider,
bool revertIfNoBalance
) external;
+
+ function stake() external payable;
+
+ function availableToStake() external view returns (uint256);
}
diff --git a/projects/restaking-pool/contracts/interfaces/ITransactionStorage.sol b/projects/restaking-pool/contracts/interfaces/ITransactionStorage.sol
new file mode 100644
index 00000000..36283e69
--- /dev/null
+++ b/projects/restaking-pool/contracts/interfaces/ITransactionStorage.sol
@@ -0,0 +1,44 @@
+// SPDX-License-Identifier: MIT
+pragma solidity ^0.8.27;
+
+interface IRebalancer {
+ struct Transaction {
+ uint256 timestamp;
+ uint256 ethBalance;
+ uint256 inEthBalance;
+ }
+
+ event L2InfoReceived(
+ uint256 indexed networkId,
+ uint256 timestamp,
+ uint256 ethBalance,
+ uint256 inEthBalance
+ );
+
+ event AdapterChanged(address oldAdapterAddress, address newAdapterAddress);
+
+ error MsgNotFromAdapter(address caller);
+ error ChainIdAlreadyExists(uint256 chainId);
+ error AdapterAlreadyExists(uint256 chainId);
+ error NoAdapterForThisChainId(uint256 chainId);
+ error TimeCannotBeInFuture(uint256 timestamp);
+ error TimeBeforePrevRecord(uint256 timestamp);
+ error SettingZeroAddress();
+
+ function addChainId(uint32 _newChainId) external;
+
+ function handleL2Info(
+ uint256 _chainId,
+ uint256 _timestamp,
+ uint256 _balance,
+ uint256 _totalSupply
+ ) external;
+
+ function getTransactionData(
+ uint256 _chainId
+ ) external view returns (Transaction memory);
+
+ function getAllChainIds() external view returns (uint32[] memory);
+
+ function setAdapter(address payable _newAdapter) external;
+}
diff --git a/projects/restaking-pool/contracts/interfaces/IXERC20.sol b/projects/restaking-pool/contracts/interfaces/IXERC20.sol
new file mode 100644
index 00000000..3e65f27f
--- /dev/null
+++ b/projects/restaking-pool/contracts/interfaces/IXERC20.sol
@@ -0,0 +1,143 @@
+// SPDX-License-Identifier: MIT
+pragma solidity ^0.8.20;
+
+interface IERC20Errors {
+ /**
+ * @notice Reverts when a user with too low of a limit tries to call mint/burn
+ */
+ error IXERC20_NotHighEnoughLimits();
+
+ /**
+ * @notice Reverts when caller is not the factory
+ */
+ error IXERC20_NotFactory();
+
+ /**
+ * @notice Reverts when caller sets too small _limit
+ */
+ error IXERC20_WrongBridgeLimit();
+}
+
+interface IXERC20 is IERC20Errors {
+ /**
+ * @notice Contains the full minting and burning data for a particular bridge
+ *
+ * @param minterParams The minting parameters for the bridge
+ * @param burnerParams The burning parameters for the bridge
+ */
+ struct Bridge {
+ BridgeParameters minterParams;
+ BridgeParameters burnerParams;
+ }
+
+ /**
+ * @notice Emits when a lockbox is set
+ *
+ * @param _lockbox The address of the lockbox
+ */
+ event LockboxSet(address _lockbox);
+
+ /**
+ * @notice Emits when a limit is set
+ *
+ * @param _mintingLimit The updated minting limit we are setting to the bridge
+ * @param _burningLimit The updated burning limit we are setting to the bridge
+ * @param _bridge The address of the bridge we are setting the limit too
+ */
+ event BridgeLimitsSet(
+ uint256 _mintingLimit,
+ uint256 _burningLimit,
+ address indexed _bridge
+ );
+
+ /**
+ * @notice Contains the mint or burn parameters for a bridge
+ *
+ * @param timestamp The timestamp of the last mint/burn
+ * @param ratePerSecond The rate per second of the bridge
+ * @param maxLimit The max limit of the bridge
+ * @param currentLimit The current limit of the bridge
+ */
+ struct BridgeParameters {
+ uint256 timestamp;
+ uint256 ratePerSecond;
+ uint256 maxLimit;
+ uint256 currentLimit;
+ }
+
+ /**
+ * @notice Sets the lockbox address
+ *
+ * @param _lockbox The address of the lockbox
+ */
+ function setLockbox(address _lockbox) external;
+
+ /**
+ * @notice Updates the limits of any bridge
+ * @dev Can only be called by the owner
+ * @param _mintingLimit The updated minting limit we are setting to the bridge
+ * @param _burningLimit The updated burning limit we are setting to the bridge
+ * @param _bridge The address of the bridge we are setting the limits too
+ */
+ function setBridgeLimits(
+ address _bridge,
+ uint256 _mintingLimit,
+ uint256 _burningLimit
+ ) external;
+
+ /**
+ * @notice Returns the max limit of a minter
+ *
+ * @param _minter The minter we are viewing the limits of
+ * @return _limit The limit the minter has
+ */
+ function mintingMaxLimitOf(
+ address _minter
+ ) external view returns (uint256 _limit);
+
+ /**
+ * @notice Returns the max limit of a bridge
+ *
+ * @param _bridge the bridge we are viewing the limits of
+ * @return _limit The limit the bridge has
+ */
+ function burningMaxLimitOf(
+ address _bridge
+ ) external view returns (uint256 _limit);
+
+ /**
+ * @notice Returns the current limit of a minter
+ *
+ * @param _minter The minter we are viewing the limits of
+ * @return _limit The limit the minter has
+ */
+ function mintingCurrentLimitOf(
+ address _minter
+ ) external view returns (uint256 _limit);
+
+ /**
+ * @notice Returns the current limit of a bridge
+ *
+ * @param _bridge the bridge we are viewing the limits of
+ * @return _limit The limit the bridge has
+ */
+ function burningCurrentLimitOf(
+ address _bridge
+ ) external view returns (uint256 _limit);
+
+ /**
+ * @notice Mints tokens for a user
+ * @dev Can only be called by a minter
+ * @param _user The address of the user who needs tokens minted
+ * @param _amount The amount of tokens being minted
+ */
+ function mint(address _user, uint256 _amount) external;
+
+ /**
+ * @notice Burns tokens for a user
+ * @dev Can only be called by a minter
+ * @param _user The address of the user who needs tokens burned
+ * @param _amount The amount of tokens being burned
+ */
+ function burn(address _user, uint256 _amount) external;
+}
diff --git a/projects/restaking-pool/contracts/interfaces/IXERC20Lockbox.sol b/projects/restaking-pool/contracts/interfaces/IXERC20Lockbox.sol
new file mode 100644
index 00000000..03abe044
--- /dev/null
+++ b/projects/restaking-pool/contracts/interfaces/IXERC20Lockbox.sol
@@ -0,0 +1,78 @@
+// SPDX-License-Identifier: MIT
+pragma solidity ^0.8.20;
+
+import "@openzeppelin/contracts/interfaces/IERC20.sol";
+import "./IXERC20.sol";
+
+interface IXERC20LockboxErrors {
+ /// @notice Reverts when a user tries to deposit native tokens on a non-native lockbox
+ error IXERC20Lockbox_NotNative();
+
+ /// @notice Reverts when a user tries to deposit non-native tokens on a native lockbox
+ error IXERC20Lockbox_Native();
+
+ /// @notice Reverts when a user tries to withdraw and the call fails
+ error IXERC20Lockbox_WithdrawFailed();
+
+ /// @notice Reverts when a user tries to withdraw to the XERC20Lockbox itself
+ error IXERC20Lockbox_WrongReceiver();
+}
+
+interface IXERC20Lockbox is IXERC20LockboxErrors {
+ /**
+ * @notice Emitted when tokens are deposited into the lockbox
+ *
+ * @param _sender The address of the user who deposited
+ * @param _amount The amount of tokens deposited
+ */
+ event Deposit(address _sender, uint256 _amount);
+
+ /**
+ * @notice Emitted when tokens are withdrawn from the lockbox
+ *
+ * @param _sender The address of the user who withdrew
+ * @param _amount The amount of tokens withdrawn
+ */
+ event Withdraw(address _sender, uint256 _amount);
+
+ function XERC20() external view returns (IXERC20 xerc20);
+
+ function ERC20() external view returns (IERC20 erc20);
+
+ /**
+ * @notice Deposit ERC20 tokens into the lockbox
+ *
+ * @param _amount The amount of tokens to deposit
+ */
+ function deposit(uint256 _amount) external;
+
+ /**
+ * @notice Deposit ERC20 tokens into the lockbox, and send the XERC20 to a user
+ *
+ * @param _user The user to send the XERC20 to
+ * @param _amount The amount of tokens to deposit
+ */
+ function depositTo(address _user, uint256 _amount) external;
+
+ /**
+ * @notice Deposit the native asset into the lockbox, and send the XERC20 to a user
+ *
+ * @param _user The user to send the XERC20 to
+ */
+ function depositNativeTo(address _user) external payable;
+
+ /**
+ * @notice Withdraw ERC20 tokens from the lockbox
+ *
+ * @param _amount The amount of tokens to withdraw
+ */
+ function withdraw(uint256 _amount) external;
+
+ /**
+ * @notice Withdraw ERC20 tokens from the lockbox
+ *
+ * @param _user The user to withdraw to
+ * @param _amount The amount of tokens to withdraw
+ */
+ function withdrawTo(address _user, uint256 _amount) external;
+}
diff --git a/projects/restaking-pool/contracts/mock/LZCrossChainAdapterL1Mock.sol b/projects/restaking-pool/contracts/mock/LZCrossChainAdapterL1Mock.sol
new file mode 100644
index 00000000..73865696
--- /dev/null
+++ b/projects/restaking-pool/contracts/mock/LZCrossChainAdapterL1Mock.sol
@@ -0,0 +1,122 @@
+// SPDX-License-Identifier: MIT
+pragma solidity ^0.8.27;
+
+import "@openzeppelin/contracts/access/Ownable.sol";
+
+contract LZCrossChainAdapterL1Mock is Ownable {
+ event CrossChainMessageSent(
+ uint256 indexed chainId,
+ uint256 value,
+ bytes data,
+ uint256 fee
+ );
+ event ChainIdAdded(uint256 _chainId);
+ event CrossChainEthDeposit(uint256 chainId, uint256 amount);
+ event ReceiveTriggered(address caller, uint256 amount);
+ event CrossChainMessageReceived(
+ uint256 indexed chainId,
+ uint256 value,
+ bytes data
+ );
+ event CrossChainDataSuccessfullyRelayed(uint256 indexed chainId);
+
+ // Mocked storage variables
+ mapping(uint32 => uint256) public eidToChainId;
+ mapping(uint256 => uint32) public chainIdToEid;
+ address public targetReceiver;
+
+ modifier onlyOwnerRestricted() {
+ require(owner() == msg.sender, "Ownable: caller is not the owner");
+ _;
+ }
+
+ modifier onlyTargetReceiver() {
+ require(
+ msg.sender == targetReceiver || msg.sender == owner(),
+ "NotTargetReceiver"
+ );
+ _;
+ }
+
+ constructor() Ownable(msg.sender) {}
+
+ // Functions for managing target receiver
+ function setTargetReceiver(
+ address _newTargetReceiver
+ ) external onlyOwnerRestricted {
+ require(_newTargetReceiver != address(0), "SettingZeroAddress");
+ targetReceiver = _newTargetReceiver;
+ }
+
+ function recoverFunds() external onlyOwnerRestricted {
+ require(targetReceiver != address(0), "TargetReceiverNotSet");
+ uint256 amount = address(this).balance;
+ (bool success, ) = targetReceiver.call{value: amount}("");
+ require(success, "TransferToTargetReceiverFailed");
+ }
+
+ // Mocked cross-chain function
+ function sendEthCrossChain(
+ uint256 _chainId
+ ) external payable onlyTargetReceiver {
+ emit CrossChainMessageSent(_chainId, msg.value, "", 0);
+ }
+
+ // Manage chain IDs
+ function setChainIdFromEid(
+ uint32 _eid,
+ uint256 _chainId
+ ) public onlyOwnerRestricted {
+ eidToChainId[_eid] = _chainId;
+ chainIdToEid[_chainId] = _eid;
+ emit ChainIdAdded(_chainId);
+ }
+
+ function getChainIdFromEid(uint32 _eid) public view returns (uint256) {
+ return eidToChainId[_eid];
+ }
+
+ function getEidFromChainId(uint256 _chainId) public view returns (uint32) {
+ return chainIdToEid[_chainId];
+ }
+
+ // Functions to simulate ETH handling for cross-chain deposits
+ function _handleCrossChainEth(uint256 _chainId) internal {
+ emit CrossChainEthDeposit(_chainId, msg.value);
+ payable(targetReceiver).transfer(msg.value);
+ }
+
+ function quoteSendEth(
+ uint256,
+ bytes memory
+ ) external pure returns (uint256) {
+ return 1000;
+ }
+
+ // Fallback function to handle direct ETH transfers
+ receive() external payable {
+ emit ReceiveTriggered(msg.sender, msg.value);
+ }
+
+ /**
+ * @notice Mock function to simulate receiving a cross-chain message.
+ * @param _eid The endpoint ID associated with the origin chain.
+ * @param _data The payload or data being sent cross-chain.
+ */
+ function mockLzReceive(uint32 _eid, bytes calldata _data) external payable {
+ uint256 chainId = eidToChainId[_eid];
+ require(chainId != 0, "InvalidEid");
+
+ emit CrossChainMessageReceived(chainId, msg.value, _data);
+
+ // If data was provided, consider it as a relay of data successfully
+ if (_data.length > 0) {
+ emit CrossChainDataSuccessfullyRelayed(chainId);
+ }
+
+ // Handle ETH transfer if any ETH was sent
+ if (msg.value > 0) {
+ _handleCrossChainEth(chainId);
+ }
+ }
+}
diff --git a/projects/restaking-pool/contracts/mock/XERC20LockboxMock.sol b/projects/restaking-pool/contracts/mock/XERC20LockboxMock.sol
new file mode 100644
index 00000000..8d356a1c
--- /dev/null
+++ b/projects/restaking-pool/contracts/mock/XERC20LockboxMock.sol
@@ -0,0 +1,130 @@
+// SPDX-License-Identifier: MIT
+pragma solidity ^0.8.26;
+
+import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
+import "@openzeppelin/contracts/utils/math/SafeCast.sol";
+
+import "../interfaces/IXERC20Lockbox.sol";
+import "../interfaces/IXERC20.sol";
+
+contract XERC20LockboxMock is IXERC20Lockbox {
+ using SafeERC20 for IERC20;
+ using SafeCast for uint256;
+
+ /**
+ * @notice The XERC20 token of this contract
+ */
+ IXERC20 public immutable XERC20;
+
+ /**
+ * @notice The ERC20 token of this contract
+ */
+ IERC20 public immutable ERC20;
+
+ /**
+ * @notice Whether the ERC20 token is the native gas token of this chain
+ */
+ bool public immutable IS_NATIVE;
+
+ /**
+ * @param _xerc20 The address of the XERC20 contract
+ * @param _erc20 The address of the ERC20 contract
+ * @param _isNative Whether the ERC20 token is the native gas token of this chain or not
+ */
+ constructor(address _xerc20, address _erc20, bool _isNative) payable {
+ XERC20 = IXERC20(_xerc20);
+ ERC20 = IERC20(_erc20);
+ IS_NATIVE = _isNative;
+ }
+
+ /**
+ * @notice Deposit native tokens into the lockbox
+ */
+ function depositNative() public payable {
+ if (!IS_NATIVE) revert IXERC20Lockbox_NotNative();
+ _deposit(msg.sender, msg.value);
+ }
+
+ /**
+ * @notice Deposit ERC20 tokens into the lockbox
+ * @param _amount The amount of tokens to deposit
+ */
+ function deposit(uint256 _amount) external {
+ if (IS_NATIVE) revert IXERC20Lockbox_Native();
+ _deposit(msg.sender, _amount);
+ }
+
+ /**
+ * @notice Deposit ERC20 tokens into the lockbox, and send the XERC20 to a user
+ * @param _to The user to send the XERC20 to
+ * @param _amount The amount of tokens to deposit
+ */
+ function depositTo(address _to, uint256 _amount) external {
+ if (IS_NATIVE) revert IXERC20Lockbox_Native();
+ _deposit(_to, _amount);
+ }
+
+ /**
+ * @notice Deposit the native asset into the lockbox, and send the XERC20 to a user
+ * @param _to The user to send the XERC20 to
+ */
+ function depositNativeTo(address _to) external payable {
+ if (!IS_NATIVE) revert IXERC20Lockbox_NotNative();
+ _deposit(_to, msg.value);
+ }
+
+ /**
+ * @notice Withdraw ERC20 tokens from the lockbox
+ * @param _amount The amount of tokens to withdraw
+ */
+ function withdraw(uint256 _amount) external {
+ _withdraw(msg.sender, _amount);
+ }
+
+ /**
+ * @notice Withdraw tokens from the lockbox
+ * @param _to The user to withdraw to
+ * @param _amount The amount of tokens to withdraw
+ */
+ function withdrawTo(address _to, uint256 _amount) external {
+ _withdraw(_to, _amount);
+ }
+
+ /**
+ * @notice Withdraw tokens from the lockbox
+ * @param _to The user to withdraw to
+ * @param _amount The amount of tokens to withdraw
+ */
+ function _withdraw(address _to, uint256 _amount) internal {
+ if (_to == address(this)) revert IXERC20Lockbox_WrongReceiver();
+ XERC20.burn(msg.sender, _amount);
+ if (IS_NATIVE) {
+ (bool _success, ) = payable(_to).call{value: _amount}("");
+ if (!_success) revert IXERC20Lockbox_WithdrawFailed();
+ } else {
+ ERC20.safeTransfer(_to, _amount);
+ }
+ emit Withdraw(_to, _amount);
+ }
+
+ /**
+ * @notice Deposit tokens into the lockbox
+ * @param _to The address to send the XERC20 to
+ * @param _amount The amount of tokens to deposit
+ */
+ function _deposit(address _to, uint256 _amount) internal {
+ if (_to == address(this)) revert IXERC20Lockbox_WrongReceiver();
+ if (!IS_NATIVE)
+ ERC20.safeTransferFrom(msg.sender, address(this), _amount);
+
+ XERC20.mint(_to, _amount);
+ emit Deposit(_to, _amount);
+ }
+
+ /**
+ * @notice Fallback function to deposit native tokens
+ */
+ receive() external payable {
+ depositNative();
+ }
+}
diff --git a/projects/restaking-pool/contracts/restaker/IRestaker.sol b/projects/restaking-pool/contracts/restaker/IRestaker.sol
index 11a38bc0..a442f327 100644
--- a/projects/restaking-pool/contracts/restaker/IRestaker.sol
+++ b/projects/restaking-pool/contracts/restaker/IRestaker.sol
@@ -5,7 +5,7 @@ import "./IRestakerFacets.sol";
/**
* @title Diamond-like implementation which support call with context (simple call).
- * @author GenesisLST
+ * @author InceptionLRT
*/
interface IRestaker {
error RestakerCannotClaim();
diff --git a/projects/restaking-pool/contracts/restaker/Restaker.sol b/projects/restaking-pool/contracts/restaker/Restaker.sol
index cd9827a7..cdec613a 100644
--- a/projects/restaking-pool/contracts/restaker/Restaker.sol
+++ b/projects/restaking-pool/contracts/restaker/Restaker.sol
@@ -11,7 +11,7 @@ import "./IRestakerFacets.sol";
/**
* @title Modified ERC-2535 to make calls with context of this contract.
- * @author GenesisLRT
+ * @author InceptionLRT
* @dev To make a call to any contract from facet just wrap address to needed interface.
*/
contract Restaker is OwnableUpgradeable, IRestaker {
diff --git a/projects/restaking-pool/contracts/restaker/RestakerDeployer.sol b/projects/restaking-pool/contracts/restaker/RestakerDeployer.sol
index d629ece2..4f93070b 100644
--- a/projects/restaking-pool/contracts/restaker/RestakerDeployer.sol
+++ b/projects/restaking-pool/contracts/restaker/RestakerDeployer.sol
@@ -10,7 +10,7 @@ import "./IRestakerFacets.sol";
/**
* @title create2 deployer of {Restaker}
- * @author GenesisLRT
+ * @author InceptionLRT
* @notice Not upgradeable contracts makes possible to everyone deploy new instance of Restaker.
*/
contract RestakerDeployer is IRestakerDeployer {
diff --git a/projects/restaking-pool/contracts/restaker/RestakerFacets.sol b/projects/restaking-pool/contracts/restaker/RestakerFacets.sol
index 84fcb0b4..870393f7 100644
--- a/projects/restaking-pool/contracts/restaker/RestakerFacets.sol
+++ b/projects/restaking-pool/contracts/restaker/RestakerFacets.sol
@@ -11,7 +11,7 @@ import "./IRestakerFacets.sol";
/**
* @title Facets of Restaker
- * @author GenesisLRT
+ * @author InceptionLRT
* @notice Stores the targets of method signatures.
*/
contract RestakerFacets is OwnableUpgradeable, IRestakerFacets {
diff --git a/projects/restaking-pool/deploy/13_update_pool.ts b/projects/restaking-pool/deploy/13_update_pool.ts
new file mode 100644
index 00000000..8db2f51d
--- /dev/null
+++ b/projects/restaking-pool/deploy/13_update_pool.ts
@@ -0,0 +1,61 @@
+import { ethers, upgrades } from "hardhat";
+import { DeployFunction } from "hardhat-deploy/types";
+import { schedule } from "../scripts/deploy-helpers";
+
+const func: DeployFunction = async function ({ deployments, network }) {
+ const { get } = deployments;
+ const RestakingPool = await get("RestakingPool");
+ console.log("Restaking Pool address: ", RestakingPool.address);
+ const [deployer] = await ethers.getSigners();
+
+ const restakinPoolAdmin = await upgrades.erc1967.getAdminAddress(RestakingPool.address);
+ const currentImpl = await upgrades.erc1967.getImplementationAddress(RestakingPool.address);
+ const proxyAdmin = await ethers.getContractAt("IProxyAdmin", restakinPoolAdmin);
+
+ console.log(`deployer address: ${deployer.address}`);
+ console.log(`deployer balance: ${await ethers.provider.getBalance(deployer.address)}`);
+
+ /// 1. InceptionLibrary Deployment
+ let libAddress = "";
+ if (network.name === "mainnet") {
+ libAddress = "0x8a6a8a7233b16d0ecaa7510bfd110464a0d69f66";
+ } else {
+ libAddress = "0x4db1487f376efe5116af8491ece85f52e7082ce8";
+ }
+ console.log("InceptionLibrary address(11):", libAddress);
+
+ /// 2. RestakingPool Upgrade
+ const RestakingPoolFactory = await ethers.getContractFactory("RestakingPool", {
+ libraries: {
+ InceptionLibrary: libAddress,
+ },
+ });
+ const newImpl = await upgrades.prepareUpgrade(RestakingPool.address, RestakingPoolFactory, {
+ unsafeAllowLinkedLibraries: true,
+ });
+ console.log(`changing implementation from ${currentImpl} to ${newImpl}`);
+ if (typeof newImpl !== "string") {
+ console.log("returned receipt, schedule tx manually", newImpl);
+ return true;
+ }
+
+ if (network.name === "mainnet") {
+ const upgradeTx = await proxyAdmin.upgradeAndCall.populateTransaction(RestakingPool.address, newImpl, "0x");
+ console.log("upgrade tx", upgradeTx);
+
+ await schedule({
+ transaction: upgradeTx,
+ });
+ } else {
+ const upgradeTx = await proxyAdmin.upgradeAndCall(RestakingPool.address, newImpl, "0x");
+ console.log("upgrade tx", upgradeTx);
+ }
+
+ return true;
+};
+
+module.exports = func;
+module.exports.tags = ["13_upgrade_pool"];
+module.exports.dependencies = [];
+module.exports.skip = false;
+module.exports.id = "13";
diff --git a/projects/restaking-pool/deploy/14_update_protocol_config.ts b/projects/restaking-pool/deploy/14_update_protocol_config.ts
new file mode 100644
index 00000000..5b947ead
--- /dev/null
+++ b/projects/restaking-pool/deploy/14_update_protocol_config.ts
@@ -0,0 +1,44 @@
+import { ethers, upgrades } from "hardhat";
+import { DeployFunction } from "hardhat-deploy/types";
+import { schedule } from "../scripts/deploy-helpers";
+
+const func: DeployFunction = async function ({ deployments, network }) {
+ const { get } = deployments;
+ const ProtocolConfig = await get("ProtocolConfig");
+ console.log("ProtocolConfig proxy address:", ProtocolConfig.address);
+
+ const protocolConfigAdmin = await upgrades.erc1967.getAdminAddress(ProtocolConfig.address);
+ const currentImpl = await upgrades.erc1967.getImplementationAddress(ProtocolConfig.address);
+ const proxyAdmin = await ethers.getContractAt("IProxyAdmin", protocolConfigAdmin);
+
+ // Prepare ProtocolConfig contract factory
+ const ProtocolConfigFactory = await ethers.getContractFactory("ProtocolConfig");
+
+ const newImpl = await upgrades.prepareUpgrade(ProtocolConfig.address, ProtocolConfigFactory);
+ console.log(`Upgrading implementation from ${currentImpl} to ${newImpl}`);
+
+ if (typeof newImpl !== "string") {
+ console.log("Upgrade requires manual scheduling. Receipt:", newImpl);
+ return true;
+ }
+
+ if (network.name === "mainnet") {
+ const upgradeTx = await proxyAdmin.upgradeAndCall.populateTransaction(ProtocolConfig.address, newImpl, "0x");
+ console.log("Mainnet upgrade transaction populated:", upgradeTx);
+
+ await schedule({
+ transaction: upgradeTx,
+ });
+ } else {
+ const upgradeTx = await proxyAdmin.upgradeAndCall(ProtocolConfig.address, newImpl, "0x");
+ console.log("Upgrade transaction executed:", upgradeTx);
+ }
+
+ return true;
+};
+
+module.exports = func;
+module.exports.tags = ["14_update_protocol_config"];
+module.exports.dependencies = [];
+module.exports.skip = false;
+module.exports.id = "14";
diff --git a/projects/restaking-pool/deploy/15_deploy_native_rebalancer.ts b/projects/restaking-pool/deploy/15_deploy_native_rebalancer.ts
new file mode 100644
index 00000000..4504b12c
--- /dev/null
+++ b/projects/restaking-pool/deploy/15_deploy_native_rebalancer.ts
@@ -0,0 +1,52 @@
+import { ethers, upgrades } from "hardhat";
+import { DeployFunction } from "hardhat-deploy/types";
+import { ozDeploy } from "../scripts/deploy-helpers";
+
+const func: DeployFunction = async function ({ getNamedAccounts, deployments }) {
+ const { deployer, operator } = await getNamedAccounts();
+ const { get, execute } = deployments;
+
+ const lockboxAddress = "0x1016F41e5b7D192cecE4C38D098A12EbE195CaF4";
+
+ // Load existing contract addresses
+ const inceptionToken = await get("cToken");
+ const restakingPool = await get("RestakingPool");
+ const ratioFeed = await get("RatioFeed");
+
+ const crossChainBridge = ""; //TODO! Replace this with actual address
+ if (!crossChainBridge) {
+ throw new Error("CROSS_CHAIN_BRIDGE environment variable is not set");
+ }
+
+ console.log("Deploying NativeRebalancer with:");
+ console.log("Deployer:", deployer);
+ console.log("Operator:", operator);
+ console.log("InceptionToken:", inceptionToken.address);
+ console.log("XERC20lockboxAddress:", lockboxAddress);
+ console.log("RestakingPool:", restakingPool.address);
+ console.log("RatioFeed:", ratioFeed.address);
+ console.log("LZCrossChainAdapterL1:", crossChainBridge);
+
+ const nativeRebalancer = await ozDeploy(deployments, "NativeRebalancer", [
+ inceptionToken.address,
+ lockboxAddress,
+ restakingPool.address,
+ crossChainBridge,
+ ratioFeed.address,
+ operator
+ ]);
+
+ console.log("NativeRebalancer deployed at:", nativeRebalancer.address);
+
+ const executeCfg = { from: deployer, log: true };
+ await execute("ProtocolConfig", executeCfg, "setRebalancer", nativeRebalancer.address);
+ await execute("RestakingPool", executeCfg, "PR", nativeRebalancer.address);
+
+ return true;
+};
+
+module.exports = func;
+module.exports.tags = ["15_native_rebalancer_deploy"];
+module.exports.dependencies = [];
+module.exports.skip = false;
+module.exports.id = "15";
diff --git a/projects/restaking-pool/deploy/16_update_crosschain_adapter_l1.ts b/projects/restaking-pool/deploy/16_update_crosschain_adapter_l1.ts
new file mode 100644
index 00000000..2af98288
--- /dev/null
+++ b/projects/restaking-pool/deploy/16_update_crosschain_adapter_l1.ts
@@ -0,0 +1,28 @@
+import { ethers } from "hardhat";
+import { DeployFunction } from "hardhat-deploy/types";
+
+const func: DeployFunction = async function ({ deployments }) {
+ const { get } = deployments;
+
+ const nativeRebalancer = await get("NativeRebalancer");
+ console.log("NativeRebalancer address:", nativeRebalancer.address);
+
+ const crossChainBridgeAddress = ""; //replace with actual address!
+ if (!crossChainBridgeAddress) {
+ throw new Error("CROSS_CHAIN_BRIDGE environment variable is not set");
+ }
+
+ const lzCrossChainAdapterL1 = await ethers.getContractAt("ILZCrossChainAdapterL1", crossChainBridgeAddress);
+
+ console.log(`Setting targetReceiver to NativeRebalancer address at ${nativeRebalancer.address}`);
+ const tx = await lzCrossChainAdapterL1.setTargetReceiver(nativeRebalancer.address);
+
+ await tx.wait();
+ console.log("targetReceiver set successfully in transaction:", tx.hash);
+};
+
+module.exports = func;
+module.exports.tags = ["16_update_crosschain_adapter_l1"];
+module.exports.dependencies = [];
+module.exports.skip = false;
+module.exports.id = "16";
diff --git a/projects/restaking-pool/hardhat.config.ts b/projects/restaking-pool/hardhat.config.ts
index 40392b8e..93450779 100644
--- a/projects/restaking-pool/hardhat.config.ts
+++ b/projects/restaking-pool/hardhat.config.ts
@@ -4,11 +4,12 @@ import "@nomicfoundation/hardhat-toolbox";
import "hardhat-gas-reporter";
import "hardhat-deploy";
import "@openzeppelin/hardhat-upgrades";
+import "@nomicfoundation/hardhat-verify";
const config: HardhatUserConfig = {
...(CONFIG as HardhatUserConfig),
solidity: {
- version: "0.8.20",
+ version: "0.8.27",
settings: {
optimizer: {
enabled: true,
@@ -16,6 +17,9 @@ const config: HardhatUserConfig = {
},
},
},
+ sourcify: {
+ enabled: true
+ }
};
export default config;
diff --git a/projects/restaking-pool/package.json b/projects/restaking-pool/package.json
index f6212916..6873c6f0 100644
--- a/projects/restaking-pool/package.json
+++ b/projects/restaking-pool/package.json
@@ -1,6 +1,6 @@
{
"name": "genesis-smart-contracts",
- "version": "1.0.0",
+ "version": "1.0.1",
"description": "",
"main": "truffle-config.js",
"directories": {
@@ -18,11 +18,12 @@
"author": "",
"license": "ISC",
"devDependencies": {
+ "@layerzerolabs/lz-v2-utilities": "^3.0.15",
"@nomicfoundation/hardhat-chai-matchers": "^2.0.2",
"@nomicfoundation/hardhat-ethers": "^3.0.5",
"@nomicfoundation/hardhat-network-helpers": "^1.0.9",
"@nomicfoundation/hardhat-toolbox": "^4.0.0",
- "@nomicfoundation/hardhat-verify": "^2.0.5",
+ "@nomicfoundation/hardhat-verify": "^2.0.11",
"@nomiclabs/hardhat-ethers": "^2.2.3",
"@openzeppelin/contracts": "^5.0.0",
"@openzeppelin/contracts-upgradeable": "^5.0.0",
@@ -40,7 +41,9 @@
"hardhat-deploy": "^0.11.45",
"hardhat-gas-reporter": "^1.0.9",
"hardhat-tracer": "^2.7.0",
- "solidity-coverage": "^0.8.4",
+ "openzeppelin-4": "npm:@openzeppelin/contracts@4.5.0",
+ "openzeppelin-4-upgradeable": "npm:@openzeppelin/contracts-upgradeable@4.5.0",
+ "solidity-coverage": "^0.8.13",
"ts-node": "^10.9.1",
"typechain": "^8.3.2",
"typescript": "^5.2.2"
diff --git a/projects/restaking-pool/scripts/call/send-data-to-l1.ts b/projects/restaking-pool/scripts/call/send-data-to-l1.ts
new file mode 100644
index 00000000..8e13f6ce
--- /dev/null
+++ b/projects/restaking-pool/scripts/call/send-data-to-l1.ts
@@ -0,0 +1,55 @@
+import { ethers } from "hardhat";
+import fs from "fs";
+import path from "path";
+import { Options } from "@layerzerolabs/lz-v2-utilities";
+
+const options = Options.newOptions().addExecutorLzReceiveOption(800000, 0).toHex().toString();
+
+async function main() {
+ const checkpointPath = path.join(__dirname, '../../../../deployment_checkpoint_arbitrum-sepolia.json');
+ if (!fs.existsSync(checkpointPath)) {
+ console.error("Checkpoint file deployment_checkpoint_arbitrum-sepolia.json not found!");
+ process.exit(1);
+ }
+
+ // Retrieve the LZCrossChainAdapterL2 address from the checkpoint file
+ const checkpointData = JSON.parse(fs.readFileSync(checkpointPath, "utf8"));
+ const lzCrossChainAdapterL2Address = checkpointData.LZCrossChainAdapterL2;
+ if (!lzCrossChainAdapterL2Address) {
+ console.error("LZCrossChainAdapterL2 address not found in deployment_checkpoint_arbitrum-sepolia.json!");
+ process.exit(1);
+ }
+
+ // Define ABI with sendDataL1 function signature
+ const abi = [
+ "function sendDataL1(bytes _payload, bytes _options) external payable"
+ ];
+
+ // Attach to the contract and connect the signer
+ const signer = await ethers.provider.getSigner();
+ const LZCrossChainAdapterL2 = new ethers.Contract(lzCrossChainAdapterL2Address, abi, signer);
+ console.log("Attached to LZCrossChainAdapterL2 at address:", lzCrossChainAdapterL2Address);
+
+ const timestamp = Math.floor(Date.now() / 1000) - 1000; // current timestamp in seconds
+ const balance = ethers.parseEther("1.5");
+ const totalSupply = ethers.parseEther("1000");
+
+ const payload = ethers.AbiCoder.defaultAbiCoder().encode(
+ ["uint256", "uint256", "uint256"],
+ [timestamp, balance, totalSupply]
+ );
+
+ const tx = await LZCrossChainAdapterL2.sendDataL1(payload, options, {
+ value: ethers.parseEther("0.1")
+ });
+
+ console.log("Sending data across chain...");
+ await tx.wait();
+ console.log("sendDataL1 transaction complete:", tx.hash);
+}
+
+// Execute the main function
+main().catch((error) => {
+ console.error(error);
+ process.exit(1);
+});
diff --git a/projects/restaking-pool/scripts/call/send-eth-to-l1.ts b/projects/restaking-pool/scripts/call/send-eth-to-l1.ts
new file mode 100644
index 00000000..d03353d1
--- /dev/null
+++ b/projects/restaking-pool/scripts/call/send-eth-to-l1.ts
@@ -0,0 +1,44 @@
+import { ethers } from "hardhat";
+import fs from "fs";
+import path from "path";
+import { Options } from "@layerzerolabs/lz-v2-utilities";
+
+const options = Options.newOptions().addExecutorLzReceiveOption(200000, 300000).toHex().toString();
+
+async function main() {
+ const checkpointPath = path.join(__dirname, '../../../../deployment_checkpoint_arbitrum-sepolia.json');
+ if (!fs.existsSync(checkpointPath)) {
+ console.error("Checkpoint file deployment_checkpoint_abritrum-sepolia.json not found!");
+ process.exit(1);
+ }
+
+ const checkpointData = JSON.parse(fs.readFileSync(checkpointPath, "utf8"));
+ const lzCrossChainAdapterL2Address = checkpointData.LZCrossChainAdapterL2;
+ if (!lzCrossChainAdapterL2Address) {
+ console.error("LZCrossChainAdapterL2 address not found in deployment_checkpoint_abritrum-sepolia.json!");
+ process.exit(1);
+ }
+
+ const abi = [
+ "function sendEthCrossChain(uint256 _chainId, bytes _options) external payable"
+ ];
+
+ const signer = await ethers.provider.getSigner();
+ const LZCrossChainAdapterL2 = new ethers.Contract(lzCrossChainAdapterL2Address, abi, signer);
+ console.log("Attached to LZCrossChainAdapterL2 at address:", lzCrossChainAdapterL2Address);
+
+ const destinationChainId = 11155111; //chain id of Sepolia
+
+ const tx = await LZCrossChainAdapterL2.sendEthCrossChain(destinationChainId, options, {
+ value: ethers.parseEther("0.1")
+ });
+
+ console.log("Sending ETH across chain...");
+ await tx.wait();
+ console.log("sendEthCrossChain transaction complete:", tx.hash);
+}
+
+main().catch((error) => {
+ console.error(error);
+ process.exit(1);
+});
diff --git a/projects/restaking-pool/scripts/call/send-eth-to-l2.ts b/projects/restaking-pool/scripts/call/send-eth-to-l2.ts
new file mode 100644
index 00000000..5408cd36
--- /dev/null
+++ b/projects/restaking-pool/scripts/call/send-eth-to-l2.ts
@@ -0,0 +1,45 @@
+import { ethers } from "hardhat";
+import fs from "fs";
+import path from "path";
+import { Options } from "@layerzerolabs/lz-v2-utilities";
+
+const options = Options.newOptions().addExecutorLzReceiveOption(200000, 334000).toHex().toString();
+
+async function main() {
+ const checkpointPath = path.join(__dirname, '../../../../deployment_checkpoint_sepolia.json');
+ if (!fs.existsSync(checkpointPath)) {
+ console.error("Checkpoint file deployment_checkpoint_sepolia not found!");
+ process.exit(1);
+ }
+
+ const checkpointData = JSON.parse(fs.readFileSync(checkpointPath, "utf8"));
+ const lzCrossChainAdapterL1Address = checkpointData.LZCrossChainAdapterL1;
+ if (!lzCrossChainAdapterL1Address) {
+ console.error("LZCrossChainAdapterL1 address not found in deployment_checkpoint_sepolia!");
+ process.exit(1);
+ }
+
+ const abi = [
+ "function sendEthCrossChain(uint256 _chainId, bytes _options) external payable"
+ ];
+
+ // Attach to the contract and connect the signer
+ const signer = await ethers.provider.getSigner();
+ const LZCrossChainAdapterL1 = new ethers.Contract(lzCrossChainAdapterL1Address, abi, signer);
+ console.log("Attached to LZCrossChainAdapterL1 at address:", lzCrossChainAdapterL1Address);
+
+ const destinationChainId = 11155420; //chain id of Optimism Sepolia
+
+ const tx = await LZCrossChainAdapterL1.sendEthCrossChain(destinationChainId, options, {
+ value: ethers.parseEther("0.1")
+ });
+
+ console.log("Sending ETH to Optimism Sepolia...");
+ await tx.wait();
+ console.log("sendEthCrossChain transaction complete:", tx.hash);
+}
+
+main().catch((error) => {
+ console.error(error);
+ process.exit(1);
+});
\ No newline at end of file
diff --git a/projects/restaking-pool/scripts/call/update-treasury-data.ts b/projects/restaking-pool/scripts/call/update-treasury-data.ts
new file mode 100644
index 00000000..4e6e991c
--- /dev/null
+++ b/projects/restaking-pool/scripts/call/update-treasury-data.ts
@@ -0,0 +1,36 @@
+import { ethers } from "hardhat";
+import * as fs from "fs";
+import path from "path";
+
+async function main() {
+ // Load contract address from JSON file
+ const checkpointPath = path.join(__dirname, '../../../../deployment_checkpoint_sepolia.json');
+ const data = JSON.parse(fs.readFileSync(checkpointPath, 'utf8'));
+ const rebalancerAddress: string | undefined = data.Rebalancer;
+
+ // Check if the address was found in JSON
+ if (!rebalancerAddress) {
+ throw new Error("Rebalancer address not found in JSON file.");
+ }
+
+ console.log(`Using Rebalancer contract at address: ${rebalancerAddress}`);
+
+ // Connect to the Rebalancer contract
+ const RebalancerFactory = await ethers.getContractFactory("Rebalancer");
+ const rebalancer = RebalancerFactory.attach(rebalancerAddress) as Rebalancer;
+
+ // Call updateTreasuryData() and wait for the transaction to be mined
+ console.log("Calling updateTreasuryData on Rebalancer...");
+ const tx = await rebalancer.updateTreasuryData();
+ const receipt = await tx.wait();
+
+ console.log("updateTreasuryData transaction confirmed!");
+ console.log(`Transaction hash: ${receipt.transactionHash}`);
+}
+
+main()
+ .then(() => process.exit(0))
+ .catch((error) => {
+ console.error(error);
+ process.exit(1);
+ });
diff --git a/projects/restaking-pool/scripts/deploy-l1/all-test.ts b/projects/restaking-pool/scripts/deploy-l1/all-test.ts
new file mode 100644
index 00000000..41d71ff7
--- /dev/null
+++ b/projects/restaking-pool/scripts/deploy-l1/all-test.ts
@@ -0,0 +1,141 @@
+import { ethers, upgrades, run } from "hardhat";
+import fs from "fs";
+import path from "path";
+
+// Utility functions for checkpoint handling
+function isContractDeployed(checkpointData: any, contractKey: string): boolean {
+ return checkpointData[contractKey] !== undefined;
+}
+
+function saveCheckpoint(checkpointFilePath: string, checkpointData: any) {
+ fs.writeFileSync(checkpointFilePath, JSON.stringify(checkpointData, null, 2), 'utf8');
+}
+
+async function verifyContract(address: string, constructorArguments: any[], isUpgradeable: boolean) {
+ try {
+ if (isUpgradeable) {
+ const implementationAddress = await upgrades.erc1967.getImplementationAddress(address);
+ console.log(`Verifying upgradeable contract implementation at: ${implementationAddress}`);
+ await run("verify:verify", {
+ address: implementationAddress,
+ constructorArguments: [],
+ forceConstructorArgs: true
+ });
+ }
+
+ console.log(`Verifying proxy contract at: ${address}`);
+ await run("verify:verify", {
+ address,
+ constructorArguments,
+ forceConstructorArgs: true
+ });
+ console.log(`Successfully verified contract at: ${address}`);
+ } catch (error) {
+ console.error(`Failed to verify contract at ${address}:`, error);
+ }
+}
+
+async function main() {
+ const [deployer] = await ethers.getSigners();
+ console.log(`Deploying contracts with the account: ${deployer.address}`);
+
+ const checkpointFilePath = path.join(__dirname, '../../../../deployment_checkpoint_sepolia.json');
+
+ if (!fs.existsSync(checkpointFilePath)) {
+ throw new Error(`Checkpoint file not found: ${checkpointFilePath}`);
+ }
+
+ const checkpointData = JSON.parse(fs.readFileSync(checkpointFilePath, 'utf8'));
+
+ const lzCrossChainBridgeAddress = checkpointData.LZCrossChainBridge;
+ if (!lzCrossChainBridgeAddress) {
+ throw new Error('LZCrossChainBridge address not found in deployment_checkpoint_sepolia.json');
+ }
+
+ // Deploy TransactionStorage if not already deployed
+ if (!isContractDeployed(checkpointData, "TransactionStorage")) {
+ console.log("Deploying TransactionStorage...");
+ const TransactionStorage = await ethers.getContractFactory("TransactionStorage");
+ const transactionStorage = await TransactionStorage.deploy(deployer.address);
+ await transactionStorage.waitForDeployment();
+ const transactionStorageAddress = await transactionStorage.getAddress();
+ console.log(`TransactionStorage deployed at: ${transactionStorageAddress}`);
+
+ checkpointData.TransactionStorage = transactionStorageAddress;
+ saveCheckpoint(checkpointFilePath, checkpointData);
+
+ await verifyContract(transactionStorageAddress, [deployer.address], false);
+ }
+
+ // Deploy Rebalancer as an upgradeable proxy
+ if (!isContractDeployed(checkpointData, "Rebalancer")) {
+ console.log("Deploying Rebalancer as an upgradeable proxy...");
+ const Rebalancer = await ethers.getContractFactory("Rebalancer");
+ const rebalancer = await upgrades.deployProxy(
+ Rebalancer,
+ [
+ deployer.address, // _inETHAddress
+ deployer.address, // _lockbox
+ deployer.address, // _liqPool
+ checkpointData.TransactionStorage, // _transactionStorage
+ deployer.address, // _ratioFeed
+ deployer.address // _operator
+ ],
+ { initializer: 'initialize' }
+ );
+ await rebalancer.waitForDeployment();
+ const rebalancerAddress = await rebalancer.getAddress();
+ console.log(`Rebalancer deployed at: ${rebalancerAddress}`);
+
+ checkpointData.Rebalancer = rebalancerAddress;
+ saveCheckpoint(checkpointFilePath, checkpointData);
+
+ await verifyContract(rebalancerAddress, [], true);
+ }
+
+ // Deploy CrossChainAdapterL1 as an upgradeable proxy if not already deployed
+ if (!isContractDeployed(checkpointData, "CrossChainAdapterL1")) {
+ console.log("Deploying CrossChainAdapterL1...");
+ const CrossChainAdapterL1 = await ethers.getContractFactory("CrossChainAdapterL1");
+ const crossChainAdapterL1 = await upgrades.deployProxy(
+ CrossChainAdapterL1,
+ [
+ lzCrossChainBridgeAddress,
+ checkpointData.Rebalancer,
+ checkpointData.TransactionStorage
+ ],
+ { initializer: 'initialize' }
+ );
+ await crossChainAdapterL1.waitForDeployment();
+ const crossChainAdapterL1Address = await crossChainAdapterL1.getAddress();
+ console.log(`CrossChainAdapterL1 deployed at: ${crossChainAdapterL1Address}`);
+
+ checkpointData.CrossChainAdapterL1 = crossChainAdapterL1Address;
+ saveCheckpoint(checkpointFilePath, checkpointData);
+
+ await verifyContract(crossChainAdapterL1Address, [lzCrossChainBridgeAddress, checkpointData.Rebalancer, checkpointData.TransactionStorage], true);
+ }
+
+ const lzCrossChainBridge = await ethers.getContractAt("ICrossChainBridge", lzCrossChainBridgeAddress);
+ const setAdapterTx = await lzCrossChainBridge.setAdapter(checkpointData.CrossChainAdapterL1);
+ await setAdapterTx.wait();
+ console.log(`Adapter set in LZCrossChainBridge to: ${checkpointData.CrossChainAdapterL1}`);
+
+ const transactionStorage = await ethers.getContractAt("TransactionStorage", checkpointData.TransactionStorage);
+ console.log("Adding Chain IDs to TransactionStorage...");
+ await transactionStorage.addChainId(40161);
+ await transactionStorage.addChainId(40231);
+ await transactionStorage.addChainId(40232);
+ console.log("Chain IDs added to TransactionStorage");
+
+ await transactionStorage.setAdapter(checkpointData.CrossChainAdapterL1);
+ console.log("Adapter added to TransactionStorage");
+
+ console.log("Deployment and linking process completed successfully.");
+}
+
+// Run the script
+main().catch((error) => {
+ console.error("Error during deployment:", error);
+ process.exit(1);
+});
diff --git a/projects/restaking-pool/scripts/deploy-l1/rebalancer.ts b/projects/restaking-pool/scripts/deploy-l1/rebalancer.ts
new file mode 100644
index 00000000..2022400a
--- /dev/null
+++ b/projects/restaking-pool/scripts/deploy-l1/rebalancer.ts
@@ -0,0 +1,104 @@
+// scripts/deployRebalancer.js
+import fs from "fs";
+import { ethers, run, network, upgrades } from "hardhat";
+import path from "path";
+
+async function main(
+ _inETHAddress,
+ _lockbox,
+ _liqPool,
+ _ratioFeed,
+ _operator
+) {
+ // Check if the deployment checkpoint file exists
+ const checkpointPath = path.join(__dirname, '../../../../deployment_checkpoint_sepolia.json');
+ if (!fs.existsSync(checkpointPath)) {
+ console.error("Checkpoint file deployment_checkpoint_sepolia.json not found!");
+ process.exit(1);
+ }
+
+ // Load contract addresses from the checkpoint file
+ const checkpointData = JSON.parse(fs.readFileSync(checkpointPath, "utf8"));
+ const lzCrossChainAdapterL1Address = checkpointData.LZCrossChainAdapterL1;
+ if (!lzCrossChainAdapterL1Address) {
+ console.error("LZCrossChainAdapterL1 address not found in deployment_checkpoint_sepolia.json!");
+ process.exit(1);
+ }
+
+ // Deploy the Rebalancer contract as a Transparent Proxy upgradeable contract
+ console.log("Deploying Rebalancer...");
+ const Rebalancer = await ethers.getContractFactory("Rebalancer");
+ const rebalancer = await upgrades.deployProxy(
+ Rebalancer,
+ [
+ _inETHAddress, // _inETHAddress
+ _lockbox, // _lockbox
+ _liqPool, // _liqPool
+ lzCrossChainAdapterL1Address, // _defaultAdapter from the checkpoint file
+ _ratioFeed, // _ratioFeed
+ _operator // _operator
+ ],
+ { initializer: "initialize" }
+ );
+ await rebalancer.waitForDeployment();
+ const rebalancerAddress = await rebalancer.getAddress();
+ console.log("Rebalancer proxy deployed to:", rebalancerAddress);
+
+ // Get the implementation address behind the proxy
+ const rebalancerImplementationAddress = await upgrades.erc1967.getImplementationAddress(rebalancerAddress);
+ console.log("Rebalancer implementation deployed to:", rebalancerImplementationAddress);
+
+ // Attach to the existing LZCrossChainAdapterL1 contract
+ const lzCrossChainAdapterL1 = await ethers.getContractAt("ILZCrossChainAdapterL1", lzCrossChainAdapterL1Address);
+ console.log("Attached to LZCrossChainAdapterL1 at address:", lzCrossChainAdapterL1Address);
+
+ // Call setTargetReceiver on the LZCrossChainAdapterL1 contract
+ console.log("Setting target receiver...");
+ const tx1 = await lzCrossChainAdapterL1.setTargetReceiver(rebalancerAddress);
+ await tx1.wait();
+ console.log("Target receiver set to Rebalancer address");
+
+ // Call addChainId on Rebalancer with the specified chain ID
+ console.log("Adding Chain ID 11155420 to Rebalancer...");
+ const tx2 = await rebalancer.addChainId(11155420);
+ await tx2.wait();
+ console.log("Chain ID 11155420 added to Rebalancer");
+
+ // Only verify the contract if on network ID 11155111
+ if (network.config.chainId === 11155111) {
+ await verifyContract(rebalancerAddress, []); // Verify Proxy
+ await verifyContract(rebalancerImplementationAddress, [_inETHAddress, _lockbox, _liqPool, lzCrossChainAdapterL1Address, _ratioFeed, _operator]); // Verify Implementation
+ } else {
+ console.log(`Skipping verification on network ID ${network.config.chainId}`);
+ }
+}
+
+// Verification function for contract
+async function verifyContract(contractAddress, args) {
+ try {
+ console.log(`Verifying contract at address ${contractAddress} on Etherscan...`);
+ await run("verify:verify", {
+ address: contractAddress,
+ constructorArguments: args,
+ });
+ console.log(`Contract at ${contractAddress} verified successfully.`);
+ } catch (error) {
+ console.error(`Verification failed for ${contractAddress}:`, error);
+ }
+}
+
+// Execute the main function with dynamic arguments
+(async () => {
+ const _inETHAddress = `${process.env.DEPLOYER_ADDRESS}`; // replace with actual address
+ const _lockbox = `${process.env.DEPLOYER_ADDRESS}`; // replace with actual address
+ const _liqPool = `${process.env.DEPLOYER_ADDRESS}`; // replace with actual address
+ const _ratioFeed = `${process.env.DEPLOYER_ADDRESS}`; // replace with actual address
+ const _operator = (await ethers.getSigners())[0].address;
+
+ await main(_inETHAddress, _lockbox, _liqPool, _ratioFeed, _operator)
+ .then(() => process.exit(0))
+ .catch((error) => {
+ console.error(error);
+ process.exit(1);
+ });
+})();
diff --git a/projects/restaking-pool/scripts/deploy-omni-staking.ts b/projects/restaking-pool/scripts/deploy-omni-staking.ts
new file mode 100644
index 00000000..2de65bda
--- /dev/null
+++ b/projects/restaking-pool/scripts/deploy-omni-staking.ts
@@ -0,0 +1,308 @@
+import { ethers, upgrades, run, network } from "hardhat";
+import axios from "axios";
+import * as fs from 'fs';
+import path from "path";
+require("dotenv").config();
+
+const checkpointPath = path.join(__dirname, '../../../deployment_checkpoint_sepolia.json');
+const ETHERSCAN_API_KEY = process.env.ETHERSCAN_API_KEY;
+const verifiedContracts = new Set();
+
+// Utility function to introduce delay
+function delay(ms: number) {
+ return new Promise(resolve => setTimeout(resolve, ms));
+}
+
+async function main() {
+ if (!fs.existsSync(checkpointPath)) {
+ console.error("Deployment checkpoint file not found!");
+ process.exit(1);
+ }
+ const checkpoint = loadCheckpoint();
+ if (!checkpoint.LZCrossChainAdapterL1) {
+ console.error("LZCrossChainAdapterL1 address not found in the deployment checkpoint file!");
+ process.exit(1);
+ }
+
+ const [deployer] = await ethers.getSigners();
+ console.log(`Deployer Address: ${deployer.address}`);
+ const operatorAddress = process.env.OPERATOR_ADDRESS;
+
+ const supportedChains = [1, 4, 5, 42, 56, 137, 17000, 11155111];
+ const networkData = await ethers.provider.getNetwork();
+ const chainId = Number(networkData.chainId);
+ console.log(`chainId is ${chainId}`);
+
+ // ------------ Transaction 1: ProtocolConfig, RatioFeed, cToken ------------
+ if (!checkpoint.ProtocolConfig) {
+ console.log("Deploying ProtocolConfig...");
+ const ProtocolConfig = await ethers.getContractFactory("ProtocolConfig");
+ const protocolConfig = await upgrades.deployProxy(ProtocolConfig, [
+ deployer.address, operatorAddress, deployer.address
+ ], { initializer: "initialize" });
+ await protocolConfig.waitForDeployment();
+ checkpoint.ProtocolConfig = await protocolConfig.getAddress();
+ saveCheckpoint(checkpoint);
+ console.log("ProtocolConfig deployed at:", checkpoint.ProtocolConfig);
+ }
+
+ if (!checkpoint.RatioFeed) {
+ console.log("Deploying RatioFeed...");
+ const RatioFeed = await ethers.getContractFactory("RatioFeed");
+ const ratioFeed = await upgrades.deployProxy(
+ RatioFeed,
+ [checkpoint.ProtocolConfig, 1000000],
+ { initializer: "initialize" }
+ );
+ await ratioFeed.waitForDeployment();
+ checkpoint.RatioFeed = await ratioFeed.getAddress();
+ saveCheckpoint(checkpoint);
+ console.log("RatioFeed deployed at:", checkpoint.RatioFeed);
+ }
+
+ if (!checkpoint.cToken) {
+ console.log("Deploying cToken...");
+ const cToken = await ethers.getContractFactory("cToken");
+ const cTokenDeployed = await upgrades.deployProxy(
+ cToken,
+ [checkpoint.ProtocolConfig, "inETH", "inETH"],
+ { initializer: "initialize" }
+ );
+ await cTokenDeployed.waitForDeployment();
+ checkpoint.cToken = await cTokenDeployed.getAddress();
+ saveCheckpoint(checkpoint);
+ console.log("cToken deployed at:", checkpoint.cToken);
+ }
+
+ if (network.name !== "hardhat") {
+ await verifyUpgradeableContract(checkpoint.ProtocolConfig, []);
+ await verifyUpgradeableContract(checkpoint.RatioFeed, [checkpoint.ProtocolConfig, 1000000]);
+ await verifyUpgradeableContract(checkpoint.cToken, [checkpoint.ProtocolConfig, "inETH", "inETH"]);
+ }
+
+ // ------------ Transaction 2: InceptionLibrary, RestakingPool ------------
+ if (!checkpoint.InceptionLibrary) {
+ console.log("Deploying InceptionLibrary...");
+ const InceptionLibrary = await ethers.getContractFactory("InceptionLibrary");
+ const inceptionLibrary = await InceptionLibrary.deploy();
+ await inceptionLibrary.waitForDeployment();
+ checkpoint.InceptionLibrary = await inceptionLibrary.getAddress();
+ saveCheckpoint(checkpoint);
+ console.log("InceptionLibrary deployed at:", checkpoint.InceptionLibrary);
+ }
+
+ if (!checkpoint.RestakingPool) {
+ console.log("Deploying RestakingPool...");
+ const RestakingPoolFactory = await ethers.getContractFactory("RestakingPool", {
+ libraries: {
+ InceptionLibrary: checkpoint.InceptionLibrary,
+ },
+ });
+ const restakingPool = await upgrades.deployProxy(
+ RestakingPoolFactory,
+ [checkpoint.ProtocolConfig, 30000000, 100000000],
+ {
+ initializer: "initialize",
+ unsafeAllowLinkedLibraries: true
+ }
+ );
+ await restakingPool.waitForDeployment();
+ checkpoint.RestakingPool = await restakingPool.getAddress();
+ saveCheckpoint(checkpoint);
+ console.log("RestakingPool deployed at:", checkpoint.RestakingPool);
+ // Set target capacity and stake bonus parameters
+ await restakingPool.setTargetFlashCapacity(1000000n);
+ await restakingPool.setStakeBonusParams(10n, 5n, 50n);
+ await restakingPool.setFlashUnstakeFeeParams(5n, 3n, 50n);
+ const newMaxTVL = ethers.parseEther("101");
+ await restakingPool.setMaxTVL(newMaxTVL);
+
+ if (network.name !== "hardhat") {
+ await verifyUpgradeableContract(checkpoint.RestakingPool, [checkpoint.ProtocolConfig, 30000000, 100000000]);
+ }
+ }
+
+ if (network.name !== "hardhat") {
+ await verifyNonUpgradeableContract(checkpoint.InceptionLibrary, []);
+ }
+
+ // ------------ Transaction 3: XERC20Lockbox, Rebalancer ------------
+ if (!checkpoint.XERC20Lockbox) {
+ console.log("Deploying XERC20Lockbox...");
+ const XERC20Lockbox = await ethers.getContractFactory("XERC20Lockbox");
+ const xerc20Lockbox = await upgrades.deployProxy(
+ XERC20Lockbox,
+ [checkpoint.cToken, checkpoint.cToken, true],
+ { initializer: "initialize" }
+ );
+ await xerc20Lockbox.waitForDeployment();
+ checkpoint.XERC20Lockbox = await xerc20Lockbox.getAddress();
+ saveCheckpoint(checkpoint);
+ console.log("XERC20Lockbox deployed at:", checkpoint.XERC20Lockbox);
+ }
+
+ if (network.name !== "hardhat") {
+ await verifyUpgradeableContract(checkpoint.XERC20Lockbox, [checkpoint.cToken, checkpoint.cToken, true]);
+ }
+
+ if (!checkpoint.NativeRebalancer) {
+ console.log("Deploying Rebalancer...");
+ const Rebalancer = await ethers.getContractFactory("NativeRebalancer");
+ const rebalancer = await upgrades.deployProxy(
+ Rebalancer,
+ [
+ checkpoint.cToken,
+ checkpoint.XERC20Lockbox,
+ checkpoint.RestakingPool,
+ checkpoint.LZCrossChainAdapterL1,
+ checkpoint.RatioFeed,
+ operatorAddress
+ ],
+ { initializer: 'initialize' }
+ );
+ await rebalancer.waitForDeployment();
+ checkpoint.NativeRebalancer = await rebalancer.getAddress();
+ await rebalancer.addChainId(421614n); //Arbitrum Sepolia Chain
+ await rebalancer.addChainId(11155420n); //Optimism Sepolia Chain
+ saveCheckpoint(checkpoint);
+ console.log("Rebalancer (proxy) deployed at:", checkpoint.NativeRebalancer);
+ }
+
+ // Set target receiver in LZCrossChainAdapterL1 to Rebalancer address
+ const lzCrossChainAdapterL1 = await ethers.getContractAt("ILZCrossChainAdapterL1", checkpoint.LZCrossChainAdapterL1);
+ console.log("Setting target receiver on LZCrossChainAdapterL1...");
+ const setTargetReceiverTx = await lzCrossChainAdapterL1.setTargetReceiver(checkpoint.NativeRebalancer);
+ await setTargetReceiverTx.wait();
+ console.log("Target receiver set to Rebalancer on LZCrossChainAdapterL1.");
+
+ // Update ratio in RatioFeed to a non-1:1 ratio
+ console.log("Updating ratio for cToken in RatioFeed...");
+ const ratioFeedContract = await ethers.getContractAt("RatioFeed", checkpoint.RatioFeed);
+ const newRatio = ethers.parseEther("0.8");
+ const updateRatioTx = await ratioFeedContract.updateRatio(checkpoint.cToken, newRatio);
+ await updateRatioTx.wait();
+ console.log(`Ratio updated for ${checkpoint.cToken} to ${newRatio.toString()} in RatioFeed.`);
+
+ // Call ProtocolConfig setters
+ console.log("Setting up ProtocolConfig addresses...");
+ const protocolConfig = await ethers.getContractAt("ProtocolConfig", checkpoint.ProtocolConfig);
+ await protocolConfig.setRatioFeed(checkpoint.RatioFeed);
+ await protocolConfig.setRestakingPool(checkpoint.RestakingPool);
+ await protocolConfig.setRebalancer(checkpoint.NativeRebalancer);
+ await protocolConfig.setCToken(checkpoint.cToken);
+ console.log("ProtocolConfig addresses set successfully.");
+
+ // Add a delay before verifying the Rebalancer
+ if (network.name !== "hardhat") {
+ await delay(30000);
+ await verifyUpgradeableContract(checkpoint.NativeRebalancer, [checkpoint.cToken, checkpoint.XERC20Lockbox, checkpoint.RestakingPool, checkpoint.LZCrossChainAdapterL1, checkpoint.RatioFeed, operatorAddress]);
+ }
+
+ console.log("Deployment completed successfully! 🥳");
+ console.log("Checkpoint saved:", checkpoint);
+}
+
+function saveCheckpoint(checkpoint: any) {
+ fs.writeFileSync(checkpointPath, JSON.stringify(checkpoint, null, 2));
+}
+
+// Load deployment checkpoint
+function loadCheckpoint(): any {
+ if (fs.existsSync(checkpointPath)) {
+ return JSON.parse(fs.readFileSync(checkpointPath, 'utf8'));
+ }
+ return {};
+}
+
+async function isContractVerified(contractAddress: string): Promise {
+ if (verifiedContracts.has(contractAddress)) {
+ console.log(`Contract ${contractAddress} is already in the verified cache.`);
+ return true;
+ }
+
+ const apiUrl = `https://api.etherscan.io/api?module=contract&action=getsourcecode&address=${contractAddress}&apikey=${ETHERSCAN_API_KEY}`;
+
+ try {
+ const response = await axios.get(apiUrl);
+ const data = response.data;
+
+ if (data.status === "1" && Array.isArray(data.result) && data.result.length > 0) {
+ const isVerified = data.result[0].ABI !== "Contract source code not verified";
+ if (isVerified) {
+ verifiedContracts.add(contractAddress);
+ }
+ return isVerified;
+ }
+ console.error(`Verification status for ${contractAddress} not found or invalid response:`, data);
+ return false;
+ } catch (error) {
+ console.error(`Error checking verification status for ${contractAddress}:`, error);
+ return false;
+ }
+}
+
+async function verifyUpgradeableContract(proxyAddress: string, constructorArguments: any[]) {
+ if (network.name === "hardhat") return; // Skip verification for hardhat
+
+ const implementationAddress = await upgrades.erc1967.getImplementationAddress(proxyAddress);
+
+ const isVerifiedImplementation = await isContractVerified(implementationAddress);
+ if (isVerifiedImplementation) {
+ console.log(`Implementation contract at ${implementationAddress} is already verified.`);
+ return;
+ }
+
+ try {
+ console.log(`Verifying implementation contract at: ${implementationAddress}`);
+ await run("verify:verify", {
+ address: implementationAddress,
+ constructorArguments: []
+ });
+ } catch (error) {
+ console.error(`Failed to verify implementation contract at ${implementationAddress}:`, error);
+ }
+
+ const isVerifiedProxy = await isContractVerified(proxyAddress);
+ if (isVerifiedProxy) {
+ console.log(`Proxy contract at ${proxyAddress} is already verified.`);
+ return;
+ }
+
+ try {
+ console.log(`Verifying proxy contract at: ${proxyAddress}`);
+ await run("verify:verify", {
+ address: proxyAddress,
+ constructorArguments: constructorArguments
+ });
+ } catch (error) {
+ console.error(`Failed to verify proxy contract at ${proxyAddress}:`, error);
+ }
+
+ console.log(`Finished verification for upgradeable contract at: ${proxyAddress}`);
+}
+
+async function verifyNonUpgradeableContract(contractAddress: string, constructorArguments: any[]) {
+ if (network.name === "hardhat") return; // Skip verification for hardhat
+
+ const isVerified = await isContractVerified(contractAddress);
+ if (isVerified) {
+ console.log(`Non-upgradeable contract at ${contractAddress} is already verified.`);
+ return;
+ }
+
+ try {
+ console.log(`Verifying non-upgradeable contract at: ${contractAddress}`);
+ await run("verify:verify", {
+ address: contractAddress,
+ constructorArguments: constructorArguments
+ });
+ console.log(`Successfully verified non-upgradeable contract at: ${contractAddress}`);
+ } catch (error) {
+ console.error(`Failed to verify non-upgradeable contract at ${contractAddress}:`, error);
+ }
+}
+
+main().catch((error) => {
+ console.error(error);
+ process.exitCode = 1;
+});
diff --git a/projects/restaking-pool/scripts/test/handleCrossChainData.ts b/projects/restaking-pool/scripts/test/handleCrossChainData.ts
new file mode 100644
index 00000000..6ecbbc74
--- /dev/null
+++ b/projects/restaking-pool/scripts/test/handleCrossChainData.ts
@@ -0,0 +1,101 @@
+import { ethers } from "hardhat";
+import fs from "fs";
+import path from "path";
+
+async function main() {
+ const [deployer] = await ethers.getSigners();
+ console.log(`Deployer Address: ${deployer.address}`);
+
+ // Path to the deployment checkpoint JSON file
+ const checkpointFilePath = path.join(__dirname, "../../../../deployment_checkpoint_sepolia.json");
+
+ // Ensure the deployment checkpoint file exists
+ if (!fs.existsSync(checkpointFilePath)) {
+ throw new Error(`Checkpoint file not found: ${checkpointFilePath}`);
+ }
+
+ const checkpointData = JSON.parse(fs.readFileSync(checkpointFilePath, "utf8"));
+
+ const crossChainAdapterL1Address = checkpointData.CrossChainAdapterL1;
+ // const crossChainAdapterL1Address = "0xf2be8fdD5c171774D95aa3c81312535499a87b63";
+ if (!crossChainAdapterL1Address) {
+ throw new Error("CrossChainAdapterL1 address not found in deployment_checkpoint_sepolia.json");
+ }
+
+ console.log(`CrossChainAdapterL1 fetched for address: ${crossChainAdapterL1Address}`);
+
+ // Get the CrossChainAdapterL1 contract instance
+ const CrossChainAdapterL1 = await ethers.getContractAt("CrossChainAdapterL1", crossChainAdapterL1Address);
+
+ try {
+ // Check the current crosschainBridge address
+ const crossChainBridge = await CrossChainAdapterL1.getCrosschainBridge();
+ console.log(`CrossChainBridge is set to: ${crossChainBridge}`);
+ } catch (error) {
+ console.error("Error fetching crosschainBridge:", error);
+ return;
+ }
+
+ // const ownerAddress = await CrossChainAdapterL1.owner();
+ // if (ownerAddress.toLowerCase() !== deployer.address.toLowerCase()) {
+ // console.error("You are not the owner");
+ // }
+
+
+ // try {
+ // const transactionStorage = await CrossChainAdapterL1.transactionStorage();
+ // console.log(`TransactionStorage is set to: ${transactionStorage}`);
+ // } catch (error) {
+ // console.error("Error fetching transactionStorage:", error);
+ // return;
+ // }
+
+ const chainId = 11155111n;
+ const timestamp = BigInt(Math.floor(Date.now() / 1000));
+ const balance = ethers.parseUnits("10", 18);
+ const totalSupply = ethers.parseUnits("1000", 18);
+
+ const payload = ethers.AbiCoder.defaultAbiCoder().encode(
+ ["uint256", "uint256", "uint256"],
+ [timestamp, balance, totalSupply]
+ );
+
+ console.log(payload);
+
+
+ // const params = {
+ // timestamp: BigInt(Math.floor(Date.now() / 1000)),
+ // balance: ethers.parseUnits("10", 18),
+ // totalSupply: ethers.parseUnits("1000", 18)
+ // }
+
+ // const payload = ethers.AbiCoder.defaultAbiCoder().encode(
+ // ["(uint256,uint256,uint256)"],
+ // [Object.values(params)]
+ // );
+
+ /*
+Resolve it from an object and a method signature with parameter names:
+
+ encodedResolverOptions = defaultAbiCoder.encode(
+ ["(bytes path,uint256 deadline,uint256 amountIn,uint256 amountOutMinimum,address inputTokenAddress,address destinationAddress,address targetAddress)"],
+ [resolverOptions]
+ );
+
+ */
+
+ try {
+ // Call the handleCrossChainData function on the CrossChainAdapterL1 contract
+ const tx = await CrossChainAdapterL1.handleCrossChainData(chainId, payload);
+ await tx.wait();
+ console.log(`handleCrossChainData called successfully. Tx hash: ${tx.hash}`);
+ } catch (error) {
+ console.error("Error calling handleCrossChainData:", error);
+ }
+}
+
+// Run the script
+main().catch((error) => {
+ console.error("Error:", error);
+ process.exit(1);
+});
diff --git a/projects/restaking-pool/scripts/upgrades/upgrade-crosschain-adapter-l1.ts b/projects/restaking-pool/scripts/upgrades/upgrade-crosschain-adapter-l1.ts
new file mode 100644
index 00000000..140944de
--- /dev/null
+++ b/projects/restaking-pool/scripts/upgrades/upgrade-crosschain-adapter-l1.ts
@@ -0,0 +1,63 @@
+import { ethers, upgrades, run } from "hardhat";
+import * as fs from 'fs';
+require("dotenv").config();
+
+const CHECKPOINT_FILE = "deployment_checkpoint.json";
+
+async function main() {
+ // Load checkpoint to get the deployed proxy address
+ const checkpoint = loadCheckpoint();
+ const proxyAddress = checkpoint.CrossChainAdapterArbitrumL1;
+
+ if (!proxyAddress) {
+ throw new Error("CrossChainAdapterArbitrumL1 proxy address not found in checkpoint.");
+ }
+
+ const [deployer] = await ethers.getSigners();
+ console.log("Upgrading contract with deployer address:", deployer.address);
+
+ // Get the contract factory for the new implementation
+ const CrossChainAdapterArbitrumL1 = await ethers.getContractFactory("CrossChainAdapterArbitrumL1");
+
+ // Upgrade the proxy to the new implementation
+ console.log(`Upgrading CrossChainAdapterArbitrumL1 at proxy address: ${proxyAddress}...`);
+ const upgraded = await upgrades.upgradeProxy(proxyAddress, CrossChainAdapterArbitrumL1);
+ await upgraded.waitForDeployment();
+
+ // Get the new implementation address
+ const newImplementationAddress = await upgrades.erc1967.getImplementationAddress(proxyAddress);
+ console.log("New implementation deployed at:", newImplementationAddress);
+
+ // Verifying on Etherscan
+ await verifyContract(newImplementationAddress);
+
+ console.log("Upgrade and verification complete.");
+}
+
+// Verify the implementation on Etherscan
+async function verifyContract(implementationAddress: string) {
+ console.log("Verifying contract on Etherscan...");
+
+ try {
+ await run("verify:verify", {
+ address: implementationAddress,
+ constructorArguments: [],
+ });
+ console.log("Contract verified successfully!");
+ } catch (error: any) {
+ console.error("Error verifying contract:", error.message);
+ }
+}
+
+// Load deployment checkpoint function
+function loadCheckpoint(): any {
+ if (fs.existsSync(CHECKPOINT_FILE)) {
+ return JSON.parse(fs.readFileSync(CHECKPOINT_FILE, 'utf8'));
+ }
+ return {};
+}
+
+main().catch((error) => {
+ console.error("Error in execution:", error);
+ process.exitCode = 1;
+});
diff --git a/projects/restaking-pool/test/ProtocolConfig.spec.ts b/projects/restaking-pool/test/ProtocolConfig.spec.ts
index 81bb7f52..5f787025 100644
--- a/projects/restaking-pool/test/ProtocolConfig.spec.ts
+++ b/projects/restaking-pool/test/ProtocolConfig.spec.ts
@@ -11,8 +11,6 @@ let governance: HardhatEthersSigner,
signer2: HardhatEthersSigner;
const init = async () => {
- [governance, operator, treasury, signer1, signer2] = await ethers.getSigners();
-
const config = await upgrades.deployProxy(
await ethers.getContractFactory("ProtocolConfig"),
[governance.address, operator.address, treasury.address],
@@ -26,177 +24,79 @@ const init = async () => {
describe("ProtocolConfig", function () {
let config: Contract;
- describe("Operator", function () {
- before(async function () {
- [config] = await helpers.loadFixture(init);
- });
-
- it("getOperator()", async () => {
- expect(await config.getOperator()).to.be.eq(operator.address);
- });
-
- it("setOperator()", async function () {
- await expect(config.setOperator(signer1.address))
- .to.emit(config, "OperatorChanged")
- .withArgs(operator.address, signer1.address);
-
- expect(await config.getOperator()).to.be.eq(signer1.address);
- });
-
- it("setOperator(): only governance can", async function () {
- await expect(config.connect(signer1).setOperator(signer2.address)).to.be.revertedWithCustomError(
- config,
- "OnlyGovernanceAllowed",
- );
- });
-
- it("setOperator(): reverts: when change to zero address", async function () {
- await expect(config.setOperator(ethers.ZeroAddress)).to.be.revertedWithCustomError(config, "ZeroAddress");
- });
+ before(async function () {
+ [governance, operator, treasury, signer1, signer2] = await ethers.getSigners();
});
- describe("Governance", function () {
- before(async function () {
- [config] = await helpers.loadFixture(init);
- });
-
- it("getGovernance()", async function () {
- expect(await config.getGovernance()).to.be.eq(governance.address);
- });
-
- it("setGovernance(): only governance can", async function () {
- await expect(config.connect(signer1).setGovernance(signer1.address)).to.be.revertedWithCustomError(
- config,
- "OnlyGovernanceAllowed",
- );
- });
-
- it("setGovernance(): reverts: when change to zero address", async function () {
- await expect(config.setGovernance(ethers.ZeroAddress)).to.be.revertedWithCustomError(config, "ZeroAddress");
- });
-
- it("setGovernance()", async function () {
- await expect(config.setGovernance(signer1.address))
- .to.emit(config, "GovernanceChanged")
- .withArgs(governance.address, signer1.address);
-
- expect(await config.getGovernance()).to.be.eq(signer1.address);
- });
+ beforeEach(async function () {
+ [config] = await helpers.loadFixture(init);
});
- describe("RatioFeed", function () {
- before(async function () {
- [config] = await helpers.loadFixture(init);
- });
-
- it("getRatioFeed()", async function () {
- expect(await config.getRatioFeed()).to.be.eq(ethers.ZeroAddress);
- });
-
- it("setRatioFeed(): only governance can", async function () {
- await expect(config.connect(signer1).setRatioFeed(signer2.address)).to.be.revertedWithCustomError(
+ const setters = [
+ {
+ name: "operator",
+ setter: "setOperator",
+ getter: "getOperator",
+ event: "OperatorChanged",
+ },
+ {
+ name: "governance",
+ setter: "setGovernance",
+ getter: "getGovernance",
+ event: "GovernanceChanged",
+ },
+ {
+ name: "ratio feed",
+ setter: "setRatioFeed",
+ getter: "getRatioFeed",
+ event: "RatioFeedChanged",
+ },
+ {
+ name: "treasury",
+ setter: "setTreasury",
+ getter: "getTreasury",
+ event: "TreasuryChanged",
+ },
+ {
+ name: "restaking pool",
+ setter: "setRestakingPool",
+ getter: "getRestakingPool",
+ event: "RestakingPoolChanged",
+ },
+ {
+ name: "cToken",
+ setter: "setCToken",
+ getter: "getCToken",
+ event: "CTokenChanged",
+ },
+ {
+ name: "rebalancer",
+ setter: "setRebalancer",
+ getter: "getRebalancer",
+ event: "RebalancerChanged",
+ },
+ ];
+
+ setters.forEach(function (arg) {
+ it(`${arg.name}: set new`, async function () {
+ const prevValue = await config[arg.getter]();
+ const newValue = ethers.Wallet.createRandom().address;
+ await expect(config[arg.setter](newValue)).to.emit(config, arg.event).withArgs(prevValue, newValue);
+
+ expect(await config[arg.getter]()).to.be.eq(newValue);
+ });
+
+ it(`${arg.setter} reverts when called by not a governance`, async function () {
+ const newValue = ethers.Wallet.createRandom().address;
+ await expect(config.connect(signer1)[arg.setter](newValue)).to.be.revertedWithCustomError(
config,
"OnlyGovernanceAllowed",
);
});
- it("setRatioFeed(): reverts: when change to zero address", async function () {
- await expect(config.setRatioFeed(ethers.ZeroAddress)).to.be.revertedWithCustomError(config, "ZeroAddress");
- });
-
- it("setRatioFeed()", async function () {
- await expect(config.setRatioFeed(signer1.address))
- .to.emit(config, "RatioFeedChanged")
- .withArgs(ethers.ZeroAddress, signer1.address);
-
- expect(await config.getRatioFeed()).to.be.eq(signer1.address);
- });
- });
-
- describe("Treasury", function () {
- before(async function () {
- [config] = await helpers.loadFixture(init);
- });
-
- it("getTreasury()", async function () {
- expect(await config.getTreasury()).to.be.eq(treasury.address);
- });
-
- it("setTreasury(): only governance can", async function () {
- await expect(config.connect(signer1).setTreasury(signer1.address)).to.be.revertedWithCustomError(
- config,
- "OnlyGovernanceAllowed",
- );
- });
-
- it("setTreasury(): reverts: when change to zero address", async function () {
- await expect(config.setTreasury(ethers.ZeroAddress)).to.be.revertedWithCustomError(config, "ZeroAddress");
- });
-
- it("setTreasury()", async function () {
- await expect(config.setTreasury(signer1.address))
- .to.emit(config, "TreasuryChanged")
- .withArgs(treasury.address, signer1.address);
-
- expect(await config.getTreasury()).to.be.eq(signer1.address);
- });
- });
-
- describe("RestakingPool", function () {
- before(async function () {
- [config] = await helpers.loadFixture(init);
- });
-
- it("getRestakingPool()", async function () {
- expect(await config.getRestakingPool()).to.be.eq(ethers.ZeroAddress);
- });
-
- it("setRestakingPool(): only governance can", async function () {
- await expect(config.connect(signer1).setRestakingPool(signer2.address)).to.be.revertedWithCustomError(
- config,
- "OnlyGovernanceAllowed",
- );
- });
-
- it("setRestakingPool(): reverts: when change to zero address", async function () {
- await expect(config.setRestakingPool(ethers.ZeroAddress)).to.be.revertedWithCustomError(config, "ZeroAddress");
- });
-
- it("setRestakingPool()", async function () {
- await expect(config.setRestakingPool(signer1.address))
- .to.emit(config, "RestakingPoolChanged")
- .withArgs(ethers.ZeroAddress, signer1.address);
-
- expect(await config.getRestakingPool()).to.be.eq(signer1.address);
- });
- });
-
- describe("cToken", function () {
- before(async function () {
- [config] = await helpers.loadFixture(init);
- });
-
- it("getCToken()", async function () {
- expect(await config.getCToken()).to.be.eq(ethers.ZeroAddress);
- });
-
- it("setCToken(): only governance can", async function () {
- await expect(config.connect(signer1).setCToken(signer2.address)).to.be.revertedWithCustomError(
- config,
- "OnlyGovernanceAllowed",
- );
- });
-
- it("setCToken(): reverts: when change to zero address", async function () {
- await expect(config.setCToken(ethers.ZeroAddress)).to.be.revertedWithCustomError(config, "ZeroAddress");
- });
-
- it("setCToken()", async function () {
- await expect(config.setCToken(signer1.address))
- .to.emit(config, "CTokenChanged")
- .withArgs(ethers.ZeroAddress, signer1.address);
-
- expect(await config.getCToken()).to.be.eq(signer1.address);
+ it(`${arg.setter} reverts new value is 0 address`, async function () {
+ const newValue = ethers.ZeroAddress;
+ await expect(config[arg.setter](newValue)).to.be.revertedWithCustomError(config, "ZeroAddress");
});
});
});
diff --git a/projects/restaking-pool/test/RatioFeed.spec.ts b/projects/restaking-pool/test/RatioFeed.spec.ts
index 4919ca56..ba667104 100644
--- a/projects/restaking-pool/test/RatioFeed.spec.ts
+++ b/projects/restaking-pool/test/RatioFeed.spec.ts
@@ -3,7 +3,7 @@ import { deployConfig, deployRatioFeed } from "./helpers/deploy";
import { ProtocolConfig, RatioFeed } from "../typechain-types";
import { _1E18 } from "./helpers/constants";
import { increaseChainTimeForSeconds } from "./helpers/evmutils";
-import { randomBN, randomBNbyMax } from "./helpers/math";
+import { randomBI, randomBIbyMax } from "./helpers/math";
import { HardhatEthersSigner, SignerWithAddress } from "@nomicfoundation/hardhat-ethers/signers";
const { ethers, network, upgrades } = require("hardhat");
@@ -38,7 +38,7 @@ describe("RatioFeed", function () {
it("Changes threshold value", async function () {
const oldThreshold = await ratioFeed.ratioThreshold();
- const newThreshold = randomBN(7);
+ const newThreshold = randomBI(7);
await expect(ratioFeed.setRatioThreshold(newThreshold))
.to.emit(ratioFeed, "RatioThresholdChanged")
@@ -49,7 +49,7 @@ describe("RatioFeed", function () {
it("Changes threshold one more time", async function () {
const oldThreshold = await ratioFeed.ratioThreshold();
- const newThreshold = randomBN(7);
+ const newThreshold = randomBI(7);
await expect(ratioFeed.setRatioThreshold(newThreshold))
.to.emit(ratioFeed, "RatioThresholdChanged")
.withArgs(oldThreshold, newThreshold);
@@ -58,7 +58,7 @@ describe("RatioFeed", function () {
});
it("Reverts: only governance can modify", async function () {
- const newThreshold = randomBN(7);
+ const newThreshold = randomBI(7);
await expect(ratioFeed.connect(signer1).setRatioThreshold(newThreshold)).to.be.revertedWithCustomError(
ratioFeed,
"OnlyGovernanceAllowed",
@@ -86,7 +86,7 @@ describe("RatioFeed", function () {
});
it("Set threshold value", async function () {
- await ratioFeed.setRatioThreshold(randomBN(7));
+ await ratioFeed.setRatioThreshold(randomBI(7));
});
it("Publish ratio for the first time", async function () {
@@ -103,7 +103,7 @@ describe("RatioFeed", function () {
await increaseChainTimeForSeconds(60 * 60 * 12 + 1); //+12h
const ratioBefore = await ratioFeed.getRatio(token1.address);
const threshold = (ratioBefore * (await ratioFeed.ratioThreshold())) / (await ratioFeed.MAX_THRESHOLD());
- const newRatio = ratioBefore - randomBNbyMax(threshold);
+ const newRatio = ratioBefore - randomBIbyMax(threshold);
await expect(ratioFeed.connect(operator).updateRatio(token1.address, newRatio))
.to.emit(ratioFeed, "RatioUpdated")
.withArgs(token1.address, ratioBefore, newRatio);
@@ -172,7 +172,7 @@ describe("RatioFeed", function () {
it("Decrease ratio", async function () {
const ratioBefore = await ratioFeed.getRatio(token1.address);
console.log(`Ratio before: ${ratioBefore}`);
- const newRatio = randomBN(18);
+ const newRatio = randomBI(18);
await expect(ratioFeed.repairRatio(token1.address, newRatio))
.to.emit(ratioFeed, "RatioUpdated")
@@ -202,7 +202,7 @@ describe("RatioFeed", function () {
});
it("Reverts: only governance can", async function () {
- await expect(ratioFeed.connect(signer1).repairRatio(token1.address, randomBN(18))).to.be.revertedWithCustomError(
+ await expect(ratioFeed.connect(signer1).repairRatio(token1.address, randomBI(18))).to.be.revertedWithCustomError(
ratioFeed,
"OnlyGovernanceAllowed",
);
diff --git a/projects/restaking-pool/test/RestakingPool.spec.ts b/projects/restaking-pool/test/RestakingPool.spec.ts
index 6900cfa6..a8a462ec 100644
--- a/projects/restaking-pool/test/RestakingPool.spec.ts
+++ b/projects/restaking-pool/test/RestakingPool.spec.ts
@@ -5,7 +5,7 @@ import { deployConfig, deployEigenMocks, deployLiquidRestaking, deployRestakerCo
import { CToken, ExpensiveStakerMock, ProtocolConfig, RatioFeed, RestakerDeployer, RestakingPool } from "../typechain-types";
import { HardhatEthersSigner } from "@nomicfoundation/hardhat-ethers/signers";
import { _1E18, dataRoot, pubkeys, signature } from "./helpers/constants";
-import { calcRatio, divideAndCeil, randomBN, randomBNbyMax, toWei } from "./helpers/math";
+import { calcRatio, divideAndCeil, randomBI, randomBIbyMax, toWei } from "./helpers/math";
import { increaseChainTimeForSeconds } from "./helpers/evmutils";
import { SnapshotRestorer } from "@nomicfoundation/hardhat-network-helpers/src/helpers/takeSnapshot";
@@ -104,9 +104,9 @@ describe("RestakingPool", function () {
toWei(0.05),
toWei(0.025),
toWei(0.0125),
- randomBN(16),
- randomBN(14),
- randomBN(12),
+ randomBI(16),
+ randomBI(14),
+ randomBI(12),
];
ratios.forEach(function (ratio) {
@@ -139,7 +139,7 @@ describe("RestakingPool", function () {
it("setTargetFlashCapacity(): only governance can", async function () {
const prevValue = await pool.targetCapacity();
- const newValue = randomBN(18);
+ const newValue = randomBI(18);
await expect(pool.connect(governance).setTargetFlashCapacity(newValue))
.to.emit(pool, "TargetCapacityChanged")
.withArgs(prevValue, newValue);
@@ -147,13 +147,13 @@ describe("RestakingPool", function () {
});
it("setTargetFlashCapacity(): reverts when caller is not an owner", async function () {
- const newValue = randomBN(18);
+ const newValue = randomBI(18);
await expect(pool.connect(signer1).setTargetFlashCapacity(newValue)).to.be.revertedWithCustomError(pool, "OnlyGovernanceAllowed");
});
it("setProtocolFee(): sets share of flashWithdrawFee that goes to treasury", async function () {
const prevValue = await pool.protocolFee();
- const newValue = randomBN(10);
+ const newValue = randomBI(10);
await expect(pool.setProtocolFee(newValue)).to.emit(pool, "ProtocolFeeChanged").withArgs(prevValue, newValue);
expect(await pool.protocolFee()).to.be.eq(newValue);
});
@@ -164,7 +164,7 @@ describe("RestakingPool", function () {
});
it("setProtocolFee(): reverts when caller is not an owner", async function () {
- const newValue = randomBN(10);
+ const newValue = randomBI(10);
await expect(pool.connect(signer1).setProtocolFee(newValue))
.to.be.revertedWithCustomError(pool, "OnlyGovernanceAllowed");
});
@@ -207,7 +207,7 @@ describe("RestakingPool", function () {
});
const amounts = [
- { name: "Random value", amount: async (x) => randomBN(19) },
+ { name: "Random value", amount: async (x) => randomBI(19) },
{
name: "999999999999999999",
amount: async (x) => 999999999999999999n,
@@ -332,11 +332,11 @@ describe("RestakingPool", function () {
const iterations = 50;
await pool.setMaxTVL(BigInt(iterations) * 10n * _1E18);
for (let i = 0; i < iterations; i++) {
- ratio = (await cToken.ratio()) - randomBN(15);
+ ratio = (await cToken.ratio()) - randomBI(15);
await updateRatio(feed, cToken, ratio);
for (const signer of signers) {
- const amount = randomBNbyMax(10n ** 18n - MIN_STAKE + MIN_UNSTAKE);
+ const amount = randomBIbyMax(10n ** 18n - MIN_STAKE + MIN_UNSTAKE);
expectedPoolBalance = expectedPoolBalance + amount;
await pool.connect(signer)["stake()"]({ value: amount });
const shares = (amount * ratio) / _1E18;
@@ -573,12 +573,12 @@ describe("RestakingPool", function () {
{
name: "for the first time",
flashCapacity: (targetCapacity) => 0n,
- amount: (targetCapacity) => randomBNbyMax(targetCapacity / 4n) + targetCapacity / 4n,
+ amount: (targetCapacity) => randomBIbyMax(targetCapacity / 4n) + targetCapacity / 4n,
},
{
name: "more",
flashCapacity: (targetCapacity) => targetCapacity / 3n,
- amount: (targetCapacity) => randomBNbyMax(targetCapacity / 3n),
+ amount: (targetCapacity) => randomBIbyMax(targetCapacity / 3n),
},
{
name: "up to target cap",
@@ -598,7 +598,7 @@ describe("RestakingPool", function () {
{
name: "above target cap",
flashCapacity: (targetCapacity) => targetCapacity,
- amount: (targetCapacity) => randomBN(19),
+ amount: (targetCapacity) => randomBI(19),
},
];
@@ -696,7 +696,7 @@ describe("RestakingPool", function () {
const amounts = [
{
name: "Random value to another address",
- shares: async () => randomBN(19),
+ shares: async () => randomBI(19),
receiver: () => signer2,
},
{
@@ -1032,7 +1032,7 @@ describe("RestakingPool", function () {
it("calculateFlashWithdrawFee reverts when capacity is not sufficient", async function () {
await snapshot.restore();
- await pool.connect(signer1)["stake()"]({ value: randomBN(19) });
+ await pool.connect(signer1)["stake()"]({ value: randomBI(19) });
const capacity = await pool.getFlashCapacity();
await expect(pool.calculateFlashUnstakeFee(capacity + 1n))
.to.be.revertedWithCustomError(pool, "InsufficientCapacity")
@@ -1303,13 +1303,13 @@ describe("RestakingPool", function () {
it(`unstake from contract (${i}/${difficult})`, async () => {
const signer = signers[signerIndex]();
- const stakeAmount = randomBN(18);
+ const stakeAmount = randomBI(18);
console.log(`Stake amount: ${stakeAmount}`);
await pool.connect(signer)["stake()"]({ value: stakeAmount });
/// get tokens amount and unstake a bit less
const sharesAmount = await cToken.balanceOf(signer.address);
console.log(`Shares amount: ${sharesAmount}`);
- await updateRatio(feed, cToken, (await cToken.ratio()) - randomBN(15));
+ await updateRatio(feed, cToken, (await cToken.ratio()) - randomBI(15));
await pool.connect(signer).unstake(signer, sharesAmount);
});
diff --git a/projects/restaking-pool/test/cToken.spec.ts b/projects/restaking-pool/test/cToken.spec.ts
index d6330966..e772bd92 100644
--- a/projects/restaking-pool/test/cToken.spec.ts
+++ b/projects/restaking-pool/test/cToken.spec.ts
@@ -1,43 +1,111 @@
import { HardhatEthersSigner } from "@nomicfoundation/hardhat-ethers/signers";
import { ethers } from "hardhat";
+import { takeSnapshot } from "@nomicfoundation/hardhat-network-helpers";
+import { SnapshotRestorer } from "@nomicfoundation/hardhat-network-helpers/src/helpers/takeSnapshot";
import { deployConfig, deployCToken } from "./helpers/deploy";
import { expect } from "chai";
-import { CToken } from "../typechain-types";
+import { CToken, ProtocolConfig } from "../typechain-types";
+import { randomBI } from "./helpers/math";
describe("cToken", function () {
let cToken: CToken;
+ let protocolConfig: ProtocolConfig;
let initialName = "initialName";
let initialSymbol = "InitSYMBOL";
let governance: HardhatEthersSigner, operator: HardhatEthersSigner, treasury: HardhatEthersSigner;
+ let pool: HardhatEthersSigner, rebalancer: HardhatEthersSigner, signer: HardhatEthersSigner;
+ let snapshot: SnapshotRestorer;
+ before(async function () {
+ [governance, operator, treasury, pool, rebalancer, signer] = await ethers.getSigners();
- beforeEach(async function () {
- [governance, operator, treasury] = await ethers.getSigners();
-
- const protocolConfig = await deployConfig([governance, operator, treasury]);
+ protocolConfig = await deployConfig([governance, operator, treasury]);
cToken = await deployCToken(protocolConfig, initialName, initialSymbol);
- });
+ await protocolConfig.connect(governance).setRestakingPool(pool.address);
+ await protocolConfig.connect(governance).setRebalancer(rebalancer.address);
- it("should change symbol", async function () {
- const newSymbol = "NEWSYM";
- await expect(cToken.connect(governance).changeSymbol(newSymbol))
- .to.emit(cToken, "SymbolChanged")
- .withArgs(newSymbol);
- expect(await cToken.symbol()).to.equal(newSymbol);
+ snapshot = await takeSnapshot();
});
- it("should change name", async function () {
- const newName = "NewName";
- await expect(cToken.connect(governance).changeName(newName)).to.emit(cToken, "NameChanged").withArgs(newName);
- expect(await cToken.name()).to.equal(newName);
+ describe("Setters", function () {
+ before(async function () {
+ await snapshot.restore();
+ });
+
+ it("should return correct name", async function () {
+ expect(await cToken.name()).to.equal(initialName);
+ });
+
+ it("should return correct symbol", async function () {
+ expect(await cToken.symbol()).to.equal(initialSymbol);
+ });
+
+ it("should change symbol", async function () {
+ const newSymbol = "NEWSYM";
+ await expect(cToken.connect(governance).changeSymbol(newSymbol))
+ .to.emit(cToken, "SymbolChanged")
+ .withArgs(newSymbol);
+ expect(await cToken.symbol()).to.equal(newSymbol);
+ });
+
+ it("should change name", async function () {
+ const newName = "NewName";
+ await expect(cToken.connect(governance).changeName(newName)).to.emit(cToken, "NameChanged").withArgs(newName);
+ expect(await cToken.name()).to.equal(newName);
+ });
});
- it("should return correct name", async function () {
- expect(await cToken.name()).to.equal(initialName);
+ describe("Mint", function () {
+ before(async function () {
+ await snapshot.restore();
+ });
+
+ it("mint restaking pool can", async function () {
+ const amount = randomBI(18);
+ const tx = await cToken.connect(pool).mint(signer.address, amount);
+ await expect(tx).changeTokenBalance(cToken, signer, amount);
+ });
+
+ it("mint rebalancer can", async function () {
+ const amount = randomBI(18);
+ const tx = await cToken.connect(rebalancer).mint(signer.address, amount);
+ await expect(tx).changeTokenBalance(cToken, signer, amount);
+ });
+
+ it("mint reverts when called not by pool or rebalancer", async function () {
+ const amount = randomBI(18);
+ await expect(cToken.connect(signer).mint(signer.address, amount)).to.be.revertedWithCustomError(
+ cToken,
+ "OnlyMinterAllowed",
+ );
+ });
});
- it("should return correct symbol", async function () {
- expect(await cToken.symbol()).to.equal(initialSymbol);
+ describe("Burn", function () {
+ before(async function () {
+ await snapshot.restore();
+ await cToken.connect(pool).mint(signer.address, randomBI(18));
+ });
+
+ it("burn restaking pool can", async function () {
+ const amount = randomBI(16);
+ const tx = await cToken.connect(pool).burn(signer.address, amount);
+ await expect(tx).changeTokenBalance(cToken, signer, -amount);
+ });
+
+ it("burn rebalancer can", async function () {
+ const amount = randomBI(16);
+ const tx = await cToken.connect(rebalancer).burn(signer.address, amount);
+ await expect(tx).changeTokenBalance(cToken, signer, -amount);
+ });
+
+ it("burn reverts when called not by pool or rebalancer", async function () {
+ const amount = randomBI(16);
+ await expect(cToken.connect(signer).burn(signer.address, amount)).to.be.revertedWithCustomError(
+ cToken,
+ "OnlyMinterAllowed",
+ );
+ });
});
});
diff --git a/projects/restaking-pool/test/helpers/constants.ts b/projects/restaking-pool/test/helpers/constants.ts
index d8a5d46b..dba34e59 100644
--- a/projects/restaking-pool/test/helpers/constants.ts
+++ b/projects/restaking-pool/test/helpers/constants.ts
@@ -1,4 +1,7 @@
export const _1E18 = 10n ** 18n;
+
+export const e18 = 10n ** 18n;
+
export const pubkeys = [
"0xb8ed0276c4c631f3901bafa668916720f2606f58e0befab541f0cf9e0ec67a8066577e9a01ce58d4e47fba56c516f25b",
"0xb8ed0276c4c631f3901bafa668916720f2606f58e0befab541f0cf9e0ec67a8066577e9a01ce58d4e47fba56c516f25a",
diff --git a/projects/restaking-pool/test/helpers/math.ts b/projects/restaking-pool/test/helpers/math.ts
index 0449f2bd..c06ea0a6 100644
--- a/projects/restaking-pool/test/helpers/math.ts
+++ b/projects/restaking-pool/test/helpers/math.ts
@@ -2,7 +2,7 @@ import { ethers } from "ethers";
import { CToken, RestakingPool } from "../../typechain-types";
import { _1E18 } from "./constants";
-export function randomBN(length: number): bigint {
+export function randomBI(length: number): bigint {
if (length > 0) {
let randomNum = "";
randomNum += Math.floor(Math.random() * 9) + 1; // generates a random digit 1-9
@@ -15,7 +15,7 @@ export function randomBN(length: number): bigint {
}
}
-export function randomBNbyMax(max: bigint) {
+export function randomBIbyMax(max: bigint): bigint {
const maxRandom = 1000_000_000_000n;
if (max > 0) {
const r = BigInt(Math.floor(Math.random() * Number(maxRandom)));
diff --git a/projects/restaking-pool/yarn.lock b/projects/restaking-pool/yarn.lock
index ca33703f..a0904e3a 100644
--- a/projects/restaking-pool/yarn.lock
+++ b/projects/restaking-pool/yarn.lock
@@ -462,6 +462,20 @@
"@jridgewell/resolve-uri" "^3.0.3"
"@jridgewell/sourcemap-codec" "^1.4.10"
+"@layerzerolabs/lz-v2-utilities@^3.0.15":
+ version "3.0.15"
+ resolved "https://registry.yarnpkg.com/@layerzerolabs/lz-v2-utilities/-/lz-v2-utilities-3.0.15.tgz#e6fd32e00b9075591753f1164d6692851cd0a010"
+ integrity sha512-WP2VJXfXuE2tAsEliBEGLjeMHXeMxaoG7nIZxgMRExRultOSdExNh+GKIamXMTwFO4LP1nH/dVCKMfxrNxpUwQ==
+ dependencies:
+ "@ethersproject/abi" "^5.7.0"
+ "@ethersproject/address" "^5.7.0"
+ "@ethersproject/bignumber" "^5.7.0"
+ "@ethersproject/bytes" "^5.7.0"
+ "@ethersproject/keccak256" "^5.7.0"
+ "@ethersproject/solidity" "^5.7.0"
+ bs58 "^5.0.0"
+ tiny-invariant "^1.3.1"
+
"@metamask/eth-sig-util@^4.0.0":
version "4.0.1"
resolved "https://registry.yarnpkg.com/@metamask/eth-sig-util/-/eth-sig-util-4.0.1.tgz#3ad61f6ea9ad73ba5b19db780d40d9aae5157088"
@@ -692,10 +706,10 @@
resolved "https://registry.yarnpkg.com/@nomicfoundation/hardhat-toolbox/-/hardhat-toolbox-4.0.0.tgz#eb1f619218dd1414fa161dfec92d3e5e53a2f407"
integrity sha512-jhcWHp0aHaL0aDYj8IJl80v4SZXWMS1A2XxXa1CA6pBiFfJKuZinCkO6wb+POAt0LIfXB3gA3AgdcOccrcwBwA==
-"@nomicfoundation/hardhat-verify@^2.0.5":
- version "2.0.5"
- resolved "https://registry.yarnpkg.com/@nomicfoundation/hardhat-verify/-/hardhat-verify-2.0.5.tgz#dcc2cb5e5c55a39704c7d492436f80f05a4ca5a3"
- integrity sha512-Tg4zu8RkWpyADSFIgF4FlJIUEI4VkxcvELsmbJn2OokbvH2SnUrqKmw0BBfDrtvP0hhmx8wsnrRKP5DV/oTyTA==
+"@nomicfoundation/hardhat-verify@^2.0.11":
+ version "2.0.11"
+ resolved "http://localhost:4873/@nomicfoundation/hardhat-verify/-/hardhat-verify-2.0.11.tgz#4ce12b592e01ee93a81933924609c233ed00d951"
+ integrity sha512-lGIo4dNjVQFdsiEgZp3KP6ntLiF7xJEJsbNHfSyIiFCyI0Yv0518ElsFtMC5uCuHEChiBBMrib9jWQvHHT+X3Q==
dependencies:
"@ethersproject/abi" "^5.1.2"
"@ethersproject/address" "^5.0.2"
@@ -988,12 +1002,10 @@
dependencies:
antlr4ts "^0.5.0-alpha.4"
-"@solidity-parser/parser@^0.16.0":
- version "0.16.1"
- resolved "https://registry.yarnpkg.com/@solidity-parser/parser/-/parser-0.16.1.tgz#f7c8a686974e1536da0105466c4db6727311253c"
- integrity sha512-PdhRFNhbTtu3x8Axm0uYpqOy/lODYQK+MlYSgqIsq2L8SFYEHJPHNUiOTAJbDGzNjjr1/n9AcIayxafR/fWmYw==
- dependencies:
- antlr4ts "^0.5.0-alpha.4"
+"@solidity-parser/parser@^0.18.0":
+ version "0.18.0"
+ resolved "https://registry.yarnpkg.com/@solidity-parser/parser/-/parser-0.18.0.tgz#8e77a02a09ecce957255a2f48c9a7178ec191908"
+ integrity sha512-yfORGUIPgLck41qyN7nbwJRAx17/jAIXCTanHOJZhB6PJ1iAk/84b/xlsVKFSyNyLXIj0dhppoE0+CRws7wlzA==
"@tsconfig/node10@^1.0.7":
version "1.0.9"
@@ -1190,11 +1202,6 @@ acorn@^8.4.1:
resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.10.0.tgz#8be5b3907a67221a81ab23c7889c4c5526b62ec5"
integrity sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==
-address@^1.0.1:
- version "1.2.2"
- resolved "https://registry.yarnpkg.com/address/-/address-1.2.2.tgz#2b5248dac5485a6390532c6a517fda2e3faac89e"
- integrity sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==
-
adm-zip@^0.4.16:
version "0.4.16"
resolved "https://registry.yarnpkg.com/adm-zip/-/adm-zip-0.4.16.tgz#cf4c508fdffab02c269cbc7f471a875f05570365"
@@ -1464,6 +1471,11 @@ base-x@^3.0.2:
dependencies:
safe-buffer "^5.0.1"
+base-x@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/base-x/-/base-x-4.0.0.tgz#d0e3b7753450c73f8ad2389b5c018a4af7b2224a"
+ integrity sha512-FuwxlW4H5kh37X/oW59pwTzzTKRzfrrQwhmyspRM7swOEZcHtDZSCt45U6oKgtuFE+WYPblePMVIPR4RZrh/hw==
+
base64-js@^1.0.2, base64-js@^1.3.1:
version "1.5.1"
resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a"
@@ -1565,6 +1577,13 @@ bs58@^4.0.0:
dependencies:
base-x "^3.0.2"
+bs58@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/bs58/-/bs58-5.0.0.tgz#865575b4d13c09ea2a84622df6c8cbeb54ffc279"
+ integrity sha512-r+ihvQJvahgYT50JD05dyJNKlmmSlMoOGwn1lCcEzanPglg7TxYjioQUYehQ9mAR/+hOSd2jRc/Z2y5UxBymvQ==
+ dependencies:
+ base-x "^4.0.0"
+
bs58check@^2.1.2:
version "2.1.2"
resolved "https://registry.yarnpkg.com/bs58check/-/bs58check-2.1.2.tgz#53b018291228d82a5aa08e7d796fdafda54aebfc"
@@ -1956,14 +1975,6 @@ depd@2.0.0:
resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df"
integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==
-detect-port@^1.3.0:
- version "1.5.1"
- resolved "https://registry.yarnpkg.com/detect-port/-/detect-port-1.5.1.tgz#451ca9b6eaf20451acb0799b8ab40dff7718727b"
- integrity sha512-aBzdj76lueB6uUst5iAs7+0H/oOjqI5D16XUWxlWMIMROhcM0rfsNVk93zTngq1dDNpoXRr++Sus7ETAExppAQ==
- dependencies:
- address "^1.0.1"
- debug "4"
-
diff@5.0.0:
version "5.0.0"
resolved "https://registry.yarnpkg.com/diff/-/diff-5.0.0.tgz#7ed6ad76d859d030787ec35855f5b1daf31d852b"
@@ -3458,7 +3469,7 @@ mnemonist@^0.38.0:
dependencies:
obliterator "^2.0.0"
-mocha@10.2.0, mocha@^10.0.0, mocha@^10.2.0:
+mocha@^10.0.0, mocha@^10.2.0:
version "10.2.0"
resolved "https://registry.yarnpkg.com/mocha/-/mocha-10.2.0.tgz#1fd4a7c32ba5ac372e03a17eef435bd00e5c68b8"
integrity sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==
@@ -3610,6 +3621,16 @@ once@1.x, once@^1.3.0:
dependencies:
wrappy "1"
+"openzeppelin-4-upgradeable@npm:@openzeppelin/contracts-upgradeable@4.5.0":
+ version "4.5.0"
+ resolved "http://localhost:4873/@openzeppelin/contracts-upgradeable/-/contracts-upgradeable-4.5.0.tgz#1aceb1303611e3b8e416e031bb9f8f211fbbbf8b"
+ integrity sha512-5540xxycH2aDFI3e+5Mqd0GDeozkSKSEaNWoM65l90OYxZxOs9YQMqa+b4fR+363BXXSXoC1DTXut2TuqViwPA==
+
+"openzeppelin-4@npm:@openzeppelin/contracts@4.5.0":
+ version "4.5.0"
+ resolved "http://localhost:4873/@openzeppelin/contracts/-/contracts-4.5.0.tgz#3fd75d57de172b3743cdfc1206883f56430409cc"
+ integrity sha512-fdkzKPYMjrRiPK6K4y64e6GzULR7R7RwxSigHS8DDp7aWDeoReqsQI+cxHV1UuhAqX69L1lAaWDxenfP+xiqzA==
+
optionator@^0.8.1:
version "0.8.3"
resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495"
@@ -4147,24 +4168,23 @@ solidity-ast@^0.4.51:
dependencies:
array.prototype.findlast "^1.2.2"
-solidity-coverage@^0.8.4:
- version "0.8.5"
- resolved "https://registry.yarnpkg.com/solidity-coverage/-/solidity-coverage-0.8.5.tgz#64071c3a0c06a0cecf9a7776c35f49edc961e875"
- integrity sha512-6C6N6OV2O8FQA0FWA95FdzVH+L16HU94iFgg5wAFZ29UpLFkgNI/DRR2HotG1bC0F4gAc/OMs2BJI44Q/DYlKQ==
+solidity-coverage@^0.8.13:
+ version "0.8.13"
+ resolved "https://registry.yarnpkg.com/solidity-coverage/-/solidity-coverage-0.8.13.tgz#8eeada2e82ae19d25568368aa782a2baad0e0ce7"
+ integrity sha512-RiBoI+kF94V3Rv0+iwOj3HQVSqNzA9qm/qDP1ZDXK5IX0Cvho1qiz8hAXTsAo6KOIUeP73jfscq0KlLqVxzGWA==
dependencies:
"@ethersproject/abi" "^5.0.9"
- "@solidity-parser/parser" "^0.16.0"
+ "@solidity-parser/parser" "^0.18.0"
chalk "^2.4.2"
death "^1.1.0"
- detect-port "^1.3.0"
difflib "^0.2.4"
fs-extra "^8.1.0"
ghost-testrpc "^0.0.2"
global-modules "^2.0.0"
globby "^10.0.1"
jsonschema "^1.2.4"
- lodash "^4.17.15"
- mocha "10.2.0"
+ lodash "^4.17.21"
+ mocha "^10.2.0"
node-emoji "^1.10.0"
pify "^4.0.1"
recursive-readdir "^2.2.2"
@@ -4386,6 +4406,11 @@ then-request@^6.0.0:
promise "^8.0.0"
qs "^6.4.0"
+tiny-invariant@^1.3.1:
+ version "1.3.3"
+ resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.3.3.tgz#46680b7a873a0d5d10005995eb90a70d74d60127"
+ integrity sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==
+
tmp@0.0.33:
version "0.0.33"
resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9"
diff --git a/projects/tests/omnivault-rebalancer/.openzeppelin/mainnet.json b/projects/tests/omnivault-rebalancer/.openzeppelin/mainnet.json
new file mode 100644
index 00000000..d61a5029
--- /dev/null
+++ b/projects/tests/omnivault-rebalancer/.openzeppelin/mainnet.json
@@ -0,0 +1,2674 @@
+{
+ "manifestVersion": "3.2",
+ "proxies": [
+ {
+ "address": "0x81b98D3a51d4aC35e0ae132b0CF6b50EA1Da2603",
+ "txHash": "0x7a008a25fb95c832fe239e8d1a10ee9d74ecaf2affaf73054774dbbcb4d62a72",
+ "kind": "transparent"
+ },
+ {
+ "address": "0x122ee24Cb3Cc1b6B987800D3B54A68FC16910Dbf",
+ "txHash": "0x0ac1c64605020314bad3fac678da74c82d46755947c9471d2ff8d7c007df376d",
+ "kind": "transparent"
+ },
+ {
+ "address": "0x7c388e8cbCE59Ce36B38169058F82D8f774088e8",
+ "txHash": "0x0e9165b7ae047bd6efe4b008550ee724cdf0e440a8a27851dd9e819165d4e214",
+ "kind": "transparent"
+ },
+ {
+ "address": "0x46199cAa0e453971cedf97f926368d9E5415831a",
+ "txHash": "0x80a10cc38d11dd8cc7596a3c7da8898d269e3b85970d65f73c71bd22ff3bb558",
+ "kind": "transparent"
+ },
+ {
+ "address": "0xf403eb7B69F6c7Ab73BBaeF42AFE87c0a61a15D0",
+ "txHash": "0x5c822fd38c9205136ba415bf3fc3cb50b9d70fb94686efa7637ed1468fd5f898",
+ "kind": "transparent"
+ },
+ {
+ "address": "0x161Cd8fD2694D220e246854E177B726D8E36971d",
+ "txHash": "0x60ba78e3763d3159fc13122be81de8cb71ed857263dc9b76cfb859e5938649b3",
+ "kind": "transparent"
+ },
+ {
+ "address": "0xf073bAC22DAb7FaF4a3Dd6c6189a70D54110525C",
+ "txHash": "0x4c5a6c2a40840faa0bfffc0f8bb6c1f720f535b8ae6ef0dc271525b9d7601c6f",
+ "kind": "transparent"
+ }
+ ],
+ "impls": {
+ "6edc16d23a4d4f6c1904111ef9dc64f026946ac69ab9161a855c019e045fdfca": {
+ "address": "0xe99AD80f1367ef20e81Ad72134192358670F7bf9",
+ "txHash": "0x00d4f1b91e222db35d943b845b4b02578bd5fcc7897c54506a387bad1b033bbf",
+ "layout": {
+ "solcVersion": "0.8.20",
+ "storage": [],
+ "types": {
+ "t_bool": {
+ "label": "bool",
+ "numberOfBytes": "1"
+ },
+ "t_struct(InitializableStorage)64_storage": {
+ "label": "struct Initializable.InitializableStorage",
+ "members": [
+ {
+ "label": "_initialized",
+ "type": "t_uint64",
+ "offset": 0,
+ "slot": "0"
+ },
+ {
+ "label": "_initializing",
+ "type": "t_bool",
+ "offset": 8,
+ "slot": "0"
+ }
+ ],
+ "numberOfBytes": "32"
+ },
+ "t_uint64": {
+ "label": "uint64",
+ "numberOfBytes": "8"
+ }
+ },
+ "namespaces": {
+ "erc7201:openzeppelin.storage.Initializable": [
+ {
+ "contract": "Initializable",
+ "label": "_initialized",
+ "type": "t_uint64",
+ "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:69",
+ "offset": 0,
+ "slot": "0"
+ },
+ {
+ "contract": "Initializable",
+ "label": "_initializing",
+ "type": "t_bool",
+ "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:73",
+ "offset": 8,
+ "slot": "0"
+ }
+ ]
+ }
+ }
+ },
+ "71d135c444c577e77f23565934e5ef47a051f98194121da673ec1aa67993def6": {
+ "address": "0xB7A63a69cc0e635915e65379D2794f0b687D63EC",
+ "txHash": "0x5cbec22b4fc3f7be6b38d0aa8dcd8f8cfda59c1526b77cf74b0636fb00f50f0c",
+ "layout": {
+ "solcVersion": "0.8.20",
+ "storage": [
+ {
+ "label": "_config",
+ "offset": 0,
+ "slot": "0",
+ "type": "t_contract(IProtocolConfig)8300",
+ "contract": "Configurable",
+ "src": "contracts/Configurable.sol:17"
+ },
+ {
+ "label": "__reserved",
+ "offset": 0,
+ "slot": "1",
+ "type": "t_array(t_uint256)49_storage",
+ "contract": "Configurable",
+ "src": "contracts/Configurable.sol:18"
+ },
+ {
+ "label": "_ratios",
+ "offset": 0,
+ "slot": "50",
+ "type": "t_mapping(t_address,t_uint256)",
+ "contract": "RatioFeed",
+ "src": "contracts/RatioFeed.sol:18"
+ },
+ {
+ "label": "historicalRatios",
+ "offset": 0,
+ "slot": "51",
+ "type": "t_mapping(t_address,t_struct(HistoricalRatios)8315_storage)",
+ "contract": "RatioFeed",
+ "src": "contracts/RatioFeed.sol:19"
+ },
+ {
+ "label": "ratioThreshold",
+ "offset": 0,
+ "slot": "52",
+ "type": "t_uint256",
+ "contract": "RatioFeed",
+ "src": "contracts/RatioFeed.sol:24"
+ },
+ {
+ "label": "_ratioUpdates",
+ "offset": 0,
+ "slot": "53",
+ "type": "t_mapping(t_address,t_uint256)",
+ "contract": "RatioFeed",
+ "src": "contracts/RatioFeed.sol:29"
+ }
+ ],
+ "types": {
+ "t_bool": {
+ "label": "bool",
+ "numberOfBytes": "1"
+ },
+ "t_struct(InitializableStorage)64_storage": {
+ "label": "struct Initializable.InitializableStorage",
+ "members": [
+ {
+ "label": "_initialized",
+ "type": "t_uint64",
+ "offset": 0,
+ "slot": "0"
+ },
+ {
+ "label": "_initializing",
+ "type": "t_bool",
+ "offset": 8,
+ "slot": "0"
+ }
+ ],
+ "numberOfBytes": "32"
+ },
+ "t_uint64": {
+ "label": "uint64",
+ "numberOfBytes": "8"
+ },
+ "t_address": {
+ "label": "address",
+ "numberOfBytes": "20"
+ },
+ "t_array(t_uint256)49_storage": {
+ "label": "uint256[49]",
+ "numberOfBytes": "1568"
+ },
+ "t_array(t_uint64)9_storage": {
+ "label": "uint64[9]",
+ "numberOfBytes": "96"
+ },
+ "t_contract(IProtocolConfig)8300": {
+ "label": "contract IProtocolConfig",
+ "numberOfBytes": "20"
+ },
+ "t_mapping(t_address,t_struct(HistoricalRatios)8315_storage)": {
+ "label": "mapping(address => struct IRatioFeed.HistoricalRatios)",
+ "numberOfBytes": "32"
+ },
+ "t_mapping(t_address,t_uint256)": {
+ "label": "mapping(address => uint256)",
+ "numberOfBytes": "32"
+ },
+ "t_struct(HistoricalRatios)8315_storage": {
+ "label": "struct IRatioFeed.HistoricalRatios",
+ "members": [
+ {
+ "label": "historicalRatios",
+ "type": "t_array(t_uint64)9_storage",
+ "offset": 0,
+ "slot": "0"
+ },
+ {
+ "label": "lastUpdate",
+ "type": "t_uint40",
+ "offset": 0,
+ "slot": "3"
+ }
+ ],
+ "numberOfBytes": "128"
+ },
+ "t_uint256": {
+ "label": "uint256",
+ "numberOfBytes": "32"
+ },
+ "t_uint40": {
+ "label": "uint40",
+ "numberOfBytes": "5"
+ }
+ },
+ "namespaces": {
+ "erc7201:openzeppelin.storage.Initializable": [
+ {
+ "contract": "Initializable",
+ "label": "_initialized",
+ "type": "t_uint64",
+ "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:69",
+ "offset": 0,
+ "slot": "0"
+ },
+ {
+ "contract": "Initializable",
+ "label": "_initializing",
+ "type": "t_bool",
+ "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:73",
+ "offset": 8,
+ "slot": "0"
+ }
+ ]
+ }
+ }
+ },
+ "035ad31b54f24db62a54b465c282779cd6f114940d9cf42674ce8c8e39bc73a3": {
+ "address": "0x59114182500d834b8E41A397314C97EeE96Ee9bD",
+ "txHash": "0x4435750a8d1438a11de8b950c9c4596aafb4937d745ad507f0e1d424edfb2f04",
+ "layout": {
+ "solcVersion": "0.8.20",
+ "storage": [
+ {
+ "label": "_config",
+ "offset": 0,
+ "slot": "0",
+ "type": "t_contract(IProtocolConfig)7970",
+ "contract": "Configurable",
+ "src": "contracts/Configurable.sol:17"
+ },
+ {
+ "label": "__reserved",
+ "offset": 0,
+ "slot": "1",
+ "type": "t_array(t_uint256)49_storage",
+ "contract": "Configurable",
+ "src": "contracts/Configurable.sol:18"
+ },
+ {
+ "label": "__gap",
+ "offset": 0,
+ "slot": "50",
+ "type": "t_array(t_uint256)50_storage",
+ "contract": "cToken",
+ "src": "contracts/cToken.sol:27"
+ }
+ ],
+ "types": {
+ "t_address": {
+ "label": "address",
+ "numberOfBytes": "20"
+ },
+ "t_bool": {
+ "label": "bool",
+ "numberOfBytes": "1"
+ },
+ "t_mapping(t_address,t_mapping(t_address,t_uint256))": {
+ "label": "mapping(address => mapping(address => uint256))",
+ "numberOfBytes": "32"
+ },
+ "t_mapping(t_address,t_uint256)": {
+ "label": "mapping(address => uint256)",
+ "numberOfBytes": "32"
+ },
+ "t_string_storage": {
+ "label": "string",
+ "numberOfBytes": "32"
+ },
+ "t_struct(ERC20Storage)144_storage": {
+ "label": "struct ERC20Upgradeable.ERC20Storage",
+ "members": [
+ {
+ "label": "_balances",
+ "type": "t_mapping(t_address,t_uint256)",
+ "offset": 0,
+ "slot": "0"
+ },
+ {
+ "label": "_allowances",
+ "type": "t_mapping(t_address,t_mapping(t_address,t_uint256))",
+ "offset": 0,
+ "slot": "1"
+ },
+ {
+ "label": "_totalSupply",
+ "type": "t_uint256",
+ "offset": 0,
+ "slot": "2"
+ },
+ {
+ "label": "_name",
+ "type": "t_string_storage",
+ "offset": 0,
+ "slot": "3"
+ },
+ {
+ "label": "_symbol",
+ "type": "t_string_storage",
+ "offset": 0,
+ "slot": "4"
+ }
+ ],
+ "numberOfBytes": "160"
+ },
+ "t_struct(InitializableStorage)64_storage": {
+ "label": "struct Initializable.InitializableStorage",
+ "members": [
+ {
+ "label": "_initialized",
+ "type": "t_uint64",
+ "offset": 0,
+ "slot": "0"
+ },
+ {
+ "label": "_initializing",
+ "type": "t_bool",
+ "offset": 8,
+ "slot": "0"
+ }
+ ],
+ "numberOfBytes": "32"
+ },
+ "t_struct(PausableStorage)259_storage": {
+ "label": "struct PausableUpgradeable.PausableStorage",
+ "members": [
+ {
+ "label": "_paused",
+ "type": "t_bool",
+ "offset": 0,
+ "slot": "0"
+ }
+ ],
+ "numberOfBytes": "32"
+ },
+ "t_uint256": {
+ "label": "uint256",
+ "numberOfBytes": "32"
+ },
+ "t_uint64": {
+ "label": "uint64",
+ "numberOfBytes": "8"
+ },
+ "t_array(t_uint256)49_storage": {
+ "label": "uint256[49]",
+ "numberOfBytes": "1568"
+ },
+ "t_array(t_uint256)50_storage": {
+ "label": "uint256[50]",
+ "numberOfBytes": "1600"
+ },
+ "t_contract(IProtocolConfig)7970": {
+ "label": "contract IProtocolConfig",
+ "numberOfBytes": "20"
+ }
+ },
+ "namespaces": {
+ "erc7201:openzeppelin.storage.Pausable": [
+ {
+ "contract": "PausableUpgradeable",
+ "label": "_paused",
+ "type": "t_bool",
+ "src": "@openzeppelin/contracts-upgradeable/utils/PausableUpgradeable.sol:21",
+ "offset": 0,
+ "slot": "0"
+ }
+ ],
+ "erc7201:openzeppelin.storage.ERC20": [
+ {
+ "contract": "ERC20Upgradeable",
+ "label": "_balances",
+ "type": "t_mapping(t_address,t_uint256)",
+ "src": "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol:38",
+ "offset": 0,
+ "slot": "0"
+ },
+ {
+ "contract": "ERC20Upgradeable",
+ "label": "_allowances",
+ "type": "t_mapping(t_address,t_mapping(t_address,t_uint256))",
+ "src": "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol:40",
+ "offset": 0,
+ "slot": "1"
+ },
+ {
+ "contract": "ERC20Upgradeable",
+ "label": "_totalSupply",
+ "type": "t_uint256",
+ "src": "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol:42",
+ "offset": 0,
+ "slot": "2"
+ },
+ {
+ "contract": "ERC20Upgradeable",
+ "label": "_name",
+ "type": "t_string_storage",
+ "src": "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol:44",
+ "offset": 0,
+ "slot": "3"
+ },
+ {
+ "contract": "ERC20Upgradeable",
+ "label": "_symbol",
+ "type": "t_string_storage",
+ "src": "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol:45",
+ "offset": 0,
+ "slot": "4"
+ }
+ ],
+ "erc7201:openzeppelin.storage.Initializable": [
+ {
+ "contract": "Initializable",
+ "label": "_initialized",
+ "type": "t_uint64",
+ "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:69",
+ "offset": 0,
+ "slot": "0"
+ },
+ {
+ "contract": "Initializable",
+ "label": "_initializing",
+ "type": "t_bool",
+ "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:73",
+ "offset": 8,
+ "slot": "0"
+ }
+ ]
+ }
+ }
+ },
+ "bbeadd90000ed713601ce7de8a74f4d5887975ff1612a56bf8fcd7d37a0b36d3": {
+ "address": "0x043B7dd4979FB34DECA99a131cA69DaC3805fcB7",
+ "txHash": "0x4f2bb7c5442f17117366298647d01f13da111bf50a60857f48eb2907b711bc62",
+ "layout": {
+ "solcVersion": "0.8.20",
+ "storage": [
+ {
+ "label": "_config",
+ "offset": 0,
+ "slot": "0",
+ "type": "t_contract(IProtocolConfig)8298",
+ "contract": "Configurable",
+ "src": "contracts/Configurable.sol:17"
+ },
+ {
+ "label": "__reserved",
+ "offset": 0,
+ "slot": "1",
+ "type": "t_array(t_uint256)49_storage",
+ "contract": "Configurable",
+ "src": "contracts/Configurable.sol:18"
+ },
+ {
+ "label": "_minStakeAmount",
+ "offset": 0,
+ "slot": "50",
+ "type": "t_uint256",
+ "contract": "RestakingPool",
+ "src": "contracts/RestakingPool.sol:31"
+ },
+ {
+ "label": "_minUnstakeAmount",
+ "offset": 0,
+ "slot": "51",
+ "type": "t_uint256",
+ "contract": "RestakingPool",
+ "src": "contracts/RestakingPool.sol:32"
+ },
+ {
+ "label": "_totalStaked",
+ "offset": 0,
+ "slot": "52",
+ "type": "t_uint256",
+ "contract": "RestakingPool",
+ "src": "contracts/RestakingPool.sol:37"
+ },
+ {
+ "label": "_totalUnstaked",
+ "offset": 0,
+ "slot": "53",
+ "type": "t_uint256",
+ "contract": "RestakingPool",
+ "src": "contracts/RestakingPool.sol:41"
+ },
+ {
+ "label": "_pendingGap",
+ "offset": 0,
+ "slot": "54",
+ "type": "t_uint256",
+ "contract": "RestakingPool",
+ "src": "contracts/RestakingPool.sol:46"
+ },
+ {
+ "label": "_pendingUnstakes",
+ "offset": 0,
+ "slot": "55",
+ "type": "t_array(t_struct(Unstake)8356_storage)dyn_storage",
+ "contract": "RestakingPool",
+ "src": "contracts/RestakingPool.sol:50"
+ },
+ {
+ "label": "_totalPendingUnstakes",
+ "offset": 0,
+ "slot": "56",
+ "type": "t_uint256",
+ "contract": "RestakingPool",
+ "src": "contracts/RestakingPool.sol:54"
+ },
+ {
+ "label": "_totalUnstakesOf",
+ "offset": 0,
+ "slot": "57",
+ "type": "t_mapping(t_address,t_uint256)",
+ "contract": "RestakingPool",
+ "src": "contracts/RestakingPool.sol:55"
+ },
+ {
+ "label": "_distributeGasLimit",
+ "offset": 0,
+ "slot": "58",
+ "type": "t_uint32",
+ "contract": "RestakingPool",
+ "src": "contracts/RestakingPool.sol:59"
+ },
+ {
+ "label": "_totalClaimable",
+ "offset": 0,
+ "slot": "59",
+ "type": "t_uint256",
+ "contract": "RestakingPool",
+ "src": "contracts/RestakingPool.sol:61"
+ },
+ {
+ "label": "_claimable",
+ "offset": 0,
+ "slot": "60",
+ "type": "t_mapping(t_address,t_uint256)",
+ "contract": "RestakingPool",
+ "src": "contracts/RestakingPool.sol:62"
+ },
+ {
+ "label": "_restakers",
+ "offset": 0,
+ "slot": "61",
+ "type": "t_mapping(t_bytes32,t_address)",
+ "contract": "RestakingPool",
+ "src": "contracts/RestakingPool.sol:67"
+ },
+ {
+ "label": "_maxTVL",
+ "offset": 0,
+ "slot": "62",
+ "type": "t_uint256",
+ "contract": "RestakingPool",
+ "src": "contracts/RestakingPool.sol:72"
+ },
+ {
+ "label": "__gap",
+ "offset": 0,
+ "slot": "63",
+ "type": "t_array(t_uint256)37_storage",
+ "contract": "RestakingPool",
+ "src": "contracts/RestakingPool.sol:79"
+ }
+ ],
+ "types": {
+ "t_bool": {
+ "label": "bool",
+ "numberOfBytes": "1"
+ },
+ "t_struct(InitializableStorage)64_storage": {
+ "label": "struct Initializable.InitializableStorage",
+ "members": [
+ {
+ "label": "_initialized",
+ "type": "t_uint64",
+ "offset": 0,
+ "slot": "0"
+ },
+ {
+ "label": "_initializing",
+ "type": "t_bool",
+ "offset": 8,
+ "slot": "0"
+ }
+ ],
+ "numberOfBytes": "32"
+ },
+ "t_struct(ReentrancyGuardStorage)320_storage": {
+ "label": "struct ReentrancyGuardUpgradeable.ReentrancyGuardStorage",
+ "members": [
+ {
+ "label": "_status",
+ "type": "t_uint256",
+ "offset": 0,
+ "slot": "0"
+ }
+ ],
+ "numberOfBytes": "32"
+ },
+ "t_uint256": {
+ "label": "uint256",
+ "numberOfBytes": "32"
+ },
+ "t_uint64": {
+ "label": "uint64",
+ "numberOfBytes": "8"
+ },
+ "t_address": {
+ "label": "address",
+ "numberOfBytes": "20"
+ },
+ "t_array(t_struct(Unstake)8356_storage)dyn_storage": {
+ "label": "struct IRestakingPool.Unstake[]",
+ "numberOfBytes": "32"
+ },
+ "t_array(t_uint256)37_storage": {
+ "label": "uint256[37]",
+ "numberOfBytes": "1184"
+ },
+ "t_array(t_uint256)49_storage": {
+ "label": "uint256[49]",
+ "numberOfBytes": "1568"
+ },
+ "t_bytes32": {
+ "label": "bytes32",
+ "numberOfBytes": "32"
+ },
+ "t_contract(IProtocolConfig)8298": {
+ "label": "contract IProtocolConfig",
+ "numberOfBytes": "20"
+ },
+ "t_mapping(t_address,t_uint256)": {
+ "label": "mapping(address => uint256)",
+ "numberOfBytes": "32"
+ },
+ "t_mapping(t_bytes32,t_address)": {
+ "label": "mapping(bytes32 => address)",
+ "numberOfBytes": "32"
+ },
+ "t_struct(Unstake)8356_storage": {
+ "label": "struct IRestakingPool.Unstake",
+ "members": [
+ {
+ "label": "recipient",
+ "type": "t_address",
+ "offset": 0,
+ "slot": "0"
+ },
+ {
+ "label": "amount",
+ "type": "t_uint256",
+ "offset": 0,
+ "slot": "1"
+ }
+ ],
+ "numberOfBytes": "64"
+ },
+ "t_uint32": {
+ "label": "uint32",
+ "numberOfBytes": "4"
+ }
+ },
+ "namespaces": {
+ "erc7201:openzeppelin.storage.ReentrancyGuard": [
+ {
+ "contract": "ReentrancyGuardUpgradeable",
+ "label": "_status",
+ "type": "t_uint256",
+ "src": "@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol:40",
+ "offset": 0,
+ "slot": "0"
+ }
+ ],
+ "erc7201:openzeppelin.storage.Initializable": [
+ {
+ "contract": "Initializable",
+ "label": "_initialized",
+ "type": "t_uint64",
+ "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:69",
+ "offset": 0,
+ "slot": "0"
+ },
+ {
+ "contract": "Initializable",
+ "label": "_initializing",
+ "type": "t_bool",
+ "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:73",
+ "offset": 8,
+ "slot": "0"
+ }
+ ]
+ }
+ }
+ },
+ "65da5c5ed178e80f7b24d95b3c524cc0677e732c08b627f280f4b00904c8753a": {
+ "address": "0xfdfb52865892f97531a9742aade702Ab6e4A3B24",
+ "txHash": "0x5634d6af46667da6ed9df5611a15cf7c5d033b35b6e78cf58af4c91cfadbc850",
+ "layout": {
+ "solcVersion": "0.8.20",
+ "storage": [
+ {
+ "label": "_config",
+ "offset": 0,
+ "slot": "0",
+ "type": "t_contract(IProtocolConfig)8300",
+ "contract": "Configurable",
+ "src": "contracts/Configurable.sol:17"
+ },
+ {
+ "label": "__reserved",
+ "offset": 0,
+ "slot": "1",
+ "type": "t_array(t_uint256)49_storage",
+ "contract": "Configurable",
+ "src": "contracts/Configurable.sol:18"
+ },
+ {
+ "label": "commission",
+ "offset": 0,
+ "slot": "50",
+ "type": "t_uint16",
+ "contract": "FeeCollector",
+ "src": "contracts/FeeCollector.sol:21"
+ }
+ ],
+ "types": {
+ "t_bool": {
+ "label": "bool",
+ "numberOfBytes": "1"
+ },
+ "t_struct(InitializableStorage)64_storage": {
+ "label": "struct Initializable.InitializableStorage",
+ "members": [
+ {
+ "label": "_initialized",
+ "type": "t_uint64",
+ "offset": 0,
+ "slot": "0"
+ },
+ {
+ "label": "_initializing",
+ "type": "t_bool",
+ "offset": 8,
+ "slot": "0"
+ }
+ ],
+ "numberOfBytes": "32"
+ },
+ "t_struct(ReentrancyGuardStorage)320_storage": {
+ "label": "struct ReentrancyGuardUpgradeable.ReentrancyGuardStorage",
+ "members": [
+ {
+ "label": "_status",
+ "type": "t_uint256",
+ "offset": 0,
+ "slot": "0"
+ }
+ ],
+ "numberOfBytes": "32"
+ },
+ "t_uint256": {
+ "label": "uint256",
+ "numberOfBytes": "32"
+ },
+ "t_uint64": {
+ "label": "uint64",
+ "numberOfBytes": "8"
+ },
+ "t_array(t_uint256)49_storage": {
+ "label": "uint256[49]",
+ "numberOfBytes": "1568"
+ },
+ "t_contract(IProtocolConfig)8300": {
+ "label": "contract IProtocolConfig",
+ "numberOfBytes": "20"
+ },
+ "t_uint16": {
+ "label": "uint16",
+ "numberOfBytes": "2"
+ }
+ },
+ "namespaces": {
+ "erc7201:openzeppelin.storage.ReentrancyGuard": [
+ {
+ "contract": "ReentrancyGuardUpgradeable",
+ "label": "_status",
+ "type": "t_uint256",
+ "src": "@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol:40",
+ "offset": 0,
+ "slot": "0"
+ }
+ ],
+ "erc7201:openzeppelin.storage.Initializable": [
+ {
+ "contract": "Initializable",
+ "label": "_initialized",
+ "type": "t_uint64",
+ "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:69",
+ "offset": 0,
+ "slot": "0"
+ },
+ {
+ "contract": "Initializable",
+ "label": "_initializing",
+ "type": "t_bool",
+ "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:73",
+ "offset": 8,
+ "slot": "0"
+ }
+ ]
+ }
+ }
+ },
+ "497030db8d1cafbf65ac9afd19d4e778cfcdd70a4a62306b6cf6bed72821f0b5": {
+ "address": "0x04D7CD78913622B59197880f58c40FdB90A84DBF",
+ "txHash": "0xe585830eee707ee37badc394f73a44e0b26449cd93a3c3f2d0195440e94d04fe",
+ "layout": {
+ "solcVersion": "0.8.20",
+ "storage": [
+ {
+ "label": "_selectorToTarget",
+ "offset": 0,
+ "slot": "0",
+ "type": "t_mapping(t_bytes4,t_enum(FuncTarget)9373)",
+ "contract": "RestakerFacets",
+ "src": "contracts/restaker/RestakerFacets.sol:18"
+ },
+ {
+ "label": "_podManager",
+ "offset": 0,
+ "slot": "1",
+ "type": "t_contract(IEigenPodManager)7130",
+ "contract": "RestakerFacets",
+ "src": "contracts/restaker/RestakerFacets.sol:19"
+ },
+ {
+ "label": "_delegationManager",
+ "offset": 0,
+ "slot": "2",
+ "type": "t_contract(IDelegationManager)6662",
+ "contract": "RestakerFacets",
+ "src": "contracts/restaker/RestakerFacets.sol:20"
+ }
+ ],
+ "types": {
+ "t_address": {
+ "label": "address",
+ "numberOfBytes": "20"
+ },
+ "t_bool": {
+ "label": "bool",
+ "numberOfBytes": "1"
+ },
+ "t_struct(InitializableStorage)64_storage": {
+ "label": "struct Initializable.InitializableStorage",
+ "members": [
+ {
+ "label": "_initialized",
+ "type": "t_uint64",
+ "offset": 0,
+ "slot": "0"
+ },
+ {
+ "label": "_initializing",
+ "type": "t_bool",
+ "offset": 8,
+ "slot": "0"
+ }
+ ],
+ "numberOfBytes": "32"
+ },
+ "t_struct(OwnableStorage)14_storage": {
+ "label": "struct OwnableUpgradeable.OwnableStorage",
+ "members": [
+ {
+ "label": "_owner",
+ "type": "t_address",
+ "offset": 0,
+ "slot": "0"
+ }
+ ],
+ "numberOfBytes": "32"
+ },
+ "t_uint64": {
+ "label": "uint64",
+ "numberOfBytes": "8"
+ },
+ "t_bytes4": {
+ "label": "bytes4",
+ "numberOfBytes": "4"
+ },
+ "t_contract(IDelegationManager)6662": {
+ "label": "contract IDelegationManager",
+ "numberOfBytes": "20"
+ },
+ "t_contract(IEigenPodManager)7130": {
+ "label": "contract IEigenPodManager",
+ "numberOfBytes": "20"
+ },
+ "t_enum(FuncTarget)9373": {
+ "label": "enum IRestakerFacets.FuncTarget",
+ "members": ["POD", "POD_MANAGER", "DELEGATION_MANAGER"],
+ "numberOfBytes": "1"
+ },
+ "t_mapping(t_bytes4,t_enum(FuncTarget)9373)": {
+ "label": "mapping(bytes4 => enum IRestakerFacets.FuncTarget)",
+ "numberOfBytes": "32"
+ }
+ },
+ "namespaces": {
+ "erc7201:openzeppelin.storage.Ownable": [
+ {
+ "contract": "OwnableUpgradeable",
+ "label": "_owner",
+ "type": "t_address",
+ "src": "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol:24",
+ "offset": 0,
+ "slot": "0"
+ }
+ ],
+ "erc7201:openzeppelin.storage.Initializable": [
+ {
+ "contract": "Initializable",
+ "label": "_initialized",
+ "type": "t_uint64",
+ "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:69",
+ "offset": 0,
+ "slot": "0"
+ },
+ {
+ "contract": "Initializable",
+ "label": "_initializing",
+ "type": "t_bool",
+ "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:73",
+ "offset": 8,
+ "slot": "0"
+ }
+ ]
+ }
+ }
+ },
+ "4f146d0f312ca656685c98ada306961ee6ab5c4579c94b52b32e3a37bcf8e041": {
+ "address": "0xAB110ea38ABf7929A2CEBf1184f905865E1C51dA",
+ "txHash": "0x332dc8f9295f05e3e290d6d14ce7c1368ffc73c3f0ce66889c0611bf3b5e9d05",
+ "layout": {
+ "solcVersion": "0.8.20",
+ "storage": [
+ {
+ "label": "_facets",
+ "offset": 0,
+ "slot": "0",
+ "type": "t_contract(IRestakerFacets)11286",
+ "contract": "Restaker",
+ "src": "contracts/restaker/Restaker.sol:17"
+ },
+ {
+ "label": "_signer",
+ "offset": 0,
+ "slot": "1",
+ "type": "t_address",
+ "contract": "Restaker",
+ "src": "contracts/restaker/Restaker.sol:18"
+ }
+ ],
+ "types": {
+ "t_address": {
+ "label": "address",
+ "numberOfBytes": "20"
+ },
+ "t_bool": {
+ "label": "bool",
+ "numberOfBytes": "1"
+ },
+ "t_struct(InitializableStorage)64_storage": {
+ "label": "struct Initializable.InitializableStorage",
+ "members": [
+ {
+ "label": "_initialized",
+ "type": "t_uint64",
+ "offset": 0,
+ "slot": "0"
+ },
+ {
+ "label": "_initializing",
+ "type": "t_bool",
+ "offset": 8,
+ "slot": "0"
+ }
+ ],
+ "numberOfBytes": "32"
+ },
+ "t_struct(OwnableStorage)14_storage": {
+ "label": "struct OwnableUpgradeable.OwnableStorage",
+ "members": [
+ {
+ "label": "_owner",
+ "type": "t_address",
+ "offset": 0,
+ "slot": "0"
+ }
+ ],
+ "numberOfBytes": "32"
+ },
+ "t_uint64": {
+ "label": "uint64",
+ "numberOfBytes": "8"
+ },
+ "t_contract(IRestakerFacets)11286": {
+ "label": "contract IRestakerFacets",
+ "numberOfBytes": "20"
+ }
+ },
+ "namespaces": {
+ "erc7201:openzeppelin.storage.Ownable": [
+ {
+ "contract": "OwnableUpgradeable",
+ "label": "_owner",
+ "type": "t_address",
+ "src": "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol:24",
+ "offset": 0,
+ "slot": "0"
+ }
+ ],
+ "erc7201:openzeppelin.storage.Initializable": [
+ {
+ "contract": "Initializable",
+ "label": "_initialized",
+ "type": "t_uint64",
+ "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:69",
+ "offset": 0,
+ "slot": "0"
+ },
+ {
+ "contract": "Initializable",
+ "label": "_initializing",
+ "type": "t_bool",
+ "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:73",
+ "offset": 8,
+ "slot": "0"
+ }
+ ]
+ }
+ },
+ "allAddresses": ["0xAB110ea38ABf7929A2CEBf1184f905865E1C51dA", "0x74a39592218548c2204E25e82592403B21844f2b"]
+ },
+ "54157c9e27f02691028e764e8587955da75c5e3da98025e4a5f28dcbc77053e0": {
+ "address": "0x4B21A1ee9268f4cF259E228388E1f3EC0C67D665",
+ "txHash": "0x8ae0cff312a0a7d6b46f93b68302e6c678621e0b75f99510b10c3b2c8fea2594",
+ "layout": {
+ "solcVersion": "0.8.20",
+ "storage": [
+ {
+ "label": "_facets",
+ "offset": 0,
+ "slot": "0",
+ "type": "t_contract(IRestakerFacets)11341",
+ "contract": "Restaker",
+ "src": "contracts/restaker/Restaker.sol:17"
+ },
+ {
+ "label": "_signer",
+ "offset": 0,
+ "slot": "1",
+ "type": "t_address",
+ "contract": "Restaker",
+ "src": "contracts/restaker/Restaker.sol:18"
+ }
+ ],
+ "types": {
+ "t_address": {
+ "label": "address",
+ "numberOfBytes": "20"
+ },
+ "t_bool": {
+ "label": "bool",
+ "numberOfBytes": "1"
+ },
+ "t_struct(InitializableStorage)64_storage": {
+ "label": "struct Initializable.InitializableStorage",
+ "members": [
+ {
+ "label": "_initialized",
+ "type": "t_uint64",
+ "offset": 0,
+ "slot": "0"
+ },
+ {
+ "label": "_initializing",
+ "type": "t_bool",
+ "offset": 8,
+ "slot": "0"
+ }
+ ],
+ "numberOfBytes": "32"
+ },
+ "t_struct(OwnableStorage)14_storage": {
+ "label": "struct OwnableUpgradeable.OwnableStorage",
+ "members": [
+ {
+ "label": "_owner",
+ "type": "t_address",
+ "offset": 0,
+ "slot": "0"
+ }
+ ],
+ "numberOfBytes": "32"
+ },
+ "t_uint64": {
+ "label": "uint64",
+ "numberOfBytes": "8"
+ },
+ "t_contract(IRestakerFacets)11341": {
+ "label": "contract IRestakerFacets",
+ "numberOfBytes": "20"
+ }
+ },
+ "namespaces": {
+ "erc7201:openzeppelin.storage.Ownable": [
+ {
+ "contract": "OwnableUpgradeable",
+ "label": "_owner",
+ "type": "t_address",
+ "src": "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol:24",
+ "offset": 0,
+ "slot": "0"
+ }
+ ],
+ "erc7201:openzeppelin.storage.Initializable": [
+ {
+ "contract": "Initializable",
+ "label": "_initialized",
+ "type": "t_uint64",
+ "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:69",
+ "offset": 0,
+ "slot": "0"
+ },
+ {
+ "contract": "Initializable",
+ "label": "_initializing",
+ "type": "t_bool",
+ "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:73",
+ "offset": 8,
+ "slot": "0"
+ }
+ ]
+ }
+ }
+ },
+ "26b3e81fe23d11442359e67d6388a70ceb649937439f28a4746e3070b8053e19": {
+ "address": "0xA0044Ece2B29B78c74a7b16C4178D7C204e48b4d",
+ "txHash": "0xa43695689f0e399fbde9f85c82a368842922eba4985a7f9d0f369ddbaea87e3a",
+ "layout": {
+ "solcVersion": "0.8.20",
+ "storage": [
+ {
+ "label": "_config",
+ "offset": 0,
+ "slot": "0",
+ "type": "t_contract(IProtocolConfig)7260",
+ "contract": "Configurable",
+ "src": "contracts/Configurable.sol:17"
+ },
+ {
+ "label": "__reserved",
+ "offset": 0,
+ "slot": "1",
+ "type": "t_array(t_uint256)49_storage",
+ "contract": "Configurable",
+ "src": "contracts/Configurable.sol:18"
+ },
+ {
+ "label": "_minStakeAmount",
+ "offset": 0,
+ "slot": "50",
+ "type": "t_uint256",
+ "contract": "RestakingPool",
+ "src": "contracts/RestakingPool.sol:31"
+ },
+ {
+ "label": "_minUnstakeAmount",
+ "offset": 0,
+ "slot": "51",
+ "type": "t_uint256",
+ "contract": "RestakingPool",
+ "src": "contracts/RestakingPool.sol:32"
+ },
+ {
+ "label": "_totalStaked",
+ "offset": 0,
+ "slot": "52",
+ "type": "t_uint256",
+ "contract": "RestakingPool",
+ "src": "contracts/RestakingPool.sol:37"
+ },
+ {
+ "label": "_totalUnstaked",
+ "offset": 0,
+ "slot": "53",
+ "type": "t_uint256",
+ "contract": "RestakingPool",
+ "src": "contracts/RestakingPool.sol:41"
+ },
+ {
+ "label": "_pendingGap",
+ "offset": 0,
+ "slot": "54",
+ "type": "t_uint256",
+ "contract": "RestakingPool",
+ "src": "contracts/RestakingPool.sol:46"
+ },
+ {
+ "label": "_pendingUnstakes",
+ "offset": 0,
+ "slot": "55",
+ "type": "t_array(t_struct(Unstake)7337_storage)dyn_storage",
+ "contract": "RestakingPool",
+ "src": "contracts/RestakingPool.sol:50"
+ },
+ {
+ "label": "_totalPendingUnstakes",
+ "offset": 0,
+ "slot": "56",
+ "type": "t_uint256",
+ "contract": "RestakingPool",
+ "src": "contracts/RestakingPool.sol:54"
+ },
+ {
+ "label": "_totalUnstakesOf",
+ "offset": 0,
+ "slot": "57",
+ "type": "t_mapping(t_address,t_uint256)",
+ "contract": "RestakingPool",
+ "src": "contracts/RestakingPool.sol:55"
+ },
+ {
+ "label": "_distributeGasLimit",
+ "offset": 0,
+ "slot": "58",
+ "type": "t_uint32",
+ "contract": "RestakingPool",
+ "src": "contracts/RestakingPool.sol:59"
+ },
+ {
+ "label": "_totalClaimable",
+ "offset": 0,
+ "slot": "59",
+ "type": "t_uint256",
+ "contract": "RestakingPool",
+ "src": "contracts/RestakingPool.sol:61"
+ },
+ {
+ "label": "_claimable",
+ "offset": 0,
+ "slot": "60",
+ "type": "t_mapping(t_address,t_uint256)",
+ "contract": "RestakingPool",
+ "src": "contracts/RestakingPool.sol:62"
+ },
+ {
+ "label": "_restakers",
+ "offset": 0,
+ "slot": "61",
+ "type": "t_mapping(t_bytes32,t_address)",
+ "contract": "RestakingPool",
+ "src": "contracts/RestakingPool.sol:67"
+ },
+ {
+ "label": "_maxTVL",
+ "offset": 0,
+ "slot": "62",
+ "type": "t_uint256",
+ "contract": "RestakingPool",
+ "src": "contracts/RestakingPool.sol:72"
+ },
+ {
+ "label": "__gap",
+ "offset": 0,
+ "slot": "63",
+ "type": "t_array(t_uint256)37_storage",
+ "contract": "RestakingPool",
+ "src": "contracts/RestakingPool.sol:79"
+ }
+ ],
+ "types": {
+ "t_bool": {
+ "label": "bool",
+ "numberOfBytes": "1"
+ },
+ "t_struct(InitializableStorage)64_storage": {
+ "label": "struct Initializable.InitializableStorage",
+ "members": [
+ {
+ "label": "_initialized",
+ "type": "t_uint64",
+ "offset": 0,
+ "slot": "0"
+ },
+ {
+ "label": "_initializing",
+ "type": "t_bool",
+ "offset": 8,
+ "slot": "0"
+ }
+ ],
+ "numberOfBytes": "32"
+ },
+ "t_struct(ReentrancyGuardStorage)320_storage": {
+ "label": "struct ReentrancyGuardUpgradeable.ReentrancyGuardStorage",
+ "members": [
+ {
+ "label": "_status",
+ "type": "t_uint256",
+ "offset": 0,
+ "slot": "0"
+ }
+ ],
+ "numberOfBytes": "32"
+ },
+ "t_uint256": {
+ "label": "uint256",
+ "numberOfBytes": "32"
+ },
+ "t_uint64": {
+ "label": "uint64",
+ "numberOfBytes": "8"
+ },
+ "t_address": {
+ "label": "address",
+ "numberOfBytes": "20"
+ },
+ "t_array(t_struct(Unstake)7337_storage)dyn_storage": {
+ "label": "struct IRestakingPool.Unstake[]",
+ "numberOfBytes": "32"
+ },
+ "t_array(t_uint256)37_storage": {
+ "label": "uint256[37]",
+ "numberOfBytes": "1184"
+ },
+ "t_array(t_uint256)49_storage": {
+ "label": "uint256[49]",
+ "numberOfBytes": "1568"
+ },
+ "t_bytes32": {
+ "label": "bytes32",
+ "numberOfBytes": "32"
+ },
+ "t_contract(IProtocolConfig)7260": {
+ "label": "contract IProtocolConfig",
+ "numberOfBytes": "20"
+ },
+ "t_mapping(t_address,t_uint256)": {
+ "label": "mapping(address => uint256)",
+ "numberOfBytes": "32"
+ },
+ "t_mapping(t_bytes32,t_address)": {
+ "label": "mapping(bytes32 => address)",
+ "numberOfBytes": "32"
+ },
+ "t_struct(Unstake)7337_storage": {
+ "label": "struct IRestakingPool.Unstake",
+ "members": [
+ {
+ "label": "recipient",
+ "type": "t_address",
+ "offset": 0,
+ "slot": "0"
+ },
+ {
+ "label": "amount",
+ "type": "t_uint256",
+ "offset": 0,
+ "slot": "1"
+ }
+ ],
+ "numberOfBytes": "64"
+ },
+ "t_uint32": {
+ "label": "uint32",
+ "numberOfBytes": "4"
+ }
+ },
+ "namespaces": {
+ "erc7201:openzeppelin.storage.ReentrancyGuard": [
+ {
+ "contract": "ReentrancyGuardUpgradeable",
+ "label": "_status",
+ "type": "t_uint256",
+ "src": "@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol:40",
+ "offset": 0,
+ "slot": "0"
+ }
+ ],
+ "erc7201:openzeppelin.storage.Initializable": [
+ {
+ "contract": "Initializable",
+ "label": "_initialized",
+ "type": "t_uint64",
+ "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:69",
+ "offset": 0,
+ "slot": "0"
+ },
+ {
+ "contract": "Initializable",
+ "label": "_initializing",
+ "type": "t_bool",
+ "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:73",
+ "offset": 8,
+ "slot": "0"
+ }
+ ]
+ }
+ }
+ },
+ "be9930084391335f8f79dd1a134c0fce0b070f5d2e9864e694ce783a626fc9f9": {
+ "address": "0x429e9C65a0e69a6030f0D7C39CF39a3B3F5F292D",
+ "txHash": "0x8d72d27b3de85552f1093d4281e020424dd72af8e56cfe114c7be0f36e8425d6",
+ "layout": {
+ "solcVersion": "0.8.20",
+ "storage": [
+ {
+ "label": "_config",
+ "offset": 0,
+ "slot": "0",
+ "type": "t_contract(IProtocolConfig)7273",
+ "contract": "Configurable",
+ "src": "contracts/Configurable.sol:17"
+ },
+ {
+ "label": "__reserved",
+ "offset": 0,
+ "slot": "1",
+ "type": "t_array(t_uint256)49_storage",
+ "contract": "Configurable",
+ "src": "contracts/Configurable.sol:18"
+ },
+ {
+ "label": "_minStakeAmount",
+ "offset": 0,
+ "slot": "50",
+ "type": "t_uint256",
+ "contract": "RestakingPool",
+ "src": "contracts/RestakingPool.sol:31"
+ },
+ {
+ "label": "_minUnstakeAmount",
+ "offset": 0,
+ "slot": "51",
+ "type": "t_uint256",
+ "contract": "RestakingPool",
+ "src": "contracts/RestakingPool.sol:32"
+ },
+ {
+ "label": "_totalStaked",
+ "offset": 0,
+ "slot": "52",
+ "type": "t_uint256",
+ "contract": "RestakingPool",
+ "src": "contracts/RestakingPool.sol:37"
+ },
+ {
+ "label": "_totalUnstaked",
+ "offset": 0,
+ "slot": "53",
+ "type": "t_uint256",
+ "contract": "RestakingPool",
+ "src": "contracts/RestakingPool.sol:41"
+ },
+ {
+ "label": "_pendingGap",
+ "offset": 0,
+ "slot": "54",
+ "type": "t_uint256",
+ "contract": "RestakingPool",
+ "src": "contracts/RestakingPool.sol:46"
+ },
+ {
+ "label": "_pendingUnstakes",
+ "offset": 0,
+ "slot": "55",
+ "type": "t_array(t_struct(Unstake)7331_storage)dyn_storage",
+ "contract": "RestakingPool",
+ "src": "contracts/RestakingPool.sol:50"
+ },
+ {
+ "label": "_totalPendingUnstakes",
+ "offset": 0,
+ "slot": "56",
+ "type": "t_uint256",
+ "contract": "RestakingPool",
+ "src": "contracts/RestakingPool.sol:54"
+ },
+ {
+ "label": "_totalUnstakesOf",
+ "offset": 0,
+ "slot": "57",
+ "type": "t_mapping(t_address,t_uint256)",
+ "contract": "RestakingPool",
+ "src": "contracts/RestakingPool.sol:55"
+ },
+ {
+ "label": "_distributeGasLimit",
+ "offset": 0,
+ "slot": "58",
+ "type": "t_uint32",
+ "contract": "RestakingPool",
+ "src": "contracts/RestakingPool.sol:59"
+ },
+ {
+ "label": "_totalClaimable",
+ "offset": 0,
+ "slot": "59",
+ "type": "t_uint256",
+ "contract": "RestakingPool",
+ "src": "contracts/RestakingPool.sol:61"
+ },
+ {
+ "label": "_claimable",
+ "offset": 0,
+ "slot": "60",
+ "type": "t_mapping(t_address,t_uint256)",
+ "contract": "RestakingPool",
+ "src": "contracts/RestakingPool.sol:62"
+ },
+ {
+ "label": "_restakers",
+ "offset": 0,
+ "slot": "61",
+ "type": "t_mapping(t_bytes32,t_address)",
+ "contract": "RestakingPool",
+ "src": "contracts/RestakingPool.sol:67"
+ },
+ {
+ "label": "_maxTVL",
+ "offset": 0,
+ "slot": "62",
+ "type": "t_uint256",
+ "contract": "RestakingPool",
+ "src": "contracts/RestakingPool.sol:72"
+ },
+ {
+ "label": "__gap",
+ "offset": 0,
+ "slot": "63",
+ "type": "t_array(t_uint256)37_storage",
+ "contract": "RestakingPool",
+ "src": "contracts/RestakingPool.sol:79"
+ }
+ ],
+ "types": {
+ "t_bool": {
+ "label": "bool",
+ "numberOfBytes": "1"
+ },
+ "t_struct(InitializableStorage)64_storage": {
+ "label": "struct Initializable.InitializableStorage",
+ "members": [
+ {
+ "label": "_initialized",
+ "type": "t_uint64",
+ "offset": 0,
+ "slot": "0"
+ },
+ {
+ "label": "_initializing",
+ "type": "t_bool",
+ "offset": 8,
+ "slot": "0"
+ }
+ ],
+ "numberOfBytes": "32"
+ },
+ "t_struct(ReentrancyGuardStorage)320_storage": {
+ "label": "struct ReentrancyGuardUpgradeable.ReentrancyGuardStorage",
+ "members": [
+ {
+ "label": "_status",
+ "type": "t_uint256",
+ "offset": 0,
+ "slot": "0"
+ }
+ ],
+ "numberOfBytes": "32"
+ },
+ "t_uint256": {
+ "label": "uint256",
+ "numberOfBytes": "32"
+ },
+ "t_uint64": {
+ "label": "uint64",
+ "numberOfBytes": "8"
+ },
+ "t_address": {
+ "label": "address",
+ "numberOfBytes": "20"
+ },
+ "t_array(t_struct(Unstake)7331_storage)dyn_storage": {
+ "label": "struct IRestakingPool.Unstake[]",
+ "numberOfBytes": "32"
+ },
+ "t_array(t_uint256)37_storage": {
+ "label": "uint256[37]",
+ "numberOfBytes": "1184"
+ },
+ "t_array(t_uint256)49_storage": {
+ "label": "uint256[49]",
+ "numberOfBytes": "1568"
+ },
+ "t_bytes32": {
+ "label": "bytes32",
+ "numberOfBytes": "32"
+ },
+ "t_contract(IProtocolConfig)7273": {
+ "label": "contract IProtocolConfig",
+ "numberOfBytes": "20"
+ },
+ "t_mapping(t_address,t_uint256)": {
+ "label": "mapping(address => uint256)",
+ "numberOfBytes": "32"
+ },
+ "t_mapping(t_bytes32,t_address)": {
+ "label": "mapping(bytes32 => address)",
+ "numberOfBytes": "32"
+ },
+ "t_struct(Unstake)7331_storage": {
+ "label": "struct IRestakingPool.Unstake",
+ "members": [
+ {
+ "label": "recipient",
+ "type": "t_address",
+ "offset": 0,
+ "slot": "0"
+ },
+ {
+ "label": "amount",
+ "type": "t_uint256",
+ "offset": 0,
+ "slot": "1"
+ }
+ ],
+ "numberOfBytes": "64"
+ },
+ "t_uint32": {
+ "label": "uint32",
+ "numberOfBytes": "4"
+ }
+ },
+ "namespaces": {
+ "erc7201:openzeppelin.storage.ReentrancyGuard": [
+ {
+ "contract": "ReentrancyGuardUpgradeable",
+ "label": "_status",
+ "type": "t_uint256",
+ "src": "@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol:40",
+ "offset": 0,
+ "slot": "0"
+ }
+ ],
+ "erc7201:openzeppelin.storage.Initializable": [
+ {
+ "contract": "Initializable",
+ "label": "_initialized",
+ "type": "t_uint64",
+ "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:69",
+ "offset": 0,
+ "slot": "0"
+ },
+ {
+ "contract": "Initializable",
+ "label": "_initializing",
+ "type": "t_bool",
+ "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:73",
+ "offset": 8,
+ "slot": "0"
+ }
+ ]
+ }
+ }
+ },
+ "29f9e02cb8bda0ba6a19f761e929466f36e4ca0b5cf6133e06f4ce250ac53e96": {
+ "address": "0x65B13B6133e928366C0a9664123De7ef3D63a614",
+ "txHash": "0x2edfff89888b8b0052a72547aef4a750a203151b51de8ce796a291d5c83fc76d",
+ "layout": {
+ "solcVersion": "0.8.20",
+ "storage": [
+ {
+ "label": "_config",
+ "offset": 0,
+ "slot": "0",
+ "type": "t_contract(IProtocolConfig)6125",
+ "contract": "Configurable",
+ "src": "contracts/Configurable.sol:17"
+ },
+ {
+ "label": "__reserved",
+ "offset": 0,
+ "slot": "1",
+ "type": "t_array(t_uint256)49_storage",
+ "contract": "Configurable",
+ "src": "contracts/Configurable.sol:18"
+ },
+ {
+ "label": "_minStakeAmount",
+ "offset": 0,
+ "slot": "50",
+ "type": "t_uint256",
+ "contract": "RestakingPool",
+ "src": "contracts/RestakingPool.sol:31"
+ },
+ {
+ "label": "_minUnstakeAmount",
+ "offset": 0,
+ "slot": "51",
+ "type": "t_uint256",
+ "contract": "RestakingPool",
+ "src": "contracts/RestakingPool.sol:32"
+ },
+ {
+ "label": "_totalStaked",
+ "offset": 0,
+ "slot": "52",
+ "type": "t_uint256",
+ "contract": "RestakingPool",
+ "src": "contracts/RestakingPool.sol:37"
+ },
+ {
+ "label": "_totalUnstaked",
+ "offset": 0,
+ "slot": "53",
+ "type": "t_uint256",
+ "contract": "RestakingPool",
+ "src": "contracts/RestakingPool.sol:41"
+ },
+ {
+ "label": "_pendingGap",
+ "offset": 0,
+ "slot": "54",
+ "type": "t_uint256",
+ "contract": "RestakingPool",
+ "src": "contracts/RestakingPool.sol:46"
+ },
+ {
+ "label": "_pendingUnstakes",
+ "offset": 0,
+ "slot": "55",
+ "type": "t_array(t_struct(Unstake)6183_storage)dyn_storage",
+ "contract": "RestakingPool",
+ "src": "contracts/RestakingPool.sol:50"
+ },
+ {
+ "label": "_totalPendingUnstakes",
+ "offset": 0,
+ "slot": "56",
+ "type": "t_uint256",
+ "contract": "RestakingPool",
+ "src": "contracts/RestakingPool.sol:54"
+ },
+ {
+ "label": "_totalUnstakesOf",
+ "offset": 0,
+ "slot": "57",
+ "type": "t_mapping(t_address,t_uint256)",
+ "contract": "RestakingPool",
+ "src": "contracts/RestakingPool.sol:55"
+ },
+ {
+ "label": "_distributeGasLimit",
+ "offset": 0,
+ "slot": "58",
+ "type": "t_uint32",
+ "contract": "RestakingPool",
+ "src": "contracts/RestakingPool.sol:59"
+ },
+ {
+ "label": "_totalClaimable",
+ "offset": 0,
+ "slot": "59",
+ "type": "t_uint256",
+ "contract": "RestakingPool",
+ "src": "contracts/RestakingPool.sol:61"
+ },
+ {
+ "label": "_claimable",
+ "offset": 0,
+ "slot": "60",
+ "type": "t_mapping(t_address,t_uint256)",
+ "contract": "RestakingPool",
+ "src": "contracts/RestakingPool.sol:62"
+ },
+ {
+ "label": "_restakers",
+ "offset": 0,
+ "slot": "61",
+ "type": "t_mapping(t_bytes32,t_address)",
+ "contract": "RestakingPool",
+ "src": "contracts/RestakingPool.sol:67"
+ },
+ {
+ "label": "_maxTVL",
+ "offset": 0,
+ "slot": "62",
+ "type": "t_uint256",
+ "contract": "RestakingPool",
+ "src": "contracts/RestakingPool.sol:72"
+ },
+ {
+ "label": "__gap",
+ "offset": 0,
+ "slot": "63",
+ "type": "t_array(t_uint256)37_storage",
+ "contract": "RestakingPool",
+ "src": "contracts/RestakingPool.sol:79"
+ }
+ ],
+ "types": {
+ "t_bool": {
+ "label": "bool",
+ "numberOfBytes": "1"
+ },
+ "t_struct(InitializableStorage)10_storage": {
+ "label": "struct Initializable.InitializableStorage",
+ "members": [
+ {
+ "label": "_initialized",
+ "type": "t_uint64",
+ "offset": 0,
+ "slot": "0"
+ },
+ {
+ "label": "_initializing",
+ "type": "t_bool",
+ "offset": 8,
+ "slot": "0"
+ }
+ ],
+ "numberOfBytes": "32"
+ },
+ "t_struct(ReentrancyGuardStorage)266_storage": {
+ "label": "struct ReentrancyGuardUpgradeable.ReentrancyGuardStorage",
+ "members": [
+ {
+ "label": "_status",
+ "type": "t_uint256",
+ "offset": 0,
+ "slot": "0"
+ }
+ ],
+ "numberOfBytes": "32"
+ },
+ "t_uint256": {
+ "label": "uint256",
+ "numberOfBytes": "32"
+ },
+ "t_uint64": {
+ "label": "uint64",
+ "numberOfBytes": "8"
+ },
+ "t_address": {
+ "label": "address",
+ "numberOfBytes": "20"
+ },
+ "t_array(t_struct(Unstake)6183_storage)dyn_storage": {
+ "label": "struct IRestakingPool.Unstake[]",
+ "numberOfBytes": "32"
+ },
+ "t_array(t_uint256)37_storage": {
+ "label": "uint256[37]",
+ "numberOfBytes": "1184"
+ },
+ "t_array(t_uint256)49_storage": {
+ "label": "uint256[49]",
+ "numberOfBytes": "1568"
+ },
+ "t_bytes32": {
+ "label": "bytes32",
+ "numberOfBytes": "32"
+ },
+ "t_contract(IProtocolConfig)6125": {
+ "label": "contract IProtocolConfig",
+ "numberOfBytes": "20"
+ },
+ "t_mapping(t_address,t_uint256)": {
+ "label": "mapping(address => uint256)",
+ "numberOfBytes": "32"
+ },
+ "t_mapping(t_bytes32,t_address)": {
+ "label": "mapping(bytes32 => address)",
+ "numberOfBytes": "32"
+ },
+ "t_struct(Unstake)6183_storage": {
+ "label": "struct IRestakingPool.Unstake",
+ "members": [
+ {
+ "label": "recipient",
+ "type": "t_address",
+ "offset": 0,
+ "slot": "0"
+ },
+ {
+ "label": "amount",
+ "type": "t_uint256",
+ "offset": 0,
+ "slot": "1"
+ }
+ ],
+ "numberOfBytes": "64"
+ },
+ "t_uint32": {
+ "label": "uint32",
+ "numberOfBytes": "4"
+ }
+ },
+ "namespaces": {
+ "erc7201:openzeppelin.storage.ReentrancyGuard": [
+ {
+ "contract": "ReentrancyGuardUpgradeable",
+ "label": "_status",
+ "type": "t_uint256",
+ "src": "@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol:40",
+ "offset": 0,
+ "slot": "0"
+ }
+ ],
+ "erc7201:openzeppelin.storage.Initializable": [
+ {
+ "contract": "Initializable",
+ "label": "_initialized",
+ "type": "t_uint64",
+ "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:69",
+ "offset": 0,
+ "slot": "0"
+ },
+ {
+ "contract": "Initializable",
+ "label": "_initializing",
+ "type": "t_bool",
+ "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:73",
+ "offset": 8,
+ "slot": "0"
+ }
+ ]
+ }
+ }
+ },
+ "affdaec18cf9db0d6f42d6167a62d16fcdd0a085239b9ebd7beb8d492630e178": {
+ "address": "0x3b621aCCEB6628d85dDAcBfB57572433458b54E4",
+ "txHash": "0x7a376724078ad0711dc33af059b05dead0363cd5aaa63feb8b12e37468be350d",
+ "layout": {
+ "solcVersion": "0.8.20",
+ "storage": [
+ {
+ "label": "_selectorToTarget",
+ "offset": 0,
+ "slot": "0",
+ "type": "t_mapping(t_bytes4,t_enum(FuncTarget)11132)",
+ "contract": "RestakerFacets",
+ "src": "contracts/restaker/RestakerFacets.sol:18"
+ },
+ {
+ "label": "_podManager",
+ "offset": 0,
+ "slot": "1",
+ "type": "t_contract(IEigenPodManager)7827",
+ "contract": "RestakerFacets",
+ "src": "contracts/restaker/RestakerFacets.sol:19"
+ },
+ {
+ "label": "_delegationManager",
+ "offset": 0,
+ "slot": "2",
+ "type": "t_contract(IDelegationManager)7268",
+ "contract": "RestakerFacets",
+ "src": "contracts/restaker/RestakerFacets.sol:20"
+ }
+ ],
+ "types": {
+ "t_address": {
+ "label": "address",
+ "numberOfBytes": "20"
+ },
+ "t_bool": {
+ "label": "bool",
+ "numberOfBytes": "1"
+ },
+ "t_struct(InitializableStorage)64_storage": {
+ "label": "struct Initializable.InitializableStorage",
+ "members": [
+ {
+ "label": "_initialized",
+ "type": "t_uint64",
+ "offset": 0,
+ "slot": "0"
+ },
+ {
+ "label": "_initializing",
+ "type": "t_bool",
+ "offset": 8,
+ "slot": "0"
+ }
+ ],
+ "numberOfBytes": "32"
+ },
+ "t_struct(OwnableStorage)14_storage": {
+ "label": "struct OwnableUpgradeable.OwnableStorage",
+ "members": [
+ {
+ "label": "_owner",
+ "type": "t_address",
+ "offset": 0,
+ "slot": "0"
+ }
+ ],
+ "numberOfBytes": "32"
+ },
+ "t_uint64": {
+ "label": "uint64",
+ "numberOfBytes": "8"
+ },
+ "t_bytes4": {
+ "label": "bytes4",
+ "numberOfBytes": "4"
+ },
+ "t_contract(IDelegationManager)7268": {
+ "label": "contract IDelegationManager",
+ "numberOfBytes": "20"
+ },
+ "t_contract(IEigenPodManager)7827": {
+ "label": "contract IEigenPodManager",
+ "numberOfBytes": "20"
+ },
+ "t_enum(FuncTarget)11132": {
+ "label": "enum IRestakerFacets.FuncTarget",
+ "members": ["POD", "POD_MANAGER", "DELEGATION_MANAGER"],
+ "numberOfBytes": "1"
+ },
+ "t_mapping(t_bytes4,t_enum(FuncTarget)11132)": {
+ "label": "mapping(bytes4 => enum IRestakerFacets.FuncTarget)",
+ "numberOfBytes": "32"
+ }
+ },
+ "namespaces": {
+ "erc7201:openzeppelin.storage.Ownable": [
+ {
+ "contract": "OwnableUpgradeable",
+ "label": "_owner",
+ "type": "t_address",
+ "src": "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol:24",
+ "offset": 0,
+ "slot": "0"
+ }
+ ],
+ "erc7201:openzeppelin.storage.Initializable": [
+ {
+ "contract": "Initializable",
+ "label": "_initialized",
+ "type": "t_uint64",
+ "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:69",
+ "offset": 0,
+ "slot": "0"
+ },
+ {
+ "contract": "Initializable",
+ "label": "_initializing",
+ "type": "t_bool",
+ "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:73",
+ "offset": 8,
+ "slot": "0"
+ }
+ ]
+ }
+ }
+ },
+ "263678939318159cce1993df1dcd2675f9fb1428e23da6735e7c696c9ed84bdd": {
+ "address": "0x0e1b44F0c5968C499f62Fbd711cE0247dB6a47B0",
+ "txHash": "0x22862184dae353aae41c9747d68ce5e388a01a9ccf8cd768caa2830a14c51499",
+ "layout": {
+ "solcVersion": "0.8.20",
+ "storage": [
+ {
+ "label": "_config",
+ "offset": 0,
+ "slot": "0",
+ "type": "t_contract(IProtocolConfig)6125",
+ "contract": "Configurable",
+ "src": "contracts/Configurable.sol:17"
+ },
+ {
+ "label": "__reserved",
+ "offset": 0,
+ "slot": "1",
+ "type": "t_array(t_uint256)49_storage",
+ "contract": "Configurable",
+ "src": "contracts/Configurable.sol:18"
+ },
+ {
+ "label": "_name",
+ "offset": 0,
+ "slot": "50",
+ "type": "t_string_storage",
+ "contract": "cToken",
+ "src": "contracts/cToken.sol:22"
+ },
+ {
+ "label": "_symbol",
+ "offset": 0,
+ "slot": "51",
+ "type": "t_string_storage",
+ "contract": "cToken",
+ "src": "contracts/cToken.sol:23"
+ },
+ {
+ "label": "__gap",
+ "offset": 0,
+ "slot": "52",
+ "type": "t_array(t_uint256)48_storage",
+ "contract": "cToken",
+ "src": "contracts/cToken.sol:30"
+ }
+ ],
+ "types": {
+ "t_address": {
+ "label": "address",
+ "numberOfBytes": "20"
+ },
+ "t_bool": {
+ "label": "bool",
+ "numberOfBytes": "1"
+ },
+ "t_mapping(t_address,t_mapping(t_address,t_uint256))": {
+ "label": "mapping(address => mapping(address => uint256))",
+ "numberOfBytes": "32"
+ },
+ "t_mapping(t_address,t_uint256)": {
+ "label": "mapping(address => uint256)",
+ "numberOfBytes": "32"
+ },
+ "t_string_storage": {
+ "label": "string",
+ "numberOfBytes": "32"
+ },
+ "t_struct(ERC20Storage)90_storage": {
+ "label": "struct ERC20Upgradeable.ERC20Storage",
+ "members": [
+ {
+ "label": "_balances",
+ "type": "t_mapping(t_address,t_uint256)",
+ "offset": 0,
+ "slot": "0"
+ },
+ {
+ "label": "_allowances",
+ "type": "t_mapping(t_address,t_mapping(t_address,t_uint256))",
+ "offset": 0,
+ "slot": "1"
+ },
+ {
+ "label": "_totalSupply",
+ "type": "t_uint256",
+ "offset": 0,
+ "slot": "2"
+ },
+ {
+ "label": "_name",
+ "type": "t_string_storage",
+ "offset": 0,
+ "slot": "3"
+ },
+ {
+ "label": "_symbol",
+ "type": "t_string_storage",
+ "offset": 0,
+ "slot": "4"
+ }
+ ],
+ "numberOfBytes": "160"
+ },
+ "t_struct(InitializableStorage)10_storage": {
+ "label": "struct Initializable.InitializableStorage",
+ "members": [
+ {
+ "label": "_initialized",
+ "type": "t_uint64",
+ "offset": 0,
+ "slot": "0"
+ },
+ {
+ "label": "_initializing",
+ "type": "t_bool",
+ "offset": 8,
+ "slot": "0"
+ }
+ ],
+ "numberOfBytes": "32"
+ },
+ "t_struct(PausableStorage)205_storage": {
+ "label": "struct PausableUpgradeable.PausableStorage",
+ "members": [
+ {
+ "label": "_paused",
+ "type": "t_bool",
+ "offset": 0,
+ "slot": "0"
+ }
+ ],
+ "numberOfBytes": "32"
+ },
+ "t_uint256": {
+ "label": "uint256",
+ "numberOfBytes": "32"
+ },
+ "t_uint64": {
+ "label": "uint64",
+ "numberOfBytes": "8"
+ },
+ "t_array(t_uint256)48_storage": {
+ "label": "uint256[48]",
+ "numberOfBytes": "1536"
+ },
+ "t_array(t_uint256)49_storage": {
+ "label": "uint256[49]",
+ "numberOfBytes": "1568"
+ },
+ "t_contract(IProtocolConfig)6125": {
+ "label": "contract IProtocolConfig",
+ "numberOfBytes": "20"
+ }
+ },
+ "namespaces": {
+ "erc7201:openzeppelin.storage.Pausable": [
+ {
+ "contract": "PausableUpgradeable",
+ "label": "_paused",
+ "type": "t_bool",
+ "src": "@openzeppelin/contracts-upgradeable/utils/PausableUpgradeable.sol:21",
+ "offset": 0,
+ "slot": "0"
+ }
+ ],
+ "erc7201:openzeppelin.storage.ERC20": [
+ {
+ "contract": "ERC20Upgradeable",
+ "label": "_balances",
+ "type": "t_mapping(t_address,t_uint256)",
+ "src": "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol:38",
+ "offset": 0,
+ "slot": "0"
+ },
+ {
+ "contract": "ERC20Upgradeable",
+ "label": "_allowances",
+ "type": "t_mapping(t_address,t_mapping(t_address,t_uint256))",
+ "src": "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol:40",
+ "offset": 0,
+ "slot": "1"
+ },
+ {
+ "contract": "ERC20Upgradeable",
+ "label": "_totalSupply",
+ "type": "t_uint256",
+ "src": "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol:42",
+ "offset": 0,
+ "slot": "2"
+ },
+ {
+ "contract": "ERC20Upgradeable",
+ "label": "_name",
+ "type": "t_string_storage",
+ "src": "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol:44",
+ "offset": 0,
+ "slot": "3"
+ },
+ {
+ "contract": "ERC20Upgradeable",
+ "label": "_symbol",
+ "type": "t_string_storage",
+ "src": "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol:45",
+ "offset": 0,
+ "slot": "4"
+ }
+ ],
+ "erc7201:openzeppelin.storage.Initializable": [
+ {
+ "contract": "Initializable",
+ "label": "_initialized",
+ "type": "t_uint64",
+ "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:69",
+ "offset": 0,
+ "slot": "0"
+ },
+ {
+ "contract": "Initializable",
+ "label": "_initializing",
+ "type": "t_bool",
+ "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:73",
+ "offset": 8,
+ "slot": "0"
+ }
+ ]
+ }
+ }
+ },
+ "6244d86a51a6f7caab02a405831105d43e99ef22cce2eba72b71a5c9c5647052": {
+ "address": "0x180E0F5efAD0a5299e9b6724BA3eF6Ea59914246",
+ "txHash": "0x3f3f8e8362f7d5950bbf9dd7ad4644a436f5446d36164adaf862e26f8779000c",
+ "layout": {
+ "solcVersion": "0.8.20",
+ "storage": [
+ {
+ "label": "_config",
+ "offset": 0,
+ "slot": "0",
+ "type": "t_contract(IProtocolConfig)8123",
+ "contract": "Configurable",
+ "src": "contracts/Configurable.sol:17"
+ },
+ {
+ "label": "__reserved",
+ "offset": 0,
+ "slot": "1",
+ "type": "t_array(t_uint256)49_storage",
+ "contract": "Configurable",
+ "src": "contracts/Configurable.sol:18"
+ },
+ {
+ "label": "_minStakeAmount",
+ "offset": 0,
+ "slot": "50",
+ "type": "t_uint256",
+ "contract": "RestakingPool",
+ "src": "contracts/RestakingPool.sol:37"
+ },
+ {
+ "label": "_minUnstakeAmount",
+ "offset": 0,
+ "slot": "51",
+ "type": "t_uint256",
+ "contract": "RestakingPool",
+ "src": "contracts/RestakingPool.sol:38"
+ },
+ {
+ "label": "_totalStaked",
+ "offset": 0,
+ "slot": "52",
+ "type": "t_uint256",
+ "contract": "RestakingPool",
+ "src": "contracts/RestakingPool.sol:43"
+ },
+ {
+ "label": "_totalUnstaked",
+ "offset": 0,
+ "slot": "53",
+ "type": "t_uint256",
+ "contract": "RestakingPool",
+ "src": "contracts/RestakingPool.sol:47"
+ },
+ {
+ "label": "_pendingGap",
+ "offset": 0,
+ "slot": "54",
+ "type": "t_uint256",
+ "contract": "RestakingPool",
+ "src": "contracts/RestakingPool.sol:52"
+ },
+ {
+ "label": "_pendingUnstakes",
+ "offset": 0,
+ "slot": "55",
+ "type": "t_array(t_struct(Unstake)8181_storage)dyn_storage",
+ "contract": "RestakingPool",
+ "src": "contracts/RestakingPool.sol:56"
+ },
+ {
+ "label": "_totalPendingUnstakes",
+ "offset": 0,
+ "slot": "56",
+ "type": "t_uint256",
+ "contract": "RestakingPool",
+ "src": "contracts/RestakingPool.sol:60"
+ },
+ {
+ "label": "_totalUnstakesOf",
+ "offset": 0,
+ "slot": "57",
+ "type": "t_mapping(t_address,t_uint256)",
+ "contract": "RestakingPool",
+ "src": "contracts/RestakingPool.sol:61"
+ },
+ {
+ "label": "_distributeGasLimit",
+ "offset": 0,
+ "slot": "58",
+ "type": "t_uint32",
+ "contract": "RestakingPool",
+ "src": "contracts/RestakingPool.sol:65"
+ },
+ {
+ "label": "_totalClaimable",
+ "offset": 0,
+ "slot": "59",
+ "type": "t_uint256",
+ "contract": "RestakingPool",
+ "src": "contracts/RestakingPool.sol:67"
+ },
+ {
+ "label": "_claimable",
+ "offset": 0,
+ "slot": "60",
+ "type": "t_mapping(t_address,t_uint256)",
+ "contract": "RestakingPool",
+ "src": "contracts/RestakingPool.sol:68"
+ },
+ {
+ "label": "_restakers",
+ "offset": 0,
+ "slot": "61",
+ "type": "t_mapping(t_bytes32,t_address)",
+ "contract": "RestakingPool",
+ "src": "contracts/RestakingPool.sol:73"
+ },
+ {
+ "label": "_maxTVL",
+ "offset": 0,
+ "slot": "62",
+ "type": "t_uint256",
+ "contract": "RestakingPool",
+ "src": "contracts/RestakingPool.sol:78"
+ },
+ {
+ "label": "stakeBonusAmount",
+ "offset": 0,
+ "slot": "63",
+ "type": "t_uint256",
+ "contract": "RestakingPool",
+ "src": "contracts/RestakingPool.sol:83"
+ },
+ {
+ "label": "targetCapacity",
+ "offset": 0,
+ "slot": "64",
+ "type": "t_uint64",
+ "contract": "RestakingPool",
+ "src": "contracts/RestakingPool.sol:85"
+ },
+ {
+ "label": "maxBonusRate",
+ "offset": 8,
+ "slot": "64",
+ "type": "t_uint64",
+ "contract": "RestakingPool",
+ "src": "contracts/RestakingPool.sol:86"
+ },
+ {
+ "label": "optimalBonusRate",
+ "offset": 16,
+ "slot": "64",
+ "type": "t_uint64",
+ "contract": "RestakingPool",
+ "src": "contracts/RestakingPool.sol:87"
+ },
+ {
+ "label": "stakeUtilizationKink",
+ "offset": 24,
+ "slot": "64",
+ "type": "t_uint64",
+ "contract": "RestakingPool",
+ "src": "contracts/RestakingPool.sol:88"
+ },
+ {
+ "label": "maxFlashFeeRate",
+ "offset": 0,
+ "slot": "65",
+ "type": "t_uint64",
+ "contract": "RestakingPool",
+ "src": "contracts/RestakingPool.sol:90"
+ },
+ {
+ "label": "optimalUnstakeRate",
+ "offset": 8,
+ "slot": "65",
+ "type": "t_uint64",
+ "contract": "RestakingPool",
+ "src": "contracts/RestakingPool.sol:91"
+ },
+ {
+ "label": "unstakeUtilizationKink",
+ "offset": 16,
+ "slot": "65",
+ "type": "t_uint64",
+ "contract": "RestakingPool",
+ "src": "contracts/RestakingPool.sol:92"
+ },
+ {
+ "label": "protocolFee",
+ "offset": 24,
+ "slot": "65",
+ "type": "t_uint64",
+ "contract": "RestakingPool",
+ "src": "contracts/RestakingPool.sol:93"
+ },
+ {
+ "label": "__gap",
+ "offset": 0,
+ "slot": "66",
+ "type": "t_array(t_uint256)34_storage",
+ "contract": "RestakingPool",
+ "src": "contracts/RestakingPool.sol:100"
+ }
+ ],
+ "types": {
+ "t_bool": {
+ "label": "bool",
+ "numberOfBytes": "1"
+ },
+ "t_struct(InitializableStorage)64_storage": {
+ "label": "struct Initializable.InitializableStorage",
+ "members": [
+ {
+ "label": "_initialized",
+ "type": "t_uint64",
+ "offset": 0,
+ "slot": "0"
+ },
+ {
+ "label": "_initializing",
+ "type": "t_bool",
+ "offset": 8,
+ "slot": "0"
+ }
+ ],
+ "numberOfBytes": "32"
+ },
+ "t_struct(ReentrancyGuardStorage)320_storage": {
+ "label": "struct ReentrancyGuardUpgradeable.ReentrancyGuardStorage",
+ "members": [
+ {
+ "label": "_status",
+ "type": "t_uint256",
+ "offset": 0,
+ "slot": "0"
+ }
+ ],
+ "numberOfBytes": "32"
+ },
+ "t_uint256": {
+ "label": "uint256",
+ "numberOfBytes": "32"
+ },
+ "t_uint64": {
+ "label": "uint64",
+ "numberOfBytes": "8"
+ },
+ "t_address": {
+ "label": "address",
+ "numberOfBytes": "20"
+ },
+ "t_array(t_struct(Unstake)8181_storage)dyn_storage": {
+ "label": "struct IRestakingPool.Unstake[]",
+ "numberOfBytes": "32"
+ },
+ "t_array(t_uint256)34_storage": {
+ "label": "uint256[34]",
+ "numberOfBytes": "1088"
+ },
+ "t_array(t_uint256)49_storage": {
+ "label": "uint256[49]",
+ "numberOfBytes": "1568"
+ },
+ "t_bytes32": {
+ "label": "bytes32",
+ "numberOfBytes": "32"
+ },
+ "t_contract(IProtocolConfig)8123": {
+ "label": "contract IProtocolConfig",
+ "numberOfBytes": "20"
+ },
+ "t_mapping(t_address,t_uint256)": {
+ "label": "mapping(address => uint256)",
+ "numberOfBytes": "32"
+ },
+ "t_mapping(t_bytes32,t_address)": {
+ "label": "mapping(bytes32 => address)",
+ "numberOfBytes": "32"
+ },
+ "t_struct(Unstake)8181_storage": {
+ "label": "struct IRestakingPool.Unstake",
+ "members": [
+ {
+ "label": "recipient",
+ "type": "t_address",
+ "offset": 0,
+ "slot": "0"
+ },
+ {
+ "label": "amount",
+ "type": "t_uint256",
+ "offset": 0,
+ "slot": "1"
+ }
+ ],
+ "numberOfBytes": "64"
+ },
+ "t_uint32": {
+ "label": "uint32",
+ "numberOfBytes": "4"
+ }
+ },
+ "namespaces": {
+ "erc7201:openzeppelin.storage.ReentrancyGuard": [
+ {
+ "contract": "ReentrancyGuardUpgradeable",
+ "label": "_status",
+ "type": "t_uint256",
+ "src": "@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol:40",
+ "offset": 0,
+ "slot": "0"
+ }
+ ],
+ "erc7201:openzeppelin.storage.Initializable": [
+ {
+ "contract": "Initializable",
+ "label": "_initialized",
+ "type": "t_uint64",
+ "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:69",
+ "offset": 0,
+ "slot": "0"
+ },
+ {
+ "contract": "Initializable",
+ "label": "_initializing",
+ "type": "t_bool",
+ "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:73",
+ "offset": 8,
+ "slot": "0"
+ }
+ ]
+ }
+ }
+ }
+ }
+}
diff --git a/projects/tests/omnivault-rebalancer/.openzeppelin/unknown-17000.json b/projects/tests/omnivault-rebalancer/.openzeppelin/unknown-17000.json
new file mode 100644
index 00000000..39d42952
--- /dev/null
+++ b/projects/tests/omnivault-rebalancer/.openzeppelin/unknown-17000.json
@@ -0,0 +1,2043 @@
+{
+ "manifestVersion": "3.2",
+ "proxies": [
+ {
+ "address": "0xe59e4410d1D4C364b506F09aBe942b97f1c7b912",
+ "txHash": "0x008577c1540519757e2356e50d59a160bc92487289b295ca4b5e64edd366805a",
+ "kind": "transparent"
+ },
+ {
+ "address": "0x3e329e6782C7d8496DE49e79CD36D1aA592D493b",
+ "txHash": "0xa5a569a9a8ccec4b3e641211c88309b0ef1a73b0d4cdae608b330bbbb39e63b2",
+ "kind": "transparent"
+ },
+ {
+ "address": "0x76944d54c9eF0a7A563E43226e998F382714C92f",
+ "txHash": "0x833832c2a5ffd5b4da1551054b946202f357e49bac11dfffa103a7f9aca76bb0",
+ "kind": "transparent"
+ },
+ {
+ "address": "0xEAA6d9f33c7095218Ed9cD4f0D7FB6551A14005f",
+ "txHash": "0x6fcfab1784dc615b4eebf081289c9ea1782e6347e03fe3a9ca8f7ae208dfb1bb",
+ "kind": "transparent"
+ },
+ {
+ "address": "0x350744AAa70aa8a45A860b64e48c910ceAC72cc4",
+ "txHash": "0x52868823914d59d54a5ecd23a8f12af3201026922de06351c92486136cf35c54",
+ "kind": "transparent"
+ },
+ {
+ "address": "0x655cae54f8bcb718275c7719259dc359d8253C62",
+ "txHash": "0x0b88303bf1a45fbbc6547da7375f216a677c72aa4e145d1c8b2b5de3f942a926",
+ "kind": "transparent"
+ }
+ ],
+ "impls": {
+ "6edc16d23a4d4f6c1904111ef9dc64f026946ac69ab9161a855c019e045fdfca": {
+ "address": "0x5246Ca73320051bDa0E12b10EE199357Ac77c441",
+ "txHash": "0x88b546cc1f5cc919756411d0004030e6660505ea14568cb8d565ee9e1f36becf",
+ "layout": {
+ "solcVersion": "0.8.20",
+ "storage": [],
+ "types": {
+ "t_bool": {
+ "label": "bool",
+ "numberOfBytes": "1"
+ },
+ "t_struct(InitializableStorage)64_storage": {
+ "label": "struct Initializable.InitializableStorage",
+ "members": [
+ {
+ "label": "_initialized",
+ "type": "t_uint64",
+ "offset": 0,
+ "slot": "0"
+ },
+ {
+ "label": "_initializing",
+ "type": "t_bool",
+ "offset": 8,
+ "slot": "0"
+ }
+ ],
+ "numberOfBytes": "32"
+ },
+ "t_uint64": {
+ "label": "uint64",
+ "numberOfBytes": "8"
+ }
+ },
+ "namespaces": {
+ "erc7201:openzeppelin.storage.Initializable": [
+ {
+ "contract": "Initializable",
+ "label": "_initialized",
+ "type": "t_uint64",
+ "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:69",
+ "offset": 0,
+ "slot": "0"
+ },
+ {
+ "contract": "Initializable",
+ "label": "_initializing",
+ "type": "t_bool",
+ "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:73",
+ "offset": 8,
+ "slot": "0"
+ }
+ ]
+ }
+ }
+ },
+ "71d135c444c577e77f23565934e5ef47a051f98194121da673ec1aa67993def6": {
+ "address": "0xDCe300034018A1632edFdd7C434F2900cc52d431",
+ "txHash": "0xfb0b81e05224c5999ff14355e5e4a6265b802c5df5236aa41da61948e1d43e59",
+ "layout": {
+ "solcVersion": "0.8.20",
+ "storage": [
+ {
+ "label": "_config",
+ "offset": 0,
+ "slot": "0",
+ "type": "t_contract(IProtocolConfig)7775",
+ "contract": "Configurable",
+ "src": "contracts/Configurable.sol:17"
+ },
+ {
+ "label": "__reserved",
+ "offset": 0,
+ "slot": "1",
+ "type": "t_array(t_uint256)49_storage",
+ "contract": "Configurable",
+ "src": "contracts/Configurable.sol:18"
+ },
+ {
+ "label": "_ratios",
+ "offset": 0,
+ "slot": "50",
+ "type": "t_mapping(t_address,t_uint256)",
+ "contract": "RatioFeed",
+ "src": "contracts/RatioFeed.sol:18"
+ },
+ {
+ "label": "historicalRatios",
+ "offset": 0,
+ "slot": "51",
+ "type": "t_mapping(t_address,t_struct(HistoricalRatios)7790_storage)",
+ "contract": "RatioFeed",
+ "src": "contracts/RatioFeed.sol:19"
+ },
+ {
+ "label": "ratioThreshold",
+ "offset": 0,
+ "slot": "52",
+ "type": "t_uint256",
+ "contract": "RatioFeed",
+ "src": "contracts/RatioFeed.sol:24"
+ },
+ {
+ "label": "_ratioUpdates",
+ "offset": 0,
+ "slot": "53",
+ "type": "t_mapping(t_address,t_uint256)",
+ "contract": "RatioFeed",
+ "src": "contracts/RatioFeed.sol:29"
+ }
+ ],
+ "types": {
+ "t_bool": {
+ "label": "bool",
+ "numberOfBytes": "1"
+ },
+ "t_struct(InitializableStorage)64_storage": {
+ "label": "struct Initializable.InitializableStorage",
+ "members": [
+ {
+ "label": "_initialized",
+ "type": "t_uint64",
+ "offset": 0,
+ "slot": "0"
+ },
+ {
+ "label": "_initializing",
+ "type": "t_bool",
+ "offset": 8,
+ "slot": "0"
+ }
+ ],
+ "numberOfBytes": "32"
+ },
+ "t_uint64": {
+ "label": "uint64",
+ "numberOfBytes": "8"
+ },
+ "t_address": {
+ "label": "address",
+ "numberOfBytes": "20"
+ },
+ "t_array(t_uint256)49_storage": {
+ "label": "uint256[49]",
+ "numberOfBytes": "1568"
+ },
+ "t_array(t_uint64)9_storage": {
+ "label": "uint64[9]",
+ "numberOfBytes": "96"
+ },
+ "t_contract(IProtocolConfig)7775": {
+ "label": "contract IProtocolConfig",
+ "numberOfBytes": "20"
+ },
+ "t_mapping(t_address,t_struct(HistoricalRatios)7790_storage)": {
+ "label": "mapping(address => struct IRatioFeed.HistoricalRatios)",
+ "numberOfBytes": "32"
+ },
+ "t_mapping(t_address,t_uint256)": {
+ "label": "mapping(address => uint256)",
+ "numberOfBytes": "32"
+ },
+ "t_struct(HistoricalRatios)7790_storage": {
+ "label": "struct IRatioFeed.HistoricalRatios",
+ "members": [
+ {
+ "label": "historicalRatios",
+ "type": "t_array(t_uint64)9_storage",
+ "offset": 0,
+ "slot": "0"
+ },
+ {
+ "label": "lastUpdate",
+ "type": "t_uint40",
+ "offset": 0,
+ "slot": "3"
+ }
+ ],
+ "numberOfBytes": "128"
+ },
+ "t_uint256": {
+ "label": "uint256",
+ "numberOfBytes": "32"
+ },
+ "t_uint40": {
+ "label": "uint40",
+ "numberOfBytes": "5"
+ }
+ },
+ "namespaces": {
+ "erc7201:openzeppelin.storage.Initializable": [
+ {
+ "contract": "Initializable",
+ "label": "_initialized",
+ "type": "t_uint64",
+ "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:69",
+ "offset": 0,
+ "slot": "0"
+ },
+ {
+ "contract": "Initializable",
+ "label": "_initializing",
+ "type": "t_bool",
+ "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:73",
+ "offset": 8,
+ "slot": "0"
+ }
+ ]
+ }
+ }
+ },
+ "035ad31b54f24db62a54b465c282779cd6f114940d9cf42674ce8c8e39bc73a3": {
+ "address": "0x5ad4070Ae3F4D8dae0935A32c6Bcfc374998F2d0",
+ "txHash": "0x2c49787d123b5b157a3c6b834d6cf9c14ff144c604384de8523f39fd7116657a",
+ "layout": {
+ "solcVersion": "0.8.20",
+ "storage": [
+ {
+ "label": "_config",
+ "offset": 0,
+ "slot": "0",
+ "type": "t_contract(IProtocolConfig)7970",
+ "contract": "Configurable",
+ "src": "contracts/Configurable.sol:17"
+ },
+ {
+ "label": "__reserved",
+ "offset": 0,
+ "slot": "1",
+ "type": "t_array(t_uint256)49_storage",
+ "contract": "Configurable",
+ "src": "contracts/Configurable.sol:18"
+ },
+ {
+ "label": "__gap",
+ "offset": 0,
+ "slot": "50",
+ "type": "t_array(t_uint256)50_storage",
+ "contract": "cToken",
+ "src": "contracts/cToken.sol:27"
+ }
+ ],
+ "types": {
+ "t_address": {
+ "label": "address",
+ "numberOfBytes": "20"
+ },
+ "t_bool": {
+ "label": "bool",
+ "numberOfBytes": "1"
+ },
+ "t_mapping(t_address,t_mapping(t_address,t_uint256))": {
+ "label": "mapping(address => mapping(address => uint256))",
+ "numberOfBytes": "32"
+ },
+ "t_mapping(t_address,t_uint256)": {
+ "label": "mapping(address => uint256)",
+ "numberOfBytes": "32"
+ },
+ "t_string_storage": {
+ "label": "string",
+ "numberOfBytes": "32"
+ },
+ "t_struct(ERC20Storage)144_storage": {
+ "label": "struct ERC20Upgradeable.ERC20Storage",
+ "members": [
+ {
+ "label": "_balances",
+ "type": "t_mapping(t_address,t_uint256)",
+ "offset": 0,
+ "slot": "0"
+ },
+ {
+ "label": "_allowances",
+ "type": "t_mapping(t_address,t_mapping(t_address,t_uint256))",
+ "offset": 0,
+ "slot": "1"
+ },
+ {
+ "label": "_totalSupply",
+ "type": "t_uint256",
+ "offset": 0,
+ "slot": "2"
+ },
+ {
+ "label": "_name",
+ "type": "t_string_storage",
+ "offset": 0,
+ "slot": "3"
+ },
+ {
+ "label": "_symbol",
+ "type": "t_string_storage",
+ "offset": 0,
+ "slot": "4"
+ }
+ ],
+ "numberOfBytes": "160"
+ },
+ "t_struct(InitializableStorage)64_storage": {
+ "label": "struct Initializable.InitializableStorage",
+ "members": [
+ {
+ "label": "_initialized",
+ "type": "t_uint64",
+ "offset": 0,
+ "slot": "0"
+ },
+ {
+ "label": "_initializing",
+ "type": "t_bool",
+ "offset": 8,
+ "slot": "0"
+ }
+ ],
+ "numberOfBytes": "32"
+ },
+ "t_struct(PausableStorage)259_storage": {
+ "label": "struct PausableUpgradeable.PausableStorage",
+ "members": [
+ {
+ "label": "_paused",
+ "type": "t_bool",
+ "offset": 0,
+ "slot": "0"
+ }
+ ],
+ "numberOfBytes": "32"
+ },
+ "t_uint256": {
+ "label": "uint256",
+ "numberOfBytes": "32"
+ },
+ "t_uint64": {
+ "label": "uint64",
+ "numberOfBytes": "8"
+ },
+ "t_array(t_uint256)49_storage": {
+ "label": "uint256[49]",
+ "numberOfBytes": "1568"
+ },
+ "t_array(t_uint256)50_storage": {
+ "label": "uint256[50]",
+ "numberOfBytes": "1600"
+ },
+ "t_contract(IProtocolConfig)7970": {
+ "label": "contract IProtocolConfig",
+ "numberOfBytes": "20"
+ }
+ },
+ "namespaces": {
+ "erc7201:openzeppelin.storage.Pausable": [
+ {
+ "contract": "PausableUpgradeable",
+ "label": "_paused",
+ "type": "t_bool",
+ "src": "@openzeppelin/contracts-upgradeable/utils/PausableUpgradeable.sol:21",
+ "offset": 0,
+ "slot": "0"
+ }
+ ],
+ "erc7201:openzeppelin.storage.ERC20": [
+ {
+ "contract": "ERC20Upgradeable",
+ "label": "_balances",
+ "type": "t_mapping(t_address,t_uint256)",
+ "src": "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol:38",
+ "offset": 0,
+ "slot": "0"
+ },
+ {
+ "contract": "ERC20Upgradeable",
+ "label": "_allowances",
+ "type": "t_mapping(t_address,t_mapping(t_address,t_uint256))",
+ "src": "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol:40",
+ "offset": 0,
+ "slot": "1"
+ },
+ {
+ "contract": "ERC20Upgradeable",
+ "label": "_totalSupply",
+ "type": "t_uint256",
+ "src": "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol:42",
+ "offset": 0,
+ "slot": "2"
+ },
+ {
+ "contract": "ERC20Upgradeable",
+ "label": "_name",
+ "type": "t_string_storage",
+ "src": "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol:44",
+ "offset": 0,
+ "slot": "3"
+ },
+ {
+ "contract": "ERC20Upgradeable",
+ "label": "_symbol",
+ "type": "t_string_storage",
+ "src": "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol:45",
+ "offset": 0,
+ "slot": "4"
+ }
+ ],
+ "erc7201:openzeppelin.storage.Initializable": [
+ {
+ "contract": "Initializable",
+ "label": "_initialized",
+ "type": "t_uint64",
+ "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:69",
+ "offset": 0,
+ "slot": "0"
+ },
+ {
+ "contract": "Initializable",
+ "label": "_initializing",
+ "type": "t_bool",
+ "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:73",
+ "offset": 8,
+ "slot": "0"
+ }
+ ]
+ }
+ }
+ },
+ "be9930084391335f8f79dd1a134c0fce0b070f5d2e9864e694ce783a626fc9f9": {
+ "address": "0x1f53d133ae2F92A0c175dFEA155f0B5a1848cA27",
+ "txHash": "0xb55b1eb53442f398e1c3d3eec5bc5a3ce611cf5cd7260c2c31a303c70248408f",
+ "layout": {
+ "solcVersion": "0.8.20",
+ "storage": [
+ {
+ "label": "_config",
+ "offset": 0,
+ "slot": "0",
+ "type": "t_contract(IProtocolConfig)7943",
+ "contract": "Configurable",
+ "src": "contracts/Configurable.sol:17"
+ },
+ {
+ "label": "__reserved",
+ "offset": 0,
+ "slot": "1",
+ "type": "t_array(t_uint256)49_storage",
+ "contract": "Configurable",
+ "src": "contracts/Configurable.sol:18"
+ },
+ {
+ "label": "_minStakeAmount",
+ "offset": 0,
+ "slot": "50",
+ "type": "t_uint256",
+ "contract": "RestakingPool",
+ "src": "contracts/RestakingPool.sol:31"
+ },
+ {
+ "label": "_minUnstakeAmount",
+ "offset": 0,
+ "slot": "51",
+ "type": "t_uint256",
+ "contract": "RestakingPool",
+ "src": "contracts/RestakingPool.sol:32"
+ },
+ {
+ "label": "_totalStaked",
+ "offset": 0,
+ "slot": "52",
+ "type": "t_uint256",
+ "contract": "RestakingPool",
+ "src": "contracts/RestakingPool.sol:37"
+ },
+ {
+ "label": "_totalUnstaked",
+ "offset": 0,
+ "slot": "53",
+ "type": "t_uint256",
+ "contract": "RestakingPool",
+ "src": "contracts/RestakingPool.sol:41"
+ },
+ {
+ "label": "_pendingGap",
+ "offset": 0,
+ "slot": "54",
+ "type": "t_uint256",
+ "contract": "RestakingPool",
+ "src": "contracts/RestakingPool.sol:46"
+ },
+ {
+ "label": "_pendingUnstakes",
+ "offset": 0,
+ "slot": "55",
+ "type": "t_array(t_struct(Unstake)8001_storage)dyn_storage",
+ "contract": "RestakingPool",
+ "src": "contracts/RestakingPool.sol:50"
+ },
+ {
+ "label": "_totalPendingUnstakes",
+ "offset": 0,
+ "slot": "56",
+ "type": "t_uint256",
+ "contract": "RestakingPool",
+ "src": "contracts/RestakingPool.sol:54"
+ },
+ {
+ "label": "_totalUnstakesOf",
+ "offset": 0,
+ "slot": "57",
+ "type": "t_mapping(t_address,t_uint256)",
+ "contract": "RestakingPool",
+ "src": "contracts/RestakingPool.sol:55"
+ },
+ {
+ "label": "_distributeGasLimit",
+ "offset": 0,
+ "slot": "58",
+ "type": "t_uint32",
+ "contract": "RestakingPool",
+ "src": "contracts/RestakingPool.sol:59"
+ },
+ {
+ "label": "_totalClaimable",
+ "offset": 0,
+ "slot": "59",
+ "type": "t_uint256",
+ "contract": "RestakingPool",
+ "src": "contracts/RestakingPool.sol:61"
+ },
+ {
+ "label": "_claimable",
+ "offset": 0,
+ "slot": "60",
+ "type": "t_mapping(t_address,t_uint256)",
+ "contract": "RestakingPool",
+ "src": "contracts/RestakingPool.sol:62"
+ },
+ {
+ "label": "_restakers",
+ "offset": 0,
+ "slot": "61",
+ "type": "t_mapping(t_bytes32,t_address)",
+ "contract": "RestakingPool",
+ "src": "contracts/RestakingPool.sol:67"
+ },
+ {
+ "label": "_maxTVL",
+ "offset": 0,
+ "slot": "62",
+ "type": "t_uint256",
+ "contract": "RestakingPool",
+ "src": "contracts/RestakingPool.sol:72"
+ },
+ {
+ "label": "__gap",
+ "offset": 0,
+ "slot": "63",
+ "type": "t_array(t_uint256)37_storage",
+ "contract": "RestakingPool",
+ "src": "contracts/RestakingPool.sol:79"
+ }
+ ],
+ "types": {
+ "t_bool": {
+ "label": "bool",
+ "numberOfBytes": "1"
+ },
+ "t_struct(InitializableStorage)64_storage": {
+ "label": "struct Initializable.InitializableStorage",
+ "members": [
+ {
+ "label": "_initialized",
+ "type": "t_uint64",
+ "offset": 0,
+ "slot": "0"
+ },
+ {
+ "label": "_initializing",
+ "type": "t_bool",
+ "offset": 8,
+ "slot": "0"
+ }
+ ],
+ "numberOfBytes": "32"
+ },
+ "t_struct(ReentrancyGuardStorage)320_storage": {
+ "label": "struct ReentrancyGuardUpgradeable.ReentrancyGuardStorage",
+ "members": [
+ {
+ "label": "_status",
+ "type": "t_uint256",
+ "offset": 0,
+ "slot": "0"
+ }
+ ],
+ "numberOfBytes": "32"
+ },
+ "t_uint256": {
+ "label": "uint256",
+ "numberOfBytes": "32"
+ },
+ "t_uint64": {
+ "label": "uint64",
+ "numberOfBytes": "8"
+ },
+ "t_address": {
+ "label": "address",
+ "numberOfBytes": "20"
+ },
+ "t_array(t_struct(Unstake)8001_storage)dyn_storage": {
+ "label": "struct IRestakingPool.Unstake[]",
+ "numberOfBytes": "32"
+ },
+ "t_array(t_uint256)37_storage": {
+ "label": "uint256[37]",
+ "numberOfBytes": "1184"
+ },
+ "t_array(t_uint256)49_storage": {
+ "label": "uint256[49]",
+ "numberOfBytes": "1568"
+ },
+ "t_bytes32": {
+ "label": "bytes32",
+ "numberOfBytes": "32"
+ },
+ "t_contract(IProtocolConfig)7943": {
+ "label": "contract IProtocolConfig",
+ "numberOfBytes": "20"
+ },
+ "t_mapping(t_address,t_uint256)": {
+ "label": "mapping(address => uint256)",
+ "numberOfBytes": "32"
+ },
+ "t_mapping(t_bytes32,t_address)": {
+ "label": "mapping(bytes32 => address)",
+ "numberOfBytes": "32"
+ },
+ "t_struct(Unstake)8001_storage": {
+ "label": "struct IRestakingPool.Unstake",
+ "members": [
+ {
+ "label": "recipient",
+ "type": "t_address",
+ "offset": 0,
+ "slot": "0"
+ },
+ {
+ "label": "amount",
+ "type": "t_uint256",
+ "offset": 0,
+ "slot": "1"
+ }
+ ],
+ "numberOfBytes": "64"
+ },
+ "t_uint32": {
+ "label": "uint32",
+ "numberOfBytes": "4"
+ }
+ },
+ "namespaces": {
+ "erc7201:openzeppelin.storage.ReentrancyGuard": [
+ {
+ "contract": "ReentrancyGuardUpgradeable",
+ "label": "_status",
+ "type": "t_uint256",
+ "src": "@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol:40",
+ "offset": 0,
+ "slot": "0"
+ }
+ ],
+ "erc7201:openzeppelin.storage.Initializable": [
+ {
+ "contract": "Initializable",
+ "label": "_initialized",
+ "type": "t_uint64",
+ "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:69",
+ "offset": 0,
+ "slot": "0"
+ },
+ {
+ "contract": "Initializable",
+ "label": "_initializing",
+ "type": "t_bool",
+ "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:73",
+ "offset": 8,
+ "slot": "0"
+ }
+ ]
+ }
+ }
+ },
+ "65da5c5ed178e80f7b24d95b3c524cc0677e732c08b627f280f4b00904c8753a": {
+ "address": "0xf3a256Fa737DfA75f209393d395F2e178a5eDb72",
+ "txHash": "0x6110e2cb3b8ab1cdc2f422814637aaf336d8c34a0628519e67716ee07ac07b11",
+ "layout": {
+ "solcVersion": "0.8.20",
+ "storage": [
+ {
+ "label": "_config",
+ "offset": 0,
+ "slot": "0",
+ "type": "t_contract(IProtocolConfig)7775",
+ "contract": "Configurable",
+ "src": "contracts/Configurable.sol:17"
+ },
+ {
+ "label": "__reserved",
+ "offset": 0,
+ "slot": "1",
+ "type": "t_array(t_uint256)49_storage",
+ "contract": "Configurable",
+ "src": "contracts/Configurable.sol:18"
+ },
+ {
+ "label": "commission",
+ "offset": 0,
+ "slot": "50",
+ "type": "t_uint16",
+ "contract": "FeeCollector",
+ "src": "contracts/FeeCollector.sol:21"
+ }
+ ],
+ "types": {
+ "t_bool": {
+ "label": "bool",
+ "numberOfBytes": "1"
+ },
+ "t_struct(InitializableStorage)64_storage": {
+ "label": "struct Initializable.InitializableStorage",
+ "members": [
+ {
+ "label": "_initialized",
+ "type": "t_uint64",
+ "offset": 0,
+ "slot": "0"
+ },
+ {
+ "label": "_initializing",
+ "type": "t_bool",
+ "offset": 8,
+ "slot": "0"
+ }
+ ],
+ "numberOfBytes": "32"
+ },
+ "t_struct(ReentrancyGuardStorage)320_storage": {
+ "label": "struct ReentrancyGuardUpgradeable.ReentrancyGuardStorage",
+ "members": [
+ {
+ "label": "_status",
+ "type": "t_uint256",
+ "offset": 0,
+ "slot": "0"
+ }
+ ],
+ "numberOfBytes": "32"
+ },
+ "t_uint256": {
+ "label": "uint256",
+ "numberOfBytes": "32"
+ },
+ "t_uint64": {
+ "label": "uint64",
+ "numberOfBytes": "8"
+ },
+ "t_array(t_uint256)49_storage": {
+ "label": "uint256[49]",
+ "numberOfBytes": "1568"
+ },
+ "t_contract(IProtocolConfig)7775": {
+ "label": "contract IProtocolConfig",
+ "numberOfBytes": "20"
+ },
+ "t_uint16": {
+ "label": "uint16",
+ "numberOfBytes": "2"
+ }
+ },
+ "namespaces": {
+ "erc7201:openzeppelin.storage.ReentrancyGuard": [
+ {
+ "contract": "ReentrancyGuardUpgradeable",
+ "label": "_status",
+ "type": "t_uint256",
+ "src": "@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol:40",
+ "offset": 0,
+ "slot": "0"
+ }
+ ],
+ "erc7201:openzeppelin.storage.Initializable": [
+ {
+ "contract": "Initializable",
+ "label": "_initialized",
+ "type": "t_uint64",
+ "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:69",
+ "offset": 0,
+ "slot": "0"
+ },
+ {
+ "contract": "Initializable",
+ "label": "_initializing",
+ "type": "t_bool",
+ "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:73",
+ "offset": 8,
+ "slot": "0"
+ }
+ ]
+ }
+ }
+ },
+ "497030db8d1cafbf65ac9afd19d4e778cfcdd70a4a62306b6cf6bed72821f0b5": {
+ "address": "0x0Abd655972eBb6b0B25b0023329759E3CC46697B",
+ "txHash": "0xdb676b4d2ea54b20dcff79e174a6fd04a778c2e16f4516c6ec8c75004fe22303",
+ "layout": {
+ "solcVersion": "0.8.20",
+ "storage": [
+ {
+ "label": "_selectorToTarget",
+ "offset": 0,
+ "slot": "0",
+ "type": "t_mapping(t_bytes4,t_enum(FuncTarget)11084)",
+ "contract": "RestakerFacets",
+ "src": "contracts/restaker/RestakerFacets.sol:18"
+ },
+ {
+ "label": "_podManager",
+ "offset": 0,
+ "slot": "1",
+ "type": "t_contract(IEigenPodManager)7800",
+ "contract": "RestakerFacets",
+ "src": "contracts/restaker/RestakerFacets.sol:19"
+ },
+ {
+ "label": "_delegationManager",
+ "offset": 0,
+ "slot": "2",
+ "type": "t_contract(IDelegationManager)7241",
+ "contract": "RestakerFacets",
+ "src": "contracts/restaker/RestakerFacets.sol:20"
+ }
+ ],
+ "types": {
+ "t_address": {
+ "label": "address",
+ "numberOfBytes": "20"
+ },
+ "t_bool": {
+ "label": "bool",
+ "numberOfBytes": "1"
+ },
+ "t_struct(InitializableStorage)64_storage": {
+ "label": "struct Initializable.InitializableStorage",
+ "members": [
+ {
+ "label": "_initialized",
+ "type": "t_uint64",
+ "offset": 0,
+ "slot": "0"
+ },
+ {
+ "label": "_initializing",
+ "type": "t_bool",
+ "offset": 8,
+ "slot": "0"
+ }
+ ],
+ "numberOfBytes": "32"
+ },
+ "t_struct(OwnableStorage)14_storage": {
+ "label": "struct OwnableUpgradeable.OwnableStorage",
+ "members": [
+ {
+ "label": "_owner",
+ "type": "t_address",
+ "offset": 0,
+ "slot": "0"
+ }
+ ],
+ "numberOfBytes": "32"
+ },
+ "t_uint64": {
+ "label": "uint64",
+ "numberOfBytes": "8"
+ },
+ "t_bytes4": {
+ "label": "bytes4",
+ "numberOfBytes": "4"
+ },
+ "t_contract(IDelegationManager)7241": {
+ "label": "contract IDelegationManager",
+ "numberOfBytes": "20"
+ },
+ "t_contract(IEigenPodManager)7800": {
+ "label": "contract IEigenPodManager",
+ "numberOfBytes": "20"
+ },
+ "t_enum(FuncTarget)11084": {
+ "label": "enum IRestakerFacets.FuncTarget",
+ "members": [
+ "POD",
+ "POD_MANAGER",
+ "DELEGATION_MANAGER"
+ ],
+ "numberOfBytes": "1"
+ },
+ "t_mapping(t_bytes4,t_enum(FuncTarget)11084)": {
+ "label": "mapping(bytes4 => enum IRestakerFacets.FuncTarget)",
+ "numberOfBytes": "32"
+ }
+ },
+ "namespaces": {
+ "erc7201:openzeppelin.storage.Ownable": [
+ {
+ "contract": "OwnableUpgradeable",
+ "label": "_owner",
+ "type": "t_address",
+ "src": "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol:24",
+ "offset": 0,
+ "slot": "0"
+ }
+ ],
+ "erc7201:openzeppelin.storage.Initializable": [
+ {
+ "contract": "Initializable",
+ "label": "_initialized",
+ "type": "t_uint64",
+ "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:69",
+ "offset": 0,
+ "slot": "0"
+ },
+ {
+ "contract": "Initializable",
+ "label": "_initializing",
+ "type": "t_bool",
+ "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:73",
+ "offset": 8,
+ "slot": "0"
+ }
+ ]
+ }
+ }
+ },
+ "4f146d0f312ca656685c98ada306961ee6ab5c4579c94b52b32e3a37bcf8e041": {
+ "address": "0xa3BC5EE6864749fbFB7A02ED5d06229b4c15ca3c",
+ "txHash": "0xdcc61c3fb75a197030032159035b117a0aadda4feea2e5bbcda3b2df5a427f1f",
+ "layout": {
+ "solcVersion": "0.8.20",
+ "storage": [
+ {
+ "label": "_facets",
+ "offset": 0,
+ "slot": "0",
+ "type": "t_contract(IRestakerFacets)10123",
+ "contract": "Restaker",
+ "src": "contracts/restaker/Restaker.sol:17"
+ },
+ {
+ "label": "_signer",
+ "offset": 0,
+ "slot": "1",
+ "type": "t_address",
+ "contract": "Restaker",
+ "src": "contracts/restaker/Restaker.sol:18"
+ }
+ ],
+ "types": {
+ "t_address": {
+ "label": "address",
+ "numberOfBytes": "20"
+ },
+ "t_bool": {
+ "label": "bool",
+ "numberOfBytes": "1"
+ },
+ "t_struct(InitializableStorage)64_storage": {
+ "label": "struct Initializable.InitializableStorage",
+ "members": [
+ {
+ "label": "_initialized",
+ "type": "t_uint64",
+ "offset": 0,
+ "slot": "0"
+ },
+ {
+ "label": "_initializing",
+ "type": "t_bool",
+ "offset": 8,
+ "slot": "0"
+ }
+ ],
+ "numberOfBytes": "32"
+ },
+ "t_struct(OwnableStorage)14_storage": {
+ "label": "struct OwnableUpgradeable.OwnableStorage",
+ "members": [
+ {
+ "label": "_owner",
+ "type": "t_address",
+ "offset": 0,
+ "slot": "0"
+ }
+ ],
+ "numberOfBytes": "32"
+ },
+ "t_uint64": {
+ "label": "uint64",
+ "numberOfBytes": "8"
+ },
+ "t_contract(IRestakerFacets)10123": {
+ "label": "contract IRestakerFacets",
+ "numberOfBytes": "20"
+ }
+ },
+ "namespaces": {
+ "erc7201:openzeppelin.storage.Ownable": [
+ {
+ "contract": "OwnableUpgradeable",
+ "label": "_owner",
+ "type": "t_address",
+ "src": "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol:24",
+ "offset": 0,
+ "slot": "0"
+ }
+ ],
+ "erc7201:openzeppelin.storage.Initializable": [
+ {
+ "contract": "Initializable",
+ "label": "_initialized",
+ "type": "t_uint64",
+ "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:69",
+ "offset": 0,
+ "slot": "0"
+ },
+ {
+ "contract": "Initializable",
+ "label": "_initializing",
+ "type": "t_bool",
+ "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:73",
+ "offset": 8,
+ "slot": "0"
+ }
+ ]
+ }
+ }
+ },
+ "29f9e02cb8bda0ba6a19f761e929466f36e4ca0b5cf6133e06f4ce250ac53e96": {
+ "address": "0x5d2DdAD50869e9f80b676bd5c0348e8a324a6265",
+ "txHash": "0x2da0bfba1eae7981eb35bc9948ff7e5970dab154ffd3e8afb76046f7b19b9eac",
+ "layout": {
+ "solcVersion": "0.8.20",
+ "storage": [
+ {
+ "label": "_config",
+ "offset": 0,
+ "slot": "0",
+ "type": "t_contract(IProtocolConfig)8609",
+ "contract": "Configurable",
+ "src": "contracts/Configurable.sol:17"
+ },
+ {
+ "label": "__reserved",
+ "offset": 0,
+ "slot": "1",
+ "type": "t_array(t_uint256)49_storage",
+ "contract": "Configurable",
+ "src": "contracts/Configurable.sol:18"
+ },
+ {
+ "label": "_minStakeAmount",
+ "offset": 0,
+ "slot": "50",
+ "type": "t_uint256",
+ "contract": "RestakingPool",
+ "src": "contracts/RestakingPool.sol:31"
+ },
+ {
+ "label": "_minUnstakeAmount",
+ "offset": 0,
+ "slot": "51",
+ "type": "t_uint256",
+ "contract": "RestakingPool",
+ "src": "contracts/RestakingPool.sol:32"
+ },
+ {
+ "label": "_totalStaked",
+ "offset": 0,
+ "slot": "52",
+ "type": "t_uint256",
+ "contract": "RestakingPool",
+ "src": "contracts/RestakingPool.sol:37"
+ },
+ {
+ "label": "_totalUnstaked",
+ "offset": 0,
+ "slot": "53",
+ "type": "t_uint256",
+ "contract": "RestakingPool",
+ "src": "contracts/RestakingPool.sol:41"
+ },
+ {
+ "label": "_pendingGap",
+ "offset": 0,
+ "slot": "54",
+ "type": "t_uint256",
+ "contract": "RestakingPool",
+ "src": "contracts/RestakingPool.sol:46"
+ },
+ {
+ "label": "_pendingUnstakes",
+ "offset": 0,
+ "slot": "55",
+ "type": "t_array(t_struct(Unstake)8686_storage)dyn_storage",
+ "contract": "RestakingPool",
+ "src": "contracts/RestakingPool.sol:50"
+ },
+ {
+ "label": "_totalPendingUnstakes",
+ "offset": 0,
+ "slot": "56",
+ "type": "t_uint256",
+ "contract": "RestakingPool",
+ "src": "contracts/RestakingPool.sol:54"
+ },
+ {
+ "label": "_totalUnstakesOf",
+ "offset": 0,
+ "slot": "57",
+ "type": "t_mapping(t_address,t_uint256)",
+ "contract": "RestakingPool",
+ "src": "contracts/RestakingPool.sol:55"
+ },
+ {
+ "label": "_distributeGasLimit",
+ "offset": 0,
+ "slot": "58",
+ "type": "t_uint32",
+ "contract": "RestakingPool",
+ "src": "contracts/RestakingPool.sol:59"
+ },
+ {
+ "label": "_totalClaimable",
+ "offset": 0,
+ "slot": "59",
+ "type": "t_uint256",
+ "contract": "RestakingPool",
+ "src": "contracts/RestakingPool.sol:61"
+ },
+ {
+ "label": "_claimable",
+ "offset": 0,
+ "slot": "60",
+ "type": "t_mapping(t_address,t_uint256)",
+ "contract": "RestakingPool",
+ "src": "contracts/RestakingPool.sol:62"
+ },
+ {
+ "label": "_restakers",
+ "offset": 0,
+ "slot": "61",
+ "type": "t_mapping(t_bytes32,t_address)",
+ "contract": "RestakingPool",
+ "src": "contracts/RestakingPool.sol:67"
+ },
+ {
+ "label": "_maxTVL",
+ "offset": 0,
+ "slot": "62",
+ "type": "t_uint256",
+ "contract": "RestakingPool",
+ "src": "contracts/RestakingPool.sol:72"
+ },
+ {
+ "label": "__gap",
+ "offset": 0,
+ "slot": "63",
+ "type": "t_array(t_uint256)37_storage",
+ "contract": "RestakingPool",
+ "src": "contracts/RestakingPool.sol:79"
+ }
+ ],
+ "types": {
+ "t_bool": {
+ "label": "bool",
+ "numberOfBytes": "1"
+ },
+ "t_struct(InitializableStorage)64_storage": {
+ "label": "struct Initializable.InitializableStorage",
+ "members": [
+ {
+ "label": "_initialized",
+ "type": "t_uint64",
+ "offset": 0,
+ "slot": "0"
+ },
+ {
+ "label": "_initializing",
+ "type": "t_bool",
+ "offset": 8,
+ "slot": "0"
+ }
+ ],
+ "numberOfBytes": "32"
+ },
+ "t_struct(ReentrancyGuardStorage)320_storage": {
+ "label": "struct ReentrancyGuardUpgradeable.ReentrancyGuardStorage",
+ "members": [
+ {
+ "label": "_status",
+ "type": "t_uint256",
+ "offset": 0,
+ "slot": "0"
+ }
+ ],
+ "numberOfBytes": "32"
+ },
+ "t_uint256": {
+ "label": "uint256",
+ "numberOfBytes": "32"
+ },
+ "t_uint64": {
+ "label": "uint64",
+ "numberOfBytes": "8"
+ },
+ "t_address": {
+ "label": "address",
+ "numberOfBytes": "20"
+ },
+ "t_array(t_struct(Unstake)8686_storage)dyn_storage": {
+ "label": "struct IRestakingPool.Unstake[]",
+ "numberOfBytes": "32"
+ },
+ "t_array(t_uint256)37_storage": {
+ "label": "uint256[37]",
+ "numberOfBytes": "1184"
+ },
+ "t_array(t_uint256)49_storage": {
+ "label": "uint256[49]",
+ "numberOfBytes": "1568"
+ },
+ "t_bytes32": {
+ "label": "bytes32",
+ "numberOfBytes": "32"
+ },
+ "t_contract(IProtocolConfig)8609": {
+ "label": "contract IProtocolConfig",
+ "numberOfBytes": "20"
+ },
+ "t_mapping(t_address,t_uint256)": {
+ "label": "mapping(address => uint256)",
+ "numberOfBytes": "32"
+ },
+ "t_mapping(t_bytes32,t_address)": {
+ "label": "mapping(bytes32 => address)",
+ "numberOfBytes": "32"
+ },
+ "t_struct(Unstake)8686_storage": {
+ "label": "struct IRestakingPool.Unstake",
+ "members": [
+ {
+ "label": "recipient",
+ "type": "t_address",
+ "offset": 0,
+ "slot": "0"
+ },
+ {
+ "label": "amount",
+ "type": "t_uint256",
+ "offset": 0,
+ "slot": "1"
+ }
+ ],
+ "numberOfBytes": "64"
+ },
+ "t_uint32": {
+ "label": "uint32",
+ "numberOfBytes": "4"
+ }
+ },
+ "namespaces": {
+ "erc7201:openzeppelin.storage.ReentrancyGuard": [
+ {
+ "contract": "ReentrancyGuardUpgradeable",
+ "label": "_status",
+ "type": "t_uint256",
+ "src": "@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol:40",
+ "offset": 0,
+ "slot": "0"
+ }
+ ],
+ "erc7201:openzeppelin.storage.Initializable": [
+ {
+ "contract": "Initializable",
+ "label": "_initialized",
+ "type": "t_uint64",
+ "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:69",
+ "offset": 0,
+ "slot": "0"
+ },
+ {
+ "contract": "Initializable",
+ "label": "_initializing",
+ "type": "t_bool",
+ "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:73",
+ "offset": 8,
+ "slot": "0"
+ }
+ ]
+ }
+ }
+ },
+ "affdaec18cf9db0d6f42d6167a62d16fcdd0a085239b9ebd7beb8d492630e178": {
+ "address": "0xaf10Aa96fECeAF6309EDc4357a4bbC94773312fE",
+ "txHash": "0x957b03739d9f3e92f82b615d09e0a0f5a9bee19bdeb850c352b9ccd40aa60132",
+ "layout": {
+ "solcVersion": "0.8.20",
+ "storage": [
+ {
+ "label": "_selectorToTarget",
+ "offset": 0,
+ "slot": "0",
+ "type": "t_mapping(t_bytes4,t_enum(FuncTarget)10103)",
+ "contract": "RestakerFacets",
+ "src": "contracts/restaker/RestakerFacets.sol:18"
+ },
+ {
+ "label": "_podManager",
+ "offset": 0,
+ "slot": "1",
+ "type": "t_contract(IEigenPodManager)7827",
+ "contract": "RestakerFacets",
+ "src": "contracts/restaker/RestakerFacets.sol:19"
+ },
+ {
+ "label": "_delegationManager",
+ "offset": 0,
+ "slot": "2",
+ "type": "t_contract(IDelegationManager)7268",
+ "contract": "RestakerFacets",
+ "src": "contracts/restaker/RestakerFacets.sol:20"
+ }
+ ],
+ "types": {
+ "t_address": {
+ "label": "address",
+ "numberOfBytes": "20"
+ },
+ "t_bool": {
+ "label": "bool",
+ "numberOfBytes": "1"
+ },
+ "t_struct(InitializableStorage)64_storage": {
+ "label": "struct Initializable.InitializableStorage",
+ "members": [
+ {
+ "label": "_initialized",
+ "type": "t_uint64",
+ "offset": 0,
+ "slot": "0"
+ },
+ {
+ "label": "_initializing",
+ "type": "t_bool",
+ "offset": 8,
+ "slot": "0"
+ }
+ ],
+ "numberOfBytes": "32"
+ },
+ "t_struct(OwnableStorage)14_storage": {
+ "label": "struct OwnableUpgradeable.OwnableStorage",
+ "members": [
+ {
+ "label": "_owner",
+ "type": "t_address",
+ "offset": 0,
+ "slot": "0"
+ }
+ ],
+ "numberOfBytes": "32"
+ },
+ "t_uint64": {
+ "label": "uint64",
+ "numberOfBytes": "8"
+ },
+ "t_bytes4": {
+ "label": "bytes4",
+ "numberOfBytes": "4"
+ },
+ "t_contract(IDelegationManager)7268": {
+ "label": "contract IDelegationManager",
+ "numberOfBytes": "20"
+ },
+ "t_contract(IEigenPodManager)7827": {
+ "label": "contract IEigenPodManager",
+ "numberOfBytes": "20"
+ },
+ "t_enum(FuncTarget)10103": {
+ "label": "enum IRestakerFacets.FuncTarget",
+ "members": [
+ "POD",
+ "POD_MANAGER",
+ "DELEGATION_MANAGER"
+ ],
+ "numberOfBytes": "1"
+ },
+ "t_mapping(t_bytes4,t_enum(FuncTarget)10103)": {
+ "label": "mapping(bytes4 => enum IRestakerFacets.FuncTarget)",
+ "numberOfBytes": "32"
+ }
+ },
+ "namespaces": {
+ "erc7201:openzeppelin.storage.Ownable": [
+ {
+ "contract": "OwnableUpgradeable",
+ "label": "_owner",
+ "type": "t_address",
+ "src": "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol:24",
+ "offset": 0,
+ "slot": "0"
+ }
+ ],
+ "erc7201:openzeppelin.storage.Initializable": [
+ {
+ "contract": "Initializable",
+ "label": "_initialized",
+ "type": "t_uint64",
+ "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:69",
+ "offset": 0,
+ "slot": "0"
+ },
+ {
+ "contract": "Initializable",
+ "label": "_initializing",
+ "type": "t_bool",
+ "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:73",
+ "offset": 8,
+ "slot": "0"
+ }
+ ]
+ }
+ }
+ },
+ "263678939318159cce1993df1dcd2675f9fb1428e23da6735e7c696c9ed84bdd": {
+ "address": "0x87a2fEc143f6b9f444Adb4b853776434B6C00BA5",
+ "txHash": "0x03201d0cee90e055ff79d2ffc7fc216132117538394980fe69495ceb45792797",
+ "layout": {
+ "solcVersion": "0.8.20",
+ "storage": [
+ {
+ "label": "_config",
+ "offset": 0,
+ "slot": "0",
+ "type": "t_contract(IProtocolConfig)6125",
+ "contract": "Configurable",
+ "src": "contracts/Configurable.sol:17"
+ },
+ {
+ "label": "__reserved",
+ "offset": 0,
+ "slot": "1",
+ "type": "t_array(t_uint256)49_storage",
+ "contract": "Configurable",
+ "src": "contracts/Configurable.sol:18"
+ },
+ {
+ "label": "_name",
+ "offset": 0,
+ "slot": "50",
+ "type": "t_string_storage",
+ "contract": "cToken",
+ "src": "contracts/cToken.sol:22"
+ },
+ {
+ "label": "_symbol",
+ "offset": 0,
+ "slot": "51",
+ "type": "t_string_storage",
+ "contract": "cToken",
+ "src": "contracts/cToken.sol:23"
+ },
+ {
+ "label": "__gap",
+ "offset": 0,
+ "slot": "52",
+ "type": "t_array(t_uint256)48_storage",
+ "contract": "cToken",
+ "src": "contracts/cToken.sol:30"
+ }
+ ],
+ "types": {
+ "t_address": {
+ "label": "address",
+ "numberOfBytes": "20"
+ },
+ "t_bool": {
+ "label": "bool",
+ "numberOfBytes": "1"
+ },
+ "t_mapping(t_address,t_mapping(t_address,t_uint256))": {
+ "label": "mapping(address => mapping(address => uint256))",
+ "numberOfBytes": "32"
+ },
+ "t_mapping(t_address,t_uint256)": {
+ "label": "mapping(address => uint256)",
+ "numberOfBytes": "32"
+ },
+ "t_string_storage": {
+ "label": "string",
+ "numberOfBytes": "32"
+ },
+ "t_struct(ERC20Storage)90_storage": {
+ "label": "struct ERC20Upgradeable.ERC20Storage",
+ "members": [
+ {
+ "label": "_balances",
+ "type": "t_mapping(t_address,t_uint256)",
+ "offset": 0,
+ "slot": "0"
+ },
+ {
+ "label": "_allowances",
+ "type": "t_mapping(t_address,t_mapping(t_address,t_uint256))",
+ "offset": 0,
+ "slot": "1"
+ },
+ {
+ "label": "_totalSupply",
+ "type": "t_uint256",
+ "offset": 0,
+ "slot": "2"
+ },
+ {
+ "label": "_name",
+ "type": "t_string_storage",
+ "offset": 0,
+ "slot": "3"
+ },
+ {
+ "label": "_symbol",
+ "type": "t_string_storage",
+ "offset": 0,
+ "slot": "4"
+ }
+ ],
+ "numberOfBytes": "160"
+ },
+ "t_struct(InitializableStorage)10_storage": {
+ "label": "struct Initializable.InitializableStorage",
+ "members": [
+ {
+ "label": "_initialized",
+ "type": "t_uint64",
+ "offset": 0,
+ "slot": "0"
+ },
+ {
+ "label": "_initializing",
+ "type": "t_bool",
+ "offset": 8,
+ "slot": "0"
+ }
+ ],
+ "numberOfBytes": "32"
+ },
+ "t_struct(PausableStorage)205_storage": {
+ "label": "struct PausableUpgradeable.PausableStorage",
+ "members": [
+ {
+ "label": "_paused",
+ "type": "t_bool",
+ "offset": 0,
+ "slot": "0"
+ }
+ ],
+ "numberOfBytes": "32"
+ },
+ "t_uint256": {
+ "label": "uint256",
+ "numberOfBytes": "32"
+ },
+ "t_uint64": {
+ "label": "uint64",
+ "numberOfBytes": "8"
+ },
+ "t_array(t_uint256)48_storage": {
+ "label": "uint256[48]",
+ "numberOfBytes": "1536"
+ },
+ "t_array(t_uint256)49_storage": {
+ "label": "uint256[49]",
+ "numberOfBytes": "1568"
+ },
+ "t_contract(IProtocolConfig)6125": {
+ "label": "contract IProtocolConfig",
+ "numberOfBytes": "20"
+ }
+ },
+ "namespaces": {
+ "erc7201:openzeppelin.storage.Pausable": [
+ {
+ "contract": "PausableUpgradeable",
+ "label": "_paused",
+ "type": "t_bool",
+ "src": "@openzeppelin/contracts-upgradeable/utils/PausableUpgradeable.sol:21",
+ "offset": 0,
+ "slot": "0"
+ }
+ ],
+ "erc7201:openzeppelin.storage.ERC20": [
+ {
+ "contract": "ERC20Upgradeable",
+ "label": "_balances",
+ "type": "t_mapping(t_address,t_uint256)",
+ "src": "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol:38",
+ "offset": 0,
+ "slot": "0"
+ },
+ {
+ "contract": "ERC20Upgradeable",
+ "label": "_allowances",
+ "type": "t_mapping(t_address,t_mapping(t_address,t_uint256))",
+ "src": "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol:40",
+ "offset": 0,
+ "slot": "1"
+ },
+ {
+ "contract": "ERC20Upgradeable",
+ "label": "_totalSupply",
+ "type": "t_uint256",
+ "src": "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol:42",
+ "offset": 0,
+ "slot": "2"
+ },
+ {
+ "contract": "ERC20Upgradeable",
+ "label": "_name",
+ "type": "t_string_storage",
+ "src": "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol:44",
+ "offset": 0,
+ "slot": "3"
+ },
+ {
+ "contract": "ERC20Upgradeable",
+ "label": "_symbol",
+ "type": "t_string_storage",
+ "src": "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol:45",
+ "offset": 0,
+ "slot": "4"
+ }
+ ],
+ "erc7201:openzeppelin.storage.Initializable": [
+ {
+ "contract": "Initializable",
+ "label": "_initialized",
+ "type": "t_uint64",
+ "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:69",
+ "offset": 0,
+ "slot": "0"
+ },
+ {
+ "contract": "Initializable",
+ "label": "_initializing",
+ "type": "t_bool",
+ "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:73",
+ "offset": 8,
+ "slot": "0"
+ }
+ ]
+ }
+ }
+ },
+ "9c521865d27ce662b67f30bd0faa85078c0cac04c5c0e16d685ebafdbb0cbfd4": {
+ "address": "0x5A5fE78A7C23BA25096Cf079D43FCDD32d91f78d",
+ "txHash": "0x0069f265dee885eceb865348a3567880dbd40b9c9ce2af4bb2cbbec345f97c0e",
+ "layout": {
+ "solcVersion": "0.8.20",
+ "storage": [
+ {
+ "label": "_config",
+ "offset": 0,
+ "slot": "0",
+ "type": "t_contract(IProtocolConfig)7411",
+ "contract": "Configurable",
+ "src": "contracts/Configurable.sol:17"
+ },
+ {
+ "label": "__reserved",
+ "offset": 0,
+ "slot": "1",
+ "type": "t_array(t_uint256)49_storage",
+ "contract": "Configurable",
+ "src": "contracts/Configurable.sol:18"
+ },
+ {
+ "label": "_minStakeAmount",
+ "offset": 0,
+ "slot": "50",
+ "type": "t_uint256",
+ "contract": "RestakingPool",
+ "src": "contracts/RestakingPool.sol:37"
+ },
+ {
+ "label": "_minUnstakeAmount",
+ "offset": 0,
+ "slot": "51",
+ "type": "t_uint256",
+ "contract": "RestakingPool",
+ "src": "contracts/RestakingPool.sol:38"
+ },
+ {
+ "label": "_totalStaked",
+ "offset": 0,
+ "slot": "52",
+ "type": "t_uint256",
+ "contract": "RestakingPool",
+ "src": "contracts/RestakingPool.sol:43"
+ },
+ {
+ "label": "_totalUnstaked",
+ "offset": 0,
+ "slot": "53",
+ "type": "t_uint256",
+ "contract": "RestakingPool",
+ "src": "contracts/RestakingPool.sol:47"
+ },
+ {
+ "label": "_pendingGap",
+ "offset": 0,
+ "slot": "54",
+ "type": "t_uint256",
+ "contract": "RestakingPool",
+ "src": "contracts/RestakingPool.sol:52"
+ },
+ {
+ "label": "_pendingUnstakes",
+ "offset": 0,
+ "slot": "55",
+ "type": "t_array(t_struct(Unstake)7469_storage)dyn_storage",
+ "contract": "RestakingPool",
+ "src": "contracts/RestakingPool.sol:56"
+ },
+ {
+ "label": "_totalPendingUnstakes",
+ "offset": 0,
+ "slot": "56",
+ "type": "t_uint256",
+ "contract": "RestakingPool",
+ "src": "contracts/RestakingPool.sol:60"
+ },
+ {
+ "label": "_totalUnstakesOf",
+ "offset": 0,
+ "slot": "57",
+ "type": "t_mapping(t_address,t_uint256)",
+ "contract": "RestakingPool",
+ "src": "contracts/RestakingPool.sol:61"
+ },
+ {
+ "label": "_distributeGasLimit",
+ "offset": 0,
+ "slot": "58",
+ "type": "t_uint32",
+ "contract": "RestakingPool",
+ "src": "contracts/RestakingPool.sol:65"
+ },
+ {
+ "label": "_totalClaimable",
+ "offset": 0,
+ "slot": "59",
+ "type": "t_uint256",
+ "contract": "RestakingPool",
+ "src": "contracts/RestakingPool.sol:67"
+ },
+ {
+ "label": "_claimable",
+ "offset": 0,
+ "slot": "60",
+ "type": "t_mapping(t_address,t_uint256)",
+ "contract": "RestakingPool",
+ "src": "contracts/RestakingPool.sol:68"
+ },
+ {
+ "label": "_restakers",
+ "offset": 0,
+ "slot": "61",
+ "type": "t_mapping(t_bytes32,t_address)",
+ "contract": "RestakingPool",
+ "src": "contracts/RestakingPool.sol:73"
+ },
+ {
+ "label": "_maxTVL",
+ "offset": 0,
+ "slot": "62",
+ "type": "t_uint256",
+ "contract": "RestakingPool",
+ "src": "contracts/RestakingPool.sol:78"
+ },
+ {
+ "label": "stakeBonusAmount",
+ "offset": 0,
+ "slot": "63",
+ "type": "t_uint256",
+ "contract": "RestakingPool",
+ "src": "contracts/RestakingPool.sol:83"
+ },
+ {
+ "label": "targetCapacity",
+ "offset": 0,
+ "slot": "64",
+ "type": "t_uint64",
+ "contract": "RestakingPool",
+ "src": "contracts/RestakingPool.sol:85"
+ },
+ {
+ "label": "maxBonusRate",
+ "offset": 8,
+ "slot": "64",
+ "type": "t_uint64",
+ "contract": "RestakingPool",
+ "src": "contracts/RestakingPool.sol:86"
+ },
+ {
+ "label": "optimalBonusRate",
+ "offset": 16,
+ "slot": "64",
+ "type": "t_uint64",
+ "contract": "RestakingPool",
+ "src": "contracts/RestakingPool.sol:87"
+ },
+ {
+ "label": "stakeUtilizationKink",
+ "offset": 24,
+ "slot": "64",
+ "type": "t_uint64",
+ "contract": "RestakingPool",
+ "src": "contracts/RestakingPool.sol:88"
+ },
+ {
+ "label": "maxFlashFeeRate",
+ "offset": 0,
+ "slot": "65",
+ "type": "t_uint64",
+ "contract": "RestakingPool",
+ "src": "contracts/RestakingPool.sol:90"
+ },
+ {
+ "label": "optimalUnstakeRate",
+ "offset": 8,
+ "slot": "65",
+ "type": "t_uint64",
+ "contract": "RestakingPool",
+ "src": "contracts/RestakingPool.sol:91"
+ },
+ {
+ "label": "unstakeUtilizationKink",
+ "offset": 16,
+ "slot": "65",
+ "type": "t_uint64",
+ "contract": "RestakingPool",
+ "src": "contracts/RestakingPool.sol:92"
+ },
+ {
+ "label": "protocolFee",
+ "offset": 24,
+ "slot": "65",
+ "type": "t_uint64",
+ "contract": "RestakingPool",
+ "src": "contracts/RestakingPool.sol:93"
+ },
+ {
+ "label": "__gap",
+ "offset": 0,
+ "slot": "66",
+ "type": "t_array(t_uint256)34_storage",
+ "contract": "RestakingPool",
+ "src": "contracts/RestakingPool.sol:100"
+ }
+ ],
+ "types": {
+ "t_bool": {
+ "label": "bool",
+ "numberOfBytes": "1"
+ },
+ "t_struct(InitializableStorage)64_storage": {
+ "label": "struct Initializable.InitializableStorage",
+ "members": [
+ {
+ "label": "_initialized",
+ "type": "t_uint64",
+ "offset": 0,
+ "slot": "0"
+ },
+ {
+ "label": "_initializing",
+ "type": "t_bool",
+ "offset": 8,
+ "slot": "0"
+ }
+ ],
+ "numberOfBytes": "32"
+ },
+ "t_struct(ReentrancyGuardStorage)320_storage": {
+ "label": "struct ReentrancyGuardUpgradeable.ReentrancyGuardStorage",
+ "members": [
+ {
+ "label": "_status",
+ "type": "t_uint256",
+ "offset": 0,
+ "slot": "0"
+ }
+ ],
+ "numberOfBytes": "32"
+ },
+ "t_uint256": {
+ "label": "uint256",
+ "numberOfBytes": "32"
+ },
+ "t_uint64": {
+ "label": "uint64",
+ "numberOfBytes": "8"
+ },
+ "t_address": {
+ "label": "address",
+ "numberOfBytes": "20"
+ },
+ "t_array(t_struct(Unstake)7469_storage)dyn_storage": {
+ "label": "struct IRestakingPool.Unstake[]",
+ "numberOfBytes": "32"
+ },
+ "t_array(t_uint256)34_storage": {
+ "label": "uint256[34]",
+ "numberOfBytes": "1088"
+ },
+ "t_array(t_uint256)49_storage": {
+ "label": "uint256[49]",
+ "numberOfBytes": "1568"
+ },
+ "t_bytes32": {
+ "label": "bytes32",
+ "numberOfBytes": "32"
+ },
+ "t_contract(IProtocolConfig)7411": {
+ "label": "contract IProtocolConfig",
+ "numberOfBytes": "20"
+ },
+ "t_mapping(t_address,t_uint256)": {
+ "label": "mapping(address => uint256)",
+ "numberOfBytes": "32"
+ },
+ "t_mapping(t_bytes32,t_address)": {
+ "label": "mapping(bytes32 => address)",
+ "numberOfBytes": "32"
+ },
+ "t_struct(Unstake)7469_storage": {
+ "label": "struct IRestakingPool.Unstake",
+ "members": [
+ {
+ "label": "recipient",
+ "type": "t_address",
+ "offset": 0,
+ "slot": "0"
+ },
+ {
+ "label": "amount",
+ "type": "t_uint256",
+ "offset": 0,
+ "slot": "1"
+ }
+ ],
+ "numberOfBytes": "64"
+ },
+ "t_uint32": {
+ "label": "uint32",
+ "numberOfBytes": "4"
+ }
+ },
+ "namespaces": {
+ "erc7201:openzeppelin.storage.ReentrancyGuard": [
+ {
+ "contract": "ReentrancyGuardUpgradeable",
+ "label": "_status",
+ "type": "t_uint256",
+ "src": "@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol:40",
+ "offset": 0,
+ "slot": "0"
+ }
+ ],
+ "erc7201:openzeppelin.storage.Initializable": [
+ {
+ "contract": "Initializable",
+ "label": "_initialized",
+ "type": "t_uint64",
+ "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:69",
+ "offset": 0,
+ "slot": "0"
+ },
+ {
+ "contract": "Initializable",
+ "label": "_initializing",
+ "type": "t_bool",
+ "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:73",
+ "offset": 8,
+ "slot": "0"
+ }
+ ]
+ }
+ }
+ }
+ }
+}
diff --git a/projects/tests/omnivault-rebalancer/.solcover.js b/projects/tests/omnivault-rebalancer/.solcover.js
new file mode 100644
index 00000000..167afbcc
--- /dev/null
+++ b/projects/tests/omnivault-rebalancer/.solcover.js
@@ -0,0 +1,30 @@
+module.exports = {
+ skipFiles: [
+ "bridge-lz/mock/",
+ "restaking-pool/interfaces/",
+ "restaking-pool/libraries/",
+ "restaking-pool/mock/",
+ "restaking-pool/restaker/",
+ "restaking-pool/Configurable.sol",
+ "restaking-pool/cToken.sol",
+ "restaking-pool/FeeCollector.sol",
+ "restaking-pool/ProtocolConfig.sol",
+ "restaking-pool/RatioFeed.sol",
+ "restaking-pool/RestakingPool.sol",
+ "restaking-pool/XERC20Lockbox.sol",
+ "vaults/assets-handler/InceptionAssetsHandler.sol",
+ "vaults/assets-handler/InceptionERC20OmniAssetsHandler.sol",
+ "vaults/eigenlayer-handler/",
+ "vaults/interfaces/",
+ "vaults/lib/",
+ "vaults/mock/",
+ "vaults/restaker/",
+ "vaults/tests/",
+ "vaults/tokens/",
+ "vaults/vaults/inEth/",
+ "vaults/vaults/vault_e1/",
+ "vaults/vaults/vault_e2/",
+ "vaults/vaults/InceptionERC20OmniVault.sol",
+ "vaults/vaults/InceptionVault.sol",
+ ]
+};
\ No newline at end of file
diff --git a/projects/tests/omnivault-rebalancer/hardhat.config.ts b/projects/tests/omnivault-rebalancer/hardhat.config.ts
new file mode 100644
index 00000000..6208dc75
--- /dev/null
+++ b/projects/tests/omnivault-rebalancer/hardhat.config.ts
@@ -0,0 +1,61 @@
+import "dotenv";
+import { HardhatUserConfig } from "hardhat/config";
+import { CONFIG } from "../../../hh.config";
+import "@nomicfoundation/hardhat-toolbox";
+import "@layerzerolabs/test-devtools-evm-hardhat";
+import "hardhat-gas-reporter";
+import "hardhat-deploy";
+import "@openzeppelin/hardhat-upgrades";
+import fse from "fs-extra";
+import path from "path";
+
+const TARGET_DIR = "./contracts";
+const EXTERNAL_PROJECTS = ["../../bridge-lz", "../../restaking-pool", "../../vaults"];
+
+const copyContracts = () => {
+ EXTERNAL_PROJECTS.forEach(project => {
+ const srcDir = path.resolve(project + "/contracts");
+ const dstDir = path.join(TARGET_DIR, path.basename(project));
+ console.log("src dir:", srcDir);
+ console.log("dst dir:", dstDir);
+
+ //Clear old contracts
+ fse.removeSync(dstDir);
+ fse.ensureDirSync(dstDir);
+
+ //Cope
+ fse.copySync(srcDir, dstDir, { overwrite: true });
+ });
+};
+copyContracts();
+
+const config: HardhatUserConfig = {
+ ...(CONFIG as HardhatUserConfig),
+ networks: {
+ hardhat: {
+ forking: {
+ url: process.env.MAINNET_RPC,
+ blockNumber: 20810000,
+ },
+ addresses: {
+ restakingPoolConfig: "0x81b98D3a51d4aC35e0ae132b0CF6b50EA1Da2603",
+ restakingPool: "0x46199cAa0e453971cedf97f926368d9E5415831a",
+ lib: "0x8a6a8a7233b16d0ecaa7510bfd110464a0d69f66",
+ cToken: "0xf073bAC22DAb7FaF4a3Dd6c6189a70D54110525C",
+ ratioFeed: "0x122ee24Cb3Cc1b6B987800D3B54A68FC16910Dbf",
+ lockbox: "0xb86d7BfB30E4e9552Ba1Dd6208284667DF2E8c0E",
+ },
+ },
+ },
+ solidity: {
+ version: "0.8.27",
+ settings: {
+ optimizer: {
+ enabled: true,
+ runs: 200,
+ },
+ },
+ },
+};
+
+export default config;
diff --git a/projects/tests/omnivault-rebalancer/package.json b/projects/tests/omnivault-rebalancer/package.json
new file mode 100644
index 00000000..a75cf3bc
--- /dev/null
+++ b/projects/tests/omnivault-rebalancer/package.json
@@ -0,0 +1,51 @@
+{
+ "name": "omnivault-integration-tests-l1",
+ "version": "1.0.0",
+ "description": "",
+ "directories": {
+ "test": "test"
+ },
+ "scripts": {
+ "format": "prettier --write test/*.ts test/*.js"
+ },
+ "author": "",
+ "license": "ISC",
+ "devDependencies": {
+ "@layerzerolabs/lz-evm-protocol-v2": "^2.3.39",
+ "@layerzerolabs/lz-evm-messagelib-v2": "^2.3.39",
+ "@layerzerolabs/lz-v2-utilities": "^2.3.39",
+ "@layerzerolabs/oapp-evm": "^0.0.4",
+ "@layerzerolabs/oft-evm": "^0.0.11",
+ "@layerzerolabs/test-devtools-evm-hardhat": "~0.3.0",
+ "@nomicfoundation/hardhat-chai-matchers": "^2.0.2",
+ "@nomicfoundation/hardhat-ethers": "^3.0.5",
+ "@nomicfoundation/hardhat-network-helpers": "^1.0.9",
+ "@nomicfoundation/hardhat-toolbox": "^4.0.0",
+ "@nomicfoundation/hardhat-verify": "^2.0.5",
+ "@nomiclabs/hardhat-ethers": "^2.2.3",
+ "@openzeppelin/contracts": "^5.0.0",
+ "@openzeppelin/contracts-upgradeable": "^5.0.0",
+ "@openzeppelin/hardhat-upgrades": "^3.0.0",
+ "prettier": "3.3.2",
+ "@typechain/ethers-v6": "^0.5.1",
+ "@typechain/hardhat": "^9.1.0",
+ "@types/chai": "^4.3.11",
+ "@types/fs-extra": "^11.0.4",
+ "@types/mocha": "^10.0.6",
+ "@types/node": "^20.10.1",
+ "chai": "^4.2.0",
+ "dotenv": "^16.3.1",
+ "ethereumjs-util": "^7.1.5",
+ "ethers": "^6.9.0",
+ "fs-extra": "^11.2.0",
+ "hardhat": "^2.19.1",
+ "hardhat-deploy": "^0.11.45",
+ "hardhat-gas-reporter": "^1.0.9",
+ "hardhat-tracer": "^2.7.0",
+ "solidity-bytes-utils": "^0.8.2",
+ "solidity-coverage": "^0.8.13",
+ "ts-node": "^10.9.1",
+ "typechain": "^8.3.2",
+ "typescript": "^5.2.2"
+ }
+}
diff --git a/projects/tests/omnivault-rebalancer/test/Rebalancer.test.ts b/projects/tests/omnivault-rebalancer/test/Rebalancer.test.ts
new file mode 100644
index 00000000..70558e0a
--- /dev/null
+++ b/projects/tests/omnivault-rebalancer/test/Rebalancer.test.ts
@@ -0,0 +1,2807 @@
+import { ethers, network, upgrades } from "hardhat";
+import { expect } from "chai";
+import { takeSnapshot } from "@nomicfoundation/hardhat-network-helpers";
+import { e18, getSlotByName, randomBI, randomBIMax, toWei } from "./helpers/utils.js";
+import { SnapshotRestorer } from "@nomicfoundation/hardhat-network-helpers/src/helpers/takeSnapshot";
+import { AbiCoder, Signer } from "ethers";
+import { Options } from "@layerzerolabs/lz-v2-utilities";
+import {
+ CToken,
+ EndpointMock,
+ InceptionOmniVault,
+ InceptionRatioFeed,
+ InceptionToken,
+ LZCrossChainAdapterL1,
+ LZCrossChainAdapterL2,
+ NativeRebalancer,
+ ProtocolConfig,
+ RatioFeed,
+ RestakingPool,
+} from "../typechain-types";
+import { anyValue } from "@nomicfoundation/hardhat-chai-matchers/withArgs";
+
+BigInt.prototype.format = function () {
+ return this.toLocaleString("de-DE");
+};
+
+const ARB_ID = 42161n;
+const OPT_ID = 10n;
+const ETH_ID = 1n;
+const ARB_EID = 30101n;
+const OPT_EID = 30110n;
+const ETH_EID = 30111n;
+const eIds = [ETH_EID, ARB_EID, OPT_EID];
+const chainIds = [ETH_ID, ARB_ID, OPT_ID];
+const options = Options.newOptions().addExecutorLzReceiveOption(200_000n, 0n).toHex().toString();
+
+describe("Omnivault integration tests", function () {
+ this.timeout(150000);
+ //Adapters
+ let adapterEth: LZCrossChainAdapterL1;
+ let maliciousAdapterL1: LZCrossChainAdapterL1;
+ let adapterArb: LZCrossChainAdapterL2;
+ let adapterOpt: LZCrossChainAdapterL2;
+ let ethEndpoint: EndpointMock;
+ let arbEndpoint: EndpointMock;
+ let optEndpoint: EndpointMock;
+ let maliciousAdapterL2: LZCrossChainAdapterL2;
+ //L1
+ let ratioFeedL1: RatioFeed;
+ let inEth: CToken;
+ let rebalancer: NativeRebalancer;
+ let restakingPool: RestakingPool;
+ let restakingPoolConfig: ProtocolConfig;
+ //L2
+ let iToken: InceptionToken;
+ let omniVault: InceptionOmniVault;
+ let ratioFeedL2: InceptionRatioFeed;
+
+ let owner: Signer;
+ let operator: Signer;
+ let treasury: Signer;
+ let signer1: Signer;
+ let signer2: Signer;
+ let signer3: Signer;
+ let target: Signer;
+
+ let snapshot: SnapshotRestorer;
+ let lockboxAddress: String;
+
+ let TARGET = toWei(10);
+
+ async function init(owner: Signer, operator: Signer) {
+ const block = await ethers.provider.getBlock("latest");
+ console.log(`Starting at block number: ${block.number}`);
+ lockboxAddress = network.config.addresses.lockbox;
+
+ // ____ _ _ _ _
+ // / ___|_ __ ___ ___ ___ ___| |__ __ _(_)_ __ __ _ __| | __ _ _ __ | |_ ___ _ __ ___
+ // | | | '__/ _ \/ __/ __|/ __| '_ \ / _` | | '_ \ / _` |/ _` |/ _` | '_ \| __/ _ \ '__/ __|
+ // | |___| | | (_) \__ \__ \ (__| | | | (_| | | | | | | (_| | (_| | (_| | |_) | || __/ | \__ \
+ // \____|_| \___/|___/___/\___|_| |_|\__,_|_|_| |_| \__,_|\__,_|\__,_| .__/ \__\___|_| |___/
+ // |_|
+ console.log("============ Crosschain adapters ============");
+ console.log("=== CrossChainAdapterL1");
+ const ethEndpoint = await ethers.deployContract("EndpointMock", [ETH_EID]);
+ ethEndpoint.address = await ethEndpoint.getAddress();
+ const LZCrossChainAdapterL1 = await ethers.getContractFactory("LZCrossChainAdapterL1");
+ const adapterEth = await upgrades.deployProxy(LZCrossChainAdapterL1, [
+ ethEndpoint.address,
+ owner.address,
+ eIds,
+ chainIds,
+ ]);
+ adapterEth.address = await adapterEth.getAddress();
+
+ console.log("=== Arbitrum LZCrossChainAdapterL2");
+ const arbEndpoint = await ethers.deployContract("EndpointMock", [ARB_EID]);
+ arbEndpoint.address = await arbEndpoint.getAddress();
+ const LZCrossChainAdapterL2 = await ethers.getContractFactory("LZCrossChainAdapterL2");
+ const adapterArb = await upgrades.deployProxy(LZCrossChainAdapterL2, [
+ arbEndpoint.address,
+ owner.address,
+ ETH_ID,
+ eIds,
+ chainIds,
+ ]);
+ adapterArb.address = await adapterArb.getAddress();
+ adapterArb.sendData = async function (timestamp, vaultBalance, totalSupply) {
+ const message = encodePayload(timestamp, vaultBalance, totalSupply);
+ const fees = await this.quote(message, options);
+ return await this.sendDataL1(message, options, { value: fees });
+ };
+
+ console.log("=== Optimism LZCrossChainAdapterL2");
+ const optEndpoint = await ethers.deployContract("EndpointMock", [OPT_EID]);
+ optEndpoint.address = await optEndpoint.getAddress();
+ const adapterOpt = await upgrades.deployProxy(LZCrossChainAdapterL2, [
+ optEndpoint.address,
+ owner.address,
+ ETH_ID,
+ eIds,
+ chainIds,
+ ]);
+ adapterOpt.address = await adapterOpt.getAddress();
+ adapterOpt.sendData = async function (timestamp, vaultBalance, totalSupply) {
+ const message = encodePayload(timestamp, vaultBalance, totalSupply);
+ const fees = await this.quote(message, options);
+ return await this.sendDataL1(message, options, { value: fees });
+ };
+
+ //Connect endpoints
+ await arbEndpoint.setDestLzEndpoint(adapterEth.address, ethEndpoint.address);
+ await optEndpoint.setDestLzEndpoint(adapterEth.address, ethEndpoint.address);
+ await ethEndpoint.setDestLzEndpoint(adapterArb.address, arbEndpoint.address);
+ await ethEndpoint.setDestLzEndpoint(adapterOpt.address, optEndpoint.address);
+
+ //Malicious adapters
+ const maliciousAdapterL1 = await upgrades.deployProxy(LZCrossChainAdapterL1, [
+ ethEndpoint.address,
+ owner.address,
+ eIds,
+ chainIds,
+ ]);
+ maliciousAdapterL1.address = await maliciousAdapterL1.getAddress();
+
+ const maliciousAdapterL2 = await upgrades.deployProxy(LZCrossChainAdapterL2, [
+ arbEndpoint.address,
+ owner.address,
+ ETH_ID,
+ eIds,
+ chainIds,
+ ]);
+ maliciousAdapterL2.address = await maliciousAdapterL2.getAddress();
+
+ // ____ _ _ _ _ _ _
+ // | _ \ ___ ___| |_ __ _| | _(_)_ __ __ _ _ __ ___ ___ | | | | / |
+ // | |_) / _ \/ __| __/ _` | |/ / | '_ \ / _` | | '_ \ / _ \ / _ \| | | | | |
+ // | _ < __/\__ \ || (_| | <| | | | | (_| | | |_) | (_) | (_) | | | |___| |
+ // |_| \_\___||___/\__\__,_|_|\_\_|_| |_|\__, | | .__/ \___/ \___/|_| |_____|_|
+ // |___/ |_|
+ console.log("============ Restaking Pool Layer1 ============");
+ console.log("=== ProtocolConfig");
+ const protocolConfigAdminAddress = await upgrades.erc1967.getAdminAddress(
+ network.config.addresses.restakingPoolConfig,
+ );
+ let slot = "0x" + (0).toString(16);
+ let value = ethers.zeroPadValue(owner.address, 32);
+ await network.provider.send("hardhat_setStorageAt", [protocolConfigAdminAddress, slot, value]);
+
+ const ProtocolConfig = await ethers.getContractFactory("ProtocolConfig", owner);
+ const restakingPoolConfig = await upgrades.upgradeProxy(
+ network.config.addresses.restakingPoolConfig,
+ ProtocolConfig,
+ );
+ //Updating governance address
+ slot = "0x" + getSlotByName("genesis.config.Governance");
+ value = ethers.zeroPadValue(owner.address, 32);
+ await network.provider.send("hardhat_setStorageAt", [network.config.addresses.restakingPoolConfig, slot, value]);
+
+ console.log("=== RestakingPool");
+ const restakingPoolAdminAddress = await upgrades.erc1967.getAdminAddress(network.config.addresses.restakingPool);
+ slot = "0x" + (0).toString(16);
+ value = ethers.zeroPadValue(owner.address, 32);
+ await network.provider.send("hardhat_setStorageAt", [restakingPoolAdminAddress, slot, value]);
+ const RestakingPool = await ethers.getContractFactory("RestakingPool", {
+ signer: owner,
+ libraries: { InceptionLibrary: network.config.addresses.lib },
+ });
+ await upgrades.forceImport(network.config.addresses.restakingPool, RestakingPool);
+ const restakingPool = await upgrades.upgradeProxy(network.config.addresses.restakingPool, RestakingPool, {
+ unsafeAllowLinkedLibraries: true,
+ });
+ restakingPool.address = await restakingPool.getAddress();
+
+ console.log("=== cToken");
+ const cTokenAdminAddress = await upgrades.erc1967.getAdminAddress(network.config.addresses.cToken);
+ slot = "0x" + (0).toString(16);
+ value = ethers.zeroPadValue(owner.address, 32);
+ await network.provider.send("hardhat_setStorageAt", [cTokenAdminAddress, slot, value]);
+ const CToken = await ethers.getContractFactory("cToken", owner);
+ const cToken = await upgrades.upgradeProxy(network.config.addresses.cToken, CToken);
+ cToken.address = await cToken.getAddress();
+
+ console.log("=== RatioFeed");
+ const ratioFeedAdminAddress = await upgrades.erc1967.getAdminAddress(network.config.addresses.ratioFeed);
+ slot = "0x" + (0).toString(16);
+ value = ethers.zeroPadValue(owner.address, 32);
+ await network.provider.send("hardhat_setStorageAt", [ratioFeedAdminAddress, slot, value]);
+ const RatioFeed = await ethers.getContractFactory("RatioFeed", owner);
+ const ratioFeedL1 = await upgrades.upgradeProxy(network.config.addresses.ratioFeed, RatioFeed);
+ ratioFeedL1.address = await ratioFeedL1.getAddress();
+
+ console.log("=== NativeRebalancer");
+ const Rebalancer = await ethers.getContractFactory("NativeRebalancer");
+ const rebalancer = await upgrades.deployProxy(Rebalancer, [
+ cToken.address,
+ lockboxAddress,
+ restakingPool.address,
+ adapterEth.address,
+ ratioFeedL1.address,
+ operator.address,
+ ]);
+ rebalancer.address = await rebalancer.getAddress();
+ await rebalancer.connect(owner).addChainId(ARB_ID);
+ await rebalancer.connect(owner).addChainId(OPT_ID);
+ await restakingPoolConfig.connect(owner).setRebalancer(rebalancer.address);
+
+ // ___ ___ __ _ _ _ ____
+ // / _ \ _ __ ___ _ __ (_) \ / /_ _ _ _| | |_ | | |___ \
+ // | | | | '_ ` _ \| '_ \| |\ \ / / _` | | | | | __| | | __) |
+ // | |_| | | | | | | | | | | \ V / (_| | |_| | | |_ | |___ / __/
+ // \___/|_| |_| |_|_| |_|_| \_/ \__,_|\__,_|_|\__| |_____|_____|
+ //
+ console.log("============ OmniVault Layer2 ============");
+ console.log("=== iToken");
+ const iTokenFactory = await ethers.getContractFactory("InceptionToken", owner);
+ const iToken = await upgrades.deployProxy(iTokenFactory, ["TEST InceptionLRT Token", "tINt"]);
+ await iToken.waitForDeployment();
+ iToken.address = await iToken.getAddress();
+
+ console.log("=== InceptionRatioFeed");
+ const iRatioFeedFactory = await ethers.getContractFactory("InceptionRatioFeed", owner);
+ const ratioFeedL2 = await upgrades.deployProxy(iRatioFeedFactory, []);
+ await ratioFeedL2.waitForDeployment();
+ ratioFeedL2.address = await ratioFeedL2.getAddress();
+ await (await ratioFeedL2.updateRatioBatch([iToken.address], [e18])).wait();
+
+ console.log("=== OmniVault");
+ const omniVaultFactory = await ethers.getContractFactory("InceptionOmniVault", owner);
+ const omniVault = await upgrades.deployProxy(
+ omniVaultFactory,
+ ["OmniVault", operator.address, iToken.address, adapterArb.address],
+ { initializer: "__InceptionOmniVault_init" },
+ );
+ omniVault.address = await omniVault.getAddress();
+ await omniVault.setRatioFeed(ratioFeedL2.address);
+ await omniVault.setTreasuryAddress(treasury.address);
+ await iToken.setVault(omniVault.address);
+
+ //Adapters final setup
+ await adapterEth.setTargetReceiver(rebalancer.address);
+ await adapterEth.setPeer(ARB_EID, ethers.zeroPadValue(adapterArb.address, 32));
+ await adapterEth.setPeer(OPT_EID, ethers.zeroPadValue(adapterOpt.address, 32));
+ await adapterArb.setTargetReceiver(omniVault.address);
+ await adapterArb.setPeer(ETH_EID, ethers.zeroPadValue(adapterEth.address, 32));
+ await adapterOpt.setTargetReceiver(omniVault.address);
+ await adapterOpt.setPeer(ETH_EID, ethers.zeroPadValue(adapterEth.address, 32));
+ await maliciousAdapterL1.setPeer(ARB_EID, ethers.zeroPadValue(adapterArb.address, 32));
+ await maliciousAdapterL2.setPeer(ETH_EID, ethers.zeroPadValue(adapterEth.address, 32));
+
+ return [
+ adapterEth,
+ ethEndpoint,
+ adapterArb,
+ arbEndpoint,
+ adapterOpt,
+ optEndpoint,
+ cToken,
+ rebalancer,
+ ratioFeedL1,
+ restakingPool,
+ restakingPoolConfig,
+ iToken,
+ ratioFeedL2,
+ omniVault,
+ maliciousAdapterL1,
+ maliciousAdapterL2,
+ ];
+ }
+
+ async function addReplenishBonusToOmniVault(amount) {
+ if (amount > 0n) {
+ expect(await iToken.balanceOf(signer3.address)).to.be.eq(0n);
+ await omniVault.connect(signer3).deposit(signer3.address, { value: amount });
+ const shares = await iToken.balanceOf(signer3.address);
+ await omniVault.connect(signer3).flashWithdraw(shares, signer3.address);
+ }
+ return await omniVault.depositBonusAmount();
+ }
+
+ function encodePayload(timestamp, ethAmount, totalSupply) {
+ const abiCoder = new AbiCoder();
+ return abiCoder.encode(["uint256", "uint256", "uint256"], [timestamp, totalSupply, ethAmount]);
+ }
+
+ before(async function () {
+ [owner, operator, treasury, signer1, signer2, signer3, target] = await ethers.getSigners();
+ [
+ adapterEth,
+ ethEndpoint,
+ adapterArb,
+ arbEndpoint,
+ adapterOpt,
+ optEndpoint,
+ inEth,
+ rebalancer,
+ ratioFeedL1,
+ restakingPool,
+ restakingPoolConfig,
+ iToken,
+ ratioFeedL2,
+ omniVault,
+ maliciousAdapterL1,
+ maliciousAdapterL2,
+ ] = await init(owner, operator);
+
+ snapshot = await takeSnapshot();
+ });
+
+ describe("Restaking pool", function () {
+ describe("After deployments checks", function () {
+ before(async function () {
+ await snapshot.restore();
+ });
+
+ it("Signer can stake", async function () {
+ await restakingPool.connect(signer1)["stake()"]({ value: 2n * e18 });
+ });
+
+ it("Get min stake amount", async function () {
+ console.log("Min stake amount: ", await restakingPool.getMinStake());
+ });
+ });
+ });
+
+ describe("Rebalancer", function () {
+ describe("Deployments checks", function () {
+ let NativeRebalancer;
+ before(async function () {
+ await snapshot.restore();
+ NativeRebalancer = await ethers.getContractFactory("NativeRebalancer");
+ });
+
+ it("MULTIPLIER", async function () {
+ expect(await rebalancer.MULTIPLIER()).to.be.eq(e18);
+ });
+
+ it("Inception token address", async function () {
+ expect(await rebalancer.inceptionToken()).to.be.eq(inEth.address);
+ });
+
+ it("Lockbox address", async function () {
+ expect(await rebalancer.lockboxAddress()).to.be.eq(lockboxAddress);
+ });
+
+ it("Restaking pool address", async function () {
+ expect(await rebalancer.liqPool()).to.be.eq(restakingPool.address);
+ });
+
+ it("Default adapter", async function () {
+ expect(await rebalancer.defaultAdapter()).to.be.eq(adapterEth.address);
+ });
+
+ it("Ratio feed address", async function () {
+ expect(await rebalancer.ratioFeed()).to.be.eq(ratioFeedL1.address);
+ });
+
+ it("Operator address", async function () {
+ expect(await rebalancer.operator()).to.be.eq(operator.address);
+ });
+
+ it("Owner", async function () {
+ expect(await rebalancer.owner()).to.be.eq(owner.address);
+ });
+
+ const args = [
+ {
+ name: "invalid iToken address",
+ args: () => [
+ ethers.ZeroAddress,
+ lockboxAddress,
+ restakingPool.address,
+ adapterEth.address,
+ ratioFeedL1.address,
+ operator.address,
+ ],
+ },
+ {
+ name: "invalid lockbox address",
+ args: () => [
+ iToken.address,
+ ethers.ZeroAddress,
+ restakingPool.address,
+ adapterEth.address,
+ ratioFeedL1.address,
+ operator.address,
+ ],
+ },
+ {
+ name: "invalid restaking pool address",
+ args: () => [
+ iToken.address,
+ lockboxAddress,
+ ethers.ZeroAddress,
+ adapterEth.address,
+ ratioFeedL1.address,
+ operator.address,
+ ],
+ },
+ {
+ name: "invalid adapter address",
+ args: () => [
+ iToken.address,
+ lockboxAddress,
+ restakingPool.address,
+ ethers.ZeroAddress,
+ ratioFeedL1.address,
+ operator.address,
+ ],
+ },
+ {
+ name: "invalid ratio feed address",
+ args: () => [
+ iToken.address,
+ lockboxAddress,
+ restakingPool.address,
+ adapterEth.address,
+ ethers.ZeroAddress,
+ operator.address,
+ ],
+ },
+ {
+ name: "invalid operator address",
+ args: () => [
+ iToken.address,
+ lockboxAddress,
+ restakingPool.address,
+ adapterEth.address,
+ ratioFeedL1.address,
+ ethers.ZeroAddress,
+ ],
+ },
+ ];
+
+ args.forEach(function (arg) {
+ it(`NativeRebalancer: ${arg.name}`, async function () {
+ const args = arg.args();
+ await expect(upgrades.deployProxy(NativeRebalancer, args)).to.be.reverted;
+ });
+ });
+ });
+
+ describe("Getters and setters", function () {
+ beforeEach(async function () {
+ await snapshot.restore();
+ });
+
+ const setters = [
+ {
+ name: "default adapter address",
+ setter: "setDefaultAdapter",
+ getter: "defaultAdapter",
+ event: "DefaultBridgeChanged",
+ },
+ {
+ name: "Inception token address",
+ setter: "setInceptionToken",
+ getter: "inceptionToken",
+ event: "InceptionTokenChanged",
+ },
+ {
+ name: "restaking pool address",
+ setter: "setLiqPool",
+ getter: "liqPool",
+ event: "LiqPoolChanged",
+ },
+ {
+ name: "lockbox address",
+ setter: "setLockboxAddress",
+ getter: "lockboxAddress",
+ event: "LockboxChanged",
+ },
+ {
+ name: "operator address",
+ setter: "setOperator",
+ getter: "operator",
+ event: "OperatorChanged",
+ },
+ ];
+
+ setters.forEach(function (arg) {
+ it(`Set new ${arg.name}`, async function () {
+ const prevValue = await rebalancer[arg.getter]();
+ const newValue = ethers.Wallet.createRandom().address;
+ await expect(rebalancer[arg.setter](newValue)).to.emit(rebalancer, arg.event).withArgs(prevValue, newValue);
+
+ expect(await rebalancer[arg.getter]()).to.be.eq(newValue);
+ });
+
+ it(`Reverts: ${arg.setter} when called by not an owner`, async function () {
+ const newValue = ethers.Wallet.createRandom().address;
+ await expect(rebalancer.connect(signer1)[arg.setter](newValue))
+ .to.be.revertedWithCustomError(rebalancer, "OwnableUnauthorizedAccount")
+ .withArgs(signer1.address);
+ });
+
+ it(`Reverts: ${arg.setter} new value is 0 address`, async function () {
+ const newValue = ethers.ZeroAddress;
+ await expect(rebalancer[arg.setter](newValue)).to.be.revertedWithCustomError(
+ rebalancer,
+ "SettingZeroAddress",
+ );
+ });
+ });
+
+ it("addChainId operator can", async function () {
+ let chain = randomBI(4);
+ await expect(rebalancer.connect(operator).addChainId(chain))
+ .to.emit(rebalancer, "ChainIdAdded")
+ .withArgs(chain);
+ expect(await rebalancer.chainIds(2n)).to.be.eq(chain);
+ });
+
+ it("addChainId skips if the chain has been added already", async function () {
+ let chain = randomBI(4);
+ await rebalancer.connect(operator).addChainId(chain);
+ await expect(rebalancer.connect(operator).addChainId(chain)).to.not.emit(rebalancer, "ChainIdAdded");
+ });
+
+ it("addChainId reverts when called by not an owner", async function () {
+ await expect(rebalancer.connect(signer1).addChainId(randomBI(4))).to.be.revertedWithCustomError(
+ rebalancer,
+ "OnlyOperator",
+ );
+ });
+
+ it("deleteChainId operator can delete the 1st chain in the list", async function () {
+ const chain = ARB_ID;
+ await expect(rebalancer.connect(operator).deleteChainId(chain))
+ .to.emit(rebalancer, "ChainIdDeleted")
+ .withArgs(chain, 0n);
+ expect(await rebalancer.chainIds(0n)).to.be.eq(OPT_ID);
+ await expect(rebalancer.chainIds(1n)).to.be.reverted;
+ });
+
+ it("deleteChainId owner can delete the last chain in the list", async function () {
+ const chain = OPT_ID;
+ await expect(rebalancer.connect(owner).deleteChainId(chain))
+ .to.emit(rebalancer, "ChainIdDeleted")
+ .withArgs(chain, 1n);
+ expect(await rebalancer.chainIds(0n)).to.be.eq(ARB_ID);
+ await expect(rebalancer.chainIds(1n)).to.be.reverted;
+ });
+
+ it("deleteChainId reverts when chain does not exist", async function () {
+ let chain = randomBI(4);
+ await expect(rebalancer.connect(operator).deleteChainId(chain))
+ .to.be.revertedWithCustomError(rebalancer, "ChainIdNotFound")
+ .withArgs(chain);
+ });
+
+ it("addChainId reverts when called by not an owner", async function () {
+ await expect(rebalancer.connect(signer1).deleteChainId(ARB_ID)).to.be.revertedWithCustomError(
+ rebalancer,
+ "OnlyOperator",
+ );
+ });
+
+ it("addAdapter for a new chain", async function () {
+ let adapter = ethers.Wallet.createRandom().address;
+ let chain = randomBI(4);
+ await expect(rebalancer.connect(owner).addAdapter(chain, adapter))
+ .to.emit(rebalancer, "AdapterAdded")
+ .withArgs(chain, adapter)
+ .and.to.emit(rebalancer, "ChainIdAdded")
+ .withArgs(chain);
+
+ const [adapterAddress, isDefault] = await rebalancer.getAdapter(chain);
+ expect(adapterAddress).to.be.eq(adapter);
+ expect(isDefault).to.be.false;
+ });
+
+ it("addAdapter for existing chain", async function () {
+ let adapter = ethers.Wallet.createRandom().address;
+ let chain = ARB_ID;
+ await expect(rebalancer.connect(owner).addAdapter(chain, adapter))
+ .to.emit(rebalancer, "AdapterAdded")
+ .withArgs(chain, adapter)
+ .and.to.not.emit(rebalancer, "ChainIdAdded");
+
+ const [adapterAddress, isDefault] = await rebalancer.getAdapter(chain);
+ expect(adapterAddress).to.be.eq(adapter);
+ expect(isDefault).to.be.false;
+ });
+
+ it("addAdapter reverts when adapter address is 0", async function () {
+ let adapter = ethers.ZeroAddress;
+ let chain = randomBI(4);
+ await expect(rebalancer.connect(owner).addAdapter(chain, adapter)).to.be.revertedWithCustomError(
+ rebalancer,
+ "SettingZeroAddress",
+ );
+ });
+
+ it("addAdapter reverts when called by not an owner", async function () {
+ let adapter = ethers.Wallet.createRandom().address;
+ let chain = randomBI(4);
+ await expect(rebalancer.connect(signer1).addAdapter(chain, adapter))
+ .to.be.revertedWithCustomError(rebalancer, "OwnableUnauthorizedAccount")
+ .withArgs(signer1.address);
+ });
+
+ it("getAdapter returns default adapter if no other set", async function () {
+ const [adapterAddress, isDefault] = await rebalancer.getAdapter(ARB_ID);
+ expect(adapterAddress).to.be.eq(adapterEth.address);
+ expect(isDefault).to.be.true;
+ });
+
+ it("getTransactionData when there is no data for the chain", async function () {
+ let chain = randomBI(4);
+ const txData = await rebalancer.getTransactionData(chain);
+ expect(txData.timestamp).to.be.eq(0n);
+ expect(txData.ethBalance).to.be.eq(0n);
+ expect(txData.inceptionTokenBalance).to.be.eq(0n);
+ });
+ });
+
+ describe("Update data", function () {
+ let initialArbAmount, initialArbSupply;
+ let initialOptAmount, initialOptSupply;
+
+ before(async function () {
+ await snapshot.restore();
+ const amount = 2n * e18;
+ await restakingPool.connect(signer1)["stake()"]({ value: amount });
+ const initialAmount = await inEth.balanceOf(lockboxAddress);
+ initialArbAmount = initialAmount / 2n;
+ initialArbSupply = initialAmount / 2n;
+ initialOptAmount = initialAmount - initialArbAmount;
+ initialOptSupply = initialAmount - initialArbAmount;
+ });
+
+ it("Reverts when there is no data for one of the chains", async function () {
+ //Call when there is no data at all
+ await expect(rebalancer.updateTreasuryData()).to.revertedWithCustomError(
+ rebalancer,
+ "MissingOneOrMoreL2Transactions",
+ );
+
+ const block = await ethers.provider.getBlock("latest");
+ const timestamp = block.timestamp;
+ const balance = randomBI(19);
+ const totalSupply = randomBI(19);
+ const message = encodePayload(timestamp, balance, totalSupply);
+
+ //Send data for the 1 chain of 2
+ const fees = await adapterArb.quote(message, options);
+ await adapterArb.sendDataL1(message, options, { value: fees });
+ await expect(rebalancer.updateTreasuryData())
+ .to.revertedWithCustomError(rebalancer, "MissingOneOrMoreL2Transactions")
+ .withArgs(OPT_ID);
+ });
+
+ const args = [
+ {
+ name: "Increase amount and supply ARB and OPT",
+ arb: {
+ l2BalanceDiff: () => ethers.parseEther("1.5"),
+ l2TotalSupplyDiff: () => e18,
+ },
+ opt: {
+ l2BalanceDiff: () => ethers.parseEther("1.5"),
+ l2TotalSupplyDiff: () => e18,
+ },
+ },
+ {
+ name: "Increase only inEth supply ARB",
+ arb: {
+ l2BalanceDiff: () => 0n,
+ l2TotalSupplyDiff: () => ethers.parseEther("1.5"),
+ },
+ },
+ {
+ name: "Increase only inEth supply OPT",
+ opt: {
+ l2BalanceDiff: () => 0n,
+ l2TotalSupplyDiff: () => ethers.parseEther("1.5"),
+ },
+ },
+ {
+ name: "Decrease amount and total supply ARB only",
+ arb: {
+ l2BalanceDiff: () => -ethers.parseEther("0.5"),
+ l2TotalSupplyDiff: () => -ethers.parseEther("0.5"),
+ },
+ },
+ {
+ name: "Decrease amount and total supply OPT only",
+ opt: {
+ l2BalanceDiff: () => -ethers.parseEther("0.5"),
+ l2TotalSupplyDiff: () => -ethers.parseEther("0.5"),
+ },
+ },
+ {
+ name: "Decrease only total supply ARB abd OPT",
+ arb: {
+ l2BalanceDiff: () => 0n,
+ l2TotalSupplyDiff: () => -e18,
+ },
+ opt: {
+ l2BalanceDiff: () => 0n,
+ l2TotalSupplyDiff: () => -e18,
+ },
+ },
+ {
+ name: "Increase for ARB and decrease for OPT for the same amount",
+ arb: {
+ l2BalanceDiff: () => e18,
+ l2TotalSupplyDiff: () => e18,
+ },
+ opt: {
+ l2BalanceDiff: () => -ethers.parseEther("0.5"),
+ l2TotalSupplyDiff: () => -ethers.parseEther("0.5"),
+ },
+ },
+ {
+ name: "Decrease to 0 ARB",
+ arb: {
+ l2BalanceDiff: () => -initialArbSupply,
+ l2TotalSupplyDiff: () => -initialArbSupply,
+ },
+ },
+ {
+ name: "Decrease to 0 OPT",
+ opt: {
+ l2BalanceDiff: () => -initialOptSupply,
+ l2TotalSupplyDiff: () => -initialOptSupply,
+ },
+ },
+ ];
+
+ args.forEach(function (arg) {
+ it(`updateTreasuryData: ${arg.name}`, async () => {
+ const block = await ethers.provider.getBlock("latest");
+ const timestamp = block.timestamp;
+ let expectedTotalSupplyDiff = 0n;
+ if (arg.arb) {
+ expectedTotalSupplyDiff += arg.arb.l2TotalSupplyDiff();
+ initialArbAmount += arg.arb.l2BalanceDiff();
+ initialArbSupply += arg.arb.l2TotalSupplyDiff();
+ await adapterArb.sendData(timestamp, initialArbAmount, initialArbSupply);
+ }
+ if (arg.opt) {
+ expectedTotalSupplyDiff += arg.opt.l2TotalSupplyDiff();
+ initialOptAmount += arg.opt.l2BalanceDiff();
+ initialOptSupply += arg.opt.l2TotalSupplyDiff();
+ await adapterOpt.sendData(timestamp, initialOptAmount, initialOptSupply);
+ }
+ console.log(`Expected supply diff: ${expectedTotalSupplyDiff.format()}`);
+ const expectedLockboxBalance = initialArbSupply + initialOptSupply;
+ const totalSupplyBefore = await inEth.totalSupply();
+
+ let tx = await rebalancer.updateTreasuryData();
+
+ const totalSupplyAfter = await inEth.totalSupply();
+ const lockboxBalanceAfter = await inEth.balanceOf(lockboxAddress);
+ console.log("Lockbox inEth balance:", lockboxBalanceAfter.format());
+
+ expect(totalSupplyAfter - totalSupplyBefore).to.be.eq(expectedTotalSupplyDiff);
+ expect(lockboxBalanceAfter).to.be.eq(expectedLockboxBalance);
+ if (expectedTotalSupplyDiff > 0n) {
+ await expect(tx).emit(rebalancer, "TreasuryUpdateMint").withArgs(expectedTotalSupplyDiff);
+ }
+ if (expectedTotalSupplyDiff == 0n) {
+ await expect(tx)
+ .to.not.emit(rebalancer, "TreasuryUpdateMint")
+ .and.to.not.emit(rebalancer, "TreasuryUpdateBurn");
+ }
+ if (expectedTotalSupplyDiff < 0n) {
+ await expect(tx).emit(rebalancer, "TreasuryUpdateBurn").withArgs(-expectedTotalSupplyDiff);
+ }
+ });
+ });
+
+ it("updateTreasuryData reverts when total supply is the same", async function () {
+ const block = await ethers.provider.getBlock("latest");
+ const timestamp = block.timestamp;
+ await adapterArb.sendData(timestamp, e18, e18);
+ await adapterOpt.sendData(timestamp, e18, e18);
+ await rebalancer.updateTreasuryData();
+
+ await expect(rebalancer.updateTreasuryData()).to.be.revertedWithCustomError(
+ rebalancer,
+ "NoRebalancingRequired",
+ );
+ });
+
+ it("inEth leftover on rebalancer will be transferred to the lockbox", async function () {
+ await snapshot.restore();
+ const block = await ethers.provider.getBlock("latest");
+ const timestamp = block.timestamp;
+ await restakingPool.connect(signer1)["stake()"]({ value: 2n * e18 });
+
+ const totalSupplyBefore = await inEth.totalSupply();
+ const lockboxBalanceBefore = await inEth.balanceOf(lockboxAddress);
+ //Report L2 info
+ const l2SupplyChange = e18;
+ await adapterArb.sendData(timestamp, lockboxBalanceBefore / 2n, lockboxBalanceBefore / 2n + l2SupplyChange);
+ await adapterOpt.sendData(timestamp, lockboxBalanceBefore / 2n, lockboxBalanceBefore / 2n + l2SupplyChange);
+
+ const amount = randomBI(17);
+ await inEth.connect(signer1).transfer(rebalancer.address, amount);
+
+ await expect(rebalancer.updateTreasuryData())
+ .to.emit(rebalancer, "InceptionTokenDepositedToLockbox")
+ .withArgs(amount);
+ console.log(`Total supply: ${(await inEth.totalSupply()).format()}`);
+
+ const totalSupplyAfter = await inEth.totalSupply();
+ const lockboxBalanceAfter = await inEth.balanceOf(lockboxAddress);
+ expect(totalSupplyAfter - totalSupplyBefore).to.be.closeTo(l2SupplyChange * 2n, 1n);
+ expect(lockboxBalanceAfter - lockboxBalanceBefore).to.be.closeTo(l2SupplyChange * 2n + amount, 1n);
+ });
+ });
+
+ describe("Stake", function () {
+ beforeEach(async function () {
+ await snapshot.restore();
+ });
+
+ const args = [
+ {
+ name: "Part of the balance",
+ balance: async () => await restakingPool.availableToStake(),
+ amount: async amount => amount / 2n,
+ },
+ {
+ name: "All balance",
+ balance: async () => await restakingPool.availableToStake(),
+ amount: async amount => amount,
+ },
+ {
+ name: "Restaking pool min amount",
+ balance: async () => await restakingPool.availableToStake(),
+ amount: async () => await restakingPool.getMinStake(),
+ },
+ ];
+
+ args.forEach(function (arg) {
+ it(`${arg.name}`, async function () {
+ const balance = await arg.balance();
+ await signer1.sendTransaction({ value: balance, to: rebalancer.address });
+
+ const amount = await arg.amount(balance);
+ const shares = await inEth.convertToShares(amount);
+ const lockboxInEthBalanceBefore = await inEth.balanceOf(lockboxAddress);
+
+ const tx = await rebalancer.connect(operator).stake(amount);
+ await expect(tx)
+ .emit(rebalancer, "InceptionTokenDepositedToLockbox")
+ .withArgs(shares)
+ .and.emit(restakingPool, "Staked")
+ .withArgs(rebalancer.address, amount, shares);
+
+ const lockboxInEthBalanceAfter = await inEth.balanceOf(lockboxAddress);
+ console.log("Signer eth balance after: ", await ethers.provider.getBalance(signer1.address));
+ console.log("Restaking pool eth balance: ", await ethers.provider.getBalance(restakingPool.address));
+ console.log("lockbox inEth balance: ", await inEth.balanceOf(lockboxAddress));
+
+ //Everything was staked goes to the lockbox
+ expect(lockboxInEthBalanceAfter - lockboxInEthBalanceBefore).to.be.eq(shares);
+ expect(await inEth.balanceOf(rebalancer.address)).to.be.eq(0n);
+ });
+ });
+
+ it("Reverts when amount > available to stake from restaking pool", async function () {
+ const amount = (await restakingPool.availableToStake()) + 1n;
+ await signer1.sendTransaction({ value: amount, to: rebalancer.address });
+ await expect(rebalancer.connect(operator).stake(amount)).to.revertedWithCustomError(
+ rebalancer,
+ "StakeAmountExceedsMaxTVL",
+ );
+ });
+
+ it("Reverts when amount > eth balance", async function () {
+ const amount = (await restakingPool.availableToStake()) / 2n;
+ await signer1.sendTransaction({ value: amount, to: rebalancer.address });
+ await expect(rebalancer.connect(operator).stake(amount + 1n)).to.revertedWithCustomError(
+ rebalancer,
+ "StakeAmountExceedsEthBalance",
+ );
+ });
+
+ it("Reverts when amount < restaking pool min stake", async function () {
+ const amount = (await restakingPool.getMinStake()) - 1n;
+ await signer1.sendTransaction({ value: amount, to: rebalancer.address });
+ await expect(rebalancer.connect(operator).stake(amount)).to.revertedWithCustomError(
+ restakingPool,
+ "PoolStakeAmLessThanMin",
+ );
+ });
+
+ it("Reverts when called by not an operator", async function () {
+ const amount = (await restakingPool.availableToStake()) / 2n;
+ await signer1.sendTransaction({ value: amount, to: rebalancer.address });
+ await expect(rebalancer.connect(signer1).stake(amount)).to.revertedWithCustomError(rebalancer, "OnlyOperator");
+ });
+ });
+
+ describe("sendEthToL2", function () {
+ beforeEach(async function () {
+ await snapshot.restore();
+ const balance = await restakingPool.availableToStake();
+ await signer1.sendTransaction({ value: balance, to: rebalancer.address });
+ });
+
+ const args = [
+ {
+ name: "Part of the balance to ARB",
+ amount: async amount => amount / 2n,
+ chainId: ARB_ID,
+ adapter: () => adapterArb,
+ },
+ {
+ name: "Part of the balance to OPT",
+ amount: async amount => amount / 2n,
+ chainId: OPT_ID,
+ adapter: () => adapterOpt,
+ },
+ {
+ name: "All balance to ARB",
+ amount: async amount => amount,
+ chainId: ARB_ID,
+ adapter: () => adapterArb,
+ },
+ {
+ name: "All balance to OPT",
+ amount: async amount => amount,
+ chainId: OPT_ID,
+ adapter: () => adapterOpt,
+ },
+ ];
+
+ args.forEach(function (arg) {
+ it(`${arg.name}`, async function () {
+ const balance = await ethers.provider.getBalance(rebalancer.address);
+ const amount = await arg.amount(balance);
+
+ const options = Options.newOptions().addExecutorLzReceiveOption(200_000n, amount).toHex().toString();
+ const fees = await rebalancer.quoteSendEthToL2(arg.chainId, options);
+ const tx = await rebalancer.connect(operator).sendEthToL2(arg.chainId, amount, options, { value: fees });
+ await expect(tx).to.emit(adapterEth, "CrossChainMessageSent");
+ await expect(tx).to.changeEtherBalance(omniVault, amount);
+ await expect(tx).to.changeEtherBalance(rebalancer, -amount);
+ await expect(tx).to.changeEtherBalance(operator, -fees, { includeFee: false });
+ });
+ });
+
+ it("Reverts when amount > eth balance", async function () {
+ const amount = (await ethers.provider.getBalance(rebalancer.address)) + 1n;
+ const options = Options.newOptions().addExecutorLzReceiveOption(200_000n, amount).toHex().toString();
+ const fees = await rebalancer.quoteSendEthToL2(ARB_ID, options);
+ await expect(
+ rebalancer.connect(operator).sendEthToL2(ARB_ID, amount, options, { value: fees }),
+ ).to.revertedWithCustomError(rebalancer, "SendAmountExceedsEthBalance");
+ });
+
+ it("Reverts when called by not an operator", async function () {
+ const amount = await ethers.provider.getBalance(rebalancer.address);
+ const options = Options.newOptions().addExecutorLzReceiveOption(200_000n, amount).toHex().toString();
+ const fees = await rebalancer.quoteSendEthToL2(ARB_ID, options);
+ await expect(
+ rebalancer.connect(signer1).sendEthToL2(ARB_ID, amount, options, { value: fees }),
+ ).to.revertedWithCustomError(rebalancer, "OnlyOperator");
+ });
+
+ it("Reverts when there is no adapter for the chain", async function () {
+ const amount = await ethers.provider.getBalance(rebalancer.address);
+ const options = Options.newOptions().addExecutorLzReceiveOption(200_000n, amount).toHex().toString();
+ const fees = await rebalancer.quoteSendEthToL2(ARB_ID, options);
+ await expect(
+ rebalancer.connect(operator).sendEthToL2(randomBI(8), amount, options, { value: fees }),
+ ).to.revertedWithCustomError(adapterArb, "NoPeer");
+ });
+ });
+
+ describe("handleL2Info", function () {
+ it("handleL2Info reverts when called by not an adapter", async function () {
+ const block = await ethers.provider.getBlock("latest");
+ const chainId = ARB_ID;
+ const timestamp = block.timestamp;
+ const balance = e18;
+ const totalSupply = e18;
+
+ await expect(
+ rebalancer.connect(owner).handleL2Info(chainId, timestamp, balance, totalSupply),
+ ).to.be.revertedWithCustomError(rebalancer, "OnlyAdapter");
+ });
+ });
+ });
+
+ describe("Adapters", function () {
+ before(async function () {
+ await snapshot.restore();
+ });
+
+ describe("Deployment", function () {
+ let LZCrossChainAdapterL1;
+ let LZCrossChainAdapterL2;
+ before(async function () {
+ LZCrossChainAdapterL1 = await ethers.getContractFactory("LZCrossChainAdapterL1");
+ LZCrossChainAdapterL2 = await ethers.getContractFactory("LZCrossChainAdapterL2");
+ });
+
+ const argsL1 = [
+ {
+ name: "invalid endpoint address",
+ args: () => [ethers.ZeroAddress, owner.address, eIds, chainIds],
+ },
+ {
+ name: "invalid delegator address",
+ args: () => [ethEndpoint.address, ethers.ZeroAddress, eIds, chainIds],
+ },
+ {
+ name: "Id arrays lengths do not match",
+ args: () => [ethEndpoint.address, owner.address, [ARB_EID], [ARB_ID, OPT_ID]],
+ },
+ ];
+
+ argsL1.forEach(function (arg) {
+ it(`LZCrossChainAdapterL1: ${arg.name}`, async function () {
+ const args = arg.args();
+ await expect(upgrades.deployProxy(LZCrossChainAdapterL1, args)).to.be.reverted;
+ });
+ });
+
+ const argsL2 = [
+ {
+ name: "invalid endpoint address",
+ args: () => [ethers.ZeroAddress, owner.address, ETH_ID, eIds, chainIds],
+ },
+ {
+ name: "invalid delegator address",
+ args: () => [ethEndpoint.address, ethers.ZeroAddress, ETH_ID, eIds, chainIds],
+ },
+ {
+ name: "Id arrays lengths do not match",
+ args: () => [ethEndpoint.address, owner.address, ETH_ID, [ARB_EID], [ARB_ID, OPT_ID]],
+ },
+ ];
+
+ argsL2.forEach(function (arg) {
+ it(`LZCrossChainAdapterL2: ${arg.name}`, async function () {
+ const args = arg.args();
+ await expect(upgrades.deployProxy(LZCrossChainAdapterL2, args)).to.be.reverted;
+ });
+ });
+ });
+
+ //=== Getters and setters
+ const adapters = [
+ {
+ name: "layer1",
+ adapter: () => adapterEth,
+ endpoint: () => ethEndpoint,
+ },
+ {
+ name: "layer2",
+ adapter: () => adapterArb,
+ endpoint: () => arbEndpoint,
+ },
+ ];
+ adapters.forEach(function (adapterArg) {
+ let adapter;
+ describe(`Getters and setters ${adapterArg.name}`, function () {
+ beforeEach(async function () {
+ await snapshot.restore();
+ adapter = adapterArg.adapter();
+ });
+
+ const setters = [
+ {
+ name: "receiver address",
+ setter: "setTargetReceiver",
+ getter: "targetReceiver",
+ event: "TargetReceiverChanged",
+ },
+ ];
+
+ setters.forEach(function (setterArg) {
+ it(`Set new ${setterArg.name}`, async function () {
+ const prevValue = await adapter[setterArg.getter]();
+ const newValue = ethers.Wallet.createRandom().address;
+
+ await expect(adapter[setterArg.setter](newValue))
+ .to.emit(adapter, setterArg.event)
+ .withArgs(prevValue, newValue);
+ expect(await adapter[setterArg.getter]()).to.be.eq(newValue);
+ });
+
+ it(`Reverts: ${setterArg.setter} when called by not an owner`, async function () {
+ const newValue = ethers.Wallet.createRandom().address;
+ await expect(adapter.connect(signer1)[setterArg.setter](newValue)).to.be.revertedWithCustomError(
+ adapter,
+ "OwnableUnauthorizedAccount",
+ );
+ });
+
+ it(`Reverts: ${setterArg.setter} new value is 0 address`, async function () {
+ const newValue = ethers.ZeroAddress;
+ await expect(adapter[setterArg.setter](newValue)).to.be.revertedWithCustomError(
+ adapter,
+ "SettingZeroAddress",
+ );
+ });
+ });
+
+ it("setPeer sets target address by chain", async function () {
+ const eid = randomBI(8);
+ const target = ethers.Wallet.createRandom();
+ const peer = ethers.zeroPadValue(target.address, 32);
+
+ await expect(adapter.setPeer(eid, peer)).to.emit(adapter, "PeerSet").withArgs(eid, peer);
+ expect(await adapter.peers(eid)).to.be.eq(peer);
+ });
+
+ it("setPeer reverts when called by not an owner", async function () {
+ const eid = randomBI(8);
+ const target = ethers.Wallet.createRandom();
+ const peer = ethers.zeroPadValue(target.address, 32);
+
+ await expect(adapter.connect(signer1).setPeer(eid, peer)).to.be.revertedWithCustomError(
+ adapter,
+ "OwnableUnauthorizedAccount",
+ );
+ });
+
+ it("setChainIdFromEid maps chaind id by eid", async function () {
+ const eid = randomBI(8);
+ const chainId = randomBI(8);
+
+ await expect(adapter.setChainIdFromEid(eid, chainId)).to.emit(adapter, "ChainIdAdded").withArgs(chainId);
+ expect(await adapter.getChainIdFromEid(eid)).to.be.eq(chainId);
+ expect(await adapter.getEidFromChainId(chainId)).to.be.eq(eid);
+ });
+
+ it("setChainIdFromEid reverts when called by not an owner", async function () {
+ const eid = randomBI(8);
+ const chainId = randomBI(8);
+
+ await expect(adapter.connect(signer1).setChainIdFromEid(eid, chainId)).to.be.revertedWithCustomError(
+ adapter,
+ "OwnableUnauthorizedAccount",
+ );
+ });
+
+ it("Owner", async function () {
+ expect(await adapter.owner()).to.be.eq(owner.address);
+ });
+
+ it("Transfer ownership in two steps", async function () {
+ // Generate a new owner address and connect it to the provider
+ const newOwner = ethers.Wallet.createRandom().connect(ethers.provider);
+
+ // Fund newOwner with some ETH from the current owner
+ await owner.sendTransaction({
+ to: newOwner.address,
+ value: ethers.parseEther("1"), // Transfer 1 ETH for gas fees
+ });
+
+ // Initiate ownership transfer (step 1)
+ await expect(adapter.transferOwnership(newOwner.address))
+ .to.emit(adapter, "OwnershipTransferStarted")
+ .withArgs(owner.address, newOwner.address);
+
+ // Ensure that the new owner is set as the pending owner
+ expect(await adapter.pendingOwner()).to.equal(newOwner.address);
+
+ // Simulate the new owner accepting the ownership (step 2)
+ await expect(adapter.connect(newOwner).acceptOwnership())
+ .to.emit(adapter, "OwnershipTransferred")
+ .withArgs(owner.address, newOwner.address);
+
+ // Check that the ownership transfer is complete
+ expect(await adapter.owner()).to.equal(newOwner.address);
+ });
+
+ it("Endpoint", async function () {
+ const endpoint = adapterArg.endpoint();
+ expect(await adapter.endpoint()).to.be.eq(endpoint.address);
+ });
+ });
+ });
+
+ //=== Send eth between layers
+ const directions = [
+ {
+ name: "L2 -> L1",
+ fromAdapter: () => adapterArb,
+ fromEndpoint: () => arbEndpoint,
+ fromChainID: ARB_ID,
+ fromChainEID: ARB_EID,
+ toAdapter: () => adapterEth,
+ toEndpoint: () => ethEndpoint,
+ toChainID: ETH_ID,
+ target: () => rebalancer,
+ maliciousAdapter: () => maliciousAdapterL2,
+ },
+ {
+ name: "L1 -> L2",
+ fromAdapter: () => adapterEth,
+ fromEndpoint: () => ethEndpoint,
+ fromChainID: ETH_ID,
+ fromChainEID: ETH_EID,
+ toAdapter: () => adapterArb,
+ toEndpoint: () => arbEndpoint,
+ toChainID: ARB_ID,
+ target: () => omniVault,
+ maliciousAdapter: () => maliciousAdapterL1,
+ },
+ ];
+ directions.forEach(function (direction) {
+ describe(`Send eth ${direction.name}`, function () {
+ let fromAdapter;
+ let fromEndpoint;
+ let toAdapter;
+ let toEndpoint;
+ let target;
+
+ before(async function () {
+ await snapshot.restore();
+ fromAdapter = direction.fromAdapter();
+ fromEndpoint = direction.fromEndpoint();
+ toAdapter = direction.toAdapter();
+ toEndpoint = direction.toEndpoint();
+ target = direction.target();
+ });
+
+ const args = [
+ {
+ name: "1eth",
+ amount: async () => e18,
+ },
+ {
+ name: "Random amount ~ 1e17",
+ amount: async () => randomBI(17),
+ },
+ {
+ name: "1wei",
+ amount: async () => 1n,
+ },
+ {
+ name: "Restaking pool min amount",
+ amount: async () => await restakingPool.getMinStake(),
+ },
+ {
+ name: "Greater than available to stake",
+ amount: async () => (await restakingPool.availableToStake()) + 1n,
+ },
+ ];
+
+ args.forEach(function (arg) {
+ it(arg.name, async function () {
+ const amount = await arg.amount();
+ const options = Options.newOptions().addExecutorLzReceiveOption(200_000n, amount).toHex().toString();
+ const amountWithFees = await fromAdapter.quoteSendEth(direction.toChainID, options);
+ const fee = amountWithFees - amount;
+ const tx = await fromAdapter
+ .connect(owner)
+ .sendEthCrossChain(direction.toChainID, options, { value: amountWithFees });
+
+ await expect(tx)
+ .emit(fromAdapter, "CrossChainMessageSent")
+ .withArgs(direction.toChainID, amount, "0x", fee);
+ await expect(tx).emit(toAdapter, "CrossChainEthDeposit").withArgs(direction.fromChainID, amount);
+ if (direction.toChainID === ETH_ID) {
+ await expect(tx).emit(target, "ETHReceived").withArgs(toAdapter.address, amount);
+ }
+ await expect(tx).to.changeEtherBalance(target.address, amount);
+ await expect(tx).to.changeEtherBalance(owner.address, -amountWithFees, { includeFee: false });
+ });
+ });
+
+ it(`Send 0th ${direction.name}`, async function () {
+ const amount = 0n;
+ const options = Options.newOptions().addExecutorLzReceiveOption(200_000n, amount).toHex().toString();
+ const amountWithFees = await fromAdapter.quoteSendEth(direction.toChainID, options);
+ const tx = await fromAdapter
+ .connect(owner)
+ .sendEthCrossChain(direction.toChainID, options, { value: amountWithFees });
+
+ await expect(tx)
+ .emit(fromAdapter, "CrossChainMessageSent")
+ .withArgs(direction.toChainID, 0n, "0x", 3202200000000000n);
+ await expect(tx).not.emit(toAdapter, "CrossChainEthDeposit");
+ await expect(tx).not.emit(rebalancer, "ETHReceived");
+ await expect(tx).to.changeEtherBalance(target.address, amount);
+ await expect(tx).to.changeEtherBalance(owner.address, -amountWithFees, { includeFee: false });
+ });
+
+ it("sendEthCrossChain reverts when caller is not endpoint", async function () {
+ await snapshot.restore();
+ const maliciousEndpoint = await ethers.deployContract("EndpointMock", [direction.toChainID]);
+ maliciousEndpoint.address = await maliciousEndpoint.getAddress();
+ await fromEndpoint.setDestLzEndpoint(toAdapter.address, maliciousEndpoint.address);
+
+ const amount = randomBI(18);
+ const options = Options.newOptions().addExecutorLzReceiveOption(200_000n, amount).toHex().toString();
+ const fees = await fromAdapter.quoteSendEth(direction.toChainID, options);
+
+ await expect(fromAdapter.sendEthCrossChain(direction.toChainID, options, { value: fees }))
+ .to.revertedWithCustomError(toAdapter, "OnlyEndpoint")
+ .withArgs(maliciousEndpoint.address);
+ });
+
+ it("sendEthCrossChain reverts when sent from unknown adapter", async function () {
+ await snapshot.restore();
+ const maliciousAdapter = direction.maliciousAdapter();
+
+ const amount = randomBI(18);
+ const options = Options.newOptions().addExecutorLzReceiveOption(200_000n, amount).toHex().toString();
+ const fees = await maliciousAdapter.quoteSendEth(direction.toChainID, options);
+ await expect(maliciousAdapter.sendEthCrossChain(direction.toChainID, options, { value: fees }))
+ .to.be.revertedWithCustomError(toAdapter, "OnlyPeer")
+ .withArgs(direction.fromChainEID, ethers.zeroPadValue(maliciousAdapter.address, 32));
+ });
+
+ it("sendEthCrossChain reverts when chain is unknown", async function () {
+ const amount = randomBI(18);
+ const options = Options.newOptions().addExecutorLzReceiveOption(200_000n, amount).toHex().toString();
+ const amountWithFees = await fromAdapter.quoteSendEth(direction.toChainID, options);
+ await expect(
+ fromAdapter.connect(owner).sendEthCrossChain(randomBI(4), options, { value: amountWithFees }),
+ ).to.be.revertedWithCustomError(fromAdapter, "NoPeer");
+ });
+
+ it("sendEthCrossChain reverts there is not enough fee", async function () {
+ const amount = randomBI(18);
+ const options = Options.newOptions().addExecutorLzReceiveOption(200_000n, amount).toHex().toString();
+ const amountWithFees = await fromAdapter.quoteSendEth(direction.toChainID, options);
+ await expect(
+ fromAdapter.connect(owner).sendEthCrossChain(direction.toChainID, options, { value: amountWithFees - 1n }),
+ ).to.be.revertedWith("LayerZeroMock: not enough native for fees");
+ });
+
+ it("quoteSendEth reverts when chain is unknown", async function () {
+ const chain = randomBI(4);
+ const amount = randomBI(18);
+ const options = Options.newOptions().addExecutorLzReceiveOption(200_000n, amount).toHex().toString();
+ await expect(fromAdapter.quoteSendEth(chain, options))
+ .to.be.revertedWithCustomError(fromAdapter, "NoDestEidFoundForChainId")
+ .withArgs(chain);
+ });
+
+ it("quoteSendEth reverts when options value is invalid", async function () {
+ await expect(fromAdapter.quoteSendEth(direction.toChainID, "0x"))
+ .to.be.revertedWithCustomError(fromEndpoint, "LZ_ULN_InvalidWorkerOptions")
+ .withArgs(0n);
+ });
+ });
+ });
+
+ describe("sendDataL1 receiveL2Info", function () {
+ let lastHandleTime;
+ before(async function () {
+ await snapshot.restore();
+ });
+
+ it("sendDataL1 reverts when called by not a target", async function () {
+ const block = await ethers.provider.getBlock("latest");
+ const timestamp = block.timestamp;
+ const balance = randomBI(19);
+ const totalSupply = randomBI(19);
+ const message = encodePayload(timestamp, balance, totalSupply);
+ const fees = await adapterArb.quote(message, options);
+ await expect(adapterArb.connect(signer1).sendDataL1(message, options, { value: fees }))
+ .to.be.revertedWithCustomError(adapterArb, "NotTargetReceiver")
+ .withArgs(signer1.address);
+ });
+
+ it("receiveL2Info", async () => {
+ const block = await ethers.provider.getBlock("latest");
+ lastHandleTime = block.timestamp - 1000;
+ const _balance = 100;
+ const _totalSupply = 100;
+
+ await expect(adapterArb.sendData(lastHandleTime, _balance, _totalSupply))
+ .to.emit(rebalancer, "L2InfoReceived")
+ .withArgs(ARB_ID, lastHandleTime, _balance, _totalSupply);
+
+ const chainDataAfter = await rebalancer.getTransactionData(ARB_ID);
+ expect(chainDataAfter.timestamp).to.be.eq(lastHandleTime);
+ expect(chainDataAfter.ethBalance).to.be.eq(_balance);
+ expect(chainDataAfter.inceptionTokenBalance).to.be.eq(_totalSupply);
+ });
+
+ it("Reverts when there is a message with this timestamp", async function () {
+ const balance = 200;
+ const totalSupply = 200;
+
+ await expect(adapterArb.sendData(lastHandleTime, balance, totalSupply))
+ .to.revertedWithCustomError(rebalancer, "TimeBeforePrevRecord")
+ .withArgs(lastHandleTime);
+ });
+
+ it("Reverts when timestamp is in the future", async function () {
+ const block = await ethers.provider.getBlock("latest");
+ const timestamp = block.timestamp + 100;
+ const balance = 100;
+ const totalSupply = 100;
+
+ await expect(adapterArb.sendData(timestamp, balance, totalSupply))
+ .to.revertedWithCustomError(rebalancer, "TimeCannotBeInFuture")
+ .withArgs(timestamp);
+ });
+
+ it("Reverts when caller is not endpoint", async function () {
+ const maliciousEndpoint = await ethers.deployContract("EndpointMock", [ETH_EID]);
+ maliciousEndpoint.address = await maliciousEndpoint.getAddress();
+ await arbEndpoint.setDestLzEndpoint(adapterEth.address, maliciousEndpoint.address);
+
+ const block = await ethers.provider.getBlock("latest");
+ const timestamp = block.timestamp - 1;
+ const balance = 300;
+ const totalSupply = 300;
+
+ await expect(adapterArb.sendData(timestamp, balance, totalSupply))
+ .to.revertedWithCustomError(adapterEth, "OnlyEndpoint")
+ .withArgs(maliciousEndpoint.address);
+ });
+
+ it("Reverts when l2 sender is unknown", async function () {
+ await snapshot.restore();
+ const block = await ethers.provider.getBlock("latest");
+ const timestamp = block.timestamp + 100;
+ const balance = 100;
+ const totalSupply = 100;
+ const message = encodePayload(timestamp, balance, totalSupply);
+
+ const fees = await maliciousAdapterL2.quote(message, options);
+ await expect(maliciousAdapterL2.sendDataL1(message, options, { value: fees }))
+ .to.be.revertedWithCustomError(adapterEth, "OnlyPeer")
+ .withArgs(ARB_EID, ethers.zeroPadValue(maliciousAdapterL2.address, 32));
+ });
+
+ it("quoteSendEth reverts when options value is invalid", async function () {
+ await snapshot.restore();
+ const block = await ethers.provider.getBlock("latest");
+ const timestamp = block.timestamp + 100;
+ const balance = 100;
+ const totalSupply = 100;
+ const message = encodePayload(timestamp, balance, totalSupply);
+
+ await expect(adapterArb.quote(message, "0x"))
+ .to.be.revertedWithCustomError(arbEndpoint, "LZ_ULN_InvalidWorkerOptions")
+ .withArgs(0n);
+ });
+ });
+
+ describe("Recover funds", function () {
+ it("recoverFunds owner can send funds from adapter to the target", async function () {
+ const amount = randomBI(18);
+ await signer1.sendTransaction({ value: amount, to: adapterEth.address });
+ expect(await ethers.provider.getBalance(adapterEth.address)).to.be.eq(amount);
+
+ const tx = await adapterEth.connect(owner).recoverFunds();
+ await expect(tx).to.emit(adapterEth, "RecoverFundsInitiated").withArgs(amount);
+ await expect(tx).changeEtherBalance(adapterEth, -amount);
+ await expect(tx).changeEtherBalance(rebalancer, amount);
+ });
+
+ it("recoverFunds reverts when called by not an owner", async function () {
+ const amount = randomBI(18);
+ await signer1.sendTransaction({ value: amount, to: adapterEth.address });
+ expect(await ethers.provider.getBalance(adapterEth.address)).to.be.eq(amount);
+
+ await expect(adapterEth.connect(signer1).recoverFunds()).to.revertedWithCustomError(
+ adapterEth,
+ "OwnableUnauthorizedAccount",
+ );
+ });
+ });
+ });
+
+ describe("OmniVault", function () {
+ describe("Base flow", function () {
+ let deposited, freeBalance, depositFees;
+
+ before(async function () {
+ await snapshot.restore();
+ TARGET = toWei(10);
+ await omniVault.setTargetFlashCapacity(TARGET);
+ });
+
+ it("Initial ratio", async function () {
+ const ratio = await omniVault.ratio();
+ console.log(`Initial ratio:\t\t${ratio.format()}`);
+ });
+
+ it("Deposit to vault", async function () {
+ freeBalance = randomBI(19);
+ deposited = TARGET + freeBalance;
+ const expectedShares = (deposited * e18) / (await omniVault.ratio());
+ const tx = await omniVault.connect(signer1).deposit(signer1.address, { value: deposited });
+ const receipt = await tx.wait();
+ const events = receipt?.logs.filter(e => e.eventName === "Deposit");
+ expect(events.length).to.be.eq(1);
+ expect(events[0].args["sender"]).to.be.eq(signer1.address);
+ expect(events[0].args["receiver"]).to.be.eq(signer1.address);
+ expect(events[0].args["amount"]).to.be.eq(deposited);
+ expect(events[0].args["iShares"]).to.be.closeTo(expectedShares, 1n);
+ expect(receipt?.logs.find(l => l.eventName === "DepositBonus")).to.be.undefined; //Because there is no replenish rewards has been collected yet
+ console.log(`Ratio after:\t\t${(await omniVault.ratio()).format()}`);
+
+ expect(await iToken.balanceOf(signer1.address)).to.be.closeTo(expectedShares, 1n);
+ expect(await omniVault.totalAssets()).to.be.eq(deposited);
+ expect(await omniVault.getFlashCapacity()).to.be.eq(deposited);
+ expect(await omniVault.ratio()).to.be.eq(e18);
+ });
+
+ it("Flash withdraw all", async function () {
+ const sharesBefore = await iToken.balanceOf(signer1);
+ const senderBalanceBefore = await ethers.provider.getBalance(signer1);
+ const receiver = signer2;
+ const receiverBalanceBefore = await ethers.provider.getBalance(receiver);
+ const treasuryBalanceBefore = await ethers.provider.getBalance(treasury);
+ const totalAssetsBefore = await omniVault.totalAssets();
+ const flashCapacityBefore = await omniVault.getFlashCapacity();
+ console.log(`Flash capacity before:\t${flashCapacityBefore.format()}`);
+
+ const amount = await omniVault.convertToAssets(sharesBefore);
+ const expectedFee = await omniVault.calculateFlashWithdrawFee(amount);
+ console.log(`Amount:\t\t\t\t\t${amount.format()}`);
+ console.log(`Shares:\t\t\t\t\t${sharesBefore.format()}`);
+ console.log(`Expected fee:\t\t\t${expectedFee.format()}`);
+
+ let tx = await omniVault.connect(signer1).flashWithdraw(sharesBefore, receiver.address);
+ const receipt = await tx.wait();
+ const txFee = BigInt(receipt.gasUsed * receipt.gasPrice);
+ const withdrawEvent = receipt?.logs.filter(e => e.eventName === "FlashWithdraw");
+ expect(withdrawEvent.length).to.be.eq(1);
+ expect(withdrawEvent[0].args["sender"]).to.be.eq(signer1.address);
+ expect(withdrawEvent[0].args["receiver"]).to.be.eq(receiver.address);
+ expect(withdrawEvent[0].args["owner"]).to.be.eq(signer1.address);
+ expect(withdrawEvent[0].args["amount"]).to.be.closeTo(amount - expectedFee, 1n);
+ expect(withdrawEvent[0].args["iShares"]).to.be.closeTo(sharesBefore, 1n);
+ expect(withdrawEvent[0].args["fee"]).to.be.closeTo(expectedFee, 1n);
+ const collectedFees = withdrawEvent[0].args["fee"];
+ depositFees = collectedFees / 2n;
+
+ const sharesAfter = await iToken.balanceOf(signer1);
+ const senderBalanceAfter = await ethers.provider.getBalance(signer1);
+ const receiverBalanceAfter = await ethers.provider.getBalance(receiver);
+ const treasuryBalanceAfter = await ethers.provider.getBalance(treasury);
+ const totalAssetsAfter = await omniVault.totalAssets();
+ const flashCapacityAfter = await omniVault.getFlashCapacity();
+ console.log(`Shares balance diff:\t${(sharesBefore - sharesAfter).format()}`);
+ console.log(`Sender balance diff:\t${(senderBalanceBefore - senderBalanceAfter).format()}`);
+ console.log(`Receiver balance diff:\t${(receiverBalanceAfter - receiverBalanceBefore).format()}`);
+ console.log(`Treasury balance diff:\t${(treasuryBalanceAfter - treasuryBalanceBefore).format()}`);
+ console.log(`Total assets diff:\t\t${(totalAssetsBefore - totalAssetsAfter).format()}`);
+ console.log(`Flash capacity diff:\t${(flashCapacityBefore - flashCapacityAfter).format()}`);
+ console.log(`Fee collected:\t\t\t${collectedFees.format()}`);
+
+ expect(sharesBefore - sharesAfter).to.be.eq(sharesBefore);
+ expect(senderBalanceBefore - senderBalanceAfter).to.be.closeTo(txFee, 1n);
+ expect(receiverBalanceAfter - receiverBalanceBefore).to.be.closeTo(amount - expectedFee, 1n);
+ expect(treasuryBalanceAfter - treasuryBalanceBefore).to.be.closeTo(expectedFee / 2n, 1n);
+ expect(totalAssetsBefore - totalAssetsAfter).to.be.closeTo(amount - expectedFee / 2n, 1n);
+ expect(flashCapacityBefore - flashCapacityAfter).to.be.closeTo(amount, 1n);
+ });
+ });
+
+ describe("Deposit", function () {
+ let TARGET;
+
+ beforeEach(async function () {
+ await snapshot.restore();
+ TARGET = toWei(10);
+ await omniVault.setTargetFlashCapacity(TARGET);
+ });
+
+ const args = [
+ {
+ name: "1st time < TARGET",
+ predepositAmount: () => 0n,
+ amount: async () => TARGET / 2n,
+ withdrawFeeFrom: () => 0n,
+ receiver: () => signer1.address,
+ },
+ {
+ name: "1st time > TARGET",
+ predepositAmount: () => 0n,
+ amount: async () => randomBIMax(TARGET),
+ withdrawFeeFrom: () => 0n,
+ receiver: () => signer1.address,
+ },
+ {
+ name: "more wo rewards",
+ predepositAmount: () => TARGET / 3n,
+ amount: async () => randomBIMax(TARGET / 3n),
+ withdrawFeeFrom: () => 0n,
+ receiver: () => signer1.address,
+ },
+ {
+ name: "more with rewards",
+ predepositAmount: () => TARGET / 3n,
+ amount: async () => randomBIMax(TARGET / 3n),
+ withdrawFeeFrom: () => TARGET,
+ receiver: () => signer1.address,
+ },
+ {
+ name: "min amount",
+ predepositAmount: () => 0n,
+ amount: async () => await omniVault.minAmount(),
+ withdrawFeeFrom: () => TARGET,
+ receiver: () => signer1.address,
+ },
+ {
+ name: "and redeem all rewards",
+ predepositAmount: () => TARGET / 10n,
+ amount: async () => (TARGET * 8n) / 10n,
+ withdrawFeeFrom: () => TARGET / 10n,
+ receiver: () => signer1.address,
+ },
+ {
+ name: "up to target cap and above",
+ predepositAmount: () => TARGET / 10n,
+ amount: async () => TARGET,
+ withdrawFeeFrom: () => TARGET / 2n,
+ receiver: () => signer1.address,
+ },
+ {
+ name: "above target cap",
+ predepositAmount: () => TARGET + 1n,
+ amount: async () => randomBI(19),
+ withdrawFeeFrom: () => TARGET,
+ receiver: () => signer1.address,
+ },
+ {
+ name: "to another address",
+ predepositAmount: () => TARGET / 10n,
+ amount: async () => TARGET,
+ withdrawFeeFrom: () => TARGET,
+ receiver: () => signer2.address,
+ },
+
+ //Ratio < 1
+ {
+ name: "more wo rewards when ratio < 1",
+ predepositAmount: () => TARGET / 3n,
+ amount: async () => randomBIMax(TARGET / 3n),
+ withdrawFeeFrom: () => 0n,
+ ratio: toWei(0.9),
+ receiver: () => signer1.address,
+ },
+ {
+ name: "more with rewards when ratio < 1",
+ predepositAmount: () => TARGET / 3n,
+ amount: async () => randomBIMax(TARGET / 3n),
+ withdrawFeeFrom: () => TARGET,
+ ratio: toWei(0.9),
+ receiver: () => signer1.address,
+ },
+ {
+ name: "min amount when ratio < 1",
+ predepositAmount: () => 0n,
+ amount: async () => await omniVault.minAmount(),
+ withdrawFeeFrom: () => TARGET,
+ ratio: toWei(0.9),
+ receiver: () => signer1.address,
+ },
+ ];
+
+ args.forEach(function (arg) {
+ it(`Deposit ${arg.name}`, async function () {
+ //Predeposit
+ const predepositAmount = arg.predepositAmount();
+ if (predepositAmount > 0n) {
+ const randomAddress = ethers.Wallet.createRandom().address;
+ await omniVault.connect(signer3).deposit(randomAddress, { value: predepositAmount });
+ expect(await omniVault.getFlashCapacity()).to.be.closeTo(predepositAmount, 2n);
+ }
+
+ //Add rewards
+ let availableBonus = await addReplenishBonusToOmniVault(arg.withdrawFeeFrom());
+
+ if (arg.ratio) {
+ await ratioFeedL2.updateRatioBatch([await iToken.getAddress()], [arg.ratio]);
+ console.log(`Ratio updated:\t\t\t${(await omniVault.ratio()).format()}`);
+ }
+
+ const receiver = arg.receiver();
+ const stakerSharesBefore = await iToken.balanceOf(receiver);
+ const totalAssetsBefore = await omniVault.totalAssets();
+ const flashCapacityBefore = await omniVault.getFlashCapacity();
+ console.log(`Flash capacity before:\t${flashCapacityBefore.format()}`);
+
+ const amount = await arg.amount();
+ console.log(`Amount:\t\t\t\t\t${amount.format()}`);
+ const calculatedBonus = await omniVault.calculateDepositBonus(amount);
+ console.log(`Preview bonus:\t\t\t${calculatedBonus.format()}`);
+ console.log(`Available bonus:\t\t${availableBonus.format()}`);
+ const expectedBonus = calculatedBonus <= availableBonus ? calculatedBonus : availableBonus;
+ availableBonus -= expectedBonus;
+ console.log(`Expected bonus:\t\t\t${expectedBonus.format()}`);
+ const convertedShares = await omniVault.convertToShares(amount + expectedBonus);
+ const expectedShares = ((amount + expectedBonus) * (await omniVault.ratio())) / e18;
+
+ const tx = await omniVault.connect(signer1).deposit(receiver, { value: amount });
+ const receipt = await tx.wait();
+ const depositEvent = receipt?.logs.filter(e => e.eventName === "Deposit");
+ expect(depositEvent.length).to.be.eq(1);
+ expect(depositEvent[0].args["sender"]).to.be.eq(signer1.address);
+ expect(depositEvent[0].args["receiver"]).to.be.eq(receiver);
+ expect(depositEvent[0].args["amount"]).to.be.eq(amount);
+ expect(depositEvent[0].args["iShares"]).to.be.closeTo(convertedShares, 1n);
+ //DepositBonus event
+ const actualBonus = receipt?.logs.find(l => l.eventName === "DepositBonus")?.args.amount || 0n;
+ console.log(`Actual bonus:\t\t\t${actualBonus.format()}`);
+
+ const stakerSharesAfter = await iToken.balanceOf(receiver);
+ const totalAssetsAfter = await omniVault.totalAssets();
+ const flashCapacityAfter = await omniVault.getFlashCapacity();
+ console.log(`Bonus after:\t\t\t${availableBonus.format()}`);
+
+ expect(stakerSharesAfter - stakerSharesBefore).to.be.closeTo(expectedShares, 1n);
+ expect(stakerSharesAfter - stakerSharesBefore).to.be.closeTo(convertedShares, 1n);
+ expect(totalAssetsAfter - totalAssetsBefore).to.be.eq(amount); //omniVault balance is the same
+ expect(actualBonus).to.be.closeTo(expectedBonus, 1n);
+ expect(flashCapacityAfter - flashCapacityBefore).to.be.closeTo(amount + expectedBonus, 1n); //rewarded bonus goes to flash capacity
+ });
+ });
+
+ const invalidArgs = [
+ {
+ name: "amount is 0",
+ amount: async () => 0n,
+ receiver: () => signer1.address,
+ customError: "LowerMinAmount",
+ },
+ {
+ name: "amount < min",
+ amount: async () => (await omniVault.minAmount()) - 1n,
+ receiver: () => signer1.address,
+ customError: "LowerMinAmount",
+ },
+ {
+ name: "to zero address",
+ amount: async () => randomBI(18),
+ receiver: () => ethers.ZeroAddress,
+ customError: "NullParams",
+ },
+ ];
+
+ invalidArgs.forEach(function (arg) {
+ it(`Reverts when deposit ${arg.name}`, async function () {
+ const amount = await arg.amount();
+ const receiver = arg.receiver();
+ if (arg.customError) {
+ await expect(omniVault.connect(signer1).deposit(receiver, { value: amount })).to.be.revertedWithCustomError(
+ omniVault,
+ arg.customError,
+ );
+ } else {
+ await expect(omniVault.connect(signer1).deposit(receiver, { value: amount })).to.be.revertedWith(arg.error);
+ }
+ });
+ });
+
+ it("Reverts when omniVault is paused", async function () {
+ await omniVault.pause();
+ const depositAmount = randomBI(19);
+ await expect(
+ omniVault.connect(signer1).deposit(signer1.address, { value: depositAmount }),
+ ).revertedWithCustomError(omniVault, "EnforcedPause");
+ await omniVault.unpause();
+ });
+
+ it("Reverts when shares is 0", async function () {
+ await omniVault.setMinAmount(0n);
+ await expect(omniVault.connect(signer1).deposit(signer1.address, { value: 0n })).revertedWithCustomError(
+ omniVault,
+ "DepositInconsistentResultedState",
+ );
+ });
+ });
+
+ describe("Deposit bonus params setter and calculation", function () {
+ let TARGET, MAX_PERCENT, localSnapshot;
+ before(async function () {
+ MAX_PERCENT = await omniVault.MAX_PERCENT();
+ });
+
+ const depositBonusSegment = [
+ {
+ fromUtilization: async () => 0n,
+ fromPercent: async () => await omniVault.maxBonusRate(),
+ toUtilization: async () => await omniVault.depositUtilizationKink(),
+ toPercent: async () => await omniVault.optimalBonusRate(),
+ },
+ {
+ fromUtilization: async () => await omniVault.depositUtilizationKink(),
+ fromPercent: async () => await omniVault.optimalBonusRate(),
+ toUtilization: async () => await omniVault.MAX_PERCENT(),
+ toPercent: async () => await omniVault.optimalBonusRate(),
+ },
+ {
+ fromUtilization: async () => await omniVault.MAX_PERCENT(),
+ fromPercent: async () => 0n,
+ toUtilization: async () => ethers.MaxUint256,
+ toPercent: async () => 0n,
+ },
+ ];
+
+ const args = [
+ {
+ name: "Normal bonus rewards profile > 0",
+ newMaxBonusRate: BigInt(2 * 10 ** 8), //2%
+ newOptimalBonusRate: BigInt(0.2 * 10 ** 8), //0.2%
+ newDepositUtilizationKink: BigInt(25 * 10 ** 8), //25%
+ },
+ {
+ name: "Optimal utilization = 0 => always optimal rate",
+ newMaxBonusRate: BigInt(2 * 10 ** 8),
+ newOptimalBonusRate: BigInt(10 ** 8), //1%
+ newDepositUtilizationKink: 0n,
+ },
+ {
+ name: "Optimal bonus rate = 0",
+ newMaxBonusRate: BigInt(2 * 10 ** 8),
+ newOptimalBonusRate: 0n,
+ newDepositUtilizationKink: BigInt(25 * 10 ** 8),
+ },
+ {
+ name: "Optimal bonus rate = max > 0 => rate is constant over utilization",
+ newMaxBonusRate: BigInt(2 * 10 ** 8),
+ newOptimalBonusRate: BigInt(2 * 10 ** 8),
+ newDepositUtilizationKink: BigInt(25 * 10 ** 8),
+ },
+ {
+ name: "Optimal bonus rate = max = 0 => no bonus",
+ newMaxBonusRate: 0n,
+ newOptimalBonusRate: 0n,
+ newDepositUtilizationKink: BigInt(25 * 10 ** 8),
+ },
+ //Will fail when OptimalBonusRate > MaxBonusRate
+ ];
+
+ const amounts = [
+ {
+ name: "min amount from 0",
+ flashCapacity: () => 0n,
+ amount: async () => (await omniVault.convertToAssets(await omniVault.minAmount())) + 1n,
+ },
+ {
+ name: "1 wei from 0",
+ flashCapacity: () => 0n,
+ amount: async () => 1n,
+ },
+ {
+ name: "from 0 to 25% of TARGET",
+ flashCapacity: () => 0n,
+ amount: async () => (TARGET * 25n) / 100n,
+ },
+ {
+ name: "from 0 to 25% + 1wei of TARGET",
+ flashCapacity: () => 0n,
+ amount: async () => (TARGET * 25n) / 100n,
+ },
+ {
+ name: "from 25% to 100% of TARGET",
+ flashCapacity: () => (TARGET * 25n) / 100n,
+ amount: async () => (TARGET * 75n) / 100n,
+ },
+ {
+ name: "from 0% to 100% of TARGET",
+ flashCapacity: () => 0n,
+ amount: async () => TARGET,
+ },
+ {
+ name: "from 0% to 200% of TARGET",
+ flashCapacity: () => 0n,
+ amount: async () => TARGET * 2n,
+ },
+ ];
+
+ args.forEach(function (arg) {
+ it(`setDepositBonusParams: ${arg.name}`, async function () {
+ await snapshot.restore();
+ TARGET = e18;
+ await omniVault.connect(owner).setTargetFlashCapacity(TARGET);
+
+ await expect(
+ omniVault.setDepositBonusParams(
+ arg.newMaxBonusRate,
+ arg.newOptimalBonusRate,
+ arg.newDepositUtilizationKink,
+ ),
+ )
+ .to.emit(omniVault, "DepositBonusParamsChanged")
+ .withArgs(arg.newMaxBonusRate, arg.newOptimalBonusRate, arg.newDepositUtilizationKink);
+
+ expect(await omniVault.maxBonusRate()).to.be.eq(arg.newMaxBonusRate);
+ expect(await omniVault.optimalBonusRate()).to.be.eq(arg.newOptimalBonusRate);
+ expect(await omniVault.depositUtilizationKink()).to.be.eq(arg.newDepositUtilizationKink);
+ localSnapshot = await takeSnapshot();
+ });
+
+ amounts.forEach(function (amount) {
+ it(`calculateDepositBonus for ${amount.name}`, async function () {
+ await localSnapshot.restore();
+ let flashCapacity = amount.flashCapacity();
+ if (flashCapacity > 0n) {
+ await omniVault.connect(signer1).deposit(signer1.address, { value: flashCapacity });
+ }
+ let _amount = await amount.amount();
+ let depositBonus = 0n;
+ while (_amount > 0n) {
+ for (const feeFunc of depositBonusSegment) {
+ const utilization = (flashCapacity * MAX_PERCENT) / TARGET;
+ const fromUtilization = await feeFunc.fromUtilization();
+ const toUtilization = await feeFunc.toUtilization();
+ if (_amount > 0n && fromUtilization <= utilization && utilization < toUtilization) {
+ const fromPercent = await feeFunc.fromPercent();
+ const toPercent = await feeFunc.toPercent();
+ const upperBound = (toUtilization * TARGET) / MAX_PERCENT;
+ const replenished = upperBound > flashCapacity + _amount ? _amount : upperBound - flashCapacity;
+ const slope = ((toPercent - fromPercent) * MAX_PERCENT) / (toUtilization - fromUtilization);
+ const bonusPercent = fromPercent + (slope * (flashCapacity + replenished / 2n)) / TARGET;
+ const bonus = (replenished * bonusPercent) / MAX_PERCENT;
+ console.log(`Replenished:\t\t\t${replenished.format()}`);
+ console.log(`Bonus percent:\t\t\t${bonusPercent.format()}`);
+ console.log(`Bonus:\t\t\t\t\t${bonus.format()}`);
+ flashCapacity += replenished;
+ _amount -= replenished;
+ depositBonus += bonus;
+ }
+ }
+ }
+ let contractBonus = await omniVault.calculateDepositBonus(await amount.amount());
+ console.log(`Expected deposit bonus:\t${depositBonus.format()}`);
+ console.log(`Contract deposit bonus:\t${contractBonus.format()}`);
+ expect(contractBonus).to.be.closeTo(depositBonus, 1n);
+ });
+ });
+ });
+
+ const invalidArgs = [
+ {
+ name: "MaxBonusRate > MAX_PERCENT",
+ newMaxBonusRate: () => MAX_PERCENT + 1n,
+ newOptimalBonusRate: () => BigInt(0.2 * 10 ** 8), //0.2%
+ newDepositUtilizationKink: () => BigInt(25 * 10 ** 8),
+ customError: "ParameterExceedsLimits",
+ },
+ {
+ name: "OptimalBonusRate > MAX_PERCENT",
+ newMaxBonusRate: () => BigInt(2 * 10 ** 8),
+ newOptimalBonusRate: () => MAX_PERCENT + 1n,
+ newDepositUtilizationKink: () => BigInt(25 * 10 ** 8),
+ customError: "ParameterExceedsLimits",
+ },
+ {
+ name: "DepositUtilizationKink > MAX_PERCENT",
+ newMaxBonusRate: () => BigInt(2 * 10 ** 8),
+ newOptimalBonusRate: () => BigInt(0.2 * 10 ** 8), //0.2%
+ newDepositUtilizationKink: () => MAX_PERCENT + 1n,
+ customError: "ParameterExceedsLimits",
+ },
+ ];
+ invalidArgs.forEach(function (arg) {
+ it(`setDepositBonusParams reverts when ${arg.name}`, async function () {
+ await expect(
+ omniVault.setDepositBonusParams(
+ arg.newMaxBonusRate(),
+ arg.newOptimalBonusRate(),
+ arg.newDepositUtilizationKink(),
+ ),
+ ).to.be.revertedWithCustomError(omniVault, arg.customError);
+ });
+ });
+
+ it("setDepositBonusParams reverts when caller is not an owner", async function () {
+ await expect(
+ omniVault
+ .connect(signer1)
+ .setDepositBonusParams(BigInt(2 * 10 ** 8), BigInt(0.2 * 10 ** 8), BigInt(25 * 10 ** 8)),
+ ).to.be.revertedWithCustomError(omniVault, "OwnableUnauthorizedAccount");
+ });
+ });
+
+ describe("Flash withdraw", function () {
+ let TARGET, MAX_PERCENT, ratio;
+ beforeEach(async function () {
+ await snapshot.restore();
+ TARGET = toWei(10);
+ await omniVault.setTargetFlashCapacity(TARGET);
+ MAX_PERCENT = await omniVault.MAX_PERCENT();
+ });
+
+ const args = [
+ {
+ name: "some amount when capacity > TARGET",
+ poolCapacity: () => TARGET * 2n,
+ amount: async () => randomBIMax(TARGET / 2n),
+ receiver: () => signer1,
+ },
+ {
+ name: "all capacity above TARGET",
+ poolCapacity: () => TARGET * 2n,
+ amount: async () => (await omniVault.getFlashCapacity()) - TARGET,
+ receiver: () => signer1,
+ },
+ {
+ name: "all when pool capacity > TARGET",
+ poolCapacity: () => TARGET + e18,
+ amount: async () => await omniVault.getFlashCapacity(),
+ receiver: () => signer1,
+ },
+ {
+ name: "partially when pool capacity = TARGET",
+ poolCapacity: () => TARGET,
+ amount: async () => (await omniVault.getFlashCapacity()) / 2n,
+ receiver: () => signer1,
+ },
+ {
+ name: "all when pool capacity = TARGET",
+ poolCapacity: () => TARGET,
+ amount: async () => await omniVault.getFlashCapacity(),
+ receiver: () => signer1,
+ },
+ {
+ name: "partially when pool capacity < TARGET",
+ poolCapacity: () => (TARGET * 3n) / 4n,
+ amount: async () => (await omniVault.getFlashCapacity()) / 2n,
+ receiver: () => signer1,
+ },
+ {
+ name: "all when pool capacity < TARGET",
+ poolCapacity: () => (TARGET * 3n) / 4n,
+ amount: async () => await omniVault.getFlashCapacity(),
+ receiver: () => signer1,
+ },
+ {
+ name: "to another address",
+ poolCapacity: () => (TARGET * 3n) / 4n,
+ amount: async () => (await omniVault.getFlashCapacity()) / 2n,
+ receiver: () => signer2,
+ },
+ {
+ name: "after protocol fee has been changed",
+ poolCapacity: () => TARGET,
+ amount: async () => await omniVault.getFlashCapacity(),
+ receiver: () => signer1,
+ protocolFee: () => BigInt(25 * 10 ** 8),
+ },
+ ];
+
+ args.forEach(function (arg) {
+ it(`flashWithdraw: ${arg.name}`, async function () {
+ ratio = toWei(0.8);
+ await ratioFeedL2.updateRatioBatch([iToken.address], [ratio]);
+ //Deposit
+ const predepositAmount = arg.poolCapacity();
+ await omniVault.connect(signer1).deposit(signer1.address, { value: predepositAmount });
+ //Set protocol fee
+ let protocolFee = await omniVault.protocolFee();
+ if (arg.protocolFee) {
+ protocolFee = arg.protocolFee();
+ await omniVault.setProtocolFee(protocolFee);
+ }
+ //flashWithdraw
+ const ratioBefore = await omniVault.ratio();
+ console.log(`Ratio before:\t\t\t${ratioBefore.format()}`);
+
+ const receiver = await arg.receiver();
+ const sharesBefore = await iToken.balanceOf(signer1);
+ const assetBalanceBefore = await ethers.provider.getBalance(receiver);
+ const treasuryBalanceBefore = await ethers.provider.getBalance(treasury);
+ const totalAssetsBefore = await omniVault.totalAssets();
+ const flashCapacityBefore = await omniVault.getFlashCapacity();
+ console.log(`Flash capacity before:\t${flashCapacityBefore.format()}`);
+
+ const amount = await arg.amount();
+ const shares = await omniVault.convertToShares(amount);
+ const expectedFee = await omniVault.calculateFlashWithdrawFee(amount);
+ console.log(`Expected fee:\t\t\t${expectedFee.format()}`);
+
+ let tx = await omniVault.connect(signer1).flashWithdraw(shares, receiver.address);
+ const receipt = await tx.wait();
+ const txFee = receiver.address === signer1.address ? BigInt(receipt.gasUsed * receipt.gasPrice) : 0n;
+ const withdrawEvent = receipt?.logs.filter(e => e.eventName === "FlashWithdraw");
+ expect(withdrawEvent.length).to.be.eq(1);
+ expect(withdrawEvent[0].args["sender"]).to.be.eq(signer1.address);
+ expect(withdrawEvent[0].args["receiver"]).to.be.eq(receiver.address);
+ expect(withdrawEvent[0].args["owner"]).to.be.eq(signer1.address);
+ expect(withdrawEvent[0].args["amount"]).to.be.closeTo(amount - expectedFee, 2n);
+ expect(withdrawEvent[0].args["iShares"]).to.be.closeTo(shares, 2n);
+ const actualFee = withdrawEvent[0].args["fee"];
+ console.log(`Actual fee:\t\t\t\t${actualFee.format()}`);
+
+ const sharesAfter = await iToken.balanceOf(signer1);
+ const assetBalanceAfter = await ethers.provider.getBalance(receiver);
+ const treasuryBalanceAfter = await ethers.provider.getBalance(treasury);
+ const totalAssetsAfter = await omniVault.totalAssets();
+ const flashCapacityAfter = await omniVault.getFlashCapacity();
+ console.log(`Shares diff:\t\t\t${(sharesBefore - sharesAfter).format()}`);
+ console.log(`Receiver balance diff:\t${(assetBalanceAfter - assetBalanceBefore).format()}`);
+ console.log(`TotalAssets diff:\t\t${(totalAssetsBefore - totalAssetsAfter).format()}`);
+ console.log(`Flash capacity diff:\t${(flashCapacityBefore - flashCapacityAfter).format()}`);
+
+ expect(sharesBefore - sharesAfter).to.be.eq(shares);
+ expect(assetBalanceAfter - assetBalanceBefore).to.be.closeTo(amount - expectedFee - txFee, 2n);
+ expect(actualFee).to.be.closeTo(expectedFee, 2n);
+ const toDepositBonus = (expectedFee * (MAX_PERCENT - protocolFee)) / MAX_PERCENT;
+ const toTreasury = (expectedFee * protocolFee) / MAX_PERCENT;
+ expect(treasuryBalanceAfter - treasuryBalanceBefore).to.be.closeTo(toTreasury, 2n);
+ expect(totalAssetsBefore - totalAssetsAfter).to.be.closeTo(amount - toDepositBonus, 2n);
+ expect(flashCapacityBefore - flashCapacityAfter).to.be.closeTo(amount, 2n);
+ });
+ });
+
+ it("Reverts when capacity is not sufficient", async function () {
+ await omniVault.connect(signer1).deposit(signer1.address, { value: toWei(1) });
+ ratio = toWei(0.8);
+ await ratioFeedL2.updateRatioBatch([iToken.address], [ratio]);
+ const shares = await iToken.balanceOf(signer1.address);
+ const capacity = await omniVault.getFlashCapacity();
+ await expect(omniVault.connect(signer1).flashWithdraw(shares, signer1.address))
+ .to.be.revertedWithCustomError(omniVault, "InsufficientCapacity")
+ .withArgs(capacity);
+ });
+
+ it("Reverts when amount < min", async function () {
+ await omniVault.connect(signer1).deposit(signer1.address, { value: toWei(1) });
+ const minAmount = await omniVault.minAmount();
+ const shares = (await omniVault.convertToShares(minAmount)) - 1n;
+ await expect(omniVault.connect(signer1).flashWithdraw(shares, signer1.address))
+ .to.be.revertedWithCustomError(omniVault, "LowerMinAmount")
+ .withArgs(minAmount);
+ });
+
+ it("Reverts when omniVault is paused", async function () {
+ await omniVault.connect(signer1).deposit(signer1.address, { value: toWei(1) });
+ await omniVault.pause();
+ const shares = await iToken.balanceOf(signer1.address);
+ await expect(
+ omniVault.connect(signer1).flashWithdraw(shares / 2n, signer1.address),
+ ).to.be.revertedWithCustomError(omniVault, "EnforcedPause");
+ });
+
+ it("Reverts when withdraws to 0 address", async function () {
+ await omniVault.connect(signer1).deposit(signer1.address, { value: toWei(1) });
+ const shares = await iToken.balanceOf(signer1.address);
+ await expect(
+ omniVault.connect(signer1).flashWithdraw(shares / 2n, ethers.ZeroAddress),
+ ).to.be.revertedWithCustomError(omniVault, "NullParams");
+ });
+
+ it("Reverts when shares = 0", async function () {
+ await omniVault.connect(signer1).deposit(signer1.address, { value: toWei(1) });
+ await expect(omniVault.connect(signer1).flashWithdraw(0n, signer1.address)).to.be.revertedWithCustomError(
+ omniVault,
+ "NullParams",
+ );
+ });
+ });
+
+ describe("Withdraw fee params setter and calculation", function () {
+ let TARGET, MAX_PERCENT, localSnapshot;
+ before(async function () {
+ MAX_PERCENT = await omniVault.MAX_PERCENT();
+ });
+
+ const withdrawFeeSegment = [
+ {
+ fromUtilization: async () => 0n,
+ fromPercent: async () => await omniVault.maxFlashFeeRate(),
+ toUtilization: async () => await omniVault.withdrawUtilizationKink(),
+ toPercent: async () => await omniVault.optimalWithdrawalRate(),
+ },
+ {
+ fromUtilization: async () => await omniVault.withdrawUtilizationKink(),
+ fromPercent: async () => await omniVault.optimalWithdrawalRate(),
+ toUtilization: async () => await omniVault.MAX_PERCENT(),
+ toPercent: async () => await omniVault.optimalWithdrawalRate(),
+ },
+ {
+ fromUtilization: async () => await omniVault.MAX_PERCENT(),
+ fromPercent: async () => 0n,
+ toUtilization: async () => ethers.MaxUint256,
+ toPercent: async () => 0n,
+ },
+ ];
+
+ const args = [
+ {
+ name: "Normal withdraw fee profile > 0",
+ newMaxFlashFeeRate: BigInt(2 * 10 ** 8), //2%
+ newOptimalWithdrawalRate: BigInt(0.2 * 10 ** 8), //0.2%
+ newWithdrawUtilizationKink: BigInt(25 * 10 ** 8),
+ },
+ {
+ name: "Optimal utilization = 0 => always optimal rate",
+ newMaxFlashFeeRate: BigInt(2 * 10 ** 8),
+ newOptimalWithdrawalRate: BigInt(10 ** 8), //1%
+ newWithdrawUtilizationKink: 0n,
+ },
+ {
+ name: "Optimal withdraw rate = 0",
+ newMaxFlashFeeRate: BigInt(2 * 10 ** 8),
+ newOptimalWithdrawalRate: 0n,
+ newWithdrawUtilizationKink: BigInt(25 * 10 ** 8),
+ },
+ {
+ name: "Optimal withdraw rate = max > 0 => rate is constant over utilization",
+ newMaxFlashFeeRate: BigInt(2 * 10 ** 8),
+ newOptimalWithdrawalRate: BigInt(2 * 10 ** 8),
+ newWithdrawUtilizationKink: BigInt(25 * 10 ** 8),
+ },
+ {
+ name: "Optimal withdraw rate = max = 0 => no fee",
+ newMaxFlashFeeRate: 0n,
+ newOptimalWithdrawalRate: 0n,
+ newWithdrawUtilizationKink: BigInt(25 * 10 ** 8),
+ },
+ //Will fail when optimalWithdrawalRate > MaxFlashFeeRate
+ ];
+
+ const amounts = [
+ {
+ name: "from 200% to 0% of TARGET",
+ flashCapacity: () => TARGET * 2n,
+ amount: async () => await omniVault.getFlashCapacity(),
+ },
+ {
+ name: "from 100% to 0% of TARGET",
+ flashCapacity: () => TARGET,
+ amount: async () => await omniVault.getFlashCapacity(),
+ },
+ {
+ name: "1 wei from 100%",
+ flashCapacity: () => TARGET,
+ amount: async () => 1n,
+ },
+ {
+ name: "min amount from 100%",
+ flashCapacity: () => TARGET,
+ amount: async () => (await omniVault.convertToAssets(await omniVault.minAmount())) + 1n,
+ },
+ {
+ name: "from 100% to 25% of TARGET",
+ flashCapacity: () => TARGET,
+ amount: async () => (TARGET * 75n) / 100n,
+ },
+ {
+ name: "from 100% to 25% - 1wei of TARGET",
+ flashCapacity: () => TARGET,
+ amount: async () => (TARGET * 75n) / 100n + 1n,
+ },
+ {
+ name: "from 25% to 0% of TARGET",
+ flashCapacity: () => (TARGET * 25n) / 100n,
+ amount: async () => await omniVault.getFlashCapacity(),
+ },
+ ];
+
+ args.forEach(function (arg) {
+ it(`setFlashWithdrawFeeParams: ${arg.name}`, async function () {
+ await snapshot.restore();
+ TARGET = e18;
+ await omniVault.connect(owner).setTargetFlashCapacity(TARGET);
+
+ await expect(
+ omniVault.setFlashWithdrawFeeParams(
+ arg.newMaxFlashFeeRate,
+ arg.newOptimalWithdrawalRate,
+ arg.newWithdrawUtilizationKink,
+ ),
+ )
+ .to.emit(omniVault, "WithdrawFeeParamsChanged")
+ .withArgs(arg.newMaxFlashFeeRate, arg.newOptimalWithdrawalRate, arg.newWithdrawUtilizationKink);
+
+ expect(await omniVault.maxFlashFeeRate()).to.be.eq(arg.newMaxFlashFeeRate);
+ expect(await omniVault.optimalWithdrawalRate()).to.be.eq(arg.newOptimalWithdrawalRate);
+ expect(await omniVault.withdrawUtilizationKink()).to.be.eq(arg.newWithdrawUtilizationKink);
+ localSnapshot = await takeSnapshot();
+ });
+
+ amounts.forEach(function (amount) {
+ it(`calculateFlashWithdrawFee for: ${amount.name}`, async function () {
+ await localSnapshot.restore();
+ if (amount.flashCapacity() > 0n) {
+ await omniVault.connect(signer1).deposit(signer1.address, { value: amount.flashCapacity() });
+ }
+ let flashCapacity = await omniVault.getFlashCapacity();
+ console.log(`flash capacity: ${flashCapacity.format()}`);
+ let _amount = await amount.amount();
+ let withdrawFee = 0n;
+ while (_amount > 0n) {
+ for (const feeFunc of withdrawFeeSegment) {
+ const utilization = (flashCapacity * MAX_PERCENT) / TARGET;
+ const fromUtilization = await feeFunc.fromUtilization();
+ const toUtilization = await feeFunc.toUtilization();
+ if (_amount > 0n && fromUtilization < utilization && utilization <= toUtilization) {
+ console.log(`Utilization:\t\t\t${utilization.format()}`);
+ const fromPercent = await feeFunc.fromPercent();
+ const toPercent = await feeFunc.toPercent();
+ const lowerBound = (fromUtilization * TARGET) / MAX_PERCENT;
+ const replenished = lowerBound > flashCapacity - _amount ? flashCapacity - lowerBound : _amount;
+ const slope = ((toPercent - fromPercent) * MAX_PERCENT) / (toUtilization - fromUtilization);
+ const withdrawFeePercent = fromPercent + (slope * (flashCapacity - replenished / 2n)) / TARGET;
+ const fee = (replenished * withdrawFeePercent) / MAX_PERCENT;
+ console.log(`Replenished:\t\t\t${replenished.format()}`);
+ console.log(`Fee percent:\t\t\t${withdrawFeePercent.format()}`);
+ console.log(`Fee:\t\t\t\t\t${fee.format()}`);
+ flashCapacity -= replenished;
+ _amount -= replenished;
+ withdrawFee += fee;
+ }
+ }
+ }
+ let contractFee = await omniVault.calculateFlashWithdrawFee(await amount.amount());
+ console.log(`Expected withdraw fee:\t${withdrawFee.format()}`);
+ console.log(`Contract withdraw fee:\t${contractFee.format()}`);
+ expect(contractFee).to.be.closeTo(withdrawFee, 1n);
+ });
+ });
+ });
+
+ const invalidArgs = [
+ {
+ name: "MaxBonusRate > MAX_PERCENT",
+ newMaxFlashFeeRate: () => MAX_PERCENT + 1n,
+ newOptimalWithdrawalRate: () => BigInt(0.2 * 10 ** 8), //0.2%
+ newWithdrawUtilizationKink: () => BigInt(25 * 10 ** 8),
+ customError: "ParameterExceedsLimits",
+ },
+ {
+ name: "OptimalBonusRate > MAX_PERCENT",
+ newMaxFlashFeeRate: () => BigInt(2 * 10 ** 8),
+ newOptimalWithdrawalRate: () => MAX_PERCENT + 1n,
+ newWithdrawUtilizationKink: () => BigInt(25 * 10 ** 8),
+ customError: "ParameterExceedsLimits",
+ },
+ {
+ name: "DepositUtilizationKink > MAX_PERCENT",
+ newMaxFlashFeeRate: () => BigInt(2 * 10 ** 8),
+ newOptimalWithdrawalRate: () => BigInt(0.2 * 10 ** 8), //0.2%
+ newWithdrawUtilizationKink: () => MAX_PERCENT + 1n,
+ customError: "ParameterExceedsLimits",
+ },
+ ];
+ invalidArgs.forEach(function (arg) {
+ it(`setFlashWithdrawFeeParams reverts when ${arg.name}`, async function () {
+ await expect(
+ omniVault.setFlashWithdrawFeeParams(
+ arg.newMaxFlashFeeRate(),
+ arg.newOptimalWithdrawalRate(),
+ arg.newWithdrawUtilizationKink(),
+ ),
+ ).to.be.revertedWithCustomError(omniVault, arg.customError);
+ });
+ });
+
+ it("calculateFlashWithdrawFee reverts when capacity is not sufficient", async function () {
+ await snapshot.restore();
+ await omniVault.connect(signer1).deposit(signer1.address, { value: randomBI(19) });
+ const capacity = await omniVault.getFlashCapacity();
+ await expect(omniVault.calculateFlashWithdrawFee(capacity + 1n))
+ .to.be.revertedWithCustomError(omniVault, "InsufficientCapacity")
+ .withArgs(capacity);
+ });
+
+ it("setFlashWithdrawFeeParams reverts when caller is not an owner", async function () {
+ await expect(
+ omniVault
+ .connect(signer1)
+ .setFlashWithdrawFeeParams(BigInt(2 * 10 ** 8), BigInt(0.2 * 10 ** 8), BigInt(25 * 10 ** 8)),
+ ).to.be.revertedWithCustomError(omniVault, "OwnableUnauthorizedAccount");
+ });
+ });
+
+ describe("Setters", function () {
+ beforeEach(async function () {
+ await snapshot.restore();
+ });
+
+ it("setTreasuryAddress(): only owner can", async function () {
+ const newTreasury = ethers.Wallet.createRandom().address;
+
+ const currentTreasury = await omniVault.treasury();
+
+ await expect(omniVault.setTreasuryAddress(newTreasury))
+ .to.emit(omniVault, "TreasuryUpdated")
+ .withArgs(currentTreasury, newTreasury);
+
+ expect(await omniVault.treasury()).to.be.eq(newTreasury);
+ });
+
+ it("setTreasuryAddress(): reverts when set to zero address", async function () {
+ await expect(omniVault.setTreasuryAddress(ethers.ZeroAddress)).to.be.revertedWithCustomError(
+ omniVault,
+ "NullParams",
+ );
+ });
+
+ it("setTreasuryAddress(): reverts when caller is not an owner", async function () {
+ await expect(omniVault.connect(signer1).setTreasuryAddress(signer1.address)).to.be.revertedWithCustomError(
+ omniVault,
+ "OwnableUnauthorizedAccount",
+ );
+ });
+
+ it("setRatioFeed(): only owner can", async function () {
+ const ratioFeed = await omniVault.ratioFeed();
+ const iRatioFeedFactory = await ethers.getContractFactory("InceptionRatioFeed");
+ const newRatioFeed = await upgrades.deployProxy(iRatioFeedFactory, []);
+ newRatioFeed.address = await newRatioFeed.getAddress();
+ await expect(omniVault.setRatioFeed(newRatioFeed.address))
+ .to.emit(omniVault, "RatioFeedChanged")
+ .withArgs(ratioFeed, newRatioFeed.address);
+ expect(await omniVault.ratioFeed()).to.be.eq(newRatioFeed.address);
+
+ const ratio = randomBI(18);
+ await newRatioFeed.updateRatioBatch([await iToken.getAddress()], [ratio]);
+ expect(await omniVault.ratio()).to.be.eq(ratio);
+ });
+
+ it("setRatioFeed(): reverts when new value is zero address", async function () {
+ await expect(omniVault.setRatioFeed(ethers.ZeroAddress)).to.be.revertedWithCustomError(omniVault, "NullParams");
+ });
+
+ it("setRatioFeed(): reverts when caller is not an owner", async function () {
+ const newRatioFeed = ethers.Wallet.createRandom().address;
+ await expect(omniVault.connect(signer1).setRatioFeed(newRatioFeed)).to.be.revertedWithCustomError(
+ omniVault,
+ "OwnableUnauthorizedAccount",
+ );
+ });
+
+ it("setOperator(): only owner can", async function () {
+ const newValue = ethers.Wallet.createRandom().address;
+ await expect(omniVault.setOperator(newValue))
+ .to.emit(omniVault, "OperatorChanged")
+ .withArgs(operator.address, newValue);
+ expect(await omniVault.operator()).to.be.eq(newValue);
+ });
+
+ it("setOperator(): reverts when caller is not an owner", async function () {
+ await expect(omniVault.connect(signer1).setOperator(signer1.address)).to.be.revertedWithCustomError(
+ omniVault,
+ "OwnableUnauthorizedAccount",
+ );
+ });
+
+ it("ratio() reverts when ratioFeed is 0 address", async function () {
+ const omniVaultFactory = await ethers.getContractFactory("InceptionOmniVault");
+ const omniVault = await upgrades.deployProxy(
+ omniVaultFactory,
+ ["Omnivault", operator.address, iToken.address, ethers.ZeroAddress],
+ { initializer: "__InceptionOmniVault_init" },
+ );
+ omniVault.address = await omniVault.getAddress();
+ await iToken.setVault(omniVault.address);
+ await expect(omniVault.ratio()).to.be.reverted;
+ });
+
+ it("setCrossChainAdapter(): only owner can", async function () {
+ const newValue = ethers.Wallet.createRandom().address;
+
+ // Capture the current cross-chain adapter address before making the change
+ const currentAdapter = await omniVault.crossChainAdapter();
+
+ // Expect the event to include both the previous and new cross-chain adapter addresses
+ await expect(omniVault.setCrossChainAdapter(newValue))
+ .to.emit(omniVault, "CrossChainAdapterChanged")
+ .withArgs(currentAdapter, newValue);
+
+ // Verify the cross-chain adapter address has been updated
+ expect(await omniVault.crossChainAdapter()).to.be.eq(newValue);
+ });
+
+ it("setCrossChainAdapter(): reverts when set to zero address", async function () {
+ await expect(omniVault.setCrossChainAdapter(ethers.ZeroAddress)).to.be.revertedWithCustomError(
+ omniVault,
+ "NullParams",
+ );
+ });
+
+ it("setCrossChainAdapter(): reverts when caller is not an owner", async function () {
+ await expect(omniVault.connect(signer1).setCrossChainAdapter(signer1.address)).to.be.revertedWithCustomError(
+ omniVault,
+ "OwnableUnauthorizedAccount",
+ );
+ });
+
+ it("setMinAmount(): only owner can", async function () {
+ const prevValue = await omniVault.minAmount();
+ const newMinAmount = randomBI(4);
+ await expect(omniVault.setMinAmount(newMinAmount))
+ .to.emit(omniVault, "MinAmountChanged")
+ .withArgs(prevValue, newMinAmount);
+ expect(await omniVault.minAmount()).to.be.eq(newMinAmount);
+ await expect(omniVault.connect(signer1).deposit(signer1.address, { value: newMinAmount - 1n }))
+ .to.be.revertedWithCustomError(omniVault, "LowerMinAmount")
+ .withArgs(newMinAmount);
+ });
+
+ it("setMinAmount(): reverts when called by not an owner", async function () {
+ await expect(omniVault.connect(signer1).setMinAmount(randomBI(3))).to.be.revertedWithCustomError(
+ omniVault,
+ "OwnableUnauthorizedAccount",
+ );
+ });
+
+ it("setTargetFlashCapacity(): only owner can", async function () {
+ const prevValue = await omniVault.targetCapacity();
+ const newValue = randomBI(18);
+ await expect(omniVault.setTargetFlashCapacity(newValue))
+ .to.emit(omniVault, "TargetCapacityChanged")
+ .withArgs(prevValue, newValue);
+ expect(await omniVault.targetCapacity()).to.be.eq(newValue);
+ });
+
+ it("setTargetFlashCapacity(): reverts when called by not an owner", async function () {
+ const newValue = randomBI(18);
+ await expect(omniVault.connect(signer1).setTargetFlashCapacity(newValue)).to.be.revertedWithCustomError(
+ omniVault,
+ "OwnableUnauthorizedAccount",
+ );
+ });
+
+ it("setTargetFlashCapacity(): reverts when sets to 0", async function () {
+ await expect(omniVault.setTargetFlashCapacity(0n)).to.be.revertedWithCustomError(omniVault, "NullParams");
+ });
+
+ it("setProtocolFee(): sets share of flashWithdrawFee that goes to treasury", async function () {
+ const prevValue = await omniVault.protocolFee();
+ const newValue = randomBI(10);
+ await expect(omniVault.setProtocolFee(newValue))
+ .to.emit(omniVault, "ProtocolFeeChanged")
+ .withArgs(prevValue, newValue);
+ expect(await omniVault.protocolFee()).to.be.eq(newValue);
+ });
+
+ it("setProtocolFee(): reverts when > MAX_PERCENT", async function () {
+ const newValue = (await omniVault.MAX_PERCENT()) + 1n;
+ await expect(omniVault.setProtocolFee(newValue))
+ .to.be.revertedWithCustomError(omniVault, "ParameterExceedsLimits")
+ .withArgs(newValue);
+ });
+
+ it("setProtocolFee(): reverts when caller is not an owner", async function () {
+ const newValue = randomBI(10);
+ await expect(omniVault.connect(signer1).setProtocolFee(newValue)).to.be.revertedWithCustomError(
+ omniVault,
+ "OwnableUnauthorizedAccount",
+ );
+ });
+
+ it("setName(): only owner can", async function () {
+ const prevValue = await omniVault.name();
+ const newValue = "New name";
+ await expect(omniVault.setName(newValue)).to.emit(omniVault, "NameChanged").withArgs(prevValue, newValue);
+ expect(await omniVault.name()).to.be.eq(newValue);
+ });
+
+ it("setName(): reverts when new name is blank", async function () {
+ await expect(omniVault.setName("")).to.be.revertedWithCustomError(omniVault, "NullParams");
+ });
+
+ it("setName(): reverts when called by not an owner", async function () {
+ await expect(omniVault.connect(signer1).setName("New name")).to.be.revertedWithCustomError(
+ omniVault,
+ "OwnableUnauthorizedAccount",
+ );
+ });
+
+ it("pause(): only owner can", async function () {
+ expect(await omniVault.paused()).is.false;
+ await expect(omniVault.pause()).to.emit(omniVault, "Paused").withArgs(owner.address);
+ expect(await omniVault.paused()).is.true;
+ });
+
+ it("pause(): reverts when called by not an owner", async function () {
+ await expect(omniVault.connect(signer1).pause()).to.be.revertedWithCustomError(
+ omniVault,
+ "OwnableUnauthorizedAccount",
+ );
+ });
+
+ it("pause(): reverts when already paused", async function () {
+ await omniVault.pause();
+ await expect(omniVault.pause()).revertedWithCustomError(omniVault, "EnforcedPause");
+ });
+
+ it("unpause(): only owner can", async function () {
+ await omniVault.pause();
+ expect(await omniVault.paused()).is.true;
+
+ await expect(omniVault.unpause()).to.emit(omniVault, "Unpaused").withArgs(owner.address);
+ expect(await omniVault.paused()).is.false;
+ });
+
+ it("unpause(): reverts when called by not an owner", async function () {
+ await omniVault.pause();
+ expect(await omniVault.paused()).is.true;
+ await expect(omniVault.connect(signer1).unpause()).to.be.revertedWithCustomError(
+ omniVault,
+ "OwnableUnauthorizedAccount",
+ );
+ });
+ });
+
+ describe("Bridge", function () {
+ describe("Send eth", function () {
+ let TARGET = e18;
+
+ beforeEach(async function () {
+ await snapshot.restore();
+ await omniVault.setTargetFlashCapacity(TARGET);
+ });
+
+ const args = [
+ {
+ name: "without extra value",
+ extraValue: 0n,
+ },
+ {
+ name: "with extra value",
+ extraValue: 3n * 10n ** 16n,
+ },
+ ];
+ args.forEach(function (arg) {
+ it(`sendEthToL1 ${arg.name}`, async function () {
+ await omniVault.connect(signer1).deposit(signer1, { value: TARGET + e18 });
+ const amount = await omniVault.getFreeBalance();
+ const options = Options.newOptions().addExecutorLzReceiveOption(200_000n, amount).toHex().toString();
+
+ const fee = await omniVault.quoteSendEthCrossChain(ETH_ID, options);
+ const extraValue = arg.extraValue;
+ const tx = await omniVault
+ .connect(operator)
+ .sendEthCrossChain(ETH_ID, options, { value: fee + extraValue });
+
+ await expect(tx)
+ .emit(omniVault, "EthCrossChainSent")
+ .withArgs(amount + fee + extraValue, ETH_ID);
+ await expect(tx).to.changeEtherBalance(rebalancer.address, amount);
+ await expect(tx).to.changeEtherBalance(operator.address, -fee - extraValue, { includeFee: false });
+ await expect(tx).to.changeEtherBalance(omniVault.address, -amount + extraValue); //Extra value stays at omniVault
+ });
+ });
+
+ it("Reverts when there is no free balance", async function () {
+ await omniVault.connect(signer1).deposit(signer1, { value: TARGET });
+ expect(await omniVault.getFreeBalance()).to.be.eq(0n);
+
+ const options = Options.newOptions().addExecutorLzReceiveOption(200_000n, 0n).toHex().toString();
+ await expect(
+ omniVault.connect(operator).sendEthCrossChain(ETH_ID, options, { value: 0n }),
+ ).to.revertedWithCustomError(omniVault, "FreeBalanceIsZero");
+ });
+
+ it("Reverts when called by not an operator", async function () {
+ await omniVault.connect(signer1).deposit(signer1, { value: TARGET * 2n });
+ const amount = await omniVault.getFreeBalance();
+
+ const options = Options.newOptions().addExecutorLzReceiveOption(200_000n, amount).toHex().toString();
+ const fee = await omniVault.quoteSendEthCrossChain(ETH_ID, options);
+ await expect(
+ omniVault.connect(signer1).sendEthCrossChain(ETH_ID, options, { value: fee }),
+ ).to.revertedWithCustomError(omniVault, "OnlyOwnerOrOperator");
+ });
+ });
+
+ describe("Send info", function () {
+ let TARGET = e18;
+
+ beforeEach(async function () {
+ await snapshot.restore();
+ await omniVault.setTargetFlashCapacity(TARGET);
+ });
+
+ const args = [
+ {
+ name: "When there are no eth and shares",
+ depositedEthAmount: () => 0n,
+ msgSender: () => operator,
+ },
+ {
+ name: "After deposit",
+ depositedEthAmount: () => randomBI(18),
+ msgSender: () => operator,
+ },
+ {
+ name: "After deposit when deposit bonus > 0",
+ depositedEthAmount: () => e18,
+ depositBonus: true,
+ msgSender: () => operator,
+ },
+ {
+ name: "When there are shares, but eth was sent to L1",
+ depositedEthAmount: () => TARGET + e18,
+ depositBonus: true,
+ sentToL1EthAmount: amount => amount - TARGET,
+ msgSender: () => operator,
+ },
+ {
+ name: "Owner can call",
+ depositedEthAmount: () => TARGET + randomBI(18),
+ depositBonus: true,
+ sentToL1EthAmount: amount => amount - TARGET,
+ msgSender: () => owner,
+ },
+ ];
+ args.forEach(function (arg) {
+ it(`sendAssetsInfoToL1 ${arg.name}`, async function () {
+ let amount = arg.depositedEthAmount();
+ if (amount > 0n) {
+ await omniVault.connect(signer1).deposit(signer1, { value: amount });
+ }
+
+ if (arg.depositBonus) {
+ await addReplenishBonusToOmniVault(TARGET);
+ }
+ const depositBonus = await omniVault.depositBonusAmount();
+
+ let sentToL1Amount = 0n;
+ if (arg.sentToL1EthAmount) {
+ sentToL1Amount = arg.sentToL1EthAmount(amount);
+ const options = Options.newOptions()
+ .addExecutorLzReceiveOption(200_000n, sentToL1Amount)
+ .toHex()
+ .toString();
+ const fee = await omniVault.quoteSendEthCrossChain(ETH_ID, options);
+ await omniVault.connect(operator).sendEthCrossChain(ETH_ID, options, { value: fee });
+ }
+
+ const vaultBalance = await ethers.provider.getBalance(omniVault.address);
+ const freeBalance = await omniVault.getFreeBalance();
+ const totalSupply = await iToken.totalSupply();
+ const expectedVaultBalance = amount + depositBonus - sentToL1Amount;
+ console.log("Vault balance:\t\t", vaultBalance.format());
+ console.log("Free balance:\t\t", freeBalance.format());
+ console.log("Deposit bonus:\t\t", depositBonus.format());
+ console.log("Sent to L1 eth:\t\t", sentToL1Amount.format());
+ console.log("Total deposited:\t", (await omniVault.getFlashCapacity()).format());
+ expect(vaultBalance).to.be.eq(expectedVaultBalance);
+
+ const options = Options.newOptions().addExecutorLzReceiveOption(200_000n, 0n).toHex().toString();
+ const fee = await omniVault.quoteSendAssetsInfoToL1(options);
+ const tx = await omniVault.connect(arg.msgSender()).sendAssetsInfoToL1(options, { value: fee });
+ const rec = await tx.wait();
+ const block = await ethers.provider.getBlock(rec?.blockNumber);
+ await expect(tx)
+ .emit(omniVault, "MessageToL1Sent")
+ .withArgs(totalSupply, amount - sentToL1Amount);
+
+ const txData = await rebalancer.getTransactionData(ARB_ID);
+ expect(txData.timestamp).to.be.eq(block?.timestamp);
+ expect(txData.ethBalance).to.be.eq(amount - sentToL1Amount);
+ expect(txData.inceptionTokenBalance).to.be.eq(totalSupply);
+ });
+ });
+
+ it("Reverts when called by not an operator", async function () {
+ const options = Options.newOptions().addExecutorLzReceiveOption(200_000n, 0n).toHex().toString();
+ const fee = await omniVault.quoteSendAssetsInfoToL1(options);
+ await expect(
+ omniVault.connect(signer1).sendAssetsInfoToL1(options, { value: fee }),
+ ).to.revertedWithCustomError(omniVault, "OnlyOwnerOrOperator");
+ });
+
+ it("Reverts when crosschain adapter is 0 address", async function () {
+ const omniVaultFactory = await ethers.getContractFactory("InceptionOmniVault");
+ const newOmniVault = await upgrades.deployProxy(
+ omniVaultFactory,
+ ["Omnivault", operator.address, iToken.address, ethers.ZeroAddress],
+ { initializer: "__InceptionOmniVault_init" },
+ );
+ newOmniVault.address = await newOmniVault.getAddress();
+ await newOmniVault.setRatioFeed(ratioFeedL2.address);
+ await iToken.setVault(newOmniVault.address);
+
+ const options = Options.newOptions().addExecutorLzReceiveOption(200_000n, 0n).toHex().toString();
+ const fee = await omniVault.quoteSendAssetsInfoToL1(options);
+ await expect(
+ newOmniVault.connect(operator).sendAssetsInfoToL1(options, { value: fee }),
+ ).to.revertedWithCustomError(newOmniVault, "CrossChainAdapterNotSet");
+ });
+ });
+ });
+ });
+});
diff --git a/projects/tests/omnivault-rebalancer/test/helpers/utils.js b/projects/tests/omnivault-rebalancer/test/helpers/utils.js
new file mode 100644
index 00000000..fbc71b3f
--- /dev/null
+++ b/projects/tests/omnivault-rebalancer/test/helpers/utils.js
@@ -0,0 +1,96 @@
+const helpers = require("@nomicfoundation/hardhat-network-helpers");
+const { ethers } = require("hardhat");
+const { keccak256, toUtf8Bytes, AbiCoder } = require("ethers");
+BigInt.prototype.format = function () {
+ return this.toLocaleString("de-DE");
+};
+
+const impersonateWithEth = async (address, amount) => {
+ await helpers.impersonateAccount(address);
+ const account = await ethers.getSigner(address);
+
+ //Deposit some Eth to account
+ if (amount > 0n) {
+ const [treasury] = await ethers.getSigners();
+ await treasury.sendTransaction({ to: address, value: amount });
+ }
+
+ console.log(`Account impersonated at address: ${account.address}`);
+ return account;
+};
+
+const getStaker = async (address, iVault, asset, donor, amount = 10n ** 21n) => {
+ const staker = await impersonateWithEth(address, toWei(1));
+ await asset.connect(donor).transfer(address, amount);
+ const balanceAfter = await asset.balanceOf(address);
+ await asset.connect(staker).approve(await iVault.getAddress(), balanceAfter);
+ return staker;
+};
+
+const getRandomStaker = async (iVault, asset, donor, amount) => {
+ return await getStaker(ethers.Wallet.createRandom().address, iVault, asset, donor, amount);
+};
+
+const toWei = ether => ethers.parseEther(ether.toString());
+
+const randomBI = length => {
+ if (length > 0) {
+ let randomNum = "";
+ randomNum += Math.floor(Math.random() * 9) + 1; // generates a random digit 1-9
+ for (let i = 0; i < length - 1; i++) {
+ randomNum += Math.floor(Math.random() * 10); // generates a random digit 0-9
+ }
+ return BigInt(randomNum);
+ } else {
+ return 0n;
+ }
+};
+
+const randomBIMax = max => {
+ let random = 0n;
+ if (max > 0n) {
+ random += BigInt(Math.random() * Number(max));
+ }
+ return random;
+};
+
+const e18 = 10n ** 18n;
+
+/**
+ * @return slot number for the value by its internal name for restaking balance ProtocolConfig
+ */
+function getSlotByName(name) {
+ // Perform keccak256 hashing of the string
+ const governanceHash = keccak256(toUtf8Bytes(name));
+
+ // Convert the resulting hash to a BigInt
+ const governanceUint = BigInt(governanceHash);
+
+ // Subtract 1 from the hash
+ const governanceUintMinus1 = governanceUint - 1n;
+
+ // Use the AbiCoder to encode the uint256 type
+ const abiCoder = new AbiCoder();
+ const encodedValue = abiCoder.encode(["uint256"], [governanceUintMinus1]);
+
+ // Re-hash the encoded result
+ const finalHash = keccak256(encodedValue);
+
+ // Perform bitwise AND operation with ~0xff (mask out the last byte)
+ const mask = BigInt("0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00");
+ const governanceSlot = BigInt(finalHash) & mask;
+
+ // Return the result as a hex string (without '0x' prefix)
+ return governanceSlot.toString(16);
+}
+
+module.exports = {
+ impersonateWithEth,
+ getStaker,
+ getRandomStaker,
+ toWei,
+ randomBI,
+ randomBIMax,
+ e18,
+ getSlotByName,
+};
diff --git a/projects/tests/omnivault-rebalancer/tsconfig.json b/projects/tests/omnivault-rebalancer/tsconfig.json
new file mode 100644
index 00000000..e5f1a640
--- /dev/null
+++ b/projects/tests/omnivault-rebalancer/tsconfig.json
@@ -0,0 +1,10 @@
+{
+ "compilerOptions": {
+ "target": "es2020",
+ "module": "commonjs",
+ "esModuleInterop": true,
+ "forceConsistentCasingInFileNames": true,
+ "strict": true,
+ "skipLibCheck": true
+ }
+}
diff --git a/projects/tests/omnivault-rebalancer/yarn.lock b/projects/tests/omnivault-rebalancer/yarn.lock
new file mode 100644
index 00000000..5ba4f3c1
--- /dev/null
+++ b/projects/tests/omnivault-rebalancer/yarn.lock
@@ -0,0 +1,4910 @@
+# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
+# yarn lockfile v1
+
+
+"@adraffy/ens-normalize@1.10.0":
+ version "1.10.0"
+ resolved "https://registry.yarnpkg.com/@adraffy/ens-normalize/-/ens-normalize-1.10.0.tgz#d2a39395c587e092d77cbbc80acf956a54f38bf7"
+ integrity sha512-nA9XHtlAkYfJxY7bce8DcN7eKxWWCWkU+1GR9d+U6MbNpfwQp8TI7vqOsBsMcHoT4mBu2kypKoSKnghEzOOq5Q==
+
+"@aws-crypto/sha256-js@1.2.2":
+ version "1.2.2"
+ resolved "https://registry.yarnpkg.com/@aws-crypto/sha256-js/-/sha256-js-1.2.2.tgz#02acd1a1fda92896fc5a28ec7c6e164644ea32fc"
+ integrity sha512-Nr1QJIbW/afYYGzYvrF70LtaHrIRtd4TNAglX8BvlfxJLZ45SAmueIKYl5tWoNBPzp65ymXGFK0Bb1vZUpuc9g==
+ dependencies:
+ "@aws-crypto/util" "^1.2.2"
+ "@aws-sdk/types" "^3.1.0"
+ tslib "^1.11.1"
+
+"@aws-crypto/util@^1.2.2":
+ version "1.2.2"
+ resolved "https://registry.yarnpkg.com/@aws-crypto/util/-/util-1.2.2.tgz#b28f7897730eb6538b21c18bd4de22d0ea09003c"
+ integrity sha512-H8PjG5WJ4wz0UXAFXeJjWCW1vkvIJ3qUUD+rGRwJ2/hj+xT58Qle2MTql/2MGzkU+1JLAFuR6aJpLAjHwhmwwg==
+ dependencies:
+ "@aws-sdk/types" "^3.1.0"
+ "@aws-sdk/util-utf8-browser" "^3.0.0"
+ tslib "^1.11.1"
+
+"@aws-sdk/types@^3.1.0":
+ version "3.425.0"
+ resolved "https://registry.yarnpkg.com/@aws-sdk/types/-/types-3.425.0.tgz#8d4e94743a69c865a83785a9f3bcfd49945836f7"
+ integrity sha512-6lqbmorwerN4v+J5dqbHPAsjynI0mkEF+blf+69QTaKKGaxBBVaXgqoqul9RXYcK5MMrrYRbQIMd0zYOoy90kA==
+ dependencies:
+ "@smithy/types" "^2.3.4"
+ tslib "^2.5.0"
+
+"@aws-sdk/util-utf8-browser@^3.0.0":
+ version "3.259.0"
+ resolved "https://registry.yarnpkg.com/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.259.0.tgz#3275a6f5eb334f96ca76635b961d3c50259fd9ff"
+ integrity sha512-UvFa/vR+e19XookZF8RzFZBrw2EUkQWxiBW0yYQAhvk3C+QVGl0H3ouca8LDBlBfQKXwmW3huo/59H8rwb1wJw==
+ dependencies:
+ tslib "^2.3.1"
+
+"@chainsafe/as-sha256@^0.3.1":
+ version "0.3.1"
+ resolved "https://registry.yarnpkg.com/@chainsafe/as-sha256/-/as-sha256-0.3.1.tgz#3639df0e1435cab03f4d9870cc3ac079e57a6fc9"
+ integrity sha512-hldFFYuf49ed7DAakWVXSJODuq3pzJEguD8tQ7h+sGkM18vja+OFoJI9krnGmgzyuZC2ETX0NOIcCTy31v2Mtg==
+
+"@chainsafe/persistent-merkle-tree@^0.4.2":
+ version "0.4.2"
+ resolved "https://registry.yarnpkg.com/@chainsafe/persistent-merkle-tree/-/persistent-merkle-tree-0.4.2.tgz#4c9ee80cc57cd3be7208d98c40014ad38f36f7ff"
+ integrity sha512-lLO3ihKPngXLTus/L7WHKaw9PnNJWizlOF1H9NNzHP6Xvh82vzg9F2bzkXhYIFshMZ2gTCEz8tq6STe7r5NDfQ==
+ dependencies:
+ "@chainsafe/as-sha256" "^0.3.1"
+
+"@chainsafe/persistent-merkle-tree@^0.5.0":
+ version "0.5.0"
+ resolved "https://registry.yarnpkg.com/@chainsafe/persistent-merkle-tree/-/persistent-merkle-tree-0.5.0.tgz#2b4a62c9489a5739dedd197250d8d2f5427e9f63"
+ integrity sha512-l0V1b5clxA3iwQLXP40zYjyZYospQLZXzBVIhhr9kDg/1qHZfzzHw0jj4VPBijfYCArZDlPkRi1wZaV2POKeuw==
+ dependencies:
+ "@chainsafe/as-sha256" "^0.3.1"
+
+"@chainsafe/ssz@^0.10.0":
+ version "0.10.2"
+ resolved "https://registry.yarnpkg.com/@chainsafe/ssz/-/ssz-0.10.2.tgz#c782929e1bb25fec66ba72e75934b31fd087579e"
+ integrity sha512-/NL3Lh8K+0q7A3LsiFq09YXS9fPE+ead2rr7vM2QK8PLzrNsw3uqrif9bpRX5UxgeRjM+vYi+boCM3+GM4ovXg==
+ dependencies:
+ "@chainsafe/as-sha256" "^0.3.1"
+ "@chainsafe/persistent-merkle-tree" "^0.5.0"
+
+"@chainsafe/ssz@^0.9.2":
+ version "0.9.4"
+ resolved "https://registry.yarnpkg.com/@chainsafe/ssz/-/ssz-0.9.4.tgz#696a8db46d6975b600f8309ad3a12f7c0e310497"
+ integrity sha512-77Qtg2N1ayqs4Bg/wvnWfg5Bta7iy7IRh8XqXh7oNMeP2HBbBwx8m6yTpA8p0EHItWPEBkgZd5S5/LSlp3GXuQ==
+ dependencies:
+ "@chainsafe/as-sha256" "^0.3.1"
+ "@chainsafe/persistent-merkle-tree" "^0.4.2"
+ case "^1.6.3"
+
+"@cspotcode/source-map-support@^0.8.0":
+ version "0.8.1"
+ resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1"
+ integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==
+ dependencies:
+ "@jridgewell/trace-mapping" "0.3.9"
+
+"@ethereumjs/rlp@^4.0.1":
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/@ethereumjs/rlp/-/rlp-4.0.1.tgz#626fabfd9081baab3d0a3074b0c7ecaf674aaa41"
+ integrity sha512-tqsQiBQDQdmPWE1xkkBq4rlSW5QZpLOUJ5RJh2/9fug+q9tnUhuZoVLk7s0scUIKTOzEtR72DFBXI4WiZcMpvw==
+
+"@ethereumjs/util@^8.1.0":
+ version "8.1.0"
+ resolved "https://registry.yarnpkg.com/@ethereumjs/util/-/util-8.1.0.tgz#299df97fb6b034e0577ce9f94c7d9d1004409ed4"
+ integrity sha512-zQ0IqbdX8FZ9aw11vP+dZkKDkS+kgIvQPHnSAXzP9pLu+Rfu3D3XEeLbicvoXJTYnhZiPmsZUxgdzXwNKxRPbA==
+ dependencies:
+ "@ethereumjs/rlp" "^4.0.1"
+ ethereum-cryptography "^2.0.0"
+ micro-ftch "^0.3.1"
+
+"@ethersproject/abi@5.7.0", "@ethersproject/abi@^5.0.9", "@ethersproject/abi@^5.1.2", "@ethersproject/abi@^5.7.0":
+ version "5.7.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.7.0.tgz#b3f3e045bbbeed1af3947335c247ad625a44e449"
+ integrity sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA==
+ dependencies:
+ "@ethersproject/address" "^5.7.0"
+ "@ethersproject/bignumber" "^5.7.0"
+ "@ethersproject/bytes" "^5.7.0"
+ "@ethersproject/constants" "^5.7.0"
+ "@ethersproject/hash" "^5.7.0"
+ "@ethersproject/keccak256" "^5.7.0"
+ "@ethersproject/logger" "^5.7.0"
+ "@ethersproject/properties" "^5.7.0"
+ "@ethersproject/strings" "^5.7.0"
+
+"@ethersproject/abstract-provider@5.7.0", "@ethersproject/abstract-provider@^5.7.0":
+ version "5.7.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz#b0a8550f88b6bf9d51f90e4795d48294630cb9ef"
+ integrity sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw==
+ dependencies:
+ "@ethersproject/bignumber" "^5.7.0"
+ "@ethersproject/bytes" "^5.7.0"
+ "@ethersproject/logger" "^5.7.0"
+ "@ethersproject/networks" "^5.7.0"
+ "@ethersproject/properties" "^5.7.0"
+ "@ethersproject/transactions" "^5.7.0"
+ "@ethersproject/web" "^5.7.0"
+
+"@ethersproject/abstract-signer@5.7.0", "@ethersproject/abstract-signer@^5.7.0":
+ version "5.7.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/abstract-signer/-/abstract-signer-5.7.0.tgz#13f4f32117868452191a4649723cb086d2b596b2"
+ integrity sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ==
+ dependencies:
+ "@ethersproject/abstract-provider" "^5.7.0"
+ "@ethersproject/bignumber" "^5.7.0"
+ "@ethersproject/bytes" "^5.7.0"
+ "@ethersproject/logger" "^5.7.0"
+ "@ethersproject/properties" "^5.7.0"
+
+"@ethersproject/address@5.7.0", "@ethersproject/address@^5.0.2", "@ethersproject/address@^5.7.0":
+ version "5.7.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.7.0.tgz#19b56c4d74a3b0a46bfdbb6cfcc0a153fc697f37"
+ integrity sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==
+ dependencies:
+ "@ethersproject/bignumber" "^5.7.0"
+ "@ethersproject/bytes" "^5.7.0"
+ "@ethersproject/keccak256" "^5.7.0"
+ "@ethersproject/logger" "^5.7.0"
+ "@ethersproject/rlp" "^5.7.0"
+
+"@ethersproject/base64@5.7.0", "@ethersproject/base64@^5.7.0":
+ version "5.7.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/base64/-/base64-5.7.0.tgz#ac4ee92aa36c1628173e221d0d01f53692059e1c"
+ integrity sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ==
+ dependencies:
+ "@ethersproject/bytes" "^5.7.0"
+
+"@ethersproject/basex@5.7.0", "@ethersproject/basex@^5.7.0":
+ version "5.7.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/basex/-/basex-5.7.0.tgz#97034dc7e8938a8ca943ab20f8a5e492ece4020b"
+ integrity sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw==
+ dependencies:
+ "@ethersproject/bytes" "^5.7.0"
+ "@ethersproject/properties" "^5.7.0"
+
+"@ethersproject/bignumber@5.7.0", "@ethersproject/bignumber@^5.7.0":
+ version "5.7.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.7.0.tgz#e2f03837f268ba655ffba03a57853e18a18dc9c2"
+ integrity sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw==
+ dependencies:
+ "@ethersproject/bytes" "^5.7.0"
+ "@ethersproject/logger" "^5.7.0"
+ bn.js "^5.2.1"
+
+"@ethersproject/bytes@5.7.0", "@ethersproject/bytes@^5.7.0":
+ version "5.7.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.7.0.tgz#a00f6ea8d7e7534d6d87f47188af1148d71f155d"
+ integrity sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A==
+ dependencies:
+ "@ethersproject/logger" "^5.7.0"
+
+"@ethersproject/constants@5.7.0", "@ethersproject/constants@^5.7.0":
+ version "5.7.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.7.0.tgz#df80a9705a7e08984161f09014ea012d1c75295e"
+ integrity sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA==
+ dependencies:
+ "@ethersproject/bignumber" "^5.7.0"
+
+"@ethersproject/contracts@5.7.0", "@ethersproject/contracts@^5.7.0":
+ version "5.7.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/contracts/-/contracts-5.7.0.tgz#c305e775abd07e48aa590e1a877ed5c316f8bd1e"
+ integrity sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg==
+ dependencies:
+ "@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/bytes" "^5.7.0"
+ "@ethersproject/constants" "^5.7.0"
+ "@ethersproject/logger" "^5.7.0"
+ "@ethersproject/properties" "^5.7.0"
+ "@ethersproject/transactions" "^5.7.0"
+
+"@ethersproject/hash@5.7.0", "@ethersproject/hash@^5.7.0":
+ version "5.7.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/hash/-/hash-5.7.0.tgz#eb7aca84a588508369562e16e514b539ba5240a7"
+ integrity sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g==
+ dependencies:
+ "@ethersproject/abstract-signer" "^5.7.0"
+ "@ethersproject/address" "^5.7.0"
+ "@ethersproject/base64" "^5.7.0"
+ "@ethersproject/bignumber" "^5.7.0"
+ "@ethersproject/bytes" "^5.7.0"
+ "@ethersproject/keccak256" "^5.7.0"
+ "@ethersproject/logger" "^5.7.0"
+ "@ethersproject/properties" "^5.7.0"
+ "@ethersproject/strings" "^5.7.0"
+
+"@ethersproject/hdnode@5.7.0", "@ethersproject/hdnode@^5.7.0":
+ version "5.7.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/hdnode/-/hdnode-5.7.0.tgz#e627ddc6b466bc77aebf1a6b9e47405ca5aef9cf"
+ integrity sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg==
+ dependencies:
+ "@ethersproject/abstract-signer" "^5.7.0"
+ "@ethersproject/basex" "^5.7.0"
+ "@ethersproject/bignumber" "^5.7.0"
+ "@ethersproject/bytes" "^5.7.0"
+ "@ethersproject/logger" "^5.7.0"
+ "@ethersproject/pbkdf2" "^5.7.0"
+ "@ethersproject/properties" "^5.7.0"
+ "@ethersproject/sha2" "^5.7.0"
+ "@ethersproject/signing-key" "^5.7.0"
+ "@ethersproject/strings" "^5.7.0"
+ "@ethersproject/transactions" "^5.7.0"
+ "@ethersproject/wordlists" "^5.7.0"
+
+"@ethersproject/json-wallets@5.7.0", "@ethersproject/json-wallets@^5.7.0":
+ version "5.7.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/json-wallets/-/json-wallets-5.7.0.tgz#5e3355287b548c32b368d91014919ebebddd5360"
+ integrity sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g==
+ dependencies:
+ "@ethersproject/abstract-signer" "^5.7.0"
+ "@ethersproject/address" "^5.7.0"
+ "@ethersproject/bytes" "^5.7.0"
+ "@ethersproject/hdnode" "^5.7.0"
+ "@ethersproject/keccak256" "^5.7.0"
+ "@ethersproject/logger" "^5.7.0"
+ "@ethersproject/pbkdf2" "^5.7.0"
+ "@ethersproject/properties" "^5.7.0"
+ "@ethersproject/random" "^5.7.0"
+ "@ethersproject/strings" "^5.7.0"
+ "@ethersproject/transactions" "^5.7.0"
+ aes-js "3.0.0"
+ scrypt-js "3.0.1"
+
+"@ethersproject/keccak256@5.7.0", "@ethersproject/keccak256@^5.7.0":
+ version "5.7.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.7.0.tgz#3186350c6e1cd6aba7940384ec7d6d9db01f335a"
+ integrity sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg==
+ dependencies:
+ "@ethersproject/bytes" "^5.7.0"
+ js-sha3 "0.8.0"
+
+"@ethersproject/logger@5.7.0", "@ethersproject/logger@^5.7.0":
+ version "5.7.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.7.0.tgz#6ce9ae168e74fecf287be17062b590852c311892"
+ integrity sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig==
+
+"@ethersproject/networks@5.7.1", "@ethersproject/networks@^5.7.0":
+ version "5.7.1"
+ resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.7.1.tgz#118e1a981d757d45ccea6bb58d9fd3d9db14ead6"
+ integrity sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ==
+ dependencies:
+ "@ethersproject/logger" "^5.7.0"
+
+"@ethersproject/pbkdf2@5.7.0", "@ethersproject/pbkdf2@^5.7.0":
+ version "5.7.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/pbkdf2/-/pbkdf2-5.7.0.tgz#d2267d0a1f6e123f3771007338c47cccd83d3102"
+ integrity sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw==
+ dependencies:
+ "@ethersproject/bytes" "^5.7.0"
+ "@ethersproject/sha2" "^5.7.0"
+
+"@ethersproject/properties@5.7.0", "@ethersproject/properties@^5.7.0":
+ version "5.7.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.7.0.tgz#a6e12cb0439b878aaf470f1902a176033067ed30"
+ integrity sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw==
+ dependencies:
+ "@ethersproject/logger" "^5.7.0"
+
+"@ethersproject/providers@5.7.2", "@ethersproject/providers@^5.7.1", "@ethersproject/providers@^5.7.2":
+ version "5.7.2"
+ resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.7.2.tgz#f8b1a4f275d7ce58cf0a2eec222269a08beb18cb"
+ integrity sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg==
+ dependencies:
+ "@ethersproject/abstract-provider" "^5.7.0"
+ "@ethersproject/abstract-signer" "^5.7.0"
+ "@ethersproject/address" "^5.7.0"
+ "@ethersproject/base64" "^5.7.0"
+ "@ethersproject/basex" "^5.7.0"
+ "@ethersproject/bignumber" "^5.7.0"
+ "@ethersproject/bytes" "^5.7.0"
+ "@ethersproject/constants" "^5.7.0"
+ "@ethersproject/hash" "^5.7.0"
+ "@ethersproject/logger" "^5.7.0"
+ "@ethersproject/networks" "^5.7.0"
+ "@ethersproject/properties" "^5.7.0"
+ "@ethersproject/random" "^5.7.0"
+ "@ethersproject/rlp" "^5.7.0"
+ "@ethersproject/sha2" "^5.7.0"
+ "@ethersproject/strings" "^5.7.0"
+ "@ethersproject/transactions" "^5.7.0"
+ "@ethersproject/web" "^5.7.0"
+ bech32 "1.1.4"
+ ws "7.4.6"
+
+"@ethersproject/random@5.7.0", "@ethersproject/random@^5.7.0":
+ version "5.7.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/random/-/random-5.7.0.tgz#af19dcbc2484aae078bb03656ec05df66253280c"
+ integrity sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ==
+ dependencies:
+ "@ethersproject/bytes" "^5.7.0"
+ "@ethersproject/logger" "^5.7.0"
+
+"@ethersproject/rlp@5.7.0", "@ethersproject/rlp@^5.7.0":
+ version "5.7.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/rlp/-/rlp-5.7.0.tgz#de39e4d5918b9d74d46de93af80b7685a9c21304"
+ integrity sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w==
+ dependencies:
+ "@ethersproject/bytes" "^5.7.0"
+ "@ethersproject/logger" "^5.7.0"
+
+"@ethersproject/sha2@5.7.0", "@ethersproject/sha2@^5.7.0":
+ version "5.7.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/sha2/-/sha2-5.7.0.tgz#9a5f7a7824ef784f7f7680984e593a800480c9fb"
+ integrity sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw==
+ dependencies:
+ "@ethersproject/bytes" "^5.7.0"
+ "@ethersproject/logger" "^5.7.0"
+ hash.js "1.1.7"
+
+"@ethersproject/signing-key@5.7.0", "@ethersproject/signing-key@^5.7.0":
+ version "5.7.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/signing-key/-/signing-key-5.7.0.tgz#06b2df39411b00bc57c7c09b01d1e41cf1b16ab3"
+ integrity sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q==
+ dependencies:
+ "@ethersproject/bytes" "^5.7.0"
+ "@ethersproject/logger" "^5.7.0"
+ "@ethersproject/properties" "^5.7.0"
+ bn.js "^5.2.1"
+ elliptic "6.5.4"
+ hash.js "1.1.7"
+
+"@ethersproject/solidity@5.7.0", "@ethersproject/solidity@^5.7.0":
+ version "5.7.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/solidity/-/solidity-5.7.0.tgz#5e9c911d8a2acce2a5ebb48a5e2e0af20b631cb8"
+ integrity sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA==
+ dependencies:
+ "@ethersproject/bignumber" "^5.7.0"
+ "@ethersproject/bytes" "^5.7.0"
+ "@ethersproject/keccak256" "^5.7.0"
+ "@ethersproject/logger" "^5.7.0"
+ "@ethersproject/sha2" "^5.7.0"
+ "@ethersproject/strings" "^5.7.0"
+
+"@ethersproject/strings@5.7.0", "@ethersproject/strings@^5.7.0":
+ version "5.7.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.7.0.tgz#54c9d2a7c57ae8f1205c88a9d3a56471e14d5ed2"
+ integrity sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg==
+ dependencies:
+ "@ethersproject/bytes" "^5.7.0"
+ "@ethersproject/constants" "^5.7.0"
+ "@ethersproject/logger" "^5.7.0"
+
+"@ethersproject/transactions@5.7.0", "@ethersproject/transactions@^5.7.0":
+ version "5.7.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.7.0.tgz#91318fc24063e057885a6af13fdb703e1f993d3b"
+ integrity sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ==
+ dependencies:
+ "@ethersproject/address" "^5.7.0"
+ "@ethersproject/bignumber" "^5.7.0"
+ "@ethersproject/bytes" "^5.7.0"
+ "@ethersproject/constants" "^5.7.0"
+ "@ethersproject/keccak256" "^5.7.0"
+ "@ethersproject/logger" "^5.7.0"
+ "@ethersproject/properties" "^5.7.0"
+ "@ethersproject/rlp" "^5.7.0"
+ "@ethersproject/signing-key" "^5.7.0"
+
+"@ethersproject/units@5.7.0":
+ version "5.7.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/units/-/units-5.7.0.tgz#637b563d7e14f42deeee39245275d477aae1d8b1"
+ integrity sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg==
+ dependencies:
+ "@ethersproject/bignumber" "^5.7.0"
+ "@ethersproject/constants" "^5.7.0"
+ "@ethersproject/logger" "^5.7.0"
+
+"@ethersproject/wallet@5.7.0", "@ethersproject/wallet@^5.7.0":
+ version "5.7.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/wallet/-/wallet-5.7.0.tgz#4e5d0790d96fe21d61d38fb40324e6c7ef350b2d"
+ integrity sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA==
+ dependencies:
+ "@ethersproject/abstract-provider" "^5.7.0"
+ "@ethersproject/abstract-signer" "^5.7.0"
+ "@ethersproject/address" "^5.7.0"
+ "@ethersproject/bignumber" "^5.7.0"
+ "@ethersproject/bytes" "^5.7.0"
+ "@ethersproject/hash" "^5.7.0"
+ "@ethersproject/hdnode" "^5.7.0"
+ "@ethersproject/json-wallets" "^5.7.0"
+ "@ethersproject/keccak256" "^5.7.0"
+ "@ethersproject/logger" "^5.7.0"
+ "@ethersproject/properties" "^5.7.0"
+ "@ethersproject/random" "^5.7.0"
+ "@ethersproject/signing-key" "^5.7.0"
+ "@ethersproject/transactions" "^5.7.0"
+ "@ethersproject/wordlists" "^5.7.0"
+
+"@ethersproject/web@5.7.1", "@ethersproject/web@^5.7.0":
+ version "5.7.1"
+ resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.7.1.tgz#de1f285b373149bee5928f4eb7bcb87ee5fbb4ae"
+ integrity sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w==
+ dependencies:
+ "@ethersproject/base64" "^5.7.0"
+ "@ethersproject/bytes" "^5.7.0"
+ "@ethersproject/logger" "^5.7.0"
+ "@ethersproject/properties" "^5.7.0"
+ "@ethersproject/strings" "^5.7.0"
+
+"@ethersproject/wordlists@5.7.0", "@ethersproject/wordlists@^5.7.0":
+ version "5.7.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/wordlists/-/wordlists-5.7.0.tgz#8fb2c07185d68c3e09eb3bfd6e779ba2774627f5"
+ integrity sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA==
+ dependencies:
+ "@ethersproject/bytes" "^5.7.0"
+ "@ethersproject/hash" "^5.7.0"
+ "@ethersproject/logger" "^5.7.0"
+ "@ethersproject/properties" "^5.7.0"
+ "@ethersproject/strings" "^5.7.0"
+
+"@fastify/busboy@^2.0.0":
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/@fastify/busboy/-/busboy-2.0.0.tgz#f22824caff3ae506b18207bad4126dbc6ccdb6b8"
+ integrity sha512-JUFJad5lv7jxj926GPgymrWQxxjPYuJNiNjNMzqT+HiuP6Vl3dk5xzG+8sTX96np0ZAluvaMzPsjhHZ5rNuNQQ==
+
+"@jridgewell/resolve-uri@^3.0.3":
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz#c08679063f279615a3326583ba3a90d1d82cc721"
+ integrity sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==
+
+"@jridgewell/sourcemap-codec@^1.4.10":
+ version "1.4.15"
+ resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32"
+ integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==
+
+"@jridgewell/trace-mapping@0.3.9":
+ version "0.3.9"
+ resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9"
+ integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==
+ dependencies:
+ "@jridgewell/resolve-uri" "^3.0.3"
+ "@jridgewell/sourcemap-codec" "^1.4.10"
+
+"@layerzerolabs/lz-evm-messagelib-v2@^2.3.39":
+ version "2.3.44"
+ resolved "https://registry.yarnpkg.com/@layerzerolabs/lz-evm-messagelib-v2/-/lz-evm-messagelib-v2-2.3.44.tgz#3684bf9de5cf19e417626970ca09528496d70fc1"
+ integrity sha512-2HZMjV0KZH0e3W2KL/H8HvE3I7QMJw1no46IQ5LpGSvxIm5Ri45tnQAynbmEbRyKXrRSP3Brkvkc2U7VrfZ/Cg==
+
+"@layerzerolabs/lz-evm-protocol-v2@^2.3.39":
+ version "2.3.44"
+ resolved "https://registry.yarnpkg.com/@layerzerolabs/lz-evm-protocol-v2/-/lz-evm-protocol-v2-2.3.44.tgz#63c967dcb6aeaa4275fa51c6976b27133f9c16ff"
+ integrity sha512-oNtwl4HGCogFVOr45T3FfrkB0/CRW2eGAEScBw/FY/6mlncnS4dqlvrCJ3SFlK17cu1w9q0ztD3NzS9sUrb7vw==
+
+"@layerzerolabs/lz-v2-utilities@^2.3.39":
+ version "2.3.44"
+ resolved "https://registry.yarnpkg.com/@layerzerolabs/lz-v2-utilities/-/lz-v2-utilities-2.3.44.tgz#d1937c68060147e3856ea7368cba72c7cff88ad8"
+ integrity sha512-0p7tdJCf6BSmN38tAnO7WyOoC84NDTCQt1MqPBomXTyIux1RLpkS82jcxv92+E+1LNulhHIx5W62gaKKx27B2A==
+ dependencies:
+ "@ethersproject/abi" "^5.7.0"
+ "@ethersproject/address" "^5.7.0"
+ "@ethersproject/bignumber" "^5.7.0"
+ "@ethersproject/bytes" "^5.7.0"
+ "@ethersproject/keccak256" "^5.7.0"
+ "@ethersproject/solidity" "^5.7.0"
+ bs58 "^5.0.0"
+ tiny-invariant "^1.3.1"
+
+"@layerzerolabs/oapp-evm@^0.0.4":
+ version "0.0.4"
+ resolved "https://registry.yarnpkg.com/@layerzerolabs/oapp-evm/-/oapp-evm-0.0.4.tgz#af86216842c7da5a270eeff04a6b16320f113f7b"
+ integrity sha512-h0papPd9mQAPsWoQuzZk3dIcLWLrJ8tnDNPg7Hn8aa+v7HPY1lo6Zmyn3t7RmzfKnvrjnjKWDTbX2zgesu4hYg==
+ dependencies:
+ ethers "^5.7.2"
+
+"@layerzerolabs/oft-evm@^0.0.11":
+ version "0.0.11"
+ resolved "https://registry.yarnpkg.com/@layerzerolabs/oft-evm/-/oft-evm-0.0.11.tgz#4ff3d396da450e2e88274af5b304a2ce1854106e"
+ integrity sha512-lkhEiwMrcC0CtMcHkTTnaJwOsE/tE4MiO1nbU3QcWrTOGQj0BGiH05c50+lvZeFHlObp/QpIDXELnJgd2rz29w==
+
+"@layerzerolabs/test-devtools-evm-hardhat@~0.3.0":
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/@layerzerolabs/test-devtools-evm-hardhat/-/test-devtools-evm-hardhat-0.3.0.tgz#f9666dca38145b198b3d83be5a5f179fb722822d"
+ integrity sha512-776SF+Rp6+8PPMjl5WYglgfas6IyqZ2g7dU73seQC9VaPfbM+6XORtOCLVUxl6Hrp43edAI0dZuIm6xWhVFiYQ==
+
+"@metamask/eth-sig-util@^4.0.0":
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/@metamask/eth-sig-util/-/eth-sig-util-4.0.1.tgz#3ad61f6ea9ad73ba5b19db780d40d9aae5157088"
+ integrity sha512-tghyZKLHZjcdlDqCA3gNZmLeR0XvOE9U1qoQO9ohyAZT6Pya+H9vkBPcsyXytmYLNgVoin7CKCmweo/R43V+tQ==
+ dependencies:
+ ethereumjs-abi "^0.6.8"
+ ethereumjs-util "^6.2.1"
+ ethjs-util "^0.1.6"
+ tweetnacl "^1.0.3"
+ tweetnacl-util "^0.15.1"
+
+"@noble/curves@1.1.0", "@noble/curves@~1.1.0":
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.1.0.tgz#f13fc667c89184bc04cccb9b11e8e7bae27d8c3d"
+ integrity sha512-091oBExgENk/kGj3AZmtBDMpxQPDtxQABR2B9lb1JbVTs6ytdzZNwvhxQ4MWasRNEzlbEH8jCWFCwhF/Obj5AA==
+ dependencies:
+ "@noble/hashes" "1.3.1"
+
+"@noble/curves@1.2.0":
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.2.0.tgz#92d7e12e4e49b23105a2555c6984d41733d65c35"
+ integrity sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==
+ dependencies:
+ "@noble/hashes" "1.3.2"
+
+"@noble/hashes@1.2.0", "@noble/hashes@~1.2.0":
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.2.0.tgz#a3150eeb09cc7ab207ebf6d7b9ad311a9bdbed12"
+ integrity sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ==
+
+"@noble/hashes@1.3.1":
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.3.1.tgz#8831ef002114670c603c458ab8b11328406953a9"
+ integrity sha512-EbqwksQwz9xDRGfDST86whPBgM65E0OH/pCgqW0GBVzO22bNE+NuIbeTb714+IfSjU3aRk47EUvXIb5bTsenKA==
+
+"@noble/hashes@1.3.2", "@noble/hashes@~1.3.0", "@noble/hashes@~1.3.1":
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.3.2.tgz#6f26dbc8fbc7205873ce3cee2f690eba0d421b39"
+ integrity sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==
+
+"@noble/secp256k1@1.7.1", "@noble/secp256k1@~1.7.0":
+ version "1.7.1"
+ resolved "https://registry.yarnpkg.com/@noble/secp256k1/-/secp256k1-1.7.1.tgz#b251c70f824ce3ca7f8dc3df08d58f005cc0507c"
+ integrity sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw==
+
+"@nodelib/fs.scandir@2.1.5":
+ version "2.1.5"
+ resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5"
+ integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==
+ dependencies:
+ "@nodelib/fs.stat" "2.0.5"
+ run-parallel "^1.1.9"
+
+"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2":
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b"
+ integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==
+
+"@nodelib/fs.walk@^1.2.3":
+ version "1.2.8"
+ resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a"
+ integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==
+ dependencies:
+ "@nodelib/fs.scandir" "2.1.5"
+ fastq "^1.6.0"
+
+"@nomicfoundation/ethereumjs-block@5.0.2":
+ version "5.0.2"
+ resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-block/-/ethereumjs-block-5.0.2.tgz#13a7968f5964f1697da941281b7f7943b0465d04"
+ integrity sha512-hSe6CuHI4SsSiWWjHDIzWhSiAVpzMUcDRpWYzN0T9l8/Rz7xNn3elwVOJ/tAyS0LqL6vitUD78Uk7lQDXZun7Q==
+ dependencies:
+ "@nomicfoundation/ethereumjs-common" "4.0.2"
+ "@nomicfoundation/ethereumjs-rlp" "5.0.2"
+ "@nomicfoundation/ethereumjs-trie" "6.0.2"
+ "@nomicfoundation/ethereumjs-tx" "5.0.2"
+ "@nomicfoundation/ethereumjs-util" "9.0.2"
+ ethereum-cryptography "0.1.3"
+ ethers "^5.7.1"
+
+"@nomicfoundation/ethereumjs-blockchain@7.0.2":
+ version "7.0.2"
+ resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-blockchain/-/ethereumjs-blockchain-7.0.2.tgz#45323b673b3d2fab6b5008535340d1b8fea7d446"
+ integrity sha512-8UUsSXJs+MFfIIAKdh3cG16iNmWzWC/91P40sazNvrqhhdR/RtGDlFk2iFTGbBAZPs2+klZVzhRX8m2wvuvz3w==
+ dependencies:
+ "@nomicfoundation/ethereumjs-block" "5.0.2"
+ "@nomicfoundation/ethereumjs-common" "4.0.2"
+ "@nomicfoundation/ethereumjs-ethash" "3.0.2"
+ "@nomicfoundation/ethereumjs-rlp" "5.0.2"
+ "@nomicfoundation/ethereumjs-trie" "6.0.2"
+ "@nomicfoundation/ethereumjs-tx" "5.0.2"
+ "@nomicfoundation/ethereumjs-util" "9.0.2"
+ abstract-level "^1.0.3"
+ debug "^4.3.3"
+ ethereum-cryptography "0.1.3"
+ level "^8.0.0"
+ lru-cache "^5.1.1"
+ memory-level "^1.0.0"
+
+"@nomicfoundation/ethereumjs-common@4.0.2":
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-common/-/ethereumjs-common-4.0.2.tgz#a15d1651ca36757588fdaf2a7d381a150662a3c3"
+ integrity sha512-I2WGP3HMGsOoycSdOTSqIaES0ughQTueOsddJ36aYVpI3SN8YSusgRFLwzDJwRFVIYDKx/iJz0sQ5kBHVgdDwg==
+ dependencies:
+ "@nomicfoundation/ethereumjs-util" "9.0.2"
+ crc-32 "^1.2.0"
+
+"@nomicfoundation/ethereumjs-ethash@3.0.2":
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-ethash/-/ethereumjs-ethash-3.0.2.tgz#da77147f806401ee996bfddfa6487500118addca"
+ integrity sha512-8PfoOQCcIcO9Pylq0Buijuq/O73tmMVURK0OqdjhwqcGHYC2PwhbajDh7GZ55ekB0Px197ajK3PQhpKoiI/UPg==
+ dependencies:
+ "@nomicfoundation/ethereumjs-block" "5.0.2"
+ "@nomicfoundation/ethereumjs-rlp" "5.0.2"
+ "@nomicfoundation/ethereumjs-util" "9.0.2"
+ abstract-level "^1.0.3"
+ bigint-crypto-utils "^3.0.23"
+ ethereum-cryptography "0.1.3"
+
+"@nomicfoundation/ethereumjs-evm@2.0.2":
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-evm/-/ethereumjs-evm-2.0.2.tgz#4c2f4b84c056047102a4fa41c127454e3f0cfcf6"
+ integrity sha512-rBLcUaUfANJxyOx9HIdMX6uXGin6lANCulIm/pjMgRqfiCRMZie3WKYxTSd8ZE/d+qT+zTedBF4+VHTdTSePmQ==
+ dependencies:
+ "@ethersproject/providers" "^5.7.1"
+ "@nomicfoundation/ethereumjs-common" "4.0.2"
+ "@nomicfoundation/ethereumjs-tx" "5.0.2"
+ "@nomicfoundation/ethereumjs-util" "9.0.2"
+ debug "^4.3.3"
+ ethereum-cryptography "0.1.3"
+ mcl-wasm "^0.7.1"
+ rustbn.js "~0.2.0"
+
+"@nomicfoundation/ethereumjs-rlp@5.0.2":
+ version "5.0.2"
+ resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-rlp/-/ethereumjs-rlp-5.0.2.tgz#4fee8dc58a53ac6ae87fb1fca7c15dc06c6b5dea"
+ integrity sha512-QwmemBc+MMsHJ1P1QvPl8R8p2aPvvVcKBbvHnQOKBpBztEo0omN0eaob6FeZS/e3y9NSe+mfu3nNFBHszqkjTA==
+
+"@nomicfoundation/ethereumjs-statemanager@2.0.2":
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-statemanager/-/ethereumjs-statemanager-2.0.2.tgz#3ba4253b29b1211cafe4f9265fee5a0d780976e0"
+ integrity sha512-dlKy5dIXLuDubx8Z74sipciZnJTRSV/uHG48RSijhgm1V7eXYFC567xgKtsKiVZB1ViTP9iFL4B6Je0xD6X2OA==
+ dependencies:
+ "@nomicfoundation/ethereumjs-common" "4.0.2"
+ "@nomicfoundation/ethereumjs-rlp" "5.0.2"
+ debug "^4.3.3"
+ ethereum-cryptography "0.1.3"
+ ethers "^5.7.1"
+ js-sdsl "^4.1.4"
+
+"@nomicfoundation/ethereumjs-trie@6.0.2":
+ version "6.0.2"
+ resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-trie/-/ethereumjs-trie-6.0.2.tgz#9a6dbd28482dca1bc162d12b3733acab8cd12835"
+ integrity sha512-yw8vg9hBeLYk4YNg5MrSJ5H55TLOv2FSWUTROtDtTMMmDGROsAu+0tBjiNGTnKRi400M6cEzoFfa89Fc5k8NTQ==
+ dependencies:
+ "@nomicfoundation/ethereumjs-rlp" "5.0.2"
+ "@nomicfoundation/ethereumjs-util" "9.0.2"
+ "@types/readable-stream" "^2.3.13"
+ ethereum-cryptography "0.1.3"
+ readable-stream "^3.6.0"
+
+"@nomicfoundation/ethereumjs-tx@5.0.2":
+ version "5.0.2"
+ resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-tx/-/ethereumjs-tx-5.0.2.tgz#117813b69c0fdc14dd0446698a64be6df71d7e56"
+ integrity sha512-T+l4/MmTp7VhJeNloMkM+lPU3YMUaXdcXgTGCf8+ZFvV9NYZTRLFekRwlG6/JMmVfIfbrW+dRRJ9A6H5Q/Z64g==
+ dependencies:
+ "@chainsafe/ssz" "^0.9.2"
+ "@ethersproject/providers" "^5.7.2"
+ "@nomicfoundation/ethereumjs-common" "4.0.2"
+ "@nomicfoundation/ethereumjs-rlp" "5.0.2"
+ "@nomicfoundation/ethereumjs-util" "9.0.2"
+ ethereum-cryptography "0.1.3"
+
+"@nomicfoundation/ethereumjs-util@9.0.2":
+ version "9.0.2"
+ resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-util/-/ethereumjs-util-9.0.2.tgz#16bdc1bb36f333b8a3559bbb4b17dac805ce904d"
+ integrity sha512-4Wu9D3LykbSBWZo8nJCnzVIYGvGCuyiYLIJa9XXNVt1q1jUzHdB+sJvx95VGCpPkCT+IbLecW6yfzy3E1bQrwQ==
+ dependencies:
+ "@chainsafe/ssz" "^0.10.0"
+ "@nomicfoundation/ethereumjs-rlp" "5.0.2"
+ ethereum-cryptography "0.1.3"
+
+"@nomicfoundation/ethereumjs-vm@7.0.2":
+ version "7.0.2"
+ resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-vm/-/ethereumjs-vm-7.0.2.tgz#3b0852cb3584df0e18c182d0672a3596c9ca95e6"
+ integrity sha512-Bj3KZT64j54Tcwr7Qm/0jkeZXJMfdcAtRBedou+Hx0dPOSIgqaIr0vvLwP65TpHbak2DmAq+KJbW2KNtIoFwvA==
+ dependencies:
+ "@nomicfoundation/ethereumjs-block" "5.0.2"
+ "@nomicfoundation/ethereumjs-blockchain" "7.0.2"
+ "@nomicfoundation/ethereumjs-common" "4.0.2"
+ "@nomicfoundation/ethereumjs-evm" "2.0.2"
+ "@nomicfoundation/ethereumjs-rlp" "5.0.2"
+ "@nomicfoundation/ethereumjs-statemanager" "2.0.2"
+ "@nomicfoundation/ethereumjs-trie" "6.0.2"
+ "@nomicfoundation/ethereumjs-tx" "5.0.2"
+ "@nomicfoundation/ethereumjs-util" "9.0.2"
+ debug "^4.3.3"
+ ethereum-cryptography "0.1.3"
+ mcl-wasm "^0.7.1"
+ rustbn.js "~0.2.0"
+
+"@nomicfoundation/hardhat-chai-matchers@^2.0.2":
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/@nomicfoundation/hardhat-chai-matchers/-/hardhat-chai-matchers-2.0.2.tgz#a0e5dbca43ba9560c096da162c0e3245303479d1"
+ integrity sha512-9Wu9mRtkj0U9ohgXYFbB/RQDa+PcEdyBm2suyEtsJf3PqzZEEjLUZgWnMjlFhATMk/fp3BjmnYVPrwl+gr8oEw==
+ dependencies:
+ "@types/chai-as-promised" "^7.1.3"
+ chai-as-promised "^7.1.1"
+ deep-eql "^4.0.1"
+ ordinal "^1.0.3"
+
+"@nomicfoundation/hardhat-ethers@^3.0.5":
+ version "3.0.5"
+ resolved "https://registry.yarnpkg.com/@nomicfoundation/hardhat-ethers/-/hardhat-ethers-3.0.5.tgz#0422c2123dec7c42e7fb2be8e1691f1d9708db56"
+ integrity sha512-RNFe8OtbZK6Ila9kIlHp0+S80/0Bu/3p41HUpaRIoHLm6X3WekTd83vob3rE54Duufu1edCiBDxspBzi2rxHHw==
+ dependencies:
+ debug "^4.1.1"
+ lodash.isequal "^4.5.0"
+
+"@nomicfoundation/hardhat-network-helpers@^1.0.9":
+ version "1.0.9"
+ resolved "https://registry.yarnpkg.com/@nomicfoundation/hardhat-network-helpers/-/hardhat-network-helpers-1.0.9.tgz#767449e8a2acda79306ac84626117583d95d25aa"
+ integrity sha512-OXWCv0cHpwLUO2u7bFxBna6dQtCC2Gg/aN/KtJLO7gmuuA28vgmVKYFRCDUqrbjujzgfwQ2aKyZ9Y3vSmDqS7Q==
+ dependencies:
+ ethereumjs-util "^7.1.4"
+
+"@nomicfoundation/hardhat-toolbox@^4.0.0":
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/@nomicfoundation/hardhat-toolbox/-/hardhat-toolbox-4.0.0.tgz#eb1f619218dd1414fa161dfec92d3e5e53a2f407"
+ integrity sha512-jhcWHp0aHaL0aDYj8IJl80v4SZXWMS1A2XxXa1CA6pBiFfJKuZinCkO6wb+POAt0LIfXB3gA3AgdcOccrcwBwA==
+
+"@nomicfoundation/hardhat-verify@^2.0.5":
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/@nomicfoundation/hardhat-verify/-/hardhat-verify-2.0.5.tgz#dcc2cb5e5c55a39704c7d492436f80f05a4ca5a3"
+ integrity sha512-Tg4zu8RkWpyADSFIgF4FlJIUEI4VkxcvELsmbJn2OokbvH2SnUrqKmw0BBfDrtvP0hhmx8wsnrRKP5DV/oTyTA==
+ dependencies:
+ "@ethersproject/abi" "^5.1.2"
+ "@ethersproject/address" "^5.0.2"
+ cbor "^8.1.0"
+ chalk "^2.4.2"
+ debug "^4.1.1"
+ lodash.clonedeep "^4.5.0"
+ semver "^6.3.0"
+ table "^6.8.0"
+ undici "^5.14.0"
+
+"@nomicfoundation/solidity-analyzer-darwin-arm64@0.1.1":
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-darwin-arm64/-/solidity-analyzer-darwin-arm64-0.1.1.tgz#4c858096b1c17fe58a474fe81b46815f93645c15"
+ integrity sha512-KcTodaQw8ivDZyF+D76FokN/HdpgGpfjc/gFCImdLUyqB6eSWVaZPazMbeAjmfhx3R0zm/NYVzxwAokFKgrc0w==
+
+"@nomicfoundation/solidity-analyzer-darwin-x64@0.1.1":
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-darwin-x64/-/solidity-analyzer-darwin-x64-0.1.1.tgz#6e25ccdf6e2d22389c35553b64fe6f3fdaec432c"
+ integrity sha512-XhQG4BaJE6cIbjAVtzGOGbK3sn1BO9W29uhk9J8y8fZF1DYz0Doj8QDMfpMu+A6TjPDs61lbsmeYodIDnfveSA==
+
+"@nomicfoundation/solidity-analyzer-freebsd-x64@0.1.1":
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-freebsd-x64/-/solidity-analyzer-freebsd-x64-0.1.1.tgz#0a224ea50317139caeebcdedd435c28a039d169c"
+ integrity sha512-GHF1VKRdHW3G8CndkwdaeLkVBi5A9u2jwtlS7SLhBc8b5U/GcoL39Q+1CSO3hYqePNP+eV5YI7Zgm0ea6kMHoA==
+
+"@nomicfoundation/solidity-analyzer-linux-arm64-gnu@0.1.1":
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-arm64-gnu/-/solidity-analyzer-linux-arm64-gnu-0.1.1.tgz#dfa085d9ffab9efb2e7b383aed3f557f7687ac2b"
+ integrity sha512-g4Cv2fO37ZsUENQ2vwPnZc2zRenHyAxHcyBjKcjaSmmkKrFr64yvzeNO8S3GBFCo90rfochLs99wFVGT/0owpg==
+
+"@nomicfoundation/solidity-analyzer-linux-arm64-musl@0.1.1":
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-arm64-musl/-/solidity-analyzer-linux-arm64-musl-0.1.1.tgz#c9e06b5d513dd3ab02a7ac069c160051675889a4"
+ integrity sha512-WJ3CE5Oek25OGE3WwzK7oaopY8xMw9Lhb0mlYuJl/maZVo+WtP36XoQTb7bW/i8aAdHW5Z+BqrHMux23pvxG3w==
+
+"@nomicfoundation/solidity-analyzer-linux-x64-gnu@0.1.1":
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-x64-gnu/-/solidity-analyzer-linux-x64-gnu-0.1.1.tgz#8d328d16839e52571f72f2998c81e46bf320f893"
+ integrity sha512-5WN7leSr5fkUBBjE4f3wKENUy9HQStu7HmWqbtknfXkkil+eNWiBV275IOlpXku7v3uLsXTOKpnnGHJYI2qsdA==
+
+"@nomicfoundation/solidity-analyzer-linux-x64-musl@0.1.1":
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-x64-musl/-/solidity-analyzer-linux-x64-musl-0.1.1.tgz#9b49d0634b5976bb5ed1604a1e1b736f390959bb"
+ integrity sha512-KdYMkJOq0SYPQMmErv/63CwGwMm5XHenEna9X9aB8mQmhDBrYrlAOSsIPgFCUSL0hjxE3xHP65/EPXR/InD2+w==
+
+"@nomicfoundation/solidity-analyzer-win32-arm64-msvc@0.1.1":
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-win32-arm64-msvc/-/solidity-analyzer-win32-arm64-msvc-0.1.1.tgz#e2867af7264ebbcc3131ef837878955dd6a3676f"
+ integrity sha512-VFZASBfl4qiBYwW5xeY20exWhmv6ww9sWu/krWSesv3q5hA0o1JuzmPHR4LPN6SUZj5vcqci0O6JOL8BPw+APg==
+
+"@nomicfoundation/solidity-analyzer-win32-ia32-msvc@0.1.1":
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-win32-ia32-msvc/-/solidity-analyzer-win32-ia32-msvc-0.1.1.tgz#0685f78608dd516c8cdfb4896ed451317e559585"
+ integrity sha512-JnFkYuyCSA70j6Si6cS1A9Gh1aHTEb8kOTBApp/c7NRTFGNMH8eaInKlyuuiIbvYFhlXW4LicqyYuWNNq9hkpQ==
+
+"@nomicfoundation/solidity-analyzer-win32-x64-msvc@0.1.1":
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-win32-x64-msvc/-/solidity-analyzer-win32-x64-msvc-0.1.1.tgz#c9a44f7108646f083b82e851486e0f6aeb785836"
+ integrity sha512-HrVJr6+WjIXGnw3Q9u6KQcbZCtk0caVWhCdFADySvRyUxJ8PnzlaP+MhwNE8oyT8OZ6ejHBRrrgjSqDCFXGirw==
+
+"@nomicfoundation/solidity-analyzer@^0.1.0":
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer/-/solidity-analyzer-0.1.1.tgz#f5f4d36d3f66752f59a57e7208cd856f3ddf6f2d"
+ integrity sha512-1LMtXj1puAxyFusBgUIy5pZk3073cNXYnXUpuNKFghHbIit/xZgbk0AokpUADbNm3gyD6bFWl3LRFh3dhVdREg==
+ optionalDependencies:
+ "@nomicfoundation/solidity-analyzer-darwin-arm64" "0.1.1"
+ "@nomicfoundation/solidity-analyzer-darwin-x64" "0.1.1"
+ "@nomicfoundation/solidity-analyzer-freebsd-x64" "0.1.1"
+ "@nomicfoundation/solidity-analyzer-linux-arm64-gnu" "0.1.1"
+ "@nomicfoundation/solidity-analyzer-linux-arm64-musl" "0.1.1"
+ "@nomicfoundation/solidity-analyzer-linux-x64-gnu" "0.1.1"
+ "@nomicfoundation/solidity-analyzer-linux-x64-musl" "0.1.1"
+ "@nomicfoundation/solidity-analyzer-win32-arm64-msvc" "0.1.1"
+ "@nomicfoundation/solidity-analyzer-win32-ia32-msvc" "0.1.1"
+ "@nomicfoundation/solidity-analyzer-win32-x64-msvc" "0.1.1"
+
+"@nomiclabs/hardhat-ethers@^2.2.3":
+ version "2.2.3"
+ resolved "https://registry.yarnpkg.com/@nomiclabs/hardhat-ethers/-/hardhat-ethers-2.2.3.tgz#b41053e360c31a32c2640c9a45ee981a7e603fe0"
+ integrity sha512-YhzPdzb612X591FOe68q+qXVXGG2ANZRvDo0RRUtimev85rCrAlv/TLMEZw5c+kq9AbzocLTVX/h2jVIFPL9Xg==
+
+"@openzeppelin/contracts-upgradeable@^5.0.0":
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/@openzeppelin/contracts-upgradeable/-/contracts-upgradeable-5.0.0.tgz#859c00c55f04b6dda85b3c88bce507d65019888f"
+ integrity sha512-D54RHzkOKHQ8xUssPgQe2d/U92mwaiBDY7qCCVGq6VqwQjsT3KekEQ3bonev+BLP30oZ0R1U6YC8/oLpizgC5Q==
+
+"@openzeppelin/contracts@^5.0.0":
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/@openzeppelin/contracts/-/contracts-5.0.0.tgz#ee0e4b4564f101a5c4ee398cd4d73c0bd92b289c"
+ integrity sha512-bv2sdS6LKqVVMLI5+zqnNrNU/CA+6z6CmwFXm/MzmOPBRSO5reEJN7z0Gbzvs0/bv/MZZXNklubpwy3v2+azsw==
+
+"@openzeppelin/defender-admin-client@^1.52.0":
+ version "1.54.1"
+ resolved "https://registry.yarnpkg.com/@openzeppelin/defender-admin-client/-/defender-admin-client-1.54.1.tgz#b877972992b95a0dc3787f2ade2f044586621357"
+ integrity sha512-kRpSUdTsnSqntp4FOXIm95t+6VKHc8CUY2Si71VDuxs0q7HSPZkdpRPSntcolwEzWy9L4a8NS/QMwDF5NJ4X1g==
+ dependencies:
+ "@openzeppelin/defender-base-client" "1.54.1"
+ axios "^1.4.0"
+ ethers "^5.7.2"
+ lodash "^4.17.19"
+ node-fetch "^2.6.0"
+
+"@openzeppelin/defender-base-client@1.54.1", "@openzeppelin/defender-base-client@^1.52.0":
+ version "1.54.1"
+ resolved "https://registry.yarnpkg.com/@openzeppelin/defender-base-client/-/defender-base-client-1.54.1.tgz#ed777ae56908d5a920e1f72ac735c63694e65b30"
+ integrity sha512-DRGz/7KN3ZQwu28YWMOaojrC7jjPkz/uCwkC8/C8B11qwZhA5qIVvyhYHhhFOCl0J84+E3TNdvkPD2q3p2WaJw==
+ dependencies:
+ amazon-cognito-identity-js "^6.0.1"
+ async-retry "^1.3.3"
+ axios "^1.4.0"
+ lodash "^4.17.19"
+ node-fetch "^2.6.0"
+
+"@openzeppelin/defender-sdk-base-client@^1.10.0", "@openzeppelin/defender-sdk-base-client@^1.11.0":
+ version "1.11.0"
+ resolved "https://registry.yarnpkg.com/@openzeppelin/defender-sdk-base-client/-/defender-sdk-base-client-1.11.0.tgz#771ea315d07dc9dc4a7572aef42892ac772b8a2e"
+ integrity sha512-HNcbRhbcMZZM5Ri5IfUwJaiJZGIrc0yboRZRlXJfG2aFS/EMfUFnQHC0tyyXtCOAoAZcn+iMlsSj5h8CoUeCfw==
+ dependencies:
+ amazon-cognito-identity-js "^6.3.6"
+ async-retry "^1.3.3"
+
+"@openzeppelin/defender-sdk-deploy-client@^1.10.0":
+ version "1.11.0"
+ resolved "https://registry.yarnpkg.com/@openzeppelin/defender-sdk-deploy-client/-/defender-sdk-deploy-client-1.11.0.tgz#951e8e17b9079fb8744261445514a80ee57af7eb"
+ integrity sha512-ELYVihsrTOlH7Sy5C/+Yf64hV3ICeTY2OcczOWVQ/o6rHBWKSnHSZCE/oB1cfOpyg/gCrCLXozs4NyrS5z3GUw==
+ dependencies:
+ "@openzeppelin/defender-sdk-base-client" "^1.11.0"
+ axios "^1.6.7"
+ lodash "^4.17.21"
+
+"@openzeppelin/defender-sdk-network-client@^1.10.0":
+ version "1.11.0"
+ resolved "https://registry.yarnpkg.com/@openzeppelin/defender-sdk-network-client/-/defender-sdk-network-client-1.11.0.tgz#1accb636cb7f5c3cde46745e5fb64b73bb7ca1e4"
+ integrity sha512-CPy1TA6RyFYtACbvXZJhJpsYW2u4yxTSNU8cVIw1lH/9iArXzfWuJ2p8Deidc0sJBbMeJYkv1AvqTBJNifjKMg==
+ dependencies:
+ "@openzeppelin/defender-sdk-base-client" "^1.11.0"
+ axios "^1.6.7"
+ lodash "^4.17.21"
+
+"@openzeppelin/hardhat-upgrades@^3.0.0":
+ version "3.0.5"
+ resolved "https://registry.yarnpkg.com/@openzeppelin/hardhat-upgrades/-/hardhat-upgrades-3.0.5.tgz#792bef91f78c34aa1b64866dcbbf3b230bd6c4f7"
+ integrity sha512-7Klg1B6fH45+7Zxzr6d9mLqudrL9Uk6CUG5AeG5NckPfP4ZlQRo1squcQ8yJPwqDS8rQjfChiqKDelp4LTjyZQ==
+ dependencies:
+ "@openzeppelin/defender-admin-client" "^1.52.0"
+ "@openzeppelin/defender-base-client" "^1.52.0"
+ "@openzeppelin/defender-sdk-base-client" "^1.10.0"
+ "@openzeppelin/defender-sdk-deploy-client" "^1.10.0"
+ "@openzeppelin/defender-sdk-network-client" "^1.10.0"
+ "@openzeppelin/upgrades-core" "^1.32.0"
+ chalk "^4.1.0"
+ debug "^4.1.1"
+ ethereumjs-util "^7.1.5"
+ proper-lockfile "^4.1.1"
+ undici "^6.0.0"
+
+"@openzeppelin/upgrades-core@^1.32.0":
+ version "1.32.2"
+ resolved "https://registry.yarnpkg.com/@openzeppelin/upgrades-core/-/upgrades-core-1.32.2.tgz#4313bd0a547090a350817cf798af60e0eb0728e8"
+ integrity sha512-EkXriOHZfn6u00Tbq0zUuhHDeTQB9WyAZKZo3UeYdqULb7E3vqxZgxgXmWJwEzAb6E77DvprzQ4gwCAjMV/S4Q==
+ dependencies:
+ cbor "^9.0.0"
+ chalk "^4.1.0"
+ compare-versions "^6.0.0"
+ debug "^4.1.1"
+ ethereumjs-util "^7.0.3"
+ minimist "^1.2.7"
+ proper-lockfile "^4.1.1"
+ solidity-ast "^0.4.51"
+
+"@scure/base@~1.1.0":
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/@scure/base/-/base-1.1.3.tgz#8584115565228290a6c6c4961973e0903bb3df2f"
+ integrity sha512-/+SgoRjLq7Xlf0CWuLHq2LUZeL/w65kfzAPG5NH9pcmBhs+nunQTn4gvdwgMTIXnt9b2C/1SeL2XiysZEyIC9Q==
+
+"@scure/bip32@1.1.5":
+ version "1.1.5"
+ resolved "https://registry.yarnpkg.com/@scure/bip32/-/bip32-1.1.5.tgz#d2ccae16dcc2e75bc1d75f5ef3c66a338d1ba300"
+ integrity sha512-XyNh1rB0SkEqd3tXcXMi+Xe1fvg+kUIcoRIEujP1Jgv7DqW2r9lg3Ah0NkFaCs9sTkQAQA8kw7xiRXzENi9Rtw==
+ dependencies:
+ "@noble/hashes" "~1.2.0"
+ "@noble/secp256k1" "~1.7.0"
+ "@scure/base" "~1.1.0"
+
+"@scure/bip32@1.3.1":
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/@scure/bip32/-/bip32-1.3.1.tgz#7248aea723667f98160f593d621c47e208ccbb10"
+ integrity sha512-osvveYtyzdEVbt3OfwwXFr4P2iVBL5u1Q3q4ONBfDY/UpOuXmOlbgwc1xECEboY8wIays8Yt6onaWMUdUbfl0A==
+ dependencies:
+ "@noble/curves" "~1.1.0"
+ "@noble/hashes" "~1.3.1"
+ "@scure/base" "~1.1.0"
+
+"@scure/bip39@1.1.1":
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/@scure/bip39/-/bip39-1.1.1.tgz#b54557b2e86214319405db819c4b6a370cf340c5"
+ integrity sha512-t+wDck2rVkh65Hmv280fYdVdY25J9YeEUIgn2LG1WM6gxFkGzcksoDiUkWVpVp3Oex9xGC68JU2dSbUfwZ2jPg==
+ dependencies:
+ "@noble/hashes" "~1.2.0"
+ "@scure/base" "~1.1.0"
+
+"@scure/bip39@1.2.1":
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/@scure/bip39/-/bip39-1.2.1.tgz#5cee8978656b272a917b7871c981e0541ad6ac2a"
+ integrity sha512-Z3/Fsz1yr904dduJD0NpiyRHhRYHdcnyh73FZWiV+/qhWi83wNJ3NWolYqCEN+ZWsUz2TWwajJggcRE9r1zUYg==
+ dependencies:
+ "@noble/hashes" "~1.3.0"
+ "@scure/base" "~1.1.0"
+
+"@sentry/core@5.30.0":
+ version "5.30.0"
+ resolved "https://registry.yarnpkg.com/@sentry/core/-/core-5.30.0.tgz#6b203664f69e75106ee8b5a2fe1d717379b331f3"
+ integrity sha512-TmfrII8w1PQZSZgPpUESqjB+jC6MvZJZdLtE/0hZ+SrnKhW3x5WlYLvTXZpcWePYBku7rl2wn1RZu6uT0qCTeg==
+ dependencies:
+ "@sentry/hub" "5.30.0"
+ "@sentry/minimal" "5.30.0"
+ "@sentry/types" "5.30.0"
+ "@sentry/utils" "5.30.0"
+ tslib "^1.9.3"
+
+"@sentry/hub@5.30.0":
+ version "5.30.0"
+ resolved "https://registry.yarnpkg.com/@sentry/hub/-/hub-5.30.0.tgz#2453be9b9cb903404366e198bd30c7ca74cdc100"
+ integrity sha512-2tYrGnzb1gKz2EkMDQcfLrDTvmGcQPuWxLnJKXJvYTQDGLlEvi2tWz1VIHjunmOvJrB5aIQLhm+dcMRwFZDCqQ==
+ dependencies:
+ "@sentry/types" "5.30.0"
+ "@sentry/utils" "5.30.0"
+ tslib "^1.9.3"
+
+"@sentry/minimal@5.30.0":
+ version "5.30.0"
+ resolved "https://registry.yarnpkg.com/@sentry/minimal/-/minimal-5.30.0.tgz#ce3d3a6a273428e0084adcb800bc12e72d34637b"
+ integrity sha512-BwWb/owZKtkDX+Sc4zCSTNcvZUq7YcH3uAVlmh/gtR9rmUvbzAA3ewLuB3myi4wWRAMEtny6+J/FN/x+2wn9Xw==
+ dependencies:
+ "@sentry/hub" "5.30.0"
+ "@sentry/types" "5.30.0"
+ tslib "^1.9.3"
+
+"@sentry/node@^5.18.1":
+ version "5.30.0"
+ resolved "https://registry.yarnpkg.com/@sentry/node/-/node-5.30.0.tgz#4ca479e799b1021285d7fe12ac0858951c11cd48"
+ integrity sha512-Br5oyVBF0fZo6ZS9bxbJZG4ApAjRqAnqFFurMVJJdunNb80brh7a5Qva2kjhm+U6r9NJAB5OmDyPkA1Qnt+QVg==
+ 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.1"
+ https-proxy-agent "^5.0.0"
+ lru_map "^0.3.3"
+ tslib "^1.9.3"
+
+"@sentry/tracing@5.30.0":
+ version "5.30.0"
+ resolved "https://registry.yarnpkg.com/@sentry/tracing/-/tracing-5.30.0.tgz#501d21f00c3f3be7f7635d8710da70d9419d4e1f"
+ integrity sha512-dUFowCr0AIMwiLD7Fs314Mdzcug+gBVo/+NCMyDw8tFxJkwWAKl7Qa2OZxLQ0ZHjakcj1hNKfCQJ9rhyfOl4Aw==
+ dependencies:
+ "@sentry/hub" "5.30.0"
+ "@sentry/minimal" "5.30.0"
+ "@sentry/types" "5.30.0"
+ "@sentry/utils" "5.30.0"
+ tslib "^1.9.3"
+
+"@sentry/types@5.30.0":
+ version "5.30.0"
+ resolved "https://registry.yarnpkg.com/@sentry/types/-/types-5.30.0.tgz#19709bbe12a1a0115bc790b8942917da5636f402"
+ integrity sha512-R8xOqlSTZ+htqrfteCWU5Nk0CDN5ApUTvrlvBuiH1DyP6czDZ4ktbZB0hAgBlVcK0U+qpD3ag3Tqqpa5Q67rPw==
+
+"@sentry/utils@5.30.0":
+ version "5.30.0"
+ resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-5.30.0.tgz#9a5bd7ccff85ccfe7856d493bffa64cabc41e980"
+ integrity sha512-zaYmoH0NWWtvnJjC9/CBseXMtKHm/tm40sz3YfJRxeQjyzRqNQPgivpd9R/oDJCYj999mzdW382p/qi2ypjLww==
+ dependencies:
+ "@sentry/types" "5.30.0"
+ tslib "^1.9.3"
+
+"@smithy/types@^2.3.4":
+ version "2.3.4"
+ resolved "https://registry.yarnpkg.com/@smithy/types/-/types-2.3.4.tgz#3b9bc15000af0a0b1f4fda741f78c1580ba15e92"
+ integrity sha512-D7xlM9FOMFyFw7YnMXn9dK2KuN6+JhnrZwVt1fWaIu8hCk5CigysweeIT/H/nCo4YV+s8/oqUdLfexbkPZtvqw==
+ dependencies:
+ tslib "^2.5.0"
+
+"@solidity-parser/parser@^0.14.0":
+ version "0.14.5"
+ resolved "https://registry.yarnpkg.com/@solidity-parser/parser/-/parser-0.14.5.tgz#87bc3cc7b068e08195c219c91cd8ddff5ef1a804"
+ integrity sha512-6dKnHZn7fg/iQATVEzqyUOyEidbn05q7YA2mQ9hC0MMXhhV3/JrsxmFSYZAcr7j1yUP700LLhTruvJ3MiQmjJg==
+ dependencies:
+ antlr4ts "^0.5.0-alpha.4"
+
+"@solidity-parser/parser@^0.18.0":
+ version "0.18.0"
+ resolved "https://registry.yarnpkg.com/@solidity-parser/parser/-/parser-0.18.0.tgz#8e77a02a09ecce957255a2f48c9a7178ec191908"
+ integrity sha512-yfORGUIPgLck41qyN7nbwJRAx17/jAIXCTanHOJZhB6PJ1iAk/84b/xlsVKFSyNyLXIj0dhppoE0+CRws7wlzA==
+
+"@tsconfig/node10@^1.0.7":
+ version "1.0.9"
+ resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.9.tgz#df4907fc07a886922637b15e02d4cebc4c0021b2"
+ integrity sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==
+
+"@tsconfig/node12@^1.0.7":
+ version "1.0.11"
+ resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.11.tgz#ee3def1f27d9ed66dac6e46a295cffb0152e058d"
+ integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==
+
+"@tsconfig/node14@^1.0.0":
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.3.tgz#e4386316284f00b98435bf40f72f75a09dabf6c1"
+ integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==
+
+"@tsconfig/node16@^1.0.2":
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.4.tgz#0b92dcc0cc1c81f6f306a381f28e31b1a56536e9"
+ integrity sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==
+
+"@typechain/ethers-v6@^0.5.1":
+ version "0.5.1"
+ resolved "https://registry.yarnpkg.com/@typechain/ethers-v6/-/ethers-v6-0.5.1.tgz#42fe214a19a8b687086c93189b301e2b878797ea"
+ integrity sha512-F+GklO8jBWlsaVV+9oHaPh5NJdd6rAKN4tklGfInX1Q7h0xPgVLP39Jl3eCulPB5qexI71ZFHwbljx4ZXNfouA==
+ dependencies:
+ lodash "^4.17.15"
+ ts-essentials "^7.0.1"
+
+"@typechain/hardhat@^9.1.0":
+ version "9.1.0"
+ resolved "https://registry.yarnpkg.com/@typechain/hardhat/-/hardhat-9.1.0.tgz#6985015f01dfb37ef2ca8a29c742d05890351ddc"
+ integrity sha512-mtaUlzLlkqTlfPwB3FORdejqBskSnh+Jl8AIJGjXNAQfRQ4ofHADPl1+oU7Z3pAJzmZbUXII8MhOLQltcHgKnA==
+ dependencies:
+ fs-extra "^9.1.0"
+
+"@types/bn.js@^4.11.3":
+ version "4.11.6"
+ resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-4.11.6.tgz#c306c70d9358aaea33cd4eda092a742b9505967c"
+ integrity sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==
+ dependencies:
+ "@types/node" "*"
+
+"@types/bn.js@^5.1.0":
+ version "5.1.2"
+ resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-5.1.2.tgz#162f5238c46f4bcbac07a98561724eca1fcf0c5e"
+ integrity sha512-dkpZu0szUtn9UXTmw+e0AJFd4D2XAxDnsCLdc05SfqpqzPEBft8eQr8uaFitfo/dUUOZERaLec2hHMG87A4Dxg==
+ dependencies:
+ "@types/node" "*"
+
+"@types/chai-as-promised@^7.1.3":
+ version "7.1.6"
+ resolved "https://registry.yarnpkg.com/@types/chai-as-promised/-/chai-as-promised-7.1.6.tgz#3b08cbe1e7206567a480dc6538bade374b19e4e1"
+ integrity sha512-cQLhk8fFarRVZAXUQV1xEnZgMoPxqKojBvRkqPCKPQCzEhpbbSKl1Uu75kDng7k5Ln6LQLUmNBjLlFthCgm1NA==
+ dependencies:
+ "@types/chai" "*"
+
+"@types/chai@*":
+ version "4.3.6"
+ resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.3.6.tgz#7b489e8baf393d5dd1266fb203ddd4ea941259e6"
+ integrity sha512-VOVRLM1mBxIRxydiViqPcKn6MIxZytrbMpd6RJLIWKxUNr3zux8no0Oc7kJx0WAPIitgZ0gkrDS+btlqQpubpw==
+
+"@types/chai@^4.3.11":
+ version "4.3.11"
+ resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.3.11.tgz#e95050bf79a932cb7305dd130254ccdf9bde671c"
+ integrity sha512-qQR1dr2rGIHYlJulmr8Ioq3De0Le9E4MJ5AiaeAETJJpndT1uUNHsGFK3L/UIu+rbkQSdj8J/w2bCsBZc/Y5fQ==
+
+"@types/concat-stream@^1.6.0":
+ version "1.6.1"
+ resolved "https://registry.yarnpkg.com/@types/concat-stream/-/concat-stream-1.6.1.tgz#24bcfc101ecf68e886aaedce60dfd74b632a1b74"
+ integrity sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA==
+ dependencies:
+ "@types/node" "*"
+
+"@types/form-data@0.0.33":
+ version "0.0.33"
+ resolved "https://registry.yarnpkg.com/@types/form-data/-/form-data-0.0.33.tgz#c9ac85b2a5fd18435b8c85d9ecb50e6d6c893ff8"
+ integrity sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw==
+ dependencies:
+ "@types/node" "*"
+
+"@types/fs-extra@^11.0.4":
+ version "11.0.4"
+ resolved "https://registry.yarnpkg.com/@types/fs-extra/-/fs-extra-11.0.4.tgz#e16a863bb8843fba8c5004362b5a73e17becca45"
+ integrity sha512-yTbItCNreRooED33qjunPthRcSjERP1r4MqCZc7wv0u2sUkzTFp45tgUfS5+r7FrZPdmCCNflLhVSP/o+SemsQ==
+ dependencies:
+ "@types/jsonfile" "*"
+ "@types/node" "*"
+
+"@types/glob@^7.1.1":
+ version "7.2.0"
+ resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.2.0.tgz#bc1b5bf3aa92f25bd5dd39f35c57361bdce5b2eb"
+ integrity sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==
+ dependencies:
+ "@types/minimatch" "*"
+ "@types/node" "*"
+
+"@types/jsonfile@*":
+ version "6.1.4"
+ resolved "https://registry.yarnpkg.com/@types/jsonfile/-/jsonfile-6.1.4.tgz#614afec1a1164e7d670b4a7ad64df3e7beb7b702"
+ integrity sha512-D5qGUYwjvnNNextdU59/+fI+spnwtTFmyQP0h+PfIOSkNfpU6AOICUOkm4i0OnSk+NyjdPJrxCDro0sJsWlRpQ==
+ dependencies:
+ "@types/node" "*"
+
+"@types/lru-cache@^5.1.0":
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/@types/lru-cache/-/lru-cache-5.1.1.tgz#c48c2e27b65d2a153b19bfc1a317e30872e01eef"
+ integrity sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw==
+
+"@types/minimatch@*":
+ version "5.1.2"
+ resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-5.1.2.tgz#07508b45797cb81ec3f273011b054cd0755eddca"
+ integrity sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==
+
+"@types/mocha@^10.0.6":
+ version "10.0.6"
+ resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-10.0.6.tgz#818551d39113081048bdddbef96701b4e8bb9d1b"
+ integrity sha512-dJvrYWxP/UcXm36Qn36fxhUKu8A/xMRXVT2cliFF1Z7UA9liG5Psj3ezNSZw+5puH2czDXRLcXQxf8JbJt0ejg==
+
+"@types/node@*":
+ version "20.8.2"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-20.8.2.tgz#d76fb80d87d0d8abfe334fc6d292e83e5524efc4"
+ integrity sha512-Vvycsc9FQdwhxE3y3DzeIxuEJbWGDsnrxvMADzTDF/lcdR9/K+AQIeAghTQsHtotg/q0j3WEOYS/jQgSdWue3w==
+
+"@types/node@18.15.13":
+ version "18.15.13"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-18.15.13.tgz#f64277c341150c979e42b00e4ac289290c9df469"
+ integrity sha512-N+0kuo9KgrUQ1Sn/ifDXsvg0TTleP7rIy4zOBGECxAljqvqfqpTfzx0Q1NUedOixRMBfe2Whhb056a42cWs26Q==
+
+"@types/node@^10.0.3":
+ version "10.17.60"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-10.17.60.tgz#35f3d6213daed95da7f0f73e75bcc6980e90597b"
+ integrity sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==
+
+"@types/node@^20.10.1":
+ version "20.10.1"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-20.10.1.tgz#d2c96f356c3125fedc983d74c424910c3767141c"
+ integrity sha512-T2qwhjWwGH81vUEx4EXmBKsTJRXFXNZTL4v0gi01+zyBmCwzE6TyHszqX01m+QHTEq+EZNo13NeJIdEqf+Myrg==
+ dependencies:
+ undici-types "~5.26.4"
+
+"@types/node@^8.0.0":
+ version "8.10.66"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-8.10.66.tgz#dd035d409df322acc83dff62a602f12a5783bbb3"
+ integrity sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==
+
+"@types/pbkdf2@^3.0.0":
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/@types/pbkdf2/-/pbkdf2-3.1.0.tgz#039a0e9b67da0cdc4ee5dab865caa6b267bb66b1"
+ integrity sha512-Cf63Rv7jCQ0LaL8tNXmEyqTHuIJxRdlS5vMh1mj5voN4+QFhVZnlZruezqpWYDiJ8UTzhP0VmeLXCmBk66YrMQ==
+ dependencies:
+ "@types/node" "*"
+
+"@types/prettier@^2.1.1":
+ version "2.7.3"
+ resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.7.3.tgz#3e51a17e291d01d17d3fc61422015a933af7a08f"
+ integrity sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==
+
+"@types/qs@^6.2.31", "@types/qs@^6.9.7":
+ version "6.9.8"
+ resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.8.tgz#f2a7de3c107b89b441e071d5472e6b726b4adf45"
+ integrity sha512-u95svzDlTysU5xecFNTgfFG5RUWu1A9P0VzgpcIiGZA9iraHOdSzcxMxQ55DyeRaGCSxQi7LxXDI4rzq/MYfdg==
+
+"@types/readable-stream@^2.3.13":
+ version "2.3.15"
+ resolved "https://registry.yarnpkg.com/@types/readable-stream/-/readable-stream-2.3.15.tgz#3d79c9ceb1b6a57d5f6e6976f489b9b5384321ae"
+ integrity sha512-oM5JSKQCcICF1wvGgmecmHldZ48OZamtMxcGGVICOJA8o8cahXC1zEVAif8iwoc5j8etxFaRFnf095+CDsuoFQ==
+ dependencies:
+ "@types/node" "*"
+ safe-buffer "~5.1.1"
+
+"@types/secp256k1@^4.0.1":
+ version "4.0.4"
+ resolved "https://registry.yarnpkg.com/@types/secp256k1/-/secp256k1-4.0.4.tgz#33c760de627fce1f449c2d4270da07e4da54c830"
+ integrity sha512-oN0PFsYxDZnX/qSJ5S5OwaEDTYfekhvaM5vqui2bu1AA39pKofmgL104Q29KiOXizXS2yLjSzc5YdTyMKdcy4A==
+ dependencies:
+ "@types/node" "*"
+
+abbrev@1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8"
+ integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==
+
+abbrev@1.0.x:
+ version "1.0.9"
+ resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.0.9.tgz#91b4792588a7738c25f35dd6f63752a2f8776135"
+ integrity sha512-LEyx4aLEC3x6T0UguF6YILf+ntvmOaWsVfENmIW0E9H09vKlLDGelMjjSm0jkDHALj8A8quZ/HapKNigzwge+Q==
+
+abstract-level@^1.0.0, abstract-level@^1.0.2, abstract-level@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/abstract-level/-/abstract-level-1.0.3.tgz#78a67d3d84da55ee15201486ab44c09560070741"
+ integrity sha512-t6jv+xHy+VYwc4xqZMn2Pa9DjcdzvzZmQGRjTFc8spIbRGHgBrEKbPq+rYXc7CCo0lxgYvSgKVg9qZAhpVQSjA==
+ dependencies:
+ buffer "^6.0.3"
+ catering "^2.1.0"
+ is-buffer "^2.0.5"
+ level-supports "^4.0.0"
+ level-transcoder "^1.0.1"
+ module-error "^1.0.1"
+ queue-microtask "^1.2.3"
+
+acorn-walk@^8.1.1:
+ version "8.2.0"
+ resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1"
+ integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==
+
+acorn@^8.4.1:
+ version "8.10.0"
+ resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.10.0.tgz#8be5b3907a67221a81ab23c7889c4c5526b62ec5"
+ integrity sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==
+
+adm-zip@^0.4.16:
+ version "0.4.16"
+ resolved "https://registry.yarnpkg.com/adm-zip/-/adm-zip-0.4.16.tgz#cf4c508fdffab02c269cbc7f471a875f05570365"
+ integrity sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg==
+
+aes-js@3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/aes-js/-/aes-js-3.0.0.tgz#e21df10ad6c2053295bcbb8dab40b09dbea87e4d"
+ integrity sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==
+
+aes-js@4.0.0-beta.5:
+ version "4.0.0-beta.5"
+ resolved "https://registry.yarnpkg.com/aes-js/-/aes-js-4.0.0-beta.5.tgz#8d2452c52adedebc3a3e28465d858c11ca315873"
+ integrity sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==
+
+agent-base@6:
+ version "6.0.2"
+ resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77"
+ integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==
+ dependencies:
+ debug "4"
+
+aggregate-error@^3.0.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a"
+ integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==
+ dependencies:
+ clean-stack "^2.0.0"
+ indent-string "^4.0.0"
+
+ajv@^8.0.1:
+ version "8.12.0"
+ resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.12.0.tgz#d1a0527323e22f53562c567c00991577dfbe19d1"
+ integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==
+ dependencies:
+ fast-deep-equal "^3.1.1"
+ json-schema-traverse "^1.0.0"
+ require-from-string "^2.0.2"
+ uri-js "^4.2.2"
+
+amazon-cognito-identity-js@^6.0.1:
+ version "6.3.6"
+ resolved "https://registry.yarnpkg.com/amazon-cognito-identity-js/-/amazon-cognito-identity-js-6.3.6.tgz#a5baa3615dc5771d9f9edeedf13d6e6df5e202d6"
+ integrity sha512-kBq+GE6OkLrxtFj3ZduIOlKBFYeOqZK3EhxbDBkv476UTvy+uwfR0tlriTq2QzNdnvlQAjBIXnXuOM7DwR1UEQ==
+ dependencies:
+ "@aws-crypto/sha256-js" "1.2.2"
+ buffer "4.9.2"
+ fast-base64-decode "^1.0.0"
+ isomorphic-unfetch "^3.0.0"
+ js-cookie "^2.2.1"
+
+amazon-cognito-identity-js@^6.3.6:
+ version "6.3.7"
+ resolved "https://registry.yarnpkg.com/amazon-cognito-identity-js/-/amazon-cognito-identity-js-6.3.7.tgz#65c3d7ee4e0c0a1ffea01927248989c5bd1d1868"
+ integrity sha512-tSjnM7KyAeOZ7UMah+oOZ6cW4Gf64FFcc7BE2l7MTcp7ekAPrXaCbpcW2xEpH1EiDS4cPcAouHzmCuc2tr72vQ==
+ dependencies:
+ "@aws-crypto/sha256-js" "1.2.2"
+ buffer "4.9.2"
+ fast-base64-decode "^1.0.0"
+ isomorphic-unfetch "^3.0.0"
+ js-cookie "^2.2.1"
+
+amdefine@>=0.0.4:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5"
+ integrity sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg==
+
+ansi-colors@4.1.1:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348"
+ integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==
+
+ansi-colors@^4.1.1:
+ version "4.1.3"
+ resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b"
+ integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==
+
+ansi-escapes@^4.3.0:
+ version "4.3.2"
+ resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e"
+ integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==
+ dependencies:
+ type-fest "^0.21.3"
+
+ansi-regex@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.1.tgz#123d6479e92ad45ad897d4054e3c7ca7db4944e1"
+ integrity sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==
+
+ansi-regex@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304"
+ integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==
+
+ansi-styles@^3.2.1:
+ version "3.2.1"
+ resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d"
+ integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==
+ dependencies:
+ color-convert "^1.9.0"
+
+ansi-styles@^4.0.0, ansi-styles@^4.1.0:
+ version "4.3.0"
+ resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937"
+ integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==
+ dependencies:
+ color-convert "^2.0.1"
+
+antlr4ts@^0.5.0-alpha.4:
+ version "0.5.0-alpha.4"
+ resolved "https://registry.yarnpkg.com/antlr4ts/-/antlr4ts-0.5.0-alpha.4.tgz#71702865a87478ed0b40c0709f422cf14d51652a"
+ integrity sha512-WPQDt1B74OfPv/IMS2ekXAKkTZIHl88uMetg6q3OTqgFxZ/dxDXI0EWLyZid/1Pe6hTftyg5N7gel5wNAGxXyQ==
+
+anymatch@~3.1.2:
+ version "3.1.3"
+ resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e"
+ integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==
+ dependencies:
+ normalize-path "^3.0.0"
+ picomatch "^2.0.4"
+
+arg@^4.1.0:
+ version "4.1.3"
+ resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089"
+ integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==
+
+argparse@^1.0.7:
+ version "1.0.10"
+ resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911"
+ integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==
+ dependencies:
+ sprintf-js "~1.0.2"
+
+argparse@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38"
+ integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==
+
+array-back@^3.0.1, array-back@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/array-back/-/array-back-3.1.0.tgz#b8859d7a508871c9a7b2cf42f99428f65e96bfb0"
+ integrity sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==
+
+array-back@^4.0.1, array-back@^4.0.2:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/array-back/-/array-back-4.0.2.tgz#8004e999a6274586beeb27342168652fdb89fa1e"
+ integrity sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==
+
+array-buffer-byte-length@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz#fabe8bc193fea865f317fe7807085ee0dee5aead"
+ integrity sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==
+ dependencies:
+ call-bind "^1.0.2"
+ is-array-buffer "^3.0.1"
+
+array-union@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d"
+ integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==
+
+array-uniq@1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6"
+ integrity sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==
+
+array.prototype.findlast@^1.2.2:
+ version "1.2.3"
+ resolved "https://registry.yarnpkg.com/array.prototype.findlast/-/array.prototype.findlast-1.2.3.tgz#4e4b375de5adf4897fed155e2d2771564865cc3b"
+ integrity sha512-kcBubumjciBg4JKp5KTKtI7ec7tRefPk88yjkWJwaVKYd9QfTaxcsOxoMNKd7iBr447zCfDV0z1kOF47umv42g==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.2.0"
+ es-abstract "^1.22.1"
+ es-shim-unscopables "^1.0.0"
+ get-intrinsic "^1.2.1"
+
+arraybuffer.prototype.slice@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz#98bd561953e3e74bb34938e77647179dfe6e9f12"
+ integrity sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==
+ dependencies:
+ array-buffer-byte-length "^1.0.0"
+ call-bind "^1.0.2"
+ define-properties "^1.2.0"
+ es-abstract "^1.22.1"
+ get-intrinsic "^1.2.1"
+ is-array-buffer "^3.0.2"
+ is-shared-array-buffer "^1.0.2"
+
+asap@~2.0.6:
+ version "2.0.6"
+ resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46"
+ integrity sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==
+
+assertion-error@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b"
+ integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==
+
+astral-regex@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31"
+ integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==
+
+async-retry@^1.3.3:
+ version "1.3.3"
+ resolved "https://registry.yarnpkg.com/async-retry/-/async-retry-1.3.3.tgz#0e7f36c04d8478e7a58bdbed80cedf977785f280"
+ integrity sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==
+ dependencies:
+ retry "0.13.1"
+
+async@1.x:
+ version "1.5.2"
+ resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a"
+ integrity sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w==
+
+asynckit@^0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
+ integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==
+
+at-least-node@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2"
+ integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==
+
+available-typed-arrays@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7"
+ integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==
+
+axios@^0.21.1:
+ version "0.21.4"
+ resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.4.tgz#c67b90dc0568e5c1cf2b0b858c43ba28e2eda575"
+ integrity sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==
+ dependencies:
+ follow-redirects "^1.14.0"
+
+axios@^1.4.0, axios@^1.5.1:
+ version "1.5.1"
+ resolved "https://registry.yarnpkg.com/axios/-/axios-1.5.1.tgz#11fbaa11fc35f431193a9564109c88c1f27b585f"
+ integrity sha512-Q28iYCWzNHjAm+yEAot5QaAMxhMghWLFVf7rRdwhUI+c2jix2DUXjAHXVi+s1ibs3mjPO/cCgbA++3BjD0vP/A==
+ dependencies:
+ follow-redirects "^1.15.0"
+ form-data "^4.0.0"
+ proxy-from-env "^1.1.0"
+
+axios@^1.6.7:
+ version "1.6.8"
+ resolved "https://registry.yarnpkg.com/axios/-/axios-1.6.8.tgz#66d294951f5d988a00e87a0ffb955316a619ea66"
+ integrity sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==
+ dependencies:
+ follow-redirects "^1.15.6"
+ form-data "^4.0.0"
+ proxy-from-env "^1.1.0"
+
+balanced-match@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee"
+ integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==
+
+base-x@^3.0.2:
+ version "3.0.9"
+ resolved "https://registry.yarnpkg.com/base-x/-/base-x-3.0.9.tgz#6349aaabb58526332de9f60995e548a53fe21320"
+ integrity sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==
+ dependencies:
+ safe-buffer "^5.0.1"
+
+base-x@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/base-x/-/base-x-4.0.0.tgz#d0e3b7753450c73f8ad2389b5c018a4af7b2224a"
+ integrity sha512-FuwxlW4H5kh37X/oW59pwTzzTKRzfrrQwhmyspRM7swOEZcHtDZSCt45U6oKgtuFE+WYPblePMVIPR4RZrh/hw==
+
+base64-js@^1.0.2, base64-js@^1.3.1:
+ version "1.5.1"
+ resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a"
+ integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==
+
+bech32@1.1.4:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/bech32/-/bech32-1.1.4.tgz#e38c9f37bf179b8eb16ae3a772b40c356d4832e9"
+ integrity sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==
+
+bigint-crypto-utils@^3.0.23:
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/bigint-crypto-utils/-/bigint-crypto-utils-3.3.0.tgz#72ad00ae91062cf07f2b1def9594006c279c1d77"
+ integrity sha512-jOTSb+drvEDxEq6OuUybOAv/xxoh3cuYRUIPyu8sSHQNKM303UQ2R1DAo45o1AkcIXw6fzbaFI1+xGGdaXs2lg==
+
+binary-extensions@^2.0.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d"
+ integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==
+
+blakejs@^1.1.0:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/blakejs/-/blakejs-1.2.1.tgz#5057e4206eadb4a97f7c0b6e197a505042fc3814"
+ integrity sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ==
+
+bn.js@4.11.6:
+ version "4.11.6"
+ resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.6.tgz#53344adb14617a13f6e8dd2ce28905d1c0ba3215"
+ integrity sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA==
+
+bn.js@^4.11.0, bn.js@^4.11.8, bn.js@^4.11.9:
+ version "4.12.0"
+ resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88"
+ integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==
+
+bn.js@^5.1.2, bn.js@^5.2.0, bn.js@^5.2.1:
+ version "5.2.1"
+ resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.1.tgz#0bc527a6a0d18d0aa8d5b0538ce4a77dccfa7b70"
+ integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==
+
+brace-expansion@^1.1.7:
+ version "1.1.11"
+ resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
+ integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==
+ dependencies:
+ balanced-match "^1.0.0"
+ concat-map "0.0.1"
+
+brace-expansion@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae"
+ integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==
+ dependencies:
+ balanced-match "^1.0.0"
+
+braces@^3.0.2, braces@~3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107"
+ integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==
+ dependencies:
+ fill-range "^7.0.1"
+
+brorand@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f"
+ integrity sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==
+
+browser-level@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/browser-level/-/browser-level-1.0.1.tgz#36e8c3183d0fe1c405239792faaab5f315871011"
+ integrity sha512-XECYKJ+Dbzw0lbydyQuJzwNXtOpbMSq737qxJN11sIRTErOMShvDpbzTlgju7orJKvx4epULolZAuJGLzCmWRQ==
+ dependencies:
+ abstract-level "^1.0.2"
+ catering "^2.1.1"
+ module-error "^1.0.2"
+ run-parallel-limit "^1.1.0"
+
+browser-stdout@1.3.1:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60"
+ integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==
+
+browserify-aes@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48"
+ integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==
+ dependencies:
+ buffer-xor "^1.0.3"
+ cipher-base "^1.0.0"
+ create-hash "^1.1.0"
+ evp_bytestokey "^1.0.3"
+ inherits "^2.0.1"
+ safe-buffer "^5.0.1"
+
+bs58@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/bs58/-/bs58-4.0.1.tgz#be161e76c354f6f788ae4071f63f34e8c4f0a42a"
+ integrity sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==
+ dependencies:
+ base-x "^3.0.2"
+
+bs58@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/bs58/-/bs58-5.0.0.tgz#865575b4d13c09ea2a84622df6c8cbeb54ffc279"
+ integrity sha512-r+ihvQJvahgYT50JD05dyJNKlmmSlMoOGwn1lCcEzanPglg7TxYjioQUYehQ9mAR/+hOSd2jRc/Z2y5UxBymvQ==
+ dependencies:
+ base-x "^4.0.0"
+
+bs58check@^2.1.2:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/bs58check/-/bs58check-2.1.2.tgz#53b018291228d82a5aa08e7d796fdafda54aebfc"
+ integrity sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==
+ dependencies:
+ bs58 "^4.0.0"
+ create-hash "^1.1.0"
+ safe-buffer "^5.1.2"
+
+buffer-from@^1.0.0:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5"
+ integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==
+
+buffer-xor@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9"
+ integrity sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==
+
+buffer@4.9.2:
+ version "4.9.2"
+ resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.2.tgz#230ead344002988644841ab0244af8c44bbe3ef8"
+ integrity sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==
+ dependencies:
+ base64-js "^1.0.2"
+ ieee754 "^1.1.4"
+ isarray "^1.0.0"
+
+buffer@^6.0.3:
+ version "6.0.3"
+ resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6"
+ integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==
+ dependencies:
+ base64-js "^1.3.1"
+ ieee754 "^1.2.1"
+
+bytes@3.1.2:
+ version "3.1.2"
+ resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5"
+ integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==
+
+call-bind@^1.0.0, call-bind@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c"
+ integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==
+ dependencies:
+ function-bind "^1.1.1"
+ get-intrinsic "^1.0.2"
+
+camelcase@^6.0.0:
+ version "6.3.0"
+ resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a"
+ integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==
+
+case@^1.6.3:
+ version "1.6.3"
+ resolved "https://registry.yarnpkg.com/case/-/case-1.6.3.tgz#0a4386e3e9825351ca2e6216c60467ff5f1ea1c9"
+ integrity sha512-mzDSXIPaFwVDvZAHqZ9VlbyF4yyXRuX6IvB06WvPYkqJVO24kX1PPhv9bfpKNFZyxYFmmgo03HUiD8iklmJYRQ==
+
+caseless@^0.12.0, caseless@~0.12.0:
+ version "0.12.0"
+ resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc"
+ integrity sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==
+
+catering@^2.1.0, catering@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/catering/-/catering-2.1.1.tgz#66acba06ed5ee28d5286133982a927de9a04b510"
+ integrity sha512-K7Qy8O9p76sL3/3m7/zLKbRkyOlSZAgzEaLhyj2mXS8PsCud2Eo4hAb8aLtZqHh0QGqLcb9dlJSu6lHRVENm1w==
+
+cbor@^8.1.0:
+ version "8.1.0"
+ resolved "https://registry.yarnpkg.com/cbor/-/cbor-8.1.0.tgz#cfc56437e770b73417a2ecbfc9caf6b771af60d5"
+ integrity sha512-DwGjNW9omn6EwP70aXsn7FQJx5kO12tX0bZkaTjzdVFM6/7nhA4t0EENocKGx6D2Bch9PE2KzCUf5SceBdeijg==
+ dependencies:
+ nofilter "^3.1.0"
+
+cbor@^9.0.0:
+ version "9.0.1"
+ resolved "https://registry.yarnpkg.com/cbor/-/cbor-9.0.1.tgz#b16e393d4948d44758cd54ac6151379d443b37ae"
+ integrity sha512-/TQOWyamDxvVIv+DY9cOLNuABkoyz8K/F3QE56539pGVYohx0+MEA1f4lChFTX79dBTBS7R1PF6ovH7G+VtBfQ==
+ dependencies:
+ nofilter "^3.1.0"
+
+chai-as-promised@^7.1.1:
+ version "7.1.1"
+ resolved "https://registry.yarnpkg.com/chai-as-promised/-/chai-as-promised-7.1.1.tgz#08645d825deb8696ee61725dbf590c012eb00ca0"
+ integrity sha512-azL6xMoi+uxu6z4rhWQ1jbdUhOMhis2PvscD/xjLqNMkv3BPPp2JyyuTHOrf9BOosGpNQ11v6BKv/g57RXbiaA==
+ dependencies:
+ check-error "^1.0.2"
+
+chai@^4.2.0:
+ version "4.3.10"
+ resolved "https://registry.yarnpkg.com/chai/-/chai-4.3.10.tgz#d784cec635e3b7e2ffb66446a63b4e33bd390384"
+ integrity sha512-0UXG04VuVbruMUYbJ6JctvH0YnC/4q3/AkT18q4NaITo91CUm0liMS9VqzT9vZhVQ/1eqPanMWjBM+Juhfb/9g==
+ dependencies:
+ assertion-error "^1.1.0"
+ check-error "^1.0.3"
+ deep-eql "^4.1.3"
+ get-func-name "^2.0.2"
+ loupe "^2.3.6"
+ pathval "^1.1.1"
+ type-detect "^4.0.8"
+
+chalk@^2.4.2:
+ version "2.4.2"
+ resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424"
+ integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==
+ dependencies:
+ ansi-styles "^3.2.1"
+ escape-string-regexp "^1.0.5"
+ supports-color "^5.3.0"
+
+chalk@^4.1.0, chalk@^4.1.2:
+ version "4.1.2"
+ resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01"
+ integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==
+ dependencies:
+ ansi-styles "^4.1.0"
+ supports-color "^7.1.0"
+
+"charenc@>= 0.0.1":
+ version "0.0.2"
+ resolved "https://registry.yarnpkg.com/charenc/-/charenc-0.0.2.tgz#c0a1d2f3a7092e03774bfa83f14c0fc5790a8667"
+ integrity sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==
+
+check-error@^1.0.2, check-error@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.3.tgz#a6502e4312a7ee969f646e83bb3ddd56281bd694"
+ integrity sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==
+ dependencies:
+ get-func-name "^2.0.2"
+
+chokidar@3.5.3, chokidar@^3.4.0, chokidar@^3.5.2:
+ version "3.5.3"
+ resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd"
+ integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==
+ dependencies:
+ anymatch "~3.1.2"
+ braces "~3.0.2"
+ glob-parent "~5.1.2"
+ is-binary-path "~2.1.0"
+ is-glob "~4.0.1"
+ normalize-path "~3.0.0"
+ readdirp "~3.6.0"
+ optionalDependencies:
+ fsevents "~2.3.2"
+
+ci-info@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46"
+ integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==
+
+cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de"
+ integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==
+ dependencies:
+ inherits "^2.0.1"
+ safe-buffer "^5.0.1"
+
+classic-level@^1.2.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/classic-level/-/classic-level-1.3.0.tgz#5e36680e01dc6b271775c093f2150844c5edd5c8"
+ integrity sha512-iwFAJQYtqRTRM0F6L8h4JCt00ZSGdOyqh7yVrhhjrOpFhmBjNlRUey64MCiyo6UmQHMJ+No3c81nujPv+n9yrg==
+ dependencies:
+ abstract-level "^1.0.2"
+ catering "^2.1.0"
+ module-error "^1.0.1"
+ napi-macros "^2.2.2"
+ node-gyp-build "^4.3.0"
+
+clean-stack@^2.0.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b"
+ integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==
+
+cli-table3@^0.5.0:
+ version "0.5.1"
+ resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.5.1.tgz#0252372d94dfc40dbd8df06005f48f31f656f202"
+ integrity sha512-7Qg2Jrep1S/+Q3EceiZtQcDPWxhAvBw+ERf1162v4sikJrvojMHFqXt8QIVha8UlH9rgU0BeWPytZ9/TzYqlUw==
+ dependencies:
+ object-assign "^4.1.0"
+ string-width "^2.1.1"
+ optionalDependencies:
+ colors "^1.1.2"
+
+cliui@^7.0.2:
+ version "7.0.4"
+ resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f"
+ integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==
+ dependencies:
+ string-width "^4.2.0"
+ strip-ansi "^6.0.0"
+ wrap-ansi "^7.0.0"
+
+color-convert@^1.9.0:
+ version "1.9.3"
+ resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8"
+ integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==
+ dependencies:
+ color-name "1.1.3"
+
+color-convert@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3"
+ integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==
+ dependencies:
+ color-name "~1.1.4"
+
+color-name@1.1.3:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25"
+ integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==
+
+color-name@~1.1.4:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2"
+ integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
+
+colors@1.4.0, colors@^1.1.2:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78"
+ integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==
+
+combined-stream@^1.0.6, combined-stream@^1.0.8:
+ version "1.0.8"
+ resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f"
+ integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==
+ dependencies:
+ delayed-stream "~1.0.0"
+
+command-exists@^1.2.8:
+ version "1.2.9"
+ resolved "https://registry.yarnpkg.com/command-exists/-/command-exists-1.2.9.tgz#c50725af3808c8ab0260fd60b01fbfa25b954f69"
+ integrity sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==
+
+command-line-args@^5.1.1:
+ version "5.2.1"
+ resolved "https://registry.yarnpkg.com/command-line-args/-/command-line-args-5.2.1.tgz#c44c32e437a57d7c51157696893c5909e9cec42e"
+ integrity sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==
+ dependencies:
+ array-back "^3.1.0"
+ find-replace "^3.0.0"
+ lodash.camelcase "^4.3.0"
+ typical "^4.0.0"
+
+command-line-usage@^6.1.0:
+ version "6.1.3"
+ resolved "https://registry.yarnpkg.com/command-line-usage/-/command-line-usage-6.1.3.tgz#428fa5acde6a838779dfa30e44686f4b6761d957"
+ integrity sha512-sH5ZSPr+7UStsloltmDh7Ce5fb8XPlHyoPzTpyyMuYCtervL65+ubVZ6Q61cFtFl62UyJlc8/JwERRbAFPUqgw==
+ dependencies:
+ array-back "^4.0.2"
+ chalk "^2.4.2"
+ table-layout "^1.0.2"
+ typical "^5.2.0"
+
+commander@3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/commander/-/commander-3.0.2.tgz#6837c3fb677ad9933d1cfba42dd14d5117d6b39e"
+ integrity sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow==
+
+compare-versions@^6.0.0:
+ version "6.1.0"
+ resolved "https://registry.yarnpkg.com/compare-versions/-/compare-versions-6.1.0.tgz#3f2131e3ae93577df111dba133e6db876ffe127a"
+ integrity sha512-LNZQXhqUvqUTotpZ00qLSaify3b4VFD588aRr8MKFw4CMUr98ytzCW5wDH5qx/DEY5kCDXcbcRuCqL0szEf2tg==
+
+concat-map@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
+ integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==
+
+concat-stream@^1.6.0, concat-stream@^1.6.2:
+ version "1.6.2"
+ resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34"
+ integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==
+ dependencies:
+ buffer-from "^1.0.0"
+ inherits "^2.0.3"
+ readable-stream "^2.2.2"
+ typedarray "^0.0.6"
+
+cookie@^0.4.1:
+ version "0.4.2"
+ resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.2.tgz#0e41f24de5ecf317947c82fc789e06a884824432"
+ integrity sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==
+
+core-util-is@~1.0.0:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85"
+ integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==
+
+crc-32@^1.2.0:
+ version "1.2.2"
+ resolved "https://registry.yarnpkg.com/crc-32/-/crc-32-1.2.2.tgz#3cad35a934b8bf71f25ca524b6da51fb7eace2ff"
+ integrity sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==
+
+create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196"
+ integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==
+ dependencies:
+ cipher-base "^1.0.1"
+ inherits "^2.0.1"
+ md5.js "^1.3.4"
+ ripemd160 "^2.0.1"
+ sha.js "^2.4.0"
+
+create-hmac@^1.1.4, create-hmac@^1.1.7:
+ version "1.1.7"
+ resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff"
+ integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==
+ dependencies:
+ cipher-base "^1.0.3"
+ create-hash "^1.1.0"
+ inherits "^2.0.1"
+ ripemd160 "^2.0.0"
+ safe-buffer "^5.0.1"
+ sha.js "^2.4.8"
+
+create-require@^1.1.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333"
+ integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==
+
+"crypt@>= 0.0.1":
+ version "0.0.2"
+ resolved "https://registry.yarnpkg.com/crypt/-/crypt-0.0.2.tgz#88d7ff7ec0dfb86f713dc87bbb42d044d3e6c41b"
+ integrity sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==
+
+death@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/death/-/death-1.1.0.tgz#01aa9c401edd92750514470b8266390c66c67318"
+ integrity sha512-vsV6S4KVHvTGxbEcij7hkWRv0It+sGGWVOM67dQde/o5Xjnr+KmLjxWJii2uEObIrt1CcM9w0Yaovx+iOlIL+w==
+
+debug@4, debug@4.3.4, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4:
+ version "4.3.4"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865"
+ integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==
+ dependencies:
+ ms "2.1.2"
+
+decamelize@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837"
+ integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==
+
+deep-eql@^4.0.1, deep-eql@^4.1.3:
+ version "4.1.3"
+ resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-4.1.3.tgz#7c7775513092f7df98d8df9996dd085eb668cc6d"
+ integrity sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==
+ dependencies:
+ type-detect "^4.0.0"
+
+deep-extend@~0.6.0:
+ version "0.6.0"
+ resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac"
+ integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==
+
+deep-is@~0.1.3:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831"
+ integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==
+
+define-data-property@^1.0.1:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.0.tgz#0db13540704e1d8d479a0656cf781267531b9451"
+ integrity sha512-UzGwzcjyv3OtAvolTj1GoyNYzfFR+iqbGjcnBEENZVCpM4/Ng1yhGNvS3lR/xDS74Tb2wGG9WzNSNIOS9UVb2g==
+ dependencies:
+ get-intrinsic "^1.2.1"
+ gopd "^1.0.1"
+ has-property-descriptors "^1.0.0"
+
+define-properties@^1.1.3, define-properties@^1.1.4, define-properties@^1.2.0:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c"
+ integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==
+ dependencies:
+ define-data-property "^1.0.1"
+ has-property-descriptors "^1.0.0"
+ object-keys "^1.1.1"
+
+delayed-stream@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
+ integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==
+
+depd@2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df"
+ integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==
+
+diff@5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/diff/-/diff-5.0.0.tgz#7ed6ad76d859d030787ec35855f5b1daf31d852b"
+ integrity sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==
+
+diff@^4.0.1:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d"
+ integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==
+
+difflib@^0.2.4:
+ version "0.2.4"
+ resolved "https://registry.yarnpkg.com/difflib/-/difflib-0.2.4.tgz#b5e30361a6db023176d562892db85940a718f47e"
+ integrity sha512-9YVwmMb0wQHQNr5J9m6BSj6fk4pfGITGQOOs+D9Fl+INODWFOfvhIU1hNv6GgR1RBoC/9NJcwu77zShxV0kT7w==
+ dependencies:
+ heap ">= 0.2.0"
+
+dir-glob@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f"
+ integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==
+ dependencies:
+ path-type "^4.0.0"
+
+dotenv@^16.3.1:
+ version "16.3.1"
+ resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.3.1.tgz#369034de7d7e5b120972693352a3bf112172cc3e"
+ integrity sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==
+
+"ds-test@github:dapphub/ds-test":
+ version "1.0.0"
+ resolved "https://codeload.github.com/dapphub/ds-test/tar.gz/e282159d5170298eb2455a6c05280ab5a73a4ef0"
+
+elliptic@6.5.4, elliptic@^6.5.2, elliptic@^6.5.4:
+ version "6.5.4"
+ resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb"
+ integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==
+ dependencies:
+ bn.js "^4.11.9"
+ brorand "^1.1.0"
+ hash.js "^1.0.0"
+ hmac-drbg "^1.0.1"
+ inherits "^2.0.4"
+ minimalistic-assert "^1.0.1"
+ minimalistic-crypto-utils "^1.0.1"
+
+emoji-regex@^8.0.0:
+ version "8.0.0"
+ resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37"
+ integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==
+
+encode-utf8@^1.0.2:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/encode-utf8/-/encode-utf8-1.0.3.tgz#f30fdd31da07fb596f281beb2f6b027851994cda"
+ integrity sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw==
+
+enquirer@^2.3.0, enquirer@^2.3.6:
+ version "2.4.1"
+ resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.4.1.tgz#93334b3fbd74fc7097b224ab4a8fb7e40bf4ae56"
+ integrity sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==
+ dependencies:
+ ansi-colors "^4.1.1"
+ strip-ansi "^6.0.1"
+
+env-paths@^2.2.0:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2"
+ integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==
+
+es-abstract@^1.22.1:
+ version "1.22.2"
+ resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.22.2.tgz#90f7282d91d0ad577f505e423e52d4c1d93c1b8a"
+ integrity sha512-YoxfFcDmhjOgWPWsV13+2RNjq1F6UQnfs+8TftwNqtzlmFzEXvlUwdrNrYeaizfjQzRMxkZ6ElWMOJIFKdVqwA==
+ dependencies:
+ array-buffer-byte-length "^1.0.0"
+ arraybuffer.prototype.slice "^1.0.2"
+ available-typed-arrays "^1.0.5"
+ call-bind "^1.0.2"
+ es-set-tostringtag "^2.0.1"
+ es-to-primitive "^1.2.1"
+ function.prototype.name "^1.1.6"
+ get-intrinsic "^1.2.1"
+ get-symbol-description "^1.0.0"
+ globalthis "^1.0.3"
+ gopd "^1.0.1"
+ has "^1.0.3"
+ has-property-descriptors "^1.0.0"
+ has-proto "^1.0.1"
+ has-symbols "^1.0.3"
+ internal-slot "^1.0.5"
+ is-array-buffer "^3.0.2"
+ is-callable "^1.2.7"
+ is-negative-zero "^2.0.2"
+ is-regex "^1.1.4"
+ is-shared-array-buffer "^1.0.2"
+ is-string "^1.0.7"
+ is-typed-array "^1.1.12"
+ is-weakref "^1.0.2"
+ object-inspect "^1.12.3"
+ object-keys "^1.1.1"
+ object.assign "^4.1.4"
+ regexp.prototype.flags "^1.5.1"
+ safe-array-concat "^1.0.1"
+ safe-regex-test "^1.0.0"
+ string.prototype.trim "^1.2.8"
+ string.prototype.trimend "^1.0.7"
+ string.prototype.trimstart "^1.0.7"
+ typed-array-buffer "^1.0.0"
+ typed-array-byte-length "^1.0.0"
+ typed-array-byte-offset "^1.0.0"
+ typed-array-length "^1.0.4"
+ unbox-primitive "^1.0.2"
+ which-typed-array "^1.1.11"
+
+es-set-tostringtag@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz#338d502f6f674301d710b80c8592de8a15f09cd8"
+ integrity sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==
+ dependencies:
+ get-intrinsic "^1.1.3"
+ has "^1.0.3"
+ has-tostringtag "^1.0.0"
+
+es-shim-unscopables@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz#702e632193201e3edf8713635d083d378e510241"
+ integrity sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==
+ dependencies:
+ has "^1.0.3"
+
+es-to-primitive@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a"
+ integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==
+ dependencies:
+ is-callable "^1.1.4"
+ is-date-object "^1.0.1"
+ is-symbol "^1.0.2"
+
+escalade@^3.1.1:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40"
+ integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==
+
+escape-string-regexp@4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34"
+ integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==
+
+escape-string-regexp@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
+ integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==
+
+escodegen@1.8.x:
+ version "1.8.1"
+ resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.8.1.tgz#5a5b53af4693110bebb0867aa3430dd3b70a1018"
+ integrity sha512-yhi5S+mNTOuRvyW4gWlg5W1byMaQGWWSYHXsuFZ7GBo7tpyOwi2EdzMP/QWxh9hwkD2m+wDVHJsxhRIj+v/b/A==
+ dependencies:
+ esprima "^2.7.1"
+ estraverse "^1.9.1"
+ esutils "^2.0.2"
+ optionator "^0.8.1"
+ optionalDependencies:
+ source-map "~0.2.0"
+
+esprima@2.7.x, esprima@^2.7.1:
+ version "2.7.3"
+ resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581"
+ integrity sha512-OarPfz0lFCiW4/AV2Oy1Rp9qu0iusTKqykwTspGCZtPxmF81JR4MmIebvF1F9+UOKth2ZubLQ4XGGaU+hSn99A==
+
+esprima@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71"
+ integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==
+
+estraverse@^1.9.1:
+ version "1.9.3"
+ resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-1.9.3.tgz#af67f2dc922582415950926091a4005d29c9bb44"
+ integrity sha512-25w1fMXQrGdoquWnScXZGckOv+Wes+JDnuN/+7ex3SauFRS72r2lFDec0EKPt2YD1wUJ/IrfEex+9yp4hfSOJA==
+
+esutils@^2.0.2:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64"
+ integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==
+
+eth-gas-reporter@^0.2.25:
+ version "0.2.27"
+ resolved "https://registry.yarnpkg.com/eth-gas-reporter/-/eth-gas-reporter-0.2.27.tgz#928de8548a674ed64c7ba0bf5795e63079150d4e"
+ integrity sha512-femhvoAM7wL0GcI8ozTdxfuBtBFJ9qsyIAsmKVjlWAHUbdnnXHt+lKzz/kmldM5lA9jLuNHGwuIxorNpLbR1Zw==
+ dependencies:
+ "@solidity-parser/parser" "^0.14.0"
+ axios "^1.5.1"
+ cli-table3 "^0.5.0"
+ colors "1.4.0"
+ ethereum-cryptography "^1.0.3"
+ ethers "^5.7.2"
+ fs-readdir-recursive "^1.1.0"
+ lodash "^4.17.14"
+ markdown-table "^1.1.3"
+ mocha "^10.2.0"
+ req-cwd "^2.0.0"
+ sha1 "^1.1.1"
+ sync-request "^6.0.0"
+
+ethereum-bloom-filters@^1.0.6:
+ version "1.0.10"
+ resolved "https://registry.yarnpkg.com/ethereum-bloom-filters/-/ethereum-bloom-filters-1.0.10.tgz#3ca07f4aed698e75bd134584850260246a5fed8a"
+ integrity sha512-rxJ5OFN3RwjQxDcFP2Z5+Q9ho4eIdEmSc2ht0fCu8Se9nbXjZ7/031uXoUYJ87KHCOdVeiUuwSnoS7hmYAGVHA==
+ dependencies:
+ js-sha3 "^0.8.0"
+
+ethereum-cryptography@0.1.3, ethereum-cryptography@^0.1.3:
+ version "0.1.3"
+ resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz#8d6143cfc3d74bf79bbd8edecdf29e4ae20dd191"
+ integrity sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==
+ dependencies:
+ "@types/pbkdf2" "^3.0.0"
+ "@types/secp256k1" "^4.0.1"
+ blakejs "^1.1.0"
+ 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.0"
+ pbkdf2 "^3.0.17"
+ randombytes "^2.1.0"
+ safe-buffer "^5.1.2"
+ scrypt-js "^3.0.0"
+ secp256k1 "^4.0.1"
+ setimmediate "^1.0.5"
+
+ethereum-cryptography@^1.0.3:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-1.2.0.tgz#5ccfa183e85fdaf9f9b299a79430c044268c9b3a"
+ 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"
+
+ethereum-cryptography@^2.0.0, ethereum-cryptography@^2.1.2:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-2.1.2.tgz#18fa7108622e56481157a5cb7c01c0c6a672eb67"
+ integrity sha512-Z5Ba0T0ImZ8fqXrJbpHcbpAvIswRte2wGNR/KePnu8GbbvgJ47lMxT/ZZPG6i9Jaht4azPDop4HaM00J0J59ug==
+ dependencies:
+ "@noble/curves" "1.1.0"
+ "@noble/hashes" "1.3.1"
+ "@scure/bip32" "1.3.1"
+ "@scure/bip39" "1.2.1"
+
+ethereumjs-abi@^0.6.8:
+ version "0.6.8"
+ resolved "https://registry.yarnpkg.com/ethereumjs-abi/-/ethereumjs-abi-0.6.8.tgz#71bc152db099f70e62f108b7cdfca1b362c6fcae"
+ integrity sha512-Tx0r/iXI6r+lRsdvkFDlut0N08jWMnKRZ6Gkq+Nmw75lZe4e6o3EkSnkaBP5NF6+m5PTGAr9JP43N3LyeoglsA==
+ dependencies:
+ bn.js "^4.11.8"
+ ethereumjs-util "^6.0.0"
+
+ethereumjs-util@^6.0.0, ethereumjs-util@^6.2.1:
+ version "6.2.1"
+ resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz#fcb4e4dd5ceacb9d2305426ab1a5cd93e3163b69"
+ integrity sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw==
+ dependencies:
+ "@types/bn.js" "^4.11.3"
+ bn.js "^4.11.0"
+ create-hash "^1.1.2"
+ elliptic "^6.5.2"
+ ethereum-cryptography "^0.1.3"
+ ethjs-util "0.1.6"
+ rlp "^2.2.3"
+
+ethereumjs-util@^7.0.3, ethereumjs-util@^7.1.4, ethereumjs-util@^7.1.5:
+ version "7.1.5"
+ resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz#9ecf04861e4fbbeed7465ece5f23317ad1129181"
+ integrity sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==
+ dependencies:
+ "@types/bn.js" "^5.1.0"
+ bn.js "^5.1.2"
+ create-hash "^1.1.2"
+ ethereum-cryptography "^0.1.3"
+ rlp "^2.2.4"
+
+ethers@^5.6.1, ethers@^5.7.0, ethers@^5.7.1, ethers@^5.7.2:
+ version "5.7.2"
+ resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.7.2.tgz#3a7deeabbb8c030d4126b24f84e525466145872e"
+ integrity sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==
+ dependencies:
+ "@ethersproject/abi" "5.7.0"
+ "@ethersproject/abstract-provider" "5.7.0"
+ "@ethersproject/abstract-signer" "5.7.0"
+ "@ethersproject/address" "5.7.0"
+ "@ethersproject/base64" "5.7.0"
+ "@ethersproject/basex" "5.7.0"
+ "@ethersproject/bignumber" "5.7.0"
+ "@ethersproject/bytes" "5.7.0"
+ "@ethersproject/constants" "5.7.0"
+ "@ethersproject/contracts" "5.7.0"
+ "@ethersproject/hash" "5.7.0"
+ "@ethersproject/hdnode" "5.7.0"
+ "@ethersproject/json-wallets" "5.7.0"
+ "@ethersproject/keccak256" "5.7.0"
+ "@ethersproject/logger" "5.7.0"
+ "@ethersproject/networks" "5.7.1"
+ "@ethersproject/pbkdf2" "5.7.0"
+ "@ethersproject/properties" "5.7.0"
+ "@ethersproject/providers" "5.7.2"
+ "@ethersproject/random" "5.7.0"
+ "@ethersproject/rlp" "5.7.0"
+ "@ethersproject/sha2" "5.7.0"
+ "@ethersproject/signing-key" "5.7.0"
+ "@ethersproject/solidity" "5.7.0"
+ "@ethersproject/strings" "5.7.0"
+ "@ethersproject/transactions" "5.7.0"
+ "@ethersproject/units" "5.7.0"
+ "@ethersproject/wallet" "5.7.0"
+ "@ethersproject/web" "5.7.1"
+ "@ethersproject/wordlists" "5.7.0"
+
+ethers@^6.9.0:
+ version "6.9.0"
+ resolved "https://registry.yarnpkg.com/ethers/-/ethers-6.9.0.tgz#a4534bdcdfde306aee94ef32f3d5c70d7e33fcb9"
+ integrity sha512-pmfNyQzc2mseLe91FnT2vmNaTt8dDzhxZ/xItAV7uGsF4dI4ek2ufMu3rAkgQETL/TIs0GS5A+U05g9QyWnv3Q==
+ dependencies:
+ "@adraffy/ens-normalize" "1.10.0"
+ "@noble/curves" "1.2.0"
+ "@noble/hashes" "1.3.2"
+ "@types/node" "18.15.13"
+ aes-js "4.0.0-beta.5"
+ tslib "2.4.0"
+ ws "8.5.0"
+
+ethjs-unit@0.1.6:
+ version "0.1.6"
+ resolved "https://registry.yarnpkg.com/ethjs-unit/-/ethjs-unit-0.1.6.tgz#c665921e476e87bce2a9d588a6fe0405b2c41699"
+ integrity sha512-/Sn9Y0oKl0uqQuvgFk/zQgR7aw1g36qX/jzSQ5lSwlO0GigPymk4eGQfeNTD03w1dPOqfz8V77Cy43jH56pagw==
+ dependencies:
+ bn.js "4.11.6"
+ number-to-bn "1.7.0"
+
+ethjs-util@0.1.6, ethjs-util@^0.1.6:
+ version "0.1.6"
+ resolved "https://registry.yarnpkg.com/ethjs-util/-/ethjs-util-0.1.6.tgz#f308b62f185f9fe6237132fb2a9818866a5cd536"
+ integrity sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w==
+ dependencies:
+ is-hex-prefixed "1.0.0"
+ strip-hex-prefix "1.0.0"
+
+evp_bytestokey@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02"
+ integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==
+ dependencies:
+ md5.js "^1.3.4"
+ safe-buffer "^5.1.1"
+
+fast-base64-decode@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/fast-base64-decode/-/fast-base64-decode-1.0.0.tgz#b434a0dd7d92b12b43f26819300d2dafb83ee418"
+ integrity sha512-qwaScUgUGBYeDNRnbc/KyllVU88Jk1pRHPStuF/lO7B0/RTRLj7U0lkdTAutlBblY08rwZDff6tNU9cjv6j//Q==
+
+fast-deep-equal@^3.1.1:
+ version "3.1.3"
+ resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525"
+ integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==
+
+fast-glob@^3.0.3:
+ version "3.3.1"
+ resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.1.tgz#784b4e897340f3dbbef17413b3f11acf03c874c4"
+ integrity sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==
+ dependencies:
+ "@nodelib/fs.stat" "^2.0.2"
+ "@nodelib/fs.walk" "^1.2.3"
+ glob-parent "^5.1.2"
+ merge2 "^1.3.0"
+ micromatch "^4.0.4"
+
+fast-levenshtein@~2.0.6:
+ version "2.0.6"
+ resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917"
+ integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==
+
+fastq@^1.6.0:
+ version "1.15.0"
+ resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.15.0.tgz#d04d07c6a2a68fe4599fea8d2e103a937fae6b3a"
+ integrity sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==
+ dependencies:
+ reusify "^1.0.4"
+
+fill-range@^7.0.1:
+ version "7.0.1"
+ resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40"
+ integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==
+ dependencies:
+ to-regex-range "^5.0.1"
+
+find-replace@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/find-replace/-/find-replace-3.0.0.tgz#3e7e23d3b05167a76f770c9fbd5258b0def68c38"
+ integrity sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==
+ dependencies:
+ array-back "^3.0.1"
+
+find-up@5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc"
+ integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==
+ dependencies:
+ locate-path "^6.0.0"
+ path-exists "^4.0.0"
+
+find-up@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7"
+ integrity sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==
+ dependencies:
+ locate-path "^2.0.0"
+
+flat@^5.0.2:
+ version "5.0.2"
+ resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241"
+ integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==
+
+fmix@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/fmix/-/fmix-0.1.0.tgz#c7bbf124dec42c9d191cfb947d0a9778dd986c0c"
+ integrity sha512-Y6hyofImk9JdzU8k5INtTXX1cu8LDlePWDFU5sftm9H+zKCr5SGrVjdhkvsim646cw5zD0nADj8oHyXMZmCZ9w==
+ dependencies:
+ imul "^1.0.0"
+
+follow-redirects@^1.12.1, follow-redirects@^1.14.0, follow-redirects@^1.15.0:
+ version "1.15.3"
+ resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.3.tgz#fe2f3ef2690afce7e82ed0b44db08165b207123a"
+ integrity sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==
+
+follow-redirects@^1.15.6:
+ version "1.15.6"
+ resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.6.tgz#7f815c0cda4249c74ff09e95ef97c23b5fd0399b"
+ integrity sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==
+
+for-each@^0.3.3:
+ version "0.3.3"
+ resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e"
+ integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==
+ dependencies:
+ is-callable "^1.1.3"
+
+forge-std@^1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/forge-std/-/forge-std-1.1.2.tgz#f4a0eda103538d56f9c563f3cd1fa2fd01bd9378"
+ integrity sha512-Wfb0iAS9PcfjMKtGpWQw9mXzJxrWD62kJCUqqLcyuI0+VRtJ3j20XembjF3kS20qELYdXft1vD/SPFVWVKMFOw==
+
+form-data@^2.2.0:
+ version "2.5.1"
+ resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.5.1.tgz#f2cbec57b5e59e23716e128fe44d4e5dd23895f4"
+ integrity sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==
+ dependencies:
+ asynckit "^0.4.0"
+ combined-stream "^1.0.6"
+ mime-types "^2.1.12"
+
+form-data@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452"
+ integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==
+ dependencies:
+ asynckit "^0.4.0"
+ combined-stream "^1.0.8"
+ mime-types "^2.1.12"
+
+fp-ts@1.19.3:
+ version "1.19.3"
+ resolved "https://registry.yarnpkg.com/fp-ts/-/fp-ts-1.19.3.tgz#261a60d1088fbff01f91256f91d21d0caaaaa96f"
+ integrity sha512-H5KQDspykdHuztLTg+ajGN0Z2qUjcEf3Ybxc6hLt0k7/zPkn29XnKnxlBPyW2XIddWrGaJBzBl4VLYOtk39yZg==
+
+fp-ts@^1.0.0:
+ version "1.19.5"
+ resolved "https://registry.yarnpkg.com/fp-ts/-/fp-ts-1.19.5.tgz#3da865e585dfa1fdfd51785417357ac50afc520a"
+ integrity sha512-wDNqTimnzs8QqpldiId9OavWK2NptormjXnRJTQecNjzwfyp6P/8s/zG8e4h3ja3oqkKaY72UlTjQYt/1yXf9A==
+
+fs-extra@^0.30.0:
+ version "0.30.0"
+ resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-0.30.0.tgz#f233ffcc08d4da7d432daa449776989db1df93f0"
+ integrity sha512-UvSPKyhMn6LEd/WpUaV9C9t3zATuqoqfWc3QdPhPLb58prN9tqYPlPWi8Krxi44loBoUzlobqZ3+8tGpxxSzwA==
+ dependencies:
+ graceful-fs "^4.1.2"
+ jsonfile "^2.1.0"
+ klaw "^1.0.0"
+ path-is-absolute "^1.0.0"
+ rimraf "^2.2.8"
+
+fs-extra@^10.0.0:
+ version "10.1.0"
+ resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf"
+ integrity sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==
+ dependencies:
+ graceful-fs "^4.2.0"
+ jsonfile "^6.0.1"
+ universalify "^2.0.0"
+
+fs-extra@^11.2.0:
+ version "11.2.0"
+ resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.2.0.tgz#e70e17dfad64232287d01929399e0ea7c86b0e5b"
+ integrity sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==
+ dependencies:
+ graceful-fs "^4.2.0"
+ jsonfile "^6.0.1"
+ universalify "^2.0.0"
+
+fs-extra@^7.0.0, fs-extra@^7.0.1:
+ version "7.0.1"
+ resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9"
+ integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==
+ dependencies:
+ graceful-fs "^4.1.2"
+ jsonfile "^4.0.0"
+ universalify "^0.1.0"
+
+fs-extra@^8.1.0:
+ version "8.1.0"
+ resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0"
+ integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==
+ dependencies:
+ graceful-fs "^4.2.0"
+ jsonfile "^4.0.0"
+ universalify "^0.1.0"
+
+fs-extra@^9.1.0:
+ version "9.1.0"
+ resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d"
+ integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==
+ dependencies:
+ at-least-node "^1.0.0"
+ graceful-fs "^4.2.0"
+ jsonfile "^6.0.1"
+ universalify "^2.0.0"
+
+fs-readdir-recursive@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz#e32fc030a2ccee44a6b5371308da54be0b397d27"
+ integrity sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==
+
+fs.realpath@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
+ integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==
+
+fsevents@~2.3.2:
+ version "2.3.3"
+ resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6"
+ integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==
+
+function-bind@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d"
+ integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==
+
+function.prototype.name@^1.1.6:
+ version "1.1.6"
+ resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.6.tgz#cdf315b7d90ee77a4c6ee216c3c3362da07533fd"
+ integrity sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.2.0"
+ es-abstract "^1.22.1"
+ functions-have-names "^1.2.3"
+
+functional-red-black-tree@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327"
+ integrity sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==
+
+functions-have-names@^1.2.3:
+ version "1.2.3"
+ resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834"
+ integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==
+
+get-caller-file@^2.0.5:
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e"
+ integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==
+
+get-func-name@^2.0.0, get-func-name@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.2.tgz#0d7cf20cd13fda808669ffa88f4ffc7a3943fc41"
+ integrity sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==
+
+get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.0, get-intrinsic@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.1.tgz#d295644fed4505fc9cde952c37ee12b477a83d82"
+ integrity sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==
+ dependencies:
+ function-bind "^1.1.1"
+ has "^1.0.3"
+ has-proto "^1.0.1"
+ has-symbols "^1.0.3"
+
+get-port@^3.1.0:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/get-port/-/get-port-3.2.0.tgz#dd7ce7de187c06c8bf353796ac71e099f0980ebc"
+ integrity sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg==
+
+get-symbol-description@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6"
+ integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==
+ dependencies:
+ call-bind "^1.0.2"
+ get-intrinsic "^1.1.1"
+
+ghost-testrpc@^0.0.2:
+ version "0.0.2"
+ resolved "https://registry.yarnpkg.com/ghost-testrpc/-/ghost-testrpc-0.0.2.tgz#c4de9557b1d1ae7b2d20bbe474a91378ca90ce92"
+ integrity sha512-i08dAEgJ2g8z5buJIrCTduwPIhih3DP+hOCTyyryikfV8T0bNvHnGXO67i0DD1H4GBDETTclPy9njZbfluQYrQ==
+ dependencies:
+ chalk "^2.4.2"
+ node-emoji "^1.10.0"
+
+glob-parent@^5.1.2, glob-parent@~5.1.2:
+ version "5.1.2"
+ resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4"
+ integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==
+ dependencies:
+ is-glob "^4.0.1"
+
+glob@7.1.7:
+ version "7.1.7"
+ resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90"
+ integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==
+ dependencies:
+ fs.realpath "^1.0.0"
+ inflight "^1.0.4"
+ inherits "2"
+ minimatch "^3.0.4"
+ once "^1.3.0"
+ path-is-absolute "^1.0.0"
+
+glob@7.2.0:
+ version "7.2.0"
+ resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023"
+ integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==
+ dependencies:
+ fs.realpath "^1.0.0"
+ inflight "^1.0.4"
+ inherits "2"
+ minimatch "^3.0.4"
+ once "^1.3.0"
+ path-is-absolute "^1.0.0"
+
+glob@^5.0.15:
+ version "5.0.15"
+ resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1"
+ integrity sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA==
+ dependencies:
+ inflight "^1.0.4"
+ inherits "2"
+ minimatch "2 || 3"
+ once "^1.3.0"
+ path-is-absolute "^1.0.0"
+
+glob@^7.0.0, glob@^7.1.3:
+ version "7.2.3"
+ resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b"
+ integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==
+ dependencies:
+ fs.realpath "^1.0.0"
+ inflight "^1.0.4"
+ inherits "2"
+ minimatch "^3.1.1"
+ once "^1.3.0"
+ path-is-absolute "^1.0.0"
+
+global-modules@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-2.0.0.tgz#997605ad2345f27f51539bea26574421215c7780"
+ integrity sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==
+ dependencies:
+ global-prefix "^3.0.0"
+
+global-prefix@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-3.0.0.tgz#fc85f73064df69f50421f47f883fe5b913ba9b97"
+ integrity sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==
+ dependencies:
+ ini "^1.3.5"
+ kind-of "^6.0.2"
+ which "^1.3.1"
+
+globalthis@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.3.tgz#5852882a52b80dc301b0660273e1ed082f0b6ccf"
+ integrity sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==
+ dependencies:
+ define-properties "^1.1.3"
+
+globby@^10.0.1:
+ version "10.0.2"
+ resolved "https://registry.yarnpkg.com/globby/-/globby-10.0.2.tgz#277593e745acaa4646c3ab411289ec47a0392543"
+ integrity sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==
+ dependencies:
+ "@types/glob" "^7.1.1"
+ array-union "^2.1.0"
+ dir-glob "^3.0.1"
+ fast-glob "^3.0.3"
+ glob "^7.1.3"
+ ignore "^5.1.1"
+ merge2 "^1.2.3"
+ slash "^3.0.0"
+
+gopd@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c"
+ integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==
+ dependencies:
+ get-intrinsic "^1.1.3"
+
+graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@^4.2.0, graceful-fs@^4.2.4:
+ version "4.2.11"
+ resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3"
+ integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==
+
+handlebars@^4.0.1:
+ version "4.7.8"
+ resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.8.tgz#41c42c18b1be2365439188c77c6afae71c0cd9e9"
+ integrity sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==
+ dependencies:
+ minimist "^1.2.5"
+ neo-async "^2.6.2"
+ source-map "^0.6.1"
+ wordwrap "^1.0.0"
+ optionalDependencies:
+ uglify-js "^3.1.4"
+
+hardhat-deploy@^0.11.45:
+ version "0.11.45"
+ resolved "https://registry.yarnpkg.com/hardhat-deploy/-/hardhat-deploy-0.11.45.tgz#bed86118175a38a03bb58aba2ce1ed5e80a20bc8"
+ integrity sha512-aC8UNaq3JcORnEUIwV945iJuvBwi65tjHVDU3v6mOcqik7WAzHVCJ7cwmkkipsHrWysrB5YvGF1q9S1vIph83w==
+ dependencies:
+ "@ethersproject/abi" "^5.7.0"
+ "@ethersproject/abstract-signer" "^5.7.0"
+ "@ethersproject/address" "^5.7.0"
+ "@ethersproject/bignumber" "^5.7.0"
+ "@ethersproject/bytes" "^5.7.0"
+ "@ethersproject/constants" "^5.7.0"
+ "@ethersproject/contracts" "^5.7.0"
+ "@ethersproject/providers" "^5.7.2"
+ "@ethersproject/solidity" "^5.7.0"
+ "@ethersproject/transactions" "^5.7.0"
+ "@ethersproject/wallet" "^5.7.0"
+ "@types/qs" "^6.9.7"
+ axios "^0.21.1"
+ chalk "^4.1.2"
+ chokidar "^3.5.2"
+ debug "^4.3.2"
+ enquirer "^2.3.6"
+ ethers "^5.7.0"
+ form-data "^4.0.0"
+ fs-extra "^10.0.0"
+ match-all "^1.2.6"
+ murmur-128 "^0.2.1"
+ qs "^6.9.4"
+ zksync-web3 "^0.14.3"
+
+hardhat-gas-reporter@^1.0.9:
+ version "1.0.9"
+ resolved "https://registry.yarnpkg.com/hardhat-gas-reporter/-/hardhat-gas-reporter-1.0.9.tgz#9a2afb354bc3b6346aab55b1c02ca556d0e16450"
+ integrity sha512-INN26G3EW43adGKBNzYWOlI3+rlLnasXTwW79YNnUhXPDa+yHESgt639dJEs37gCjhkbNKcRRJnomXEuMFBXJg==
+ dependencies:
+ array-uniq "1.0.3"
+ eth-gas-reporter "^0.2.25"
+ sha1 "^1.1.1"
+
+hardhat-tracer@^2.7.0:
+ version "2.7.0"
+ resolved "https://registry.yarnpkg.com/hardhat-tracer/-/hardhat-tracer-2.7.0.tgz#af04e5cd7ec2525c24a70634f6d1051252992d03"
+ integrity sha512-H+30jj6bCyX7NfhY7Umbzq535jhi9Wd5fGNli9qWcQ+5iOB477Nm8XdGtPtgOV1vQ7VQzIwKFzoEbqy+BuxTlg==
+ dependencies:
+ chalk "^4.1.2"
+ debug "^4.3.4"
+ ethers "^5.6.1"
+
+hardhat@^2.19.1:
+ version "2.19.1"
+ resolved "https://registry.yarnpkg.com/hardhat/-/hardhat-2.19.1.tgz#5e09e8070ecfc6109ba9d3a4a117ec2b0643032a"
+ integrity sha512-bsWa63g1GB78ZyMN08WLhFElLPA+J+pShuKD1BFO2+88g3l+BL3R07vj9deIi9dMbssxgE714Gof1dBEDGqnCw==
+ dependencies:
+ "@ethersproject/abi" "^5.1.2"
+ "@metamask/eth-sig-util" "^4.0.0"
+ "@nomicfoundation/ethereumjs-block" "5.0.2"
+ "@nomicfoundation/ethereumjs-blockchain" "7.0.2"
+ "@nomicfoundation/ethereumjs-common" "4.0.2"
+ "@nomicfoundation/ethereumjs-evm" "2.0.2"
+ "@nomicfoundation/ethereumjs-rlp" "5.0.2"
+ "@nomicfoundation/ethereumjs-statemanager" "2.0.2"
+ "@nomicfoundation/ethereumjs-trie" "6.0.2"
+ "@nomicfoundation/ethereumjs-tx" "5.0.2"
+ "@nomicfoundation/ethereumjs-util" "9.0.2"
+ "@nomicfoundation/ethereumjs-vm" "7.0.2"
+ "@nomicfoundation/solidity-analyzer" "^0.1.0"
+ "@sentry/node" "^5.18.1"
+ "@types/bn.js" "^5.1.0"
+ "@types/lru-cache" "^5.1.0"
+ adm-zip "^0.4.16"
+ aggregate-error "^3.0.0"
+ ansi-escapes "^4.3.0"
+ chalk "^2.4.2"
+ chokidar "^3.4.0"
+ ci-info "^2.0.0"
+ debug "^4.1.1"
+ enquirer "^2.3.0"
+ env-paths "^2.2.0"
+ ethereum-cryptography "^1.0.3"
+ ethereumjs-abi "^0.6.8"
+ find-up "^2.1.0"
+ fp-ts "1.19.3"
+ fs-extra "^7.0.1"
+ glob "7.2.0"
+ immutable "^4.0.0-rc.12"
+ io-ts "1.10.4"
+ keccak "^3.0.2"
+ lodash "^4.17.11"
+ mnemonist "^0.38.0"
+ mocha "^10.0.0"
+ p-map "^4.0.0"
+ raw-body "^2.4.1"
+ resolve "1.17.0"
+ semver "^6.3.0"
+ solc "0.7.3"
+ source-map-support "^0.5.13"
+ stacktrace-parser "^0.1.10"
+ tsort "0.0.1"
+ undici "^5.14.0"
+ uuid "^8.3.2"
+ ws "^7.4.6"
+
+has-bigints@^1.0.1, has-bigints@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa"
+ integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==
+
+has-flag@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa"
+ integrity sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==
+
+has-flag@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
+ integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==
+
+has-flag@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b"
+ integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==
+
+has-property-descriptors@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz#610708600606d36961ed04c196193b6a607fa861"
+ integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==
+ dependencies:
+ get-intrinsic "^1.1.1"
+
+has-proto@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.1.tgz#1885c1305538958aff469fef37937c22795408e0"
+ integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==
+
+has-symbols@^1.0.2, has-symbols@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8"
+ integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==
+
+has-tostringtag@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25"
+ integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==
+ dependencies:
+ has-symbols "^1.0.2"
+
+has@^1.0.3:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/has/-/has-1.0.4.tgz#2eb2860e000011dae4f1406a86fe80e530fb2ec6"
+ integrity sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==
+
+hash-base@^3.0.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.1.0.tgz#55c381d9e06e1d2997a883b4a3fddfe7f0d3af33"
+ integrity sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==
+ dependencies:
+ inherits "^2.0.4"
+ readable-stream "^3.6.0"
+ safe-buffer "^5.2.0"
+
+hash.js@1.1.7, hash.js@^1.0.0, hash.js@^1.0.3, hash.js@^1.1.7:
+ version "1.1.7"
+ resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42"
+ integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==
+ dependencies:
+ inherits "^2.0.3"
+ minimalistic-assert "^1.0.1"
+
+he@1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f"
+ integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==
+
+"heap@>= 0.2.0":
+ version "0.2.7"
+ resolved "https://registry.yarnpkg.com/heap/-/heap-0.2.7.tgz#1e6adf711d3f27ce35a81fe3b7bd576c2260a8fc"
+ integrity sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==
+
+hmac-drbg@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1"
+ integrity sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==
+ dependencies:
+ hash.js "^1.0.3"
+ minimalistic-assert "^1.0.0"
+ minimalistic-crypto-utils "^1.0.1"
+
+http-basic@^8.1.1:
+ version "8.1.3"
+ resolved "https://registry.yarnpkg.com/http-basic/-/http-basic-8.1.3.tgz#a7cabee7526869b9b710136970805b1004261bbf"
+ integrity sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==
+ dependencies:
+ caseless "^0.12.0"
+ concat-stream "^1.6.2"
+ http-response-object "^3.0.1"
+ parse-cache-control "^1.0.1"
+
+http-errors@2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3"
+ integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==
+ dependencies:
+ depd "2.0.0"
+ inherits "2.0.4"
+ setprototypeof "1.2.0"
+ statuses "2.0.1"
+ toidentifier "1.0.1"
+
+http-response-object@^3.0.1:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/http-response-object/-/http-response-object-3.0.2.tgz#7f435bb210454e4360d074ef1f989d5ea8aa9810"
+ integrity sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==
+ dependencies:
+ "@types/node" "^10.0.3"
+
+https-proxy-agent@^5.0.0:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6"
+ integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==
+ dependencies:
+ agent-base "6"
+ debug "4"
+
+iconv-lite@0.4.24:
+ version "0.4.24"
+ resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b"
+ integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==
+ dependencies:
+ safer-buffer ">= 2.1.2 < 3"
+
+ieee754@^1.1.4, ieee754@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352"
+ integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==
+
+ignore@^5.1.1:
+ version "5.2.4"
+ resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324"
+ integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==
+
+immutable@^4.0.0-rc.12:
+ version "4.3.4"
+ resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.3.4.tgz#2e07b33837b4bb7662f288c244d1ced1ef65a78f"
+ integrity sha512-fsXeu4J4i6WNWSikpI88v/PcVflZz+6kMhUfIwc5SY+poQRPnaf5V7qds6SUyUN3cVxEzuCab7QIoLOQ+DQ1wA==
+
+imul@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/imul/-/imul-1.0.1.tgz#9d5867161e8b3de96c2c38d5dc7cb102f35e2ac9"
+ integrity sha512-WFAgfwPLAjU66EKt6vRdTlKj4nAgIDQzh29JonLa4Bqtl6D8JrIMvWjCnx7xEjVNmP3U0fM5o8ZObk7d0f62bA==
+
+indent-string@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251"
+ integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==
+
+inflight@^1.0.4:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
+ integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==
+ dependencies:
+ once "^1.3.0"
+ wrappy "1"
+
+inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
+ integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
+
+ini@^1.3.5:
+ version "1.3.8"
+ resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c"
+ integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==
+
+internal-slot@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.5.tgz#f2a2ee21f668f8627a4667f309dc0f4fb6674986"
+ integrity sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==
+ dependencies:
+ get-intrinsic "^1.2.0"
+ has "^1.0.3"
+ side-channel "^1.0.4"
+
+interpret@^1.0.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e"
+ integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==
+
+io-ts@1.10.4:
+ version "1.10.4"
+ resolved "https://registry.yarnpkg.com/io-ts/-/io-ts-1.10.4.tgz#cd5401b138de88e4f920adbcb7026e2d1967e6e2"
+ integrity sha512-b23PteSnYXSONJ6JQXRAlvJhuw8KOtkqa87W4wDtvMrud/DTJd5X+NpOOI+O/zZwVq6v0VLAaJ+1EDViKEuN9g==
+ dependencies:
+ fp-ts "^1.0.0"
+
+is-array-buffer@^3.0.1, is-array-buffer@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.2.tgz#f2653ced8412081638ecb0ebbd0c41c6e0aecbbe"
+ integrity sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==
+ dependencies:
+ call-bind "^1.0.2"
+ get-intrinsic "^1.2.0"
+ is-typed-array "^1.1.10"
+
+is-bigint@^1.0.1:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3"
+ integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==
+ dependencies:
+ has-bigints "^1.0.1"
+
+is-binary-path@~2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09"
+ integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==
+ dependencies:
+ binary-extensions "^2.0.0"
+
+is-boolean-object@^1.1.0:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719"
+ integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==
+ dependencies:
+ call-bind "^1.0.2"
+ has-tostringtag "^1.0.0"
+
+is-buffer@^2.0.5:
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191"
+ integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==
+
+is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7:
+ version "1.2.7"
+ resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055"
+ integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==
+
+is-core-module@^2.13.0:
+ version "2.13.0"
+ resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.0.tgz#bb52aa6e2cbd49a30c2ba68c42bf3435ba6072db"
+ integrity sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==
+ dependencies:
+ has "^1.0.3"
+
+is-date-object@^1.0.1:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f"
+ integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==
+ dependencies:
+ has-tostringtag "^1.0.0"
+
+is-extglob@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
+ integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==
+
+is-fullwidth-code-point@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f"
+ integrity sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==
+
+is-fullwidth-code-point@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d"
+ integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==
+
+is-glob@^4.0.1, is-glob@~4.0.1:
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084"
+ integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==
+ dependencies:
+ is-extglob "^2.1.1"
+
+is-hex-prefixed@1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz#7d8d37e6ad77e5d127148913c573e082d777f554"
+ integrity sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA==
+
+is-negative-zero@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150"
+ integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==
+
+is-number-object@^1.0.4:
+ version "1.0.7"
+ resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc"
+ integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==
+ dependencies:
+ has-tostringtag "^1.0.0"
+
+is-number@^7.0.0:
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b"
+ integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==
+
+is-plain-obj@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287"
+ integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==
+
+is-regex@^1.1.4:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958"
+ integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==
+ dependencies:
+ call-bind "^1.0.2"
+ has-tostringtag "^1.0.0"
+
+is-shared-array-buffer@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79"
+ integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==
+ dependencies:
+ call-bind "^1.0.2"
+
+is-string@^1.0.5, is-string@^1.0.7:
+ version "1.0.7"
+ resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd"
+ integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==
+ dependencies:
+ has-tostringtag "^1.0.0"
+
+is-symbol@^1.0.2, is-symbol@^1.0.3:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c"
+ integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==
+ dependencies:
+ has-symbols "^1.0.2"
+
+is-typed-array@^1.1.10, is-typed-array@^1.1.12, is-typed-array@^1.1.9:
+ version "1.1.12"
+ resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.12.tgz#d0bab5686ef4a76f7a73097b95470ab199c57d4a"
+ integrity sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==
+ dependencies:
+ which-typed-array "^1.1.11"
+
+is-unicode-supported@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7"
+ integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==
+
+is-weakref@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2"
+ integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==
+ dependencies:
+ call-bind "^1.0.2"
+
+isarray@^1.0.0, isarray@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
+ integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==
+
+isarray@^2.0.5:
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723"
+ integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==
+
+isexe@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
+ integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==
+
+isomorphic-unfetch@^3.0.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/isomorphic-unfetch/-/isomorphic-unfetch-3.1.0.tgz#87341d5f4f7b63843d468438128cb087b7c3e98f"
+ integrity sha512-geDJjpoZ8N0kWexiwkX8F9NkTsXhetLPVbZFQ+JTW239QNOwvB0gniuR1Wc6f0AMTn7/mFGyXvHTifrCp/GH8Q==
+ dependencies:
+ node-fetch "^2.6.1"
+ unfetch "^4.2.0"
+
+js-cookie@^2.2.1:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/js-cookie/-/js-cookie-2.2.1.tgz#69e106dc5d5806894562902aa5baec3744e9b2b8"
+ integrity sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ==
+
+js-sdsl@^4.1.4:
+ version "4.4.2"
+ resolved "https://registry.yarnpkg.com/js-sdsl/-/js-sdsl-4.4.2.tgz#2e3c031b1f47d3aca8b775532e3ebb0818e7f847"
+ integrity sha512-dwXFwByc/ajSV6m5bcKAPwe4yDDF6D614pxmIi5odytzxRlwqF6nwoiCek80Ixc7Cvma5awClxrzFtxCQvcM8w==
+
+js-sha3@0.8.0, js-sha3@^0.8.0:
+ version "0.8.0"
+ resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.8.0.tgz#b9b7a5da73afad7dedd0f8c463954cbde6818840"
+ integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==
+
+js-yaml@3.x:
+ version "3.14.1"
+ resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537"
+ integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==
+ dependencies:
+ argparse "^1.0.7"
+ esprima "^4.0.0"
+
+js-yaml@4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602"
+ integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==
+ dependencies:
+ argparse "^2.0.1"
+
+json-schema-traverse@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2"
+ integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==
+
+jsonfile@^2.1.0:
+ version "2.4.0"
+ resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8"
+ integrity sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw==
+ optionalDependencies:
+ graceful-fs "^4.1.6"
+
+jsonfile@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb"
+ integrity sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==
+ optionalDependencies:
+ graceful-fs "^4.1.6"
+
+jsonfile@^6.0.1:
+ version "6.1.0"
+ resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae"
+ integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==
+ dependencies:
+ universalify "^2.0.0"
+ optionalDependencies:
+ graceful-fs "^4.1.6"
+
+jsonschema@^1.2.4:
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/jsonschema/-/jsonschema-1.4.1.tgz#cc4c3f0077fb4542982973d8a083b6b34f482dab"
+ integrity sha512-S6cATIPVv1z0IlxdN+zUk5EPjkGCdnhN4wVSBlvoUO1tOLJootbo9CquNJmbIh4yikWHiUedhRYrNPn1arpEmQ==
+
+keccak@^3.0.0, keccak@^3.0.2:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/keccak/-/keccak-3.0.4.tgz#edc09b89e633c0549da444432ecf062ffadee86d"
+ integrity sha512-3vKuW0jV8J3XNTzvfyicFR5qvxrSAGl7KIhvgOu5cmWwM7tZRj3fMbj/pfIf4be7aznbc+prBWGjywox/g2Y6Q==
+ dependencies:
+ node-addon-api "^2.0.0"
+ node-gyp-build "^4.2.0"
+ readable-stream "^3.6.0"
+
+kind-of@^6.0.2:
+ version "6.0.3"
+ resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd"
+ integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==
+
+klaw@^1.0.0:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/klaw/-/klaw-1.3.1.tgz#4088433b46b3b1ba259d78785d8e96f73ba02439"
+ integrity sha512-TED5xi9gGQjGpNnvRWknrwAB1eL5GciPfVFOt3Vk1OJCVDQbzuSfrF3hkUQKlsgKrG1F+0t5W0m+Fje1jIt8rw==
+ optionalDependencies:
+ graceful-fs "^4.1.9"
+
+level-supports@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/level-supports/-/level-supports-4.0.1.tgz#431546f9d81f10ff0fea0e74533a0e875c08c66a"
+ integrity sha512-PbXpve8rKeNcZ9C1mUicC9auIYFyGpkV9/i6g76tLgANwWhtG2v7I4xNBUlkn3lE2/dZF3Pi0ygYGtLc4RXXdA==
+
+level-transcoder@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/level-transcoder/-/level-transcoder-1.0.1.tgz#f8cef5990c4f1283d4c86d949e73631b0bc8ba9c"
+ integrity sha512-t7bFwFtsQeD8cl8NIoQ2iwxA0CL/9IFw7/9gAjOonH0PWTTiRfY7Hq+Ejbsxh86tXobDQ6IOiddjNYIfOBs06w==
+ dependencies:
+ buffer "^6.0.3"
+ module-error "^1.0.1"
+
+level@^8.0.0:
+ version "8.0.0"
+ resolved "https://registry.yarnpkg.com/level/-/level-8.0.0.tgz#41b4c515dabe28212a3e881b61c161ffead14394"
+ integrity sha512-ypf0jjAk2BWI33yzEaaotpq7fkOPALKAgDBxggO6Q9HGX2MRXn0wbP1Jn/tJv1gtL867+YOjOB49WaUF3UoJNQ==
+ dependencies:
+ browser-level "^1.0.1"
+ classic-level "^1.2.0"
+
+levn@~0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee"
+ integrity sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==
+ dependencies:
+ prelude-ls "~1.1.2"
+ type-check "~0.3.2"
+
+locate-path@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e"
+ integrity sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==
+ dependencies:
+ p-locate "^2.0.0"
+ path-exists "^3.0.0"
+
+locate-path@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286"
+ integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==
+ dependencies:
+ p-locate "^5.0.0"
+
+lodash.camelcase@^4.3.0:
+ version "4.3.0"
+ resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6"
+ integrity sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==
+
+lodash.clonedeep@^4.5.0:
+ version "4.5.0"
+ resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef"
+ integrity sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==
+
+lodash.isequal@^4.5.0:
+ version "4.5.0"
+ resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0"
+ integrity sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==
+
+lodash.truncate@^4.4.2:
+ version "4.4.2"
+ resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193"
+ integrity sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==
+
+lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.21:
+ version "4.17.21"
+ resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
+ integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
+
+log-symbols@4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503"
+ integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==
+ dependencies:
+ chalk "^4.1.0"
+ is-unicode-supported "^0.1.0"
+
+loupe@^2.3.6:
+ version "2.3.6"
+ resolved "https://registry.yarnpkg.com/loupe/-/loupe-2.3.6.tgz#76e4af498103c532d1ecc9be102036a21f787b53"
+ integrity sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==
+ dependencies:
+ get-func-name "^2.0.0"
+
+lru-cache@^5.1.1:
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920"
+ integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==
+ dependencies:
+ yallist "^3.0.2"
+
+lru-cache@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94"
+ integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==
+ dependencies:
+ yallist "^4.0.0"
+
+lru_map@^0.3.3:
+ version "0.3.3"
+ resolved "https://registry.yarnpkg.com/lru_map/-/lru_map-0.3.3.tgz#b5c8351b9464cbd750335a79650a0ec0e56118dd"
+ integrity sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ==
+
+make-error@^1.1.1:
+ version "1.3.6"
+ resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2"
+ integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==
+
+markdown-table@^1.1.3:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/markdown-table/-/markdown-table-1.1.3.tgz#9fcb69bcfdb8717bfd0398c6ec2d93036ef8de60"
+ integrity sha512-1RUZVgQlpJSPWYbFSpmudq5nHY1doEIv89gBtF0s4gW1GF2XorxcA/70M5vq7rLv0a6mhOUccRsqkwhwLCIQ2Q==
+
+match-all@^1.2.6:
+ version "1.2.6"
+ resolved "https://registry.yarnpkg.com/match-all/-/match-all-1.2.6.tgz#66d276ad6b49655551e63d3a6ee53e8be0566f8d"
+ integrity sha512-0EESkXiTkWzrQQntBu2uzKvLu6vVkUGz40nGPbSZuegcfE5UuSzNjLaIu76zJWuaT/2I3Z/8M06OlUOZLGwLlQ==
+
+mcl-wasm@^0.7.1:
+ version "0.7.9"
+ resolved "https://registry.yarnpkg.com/mcl-wasm/-/mcl-wasm-0.7.9.tgz#c1588ce90042a8700c3b60e40efb339fc07ab87f"
+ integrity sha512-iJIUcQWA88IJB/5L15GnJVnSQJmf/YaxxV6zRavv83HILHaJQb6y0iFyDMdDO0gN8X37tdxmAOrH/P8B6RB8sQ==
+
+md5.js@^1.3.4:
+ version "1.3.5"
+ resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f"
+ integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==
+ dependencies:
+ hash-base "^3.0.0"
+ inherits "^2.0.1"
+ safe-buffer "^5.1.2"
+
+memory-level@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/memory-level/-/memory-level-1.0.0.tgz#7323c3fd368f9af2f71c3cd76ba403a17ac41692"
+ integrity sha512-UXzwewuWeHBz5krr7EvehKcmLFNoXxGcvuYhC41tRnkrTbJohtS7kVn9akmgirtRygg+f7Yjsfi8Uu5SGSQ4Og==
+ dependencies:
+ abstract-level "^1.0.0"
+ functional-red-black-tree "^1.0.1"
+ module-error "^1.0.1"
+
+memorystream@^0.3.1:
+ version "0.3.1"
+ resolved "https://registry.yarnpkg.com/memorystream/-/memorystream-0.3.1.tgz#86d7090b30ce455d63fbae12dda51a47ddcaf9b2"
+ integrity sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==
+
+merge2@^1.2.3, merge2@^1.3.0:
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae"
+ integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==
+
+micro-ftch@^0.3.1:
+ version "0.3.1"
+ resolved "https://registry.yarnpkg.com/micro-ftch/-/micro-ftch-0.3.1.tgz#6cb83388de4c1f279a034fb0cf96dfc050853c5f"
+ integrity sha512-/0LLxhzP0tfiR5hcQebtudP56gUurs2CLkGarnCiB/OqEyUFQ6U3paQi/tgLv0hBJYt2rnr9MNpxz4fiiugstg==
+
+micromatch@^4.0.4:
+ version "4.0.5"
+ resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6"
+ integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==
+ dependencies:
+ braces "^3.0.2"
+ picomatch "^2.3.1"
+
+mime-db@1.52.0:
+ version "1.52.0"
+ resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70"
+ integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==
+
+mime-types@^2.1.12:
+ version "2.1.35"
+ resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a"
+ integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==
+ dependencies:
+ mime-db "1.52.0"
+
+minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7"
+ integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==
+
+minimalistic-crypto-utils@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a"
+ integrity sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==
+
+"minimatch@2 || 3", minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1:
+ version "3.1.2"
+ resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b"
+ integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==
+ dependencies:
+ brace-expansion "^1.1.7"
+
+minimatch@5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.0.1.tgz#fb9022f7528125187c92bd9e9b6366be1cf3415b"
+ integrity sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==
+ dependencies:
+ brace-expansion "^2.0.1"
+
+minimist@^1.2.5, minimist@^1.2.6, minimist@^1.2.7:
+ version "1.2.8"
+ resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c"
+ integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==
+
+mkdirp@0.5.x:
+ version "0.5.6"
+ resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6"
+ integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==
+ dependencies:
+ minimist "^1.2.6"
+
+mkdirp@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e"
+ integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==
+
+mnemonist@^0.38.0:
+ version "0.38.5"
+ resolved "https://registry.yarnpkg.com/mnemonist/-/mnemonist-0.38.5.tgz#4adc7f4200491237fe0fa689ac0b86539685cade"
+ integrity sha512-bZTFT5rrPKtPJxj8KSV0WkPyNxl72vQepqqVUAW2ARUpUSF2qXMB6jZj7hW5/k7C1rtpzqbD/IIbJwLXUjCHeg==
+ dependencies:
+ obliterator "^2.0.0"
+
+mocha@^10.0.0, mocha@^10.2.0:
+ version "10.2.0"
+ resolved "https://registry.yarnpkg.com/mocha/-/mocha-10.2.0.tgz#1fd4a7c32ba5ac372e03a17eef435bd00e5c68b8"
+ integrity sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==
+ dependencies:
+ ansi-colors "4.1.1"
+ browser-stdout "1.3.1"
+ chokidar "3.5.3"
+ debug "4.3.4"
+ diff "5.0.0"
+ escape-string-regexp "4.0.0"
+ find-up "5.0.0"
+ glob "7.2.0"
+ he "1.2.0"
+ js-yaml "4.1.0"
+ log-symbols "4.1.0"
+ minimatch "5.0.1"
+ ms "2.1.3"
+ nanoid "3.3.3"
+ serialize-javascript "6.0.0"
+ strip-json-comments "3.1.1"
+ supports-color "8.1.1"
+ workerpool "6.2.1"
+ yargs "16.2.0"
+ yargs-parser "20.2.4"
+ yargs-unparser "2.0.0"
+
+module-error@^1.0.1, module-error@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/module-error/-/module-error-1.0.2.tgz#8d1a48897ca883f47a45816d4fb3e3c6ba404d86"
+ integrity sha512-0yuvsqSCv8LbaOKhnsQ/T5JhyFlCYLPXK3U2sgV10zoKQwzs/MyfuQUOZQ1V/6OCOJsK/TRgNVrPuPDqtdMFtA==
+
+ms@2.1.2:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
+ integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
+
+ms@2.1.3:
+ version "2.1.3"
+ resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2"
+ integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==
+
+murmur-128@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/murmur-128/-/murmur-128-0.2.1.tgz#a9f6568781d2350ecb1bf80c14968cadbeaa4b4d"
+ integrity sha512-WseEgiRkI6aMFBbj8Cg9yBj/y+OdipwVC7zUo3W2W1JAJITwouUOtpqsmGSg67EQmwwSyod7hsVsWY5LsrfQVg==
+ dependencies:
+ encode-utf8 "^1.0.2"
+ fmix "^0.1.0"
+ imul "^1.0.0"
+
+nanoid@3.3.3:
+ version "3.3.3"
+ resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.3.tgz#fd8e8b7aa761fe807dba2d1b98fb7241bb724a25"
+ integrity sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==
+
+napi-macros@^2.2.2:
+ version "2.2.2"
+ resolved "https://registry.yarnpkg.com/napi-macros/-/napi-macros-2.2.2.tgz#817fef20c3e0e40a963fbf7b37d1600bd0201044"
+ integrity sha512-hmEVtAGYzVQpCKdbQea4skABsdXW4RUh5t5mJ2zzqowJS2OyXZTU1KhDVFhx+NlWZ4ap9mqR9TcDO3LTTttd+g==
+
+neo-async@^2.6.2:
+ version "2.6.2"
+ resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f"
+ integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==
+
+node-addon-api@^2.0.0:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-2.0.2.tgz#432cfa82962ce494b132e9d72a15b29f71ff5d32"
+ integrity sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==
+
+node-emoji@^1.10.0:
+ version "1.11.0"
+ resolved "https://registry.yarnpkg.com/node-emoji/-/node-emoji-1.11.0.tgz#69a0150e6946e2f115e9d7ea4df7971e2628301c"
+ integrity sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==
+ dependencies:
+ lodash "^4.17.21"
+
+node-fetch@^2.6.0, node-fetch@^2.6.1:
+ version "2.7.0"
+ resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d"
+ integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==
+ dependencies:
+ whatwg-url "^5.0.0"
+
+node-gyp-build@^4.2.0, node-gyp-build@^4.3.0:
+ version "4.6.1"
+ resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.6.1.tgz#24b6d075e5e391b8d5539d98c7fc5c210cac8a3e"
+ integrity sha512-24vnklJmyRS8ViBNI8KbtK/r/DmXQMRiOMXTNz2nrTnAYUwjmEEbnnpB/+kt+yWRv73bPsSPRFddrcIbAxSiMQ==
+
+nofilter@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/nofilter/-/nofilter-3.1.0.tgz#c757ba68801d41ff930ba2ec55bab52ca184aa66"
+ integrity sha512-l2NNj07e9afPnhAhvgVrCD/oy2Ai1yfLpuo3EpiO1jFTsB4sFz6oIfAfSZyQzVpkZQ9xS8ZS5g1jCBgq4Hwo0g==
+
+nopt@3.x:
+ version "3.0.6"
+ resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9"
+ integrity sha512-4GUt3kSEYmk4ITxzB/b9vaIDfUVWN/Ml1Fwl11IlnIG2iaJ9O6WXZ9SrYM9NLI8OCBieN2Y8SWC2oJV0RQ7qYg==
+ dependencies:
+ abbrev "1"
+
+normalize-path@^3.0.0, normalize-path@~3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65"
+ integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==
+
+number-to-bn@1.7.0:
+ version "1.7.0"
+ resolved "https://registry.yarnpkg.com/number-to-bn/-/number-to-bn-1.7.0.tgz#bb3623592f7e5f9e0030b1977bd41a0c53fe1ea0"
+ integrity sha512-wsJ9gfSz1/s4ZsJN01lyonwuxA1tml6X1yBDnfpMglypcBRFZZkus26EdPSlqS5GJfYddVZa22p3VNb3z5m5Ig==
+ dependencies:
+ bn.js "4.11.6"
+ strip-hex-prefix "1.0.0"
+
+object-assign@^4.1.0:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
+ integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==
+
+object-inspect@^1.12.3, object-inspect@^1.9.0:
+ version "1.12.3"
+ resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.3.tgz#ba62dffd67ee256c8c086dfae69e016cd1f198b9"
+ integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==
+
+object-keys@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e"
+ integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==
+
+object.assign@^4.1.4:
+ version "4.1.4"
+ resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.4.tgz#9673c7c7c351ab8c4d0b516f4343ebf4dfb7799f"
+ integrity sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.1.4"
+ has-symbols "^1.0.3"
+ object-keys "^1.1.1"
+
+obliterator@^2.0.0:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/obliterator/-/obliterator-2.0.4.tgz#fa650e019b2d075d745e44f1effeb13a2adbe816"
+ integrity sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ==
+
+once@1.x, once@^1.3.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
+ integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==
+ dependencies:
+ wrappy "1"
+
+optionator@^0.8.1:
+ version "0.8.3"
+ resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495"
+ integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==
+ dependencies:
+ deep-is "~0.1.3"
+ fast-levenshtein "~2.0.6"
+ levn "~0.3.0"
+ prelude-ls "~1.1.2"
+ type-check "~0.3.2"
+ word-wrap "~1.2.3"
+
+ordinal@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/ordinal/-/ordinal-1.0.3.tgz#1a3c7726a61728112f50944ad7c35c06ae3a0d4d"
+ integrity sha512-cMddMgb2QElm8G7vdaa02jhUNbTSrhsgAGUz1OokD83uJTwSUn+nKoNoKVVaRa08yF6sgfO7Maou1+bgLd9rdQ==
+
+os-tmpdir@~1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274"
+ integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==
+
+p-limit@^1.1.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8"
+ integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==
+ dependencies:
+ p-try "^1.0.0"
+
+p-limit@^3.0.2:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b"
+ integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==
+ dependencies:
+ yocto-queue "^0.1.0"
+
+p-locate@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43"
+ integrity sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==
+ dependencies:
+ p-limit "^1.1.0"
+
+p-locate@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834"
+ integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==
+ dependencies:
+ p-limit "^3.0.2"
+
+p-map@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b"
+ integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==
+ dependencies:
+ aggregate-error "^3.0.0"
+
+p-try@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3"
+ integrity sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==
+
+parse-cache-control@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/parse-cache-control/-/parse-cache-control-1.0.1.tgz#8eeab3e54fa56920fe16ba38f77fa21aacc2d74e"
+ integrity sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==
+
+path-exists@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515"
+ integrity sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==
+
+path-exists@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3"
+ integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==
+
+path-is-absolute@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
+ integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==
+
+path-parse@^1.0.6, path-parse@^1.0.7:
+ version "1.0.7"
+ resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735"
+ integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==
+
+path-type@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b"
+ integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==
+
+pathval@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.1.tgz#8534e77a77ce7ac5a2512ea21e0fdb8fcf6c3d8d"
+ integrity sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==
+
+pbkdf2@^3.0.17:
+ version "3.1.2"
+ resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.2.tgz#dd822aa0887580e52f1a039dc3eda108efae3075"
+ integrity sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==
+ dependencies:
+ create-hash "^1.1.2"
+ create-hmac "^1.1.4"
+ ripemd160 "^2.0.1"
+ safe-buffer "^5.0.1"
+ sha.js "^2.4.8"
+
+picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1:
+ version "2.3.1"
+ resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42"
+ integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==
+
+pify@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231"
+ integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==
+
+prelude-ls@~1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54"
+ integrity sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==
+
+prettier@3.3.2:
+ version "3.3.2"
+ resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.3.2.tgz#03ff86dc7c835f2d2559ee76876a3914cec4a90a"
+ integrity sha512-rAVeHYMcv8ATV5d508CFdn+8/pHPpXeIid1DdrPwXnaAdH7cqjVbpJaT5eq4yRAFU/lsbwYwSF/n5iNrdJHPQA==
+
+prettier@^2.3.1:
+ version "2.8.8"
+ resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.8.tgz#e8c5d7e98a4305ffe3de2e1fc4aca1a71c28b1da"
+ integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==
+
+process-nextick-args@~2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2"
+ integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==
+
+promise@^8.0.0:
+ version "8.3.0"
+ resolved "https://registry.yarnpkg.com/promise/-/promise-8.3.0.tgz#8cb333d1edeb61ef23869fbb8a4ea0279ab60e0a"
+ integrity sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==
+ dependencies:
+ asap "~2.0.6"
+
+proper-lockfile@^4.1.1:
+ version "4.1.2"
+ resolved "https://registry.yarnpkg.com/proper-lockfile/-/proper-lockfile-4.1.2.tgz#c8b9de2af6b2f1601067f98e01ac66baa223141f"
+ integrity sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==
+ dependencies:
+ graceful-fs "^4.2.4"
+ retry "^0.12.0"
+ signal-exit "^3.0.2"
+
+proxy-from-env@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2"
+ integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==
+
+punycode@^2.1.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f"
+ integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==
+
+qs@^6.4.0, qs@^6.9.4:
+ version "6.11.2"
+ resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.2.tgz#64bea51f12c1f5da1bc01496f48ffcff7c69d7d9"
+ integrity sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==
+ dependencies:
+ side-channel "^1.0.4"
+
+queue-microtask@^1.2.2, queue-microtask@^1.2.3:
+ version "1.2.3"
+ resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243"
+ integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==
+
+randombytes@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a"
+ integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==
+ dependencies:
+ safe-buffer "^5.1.0"
+
+raw-body@^2.4.1:
+ version "2.5.2"
+ resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.2.tgz#99febd83b90e08975087e8f1f9419a149366b68a"
+ integrity sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==
+ dependencies:
+ bytes "3.1.2"
+ http-errors "2.0.0"
+ iconv-lite "0.4.24"
+ unpipe "1.0.0"
+
+readable-stream@^2.2.2:
+ version "2.3.8"
+ resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b"
+ integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==
+ dependencies:
+ core-util-is "~1.0.0"
+ inherits "~2.0.3"
+ isarray "~1.0.0"
+ process-nextick-args "~2.0.0"
+ safe-buffer "~5.1.1"
+ string_decoder "~1.1.1"
+ util-deprecate "~1.0.1"
+
+readable-stream@^3.6.0:
+ version "3.6.2"
+ resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967"
+ integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==
+ dependencies:
+ inherits "^2.0.3"
+ string_decoder "^1.1.1"
+ util-deprecate "^1.0.1"
+
+readdirp@~3.6.0:
+ version "3.6.0"
+ resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7"
+ integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==
+ dependencies:
+ picomatch "^2.2.1"
+
+rechoir@^0.6.2:
+ version "0.6.2"
+ resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384"
+ integrity sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==
+ dependencies:
+ resolve "^1.1.6"
+
+recursive-readdir@^2.2.2:
+ version "2.2.3"
+ resolved "https://registry.yarnpkg.com/recursive-readdir/-/recursive-readdir-2.2.3.tgz#e726f328c0d69153bcabd5c322d3195252379372"
+ integrity sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==
+ dependencies:
+ minimatch "^3.0.5"
+
+reduce-flatten@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/reduce-flatten/-/reduce-flatten-2.0.0.tgz#734fd84e65f375d7ca4465c69798c25c9d10ae27"
+ integrity sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w==
+
+regexp.prototype.flags@^1.5.1:
+ version "1.5.1"
+ resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz#90ce989138db209f81492edd734183ce99f9677e"
+ integrity sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.2.0"
+ set-function-name "^2.0.0"
+
+req-cwd@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/req-cwd/-/req-cwd-2.0.0.tgz#d4082b4d44598036640fb73ddea01ed53db49ebc"
+ integrity sha512-ueoIoLo1OfB6b05COxAA9UpeoscNpYyM+BqYlA7H6LVF4hKGPXQQSSaD2YmvDVJMkk4UDpAHIeU1zG53IqjvlQ==
+ dependencies:
+ req-from "^2.0.0"
+
+req-from@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/req-from/-/req-from-2.0.0.tgz#d74188e47f93796f4aa71df6ee35ae689f3e0e70"
+ integrity sha512-LzTfEVDVQHBRfjOUMgNBA+V6DWsSnoeKzf42J7l0xa/B4jyPOuuF5MlNSmomLNGemWTnV2TIdjSSLnEn95fOQA==
+ dependencies:
+ resolve-from "^3.0.0"
+
+require-directory@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42"
+ integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==
+
+require-from-string@^2.0.0, require-from-string@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909"
+ integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==
+
+resolve-from@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748"
+ integrity sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==
+
+resolve@1.1.x:
+ version "1.1.7"
+ resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b"
+ integrity sha512-9znBF0vBcaSN3W2j7wKvdERPwqTxSpCq+if5C0WoTCyV9n24rua28jeuQ2pL/HOf+yUe/Mef+H/5p60K0Id3bg==
+
+resolve@1.17.0:
+ version "1.17.0"
+ resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444"
+ integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==
+ dependencies:
+ path-parse "^1.0.6"
+
+resolve@^1.1.6:
+ version "1.22.6"
+ resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.6.tgz#dd209739eca3aef739c626fea1b4f3c506195362"
+ integrity sha512-njhxM7mV12JfufShqGy3Rz8j11RPdLy4xi15UurGJeoHLfJpVXKdh3ueuOqbYUcDZnffr6X739JBo5LzyahEsw==
+ dependencies:
+ is-core-module "^2.13.0"
+ path-parse "^1.0.7"
+ supports-preserve-symlinks-flag "^1.0.0"
+
+retry@0.13.1:
+ version "0.13.1"
+ resolved "https://registry.yarnpkg.com/retry/-/retry-0.13.1.tgz#185b1587acf67919d63b357349e03537b2484658"
+ integrity sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==
+
+retry@^0.12.0:
+ version "0.12.0"
+ resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b"
+ integrity sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==
+
+reusify@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76"
+ integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==
+
+rimraf@^2.2.8:
+ version "2.7.1"
+ resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec"
+ integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==
+ dependencies:
+ glob "^7.1.3"
+
+ripemd160@^2.0.0, ripemd160@^2.0.1:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c"
+ integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==
+ dependencies:
+ hash-base "^3.0.0"
+ inherits "^2.0.1"
+
+rlp@^2.2.3, rlp@^2.2.4:
+ version "2.2.7"
+ resolved "https://registry.yarnpkg.com/rlp/-/rlp-2.2.7.tgz#33f31c4afac81124ac4b283e2bd4d9720b30beaf"
+ integrity sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ==
+ dependencies:
+ bn.js "^5.2.0"
+
+run-parallel-limit@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/run-parallel-limit/-/run-parallel-limit-1.1.0.tgz#be80e936f5768623a38a963262d6bef8ff11e7ba"
+ integrity sha512-jJA7irRNM91jaKc3Hcl1npHsFLOXOoTkPCUL1JEa1R82O2miplXXRaGdjW/KM/98YQWDhJLiSs793CnXfblJUw==
+ dependencies:
+ queue-microtask "^1.2.2"
+
+run-parallel@^1.1.9:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee"
+ integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==
+ dependencies:
+ queue-microtask "^1.2.2"
+
+rustbn.js@~0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/rustbn.js/-/rustbn.js-0.2.0.tgz#8082cb886e707155fd1cb6f23bd591ab8d55d0ca"
+ integrity sha512-4VlvkRUuCJvr2J6Y0ImW7NvTCriMi7ErOAqWk1y69vAdoNIzCF3yPmgeNzx+RQTLEDFq5sHfscn1MwHxP9hNfA==
+
+safe-array-concat@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.0.1.tgz#91686a63ce3adbea14d61b14c99572a8ff84754c"
+ integrity sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==
+ dependencies:
+ call-bind "^1.0.2"
+ get-intrinsic "^1.2.1"
+ has-symbols "^1.0.3"
+ isarray "^2.0.5"
+
+safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0:
+ version "5.2.1"
+ resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6"
+ integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
+
+safe-buffer@~5.1.0, safe-buffer@~5.1.1:
+ version "5.1.2"
+ resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
+ integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==
+
+safe-regex-test@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.0.tgz#793b874d524eb3640d1873aad03596db2d4f2295"
+ integrity sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==
+ dependencies:
+ call-bind "^1.0.2"
+ get-intrinsic "^1.1.3"
+ is-regex "^1.1.4"
+
+"safer-buffer@>= 2.1.2 < 3":
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
+ integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
+
+sc-istanbul@^0.4.5:
+ version "0.4.6"
+ resolved "https://registry.yarnpkg.com/sc-istanbul/-/sc-istanbul-0.4.6.tgz#cf6784355ff2076f92d70d59047d71c13703e839"
+ integrity sha512-qJFF/8tW/zJsbyfh/iT/ZM5QNHE3CXxtLJbZsL+CzdJLBsPD7SedJZoUA4d8iAcN2IoMp/Dx80shOOd2x96X/g==
+ dependencies:
+ abbrev "1.0.x"
+ async "1.x"
+ escodegen "1.8.x"
+ esprima "2.7.x"
+ glob "^5.0.15"
+ handlebars "^4.0.1"
+ js-yaml "3.x"
+ mkdirp "0.5.x"
+ nopt "3.x"
+ once "1.x"
+ resolve "1.1.x"
+ supports-color "^3.1.0"
+ which "^1.1.1"
+ wordwrap "^1.0.0"
+
+scrypt-js@3.0.1, scrypt-js@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/scrypt-js/-/scrypt-js-3.0.1.tgz#d314a57c2aef69d1ad98a138a21fe9eafa9ee312"
+ integrity sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==
+
+secp256k1@^4.0.1:
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-4.0.3.tgz#c4559ecd1b8d3c1827ed2d1b94190d69ce267303"
+ integrity sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA==
+ dependencies:
+ elliptic "^6.5.4"
+ node-addon-api "^2.0.0"
+ node-gyp-build "^4.2.0"
+
+semver@^5.5.0:
+ version "5.7.2"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8"
+ integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==
+
+semver@^6.3.0:
+ version "6.3.1"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4"
+ integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==
+
+semver@^7.3.4:
+ version "7.5.4"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e"
+ integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==
+ dependencies:
+ lru-cache "^6.0.0"
+
+serialize-javascript@6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8"
+ integrity sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==
+ dependencies:
+ randombytes "^2.1.0"
+
+set-function-name@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.1.tgz#12ce38b7954310b9f61faa12701620a0c882793a"
+ integrity sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==
+ dependencies:
+ define-data-property "^1.0.1"
+ functions-have-names "^1.2.3"
+ has-property-descriptors "^1.0.0"
+
+setimmediate@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285"
+ integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==
+
+setprototypeof@1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424"
+ integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==
+
+sha.js@^2.4.0, sha.js@^2.4.8:
+ version "2.4.11"
+ resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7"
+ integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==
+ dependencies:
+ inherits "^2.0.1"
+ safe-buffer "^5.0.1"
+
+sha1@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/sha1/-/sha1-1.1.1.tgz#addaa7a93168f393f19eb2b15091618e2700f848"
+ integrity sha512-dZBS6OrMjtgVkopB1Gmo4RQCDKiZsqcpAQpkV/aaj+FCrCg8r4I4qMkDPQjBgLIxlmu9k4nUbWq6ohXahOneYA==
+ dependencies:
+ charenc ">= 0.0.1"
+ crypt ">= 0.0.1"
+
+shelljs@^0.8.3:
+ version "0.8.5"
+ resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.8.5.tgz#de055408d8361bed66c669d2f000538ced8ee20c"
+ integrity sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==
+ dependencies:
+ glob "^7.0.0"
+ interpret "^1.0.0"
+ rechoir "^0.6.2"
+
+side-channel@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf"
+ integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==
+ dependencies:
+ call-bind "^1.0.0"
+ get-intrinsic "^1.0.2"
+ object-inspect "^1.9.0"
+
+signal-exit@^3.0.2:
+ version "3.0.7"
+ resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9"
+ integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==
+
+slash@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634"
+ integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==
+
+slice-ansi@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b"
+ integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==
+ dependencies:
+ ansi-styles "^4.0.0"
+ astral-regex "^2.0.0"
+ is-fullwidth-code-point "^3.0.0"
+
+solc@0.7.3:
+ version "0.7.3"
+ resolved "https://registry.yarnpkg.com/solc/-/solc-0.7.3.tgz#04646961bd867a744f63d2b4e3c0701ffdc7d78a"
+ integrity sha512-GAsWNAjGzIDg7VxzP6mPjdurby3IkGCjQcM8GFYZT6RyaoUZKmMU6Y7YwG+tFGhv7dwZ8rmR4iwFDrrD99JwqA==
+ dependencies:
+ command-exists "^1.2.8"
+ commander "3.0.2"
+ follow-redirects "^1.12.1"
+ fs-extra "^0.30.0"
+ js-sha3 "0.8.0"
+ memorystream "^0.3.1"
+ require-from-string "^2.0.0"
+ semver "^5.5.0"
+ tmp "0.0.33"
+
+solidity-ast@^0.4.51:
+ version "0.4.52"
+ resolved "https://registry.yarnpkg.com/solidity-ast/-/solidity-ast-0.4.52.tgz#9f1a9abc7e5ba28bbf91146ecd07aec7e70f3c85"
+ integrity sha512-iOya9BSiB9jhM8Vf40n8lGELGzwrUc57rl5BhfNtJ5cvAaMvRcNlHeAMNvqJJyjoUnczqRbHqdivEqK89du3Cw==
+ dependencies:
+ array.prototype.findlast "^1.2.2"
+
+solidity-bytes-utils@^0.8.2:
+ version "0.8.2"
+ resolved "https://registry.yarnpkg.com/solidity-bytes-utils/-/solidity-bytes-utils-0.8.2.tgz#763d6a02fd093e93b3a97b742e97d540e66c29bd"
+ integrity sha512-cqXPYAV2auhpdKSTPuqji0CwpSceZDu95CzqSM/9tDJ2MoMaMsdHTpOIWtVw31BIqqGPNmIChCswzbw0tHaMTw==
+ dependencies:
+ ds-test "github:dapphub/ds-test"
+ forge-std "^1.1.2"
+
+solidity-coverage@^0.8.13:
+ version "0.8.13"
+ resolved "https://registry.yarnpkg.com/solidity-coverage/-/solidity-coverage-0.8.13.tgz#8eeada2e82ae19d25568368aa782a2baad0e0ce7"
+ integrity sha512-RiBoI+kF94V3Rv0+iwOj3HQVSqNzA9qm/qDP1ZDXK5IX0Cvho1qiz8hAXTsAo6KOIUeP73jfscq0KlLqVxzGWA==
+ dependencies:
+ "@ethersproject/abi" "^5.0.9"
+ "@solidity-parser/parser" "^0.18.0"
+ chalk "^2.4.2"
+ death "^1.1.0"
+ difflib "^0.2.4"
+ fs-extra "^8.1.0"
+ ghost-testrpc "^0.0.2"
+ global-modules "^2.0.0"
+ globby "^10.0.1"
+ jsonschema "^1.2.4"
+ lodash "^4.17.21"
+ mocha "^10.2.0"
+ node-emoji "^1.10.0"
+ pify "^4.0.1"
+ recursive-readdir "^2.2.2"
+ sc-istanbul "^0.4.5"
+ semver "^7.3.4"
+ shelljs "^0.8.3"
+ web3-utils "^1.3.6"
+
+source-map-support@^0.5.13:
+ version "0.5.21"
+ resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f"
+ integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==
+ dependencies:
+ buffer-from "^1.0.0"
+ source-map "^0.6.0"
+
+source-map@^0.6.0, source-map@^0.6.1:
+ version "0.6.1"
+ resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
+ integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
+
+source-map@~0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.2.0.tgz#dab73fbcfc2ba819b4de03bd6f6eaa48164b3f9d"
+ integrity sha512-CBdZ2oa/BHhS4xj5DlhjWNHcan57/5YuvfdLf17iVmIpd9KRm+DFLmC6nBNj+6Ua7Kt3TmOjDpQT1aTYOQtoUA==
+ dependencies:
+ amdefine ">=0.0.4"
+
+sprintf-js@~1.0.2:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c"
+ integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==
+
+stacktrace-parser@^0.1.10:
+ version "0.1.10"
+ resolved "https://registry.yarnpkg.com/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz#29fb0cae4e0d0b85155879402857a1639eb6051a"
+ integrity sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg==
+ dependencies:
+ type-fest "^0.7.1"
+
+statuses@2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63"
+ integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==
+
+string-format@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/string-format/-/string-format-2.0.0.tgz#f2df2e7097440d3b65de31b6d40d54c96eaffb9b"
+ integrity sha512-bbEs3scLeYNXLecRRuk6uJxdXUSj6le/8rNPHChIJTn2V79aXVTR1EH2OH5zLKKoz0V02fOUKZZcw01pLUShZA==
+
+string-width@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e"
+ integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==
+ dependencies:
+ is-fullwidth-code-point "^2.0.0"
+ strip-ansi "^4.0.0"
+
+string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3:
+ version "4.2.3"
+ resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010"
+ integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
+ dependencies:
+ emoji-regex "^8.0.0"
+ is-fullwidth-code-point "^3.0.0"
+ strip-ansi "^6.0.1"
+
+string.prototype.trim@^1.2.8:
+ version "1.2.8"
+ resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz#f9ac6f8af4bd55ddfa8895e6aea92a96395393bd"
+ integrity sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.2.0"
+ es-abstract "^1.22.1"
+
+string.prototype.trimend@^1.0.7:
+ version "1.0.7"
+ resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz#1bb3afc5008661d73e2dc015cd4853732d6c471e"
+ integrity sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.2.0"
+ es-abstract "^1.22.1"
+
+string.prototype.trimstart@^1.0.7:
+ version "1.0.7"
+ resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz#d4cdb44b83a4737ffbac2d406e405d43d0184298"
+ integrity sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.2.0"
+ es-abstract "^1.22.1"
+
+string_decoder@^1.1.1:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e"
+ integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==
+ dependencies:
+ safe-buffer "~5.2.0"
+
+string_decoder@~1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8"
+ integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==
+ dependencies:
+ safe-buffer "~5.1.0"
+
+strip-ansi@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f"
+ integrity sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==
+ dependencies:
+ ansi-regex "^3.0.0"
+
+strip-ansi@^6.0.0, strip-ansi@^6.0.1:
+ version "6.0.1"
+ resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
+ integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
+ dependencies:
+ ansi-regex "^5.0.1"
+
+strip-hex-prefix@1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz#0c5f155fef1151373377de9dbb588da05500e36f"
+ integrity sha512-q8d4ue7JGEiVcypji1bALTos+0pWtyGlivAWyPuTkHzuTCJqrK9sWxYQZUq6Nq3cuyv3bm734IhHvHtGGURU6A==
+ dependencies:
+ is-hex-prefixed "1.0.0"
+
+strip-json-comments@3.1.1:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006"
+ integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==
+
+supports-color@8.1.1:
+ version "8.1.1"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c"
+ integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==
+ dependencies:
+ has-flag "^4.0.0"
+
+supports-color@^3.1.0:
+ version "3.2.3"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6"
+ integrity sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==
+ dependencies:
+ has-flag "^1.0.0"
+
+supports-color@^5.3.0:
+ version "5.5.0"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f"
+ integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==
+ dependencies:
+ has-flag "^3.0.0"
+
+supports-color@^7.1.0:
+ version "7.2.0"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da"
+ integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==
+ dependencies:
+ has-flag "^4.0.0"
+
+supports-preserve-symlinks-flag@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09"
+ integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==
+
+sync-request@^6.0.0:
+ version "6.1.0"
+ resolved "https://registry.yarnpkg.com/sync-request/-/sync-request-6.1.0.tgz#e96217565b5e50bbffe179868ba75532fb597e68"
+ integrity sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw==
+ dependencies:
+ http-response-object "^3.0.1"
+ sync-rpc "^1.2.1"
+ then-request "^6.0.0"
+
+sync-rpc@^1.2.1:
+ version "1.3.6"
+ resolved "https://registry.yarnpkg.com/sync-rpc/-/sync-rpc-1.3.6.tgz#b2e8b2550a12ccbc71df8644810529deb68665a7"
+ integrity sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw==
+ dependencies:
+ get-port "^3.1.0"
+
+table-layout@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/table-layout/-/table-layout-1.0.2.tgz#c4038a1853b0136d63365a734b6931cf4fad4a04"
+ integrity sha512-qd/R7n5rQTRFi+Zf2sk5XVVd9UQl6ZkduPFC3S7WEGJAmetDTjY3qPN50eSKzwuzEyQKy5TN2TiZdkIjos2L6A==
+ dependencies:
+ array-back "^4.0.1"
+ deep-extend "~0.6.0"
+ typical "^5.2.0"
+ wordwrapjs "^4.0.0"
+
+table@^6.8.0:
+ version "6.8.1"
+ resolved "https://registry.yarnpkg.com/table/-/table-6.8.1.tgz#ea2b71359fe03b017a5fbc296204471158080bdf"
+ integrity sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==
+ dependencies:
+ ajv "^8.0.1"
+ lodash.truncate "^4.4.2"
+ slice-ansi "^4.0.0"
+ string-width "^4.2.3"
+ strip-ansi "^6.0.1"
+
+then-request@^6.0.0:
+ version "6.0.2"
+ resolved "https://registry.yarnpkg.com/then-request/-/then-request-6.0.2.tgz#ec18dd8b5ca43aaee5cb92f7e4c1630e950d4f0c"
+ integrity sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA==
+ dependencies:
+ "@types/concat-stream" "^1.6.0"
+ "@types/form-data" "0.0.33"
+ "@types/node" "^8.0.0"
+ "@types/qs" "^6.2.31"
+ caseless "~0.12.0"
+ concat-stream "^1.6.0"
+ form-data "^2.2.0"
+ http-basic "^8.1.1"
+ http-response-object "^3.0.1"
+ promise "^8.0.0"
+ qs "^6.4.0"
+
+tiny-invariant@^1.3.1:
+ version "1.3.3"
+ resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.3.3.tgz#46680b7a873a0d5d10005995eb90a70d74d60127"
+ integrity sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==
+
+tmp@0.0.33:
+ version "0.0.33"
+ resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9"
+ integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==
+ dependencies:
+ os-tmpdir "~1.0.2"
+
+to-regex-range@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4"
+ integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==
+ dependencies:
+ is-number "^7.0.0"
+
+toidentifier@1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35"
+ integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==
+
+tr46@~0.0.3:
+ version "0.0.3"
+ resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a"
+ integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==
+
+ts-command-line-args@^2.2.0:
+ version "2.5.1"
+ resolved "https://registry.yarnpkg.com/ts-command-line-args/-/ts-command-line-args-2.5.1.tgz#e64456b580d1d4f6d948824c274cf6fa5f45f7f0"
+ integrity sha512-H69ZwTw3rFHb5WYpQya40YAX2/w7Ut75uUECbgBIsLmM+BNuYnxsltfyyLMxy6sEeKxgijLTnQtLd0nKd6+IYw==
+ dependencies:
+ chalk "^4.1.0"
+ command-line-args "^5.1.1"
+ command-line-usage "^6.1.0"
+ string-format "^2.0.0"
+
+ts-essentials@^7.0.1:
+ version "7.0.3"
+ resolved "https://registry.yarnpkg.com/ts-essentials/-/ts-essentials-7.0.3.tgz#686fd155a02133eedcc5362dc8b5056cde3e5a38"
+ integrity sha512-8+gr5+lqO3G84KdiTSMRLtuyJ+nTBVRKuCrK4lidMPdVeEp0uqC875uE5NMcaA7YYMN7XsNiFQuMvasF8HT/xQ==
+
+ts-node@^10.9.1:
+ version "10.9.1"
+ resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.1.tgz#e73de9102958af9e1f0b168a6ff320e25adcff4b"
+ integrity sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==
+ dependencies:
+ "@cspotcode/source-map-support" "^0.8.0"
+ "@tsconfig/node10" "^1.0.7"
+ "@tsconfig/node12" "^1.0.7"
+ "@tsconfig/node14" "^1.0.0"
+ "@tsconfig/node16" "^1.0.2"
+ acorn "^8.4.1"
+ acorn-walk "^8.1.1"
+ arg "^4.1.0"
+ create-require "^1.1.0"
+ diff "^4.0.1"
+ make-error "^1.1.1"
+ v8-compile-cache-lib "^3.0.1"
+ yn "3.1.1"
+
+tslib@2.4.0:
+ version "2.4.0"
+ resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.0.tgz#7cecaa7f073ce680a05847aa77be941098f36dc3"
+ integrity sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==
+
+tslib@^1.11.1, tslib@^1.9.3:
+ version "1.14.1"
+ resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00"
+ integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==
+
+tslib@^2.3.1, tslib@^2.5.0:
+ version "2.6.2"
+ resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae"
+ integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==
+
+tsort@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/tsort/-/tsort-0.0.1.tgz#e2280f5e817f8bf4275657fd0f9aebd44f5a2786"
+ integrity sha512-Tyrf5mxF8Ofs1tNoxA13lFeZ2Zrbd6cKbuH3V+MQ5sb6DtBj5FjrXVsRWT8YvNAQTqNoz66dz1WsbigI22aEnw==
+
+tweetnacl-util@^0.15.1:
+ version "0.15.1"
+ resolved "https://registry.yarnpkg.com/tweetnacl-util/-/tweetnacl-util-0.15.1.tgz#b80fcdb5c97bcc508be18c44a4be50f022eea00b"
+ integrity sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw==
+
+tweetnacl@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-1.0.3.tgz#ac0af71680458d8a6378d0d0d050ab1407d35596"
+ integrity sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==
+
+type-check@~0.3.2:
+ version "0.3.2"
+ resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72"
+ integrity sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==
+ dependencies:
+ prelude-ls "~1.1.2"
+
+type-detect@^4.0.0, type-detect@^4.0.8:
+ version "4.0.8"
+ resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c"
+ integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==
+
+type-fest@^0.21.3:
+ version "0.21.3"
+ resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37"
+ integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==
+
+type-fest@^0.7.1:
+ version "0.7.1"
+ resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.7.1.tgz#8dda65feaf03ed78f0a3f9678f1869147f7c5c48"
+ integrity sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==
+
+typechain@^8.3.2:
+ version "8.3.2"
+ resolved "https://registry.yarnpkg.com/typechain/-/typechain-8.3.2.tgz#1090dd8d9c57b6ef2aed3640a516bdbf01b00d73"
+ integrity sha512-x/sQYr5w9K7yv3es7jo4KTX05CLxOf7TRWwoHlrjRh8H82G64g+k7VuWPJlgMo6qrjfCulOdfBjiaDtmhFYD/Q==
+ dependencies:
+ "@types/prettier" "^2.1.1"
+ debug "^4.3.1"
+ fs-extra "^7.0.0"
+ glob "7.1.7"
+ js-sha3 "^0.8.0"
+ lodash "^4.17.15"
+ mkdirp "^1.0.4"
+ prettier "^2.3.1"
+ ts-command-line-args "^2.2.0"
+ ts-essentials "^7.0.1"
+
+typed-array-buffer@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz#18de3e7ed7974b0a729d3feecb94338d1472cd60"
+ integrity sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==
+ dependencies:
+ call-bind "^1.0.2"
+ get-intrinsic "^1.2.1"
+ is-typed-array "^1.1.10"
+
+typed-array-byte-length@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz#d787a24a995711611fb2b87a4052799517b230d0"
+ integrity sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==
+ dependencies:
+ call-bind "^1.0.2"
+ for-each "^0.3.3"
+ has-proto "^1.0.1"
+ is-typed-array "^1.1.10"
+
+typed-array-byte-offset@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz#cbbe89b51fdef9cd6aaf07ad4707340abbc4ea0b"
+ integrity sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==
+ dependencies:
+ available-typed-arrays "^1.0.5"
+ call-bind "^1.0.2"
+ for-each "^0.3.3"
+ has-proto "^1.0.1"
+ is-typed-array "^1.1.10"
+
+typed-array-length@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.4.tgz#89d83785e5c4098bec72e08b319651f0eac9c1bb"
+ integrity sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==
+ dependencies:
+ call-bind "^1.0.2"
+ for-each "^0.3.3"
+ is-typed-array "^1.1.9"
+
+typedarray@^0.0.6:
+ version "0.0.6"
+ resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
+ integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==
+
+typescript@^5.2.2:
+ version "5.2.2"
+ resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.2.2.tgz#5ebb5e5a5b75f085f22bc3f8460fba308310fa78"
+ integrity sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==
+
+typical@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/typical/-/typical-4.0.0.tgz#cbeaff3b9d7ae1e2bbfaf5a4e6f11eccfde94fc4"
+ integrity sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==
+
+typical@^5.2.0:
+ version "5.2.0"
+ resolved "https://registry.yarnpkg.com/typical/-/typical-5.2.0.tgz#4daaac4f2b5315460804f0acf6cb69c52bb93066"
+ integrity sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==
+
+uglify-js@^3.1.4:
+ version "3.17.4"
+ resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.17.4.tgz#61678cf5fa3f5b7eb789bb345df29afb8257c22c"
+ integrity sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==
+
+unbox-primitive@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e"
+ integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==
+ dependencies:
+ call-bind "^1.0.2"
+ has-bigints "^1.0.2"
+ has-symbols "^1.0.3"
+ which-boxed-primitive "^1.0.2"
+
+undici-types@~5.26.4:
+ version "5.26.5"
+ resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617"
+ integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==
+
+undici@^5.14.0:
+ version "5.25.4"
+ resolved "https://registry.yarnpkg.com/undici/-/undici-5.25.4.tgz#7d8ef81d94f84cd384986271e5e5599b6dff4296"
+ integrity sha512-450yJxT29qKMf3aoudzFpIciqpx6Pji3hEWaXqXmanbXF58LTAGCKxcJjxMXWu3iG+Mudgo3ZUfDB6YDFd/dAw==
+ dependencies:
+ "@fastify/busboy" "^2.0.0"
+
+undici@^6.0.0:
+ version "6.10.1"
+ resolved "https://registry.yarnpkg.com/undici/-/undici-6.10.1.tgz#772d1c9d448a4c3ee10294e7328d64e9e821086a"
+ integrity sha512-kSzmWrOx3XBKTgPm4Tal8Hyl3yf+hzlA00SAf4goxv8LZYafKmS6gJD/7Fe5HH/DMNiFTRXvkwhLo7mUn5fuQQ==
+
+unfetch@^4.2.0:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/unfetch/-/unfetch-4.2.0.tgz#7e21b0ef7d363d8d9af0fb929a5555f6ef97a3be"
+ integrity sha512-F9p7yYCn6cIW9El1zi0HI6vqpeIvBsr3dSuRO6Xuppb1u5rXpCPmMvLSyECLhybr9isec8Ohl0hPekMVrEinDA==
+
+universalify@^0.1.0:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66"
+ integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==
+
+universalify@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717"
+ integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==
+
+unpipe@1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec"
+ integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==
+
+uri-js@^4.2.2:
+ version "4.4.1"
+ resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e"
+ integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==
+ dependencies:
+ punycode "^2.1.0"
+
+utf8@3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/utf8/-/utf8-3.0.0.tgz#f052eed1364d696e769ef058b183df88c87f69d1"
+ integrity sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ==
+
+util-deprecate@^1.0.1, util-deprecate@~1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
+ integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==
+
+uuid@^8.3.2:
+ version "8.3.2"
+ resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2"
+ integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==
+
+v8-compile-cache-lib@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf"
+ integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==
+
+web3-utils@^1.3.6:
+ version "1.10.2"
+ resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.10.2.tgz#361103d28a94d5e2a87ba15d776a62c33303eb44"
+ integrity sha512-TdApdzdse5YR+5GCX/b/vQnhhbj1KSAtfrDtRW7YS0kcWp1gkJsN62gw6GzCaNTeXookB7UrLtmDUuMv65qgow==
+ dependencies:
+ "@ethereumjs/util" "^8.1.0"
+ bn.js "^5.2.1"
+ ethereum-bloom-filters "^1.0.6"
+ ethereum-cryptography "^2.1.2"
+ ethjs-unit "0.1.6"
+ number-to-bn "1.7.0"
+ randombytes "^2.1.0"
+ utf8 "3.0.0"
+
+webidl-conversions@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871"
+ integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==
+
+whatwg-url@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d"
+ integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==
+ dependencies:
+ tr46 "~0.0.3"
+ webidl-conversions "^3.0.0"
+
+which-boxed-primitive@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6"
+ integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==
+ dependencies:
+ is-bigint "^1.0.1"
+ is-boolean-object "^1.1.0"
+ is-number-object "^1.0.4"
+ is-string "^1.0.5"
+ is-symbol "^1.0.3"
+
+which-typed-array@^1.1.11:
+ version "1.1.11"
+ resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.11.tgz#99d691f23c72aab6768680805a271b69761ed61a"
+ integrity sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==
+ dependencies:
+ available-typed-arrays "^1.0.5"
+ call-bind "^1.0.2"
+ for-each "^0.3.3"
+ gopd "^1.0.1"
+ has-tostringtag "^1.0.0"
+
+which@^1.1.1, which@^1.3.1:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a"
+ integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==
+ dependencies:
+ isexe "^2.0.0"
+
+word-wrap@~1.2.3:
+ version "1.2.5"
+ resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34"
+ integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==
+
+wordwrap@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb"
+ integrity sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==
+
+wordwrapjs@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/wordwrapjs/-/wordwrapjs-4.0.1.tgz#d9790bccfb110a0fc7836b5ebce0937b37a8b98f"
+ integrity sha512-kKlNACbvHrkpIw6oPeYDSmdCTu2hdMHoyXLTcUKala++lx5Y+wjJ/e474Jqv5abnVmwxw08DiTuHmw69lJGksA==
+ dependencies:
+ reduce-flatten "^2.0.0"
+ typical "^5.2.0"
+
+workerpool@6.2.1:
+ version "6.2.1"
+ resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.2.1.tgz#46fc150c17d826b86a008e5a4508656777e9c343"
+ integrity sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==
+
+wrap-ansi@^7.0.0:
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43"
+ integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==
+ dependencies:
+ ansi-styles "^4.0.0"
+ string-width "^4.1.0"
+ strip-ansi "^6.0.0"
+
+wrappy@1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
+ integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==
+
+ws@7.4.6:
+ version "7.4.6"
+ resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.6.tgz#5654ca8ecdeee47c33a9a4bf6d28e2be2980377c"
+ integrity sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==
+
+ws@8.5.0:
+ version "8.5.0"
+ resolved "https://registry.yarnpkg.com/ws/-/ws-8.5.0.tgz#bfb4be96600757fe5382de12c670dab984a1ed4f"
+ integrity sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==
+
+ws@^7.4.6:
+ version "7.5.9"
+ resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591"
+ integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==
+
+y18n@^5.0.5:
+ version "5.0.8"
+ resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55"
+ integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==
+
+yallist@^3.0.2:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd"
+ integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==
+
+yallist@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72"
+ integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==
+
+yargs-parser@20.2.4:
+ version "20.2.4"
+ resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54"
+ integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==
+
+yargs-parser@^20.2.2:
+ version "20.2.9"
+ resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee"
+ integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==
+
+yargs-unparser@2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz#f131f9226911ae5d9ad38c432fe809366c2325eb"
+ integrity sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==
+ dependencies:
+ camelcase "^6.0.0"
+ decamelize "^4.0.0"
+ flat "^5.0.2"
+ is-plain-obj "^2.1.0"
+
+yargs@16.2.0:
+ version "16.2.0"
+ resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66"
+ integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==
+ dependencies:
+ cliui "^7.0.2"
+ escalade "^3.1.1"
+ get-caller-file "^2.0.5"
+ require-directory "^2.1.1"
+ string-width "^4.2.0"
+ y18n "^5.0.5"
+ yargs-parser "^20.2.2"
+
+yn@3.1.1:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50"
+ integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==
+
+yocto-queue@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b"
+ integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==
+
+zksync-web3@^0.14.3:
+ version "0.14.3"
+ resolved "https://registry.yarnpkg.com/zksync-web3/-/zksync-web3-0.14.3.tgz#64ac2a16d597464c3fc4ae07447a8007631c57c9"
+ integrity sha512-hT72th4AnqyLW1d5Jlv8N2B/qhEnl2NePK2A3org7tAa24niem/UAaHMkEvmWI3SF9waYUPtqAtjpf+yvQ9zvQ==
diff --git a/projects/vaults/contracts/assets-handler/InceptionAssetsHandler.sol b/projects/vaults/contracts/assets-handler/InceptionAssetsHandler.sol
index 12cf7629..161b14bd 100644
--- a/projects/vaults/contracts/assets-handler/InceptionAssetsHandler.sol
+++ b/projects/vaults/contracts/assets-handler/InceptionAssetsHandler.sol
@@ -1,9 +1,9 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.24;
-import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol";
-import {ReentrancyGuardUpgradeable} from "@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol";
-import {PausableUpgradeable} from "@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol";
+import {Ownable2StepUpgradeable} from "@openzeppelin/contracts-upgradeable/access/Ownable2StepUpgradeable.sol";
+import {ReentrancyGuardUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol";
+import {PausableUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/PausableUpgradeable.sol";
import {SafeERC20, IERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
import {IInceptionAssetHandler} from "../interfaces/IInceptionAssetHandler.sol";
@@ -18,7 +18,7 @@ import {Convert} from "../lib/Convert.sol";
contract InceptionAssetsHandler is
PausableUpgradeable,
ReentrancyGuardUpgradeable,
- OwnableUpgradeable,
+ Ownable2StepUpgradeable,
IInceptionVaultErrors,
IInceptionAssetHandler
{
diff --git a/projects/vaults/contracts/assets-handler/InceptionERC20OmniAssetsHandler.sol b/projects/vaults/contracts/assets-handler/InceptionERC20OmniAssetsHandler.sol
new file mode 100644
index 00000000..3517aaac
--- /dev/null
+++ b/projects/vaults/contracts/assets-handler/InceptionERC20OmniAssetsHandler.sol
@@ -0,0 +1,70 @@
+// SPDX-License-Identifier: MIT
+pragma solidity ^0.8.20;
+
+import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol";
+import {ReentrancyGuardUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol";
+import {PausableUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/PausableUpgradeable.sol";
+import {SafeERC20, IERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
+
+import {IInceptionOmniVault} from "../interfaces/IInceptionOmniVault.sol";
+import {IInceptionAssetHandler} from "../interfaces/IInceptionAssetHandler.sol";
+
+/// @author The InceptionLRT team
+/// @title The InceptionERC20OmniAssetsHandler contract
+/// @dev Handles operations with the corresponding asset (erc20 base token)
+contract InceptionERC20OmniAssetsHandler is
+ PausableUpgradeable,
+ ReentrancyGuardUpgradeable,
+ OwnableUpgradeable,
+ IInceptionOmniVault,
+ IInceptionAssetHandler
+{
+ using SafeERC20 for IERC20;
+
+ IERC20 internal _asset;
+
+ uint256[50 - 1] private __reserver;
+
+ function __InceptionERC20OmniAssetsHandler_init(
+ IERC20 assetAddress
+ ) internal onlyInitializing {
+ __Pausable_init();
+ __ReentrancyGuard_init();
+
+ _asset = assetAddress;
+ }
+
+ /// @dev returns the address of the underlying token used for the vault for accounting, depositing, flash-withdrawing.
+ function asset() public view returns (address) {
+ return address(_asset);
+ }
+
+ /// @dev returns the balance of iVault in ETH
+ function totalAssets() public view override returns (uint256) {
+ return _asset.balanceOf(address(this));
+ }
+
+ function _transferAssetFrom(address staker, uint256 amount) internal {
+ if (!_asset.transferFrom(staker, address(this), amount))
+ revert TransferAssetFromFailed();
+ }
+
+ function _transferAssetTo(address receiver, uint256 amount) internal {
+ if (!_asset.transfer(receiver, amount)) revert TransferAssetFailed();
+ }
+
+ /// @dev The functions below serve the proper withdrawal and claiming operations
+ /// @notice Since ETH transfers do not lose wei on each transfer, these functions
+ /// simply return the provided amount
+ function _getAssetWithdrawAmount(
+ uint256 amount
+ ) internal view virtual returns (uint256) {
+ return amount;
+ }
+
+ function _getAssetReceivedAmount(
+ uint256 amount
+ ) internal view virtual returns (uint256) {
+ return amount;
+ }
+}
diff --git a/projects/vaults/contracts/assets-handler/InceptionOmniAssetsHandler.sol b/projects/vaults/contracts/assets-handler/InceptionOmniAssetsHandler.sol
new file mode 100644
index 00000000..ab8fc84d
--- /dev/null
+++ b/projects/vaults/contracts/assets-handler/InceptionOmniAssetsHandler.sol
@@ -0,0 +1,41 @@
+// SPDX-License-Identifier: MIT
+pragma solidity ^0.8.20;
+
+import {Ownable2StepUpgradeable} from "@openzeppelin/contracts-upgradeable/access/Ownable2StepUpgradeable.sol";
+import {ReentrancyGuardUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol";
+import {PausableUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/PausableUpgradeable.sol";
+
+import {IInceptionOmniVault} from "../interfaces/IInceptionOmniVault.sol";
+import {IInceptionAssetHandler} from "../interfaces/IInceptionAssetHandler.sol";
+
+/// @author The InceptionLRT team
+/// @title The InceptionOmniAssetsHandler contract
+/// @dev Handles operations with the corresponding asset (native ETH)
+contract InceptionOmniAssetsHandler is
+ PausableUpgradeable,
+ ReentrancyGuardUpgradeable,
+ Ownable2StepUpgradeable,
+ IInceptionOmniVault,
+ IInceptionAssetHandler
+{
+ uint256[50] private __gap;
+
+ function __InceptionOmniAssetsHandler_init() internal onlyInitializing {
+ __Pausable_init();
+ __ReentrancyGuard_init();
+ }
+
+ /// @dev returns the balance of iVault in ETH
+ function totalAssets() public view override returns (uint256) {
+ return address(this).balance;
+ }
+
+ function _transferAssetTo(address receiver, uint256 amount) internal {
+ (bool success, ) = receiver.call{value: amount}("");
+ if (!success) revert TransferAssetFailed();
+ }
+
+ receive() external payable {
+ // emit
+ }
+}
diff --git a/projects/vaults/contracts/interfaces/ICrossChainAdapter.sol b/projects/vaults/contracts/interfaces/ICrossChainAdapter.sol
new file mode 100644
index 00000000..79b678d4
--- /dev/null
+++ b/projects/vaults/contracts/interfaces/ICrossChainAdapter.sol
@@ -0,0 +1,15 @@
+// SPDX-License-Identifier: MIT
+pragma solidity ^0.8.20;
+
+interface ICrossChainAdapter {
+ event QuoteSuccess(uint256 indexed chainId);
+ event QuoteError(uint256 indexed chainId, string reason);
+ event QuoteErrorLowLevel(uint256 indexed chainId, bytes lowLevelError);
+
+ function receiveCrosschainEth(uint256 _chainId) external payable;
+
+ function handleCrossChainData(
+ uint256 _chainId,
+ bytes calldata _payload
+ ) external;
+}
diff --git a/projects/vaults/contracts/interfaces/ICrossChainAdapterL2.sol b/projects/vaults/contracts/interfaces/ICrossChainAdapterL2.sol
new file mode 100644
index 00000000..dec30710
--- /dev/null
+++ b/projects/vaults/contracts/interfaces/ICrossChainAdapterL2.sol
@@ -0,0 +1,16 @@
+// SPDX-License-Identifier: MIT
+pragma solidity 0.8.27;
+
+import {ICrossChainBridge} from "./ICrossChainBridge.sol";
+
+interface ICrossChainBridgeL2 is ICrossChainBridge {
+ function quote(
+ bytes calldata _payload,
+ bytes memory _options
+ ) external view returns (uint256);
+
+ function sendDataL1(
+ bytes calldata _payload,
+ bytes memory _options
+ ) external payable;
+}
diff --git a/projects/vaults/contracts/interfaces/ICrossChainBridge.sol b/projects/vaults/contracts/interfaces/ICrossChainBridge.sol
new file mode 100644
index 00000000..52d5c71c
--- /dev/null
+++ b/projects/vaults/contracts/interfaces/ICrossChainBridge.sol
@@ -0,0 +1,50 @@
+// SPDX-License-Identifier: MIT
+pragma solidity 0.8.27;
+
+interface ICrossChainBridge {
+ event TargetReceiverChanged(
+ address prevTargetReceiver,
+ address newTargetReceiver
+ );
+ event RecoverFundsInitiated(uint256 amount);
+ event ReceiveTriggered(address caller, uint256 amount);
+ event CrossChainEthDeposit(uint256 chainId, uint256 amount);
+ event ChainIdAdded(uint256 _chainId);
+ event CrossChainMessageReceived(
+ uint256 indexed chainId,
+ uint256 value,
+ bytes data
+ );
+ event CrossChainMessageSent(
+ uint256 indexed chainId,
+ uint256 value,
+ bytes data,
+ uint256 fee
+ );
+
+ error TargetReceiverNotSet();
+ error TransferToTargetReceiverFailed();
+ error SettingZeroAddress();
+ error NotTargetReceiver(address caller);
+ error ChainIdNotFound(uint256 chainId);
+
+ function setTargetReceiver(address _newTargetReceiver) external;
+
+ function recoverFunds() external;
+
+ function quoteSendEth(
+ uint256 _chainId,
+ bytes memory _options
+ ) external view returns (uint256);
+
+ function sendEthCrossChain(
+ uint256 _chainId,
+ bytes memory _options
+ ) external payable;
+
+ function getValueFromOpts(
+ bytes calldata _options
+ ) external view returns (uint256);
+
+ receive() external payable;
+}
diff --git a/projects/vaults/contracts/interfaces/IInceptionOmniVault.sol b/projects/vaults/contracts/interfaces/IInceptionOmniVault.sol
new file mode 100644
index 00000000..01182a81
--- /dev/null
+++ b/projects/vaults/contracts/interfaces/IInceptionOmniVault.sol
@@ -0,0 +1,131 @@
+// SPDX-License-Identifier: MIT
+pragma solidity ^0.8.20;
+
+interface IInceptionOmniVault {
+ /*///////////////////////////////////////////////////
+ / ******************** Errors ******************** /
+ /////////////////////////////////////////////////*/
+
+ error TransferAssetFromFailed();
+
+ error TransferAssetFailed();
+
+ error InsufficientCapacity(uint256 capacity);
+
+ error MessageToL1Failed(uint256 tokenAmount, uint256 ethAmount);
+ error EthToL1Failed(uint256 ethAmount);
+
+ error CrossChainAdapterNotSet();
+
+ error OnlyOwnerOrOperator();
+ error ResultISharesZero();
+ error RatioFeedNotSet();
+ error FreeBalanceIsZero();
+
+ error NullParams();
+
+ error ParameterExceedsLimits(uint256 param);
+
+ error NotContract();
+
+ error DepositInconsistentResultedState();
+
+ error OperatorNotRegistered();
+
+ error RestakerNotRegistered();
+
+ error ImplementationNotSet();
+
+ error OnlyOperatorAllowed();
+
+ error AlreadyDelegated();
+
+ error DelegationManagerImmutable();
+
+ error IsNotAbleToRedeem();
+
+ error LowerMinAmount(uint256 minAmount);
+
+ error ZeroFlashWithdrawFee();
+
+ /// TVL errors
+
+ error ExceedsMaxPerDeposit(uint256 max, uint256 amount);
+
+ error ExceedsMaxTotalDeposited(uint256 max, uint256 amount);
+
+ /*///////////////////////////////////////////////////
+ / ******************** Events ******************** /
+ /////////////////////////////////////////////////*/
+
+ event Deposit(
+ address indexed sender,
+ address indexed receiver,
+ uint256 amount,
+ uint256 iShares
+ );
+
+ event FlashWithdraw(
+ address indexed sender,
+ address indexed receiver,
+ address indexed owner,
+ uint256 amount,
+ uint256 iShares,
+ uint256 fee
+ );
+
+ event OperatorChanged(address prevValue, address newValue);
+
+ event DepositFeeChanged(uint256 prevValue, uint256 newValue);
+
+ event MinAmountChanged(uint256 prevValue, uint256 newValue);
+
+ event ProtocolFeeChanged(uint256 prevValue, uint256 newValue);
+
+ event TreasuryUpdated(
+ address indexed prevTreasury,
+ address indexed newTreasury
+ );
+
+ event RestakerDeployed(address indexed restaker);
+
+ event ImplementationUpgraded(address prevValue, address newValue);
+
+ event RatioFeedChanged(address prevValue, address newValue);
+
+ event NameChanged(string prevValue, string newValue);
+
+ event ReferralCode(address indexed sender, bytes32 indexed code);
+
+ event DepositBonus(uint256 amount);
+
+ event CrossChainAdapterChanged(
+ address prevCrossChainAdapter,
+ address newCrossChainAdapter
+ );
+
+ event MessageToL1Sent(
+ uint256 indexed tokensAmount,
+ uint256 indexed ethAmount
+ );
+
+ event EthCrossChainSent(uint256 callValue, uint256 indexed chainId);
+
+ event DepositBonusParamsChanged(
+ uint256 newMaxBonusRate,
+ uint256 newOptimalBonusRate,
+ uint256 newDepositUtilizationKink
+ );
+
+ event WithdrawFeeParamsChanged(
+ uint256 newMaxFlashFeeRate,
+ uint256 newOptimalWithdrawalRate,
+ uint256 newWithdrawUtilizationKink
+ );
+
+ event AssetsInfoSentToL1(uint256 tokensAmount, uint256 ethAmount);
+
+ event EthSentToL1(uint256 ethAmount);
+
+ event TargetCapacityChanged(uint256 prevValue, uint256 newValue);
+}
diff --git a/projects/vaults/contracts/interfaces/IInceptionRatioFeed.sol b/projects/vaults/contracts/interfaces/IInceptionRatioFeed.sol
index ad93950f..d57a8dbc 100644
--- a/projects/vaults/contracts/interfaces/IInceptionRatioFeed.sol
+++ b/projects/vaults/contracts/interfaces/IInceptionRatioFeed.sol
@@ -1,6 +1,43 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
+interface IInceptionRatioFeedErrors {
+ error OperatorUnauthorizedAccount(address account);
+
+ error InconsistentInputData();
+
+ error NullParams();
+
+ error RatioThresholdNotSet();
+
+ error NewRatioThresholdInvalid();
+
+ error IncorrectDay(uint256 day);
+
+ error IncorrectToken(address token);
+}
+
interface IInceptionRatioFeed {
+ event OperatorUpdated(address prevValue, address newValue);
+
+ event RatioUpdated(
+ address indexed tokenAddress,
+ uint256 prevValue,
+ uint256 newValue
+ );
+
+ event RatioNotUpdated(
+ address indexed tokenAddress,
+ uint256 failedRatio,
+ string reason
+ );
+
+ event RatioThresholdChanged(uint256 prevValue, uint256 newValue);
+
+ function updateRatioBatch(
+ address[] calldata addresses,
+ uint256[] calldata ratios
+ ) external;
+
function getRatioFor(address) external view returns (uint256);
}
diff --git a/projects/vaults/contracts/interfaces/IInceptionVault.sol b/projects/vaults/contracts/interfaces/IInceptionVault.sol
index dc2a4126..24dc37d7 100644
--- a/projects/vaults/contracts/interfaces/IInceptionVault.sol
+++ b/projects/vaults/contracts/interfaces/IInceptionVault.sol
@@ -74,6 +74,22 @@ interface IInceptionVault {
event ProtocolFeeChanged(uint256 prevValue, uint256 newValue);
+ event TreasuryUpdated(address indexed prevTreasury, address indexed newTreasury);
+ event MessageToL1Sent(
+ uint256 indexed tokensAmount,
+ uint256 indexed ethAmount
+ );
+ event EthToL1Sent(uint256 callValue);
+
+ error OnlyOwnerOrOperator();
+ error ResultISharesZero();
+ error RatioFeedNotSet();
+ error FreeBalanceIsZero();
+
+ error EthToL1Failed(uint256 amount);
+ error MessageToL1Failed(uint256 tokensAmount, uint256 ethAmount);
+ error CrossChainAdapterNotSet();
+
function inceptionToken() external view returns (IInceptionToken);
function ratio() external view returns (uint256);
diff --git a/projects/vaults/contracts/interfaces/IRebalanceStrategy.sol b/projects/vaults/contracts/interfaces/IRebalanceStrategy.sol
new file mode 100644
index 00000000..152ee3ab
--- /dev/null
+++ b/projects/vaults/contracts/interfaces/IRebalanceStrategy.sol
@@ -0,0 +1,6 @@
+// SPDX-License-Identifier: MIT
+pragma solidity ^0.8.20;
+
+interface IRebalanceStrategy {
+ function rebalance(bytes calldata data) external returns (bool);
+}
diff --git a/projects/vaults/contracts/lib/InternalInceptionLibrary.sol b/projects/vaults/contracts/lib/InternalInceptionLibrary.sol
new file mode 100644
index 00000000..2d8dd121
--- /dev/null
+++ b/projects/vaults/contracts/lib/InternalInceptionLibrary.sol
@@ -0,0 +1,93 @@
+// SPDX-License-Identifier: MIT
+pragma solidity ^0.8.24;
+
+/**
+ * @author The InceptionLRT team
+ * @title The InternalInceptionLibrary library
+ * @dev It serves two primary functions:
+ 1. Flash vault-related logic for the calculations of deposit bonus and withdrawal fee
+ 2. Conversions between shares and assets
+ */
+library InternalInceptionLibrary {
+ uint256 constant MAX_PERCENT = 100 * 1e8;
+
+ /************************************************************
+ ************************ Flash Vault ***********************
+ ************************************************************/
+
+ function calculateDepositBonus(
+ uint256 amount,
+ uint256 capacity,
+ uint256 optimalCapacity,
+ uint256 optimalBonusRate,
+ uint256 maxDepositBonusRate,
+ uint256 targetCapacity
+ ) internal pure returns (uint256 bonus) {
+ // uint256 optimalCapacity = (targetCapacity * depositUtilizationKink) /
+ // MAX_PERCENT;
+
+ if (amount > 0 && capacity < optimalCapacity) {
+ uint256 replenished = amount;
+ if (optimalCapacity < capacity + amount)
+ replenished = optimalCapacity - capacity;
+
+ uint256 bonusSlope = ((maxDepositBonusRate - optimalBonusRate) *
+ 1e18) / ((optimalCapacity * 1e18) / targetCapacity);
+ uint256 bonusPercent = maxDepositBonusRate -
+ (bonusSlope * (capacity + replenished / 2)) /
+ targetCapacity;
+
+ capacity += replenished;
+ bonus += (replenished * bonusPercent) / MAX_PERCENT;
+ amount -= replenished;
+ }
+ /// @dev the utilization rate is in the range [25: ] %
+ if (amount > 0 && capacity <= targetCapacity) {
+ uint256 replenished = targetCapacity > capacity + amount
+ ? amount
+ : targetCapacity - capacity;
+ bonus += (replenished * optimalBonusRate) / MAX_PERCENT;
+ }
+ }
+
+ function calculateWithdrawalFee(
+ uint256 amount,
+ uint256 capacity,
+ uint256 optimalCapacity,
+ uint256 optimaFeeRate,
+ uint256 maxFlashWithdrawalFeeRate,
+ uint256 targetCapacity
+ ) internal pure returns (uint256 fee) {
+ /// @dev the utilization rate is greater 1, [ :100] %
+ if (amount > 0 && capacity > targetCapacity) {
+ uint256 replenished = amount;
+ if (capacity - amount < targetCapacity)
+ replenished = capacity - targetCapacity;
+
+ amount -= replenished;
+ capacity -= replenished;
+ }
+
+ /// @dev the utilization rate is in the range [100:25] %
+ if (amount > 0 && capacity > optimalCapacity) {
+ uint256 replenished = amount;
+ if (capacity - amount < optimalCapacity)
+ replenished = capacity - optimalCapacity;
+
+ fee += (replenished * optimaFeeRate) / MAX_PERCENT; // 0.5%
+ amount -= replenished;
+ capacity -= replenished;
+ if (fee == 0) ++fee;
+ }
+ /// @dev the utilization rate is in the range [25:0] %
+ if (amount > 0) {
+ uint256 feeSlope = ((maxFlashWithdrawalFeeRate - optimaFeeRate) *
+ 1e18) / ((optimalCapacity * 1e18) / targetCapacity);
+ uint256 bonusPercent = maxFlashWithdrawalFeeRate -
+ (feeSlope * (capacity - amount / 2)) /
+ targetCapacity;
+ fee += (amount * bonusPercent) / MAX_PERCENT;
+ }
+ if (fee == 0) ++fee;
+ }
+}
diff --git a/projects/vaults/contracts/mock/MockCrossChainAdapterL2.sol b/projects/vaults/contracts/mock/MockCrossChainAdapterL2.sol
new file mode 100644
index 00000000..eda9f201
--- /dev/null
+++ b/projects/vaults/contracts/mock/MockCrossChainAdapterL2.sol
@@ -0,0 +1,41 @@
+// SPDX-License-Identifier: MIT
+pragma solidity ^0.8.20;
+
+/// @title MockCrossChainAdapterL2
+/// @notice A mock implementation of a cross-chain adapter for L2 to simulate sending assets or ETH to L1.
+contract MockCrossChainAdapterL2 {
+ /// @dev Event emitted when asset information is sent to L1
+ event AssetsInfoSentToL1(uint256 tokensAmount, uint256 ethAmount);
+
+ /// @dev Event emitted when ETH is sent to L1
+ event EthSentToL1(uint256 amount);
+
+ /// @notice Mock function to simulate sending assets info to L1
+ /// @param tokensAmount The amount of tokens to send info about
+ /// @param ethAmount The amount of ETH to send info about
+ /// @return success Returns true if the operation is successful
+ function sendAssetsInfoToL1(
+ uint256 tokensAmount,
+ uint256 ethAmount
+ ) external returns (bool success) {
+ // Simulate sending assets info to L1 by emitting an event
+ emit AssetsInfoSentToL1(tokensAmount, ethAmount);
+ return true;
+ }
+
+ /// @notice Mock function to simulate sending ETH to L1
+ /// @return success Returns true if the operation is successful
+ function sendEthToL1() external payable returns (bool success) {
+ require(msg.value > 0, "No ETH sent");
+ // Simulate sending ETH to L1 by emitting an event
+ emit EthSentToL1(msg.value);
+ return true;
+ }
+
+ /// @notice Mock function to simulate failures when sending ETH to L1
+ /// @dev Use this to test failure cases
+ function failSendEthToL1() external payable returns (bool success) {
+ require(msg.value > 0, "No ETH sent");
+ return false; // Simulate a failure
+ }
+}
diff --git a/projects/vaults/contracts/mock/MockERC20.sol b/projects/vaults/contracts/mock/MockERC20.sol
new file mode 100644
index 00000000..7327c660
--- /dev/null
+++ b/projects/vaults/contracts/mock/MockERC20.sol
@@ -0,0 +1,34 @@
+// SPDX-License-Identifier: MIT
+pragma solidity ^0.8.20;
+
+import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
+
+/// @title MockERC20 Token with mint and burn capabilities
+/// @notice This contract is a simple mock of an ERC-20 token for testing purposes
+contract MockERC20 is ERC20 {
+ /// @notice Constructor to initialize the token
+ /// @param name The name of the token
+ /// @param symbol The symbol of the token
+ /// @param initialSupply The initial supply of tokens to mint
+ constructor(
+ string memory name,
+ string memory symbol,
+ uint256 initialSupply
+ ) ERC20(name, symbol) {
+ _mint(msg.sender, initialSupply); // Mint initial supply to the deployer
+ }
+
+ /// @notice Function to mint tokens to a specified address
+ /// @param to The address that will receive the minted tokens
+ /// @param amount The amount of tokens to mint
+ function mint(address to, uint256 amount) external {
+ _mint(to, amount);
+ }
+
+ /// @notice Function to burn tokens from a specified address
+ /// @param from The address from which tokens will be burned
+ /// @param amount The amount of tokens to burn
+ function burn(address from, uint256 amount) external {
+ _burn(from, amount);
+ }
+}
diff --git a/projects/vaults/contracts/mock/MockRatioFeed.sol b/projects/vaults/contracts/mock/MockRatioFeed.sol
new file mode 100644
index 00000000..89def6fd
--- /dev/null
+++ b/projects/vaults/contracts/mock/MockRatioFeed.sol
@@ -0,0 +1,63 @@
+// SPDX-License-Identifier: MIT
+pragma solidity ^0.8.20;
+
+/**
+ * @title Mock of RatioFeed for testing
+ */
+contract MockRatioFeed {
+ uint256 public ratioThreshold;
+ mapping(address => uint256) private _mockRatios;
+ mapping(address => uint256) private _ratioUpdates;
+
+ event MockRatioUpdated(address token, uint256 oldRatio, uint256 newRatio);
+ event RatioThresholdUpdated(uint256 oldThreshold, uint256 newThreshold);
+
+ /**
+ * @notice Updates the ratio for a specific token (for testing purposes)
+ * @param token The address of the token to update the ratio for.
+ * @param newRatio The new ratio value to set.
+ */
+ function updateMockRatio(address token, uint256 newRatio) external {
+ uint256 oldRatio = _mockRatios[token];
+ _mockRatios[token] = newRatio;
+ _ratioUpdates[token] = block.timestamp;
+
+ emit MockRatioUpdated(token, oldRatio, newRatio);
+ }
+
+ /**
+ * @notice Directly set the ratio threshold for testing.
+ * @param newThreshold The new threshold value to set.
+ */
+ function setMockRatioThreshold(uint256 newThreshold) external {
+ emit RatioThresholdUpdated(ratioThreshold, newThreshold);
+ ratioThreshold = newThreshold;
+ }
+
+ /**
+ * @notice Get the ratio for a token.
+ * @param token The address of the token to get the ratio for.
+ * @return The ratio of the token.
+ */
+ function getRatio(address token) external view returns (uint256) {
+ return _mockRatios[token];
+ }
+
+ /**
+ * @notice Get the ratio for a token (for compatibility with original interface).
+ * @param token The address of the token to get the ratio for.
+ * @return The ratio of the token.
+ */
+ function getRatioFor(address token) external view returns (uint256) {
+ return _mockRatios[token];
+ }
+
+ /**
+ * @notice Returns the last update time for the token's ratio (mocked value).
+ * @param token The address of the token to check.
+ * @return Last update timestamp of the ratio.
+ */
+ function getLastUpdate(address token) external view returns (uint256) {
+ return _ratioUpdates[token];
+ }
+}
diff --git a/projects/vaults/contracts/restaker/InceptionRestaker.sol b/projects/vaults/contracts/restaker/InceptionRestaker.sol
index 1af9bcba..ef8a3e14 100644
--- a/projects/vaults/contracts/restaker/InceptionRestaker.sol
+++ b/projects/vaults/contracts/restaker/InceptionRestaker.sol
@@ -1,9 +1,9 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
-import "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol";
-import "@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol";
-import "@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol";
+import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol";
+import {PausableUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/PausableUpgradeable.sol";
+import {ReentrancyGuardUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol";
import "@openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeable.sol";
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
@@ -55,7 +55,7 @@ contract InceptionRestaker is
) public initializer {
__Pausable_init();
__ReentrancyGuard_init();
- __Ownable_init();
+ __Ownable_init(msg.sender);
// Ensure compatibility with future versions of ERC165Upgradeable
__ERC165_init();
diff --git a/projects/vaults/contracts/tests/Eigen/BackingEigen.sol b/projects/vaults/contracts/tests/Eigen/BackingEigen.sol
index 57eee37f..0d6440fc 100644
--- a/projects/vaults/contracts/tests/Eigen/BackingEigen.sol
+++ b/projects/vaults/contracts/tests/Eigen/BackingEigen.sol
@@ -37,7 +37,7 @@ contract BackingEigen is OwnableUpgradeable, ERC20Upgradeable {
* @notice An initializer function that sets initial values for the contract's state variables.
*/
function initialize(address initialOwner) public initializer {
- __Ownable_init();
+ __Ownable_init(initialOwner);
__ERC20_init("Backing Eigen", "bEIGEN");
_transferOwnership(initialOwner);
@@ -105,24 +105,22 @@ contract BackingEigen is OwnableUpgradeable, ERC20Upgradeable {
}
/**
- * @notice Overrides the beforeTokenTransfer function to enforce transfer restrictions
+ * @notice Override the `_update` function to implement transfer restrictions.
* @param from the address tokens are being transferred from
* @param to the address tokens are being transferred to
- * @param amount the amount of tokens being transferred
+ * @param value the amount of tokens being transferred
*/
- function _beforeTokenTransfer(
+ function _update(
address from,
address to,
- uint256 amount
+ uint256 value
) internal override {
- // if transfer restrictions are enabled
if (block.timestamp <= transferRestrictionsDisabledAfter) {
- // if both from and to are not whitelisted
require(
allowedFrom[from] || allowedTo[to] || from == address(0),
- "BackingEigen._beforeTokenTransfer: from or to must be whitelisted"
+ "From or to must be whitelisted"
);
}
- super._beforeTokenTransfer(from, to, amount);
+ super._update(from, to, value);
}
}
diff --git a/projects/vaults/contracts/tests/Eigen/Eigen.sol b/projects/vaults/contracts/tests/Eigen/Eigen.sol
index 6f9a6db2..c8b575f5 100644
--- a/projects/vaults/contracts/tests/Eigen/Eigen.sol
+++ b/projects/vaults/contracts/tests/Eigen/Eigen.sol
@@ -49,7 +49,7 @@ contract Eigen is OwnableUpgradeable, ERC20Upgradeable {
uint256[] memory mintingAllowances,
uint256[] memory mintAllowedAfters
) public initializer {
- __Ownable_init();
+ __Ownable_init(initialOwner);
__ERC20_init("Eigen", "EIGEN");
_transferOwnership(initialOwner);
@@ -166,28 +166,30 @@ contract Eigen is OwnableUpgradeable, ERC20Upgradeable {
}
/**
- * @notice Overrides the beforeTokenTransfer function to enforce transfer restrictions
+ * @notice Updates the transfer of tokens to enforce transfer restrictions.
* @param from the address tokens are being transferred from
* @param to the address tokens are being transferred to
* @param amount the amount of tokens being transferred
*/
- function _beforeTokenTransfer(
+ function _update(
address from,
address to,
uint256 amount
) internal override {
- // if transfer restrictions are enabled
+ // If transfer restrictions are enabled
if (block.timestamp <= transferRestrictionsDisabledAfter) {
- // if both from and to are not whitelisted
+ // Check if both `from` and `to` are whitelisted or involve the contract address
require(
from == address(0) ||
from == address(this) ||
to == address(this) ||
allowedFrom[from] ||
allowedTo[to],
- "Eigen._beforeTokenTransfer: from or to must be whitelisted"
+ "Eigen._update: from or to must be whitelisted"
);
}
- super._beforeTokenTransfer(from, to, amount);
+
+ // Call the parent contract's `_update` logic for token transfer
+ super._update(from, to, amount);
}
}
diff --git a/projects/vaults/contracts/tokens/InceptionToken.sol b/projects/vaults/contracts/tokens/InceptionToken.sol
index 7ffa048a..5f078ce0 100644
--- a/projects/vaults/contracts/tokens/InceptionToken.sol
+++ b/projects/vaults/contracts/tokens/InceptionToken.sol
@@ -1,7 +1,7 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
-import "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol";
+import {ERC20Upgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol";
import "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol";
import "../interfaces/IInceptionToken.sol";
import "../interfaces/IInceptionVault.sol";
@@ -38,6 +38,11 @@ contract InceptionToken is
_;
}
+ modifier whenNotPausedTransfers() {
+ require(!paused(), "InceptionToken: token transfer while paused");
+ _;
+ }
+
/// @custom:oz-upgrades-unsafe-allow constructor
constructor() {
_disableInitializers();
@@ -47,17 +52,16 @@ contract InceptionToken is
string calldata name,
string calldata symbol
) public initializer {
- __Ownable_init();
+ __Ownable_init(msg.sender);
__ERC20_init_unchained(name, symbol);
}
- function _beforeTokenTransfer(
+ function _update(
address from,
address to,
- uint256 amount
- ) internal override {
- super._beforeTokenTransfer(from, to, amount);
- require(!paused(), "InceptionToken: token transfer while paused");
+ uint256 value
+ ) internal override whenNotPausedTransfers {
+ super._update(from, to, value);
}
function burn(address account, uint256 amount) external override onlyVault {
diff --git a/projects/vaults/contracts/vaults/InceptionBasicStrategyVault.sol b/projects/vaults/contracts/vaults/InceptionBasicStrategyVault.sol
index 6da55f34..59343f0f 100644
--- a/projects/vaults/contracts/vaults/InceptionBasicStrategyVault.sol
+++ b/projects/vaults/contracts/vaults/InceptionBasicStrategyVault.sol
@@ -1,7 +1,8 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.24;
-import {BeaconProxy, Address} from "@openzeppelin/contracts/proxy/beacon/BeaconProxy.sol";
+import {BeaconProxy} from "@openzeppelin/contracts/proxy/beacon/BeaconProxy.sol";
+import {Address} from "@openzeppelin/contracts/utils/Address.sol";
import {IOwnable} from "../interfaces/IOwnable.sol";
import {IInceptionVault} from "../interfaces/IInceptionVault.sol";
@@ -60,7 +61,7 @@ contract InceptionStrategyBaseVault is
IStrategy _assetStrategy,
IERC20 asset
) internal {
- __Ownable_init();
+ __Ownable_init(msg.sender);
__EigenLayerHandler_init(_strategyManager, _assetStrategy, asset);
name = vaultName;
@@ -376,7 +377,12 @@ contract InceptionStrategyBaseVault is
function upgradeTo(
address newImplementation
) external whenNotPaused onlyOwner {
- if (!Address.isContract(newImplementation)) revert NotContract();
+ // Check if the address is a contract
+ uint256 size;
+ assembly {
+ size := extcodesize(newImplementation)
+ }
+ if (size == 0) revert NotContract();
emit ImplementationUpgraded(_stakerImplementation, newImplementation);
_stakerImplementation = newImplementation;
diff --git a/projects/vaults/contracts/vaults/InceptionERC20OmniVault.sol b/projects/vaults/contracts/vaults/InceptionERC20OmniVault.sol
new file mode 100644
index 00000000..c969dc3c
--- /dev/null
+++ b/projects/vaults/contracts/vaults/InceptionERC20OmniVault.sol
@@ -0,0 +1,388 @@
+// SPDX-License-Identifier: MIT
+pragma solidity ^0.8.20;
+
+import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
+
+import {InceptionERC20OmniAssetsHandler} from "../assets-handler/InceptionERC20OmniAssetsHandler.sol";
+
+import {IInceptionVault} from "../interfaces/IInceptionVault.sol";
+import {IInceptionToken} from "../interfaces/IInceptionToken.sol";
+import {IInceptionRatioFeed} from "../interfaces/IInceptionRatioFeed.sol";
+import {ICrossChainBridgeL2} from "../interfaces/ICrossChainAdapterL2.sol";
+
+import {InternalInceptionLibrary} from "../lib/InternalInceptionLibrary.sol";
+import {Convert} from "../lib/Convert.sol";
+
+/// @author The InceptionLRT team
+/// @title InceptionERC20OmniVault
+/// @dev A vault that handles deposits, withdrawals, and cross-chain operations for the Inception protocol.
+/// @notice Allows users to deposit an asset(e.g. stETH), receive inception tokens, and handle asset transfers between L1 and L2.
+contract InceptionERC20OmniVault is InceptionERC20OmniAssetsHandler {
+ /// @dev Inception restaking token
+ IInceptionToken public inceptionToken;
+
+ /// @dev Reduces rounding issues
+ uint256 public minAmount;
+
+ /// @dev the unique InceptionVault name
+ string public name;
+
+ address public operator;
+
+ IInceptionRatioFeed public ratioFeed;
+
+ ICrossChainBridgeL2 public crossChainAdapter;
+
+ /**
+ * @dev Flash withdrawal params
+ */
+
+ uint256 public depositBonusAmount;
+
+ uint256 public targetCapacity;
+
+ uint256 public constant MAX_TARGET_PERCENT = 100 * 1e18;
+ uint256 public constant MAX_PERCENT = 100 * 1e8;
+
+ address public treasuryAddress;
+ uint64 public protocolFee;
+
+ /// @dev deposit bonus
+ uint64 public maxBonusRate;
+ uint64 public optimalBonusRate;
+ uint64 public depositUtilizationKink;
+
+ /// @dev flash withdrawal fee
+ uint64 public maxFlashFeeRate;
+ uint64 public optimalWithdrawalRate;
+ uint64 public withdrawUtilizationKink;
+
+ function __InceptionERC20OmniVault_init(
+ string memory vaultName,
+ IInceptionToken _inceptionToken,
+ IERC20 wrappedAsset
+ ) internal {
+ __Ownable_init(msg.sender);
+ __InceptionERC20OmniAssetsHandler_init(wrappedAsset);
+
+ name = vaultName;
+ inceptionToken = _inceptionToken;
+ /// TODO
+ treasuryAddress = msg.sender;
+ minAmount = 1e8;
+
+ targetCapacity = 1;
+ protocolFee = 50 * 1e8;
+
+ /// @dev deposit bonus
+ depositUtilizationKink = 25 * 1e8;
+ maxBonusRate = 1.5 * 1e8;
+ optimalBonusRate = 0.25 * 1e8;
+
+ /// @dev withdrawal fee
+ withdrawUtilizationKink = 25 * 1e8;
+ maxFlashFeeRate = 3 * 1e8;
+ optimalWithdrawalRate = 0.5 * 1e8;
+ }
+
+ /*//////////////////////////////
+ ////// Deposit functions //////
+ ////////////////////////////*/
+
+ function __beforeDeposit(address receiver, uint256 amount) internal view {
+ if (receiver == address(0)) revert NullParams();
+ if (amount < minAmount) revert LowerMinAmount(minAmount);
+ }
+
+ function __afterDeposit(uint256 iShares) internal pure {
+ if (iShares == 0) revert DepositInconsistentResultedState();
+ }
+
+ /// @dev Transfers the msg.sender's assets to the vault.
+ /// @dev Mints Inception tokens in accordance with the current ratio.
+ /// @dev Issues the tokens to the specified receiver address.
+ function deposit(
+ uint256 amount,
+ address receiver
+ ) public nonReentrant whenNotPaused returns (uint256) {
+ return _deposit(amount, msg.sender, receiver);
+ }
+
+ /// @notice The deposit function but with a referral code
+ function depositWithReferral(
+ uint256 amount,
+ address receiver,
+ bytes32 code
+ ) external nonReentrant whenNotPaused returns (uint256) {
+ emit ReferralCode(msg.sender, code);
+ return _deposit(amount, msg.sender, receiver);
+ }
+
+ function _deposit(
+ uint256 amount,
+ address sender,
+ address receiver
+ ) internal returns (uint256) {
+ uint256 currentRatio = ratio();
+ // transfers assets from the sender and returns the received amount
+ // the actual received amount might slightly differ from the specified amount,
+ // approximately by -2 wei
+
+ __beforeDeposit(receiver, amount);
+ uint256 depositedBefore = totalAssets();
+ uint256 depositBonus;
+ if (depositBonusAmount > 0) {
+ depositBonus = calculateDepositBonus(amount);
+ if (depositBonus > depositBonusAmount) {
+ depositBonus = depositBonusAmount;
+ depositBonusAmount = 0;
+ } else {
+ depositBonusAmount -= depositBonus;
+ }
+ emit DepositBonus(depositBonus);
+ }
+
+ // get the amount from the sender
+ _transferAssetFrom(sender, amount);
+ amount = totalAssets() - depositedBefore;
+
+ uint256 iShares = Convert.multiplyAndDivideFloor(
+ amount + depositBonus,
+ currentRatio,
+ 1e18
+ );
+ inceptionToken.mint(receiver, iShares);
+ __afterDeposit(iShares);
+
+ emit Deposit(sender, receiver, amount, iShares);
+
+ return iShares;
+ }
+
+ /*///////////////////////////////////////
+ ///////// Withdrawal functions /////////
+ /////////////////////////////////////*/
+
+ function __beforeWithdraw(address receiver, uint256 iShares) internal pure {
+ if (iShares == 0) {
+ revert NullParams();
+ }
+ if (receiver == address(0)) {
+ revert NullParams();
+ }
+ }
+
+ /*/////////////////////////////////////////////
+ ///////// Flash Withdrawal functions /////////
+ ///////////////////////////////////////////*/
+
+ /// @dev Performs burning iToken from mgs.sender
+ /// @dev Creates a withdrawal requests based on the current ratio
+ /// @param iShares is measured in Inception token(shares)
+ function flashWithdraw(
+ uint256 iShares,
+ address receiver
+ ) external whenNotPaused nonReentrant {
+ __beforeWithdraw(receiver, iShares);
+
+ address claimer = msg.sender;
+ uint256 currentRatio = ratio();
+ uint256 amount = Convert.multiplyAndDivideFloor(
+ iShares,
+ 1e18,
+ currentRatio
+ );
+ uint256 capacity = getFlashCapacity();
+ if (amount < minAmount) revert LowerMinAmount(minAmount);
+ if (amount > capacity) revert InsufficientCapacity(capacity);
+
+ // burn Inception token in view of the current ratio
+ inceptionToken.burn(claimer, iShares);
+
+ uint256 fee = calculateFlashWithdrawFee(amount);
+ if (fee == 0) revert ZeroFlashWithdrawFee();
+ amount -= fee;
+ uint256 protocolWithdrawalFee = (fee * protocolFee) / MAX_PERCENT;
+ depositBonusAmount += (fee - protocolWithdrawalFee);
+
+ /// @notice instant transfer fee to the treasuryAddress
+ _transferAssetTo(treasuryAddress, protocolWithdrawalFee);
+ /// @notice instant transfer amount to the receiver
+ _transferAssetTo(receiver, amount);
+
+ emit FlashWithdraw(claimer, receiver, claimer, amount, iShares, fee);
+ }
+
+ /// @notice Function to calculate deposit bonus based on the utilization rate
+ function calculateDepositBonus(
+ uint256 amount
+ ) public view returns (uint256) {
+ return
+ InternalInceptionLibrary.calculateDepositBonus(
+ amount,
+ getFlashCapacity(),
+ (targetCapacity * depositUtilizationKink) / MAX_PERCENT,
+ optimalBonusRate,
+ maxBonusRate,
+ targetCapacity
+ );
+ }
+
+ /// @dev Function to calculate flash withdrawal fee based on the utilization rate
+ function calculateFlashWithdrawFee(
+ uint256 amount
+ ) public view returns (uint256) {
+ uint256 capacity = getFlashCapacity();
+ if (amount > capacity) revert InsufficientCapacity(capacity);
+
+ return
+ InternalInceptionLibrary.calculateWithdrawalFee(
+ amount,
+ capacity,
+ (targetCapacity * withdrawUtilizationKink) / MAX_PERCENT,
+ optimalWithdrawalRate,
+ maxFlashFeeRate,
+ targetCapacity
+ );
+ }
+
+ /*//////////////////////////////
+ ////// Factory functions //////
+ ////////////////////////////*/
+
+ function ratio() public view returns (uint256) {
+ return ratioFeed.getRatioFor(address(inceptionToken));
+ }
+
+ function getTotalDeposited() public view returns (uint256) {
+ return totalAssets() - depositBonusAmount;
+ }
+
+ function getFlashCapacity() public view returns (uint256 total) {
+ return totalAssets() - depositBonusAmount;
+ }
+
+ function _getTargetCapacity() internal view returns (uint256) {
+ return (targetCapacity * getTotalDeposited()) / MAX_TARGET_PERCENT;
+ }
+
+ /*//////////////////////////////
+ ////// Convert functions //////
+ ////////////////////////////*/
+
+ function convertToShares(
+ uint256 assets
+ ) public view returns (uint256 shares) {
+ return Convert.multiplyAndDivideFloor(assets, ratio(), 1e18);
+ }
+
+ function convertToAssets(
+ uint256 iShares
+ ) public view returns (uint256 assets) {
+ return Convert.multiplyAndDivideFloor(iShares, 1e18, ratio());
+ }
+
+ /*//////////////////////////
+ ////// SET functions //////
+ ////////////////////////*/
+
+ function setDepositBonusParams(
+ uint64 newMaxBonusRate,
+ uint64 newOptimalBonusRate,
+ uint64 newDepositUtilizationKink
+ ) external onlyOwner {
+ if (newMaxBonusRate > MAX_PERCENT)
+ revert ParameterExceedsLimits(newMaxBonusRate);
+ if (newOptimalBonusRate > MAX_PERCENT)
+ revert ParameterExceedsLimits(newOptimalBonusRate);
+ if (newDepositUtilizationKink > MAX_PERCENT)
+ revert ParameterExceedsLimits(newDepositUtilizationKink);
+
+ maxBonusRate = newMaxBonusRate;
+ optimalBonusRate = newOptimalBonusRate;
+ depositUtilizationKink = newDepositUtilizationKink;
+
+ emit DepositBonusParamsChanged(
+ newMaxBonusRate,
+ newOptimalBonusRate,
+ newDepositUtilizationKink
+ );
+ }
+
+ function setFlashWithdrawFeeParams(
+ uint64 newMaxFlashFeeRate,
+ uint64 newOptimalWithdrawalRate,
+ uint64 newWithdrawUtilizationKink
+ ) external onlyOwner {
+ if (newMaxFlashFeeRate > MAX_PERCENT)
+ revert ParameterExceedsLimits(newMaxFlashFeeRate);
+ if (newOptimalWithdrawalRate > MAX_PERCENT)
+ revert ParameterExceedsLimits(newOptimalWithdrawalRate);
+ if (newWithdrawUtilizationKink > MAX_PERCENT)
+ revert ParameterExceedsLimits(newWithdrawUtilizationKink);
+
+ maxFlashFeeRate = newMaxFlashFeeRate;
+ optimalWithdrawalRate = newOptimalWithdrawalRate;
+ withdrawUtilizationKink = newWithdrawUtilizationKink;
+
+ emit WithdrawFeeParamsChanged(
+ newMaxFlashFeeRate,
+ newOptimalWithdrawalRate,
+ newWithdrawUtilizationKink
+ );
+ }
+
+ function setProtocolFee(uint64 newProtocolFee) external onlyOwner {
+ if (newProtocolFee >= MAX_PERCENT)
+ revert ParameterExceedsLimits(newProtocolFee);
+
+ emit ProtocolFeeChanged(protocolFee, newProtocolFee);
+ protocolFee = newProtocolFee;
+ }
+
+ function setRatioFeed(IInceptionRatioFeed newRatioFeed) external onlyOwner {
+ if (address(newRatioFeed) == address(0)) revert NullParams();
+
+ emit RatioFeedChanged(address(ratioFeed), address(newRatioFeed));
+ ratioFeed = newRatioFeed;
+ }
+
+ function setMinAmount(uint256 newMinAmount) external onlyOwner {
+ emit MinAmountChanged(minAmount, newMinAmount);
+ minAmount = newMinAmount;
+ }
+
+ function setTreasuryAddress(address _newTreasury) external onlyOwner {
+ if (_newTreasury == address(0)) revert NullParams();
+
+ emit TreasuryUpdated(treasuryAddress, _newTreasury);
+ treasuryAddress = _newTreasury;
+ }
+
+ function setTargetFlashCapacity(
+ uint256 newTargetCapacity
+ ) external onlyOwner {
+ if (newTargetCapacity == 0) revert NullParams();
+ emit TargetCapacityChanged(targetCapacity, newTargetCapacity);
+ targetCapacity = newTargetCapacity;
+ }
+
+ function setName(string memory newVaultName) external onlyOwner {
+ if (bytes(newVaultName).length == 0) revert NullParams();
+
+ emit NameChanged(name, newVaultName);
+ name = newVaultName;
+ }
+
+ /*///////////////////////////////
+ ////// Pausable functions //////
+ /////////////////////////////*/
+
+ function pause() external onlyOwner {
+ _pause();
+ }
+
+ function unpause() external onlyOwner {
+ _unpause();
+ }
+}
diff --git a/projects/vaults/contracts/vaults/InceptionOmniVault.sol b/projects/vaults/contracts/vaults/InceptionOmniVault.sol
new file mode 100644
index 00000000..dec14c01
--- /dev/null
+++ b/projects/vaults/contracts/vaults/InceptionOmniVault.sol
@@ -0,0 +1,542 @@
+// SPDX-License-Identifier: MIT
+pragma solidity ^0.8.20;
+
+import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
+
+import {InceptionOmniAssetsHandler} from "../assets-handler/InceptionOmniAssetsHandler.sol";
+
+import {IOwnable} from "../interfaces/IOwnable.sol";
+import {IInceptionToken} from "../interfaces/IInceptionToken.sol";
+import {IInceptionRatioFeed} from "../interfaces/IInceptionRatioFeed.sol";
+import {ICrossChainBridgeL2} from "../interfaces/ICrossChainAdapterL2.sol";
+
+import {InternalInceptionLibrary} from "../lib/InternalInceptionLibrary.sol";
+import {Convert} from "../lib/Convert.sol";
+
+/// @author The InceptionLRT team
+/// @title InceptionOmniVault
+/// @dev A vault that handles deposits, withdrawals, and cross-chain operations for the Inception protocol.
+/// @notice Allows users to deposit ETH, receive inception tokens, and handle asset transfers between L1 and L2.
+contract InceptionOmniVault is InceptionOmniAssetsHandler {
+ /// @dev Inception token used for staking and rewards.
+ IInceptionToken public inceptionToken;
+
+ /// @dev Minimum amount required for deposits to avoid rounding issues.
+ uint256 public minAmount;
+
+ /// @dev Unique name for the vault.
+ string public name;
+
+ address public operator;
+
+ IInceptionRatioFeed public ratioFeed;
+
+ ICrossChainBridgeL2 public crossChainAdapter;
+
+ /**
+ * @dev Flash withdrawal params
+ */
+
+ uint256 public depositBonusAmount;
+
+ /// @dev measured in percentage, MAX_TARGET_PERCENT - 100%
+ uint256 public targetCapacity;
+
+ uint256 public constant MAX_TARGET_PERCENT = 100 * 1e18;
+ uint256 public constant MAX_PERCENT = 100 * 1e8;
+
+ address public treasury;
+ uint64 public protocolFee;
+
+ /// @dev deposit bonus
+ uint64 public maxBonusRate;
+ uint64 public optimalBonusRate;
+ uint64 public depositUtilizationKink;
+
+ /// @dev flash withdrawal fee
+ uint64 public maxFlashFeeRate;
+ uint64 public optimalWithdrawalRate;
+ uint64 public withdrawUtilizationKink;
+
+ /// @dev Modifier to restrict functions to owner or operator.
+ modifier onlyOwnerOrOperator() {
+ if (msg.sender != owner() && msg.sender != operator)
+ revert OnlyOwnerOrOperator();
+
+ _;
+ }
+
+ /**
+ * @dev Initializes the vault with required parameters.
+ * @param vaultName Name of the vault.
+ * @param _operator Address of the operator.
+ * @param _inceptionToken Address of the Inception token.
+ * @param _crossChainAdapter Address of the cross-chain adapter.
+ */
+ function __InceptionOmniVault_init(
+ string memory vaultName,
+ address _operator,
+ address _inceptionToken,
+ ICrossChainBridgeL2 _crossChainAdapter
+ ) public initializer {
+ __Ownable_init(msg.sender);
+ __InceptionOmniAssetsHandler_init();
+
+ if (_inceptionToken == address(0) || _operator == address(0))
+ revert NullParams();
+
+ name = vaultName;
+
+ operator = _operator;
+ treasury = msg.sender;
+
+ inceptionToken = IInceptionToken(_inceptionToken);
+ crossChainAdapter = _crossChainAdapter;
+
+ minAmount = 100;
+
+ targetCapacity = 1;
+
+ protocolFee = 50 * 1e8;
+
+ depositUtilizationKink = 25 * 1e8;
+ maxBonusRate = 1.5 * 1e8;
+ optimalBonusRate = 0.25 * 1e8;
+
+ withdrawUtilizationKink = 25 * 1e8;
+ maxFlashFeeRate = 3 * 1e8;
+ optimalWithdrawalRate = 0.5 * 1e8;
+ }
+
+ /*//////////////////////////////
+ ////// Deposit functions ////////
+ //////////////////////////////*/
+
+ /**
+ * @dev Ensures deposit parameters are valid.
+ * @param receiver Address receiving the deposit.
+ * @param amount Amount of assets to be deposited.
+ */
+ function __beforeDeposit(address receiver, uint256 amount) internal view {
+ if (receiver == address(0)) revert NullParams();
+ if (amount < minAmount) revert LowerMinAmount(minAmount);
+ }
+
+ /**
+ * @dev Ensures the calculated iShares is valid post-deposit.
+ * @param iShares Number of shares issued after the deposit.
+ */
+ function __afterDeposit(uint256 iShares) internal pure {
+ if (iShares == 0) revert DepositInconsistentResultedState();
+ }
+
+ /**
+ * @notice Deposits ETH and mints corresponding inception tokens.
+ * @param receiver Address receiving the inception tokens.
+ * @return iShares Number of shares issued in exchange for the deposit.
+ */
+ function deposit(
+ address receiver
+ ) external payable nonReentrant whenNotPaused returns (uint256) {
+ return _deposit(msg.value, msg.sender, receiver);
+ }
+
+ /// @notice The deposit function but with a referral code
+ function depositWithReferral(
+ address receiver,
+ bytes32 code
+ ) external payable nonReentrant whenNotPaused returns (uint256) {
+ emit ReferralCode(msg.sender, code);
+ return _deposit(msg.value, msg.sender, receiver);
+ }
+
+ /**
+ * @dev Internal function to handle the actual deposit logic.
+ * @param amount Amount of ETH deposited.
+ * @param sender Address initiating the deposit.
+ * @param receiver Address receiving the inception tokens.
+ * @return iShares Number of inception tokens minted.
+ */
+ function _deposit(
+ uint256 amount,
+ address sender,
+ address receiver
+ ) internal returns (uint256) {
+ uint256 currentRatio = ratio();
+ __beforeDeposit(receiver, amount);
+
+ uint256 depositBonus;
+ if (depositBonusAmount > 0) {
+ uint256 capacity = getFlashCapacity();
+ depositBonus = _calculateDepositBonus(amount, capacity - amount);
+ if (depositBonus > depositBonusAmount) {
+ depositBonus = depositBonusAmount;
+ depositBonusAmount = 0;
+ } else {
+ depositBonusAmount -= depositBonus;
+ }
+ emit DepositBonus(depositBonus);
+ }
+
+ uint256 iShares = Convert.multiplyAndDivideFloor(
+ amount + depositBonus,
+ currentRatio,
+ 1e18
+ );
+ inceptionToken.mint(receiver, iShares);
+ __afterDeposit(iShares);
+
+ emit Deposit(sender, receiver, amount, iShares);
+ return iShares;
+ }
+
+ /*/////////////////////////////////////////////
+ ///////// Flash Withdrawal functions /////////
+ ///////////////////////////////////////////*/
+
+ /**
+ * @dev Ensures withdrawal parameters are valid.
+ * @param receiver Address receiving the withdrawal.
+ * @param iShares Number of shares to be withdrawn.
+ */
+ function __beforeWithdraw(address receiver, uint256 iShares) internal pure {
+ if (iShares == 0) {
+ revert NullParams();
+ }
+ if (receiver == address(0)) {
+ revert NullParams();
+ }
+ }
+
+ /**
+ * @notice Handles flash withdrawals by burning inception tokens and transferring ETH.
+ * @param iShares Number of shares to withdraw.
+ * @param receiver Address receiving the withdrawn ETH.
+ */
+ function flashWithdraw(
+ uint256 iShares,
+ address receiver
+ ) external whenNotPaused nonReentrant {
+ __beforeWithdraw(receiver, iShares);
+
+ address claimer = msg.sender;
+ uint256 currentRatio = ratio();
+ uint256 amount = Convert.multiplyAndDivideFloor(
+ iShares,
+ 1e18,
+ currentRatio
+ );
+ uint256 capacity = getFlashCapacity();
+ if (amount < minAmount) revert LowerMinAmount(minAmount);
+ if (amount > capacity) revert InsufficientCapacity(capacity);
+
+ inceptionToken.burn(claimer, iShares);
+
+ uint256 fee = calculateFlashWithdrawFee(amount);
+ if (fee == 0) revert ZeroFlashWithdrawFee();
+ amount -= fee;
+ uint256 protocolWithdrawalFee = (fee * protocolFee) / MAX_PERCENT;
+ depositBonusAmount += (fee - protocolWithdrawalFee);
+
+ _transferAssetTo(treasury, protocolWithdrawalFee);
+ _transferAssetTo(receiver, amount);
+
+ emit FlashWithdraw(claimer, receiver, claimer, amount, iShares, fee);
+ }
+
+ /*//////////////////////////////
+ ////// Cross-chain functions ///
+ //////////////////////////////*/
+
+ /**
+ * @notice Sends asset information (total token and ETH balances) to Layer 1.
+ */
+ function sendAssetsInfoToL1(
+ bytes memory _options
+ ) external payable onlyOwnerOrOperator {
+ if (address(crossChainAdapter) == address(0))
+ revert CrossChainAdapterNotSet();
+
+ uint256 tokensAmount = _inceptionTokenSupply();
+ uint256 ethAmount = getFlashCapacity() - msg.value;
+ bytes memory payload = abi.encode(
+ block.timestamp,
+ tokensAmount,
+ ethAmount
+ );
+
+ crossChainAdapter.sendDataL1{value: msg.value}(payload, _options);
+
+ emit MessageToL1Sent(tokensAmount, ethAmount);
+ }
+
+ /**
+ * @notice Calculates price to send data message to Layer 1.
+ */
+ function quoteSendAssetsInfoToL1(
+ bytes memory _options
+ ) external view returns (uint256 fees) {
+ require(
+ address(crossChainAdapter) != address(0),
+ CrossChainAdapterNotSet()
+ );
+ uint256 tokensAmount = _inceptionTokenSupply();
+ uint256 ethAmount = getFlashCapacity();
+ bytes memory payload = abi.encode(
+ block.timestamp,
+ tokensAmount,
+ ethAmount
+ );
+
+ fees = crossChainAdapter.quote(payload, _options);
+ }
+
+ /**
+ * @notice Sends available ETH to another chain via cross-chain adapter.
+ * @dev msg.value is used to pay for the cross-chain fees
+ */
+ function sendEthCrossChain(
+ uint256 _chainId,
+ bytes memory _options
+ ) external payable onlyOwnerOrOperator {
+ uint256 freeBalance = getFreeBalance();
+ if (freeBalance == 0) revert FreeBalanceIsZero();
+
+ crossChainAdapter.sendEthCrossChain{value: freeBalance + msg.value}(
+ _chainId,
+ _options
+ );
+
+ emit EthCrossChainSent(freeBalance, _chainId);
+ }
+
+ /**
+ * @notice Calculates fees to send ETH to other chain. The `SEND_VALUE` encoded in options is not included in the return
+ * @param _chainId chain ID of the network to simulate sending ETH to
+ * @param _options encoded params for cross-chain message. Includes `SEND_VALUE` which is substracted from the end result
+ */
+ function quoteSendEthCrossChain(
+ uint256 _chainId,
+ bytes calldata _options
+ ) external view returns (uint256) {
+ require(
+ address(crossChainAdapter) != address(0),
+ CrossChainAdapterNotSet()
+ );
+ return
+ crossChainAdapter.quoteSendEth(_chainId, _options) -
+ crossChainAdapter.getValueFromOpts(_options);
+ }
+
+ /*//////////////////////////////
+ ////// Utility functions ///////
+ //////////////////////////////*/
+
+ /**
+ * @notice Calculates the bonus for a deposit based on the current utilization rate.
+ * @param amount Amount of the deposit.
+ * @return bonus Calculated bonus.
+ */
+ function calculateDepositBonus(
+ uint256 amount
+ ) public view returns (uint256) {
+ return _calculateDepositBonus(amount, getFlashCapacity());
+ }
+
+ function _calculateDepositBonus(
+ uint256 amount,
+ uint256 capacity
+ ) internal view returns (uint256 bonus) {
+ return
+ InternalInceptionLibrary.calculateDepositBonus(
+ amount,
+ capacity,
+ (targetCapacity * depositUtilizationKink) / MAX_PERCENT,
+ optimalBonusRate,
+ maxBonusRate,
+ targetCapacity
+ );
+ }
+
+ /**
+ * @notice Calculates the fee for a flash withdrawal based on the current utilization rate.
+ * @param amount Amount of the withdrawal.
+ * @return fee Calculated fee.
+ */
+ function calculateFlashWithdrawFee(
+ uint256 amount
+ ) public view returns (uint256 fee) {
+ uint256 capacity = getFlashCapacity();
+ if (amount > capacity) revert InsufficientCapacity(capacity);
+
+ return
+ InternalInceptionLibrary.calculateWithdrawalFee(
+ amount,
+ capacity,
+ (targetCapacity * withdrawUtilizationKink) / MAX_PERCENT,
+ optimalWithdrawalRate,
+ maxFlashFeeRate,
+ targetCapacity
+ );
+ }
+
+ /*//////////////////////////////
+ ////// Factory functions //////
+ ////////////////////////////*/
+
+ function ratio() public view returns (uint256) {
+ return ratioFeed.getRatioFor(address(inceptionToken));
+ }
+
+ function getFlashCapacity() public view returns (uint256) {
+ return totalAssets() - depositBonusAmount;
+ }
+
+ function getFreeBalance() public view returns (uint256) {
+ return
+ getFlashCapacity() < targetCapacity
+ ? 0
+ : getFlashCapacity() - targetCapacity;
+ }
+
+ function _inceptionTokenSupply() public view returns (uint256) {
+ return IERC20(address(inceptionToken)).totalSupply();
+ }
+
+ /*//////////////////////////////
+ ////// Convert functions //////
+ ////////////////////////////*/
+
+ function convertToShares(
+ uint256 assets
+ ) public view returns (uint256 shares) {
+ return Convert.multiplyAndDivideFloor(assets, ratio(), 1e18);
+ }
+
+ function convertToAssets(
+ uint256 iShares
+ ) public view returns (uint256 assets) {
+ return Convert.multiplyAndDivideFloor(iShares, 1e18, ratio());
+ }
+
+ /*//////////////////////////
+ ////// SET functions //////
+ ////////////////////////*/
+
+ function setDepositBonusParams(
+ uint64 newMaxBonusRate,
+ uint64 newOptimalBonusRate,
+ uint64 newDepositUtilizationKink
+ ) external onlyOwner {
+ if (newMaxBonusRate > MAX_PERCENT)
+ revert ParameterExceedsLimits(newMaxBonusRate);
+ if (newOptimalBonusRate > MAX_PERCENT)
+ revert ParameterExceedsLimits(newOptimalBonusRate);
+ if (newDepositUtilizationKink > MAX_PERCENT)
+ revert ParameterExceedsLimits(newDepositUtilizationKink);
+
+ maxBonusRate = newMaxBonusRate;
+ optimalBonusRate = newOptimalBonusRate;
+ depositUtilizationKink = newDepositUtilizationKink;
+
+ emit DepositBonusParamsChanged(
+ newMaxBonusRate,
+ newOptimalBonusRate,
+ newDepositUtilizationKink
+ );
+ }
+
+ function setFlashWithdrawFeeParams(
+ uint64 newMaxFlashFeeRate,
+ uint64 newOptimalWithdrawalRate,
+ uint64 newWithdrawUtilizationKink
+ ) external onlyOwner {
+ if (newMaxFlashFeeRate > MAX_PERCENT)
+ revert ParameterExceedsLimits(newMaxFlashFeeRate);
+ if (newOptimalWithdrawalRate > MAX_PERCENT)
+ revert ParameterExceedsLimits(newOptimalWithdrawalRate);
+ if (newWithdrawUtilizationKink > MAX_PERCENT)
+ revert ParameterExceedsLimits(newWithdrawUtilizationKink);
+
+ maxFlashFeeRate = newMaxFlashFeeRate;
+ optimalWithdrawalRate = newOptimalWithdrawalRate;
+ withdrawUtilizationKink = newWithdrawUtilizationKink;
+
+ emit WithdrawFeeParamsChanged(
+ newMaxFlashFeeRate,
+ newOptimalWithdrawalRate,
+ newWithdrawUtilizationKink
+ );
+ }
+
+ function setProtocolFee(uint64 newProtocolFee) external onlyOwner {
+ if (newProtocolFee >= MAX_PERCENT)
+ revert ParameterExceedsLimits(newProtocolFee);
+
+ emit ProtocolFeeChanged(protocolFee, newProtocolFee);
+ protocolFee = newProtocolFee;
+ }
+
+ function setRatioFeed(IInceptionRatioFeed newRatioFeed) external onlyOwner {
+ if (address(newRatioFeed) == address(0)) revert NullParams();
+
+ emit RatioFeedChanged(address(ratioFeed), address(newRatioFeed));
+ ratioFeed = newRatioFeed;
+ }
+
+ function setMinAmount(uint256 newMinAmount) external onlyOwner {
+ emit MinAmountChanged(minAmount, newMinAmount);
+ minAmount = newMinAmount;
+ }
+
+ function setTreasuryAddress(address newTreasury) external onlyOwner {
+ if (newTreasury == address(0)) revert NullParams();
+
+ emit TreasuryUpdated(treasury, newTreasury);
+ treasury = newTreasury;
+ }
+
+ function setCrossChainAdapter(
+ address payable _newCrossChainAdapter
+ ) external onlyOwner {
+ require(_newCrossChainAdapter != address(0), NullParams());
+ emit CrossChainAdapterChanged(
+ address(crossChainAdapter),
+ _newCrossChainAdapter
+ );
+ crossChainAdapter = ICrossChainBridgeL2(_newCrossChainAdapter);
+ }
+
+ function setTargetFlashCapacity(
+ uint256 newTargetCapacity
+ ) external onlyOwner {
+ if (newTargetCapacity == 0) revert NullParams();
+ emit TargetCapacityChanged(targetCapacity, newTargetCapacity);
+ targetCapacity = newTargetCapacity;
+ }
+
+ function setName(string memory newVaultName) external onlyOwner {
+ if (bytes(newVaultName).length == 0) revert NullParams();
+
+ emit NameChanged(name, newVaultName);
+ name = newVaultName;
+ }
+
+ function setOperator(address _newOperator) external onlyOwner {
+ require(_newOperator != address(0), NullParams());
+ emit OperatorChanged(operator, _newOperator);
+ operator = _newOperator;
+ }
+
+ /*///////////////////////////////
+ ////// Pausable functions //////
+ /////////////////////////////*/
+
+ function pause() external onlyOwner {
+ _pause();
+ }
+
+ function unpause() external onlyOwner {
+ _unpause();
+ }
+}
diff --git a/projects/vaults/contracts/vaults/InceptionVault.sol b/projects/vaults/contracts/vaults/InceptionVault.sol
index b2a6be76..cfb6e0f6 100644
--- a/projects/vaults/contracts/vaults/InceptionVault.sol
+++ b/projects/vaults/contracts/vaults/InceptionVault.sol
@@ -1,14 +1,16 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.24;
-import {BeaconProxy, Address} from "@openzeppelin/contracts/proxy/beacon/BeaconProxy.sol";
+import {BeaconProxy} from "@openzeppelin/contracts/proxy/beacon/BeaconProxy.sol";
+import {IERC20, InceptionLibrary, Convert} from "../assets-handler/InceptionAssetsHandler.sol";
import {IOwnable} from "../interfaces/IOwnable.sol";
import {IInceptionVault} from "../interfaces/IInceptionVault.sol";
import {IInceptionToken} from "../interfaces/IInceptionToken.sol";
import {IDelegationManager} from "../interfaces/IDelegationManager.sol";
import {IInceptionRatioFeed} from "../interfaces/IInceptionRatioFeed.sol";
-import "../eigenlayer-handler/EigenLayerHandler.sol";
+import {EigenLayerHandler, IStrategyManager, IStrategy} from "../eigenlayer-handler/EigenLayerHandler.sol";
+import {Convert} from "../lib/Convert.sol";
/// @author The InceptionLRT team
/// @title The InceptionVault contract
@@ -56,7 +58,7 @@ contract InceptionVault is IInceptionVault, EigenLayerHandler {
IInceptionToken _inceptionToken,
IStrategy _assetStrategy
) internal {
- __Ownable_init();
+ __Ownable_init(msg.sender);
__EigenLayerHandler_init(_strategyManager, _assetStrategy);
name = vaultName;
@@ -370,7 +372,7 @@ contract InceptionVault is IInceptionVault, EigenLayerHandler {
function upgradeTo(
address newImplementation
) external whenNotPaused onlyOwner {
- if (!Address.isContract(newImplementation)) revert NotContract();
+ if (!_isContract(newImplementation)) revert NotContract();
emit ImplementationUpgraded(_stakerImplementation, newImplementation);
_stakerImplementation = newImplementation;
@@ -565,6 +567,16 @@ contract InceptionVault is IInceptionVault, EigenLayerHandler {
emit ELOperatorAdded(newELOperator);
}
+ // @dev added to replace the removed Address.isContract() from OZ, to be removed later
+ function _isContract(address account) internal view returns (bool) {
+ // This method checks the size of the code at the address.
+ uint256 size;
+ assembly {
+ size := extcodesize(account)
+ }
+ return size > 0;
+ }
+
/*///////////////////////////////
////// Pausable functions //////
/////////////////////////////*/
diff --git a/projects/vaults/contracts/vaults/inEth/InEthOmniVault.sol b/projects/vaults/contracts/vaults/inEth/InEthOmniVault.sol
new file mode 100644
index 00000000..f3af0498
--- /dev/null
+++ b/projects/vaults/contracts/vaults/inEth/InEthOmniVault.sol
@@ -0,0 +1,28 @@
+// SPDX-License-Identifier: MIT
+pragma solidity ^0.8.20;
+
+import "../InceptionOmniVault.sol";
+import "../../interfaces/IStEth.sol";
+import "../../interfaces/ICrossChainAdapterL2.sol";
+
+/// @author The InceptionLRT team
+/// @title The InEthOmniVault, specifically designed for the Genesis LST
+contract InEthOmniVault is InceptionOmniVault {
+ /// @custom:oz-upgrades-unsafe-allow constructor
+ constructor() payable {
+ _disableInitializers();
+ }
+
+ function initialize(
+ address _inceptionToken,
+ address _operator,
+ ICrossChainBridgeL2 _crossChainAdapter
+ ) external initializer {
+ __InceptionOmniVault_init(
+ "InEthOmniVault",
+ _operator,
+ _inceptionToken,
+ _crossChainAdapter
+ );
+ }
+}
diff --git a/projects/vaults/contracts/vaults/vault_e2/InOmniVault_E2.sol b/projects/vaults/contracts/vaults/vault_e2/InOmniVault_E2.sol
new file mode 100644
index 00000000..6520ba06
--- /dev/null
+++ b/projects/vaults/contracts/vaults/vault_e2/InOmniVault_E2.sol
@@ -0,0 +1,25 @@
+// SPDX-License-Identifier: MIT
+pragma solidity ^0.8.20;
+
+import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
+
+import "../InceptionERC20OmniVault.sol";
+import "../../interfaces/IStEth.sol";
+import "../../interfaces/ICrossChainAdapterL2.sol";
+
+/// @author The InceptionLRT team
+/// @title The InOmniVault_E2, specifically designed for the Lido Ethereum LST
+contract InOmniVault_E2 is InceptionERC20OmniVault {
+ /// @custom:oz-upgrades-unsafe-allow constructor
+ constructor() {
+ _disableInitializers();
+ }
+
+ function initialize(
+ string memory vaultName,
+ IInceptionToken _inceptionToken,
+ IERC20 baseAsset
+ ) external initializer {
+ __InceptionERC20OmniVault_init(vaultName, _inceptionToken, baseAsset);
+ }
+}
diff --git a/projects/vaults/hardhat.config.ts b/projects/vaults/hardhat.config.ts
index 28de640a..0b8614cd 100644
--- a/projects/vaults/hardhat.config.ts
+++ b/projects/vaults/hardhat.config.ts
@@ -13,7 +13,7 @@ import "./tasks/deposit-extra";
const config: HardhatUserConfig = {
...(CONFIG as HardhatUserConfig),
solidity: {
- version: "0.8.24",
+ version: "0.8.27",
settings: {
optimizer: {
enabled: true,
diff --git a/projects/vaults/package.json b/projects/vaults/package.json
index 95eefc02..d79d4469 100644
--- a/projects/vaults/package.json
+++ b/projects/vaults/package.json
@@ -9,28 +9,31 @@
"license": "MIT",
"devDependencies": {
"@aragon/os": "^4.4.0",
+ "@arbitrum/nitro-contracts": "^2.1.0",
"@ethersproject/abi": "^5.4.7",
"@ethersproject/providers": "^5.4.7",
+ "@layerzerolabs/lz-v2-utilities": "^3.0.7",
"@nomicfoundation/hardhat-chai-matchers": "^2.0.0",
"@nomicfoundation/hardhat-ethers": "^3.0.0",
"@nomicfoundation/hardhat-ignition": "^0.15.0",
"@nomicfoundation/hardhat-ignition-ethers": "^0.15.0",
"@nomicfoundation/hardhat-network-helpers": "^1.0.0",
"@nomicfoundation/hardhat-toolbox": "^5.0.0",
- "@nomicfoundation/hardhat-verify": "^2.0.0",
+ "@nomicfoundation/hardhat-verify": "^2.0.11",
"@nomiclabs/hardhat-etherscan": "^3.1.8",
- "@openzeppelin/contracts": "^4.8.3",
- "@openzeppelin/contracts-upgradeable": "^4.8.3",
- "@openzeppelin/hardhat-upgrades": "^3.0.0",
- "@typechain/ethers-v6": "^0.5.0",
- "@typechain/hardhat": "^9.0.0",
+ "@openzeppelin/contracts": "^5.1.0",
+ "@openzeppelin/contracts-upgradeable": "^5.1.0",
+ "@openzeppelin/hardhat-upgrades": "^3.5.0",
+ "@typechain/ethers-v6": "^0.5.1",
+ "@typechain/hardhat": "^9.1.0",
"@types/chai": "^4.2.0",
"@types/mocha": ">=9.1.0",
"@types/node": ">=18.0.0",
+ "axios": "^1.7.7",
"chai": "^4.2.0",
- "dotenv": "^16.3.1",
+ "dotenv": "^16.4.5",
"ethers": "^6.4.0",
- "hardhat": "^2.14.0",
+ "hardhat": "^2.22.13",
"hardhat-contract-sizer": "^2.10.0",
"hardhat-deploy": "^0.12.4",
"hardhat-gas-reporter": "^1.0.8",
diff --git a/projects/vaults/scripts/call-iov-sendassets-info.ts b/projects/vaults/scripts/call-iov-sendassets-info.ts
new file mode 100644
index 00000000..1ea649d4
--- /dev/null
+++ b/projects/vaults/scripts/call-iov-sendassets-info.ts
@@ -0,0 +1,46 @@
+import { ethers } from "hardhat";
+import * as fs from 'fs';
+
+require("dotenv").config();
+
+const CHECKPOINT_FILE = "deployment_checkpoint.json";
+
+async function main() {
+ const [deployer] = await ethers.getSigners();
+ console.log(`Deployer Address: ${deployer.address}`);
+
+ // Load checkpoint data (if it exists)
+ const checkpoint = loadCheckpoint();
+
+ // Make sure the InceptionOmniVault address exists in the checkpoint
+ const inceptionOmniVaultAddress = checkpoint.InceptionOmniVault;
+ if (!inceptionOmniVaultAddress) {
+ throw new Error("InceptionOmniVault address not found in the checkpoint");
+ }
+
+ // Get the deployed InceptionOmniVault contract instance
+ const inceptionOmniVault = await ethers.getContractAt("InceptionOmniVault", inceptionOmniVaultAddress);
+
+ // Call the sendAssetsInfoToL1 function with empty _gasData (empty bytes array)
+ const _gasData = []; // Empty bytes array
+ const tx = await inceptionOmniVault.sendAssetsInfoToL1(_gasData, { value: 1n ** 16n }); // Sending 0.001 ETH in gwei units (10^16)
+
+ console.log(`Transaction hash: ${tx.hash}`);
+
+ // Wait for the transaction to be confirmed
+ await tx.wait();
+ console.log("Assets info sent to L1 successfully!");
+}
+
+// Load deployment checkpoint from file
+function loadCheckpoint(): any {
+ if (fs.existsSync(CHECKPOINT_FILE)) {
+ return JSON.parse(fs.readFileSync(CHECKPOINT_FILE, 'utf8'));
+ }
+ throw new Error(`Checkpoint file (${CHECKPOINT_FILE}) not found.`);
+}
+
+main().catch((error) => {
+ console.error(error);
+ process.exitCode = 1;
+});
diff --git a/projects/vaults/scripts/call-sendEthToL1-arb.ts b/projects/vaults/scripts/call-sendEthToL1-arb.ts
new file mode 100644
index 00000000..c25d5b3b
--- /dev/null
+++ b/projects/vaults/scripts/call-sendEthToL1-arb.ts
@@ -0,0 +1,92 @@
+import { ethers } from "hardhat";
+import * as fs from 'fs';
+require("dotenv").config();
+
+const CHECKPOINT_FILE = "deployment_checkpoint.json";
+
+async function main() {
+ const checkpoint = loadCheckpoint();
+
+ if (!checkpoint.InceptionOmniVault || !checkpoint.CrossChainAdapterArbitrumL2) {
+ throw new Error("InceptionOmniVault or CrossChainAdapter address not found in checkpoint.");
+ }
+
+ const [deployer] = await ethers.getSigners();
+ console.log(`Deployer Address: ${deployer.address}`);
+
+ const inceptionOmniVaultAddress = checkpoint.InceptionOmniVault;
+ console.log(`InceptionOmniVault Address: ${inceptionOmniVaultAddress}`);
+
+ const InceptionOmniVault = await ethers.getContractAt(
+ "InceptionOmniVault",
+ inceptionOmniVaultAddress
+ );
+
+ // Check the free balance in the vault
+ let freeBalance = await InceptionOmniVault.getFreeBalance();
+ console.log(`Free balance in InceptionOmniVault: ${ethers.formatEther(freeBalance)} ETH`);
+
+ // If free balance is 0, deposit ETH into the vault via receive() method
+ if (freeBalance === 0n) {
+ console.log("No free balance available. Depositing ETH into the vault...");
+
+ try {
+ const depositAmount = ethers.parseEther("0.001");
+ const depositTx = await deployer.sendTransaction({
+ to: inceptionOmniVaultAddress,
+ value: depositAmount
+ });
+
+ await depositTx.wait();
+ console.log(`Deposited ${ethers.formatEther(depositAmount)} ETH into the vault.`);
+ } catch (error) {
+ console.error("Error during deposit:", error);
+ return;
+ }
+
+ // Re-check free balance
+ freeBalance = await InceptionOmniVault.getFreeBalance();
+ console.log(`Updated free balance in InceptionOmniVault: ${ethers.formatEther(freeBalance)} ETH`);
+
+ if (freeBalance === 0n) {
+ console.log("Still no free balance after deposit. Exiting...");
+ return;
+ }
+ }
+
+ const gasData = [
+ ethers.AbiCoder.defaultAbiCoder().encode(
+ ["uint256", "uint256", "uint256"],
+ [500000, 500000, ethers.toBigInt(20_000_000_000)]
+ )
+ ];
+
+ console.log("Calling sendEthToL1 with gas data...");
+
+ try {
+ const tx = await InceptionOmniVault.sendEthToL1(gasData, {
+ value: freeBalance
+ });
+ await tx.wait();
+ console.log(`Transaction successful with hash: ${tx.hash}`);
+ } catch (error: any) {
+ console.error("Error during sendEthToL1:", error.message);
+
+ const currentCrossChainAdapter = await InceptionOmniVault.crossChainAdapter();
+ console.log(`CrossChainAdapter address: ${currentCrossChainAdapter}`);
+
+ console.log(`Attempted to send callValue: ${ethers.formatEther(freeBalance)} ETH`);
+ }
+}
+
+function loadCheckpoint(): any {
+ if (fs.existsSync(CHECKPOINT_FILE)) {
+ return JSON.parse(fs.readFileSync(CHECKPOINT_FILE, 'utf8'));
+ }
+ return {};
+}
+
+main().catch((error) => {
+ console.error("Error in execution:", error);
+ process.exitCode = 1;
+});
diff --git a/projects/vaults/scripts/deploy-cross-chain-adapter-l2.ts b/projects/vaults/scripts/deploy-cross-chain-adapter-l2.ts
new file mode 100644
index 00000000..f2ffda18
--- /dev/null
+++ b/projects/vaults/scripts/deploy-cross-chain-adapter-l2.ts
@@ -0,0 +1,53 @@
+import { ethers } from "hardhat";
+
+async function main() {
+
+ const l1TargetAddress = "0xC5E7565b9122B0fa6F7a3323de1fE867333D1b3F"; //NB! fill in the correct Rebalancer address
+
+ // Get the ContractFactory for CrossChainAdapter
+ const CrossChainAdapter = await ethers.getContractFactory("CrossChainAdapter");
+
+ // Deploy the contract
+ console.log("Deploying CrossChainAdapter...");
+ const crossChainAdapter = await CrossChainAdapter.deploy(l1TargetAddress);
+
+ // Wait for the contract to be deployed
+ await crossChainAdapter.waitForDeployment();
+
+ // Log the contract address
+ const crossChainAdapterAddress = await crossChainAdapter.getAddress()
+ console.log("CrossChainAdapter deployed to:", crossChainAdapterAddress);
+
+ // Test values for sendAssetsInfoToL1
+ const testTokensAmount = 1000; // Example tokens amount
+ const testEthAmount = 500; // Example ETH amount
+
+ // Call sendAssetsInfoToL1 with test values
+ console.log(`Calling sendAssetsInfoToL1 with ${testTokensAmount} tokens and ${testEthAmount} ETH...`);
+ const tx = await crossChainAdapter.sendAssetsInfoToL1(testTokensAmount, testEthAmount);
+ const receipt = await tx.wait();
+
+ // Query the logs using the new Ethers v6 event handling
+ const eventLogs = await inceptionOmniVault.queryFilter(
+ inceptionOmniVault.filters.AssetsInfoSentToL1(),
+ receipt.blockNumber,
+ receipt.blockNumber
+ );
+
+ // Iterate over the found logs and extract relevant event data
+ if (eventLogs.length > 0) {
+ for (const event of eventLogs) {
+ const ticketId = event.args?.ticketId;
+ console.log(`Assets info sent to L1 with ticketId: ${ticketId.toString()}`);
+ }
+ } else {
+ console.log("AssetsInfoSentToL1 event not found in the transaction receipt.");
+ }
+}
+
+main()
+ .then(() => process.exit(0))
+ .catch((error) => {
+ console.error(error);
+ process.exit(1);
+ });
diff --git a/projects/vaults/scripts/deploy-mock-rebalancer-l1.ts b/projects/vaults/scripts/deploy-mock-rebalancer-l1.ts
new file mode 100644
index 00000000..b9bff770
--- /dev/null
+++ b/projects/vaults/scripts/deploy-mock-rebalancer-l1.ts
@@ -0,0 +1,24 @@
+import { ethers } from "hardhat";
+
+async function main() {
+ // Get the ContractFactory for MockRebalancerL1
+ const MockRebalancerL1 = await ethers.getContractFactory("MockRebalancerL1");
+
+ // Deploy the contract
+ console.log("Deploying MockRebalancerL1...");
+ const mockRebalancer = await MockRebalancerL1.deploy();
+
+ // Wait for the contract to be deployed
+ await mockRebalancer.waitForDeployment();
+
+ // Log the contract address
+ const mockRebalancerAddress = await mockRebalancer.getAddress()
+ console.log("MockRebalancerL1 deployed to:", mockRebalancerAddress);
+}
+
+main()
+ .then(() => process.exit(0))
+ .catch((error) => {
+ console.error(error);
+ process.exit(1);
+ });
diff --git a/projects/vaults/scripts/deploy-omni-stake-l2-arb.ts b/projects/vaults/scripts/deploy-omni-stake-l2-arb.ts
new file mode 100644
index 00000000..d826036b
--- /dev/null
+++ b/projects/vaults/scripts/deploy-omni-stake-l2-arb.ts
@@ -0,0 +1,235 @@
+import { ethers, upgrades, run } from "hardhat";
+import * as fs from 'fs';
+import axios from "axios";
+require("dotenv").config();
+
+const CHECKPOINT_FILE = "deployment_checkpoint.json";
+const ETHERSCAN_API_KEY = process.env.ETHERSCAN_API_KEY;
+const OPERATOR_ADDRESS = process.env.OPERATOR_ADDRESS;
+const L1_TARGET = process.env.L1_TARGET;
+
+const verifiedContracts = new Set();
+
+async function main() {
+ const [deployer] = await ethers.getSigners();
+ console.log(`Deployer Address: ${deployer.address}`);
+
+ let checkpoint: any = loadCheckpoint();
+
+ // Supported chains for verification
+ const supportedChains = [1, 4, 5, 42, 56, 137, 42161, 421614, 17000, 11155111];
+ const networkData = await ethers.provider.getNetwork();
+ const chainId = Number(networkData.chainId);
+ console.log(`chainId is ${chainId}`);
+
+ // ------------ Transaction 1: ProtocolConfig, RatioFeed ------------
+
+ if (!checkpoint.ProtocolConfig) {
+ console.log("Deploying ProtocolConfig...");
+ const ProtocolConfig = await ethers.getContractFactory("ProtocolConfig");
+ const protocolConfig = await upgrades.deployProxy(ProtocolConfig, [
+ deployer.address, OPERATOR_ADDRESS, deployer.address
+ ], { initializer: "initialize" });
+ await protocolConfig.waitForDeployment();
+ checkpoint.ProtocolConfig = await protocolConfig.getAddress();
+ saveCheckpoint(checkpoint);
+ console.log("ProtocolConfig deployed at:", checkpoint.ProtocolConfig);
+ }
+
+ if (!checkpoint.RatioFeed) {
+ console.log("Deploying RatioFeed...");
+ const RatioFeed = await ethers.getContractFactory("RatioFeed");
+ const ratioFeed = await upgrades.deployProxy(
+ RatioFeed,
+ [checkpoint.ProtocolConfig, 1000000],
+ { initializer: "initialize" }
+ );
+ await ratioFeed.waitForDeployment();
+ checkpoint.RatioFeed = await ratioFeed.getAddress();
+ saveCheckpoint(checkpoint);
+ console.log("RatioFeed deployed at:", checkpoint.RatioFeed);
+ }
+
+ // ------------ Transaction 2: InceptionToken ------------
+
+ if (!checkpoint.InceptionToken) {
+ console.log("Deploying InceptionToken...");
+ const InceptionToken = await ethers.getContractFactory("InceptionToken");
+ const inceptionToken = await upgrades.deployProxy(
+ InceptionToken,
+ ["InceptionToken", "iETH"], // Name and symbol
+ { initializer: "initialize" }
+ );
+ await inceptionToken.waitForDeployment();
+ checkpoint.InceptionToken = await inceptionToken.getAddress();
+ saveCheckpoint(checkpoint);
+ console.log("InceptionToken deployed at:", checkpoint.InceptionToken);
+ }
+
+ // ------------ Transaction 3: CrossChainAdapterArbitrumL2 ------------
+
+ if (!checkpoint.CrossChainAdapterArbitrumL2) {
+ console.log("Deploying CrossChainAdapterArbitrumL2...");
+ const CrossChainAdapterArbitrumL2 = await ethers.getContractFactory("CrossChainAdapterArbitrumL2");
+ const crossChainAdapterArbitrumL2 = await upgrades.deployProxy(
+ CrossChainAdapterArbitrumL2,
+ [L1_TARGET, OPERATOR_ADDRESS],
+ { initializer: "initialize" }
+ );
+ await crossChainAdapterArbitrumL2.waitForDeployment();
+ checkpoint.CrossChainAdapterArbitrumL2 = await crossChainAdapterArbitrumL2.getAddress();
+ saveCheckpoint(checkpoint);
+ console.log("CrossChainAdapterArbitrumL2 deployed at:", checkpoint.CrossChainAdapterArbitrumL2);
+ }
+
+ // ------------ Transaction 4: InceptionOmniVault ------------
+
+ if (!checkpoint.InceptionOmniVault) {
+ console.log("Deploying InceptionOmniVault...");
+ const InceptionOmniVault = await ethers.getContractFactory("InceptionOmniVault");
+ const inceptionOmniVault = await upgrades.deployProxy(
+ InceptionOmniVault,
+ ["Inception Vault", OPERATOR_ADDRESS, checkpoint.InceptionToken, checkpoint.CrossChainAdapterArbitrumL2],
+ { initializer: "__InceptionOmniVault_init" }
+ );
+ await inceptionOmniVault.waitForDeployment();
+ checkpoint.InceptionOmniVault = await inceptionOmniVault.getAddress();
+ saveCheckpoint(checkpoint);
+ console.log("InceptionOmniVault deployed at:", checkpoint.InceptionOmniVault);
+ }
+
+ // Set vault in InceptionToken after InceptionOmniVault is deployed
+ const inceptionTokenContract = await ethers.getContractAt("InceptionToken", checkpoint.InceptionToken);
+ await inceptionTokenContract.setVault(checkpoint.InceptionOmniVault);
+
+ // Set L1 target for CrossChainAdapterArbitrumL2
+ const crossChainAdapterContract = await ethers.getContractAt("CrossChainAdapterArbitrumL2", checkpoint.CrossChainAdapterArbitrumL2);
+ await crossChainAdapterContract.setL1Target(L1_TARGET);
+
+ // Final Verification
+ await verifyContracts(
+ chainId,
+ supportedChains,
+ checkpoint.ProtocolConfig,
+ checkpoint.RatioFeed,
+ checkpoint.InceptionToken,
+ checkpoint.CrossChainAdapterArbitrumL2,
+ checkpoint.InceptionOmniVault
+ );
+
+ console.log("Deployment completed successfully! 🥳");
+ console.log("Checkpoint saved:", checkpoint);
+}
+
+// Save deployment checkpoint
+function saveCheckpoint(checkpoint: any) {
+ fs.writeFileSync(CHECKPOINT_FILE, JSON.stringify(checkpoint, null, 2));
+}
+
+// Load deployment checkpoint
+function loadCheckpoint(): any {
+ if (fs.existsSync(CHECKPOINT_FILE)) {
+ return JSON.parse(fs.readFileSync(CHECKPOINT_FILE, 'utf8'));
+ }
+ return {};
+}
+
+// Function to check if the contract is verified
+async function isContractVerified(contractAddress: string): Promise {
+ // Check the cached verified contracts first
+ if (verifiedContracts.has(contractAddress)) {
+ console.log(`Contract ${contractAddress} is already in the verified cache.`);
+ return true;
+ }
+
+ const apiUrl = `https://api.arbiscan.io/api?module=contract&action=getsourcecode&address=${contractAddress}&apikey=${ETHERSCAN_API_KEY}`;
+
+ try {
+ const response = await axios.get(apiUrl);
+ const data = response.data;
+
+ // Check if the response is successful and has the expected structure
+ if (data.status === "1" && Array.isArray(data.result) && data.result.length > 0) {
+ const isVerified = data.result[0].ABI !== "Contract source code not verified";
+ if (isVerified) {
+ verifiedContracts.add(contractAddress); // Add to the cache if verified
+ }
+ return isVerified;
+ }
+ console.error(`Verification status for ${contractAddress} not found or invalid response:`, data);
+ return false; // Assume not verified on invalid response
+ } catch (error) {
+ console.error(`Error checking verification status for ${contractAddress}:`, error);
+ return false; // Assume not verified on error
+ }
+}
+
+// Function to verify upgradeable contracts (Transparent Proxy)
+async function verifyUpgradeableContract(proxyAddress: string, constructorArguments: any[]) {
+ const implementationAddress = await upgrades.erc1967.getImplementationAddress(proxyAddress);
+
+ // Check if implementation is already verified
+ const isVerifiedImplementation = await isContractVerified(implementationAddress);
+ if (isVerifiedImplementation) {
+ console.log(`Implementation contract at ${implementationAddress} is already verified.`);
+ return;
+ }
+
+ // Verify the implementation contract
+ try {
+ console.log(`Verifying implementation contract at: ${implementationAddress}`);
+ await run("verify:verify", {
+ address: implementationAddress,
+ constructorArguments: [] // Assuming no constructor arguments for implementation
+ });
+ } catch (error) {
+ console.error(`Failed to verify implementation contract at ${implementationAddress}:`, error);
+ }
+
+ // Check if proxy is already verified
+ const isVerifiedProxy = await isContractVerified(proxyAddress);
+ if (isVerifiedProxy) {
+ console.log(`Proxy contract at ${proxyAddress} is already verified.`);
+ return;
+ }
+
+ // Verify the proxy contract
+ try {
+ console.log(`Verifying proxy contract at: ${proxyAddress}`);
+ await run("verify:verify", {
+ address: proxyAddress,
+ constructorArguments: constructorArguments // Pass constructor arguments for the proxy contract
+ });
+ } catch (error) {
+ console.error(`Failed to verify proxy contract at ${proxyAddress}:`, error);
+ }
+
+ console.log(`Finished verification for upgradeable contract at: ${proxyAddress}`);
+}
+
+// Utility function to handle verifications
+async function verifyContracts(
+ chainId: number,
+ supportedChains: number[],
+ ...addresses: string[]
+) {
+ if (supportedChains.includes(chainId) && ETHERSCAN_API_KEY) {
+ for (const address of addresses) {
+ if (address) {
+ try {
+ console.log(`Verifying contract at ${address}`);
+ await verifyUpgradeableContract(address, []);
+ } catch (error) {
+ console.error(`Verification failed for ${address}:`, error);
+ }
+ }
+ }
+ } else {
+ console.log("Skipping verification - unsupported chain or missing API key");
+ }
+}
+
+main().catch((error) => {
+ console.error(error);
+ process.exitCode = 1;
+});
diff --git a/projects/vaults/scripts/deploy-omni-staking-opt.ts b/projects/vaults/scripts/deploy-omni-staking-opt.ts
new file mode 100644
index 00000000..8689dcda
--- /dev/null
+++ b/projects/vaults/scripts/deploy-omni-staking-opt.ts
@@ -0,0 +1,197 @@
+import { ethers, upgrades, run, network } from "hardhat";
+import axios from "axios";
+import * as fs from 'fs';
+import path from "path";
+require("dotenv").config();
+
+const jsonFilePath = path.resolve(__dirname, "../../../deployment_checkpoint_optimism-sepolia.json");
+const OPERATOR_ADDRESS = process.env.OPERATOR_ADDRESS;
+const OPTIMISM_SEPOLIA_API_KEY = process.env.OPTIMISM_SEPOLIA_API_KEY || "C3JF1ZDIQ4TT388IVSIW8WHAZRKZH5R9XJ";
+const verifiedContracts = new Set();
+
+async function main() {
+ // Verify JSON file exists
+ if (!fs.existsSync(jsonFilePath)) {
+ console.error(`Error: JSON file does not exist at path: ${jsonFilePath}`);
+ process.exit(1);
+ }
+
+ // Load contract addresses
+ const contractData = JSON.parse(fs.readFileSync(jsonFilePath, "utf-8"));
+ const lzCrossChainAdapterL2Address = contractData.LZCrossChainAdapterL2;
+
+ if (!lzCrossChainAdapterL2Address) {
+ console.error("Error: LZCrossChainAdapterL2 address not found in JSON file.");
+ process.exit(1);
+ }
+
+ if (!OPERATOR_ADDRESS || !ethers.isAddress(OPERATOR_ADDRESS)) {
+ console.error("Error: Invalid or missing OPERATOR_ADDRESS in environment variables.");
+ process.exit(1);
+ }
+
+ // Deployer account
+ const [deployer] = await ethers.getSigners();
+ console.log(`Deployer address: ${deployer.address}`);
+
+ const checkpoint: { [key: string]: string } = {};
+
+ // Deploy InceptionToken
+ console.log("Deploying InceptionToken...");
+ const InceptionTokenFactory = await ethers.getContractFactory("InceptionToken");
+ const inceptionToken = await upgrades.deployProxy(
+ InceptionTokenFactory,
+ ["InceptionToken", "inETH"],
+ { initializer: "initialize" }
+ );
+ await inceptionToken.waitForDeployment();
+ checkpoint.InceptionToken = await inceptionToken.getAddress();
+ console.log("InceptionToken deployed at:", checkpoint.InceptionToken);
+
+ // Deploy InceptionRatioFeed
+ console.log("Deploying InceptionRatioFeed...");
+ const InceptionRatioFeedFactory = await ethers.getContractFactory("InceptionRatioFeed");
+ const inceptionRatioFeed = await upgrades.deployProxy(InceptionRatioFeedFactory, [], {
+ initializer: "initialize",
+ });
+ await inceptionRatioFeed.waitForDeployment();
+ checkpoint.InceptionRatioFeed = await inceptionRatioFeed.getAddress();
+ console.log("InceptionRatioFeed deployed at:", checkpoint.InceptionRatioFeed);
+
+ // Deploy InceptionOmniVault
+ console.log("Deploying InceptionOmniVault...");
+ const InceptionOmniVaultFactory = await ethers.getContractFactory("InceptionOmniVault");
+ const inceptionOmniVault = await upgrades.deployProxy(
+ InceptionOmniVaultFactory,
+ ["InceptionOmniVault", OPERATOR_ADDRESS, checkpoint.InceptionToken, lzCrossChainAdapterL2Address],
+ { initializer: "__InceptionOmniVault_init" }
+ );
+ await inceptionOmniVault.waitForDeployment();
+ checkpoint.InceptionOmniVault = await inceptionOmniVault.getAddress();
+ console.log("InceptionOmniVault deployed at:", checkpoint.InceptionOmniVault);
+
+ // Set InceptionToken's vault to InceptionOmniVault
+ console.log("Linking InceptionToken to InceptionOmniVault...");
+ await inceptionToken.setVault(await inceptionOmniVault.getAddress());
+ console.log("InceptionToken vault set to InceptionOmniVault.");
+
+ // Update ratio for InceptionToken in InceptionRatioFeed
+ console.log("Updating ratio for InceptionToken in InceptionRatioFeed...");
+ const newRatio = ethers.parseEther("0.8");
+ await inceptionRatioFeed.updateRatioBatch([checkpoint.InceptionToken], [newRatio]);
+ console.log("Ratio updated in InceptionRatioFeed for InceptionToken.");
+
+ // Set target receiver in LZCrossChainAdapterL2 to InceptionOmniVault
+ console.log("Setting target receiver on LZCrossChainAdapterL2...");
+ const lzCrossChainAdapterL2 = await ethers.getContractAt("ICrossChainBridgeL2", lzCrossChainAdapterL2Address);
+ const setTargetReceiverTx = await lzCrossChainAdapterL2.setTargetReceiver(checkpoint.InceptionOmniVault);
+ await setTargetReceiverTx.wait();
+ console.log("Target receiver set to InceptionOmniVault on LZCrossChainAdapterL2.");
+
+ // Save the new deployment checkpoint
+ saveCheckpoint(checkpoint);
+
+ // Optional: Verification logic
+ // const shouldVerify = network.name === "optimismSepolia";
+ const shouldVerify = true;
+ if (shouldVerify) {
+ await verifyUpgradeableContract(checkpoint.InceptionToken, []);
+ await verifyUpgradeableContract(checkpoint.InceptionRatioFeed, []);
+ await verifyUpgradeableContract(checkpoint.InceptionOmniVault, []);
+ }
+
+ console.log("Deployment completed successfully! 🥳");
+ console.log("Checkpoint saved:", checkpoint);
+}
+
+function saveCheckpoint(newCheckpoint: { [key: string]: string }) {
+ // Load existing data, if available
+ let existingCheckpoint = {};
+ if (fs.existsSync(jsonFilePath)) {
+ try {
+ const fileData = fs.readFileSync(jsonFilePath, "utf-8");
+ existingCheckpoint = JSON.parse(fileData);
+ } catch (error) {
+ console.error("Error reading existing checkpoint file:", error);
+ }
+ }
+
+ // Merge new checkpoint data with existing data
+ const updatedCheckpoint = { ...existingCheckpoint, ...newCheckpoint };
+
+ // Write the merged data back to the file
+ fs.writeFileSync(jsonFilePath, JSON.stringify(updatedCheckpoint, null, 2));
+ console.log("Checkpoint file updated:", jsonFilePath);
+}
+
+// Verification helper functions
+async function verifyUpgradeableContract(proxyAddress: string, constructorArguments: any[]) {
+ const implementationAddress = await upgrades.erc1967.getImplementationAddress(proxyAddress);
+
+ const isVerifiedImplementation = await isContractVerified(implementationAddress);
+ if (isVerifiedImplementation) {
+ console.log(`Implementation contract at ${implementationAddress} is already verified.`);
+ return;
+ }
+
+ try {
+ console.log(`Verifying implementation contract at: ${implementationAddress}`);
+ await run("verify:verify", {
+ address: implementationAddress,
+ constructorArguments: [],
+ });
+ } catch (error) {
+ console.error(`Failed to verify implementation contract at ${implementationAddress}:`, error);
+ }
+
+ const isVerifiedProxy = await isContractVerified(proxyAddress);
+ if (isVerifiedProxy) {
+ console.log(`Proxy contract at ${proxyAddress} is already verified.`);
+ return;
+ }
+
+ try {
+ console.log(`Verifying proxy contract at: ${proxyAddress}`);
+ await run("verify:verify", {
+ address: proxyAddress,
+ constructorArguments: constructorArguments,
+ });
+ } catch (error) {
+ console.error(`Failed to verify proxy contract at ${proxyAddress}:`, error);
+ }
+
+ console.log(`Finished verification for upgradeable contract at: ${proxyAddress}`);
+}
+
+async function isContractVerified(contractAddress: string): Promise {
+ if (verifiedContracts.has(contractAddress)) {
+ console.log(`Contract ${contractAddress} is already in the verified cache.`);
+ return true;
+ }
+
+ const apiUrl = `https://api-sepolia-optimistic.etherscan.io/api?module=contract&action=getsourcecode&address=${contractAddress}&apikey=${OPTIMISM_SEPOLIA_API_KEY}`;
+
+ try {
+ const response = await axios.get(apiUrl);
+ const data = response.data;
+
+ if (data.status === "1" && Array.isArray(data.result) && data.result.length > 0) {
+ const isVerified = data.result[0].ABI !== "Contract source code not verified";
+ if (isVerified) {
+ verifiedContracts.add(contractAddress);
+ }
+ return isVerified;
+ }
+ console.error(`Verification status for ${contractAddress} not found or invalid response:`, data);
+ return false;
+ } catch (error) {
+ console.error(`Error checking verification status for ${contractAddress}:`, error);
+ return false;
+ }
+}
+
+// Run the script
+main().catch((error) => {
+ console.error("Script failed:", error);
+ process.exit(1);
+});
diff --git a/projects/vaults/scripts/deposit-to-iov.ts b/projects/vaults/scripts/deposit-to-iov.ts
new file mode 100644
index 00000000..399466e1
--- /dev/null
+++ b/projects/vaults/scripts/deposit-to-iov.ts
@@ -0,0 +1,53 @@
+import { ethers } from "hardhat";
+import axios from "axios";
+import * as fs from 'fs';
+import path from "path";
+require("dotenv").config();
+
+
+
+async function main() {
+ const [deployer] = await ethers.getSigners();
+ const jsonFilePath = path.resolve(__dirname, "../../../deployment_checkpoint_arbitrum-sepolia.json");
+ console.log(`Deployer Address: ${deployer.address}`);
+
+ if (!fs.existsSync(jsonFilePath)) {
+ console.error(`Error: JSON file does not exist at path: ${jsonFilePath}`);
+ process.exit(1);
+ }
+
+ const checkpoint = JSON.parse(fs.readFileSync(jsonFilePath, "utf-8"));
+
+ const inceptionOmniVaultAddress = checkpoint.InceptionOmniVault;
+
+ console.log(`inceptionOmniVaultAddress: ${inceptionOmniVaultAddress}`);
+
+ // Create a contract instance for the InceptionOmniVault
+ const inceptionOmniVaultContract = await ethers.getContractAt("InceptionOmniVault", inceptionOmniVaultAddress);
+
+
+ // The amount of ETH to deposit (0.004 ETH)
+ const depositAmount = ethers.parseEther("0.004"); // Convert to Wei
+
+ // Call deposit function
+ console.log(`Depositing ${depositAmount.toString()} wei to InceptionOmniVault...`);
+ const depositTx = await inceptionOmniVaultContract.deposit(deployer.address, { value: depositAmount });
+
+ // Wait for the transaction to be confirmed
+ await depositTx.wait();
+ console.log(`Successfully deposited ${depositAmount.toString()} wei to InceptionOmniVault at address ${inceptionOmniVaultAddress}`);
+}
+
+// Load deployment checkpoint
+function loadCheckpoint(): any {
+ if (fs.existsSync(CHECKPOINT_FILE)) {
+ return JSON.parse(fs.readFileSync(CHECKPOINT_FILE, 'utf8'));
+ }
+ return {};
+}
+
+// Execute the script
+main().catch((error) => {
+ console.error(error);
+ process.exitCode = 1;
+});
diff --git a/projects/vaults/scripts/error-sig.ts b/projects/vaults/scripts/error-sig.ts
new file mode 100644
index 00000000..d077503e
--- /dev/null
+++ b/projects/vaults/scripts/error-sig.ts
@@ -0,0 +1,59 @@
+import { ethers } from "hardhat";
+
+// List of error types from the InceptionOmniVault contract
+const errors = [
+ "NullParams()",
+ "LowerMinAmount(uint256)",
+ "OnlyOwnerOrOperator()",
+ "ResultISharesZero()",
+ "InsufficientCapacity(uint256)",
+ "CrossChainAdapterNotSet()",
+ "FreeBalanceIsZero()",
+ "EthToL1Failed(uint256)",
+ "MessageToL1Failed(uint256,uint256)",
+ "RatioFeedNotSet()",
+ "ParameterExceedsLimits(uint256)",
+ "TreasuryUpdated(address)",
+ "WithdrawFeeParamsChanged(uint256,uint256,uint256)",
+ "DepositBonusParamsChanged(uint256,uint256,uint256)",
+ "NameChanged(string,string)",
+ "OperatorChanged(address,address)",
+ "TargetCapacityChanged(uint256,uint256)",
+
+ // Errors from IInceptionVaultErrors interface
+ "TransferAssetFailed(address)",
+ "TransferAssetFromFailed(address)",
+ "InceptionOnPause()",
+ "InconsistentData()",
+ "ApproveError()",
+ "NotContract()",
+ "DepositInconsistentResultedState()",
+ "OperatorNotRegistered()",
+ "RestakerNotRegistered()",
+ "ImplementationNotSet()",
+ "OnlyOperatorAllowed()",
+ "AlreadyDelegated()",
+ "DelegationManagerImmutable()",
+ "IsNotAbleToRedeem()",
+ "ZeroFlashWithdrawFee()",
+ "ExceedsMaxPerDeposit(uint256,uint256)",
+ "ExceedsMaxTotalDeposited(uint256,uint256)",
+ "NotEigenLayerOperator()",
+ "EigenLayerOperatorAlreadyExists()"
+];
+
+async function main() {
+ console.log("Error Signatures:");
+
+ errors.forEach((error) => {
+ // Create the signature for each error
+ const signature = ethers.id(error);
+ console.log(`${error} => ${signature}`);
+ });
+}
+
+// Execute the script
+main().catch((error) => {
+ console.error(error);
+ process.exitCode = 1;
+});
diff --git a/projects/vaults/scripts/migration/mainnet/vaults/deploy-iov.ts b/projects/vaults/scripts/migration/mainnet/vaults/deploy-iov.ts
new file mode 100644
index 00000000..a0a6ec69
--- /dev/null
+++ b/projects/vaults/scripts/migration/mainnet/vaults/deploy-iov.ts
@@ -0,0 +1,74 @@
+import { ethers, upgrades } from "hardhat";
+
+async function main() {
+ console.log("Deploying InceptionOmniVault...");
+
+ const network = await ethers.provider.getNetwork();
+ const networkName = network.name.toLowerCase();
+
+ let INCEPTION_TOKEN_ADDRESS: string;
+ let CROSS_CHAIN_BRIDGE_ADDRESS_L2: string;
+
+ switch (networkName) {
+ case "arbitrum":
+ INCEPTION_TOKEN_ADDRESS = "0x5A7a183B6B44Dc4EC2E3d2eF43F98C5152b1d76d";
+ CROSS_CHAIN_BRIDGE_ADDRESS_L2 = ""; // TODO! Insert LZCrossChainBridgeL2 address for Arbitrum here
+ break;
+ case "optimism":
+ INCEPTION_TOKEN_ADDRESS = "0x5A7a183B6B44Dc4EC2E3d2eF43F98C5152b1d76d";
+ CROSS_CHAIN_BRIDGE_ADDRESS_L2 = ""; // TODO! Insert LZCrossChainBridgeL2 address for Optimism here
+ break;
+ default:
+ throw new Error(`Unsupported network: ${networkName}`);
+ }
+
+ if (!CROSS_CHAIN_BRIDGE_ADDRESS_L2) {
+ throw new Error("Please set the CROSS_CHAIN_BRIDGE_ADDRESS_L2 for the current network");
+ }
+
+ const operatorAddress = process.env.OPERATOR_ADDRESS;
+ if (!operatorAddress) {
+ throw new Error("Please set the OPERATOR_ADDRESS environment variable");
+ }
+
+ const vaultName = "Inception OmniVault";
+
+ console.log("Deployment parameters:");
+ console.log("Network:", networkName);
+ console.log("Vault Name:", vaultName);
+ console.log("Operator Address:", operatorAddress);
+ console.log("Inception Token Address:", INCEPTION_TOKEN_ADDRESS);
+ console.log("CrossChainBridge Address:", CROSS_CHAIN_BRIDGE_ADDRESS_L2);
+
+ const InceptionOmniVaultFactory = await ethers.getContractFactory("InceptionOmniVault");
+ console.log("Deploying Transparent Proxy...");
+
+ const inceptionOmniVault = await upgrades.deployProxy(
+ InceptionOmniVaultFactory,
+ [vaultName, operatorAddress, INCEPTION_TOKEN_ADDRESS, CROSS_CHAIN_BRIDGE_ADDRESS_L2],
+ {
+ initializer: "__InceptionOmniVault_init",
+ }
+ );
+
+ console.log("Waiting for deployment...");
+ await inceptionOmniVault.waitForDeployment();
+
+ const deployedAddress = await inceptionOmniVault.getAddress();
+ console.log("InceptionOmniVault deployed to (proxy):", deployedAddress);
+
+ const implementationAddress = await upgrades.erc1967.getImplementationAddress(deployedAddress);
+ console.log("InceptionOmniVault implementation deployed at:", implementationAddress);
+
+ const adminAddress = await upgrades.erc1967.getAdminAddress(deployedAddress);
+ console.log("Proxy Admin Address:", adminAddress);
+
+ console.log("Deployment complete.");
+}
+
+main()
+ .then(() => process.exit(0))
+ .catch((error) => {
+ console.error("Error deploying InceptionOmniVault:", error);
+ process.exit(1);
+ });
diff --git a/projects/vaults/scripts/omni-deploy.ts b/projects/vaults/scripts/omni-deploy.ts
new file mode 100644
index 00000000..802521c9
--- /dev/null
+++ b/projects/vaults/scripts/omni-deploy.ts
@@ -0,0 +1,88 @@
+import { ethers, upgrades } from "hardhat";
+
+async function main() {
+ const [deployer] = await ethers.getSigners();
+
+ console.log(`Deploying contracts with the account: ${deployer.address}`);
+
+ // Use BigInt for balance calculations
+ const initBalance: BigInt = BigInt(await deployer.provider!.getBalance(deployer.address));
+ console.log("Account balance:", initBalance.toString());
+
+ // 1. Deploy InceptionToken (InETH)
+ const inETHFactory = await ethers.getContractFactory("InceptionToken");
+ const inETH = await upgrades.deployProxy(inETHFactory, ["InceptionToken", "InETH"], { kind: "transparent" });
+ await inETH.waitForDeployment();
+ const inETHAddress = await inETH.getAddress();
+ console.log(`InceptionToken deployed at: ${inETHAddress}`);
+
+ // 2. Deploy ArbCrossChainAdapter
+ const adapterFactory = await ethers.getContractFactory("ArbCrossChainAdapter");
+ const crossChainAdapter = await adapterFactory.deploy(
+ "0x70997970C51812dc3A010C7d01b50e0d17dc79C8" // L1 target address
+ );
+ await crossChainAdapter.waitForDeployment();
+ const crossChainAdapterAddress = await crossChainAdapter.getAddress();
+ console.log(`ArbCrossChainAdapter deployed at: ${crossChainAdapterAddress}`);
+
+ // 3. Deploy InceptionRatioFeed
+ const ratioFeedFactory = await ethers.getContractFactory("InceptionRatioFeed");
+ const ratioFeed = await ratioFeedFactory.deploy();
+ await ratioFeed.waitForDeployment();
+ const ratioFeedAddress = await ratioFeed.getAddress();
+ console.log(`InceptionRatioFeed deployed at: ${ratioFeedAddress}`);
+
+ // 4. Deploy InceptionOmniVault
+ const vaultFactory = await ethers.getContractFactory("InceptionOmniVault");
+ const inceptionOmniVault = await upgrades.deployProxy(
+ vaultFactory,
+ ["InceptionVault", inETHAddress, crossChainAdapterAddress], // Vault name, token address, cross chain adapter
+ { initializer: "__InceptionOmniVault_init", kind: "transparent" }
+ );
+ await inceptionOmniVault.waitForDeployment();
+ const inceptionOmniVaultAddress = await inceptionOmniVault.getAddress();
+ console.log(`InceptionOmniVault deployed at: ${inceptionOmniVaultAddress}`);
+
+ const setVaultTx = await crossChainAdapter.setVault(inceptionOmniVaultAddress);
+ await setVaultTx.wait();
+ console.log("Vault address set in ArbCrossChainAdapter");
+
+ // 5. Set the RatioFeed in InceptionOmniVault
+ const setRatioFeedTx = await inceptionOmniVault.setRatioFeed(ratioFeedAddress);
+ await setRatioFeedTx.wait();
+ console.log("RatioFeed address set in InceptionOmniVault");
+
+ // 6. Set the vault address in InceptionToken
+ const tx = await inETH.setVault(inceptionOmniVaultAddress);
+ await tx.wait();
+ console.log("Vault address set in InceptionToken");
+
+ // 7. Update Ratio in InceptionRatioFeed to be less than 1
+ const updateRatioTx = await ratioFeed.updateRatioBatch(
+ [inETHAddress], // Array of token addresses
+ [ethers.parseUnits("0.8", 18)] // New ratio - 0.8 InceptionTokens per 1 ETH
+ );
+ await updateRatioTx.wait();
+ console.log("Updated the ratio for InceptionToken in InceptionRatioFeed");
+
+ // 8. Call the vault function to mint 20 InETH tokens to itself
+ const mintAmount = ethers.parseUnits("20", 18); // 20 InETH
+ // const mintTx = await inceptionOmniVault.mintTokensToVault(mintAmount);
+ // await mintTx.wait();
+ console.log(`Minted 20 InETH to InceptionOmniVault at ${inceptionOmniVaultAddress}`);
+
+ // 9. Get the InETH balance of InceptionOmniVault
+ const vaultBalance = await inETH.balanceOf(inceptionOmniVaultAddress);
+ console.log(`InceptionOmniVault balance: ${ethers.formatUnits(vaultBalance, 18)} InETH`);
+
+ // Use BigInt for final balance
+ const finalBalance: BigInt = BigInt(await deployer.provider!.getBalance(deployer.address));
+ console.log(`Deployment completed. Gas spent: ${(initBalance - finalBalance).toString()}`);
+}
+
+main()
+ .then(() => process.exit(0))
+ .catch((error) => {
+ console.error(error);
+ process.exit(1);
+ });
diff --git a/projects/vaults/scripts/omni-flow.ts b/projects/vaults/scripts/omni-flow.ts
new file mode 100644
index 00000000..7251a56f
--- /dev/null
+++ b/projects/vaults/scripts/omni-flow.ts
@@ -0,0 +1,78 @@
+import { ethers } from "hardhat";
+
+async function main() {
+ const [user] = await ethers.getSigners();
+
+ // NB!
+ const inceptionOmniVaultAddress = "0x5FC8d32690cc91D4c39d9d3abcBD16989F875707"; // update with deployed vault address
+ const inETHAddress = "0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512"; // update with deployed InETH address
+ const crossChainAdapterAddress = "0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0"; // update with deployed CrossChainAdapter address
+
+ // 1. Get contract instances
+ const inceptionOmniVault = await ethers.getContractAt("InceptionOmniVault", inceptionOmniVaultAddress);
+ const inETH = await ethers.getContractAt("InceptionToken", inETHAddress);
+ const crossChainAdapter = await ethers.getContractAt("ArbCrossChainAdapter", crossChainAdapterAddress);
+
+
+ // 2. Check user's ETH and InETH balance before the deposit
+ const userEthBalanceBefore = await ethers.provider.getBalance(user.address);
+ const userInETHBalanceBefore = await inETH.balanceOf(user.address);
+
+ console.log(`User ETH balance before deposit: ${ethers.formatUnits(userEthBalanceBefore, 18)} ETH`);
+ console.log(`User InETH balance before deposit: ${ethers.formatUnits(userInETHBalanceBefore, 18)} InETH`);
+
+ // 3. Deposit 0.00001 ETH into the vault
+ const depositAmount = ethers.parseUnits("0.00001", 18); // 0.00001 ETH
+ const depositTx = await inceptionOmniVault.connect(user).deposit(user.address, { value: depositAmount });
+ await depositTx.wait();
+ console.log(`Deposited 0.00001 ETH into InceptionOmniVault`);
+
+ // 4. Check user's ETH and InETH balance after the deposit
+ const userEthBalanceAfter = await ethers.provider.getBalance(user.address);
+ const userInETHBalanceAfter = await inETH.balanceOf(user.address);
+
+ console.log(`User ETH balance after deposit: ${ethers.formatUnits(userEthBalanceAfter, 18)} ETH`);
+ console.log(`User InETH balance after deposit: ${ethers.formatUnits(userInETHBalanceAfter, 18)} InETH`);
+
+ // 5. Check InceptionOmniVault's ETH and InETH balance
+ const vaultEthBalance = await ethers.provider.getBalance(inceptionOmniVaultAddress);
+ const vaultInETHBalance = await inETH.balanceOf(inceptionOmniVaultAddress);
+
+ console.log(`InceptionOmniVault ETH balance: ${ethers.formatUnits(vaultEthBalance, 18)} ETH`);
+ console.log(`InceptionOmniVault InETH balance: ${ethers.formatUnits(vaultInETHBalance, 18)} InETH`);
+
+ // 6. Call the sendAssetsInfoToL1 function and capture the emitted event
+ const sendAssetsInfoTx = await inceptionOmniVault.connect(user).sendAssetsInfoToL1(); // Example amounts
+ const receipt = await sendAssetsInfoTx.wait(); // Wait for the transaction to be mined
+
+ // Log the transaction hash of the sendAssetsInfoToL1 call
+ console.log(`Transaction hash of sendAssetsInfoToL1: ${sendAssetsInfoTx.hash}`);
+
+ // Query the logs for AssetsInfoSentToL1 from the CrossChainAdapter
+ const eventLogs = await crossChainAdapter.queryFilter(
+ crossChainAdapter.filters.AssetsInfoSentToL1(),
+ receipt.blockNumber,
+ receipt.blockNumber
+ );
+
+ // Iterate over the found logs and extract relevant event data
+ if (eventLogs.length > 0) {
+ for (const event of eventLogs) {
+ if (event.args && event.args.ticketId) {
+ const ticketId = event.args.ticketId;
+ console.log(`Assets info sent to L1 with ticketId: ${ticketId.toString()}`);
+ } else {
+ console.log("ticketId is undefined or missing from the event arguments.");
+ }
+ }
+ } else {
+ console.log("AssetsInfoSentToL1 event not found in the transaction receipt.");
+ }
+}
+
+main()
+ .then(() => process.exit(0))
+ .catch((error) => {
+ console.error(error);
+ process.exit(1);
+ });
diff --git a/projects/vaults/scripts/stake-vault.ts b/projects/vaults/scripts/stake-vault.ts
new file mode 100644
index 00000000..07f8688d
--- /dev/null
+++ b/projects/vaults/scripts/stake-vault.ts
@@ -0,0 +1,82 @@
+import { ethers } from "hardhat";
+import * as fs from "fs";
+import path from "path";
+
+const checkpointPath = path.join(__dirname, '../../../deployment_checkpoint_optimism-sepolia.json');
+
+async function main() {
+ if (!fs.existsSync(checkpointPath)) {
+ console.error("Deployment checkpoint file not found!");
+ process.exit(1);
+ }
+
+ const checkpoint = JSON.parse(fs.readFileSync(checkpointPath, 'utf8'));
+ const inceptionOmniVaultAddress = checkpoint.InceptionOmniVault;
+ const ratioFeedAddress = checkpoint.InceptionRatioFeed;
+
+ if (!inceptionOmniVaultAddress || !ratioFeedAddress) {
+ console.error("InceptionOmniVault or InceptionRatioFeed address is missing in checkpoint!");
+ process.exit(1);
+ }
+
+ const [signer] = await ethers.getSigners();
+ const inceptionOmniVault = await ethers.getContractAt("InceptionOmniVault", inceptionOmniVaultAddress, signer);
+
+ try {
+ // Check signer balance before deposit attempt
+ const signerBalance = await ethers.provider.getBalance(signer.address);
+ console.log("Signer balance:", ethers.formatEther(signerBalance), "ETH");
+
+ if (signerBalance < ethers.parseEther("0.001")) {
+ console.error("Insufficient balance for the deposit and gas fees. Please fund the account.");
+ process.exit(1);
+ }
+
+ // Check if ratioFeed is set and set if necessary
+ const currentRatioFeed = await inceptionOmniVault.ratioFeed();
+ if (currentRatioFeed === ethers.ZeroAddress) {
+ console.log("Setting ratioFeed on InceptionOmniVault...");
+ const tx = await inceptionOmniVault.setRatioFeed(ratioFeedAddress);
+ await tx.wait();
+ console.log("ratioFeed set to:", ratioFeedAddress);
+ }
+
+ // Check depositBonusAmount
+ const depositBonusAmount = await inceptionOmniVault.depositBonusAmount();
+ console.log("Current depositBonusAmount:", ethers.formatUnits(depositBonusAmount, "ether"));
+
+ // Set target capacity if needed
+ const targetCapacity = await inceptionOmniVault.targetCapacity();
+ const requiredCapacity = ethers.parseUnits("0.001", "ether");
+ if (targetCapacity < requiredCapacity) {
+ const tx = await inceptionOmniVault.setTargetFlashCapacity(requiredCapacity);
+ await tx.wait();
+ console.log(`Target capacity increased to: ${ethers.formatUnits(requiredCapacity, "ether")}`);
+ } else {
+ console.log("Target capacity is already sufficient.");
+ }
+
+ // Check current flash capacity
+ const flashCapacityBefore = await inceptionOmniVault.getFlashCapacity();
+ console.log("Initial Flash Capacity:", ethers.formatUnits(flashCapacityBefore, "ether"));
+
+ // Adjust deposit amount if necessary
+ const depositAmount = ethers.parseUnits("0.001", "ether");
+ if (flashCapacityBefore >= depositAmount) {
+ console.log(`Attempting to deposit ${ethers.formatUnits(depositAmount, "ether")} ETH to mint inception tokens...`);
+ const tx = await inceptionOmniVault.deposit(signer.address, { value: depositAmount });
+ await tx.wait();
+ console.log("Deposit successful.");
+ } else {
+ console.log("Insufficient flash capacity for deposit. Ensure the vault has sufficient ETH or check target capacity.");
+ }
+
+ } catch (error) {
+ console.error("Error interacting with the InceptionOmniVault contract:", error);
+ }
+}
+
+main().catch((error) => {
+ console.error("Error in script execution:", error);
+ process.exit(1);
+});
diff --git a/projects/vaults/scripts/transfer.js b/projects/vaults/scripts/transfer.js
new file mode 100644
index 00000000..f4accabb
--- /dev/null
+++ b/projects/vaults/scripts/transfer.js
@@ -0,0 +1,97 @@
+const { utils, providers, Wallet } = require('ethers')
+const {
+ EthBridger,
+ getL2Network,
+ EthDepositStatus,
+ addDefaultLocalNetwork,
+} = require('@arbitrum/sdk')
+const { parseEther } = utils
+const { arbLog, requireEnvVariables } = require('arb-shared-dependencies')
+require('dotenv').config()
+requireEnvVariables(['INCEPTION_PRIVKEY', 'L1RPC', 'L2RPC'])
+
+/**
+ * Set up: instantiate L1 / L2 wallets connected to providers
+ */
+const walletPrivateKey = process.env.INCEPTION_PRIVKEY
+
+const l1Provider = new providers.JsonRpcProvider(process.env.L1RPC)
+const l2Provider = new providers.JsonRpcProvider(process.env.L2RPC)
+
+const l1Wallet = new Wallet(walletPrivateKey, l1Provider)
+const l2Wallet = new Wallet(walletPrivateKey, l2Provider)
+
+/**
+ * Get the deposit amount from command-line arguments
+ */
+
+const valueToSend = process.argv[2];
+if (valueToSend === null || valueToSend === NaN) {
+ throw new Error('Value parameter is not provided or not a number!');
+}
+const ethToL2DepositAmount = parseEther(valueToSend)
+
+const main = async () => {
+ await arbLog('Deposit Eth via Arbitrum SDK')
+
+ /**
+ * Add the default local network configuration to the SDK
+ * to allow this script to run on a local node
+ */
+ // addDefaultLocalNetwork()
+
+ /**
+ * Use l2Network to create an Arbitrum SDK EthBridger instance
+ * We'll use EthBridger for its convenience methods around transferring ETH to L2
+ */
+
+ const l2Network = await getL2Network(l2Provider)
+ const ethBridger = new EthBridger(l2Network)
+
+ /**
+ * Checks the l2Wallet initial ETH balance
+ */
+ const l2WalletInitialEthBalance = await l2Wallet.getBalance()
+
+ const depositTx = await ethBridger.deposit({
+ amount: ethToL2DepositAmount,
+ l1Signer: l1Wallet,
+ l2Provider: l2Provider,
+ })
+
+ const depositRec = await depositTx.wait()
+ console.warn('deposit L1 receipt is:', depositRec.transactionHash)
+
+ /**
+ * With the transaction confirmed on L1, we now wait for the L2 side (i.e., balance credited to L2) to be confirmed as well.
+ * Here we're waiting for the Sequencer to include the L2 message in its off-chain queue. The Sequencer should include it in under 10 minutes.
+ */
+ console.warn('Waiting for L2 side of the transaction to be executed ⏳')
+ const l2Result = await depositRec.waitForL2(l2Provider)
+ /**
+ * The `complete` boolean tells us if the l1 to l2 message was successful
+ */
+ l2Result.complete
+ ? console.log(
+ `L2 message successful: status: ${EthDepositStatus[await l2Result.message.status()]
+ }`
+ )
+ : console.log(
+ `L2 message failed: status ${EthDepositStatus[await l2Result.message.status()]
+ }`
+ )
+
+ /**
+ * Our l2Wallet ETH balance should be updated now
+ */
+ const l2WalletUpdatedEthBalance = await l2Wallet.getBalance()
+ console.log(
+ `your L2 ETH balance is updated from ${l2WalletInitialEthBalance.toString()} to ${l2WalletUpdatedEthBalance.toString()}`
+ )
+}
+main()
+ .then(() => process.exit(0))
+ .catch(error => {
+ console.error(error)
+ process.exit(1)
+ })
diff --git a/projects/vaults/scripts/update-ratio.ts b/projects/vaults/scripts/update-ratio.ts
new file mode 100644
index 00000000..7c2766c8
--- /dev/null
+++ b/projects/vaults/scripts/update-ratio.ts
@@ -0,0 +1,46 @@
+// updateRatio.js
+const hre = require("hardhat");
+const fs = require("fs");
+const path = require("path");
+
+async function main() {
+ // Load addresses from the JSON file
+ const jsonPath = path.join(__dirname, "../../../deployment_checkpoint_arbitrum-sepolia.json"); // adjust path as necessary
+ const addresses = JSON.parse(fs.readFileSync(jsonPath, "utf8"));
+
+ const inceptionRatioFeedAddress = addresses["InceptionRatioFeed"];
+ const inceptionTokenAddress = addresses["InceptionToken"];
+
+ if (!inceptionRatioFeedAddress || !inceptionTokenAddress) {
+ console.error("Error: InceptionRatioFeed or InceptionToken address missing in JSON file.");
+ process.exit(1);
+ }
+
+ console.log(`Using InceptionRatioFeed at ${inceptionRatioFeedAddress}`);
+ console.log(`Updating ratio for InceptionToken at ${inceptionTokenAddress}`);
+
+ // Connect to InceptionRatioFeed contract
+ const InceptionRatioFeed = await hre.ethers.getContractFactory("InceptionRatioFeed");
+ const inceptionRatioFeed = await InceptionRatioFeed.attach(inceptionRatioFeedAddress);
+
+ // Define new ratio
+ const newRatio = hre.ethers.utils.parseUnits("0.6", 18);
+
+ // Execute updateRatioBatch function
+ try {
+ const tx = await inceptionRatioFeed.updateRatioBatch([inceptionTokenAddress], [newRatio]);
+ console.log("Transaction sent. Waiting for confirmation...");
+ await tx.wait();
+ console.log(`Ratio for InceptionToken updated to ${newRatio.toString()} successfully.`);
+ } catch (error) {
+ console.error("Error updating ratio:", error);
+ }
+}
+
+// Execute the main function
+main()
+ .then(() => process.exit(0))
+ .catch(error => {
+ console.error(error);
+ process.exit(1);
+ });
diff --git a/projects/vaults/scripts/upgrades/upgrade-cross-chain-adapter.ts b/projects/vaults/scripts/upgrades/upgrade-cross-chain-adapter.ts
new file mode 100644
index 00000000..23f99b7e
--- /dev/null
+++ b/projects/vaults/scripts/upgrades/upgrade-cross-chain-adapter.ts
@@ -0,0 +1,67 @@
+import { ethers, upgrades, hardhatArguments } from "hardhat"; // Add this
+import * as fs from 'fs';
+import hre from 'hardhat'; // Import hre
+
+const CHECKPOINT_FILE = "deployment_checkpoint.json";
+
+async function main() {
+ // Load checkpoint data (if it exists)
+ const checkpoint = loadCheckpoint();
+ const existingAddress = checkpoint.CrossChainAdapterArbitrumL2;
+
+ if (!existingAddress) {
+ console.error("CrossChainAdapterArbitrumL2 address not found in checkpoint.");
+ process.exit(1);
+ }
+
+ // Get the contract factory for the upgraded version
+ const CrossChainAdapterArbitrumL2 = await ethers.getContractFactory("CrossChainAdapterArbitrumL2");
+
+ // Check the existing implementation address before upgrading
+ const currentImplementationAddress = await upgrades.erc1967.getImplementationAddress(existingAddress);
+ console.log(`Current implementation address before upgrade: ${currentImplementationAddress}`);
+
+ // Upgrade the contract
+ console.log(`Upgrading CrossChainAdapterArbitrumL2 at address: ${existingAddress}...`);
+ const upgradedContract = await upgrades.upgradeProxy(existingAddress, CrossChainAdapterArbitrumL2);
+
+ // Wait for the upgrade to complete
+ await upgradedContract.waitForDeployment();
+
+ // Check the implementation address after upgrading
+ const newImplementationAddress = await upgrades.erc1967.getImplementationAddress(existingAddress);
+ console.log(`New implementation address after upgrade: ${newImplementationAddress}`);
+
+ // Save the new implementation address to the checkpoint file
+ checkpoint.CrossChainAdapterArbitrumL2 = existingAddress;
+ checkpoint.CrossChainL2AdapterArbitrumImplementationAddress = newImplementationAddress;
+ saveCheckpoint(checkpoint);
+
+ // Log the address of the upgraded contract
+ console.log(`Successfully upgraded CrossChainAdapterArbitrumL2. Proxy address remains: ${existingAddress}`);
+
+ // Verify the new implementation on Etherscan
+ console.log(`Verifying new implementation on Etherscan...`);
+ await hre.run("verify:verify", {
+ address: newImplementationAddress,
+ });
+}
+
+// Load deployment checkpoint
+function loadCheckpoint(): any {
+ if (fs.existsSync(CHECKPOINT_FILE)) {
+ return JSON.parse(fs.readFileSync(CHECKPOINT_FILE, 'utf8'));
+ }
+ return {};
+}
+
+// Save deployment checkpoint
+function saveCheckpoint(checkpoint: any) {
+ fs.writeFileSync(CHECKPOINT_FILE, JSON.stringify(checkpoint, null, 2), 'utf8');
+}
+
+// Execute the script
+main().catch((error) => {
+ console.error(error);
+ process.exitCode = 1;
+});
diff --git a/projects/vaults/scripts/upgrades/upgrade-iov.ts b/projects/vaults/scripts/upgrades/upgrade-iov.ts
new file mode 100644
index 00000000..1aaac0e0
--- /dev/null
+++ b/projects/vaults/scripts/upgrades/upgrade-iov.ts
@@ -0,0 +1,62 @@
+import { ethers, upgrades } from "hardhat";
+import * as fs from 'fs';
+import hre from 'hardhat'; // Import hre
+
+const CHECKPOINT_FILE = "deployment_checkpoint.json";
+
+async function main() {
+ // Load checkpoint data (if it exists)
+ const checkpoint = loadCheckpoint();
+ const existingAddress = checkpoint.InceptionOmniVault;
+
+ if (!existingAddress) {
+ console.error("InceptionOmniVault address not found in checkpoint.");
+ process.exit(1);
+ }
+
+ // Get the contract factory for the upgraded version
+ const InceptionOmniVault = await ethers.getContractFactory("InceptionOmniVault");
+
+ // Check the existing implementation address before upgrading
+ const currentImplementationAddress = await upgrades.erc1967.getImplementationAddress(existingAddress);
+ console.log(`Current implementation address before upgrade: ${currentImplementationAddress}`);
+
+ // Upgrade the contract
+ console.log(`Upgrading InceptionOmniVault at address: ${existingAddress}...`);
+ const upgradedContract = await upgrades.upgradeProxy(existingAddress, InceptionOmniVault);
+
+ // Wait for the upgrade to complete
+ await upgradedContract.waitForDeployment();
+
+ // Wait for the upgrade to complete (using waitForDeployment is incorrect here)
+ console.log("Contract upgraded successfully");
+
+ // Check the implementation address after upgrading
+ const newImplementationAddress = await upgrades.erc1967.getImplementationAddress(existingAddress);
+ console.log(`New implementation address after upgrade: ${newImplementationAddress}`);
+
+ // Log the address of the upgraded contract
+ console.log(`Successfully upgraded InceptionOmniVault. Proxy address remains: ${existingAddress}`);
+
+ // Verify the new implementation on Etherscan
+ console.log(`Verifying new implementation on Etherscan...`);
+ await hre.run("verify:verify", {
+ address: newImplementationAddress,
+ });
+
+
+}
+
+// Load deployment checkpoint
+function loadCheckpoint(): any {
+ if (fs.existsSync(CHECKPOINT_FILE)) {
+ return JSON.parse(fs.readFileSync(CHECKPOINT_FILE, 'utf8'));
+ }
+ return {};
+}
+
+// Execute the script
+main().catch((error) => {
+ console.error(error);
+ process.exitCode = 1;
+});
diff --git a/projects/vaults/tasks/deploy-rate-provider.js b/projects/vaults/tasks/deploy-rate-provider.js
new file mode 100644
index 00000000..c5581773
--- /dev/null
+++ b/projects/vaults/tasks/deploy-rate-provider.js
@@ -0,0 +1,68 @@
+const addressesPath = "./scripts/migration/addresses";
+const { readJsonFiles } = require("./utils");
+
+task("deploy-rate-provider", "Deploys a new RateProvider for a vault")
+ .addParam("vault", "The name of the vault")
+ .setAction(async (taskArgs) => {
+ const inputVaultName = taskArgs["vault"];
+ const vaults = await readJsonFiles(addressesPath);
+ for (const [vaultName, vaultData] of vaults) {
+ if (vaultName == inputVaultName) {
+ const [factoryNameStr, vaultAddress] = await getRateProviderFactory(vaultName, vaultData);
+ await deployRateProvider(factoryNameStr, vaultAddress);
+ }
+ }
+ });
+
+const deployRateProvider = async (factoryNameStr, vaultAddress) => {
+ const RateProviderFactory = await hre.ethers.getContractFactory(factoryNameStr);
+ const rateProvider = await RateProviderFactory.deploy(vaultAddress);
+ await rateProvider.waitForDeployment();
+
+ console.log("RateProvider address: ", (await rateProvider.getAddress()).toString());
+};
+
+const getRateProviderFactory = async (vaultName, vaultData) => {
+ let rateProviderFactory;
+ switch (vaultName) {
+ case "InstEthVault":
+ rateProviderFactory = "InstETHRateProvider";
+ break;
+ case "InrEthVault":
+ rateProviderFactory = "InrETHRateProvider";
+ break;
+ case "InosEthVault":
+ rateProviderFactory = "InosETHRateProvider";
+ break;
+ case "InoEthVault":
+ rateProviderFactory = "InoETHRateProvider";
+ break;
+ case "InankrEthVault":
+ rateProviderFactory = "InankrETHRateProvider";
+ break;
+ case "InwbEthVault":
+ rateProviderFactory = "InwbETHRateProvider";
+ break;
+ case "IncbEthVault":
+ rateProviderFactory = "IncbETHRateProvider";
+ break;
+ case "InswEthVault":
+ rateProviderFactory = "InswETHRateProvider";
+ break;
+ case "InEthxVault":
+ rateProviderFactory = "InETHxRateProvider";
+ break;
+ case "InsfrxEthVault":
+ rateProviderFactory = "InsfrxETHRateProvider";
+ break;
+ case "InmEthVault":
+ rateProviderFactory = "InmETHRateProvider";
+ break;
+ case "InlsEthVault":
+ rateProviderFactory = "InlsETHRateProvider";
+ break;
+ default:
+ console.log("the vault is not supported");
+ }
+ return [rateProviderFactory, vaultData.iVaultAddress];
+};
diff --git a/projects/vaults/test/InceptionERC20OmniVault.js b/projects/vaults/test/InceptionERC20OmniVault.js
new file mode 100644
index 00000000..356e006e
--- /dev/null
+++ b/projects/vaults/test/InceptionERC20OmniVault.js
@@ -0,0 +1,1100 @@
+const { ethers, upgrades } = require("hardhat");
+const { expect } = require("chai");
+const { takeSnapshot } = require("@nomicfoundation/hardhat-network-helpers");
+const { toWei, randomBI, e18, randomBIMax } = require("./helpers/utils");
+BigInt.prototype.format = function () {
+ return this.toLocaleString("de-DE");
+};
+
+let MAX_TARGET_PERCENT;
+
+async function init() {
+ console.log("- Asset");
+ const tokenFactory = await ethers.getContractFactory("stETH");
+ const asset = await upgrades.deployProxy(tokenFactory, ["Lido ETH", "stETH"]);
+ console.log("- iToken");
+ const iTokenFactory = await ethers.getContractFactory("InceptionToken");
+ const iToken = await upgrades.deployProxy(iTokenFactory, ["TEST InceptionLRT Token", "tINt"]);
+ iToken.address = await iToken.getAddress();
+
+ console.log("- Ratio feed");
+ const iRatioFeedFactory = await ethers.getContractFactory("InceptionRatioFeed");
+ const ratioFeed = await upgrades.deployProxy(iRatioFeedFactory, []);
+ await ratioFeed.updateRatioBatch([await iToken.getAddress()], [e18]);
+ ratioFeed.address = await ratioFeed.getAddress();
+
+ console.log("- Omni vault");
+ const iVaultFactory = await ethers.getContractFactory("InOmniVault_E2");
+ const omniVault = await upgrades.deployProxy(iVaultFactory, ["InstEthOmniVault", iToken.address, asset.target]);
+ omniVault.address = await omniVault.getAddress();
+
+ MAX_TARGET_PERCENT = await omniVault.MAX_TARGET_PERCENT();
+
+ await omniVault.setRatioFeed(ratioFeed.address);
+ await iToken.setVault(omniVault.address);
+
+ return [asset, iToken, omniVault, ratioFeed];
+}
+
+describe("InceptionOmniVault: ERC20", function () {
+ this.timeout(150000);
+ let asset, omniVault, iToken, ratioFeed;
+ let owner, iVaultOperator, staker1, staker2, staker3, treasury;
+ let snapshot;
+ let TARGET;
+
+ before(async function () {
+ [owner, iVaultOperator, staker1, staker2, staker3] = await ethers.getSigners();
+ [asset, iToken, omniVault, ratioFeed] = await init();
+ treasury = await omniVault.treasuryAddress();
+
+ const reallyBigInt = ethers.MaxUint256 / 10n;
+ await asset.mint(staker1.address, reallyBigInt);
+ await asset.mint(staker2.address, reallyBigInt);
+ await asset.mint(staker3.address, reallyBigInt);
+ await asset.connect(staker1).approve(omniVault.address, reallyBigInt);
+ await asset.connect(staker2).approve(omniVault.address, reallyBigInt);
+ await asset.connect(staker3).approve(omniVault.address, reallyBigInt);
+
+ snapshot = await takeSnapshot();
+ });
+
+ describe("Base flow", function () {
+ let deposited, freeBalance, depositFees;
+
+ before(async function () {
+ await snapshot.restore();
+ TARGET = toWei(10);
+ await omniVault.setTargetFlashCapacity(TARGET);
+ });
+
+ it("Initial ratio", async function () {
+ const ratio = await omniVault.ratio();
+ console.log(`Initial ratio:\t\t${ratio.format()}`);
+ });
+
+ it("Deposit to vault", async function () {
+ freeBalance = randomBI(19);
+ deposited = TARGET + freeBalance;
+ const expectedShares = (deposited * e18) / (await omniVault.ratio());
+ const tx = await omniVault.connect(staker1).deposit(deposited, staker1.address);
+ const receipt = await tx.wait();
+ const events = receipt.logs?.filter(e => e.eventName === "Deposit");
+ expect(events.length).to.be.eq(1);
+ expect(events[0].args["sender"]).to.be.eq(staker1.address);
+ expect(events[0].args["receiver"]).to.be.eq(staker1.address);
+ expect(events[0].args["amount"]).to.be.eq(deposited);
+ expect(events[0].args["iShares"]).to.be.closeTo(expectedShares, 1n);
+ expect(receipt.logs.find(l => l.eventName === "DepositBonus")).to.be.undefined; //Because there is no replenish rewards has been collected yet
+ console.log(`Ratio after:\t\t${(await omniVault.ratio()).format()}`);
+
+ expect(await iToken.balanceOf(staker1.address)).to.be.closeTo(expectedShares, 1n);
+ expect(await omniVault.totalAssets()).to.be.eq(deposited);
+ expect(await omniVault.getFlashCapacity()).to.be.eq(deposited);
+ expect(await omniVault.ratio()).to.be.eq(e18);
+ });
+
+ it("Flash withdraw all", async function () {
+ const sharesBefore = await iToken.balanceOf(staker1);
+ const senderBalanceBefore = await asset.balanceOf(staker1);
+ const receiver = staker2;
+ const receiverBalanceBefore = await asset.balanceOf(receiver);
+ const treasuryBalanceBefore = await asset.balanceOf(owner);
+ const totalAssetsBefore = await omniVault.totalAssets();
+ const flashCapacityBefore = await omniVault.getFlashCapacity();
+ console.log(`Flash capacity before:\t${flashCapacityBefore.format()}`);
+
+ const amount = await omniVault.convertToAssets(sharesBefore);
+ const expectedFee = await omniVault.calculateFlashWithdrawFee(amount);
+ console.log(`Amount:\t\t\t\t\t${amount.format()}`);
+ console.log(`Shares:\t\t\t\t\t${sharesBefore.format()}`);
+ console.log(`Expected fee:\t\t\t${expectedFee.format()}`);
+
+ let tx = await omniVault.connect(staker1).flashWithdraw(sharesBefore, receiver.address);
+ const receipt = await tx.wait();
+ const withdrawEvent = receipt.logs?.filter(e => e.eventName === "FlashWithdraw");
+ expect(withdrawEvent.length).to.be.eq(1);
+ expect(withdrawEvent[0].args["sender"]).to.be.eq(staker1.address);
+ expect(withdrawEvent[0].args["receiver"]).to.be.eq(receiver.address);
+ expect(withdrawEvent[0].args["owner"]).to.be.eq(staker1.address);
+ expect(withdrawEvent[0].args["amount"]).to.be.closeTo(amount - expectedFee, 1n);
+ expect(withdrawEvent[0].args["iShares"]).to.be.closeTo(sharesBefore, 1n);
+ expect(withdrawEvent[0].args["fee"]).to.be.closeTo(expectedFee, 1n);
+ const collectedFees = withdrawEvent[0].args["fee"];
+ depositFees = collectedFees / 2n;
+
+ const sharesAfter = await iToken.balanceOf(staker1);
+ const senderBalanceAfter = await asset.balanceOf(staker1);
+ const receiverBalanceAfter = await asset.balanceOf(receiver);
+ const treasuryBalanceAfter = await asset.balanceOf(owner);
+ const totalAssetsAfter = await omniVault.totalAssets();
+ const flashCapacityAfter = await omniVault.getFlashCapacity();
+ console.log(`Shares balance diff:\t${(sharesBefore - sharesAfter).format()}`);
+ console.log(`Sender balance diff:\t${(senderBalanceBefore - senderBalanceAfter).format()}`);
+ console.log(`Receiver balance diff:\t${(receiverBalanceAfter - receiverBalanceBefore).format()}`);
+ console.log(`Treasury balance diff:\t${(treasuryBalanceAfter - treasuryBalanceBefore).format()}`);
+ console.log(`Total assets diff:\t\t${(totalAssetsBefore - totalAssetsAfter).format()}`);
+ console.log(`Flash capacity diff:\t${(flashCapacityBefore - flashCapacityAfter).format()}`);
+ console.log(`Fee collected:\t\t\t${collectedFees.format()}`);
+
+ expect(sharesBefore - sharesAfter).to.be.eq(sharesBefore);
+ expect(receiverBalanceAfter - receiverBalanceBefore).to.be.closeTo(amount - expectedFee, 1n);
+ expect(treasuryBalanceAfter - treasuryBalanceBefore).to.be.closeTo(expectedFee / 2n, 1n);
+ expect(totalAssetsBefore - totalAssetsAfter).to.be.closeTo(amount - expectedFee / 2n, 1n);
+ expect(flashCapacityBefore - flashCapacityAfter).to.be.closeTo(amount, 1n);
+ });
+ });
+
+ describe("Deposit", function () {
+ let TARGET;
+
+ beforeEach(async function () {
+ await snapshot.restore();
+ TARGET = toWei(10);
+ await omniVault.setTargetFlashCapacity(TARGET);
+ });
+
+ const args = [
+ {
+ name: "1st time < TARGET",
+ predepositAmount: () => 0n,
+ amount: async () => TARGET / 2n,
+ withdrawFeeFrom: () => 0n,
+ receiver: () => staker1.address,
+ },
+ {
+ name: "1st time > TARGET",
+ predepositAmount: () => 0n,
+ amount: async () => randomBIMax(TARGET),
+ withdrawFeeFrom: () => 0n,
+ receiver: () => staker1.address,
+ },
+ {
+ name: "more wo rewards",
+ predepositAmount: () => TARGET / 3n,
+ amount: async () => randomBIMax(TARGET / 3n),
+ withdrawFeeFrom: () => 0n,
+ receiver: () => staker1.address,
+ },
+ {
+ name: "more with rewards",
+ predepositAmount: () => TARGET / 3n,
+ amount: async () => randomBIMax(TARGET / 3n),
+ withdrawFeeFrom: () => TARGET,
+ receiver: () => staker1.address,
+ },
+ {
+ name: "min amount",
+ predepositAmount: () => 0n,
+ amount: async () => await omniVault.minAmount(),
+ withdrawFeeFrom: () => TARGET,
+ receiver: () => staker1.address,
+ },
+ {
+ name: "and redeem all rewards",
+ predepositAmount: () => TARGET / 10n,
+ amount: async () => (TARGET * 8n) / 10n,
+ withdrawFeeFrom: () => TARGET / 10n,
+ receiver: () => staker1.address,
+ },
+ {
+ name: "up to target cap and above",
+ predepositAmount: () => TARGET / 10n,
+ amount: async () => TARGET,
+ withdrawFeeFrom: () => TARGET / 2n,
+ receiver: () => staker1.address,
+ },
+ {
+ name: "above target cap",
+ predepositAmount: () => TARGET + 1n,
+ amount: async () => randomBI(19),
+ withdrawFeeFrom: () => TARGET,
+ receiver: () => staker1.address,
+ },
+ {
+ name: "to another address",
+ predepositAmount: () => TARGET / 10n,
+ amount: async () => TARGET,
+ withdrawFeeFrom: () => TARGET,
+ receiver: () => staker2.address,
+ },
+
+ //Ratio < 1
+ {
+ name: "more wo rewards when ratio < 1",
+ predepositAmount: () => TARGET / 3n,
+ amount: async () => randomBIMax(TARGET / 3n),
+ withdrawFeeFrom: () => 0n,
+ ratio: toWei(0.9),
+ receiver: () => staker1.address,
+ },
+ {
+ name: "more with rewards when ratio < 1",
+ predepositAmount: () => TARGET / 3n,
+ amount: async () => randomBIMax(TARGET / 3n),
+ withdrawFeeFrom: () => TARGET,
+ ratio: toWei(0.9),
+ receiver: () => staker1.address,
+ },
+ {
+ name: "min amount when ratio < 1",
+ predepositAmount: () => 0n,
+ amount: async () => await omniVault.minAmount(),
+ withdrawFeeFrom: () => TARGET,
+ ratio: toWei(0.9),
+ receiver: () => staker1.address,
+ },
+ ];
+
+ async function addReplenishBonus(amount) {
+ let collectedFee = 0n;
+ if (amount > 0n) {
+ await omniVault.connect(staker3).deposit(amount, staker3.address);
+ const shares = await iToken.balanceOf(staker3.address);
+ const tx = await omniVault.connect(staker3).flashWithdraw(shares, staker3.address);
+ const rec = await tx.wait();
+ collectedFee += (rec.logs.find(l => l.eventName === "FlashWithdraw")?.args.fee || 0n) / 2n;
+ console.log(`collectedFee: ${collectedFee.format()}`);
+ }
+ return collectedFee;
+ }
+
+ args.forEach(function (arg) {
+ it(`Deposit ${arg.name}`, async function () {
+ //Predeposit
+ const predepositAmount = arg.predepositAmount();
+ if (predepositAmount > 0n) {
+ const randomAddress = ethers.Wallet.createRandom().address;
+ await omniVault.connect(staker3).deposit(predepositAmount, randomAddress);
+ expect(await omniVault.getFlashCapacity()).to.be.closeTo(predepositAmount, 2n);
+ }
+
+ //Add rewards
+ let availableBonus = await addReplenishBonus(arg.withdrawFeeFrom());
+
+ if (arg.ratio) {
+ await ratioFeed.updateRatioBatch([await iToken.getAddress()], [arg.ratio]);
+ console.log(`Ratio updated:\t\t\t${(await omniVault.ratio()).format()}`);
+ }
+
+ const receiver = arg.receiver();
+ const stakerSharesBefore = await iToken.balanceOf(receiver);
+ const totalAssetsBefore = await omniVault.totalAssets();
+ const flashCapacityBefore = await omniVault.getFlashCapacity();
+ console.log(`Flash capacity before:\t${flashCapacityBefore.format()}`);
+
+ const amount = await arg.amount();
+ console.log(`Amount:\t\t\t\t\t${amount.format()}`);
+ const calculatedBonus = await omniVault.calculateDepositBonus(amount);
+ console.log(`Preview bonus:\t\t\t${calculatedBonus.format()}`);
+ console.log(`Available bonus:\t\t${availableBonus.format()}`);
+ const expectedBonus = calculatedBonus <= availableBonus ? calculatedBonus : availableBonus;
+ availableBonus -= expectedBonus;
+ console.log(`Expected bonus:\t\t\t${expectedBonus.format()}`);
+ const convertedShares = await omniVault.convertToShares(amount + expectedBonus);
+ const expectedShares = ((amount + expectedBonus) * (await omniVault.ratio())) / e18;
+
+ const tx = await omniVault.connect(staker1).deposit(amount, receiver);
+ const receipt = await tx.wait();
+ const depositEvent = receipt.logs?.filter(e => e.eventName === "Deposit");
+ expect(depositEvent.length).to.be.eq(1);
+ expect(depositEvent[0].args["sender"]).to.be.eq(staker1.address);
+ expect(depositEvent[0].args["receiver"]).to.be.eq(receiver);
+ expect(depositEvent[0].args["amount"]).to.be.eq(amount);
+ expect(depositEvent[0].args["iShares"]).to.be.closeTo(convertedShares, 1n);
+ //DepositBonus event
+ const actualBonus = receipt.logs.find(l => l.eventName === "DepositBonus")?.args.amount || 0n;
+ console.log(`Actual bonus:\t\t\t${actualBonus.format()}`);
+
+ const stakerSharesAfter = await iToken.balanceOf(receiver);
+ const totalAssetsAfter = await omniVault.totalAssets();
+ const flashCapacityAfter = await omniVault.getFlashCapacity();
+ console.log(`Bonus after:\t\t\t${availableBonus.format()}`);
+
+ expect(stakerSharesAfter - stakerSharesBefore).to.be.closeTo(expectedShares, 1n);
+ expect(stakerSharesAfter - stakerSharesBefore).to.be.closeTo(convertedShares, 1n);
+ expect(totalAssetsAfter - totalAssetsBefore).to.be.eq(amount); //omniVault balance is the same
+ expect(actualBonus).to.be.closeTo(expectedBonus, 1n);
+ expect(flashCapacityAfter - flashCapacityBefore).to.be.closeTo(amount + expectedBonus, 1n); //rewarded bonus goes to flash capacity
+ });
+ });
+
+ const invalidArgs = [
+ {
+ name: "amount is 0",
+ amount: async () => 0n,
+ receiver: () => staker1.address,
+ customError: "LowerMinAmount",
+ },
+ {
+ name: "amount < min",
+ amount: async () => (await omniVault.minAmount()) - 1n,
+ receiver: () => staker1.address,
+ customError: "LowerMinAmount",
+ },
+ {
+ name: "to zero address",
+ amount: async () => randomBI(18),
+ receiver: () => ethers.ZeroAddress,
+ customError: "NullParams",
+ },
+ ];
+
+ invalidArgs.forEach(function (arg) {
+ it(`Reverts when deposit ${arg.name}`, async function () {
+ const amount = await arg.amount();
+ const receiver = arg.receiver();
+ if (arg.customError) {
+ await expect(omniVault.connect(staker1).deposit(amount, receiver)).to.be.revertedWithCustomError(
+ omniVault,
+ arg.customError,
+ );
+ } else {
+ await expect(omniVault.connect(staker1).deposit(amount, receiver)).to.be.revertedWith(arg.error);
+ }
+ });
+ });
+
+ it("Reverts when omniVault is paused", async function () {
+ await omniVault.pause();
+ const depositAmount = randomBI(19);
+ await expect(omniVault.connect(staker1).deposit(depositAmount, staker1.address)).to.be.revertedWithCustomError(
+ omniVault,
+ "EnforcedPause",
+ );
+ await omniVault.unpause();
+ });
+
+ it("Reverts when shares is 0", async function () {
+ await omniVault.setMinAmount(0n);
+ await expect(omniVault.connect(staker1).deposit(0n, staker1.address)).to.be.revertedWithCustomError(
+ omniVault,
+ "DepositInconsistentResultedState",
+ );
+ });
+ });
+
+ describe("Deposit bonus params setter and calculation", function () {
+ let TARGET, MAX_PERCENT, localSnapshot;
+ before(async function () {
+ MAX_PERCENT = await omniVault.MAX_PERCENT();
+ });
+
+ const depositBonusSegment = [
+ {
+ fromUtilization: async () => 0n,
+ fromPercent: async () => await omniVault.maxBonusRate(),
+ toUtilization: async () => await omniVault.depositUtilizationKink(),
+ toPercent: async () => await omniVault.optimalBonusRate(),
+ },
+ {
+ fromUtilization: async () => await omniVault.depositUtilizationKink(),
+ fromPercent: async () => await omniVault.optimalBonusRate(),
+ toUtilization: async () => await omniVault.MAX_PERCENT(),
+ toPercent: async () => await omniVault.optimalBonusRate(),
+ },
+ {
+ fromUtilization: async () => await omniVault.MAX_PERCENT(),
+ fromPercent: async () => 0n,
+ toUtilization: async () => ethers.MaxUint256,
+ toPercent: async () => 0n,
+ },
+ ];
+
+ const args = [
+ {
+ name: "Normal bonus rewards profile > 0",
+ newMaxBonusRate: BigInt(2 * 10 ** 8), //2%
+ newOptimalBonusRate: BigInt(0.2 * 10 ** 8), //0.2%
+ newDepositUtilizationKink: BigInt(25 * 10 ** 8), //25%
+ },
+ {
+ name: "Optimal utilization = 0 => always optimal rate",
+ newMaxBonusRate: BigInt(2 * 10 ** 8),
+ newOptimalBonusRate: BigInt(10 ** 8), //1%
+ newDepositUtilizationKink: 0n,
+ },
+ {
+ name: "Optimal bonus rate = 0",
+ newMaxBonusRate: BigInt(2 * 10 ** 8),
+ newOptimalBonusRate: 0n,
+ newDepositUtilizationKink: BigInt(25 * 10 ** 8),
+ },
+ {
+ name: "Optimal bonus rate = max > 0 => rate is constant over utilization",
+ newMaxBonusRate: BigInt(2 * 10 ** 8),
+ newOptimalBonusRate: BigInt(2 * 10 ** 8),
+ newDepositUtilizationKink: BigInt(25 * 10 ** 8),
+ },
+ {
+ name: "Optimal bonus rate = max = 0 => no bonus",
+ newMaxBonusRate: 0n,
+ newOptimalBonusRate: 0n,
+ newDepositUtilizationKink: BigInt(25 * 10 ** 8),
+ },
+ //Will fail when OptimalBonusRate > MaxBonusRate
+ ];
+
+ const amounts = [
+ {
+ name: "min amount from 0",
+ flashCapacity: () => 0n,
+ amount: async () => (await omniVault.convertToAssets(await omniVault.minAmount())) + 1n,
+ },
+ {
+ name: "1 wei from 0",
+ flashCapacity: () => 0n,
+ amount: async () => 1n,
+ },
+ {
+ name: "from 0 to 25% of TARGET",
+ flashCapacity: () => 0n,
+ amount: async () => (TARGET * 25n) / 100n,
+ },
+ {
+ name: "from 0 to 25% + 1wei of TARGET",
+ flashCapacity: () => 0n,
+ amount: async () => (TARGET * 25n) / 100n,
+ },
+ {
+ name: "from 25% to 100% of TARGET",
+ flashCapacity: () => (TARGET * 25n) / 100n,
+ amount: async () => (TARGET * 75n) / 100n,
+ },
+ {
+ name: "from 0% to 100% of TARGET",
+ flashCapacity: () => 0n,
+ amount: async () => TARGET,
+ },
+ {
+ name: "from 0% to 200% of TARGET",
+ flashCapacity: () => 0n,
+ amount: async () => TARGET * 2n,
+ },
+ ];
+
+ args.forEach(function (arg) {
+ it(`setDepositBonusParams: ${arg.name}`, async function () {
+ await snapshot.restore();
+ TARGET = e18;
+ await omniVault.connect(owner).setTargetFlashCapacity(TARGET);
+
+ await expect(
+ omniVault.setDepositBonusParams(arg.newMaxBonusRate, arg.newOptimalBonusRate, arg.newDepositUtilizationKink),
+ )
+ .to.emit(omniVault, "DepositBonusParamsChanged")
+ .withArgs(arg.newMaxBonusRate, arg.newOptimalBonusRate, arg.newDepositUtilizationKink);
+
+ expect(await omniVault.maxBonusRate()).to.be.eq(arg.newMaxBonusRate);
+ expect(await omniVault.optimalBonusRate()).to.be.eq(arg.newOptimalBonusRate);
+ expect(await omniVault.depositUtilizationKink()).to.be.eq(arg.newDepositUtilizationKink);
+ localSnapshot = await takeSnapshot();
+ });
+
+ amounts.forEach(function (amount) {
+ it(`calculateDepositBonus for ${amount.name}`, async function () {
+ await localSnapshot.restore();
+ let flashCapacity = amount.flashCapacity();
+ if (flashCapacity > 0n) {
+ await omniVault.connect(staker1).deposit(flashCapacity, staker1.address);
+ }
+ let _amount = await amount.amount();
+ let depositBonus = 0n;
+ while (_amount > 0n) {
+ for (const feeFunc of depositBonusSegment) {
+ const utilization = (flashCapacity * MAX_PERCENT) / TARGET;
+ const fromUtilization = await feeFunc.fromUtilization();
+ const toUtilization = await feeFunc.toUtilization();
+ if (_amount > 0n && fromUtilization <= utilization && utilization < toUtilization) {
+ const fromPercent = await feeFunc.fromPercent();
+ const toPercent = await feeFunc.toPercent();
+ const upperBound = (toUtilization * TARGET) / MAX_PERCENT;
+ const replenished = upperBound > flashCapacity + _amount ? _amount : upperBound - flashCapacity;
+ const slope = ((toPercent - fromPercent) * MAX_PERCENT) / (toUtilization - fromUtilization);
+ const bonusPercent = fromPercent + (slope * (flashCapacity + replenished / 2n)) / TARGET;
+ const bonus = (replenished * bonusPercent) / MAX_PERCENT;
+ console.log(`Replenished:\t\t\t${replenished.format()}`);
+ console.log(`Bonus percent:\t\t\t${bonusPercent.format()}`);
+ console.log(`Bonus:\t\t\t\t\t${bonus.format()}`);
+ flashCapacity += replenished;
+ _amount -= replenished;
+ depositBonus += bonus;
+ }
+ }
+ }
+ let contractBonus = await omniVault.calculateDepositBonus(await amount.amount());
+ console.log(`Expected deposit bonus:\t${depositBonus.format()}`);
+ console.log(`Contract deposit bonus:\t${contractBonus.format()}`);
+ expect(contractBonus).to.be.closeTo(depositBonus, 1n);
+ });
+ });
+ });
+
+ const invalidArgs = [
+ {
+ name: "MaxBonusRate > MAX_PERCENT",
+ newMaxBonusRate: () => MAX_PERCENT + 1n,
+ newOptimalBonusRate: () => BigInt(0.2 * 10 ** 8), //0.2%
+ newDepositUtilizationKink: () => BigInt(25 * 10 ** 8),
+ customError: "ParameterExceedsLimits",
+ },
+ {
+ name: "OptimalBonusRate > MAX_PERCENT",
+ newMaxBonusRate: () => BigInt(2 * 10 ** 8),
+ newOptimalBonusRate: () => MAX_PERCENT + 1n,
+ newDepositUtilizationKink: () => BigInt(25 * 10 ** 8),
+ customError: "ParameterExceedsLimits",
+ },
+ {
+ name: "DepositUtilizationKink > MAX_PERCENT",
+ newMaxBonusRate: () => BigInt(2 * 10 ** 8),
+ newOptimalBonusRate: () => BigInt(0.2 * 10 ** 8), //0.2%
+ newDepositUtilizationKink: () => MAX_PERCENT + 1n,
+ customError: "ParameterExceedsLimits",
+ },
+ ];
+ invalidArgs.forEach(function (arg) {
+ it(`setDepositBonusParams reverts when ${arg.name}`, async function () {
+ await expect(
+ omniVault.setDepositBonusParams(
+ arg.newMaxBonusRate(),
+ arg.newOptimalBonusRate(),
+ arg.newDepositUtilizationKink(),
+ ),
+ ).to.be.revertedWithCustomError(omniVault, arg.customError);
+ });
+ });
+
+ it("setDepositBonusParams reverts when caller is not an owner", async function () {
+ await expect(
+ omniVault
+ .connect(staker1)
+ .setDepositBonusParams(BigInt(2 * 10 ** 8), BigInt(0.2 * 10 ** 8), BigInt(25 * 10 ** 8)),
+ ).to.be.revertedWithCustomError(omniVault, "OwnableUnauthorizedAccount");
+ });
+ });
+
+ describe("Flash withdraw", function () {
+ let TARGET, ratio;
+ beforeEach(async function () {
+ await snapshot.restore();
+ TARGET = toWei(10);
+ await omniVault.setTargetFlashCapacity(TARGET);
+ });
+
+ const args = [
+ {
+ name: "some amount when capacity > TARGET",
+ poolCapacity: () => TARGET * 2n,
+ amount: async () => randomBIMax(TARGET / 2n),
+ receiver: () => staker1,
+ },
+ {
+ name: "all capacity above TARGET",
+ poolCapacity: () => TARGET * 2n,
+ amount: async () => (await omniVault.getFlashCapacity()) - TARGET,
+ receiver: () => staker1,
+ },
+ {
+ name: "all when pool capacity > TARGET",
+ poolCapacity: () => TARGET + e18,
+ amount: async () => await omniVault.getFlashCapacity(),
+ receiver: () => staker1,
+ },
+ {
+ name: "partially when pool capacity = TARGET",
+ poolCapacity: () => TARGET,
+ amount: async () => (await omniVault.getFlashCapacity()) / 2n,
+ receiver: () => staker1,
+ },
+ {
+ name: "all when pool capacity = TARGET",
+ poolCapacity: () => TARGET,
+ amount: async () => await omniVault.getFlashCapacity(),
+ receiver: () => staker1,
+ },
+ {
+ name: "partially when pool capacity < TARGET",
+ poolCapacity: () => (TARGET * 3n) / 4n,
+ amount: async () => (await omniVault.getFlashCapacity()) / 2n,
+ receiver: () => staker1,
+ },
+ {
+ name: "all when pool capacity < TARGET",
+ poolCapacity: () => (TARGET * 3n) / 4n,
+ amount: async () => await omniVault.getFlashCapacity(),
+ receiver: () => staker1,
+ },
+ {
+ name: "to another address",
+ poolCapacity: () => (TARGET * 3n) / 4n,
+ amount: async () => (await omniVault.getFlashCapacity()) / 2n,
+ receiver: () => staker2,
+ },
+ ];
+
+ args.forEach(function (arg) {
+ it(`flashWithdraw: ${arg.name}`, async function () {
+ ratio = toWei(0.8);
+ await ratioFeed.updateRatioBatch([iToken.address], [ratio]);
+ //Deposit
+ const predepositAmount = arg.poolCapacity();
+ await omniVault.connect(staker1).deposit(predepositAmount, staker1.address);
+
+ //flashWithdraw
+ const ratioBefore = await omniVault.ratio();
+ console.log(`Ratio before:\t\t\t${ratioBefore.format()}`);
+
+ const receiver = await arg.receiver();
+ const sharesBefore = await iToken.balanceOf(staker1);
+ const assetBalanceBefore = await asset.balanceOf(receiver);
+ const treasuryBalanceBefore = await asset.balanceOf(treasury);
+ const totalAssetsBefore = await omniVault.totalAssets();
+ const flashCapacityBefore = await omniVault.getFlashCapacity();
+ console.log(`Flash capacity before:\t${flashCapacityBefore.format()}`);
+
+ const amount = await arg.amount();
+ const shares = await omniVault.convertToShares(amount);
+ const expectedFee = await omniVault.calculateFlashWithdrawFee(amount);
+ console.log(`Expected fee:\t\t\t${expectedFee.format()}`);
+
+ let tx = await omniVault.connect(staker1).flashWithdraw(shares, receiver.address);
+ const receipt = await tx.wait();
+ const withdrawEvent = receipt.logs?.filter(e => e.eventName === "FlashWithdraw");
+ expect(withdrawEvent.length).to.be.eq(1);
+ expect(withdrawEvent[0].args["sender"]).to.be.eq(staker1.address);
+ expect(withdrawEvent[0].args["receiver"]).to.be.eq(receiver.address);
+ expect(withdrawEvent[0].args["owner"]).to.be.eq(staker1.address);
+ expect(withdrawEvent[0].args["amount"]).to.be.closeTo(amount - expectedFee, 1n);
+ expect(withdrawEvent[0].args["iShares"]).to.be.closeTo(shares, 1n);
+ const actualFee = withdrawEvent[0].args["fee"];
+ console.log(`Actual fee:\t\t\t\t${actualFee.format()}`);
+
+ const sharesAfter = await iToken.balanceOf(staker1);
+ const assetBalanceAfter = await asset.balanceOf(receiver);
+ const treasuryBalanceAfter = await asset.balanceOf(treasury);
+ const totalAssetsAfter = await omniVault.totalAssets();
+ const flashCapacityAfter = await omniVault.getFlashCapacity();
+ console.log(`Shares diff:\t\t\t${(sharesBefore - sharesAfter).format()}`);
+ console.log(`Receiver balance diff:\t${(assetBalanceAfter - assetBalanceBefore).format()}`);
+ console.log(`TotalAssets diff:\t\t${(totalAssetsBefore - totalAssetsAfter).format()}`);
+ console.log(`Flash capacity diff:\t${(flashCapacityBefore - flashCapacityAfter).format()}`);
+
+ expect(sharesBefore - sharesAfter).to.be.eq(shares);
+ expect(assetBalanceAfter - assetBalanceBefore).to.be.closeTo(amount - expectedFee, 1n);
+ expect(actualFee).to.be.closeTo(expectedFee, 1n);
+ expect(treasuryBalanceAfter - treasuryBalanceBefore).to.be.closeTo(expectedFee / 2n, 1n);
+ expect(totalAssetsBefore - totalAssetsAfter).to.be.closeTo(amount - expectedFee / 2n, 2n);
+ expect(flashCapacityBefore - flashCapacityAfter).to.be.closeTo(amount, 1n);
+ });
+ });
+
+ it("Reverts when capacity is not sufficient", async function () {
+ await omniVault.connect(staker1).deposit(toWei(1), staker1.address);
+ ratio = toWei(0.8);
+ await ratioFeed.updateRatioBatch([iToken.address], [ratio]);
+ const shares = await iToken.balanceOf(staker1.address);
+ const capacity = await omniVault.getFlashCapacity();
+ await expect(omniVault.connect(staker1).flashWithdraw(shares, staker1.address))
+ .to.be.revertedWithCustomError(omniVault, "InsufficientCapacity")
+ .withArgs(capacity);
+ });
+
+ it("Reverts when amount < min", async function () {
+ await omniVault.connect(staker1).deposit(toWei(1), staker1.address);
+ const minAmount = await omniVault.minAmount();
+ const shares = (await omniVault.convertToShares(minAmount)) - 1n;
+ await expect(omniVault.connect(staker1).flashWithdraw(shares, staker1.address))
+ .to.be.revertedWithCustomError(omniVault, "LowerMinAmount")
+ .withArgs(minAmount);
+ });
+
+ it("Reverts when omniVault is paused", async function () {
+ await omniVault.connect(staker1).deposit(toWei(1), staker1.address);
+ await omniVault.pause();
+ const shares = await iToken.balanceOf(staker1.address);
+ await expect(
+ omniVault.connect(staker1).flashWithdraw(shares / 2n, staker1.address),
+ ).to.be.revertedWithCustomError(omniVault, "EnforcedPause");
+ });
+
+ it("Reverts when withdraws to 0 address", async function () {
+ await omniVault.connect(staker1).deposit(toWei(1), staker1.address);
+ const shares = await iToken.balanceOf(staker1.address);
+ await expect(
+ omniVault.connect(staker1).flashWithdraw(shares / 2n, ethers.ZeroAddress),
+ ).to.be.revertedWithCustomError(omniVault, "NullParams");
+ });
+
+ it("Reverts when shares = 0", async function () {
+ await omniVault.connect(staker1).deposit(toWei(1), staker1.address);
+ await expect(omniVault.connect(staker1).flashWithdraw(0n, staker1.address)).to.be.revertedWithCustomError(
+ omniVault,
+ "NullParams",
+ );
+ });
+ });
+
+ describe("Withdraw fee params setter and calculation", function () {
+ let TARGET, MAX_PERCENT, localSnapshot;
+ before(async function () {
+ MAX_PERCENT = await omniVault.MAX_PERCENT();
+ });
+
+ const withdrawFeeSegment = [
+ {
+ fromUtilization: async () => 0n,
+ fromPercent: async () => await omniVault.maxFlashFeeRate(),
+ toUtilization: async () => await omniVault.withdrawUtilizationKink(),
+ toPercent: async () => await omniVault.optimalWithdrawalRate(),
+ },
+ {
+ fromUtilization: async () => await omniVault.withdrawUtilizationKink(),
+ fromPercent: async () => await omniVault.optimalWithdrawalRate(),
+ toUtilization: async () => await omniVault.MAX_PERCENT(),
+ toPercent: async () => await omniVault.optimalWithdrawalRate(),
+ },
+ {
+ fromUtilization: async () => await omniVault.MAX_PERCENT(),
+ fromPercent: async () => 0n,
+ toUtilization: async () => ethers.MaxUint256,
+ toPercent: async () => 0n,
+ },
+ ];
+
+ const args = [
+ {
+ name: "Normal withdraw fee profile > 0",
+ newMaxFlashFeeRate: BigInt(2 * 10 ** 8), //2%
+ newOptimalWithdrawalRate: BigInt(0.2 * 10 ** 8), //0.2%
+ newWithdrawUtilizationKink: BigInt(25 * 10 ** 8),
+ },
+ {
+ name: "Optimal utilization = 0 => always optimal rate",
+ newMaxFlashFeeRate: BigInt(2 * 10 ** 8),
+ newOptimalWithdrawalRate: BigInt(10 ** 8), //1%
+ newWithdrawUtilizationKink: 0n,
+ },
+ {
+ name: "Optimal withdraw rate = 0",
+ newMaxFlashFeeRate: BigInt(2 * 10 ** 8),
+ newOptimalWithdrawalRate: 0n,
+ newWithdrawUtilizationKink: BigInt(25 * 10 ** 8),
+ },
+ {
+ name: "Optimal withdraw rate = max > 0 => rate is constant over utilization",
+ newMaxFlashFeeRate: BigInt(2 * 10 ** 8),
+ newOptimalWithdrawalRate: BigInt(2 * 10 ** 8),
+ newWithdrawUtilizationKink: BigInt(25 * 10 ** 8),
+ },
+ {
+ name: "Optimal withdraw rate = max = 0 => no fee",
+ newMaxFlashFeeRate: 0n,
+ newOptimalWithdrawalRate: 0n,
+ newWithdrawUtilizationKink: BigInt(25 * 10 ** 8),
+ },
+ //Will fail when optimalWithdrawalRate > MaxFlashFeeRate
+ ];
+
+ const amounts = [
+ {
+ name: "from 200% to 0% of TARGET",
+ flashCapacity: targetCapacity => targetCapacity * 2n,
+ amount: async () => await omniVault.getFlashCapacity(),
+ },
+ {
+ name: "from 100% to 0% of TARGET",
+ flashCapacity: targetCapacity => targetCapacity,
+ amount: async () => await omniVault.getFlashCapacity(),
+ },
+ {
+ name: "1 wei from 100%",
+ flashCapacity: targetCapacity => targetCapacity,
+ amount: async () => 1n,
+ },
+ {
+ name: "min amount from 100%",
+ flashCapacity: targetCapacity => targetCapacity,
+ amount: async () => (await omniVault.convertToAssets(await omniVault.minAmount())) + 1n,
+ },
+ {
+ name: "from 100% to 25% of TARGET",
+ flashCapacity: targetCapacity => targetCapacity,
+ amount: async () => (TARGET * 75n) / 100n,
+ },
+ {
+ name: "from 100% to 25% - 1wei of TARGET",
+ flashCapacity: targetCapacity => targetCapacity,
+ amount: async () => (TARGET * 75n) / 100n + 1n,
+ },
+ {
+ name: "from 25% to 0% of TARGET",
+ flashCapacity: targetCapacity => (targetCapacity * 25n) / 100n,
+ amount: async () => await omniVault.getFlashCapacity(),
+ },
+ ];
+
+ args.forEach(function (arg) {
+ it(`setFlashWithdrawFeeParams: ${arg.name}`, async function () {
+ await snapshot.restore();
+ TARGET = e18;
+ await omniVault.connect(owner).setTargetFlashCapacity(TARGET);
+
+ await expect(
+ omniVault.setFlashWithdrawFeeParams(
+ arg.newMaxFlashFeeRate,
+ arg.newOptimalWithdrawalRate,
+ arg.newWithdrawUtilizationKink,
+ ),
+ )
+ .to.emit(omniVault, "WithdrawFeeParamsChanged")
+ .withArgs(arg.newMaxFlashFeeRate, arg.newOptimalWithdrawalRate, arg.newWithdrawUtilizationKink);
+
+ expect(await omniVault.maxFlashFeeRate()).to.be.eq(arg.newMaxFlashFeeRate);
+ expect(await omniVault.optimalWithdrawalRate()).to.be.eq(arg.newOptimalWithdrawalRate);
+ expect(await omniVault.withdrawUtilizationKink()).to.be.eq(arg.newWithdrawUtilizationKink);
+ localSnapshot = await takeSnapshot();
+ });
+
+ amounts.forEach(function (amount) {
+ it(`calculateFlashWithdrawFee for: ${amount.name}`, async function () {
+ await localSnapshot.restore();
+ await omniVault.connect(staker1).deposit(amount.flashCapacity(TARGET), staker1.address);
+
+ let flashCapacity = await omniVault.getFlashCapacity();
+ console.log(`flash capacity: ${flashCapacity.format()}`);
+ let _amount = await amount.amount();
+ let withdrawFee = 0n;
+ while (_amount > 0n) {
+ for (const feeFunc of withdrawFeeSegment) {
+ const utilization = (flashCapacity * MAX_PERCENT) / TARGET;
+ const fromUtilization = await feeFunc.fromUtilization();
+ const toUtilization = await feeFunc.toUtilization();
+ if (_amount > 0n && fromUtilization < utilization && utilization <= toUtilization) {
+ console.log(`Utilization:\t\t\t${utilization.format()}`);
+ const fromPercent = await feeFunc.fromPercent();
+ const toPercent = await feeFunc.toPercent();
+ const lowerBound = (fromUtilization * TARGET) / MAX_PERCENT;
+ const replenished = lowerBound > flashCapacity - _amount ? flashCapacity - lowerBound : _amount;
+ const slope = ((toPercent - fromPercent) * MAX_PERCENT) / (toUtilization - fromUtilization);
+ const withdrawFeePercent = fromPercent + (slope * (flashCapacity - replenished / 2n)) / TARGET;
+ const fee = (replenished * withdrawFeePercent) / MAX_PERCENT;
+ console.log(`Replenished:\t\t\t${replenished.format()}`);
+ console.log(`Fee percent:\t\t\t${withdrawFeePercent.format()}`);
+ console.log(`Fee:\t\t\t\t\t${fee.format()}`);
+ flashCapacity -= replenished;
+ _amount -= replenished;
+ withdrawFee += fee;
+ }
+ }
+ }
+ let contractFee = await omniVault.calculateFlashWithdrawFee(await amount.amount());
+ console.log(`Expected withdraw fee:\t${withdrawFee.format()}`);
+ console.log(`Contract withdraw fee:\t${contractFee.format()}`);
+ expect(contractFee).to.be.closeTo(withdrawFee, 1n);
+ expect(contractFee).to.be.gt(0n); //flashWithdraw fee is always greater than 0
+ });
+ });
+ });
+
+ const invalidArgs = [
+ {
+ name: "MaxBonusRate > MAX_PERCENT",
+ newMaxFlashFeeRate: () => MAX_PERCENT + 1n,
+ newOptimalWithdrawalRate: () => BigInt(0.2 * 10 ** 8), //0.2%
+ newWithdrawUtilizationKink: () => BigInt(25 * 10 ** 8),
+ customError: "ParameterExceedsLimits",
+ },
+ {
+ name: "OptimalBonusRate > MAX_PERCENT",
+ newMaxFlashFeeRate: () => BigInt(2 * 10 ** 8),
+ newOptimalWithdrawalRate: () => MAX_PERCENT + 1n,
+ newWithdrawUtilizationKink: () => BigInt(25 * 10 ** 8),
+ customError: "ParameterExceedsLimits",
+ },
+ {
+ name: "DepositUtilizationKink > MAX_PERCENT",
+ newMaxFlashFeeRate: () => BigInt(2 * 10 ** 8),
+ newOptimalWithdrawalRate: () => BigInt(0.2 * 10 ** 8), //0.2%
+ newWithdrawUtilizationKink: () => MAX_PERCENT + 1n,
+ customError: "ParameterExceedsLimits",
+ },
+ ];
+ invalidArgs.forEach(function (arg) {
+ it(`setFlashWithdrawFeeParams reverts when ${arg.name}`, async function () {
+ await expect(
+ omniVault.setFlashWithdrawFeeParams(
+ arg.newMaxFlashFeeRate(),
+ arg.newOptimalWithdrawalRate(),
+ arg.newWithdrawUtilizationKink(),
+ ),
+ ).to.be.revertedWithCustomError(omniVault, arg.customError);
+ });
+ });
+
+ it("calculateFlashWithdrawFee reverts when capacity is not sufficient", async function () {
+ await snapshot.restore();
+ await omniVault.connect(staker1).deposit(randomBI(19), staker1.address);
+ const capacity = await omniVault.getFlashCapacity();
+ await expect(omniVault.calculateFlashWithdrawFee(capacity + 1n))
+ .to.be.revertedWithCustomError(omniVault, "InsufficientCapacity")
+ .withArgs(capacity);
+ });
+
+ it("setFlashWithdrawFeeParams reverts when caller is not an owner", async function () {
+ await expect(
+ omniVault
+ .connect(staker1)
+ .setFlashWithdrawFeeParams(BigInt(2 * 10 ** 8), BigInt(0.2 * 10 ** 8), BigInt(25 * 10 ** 8)),
+ ).to.be.revertedWithCustomError(omniVault, "OwnableUnauthorizedAccount");
+ });
+ });
+
+ describe("Setters", function () {
+ beforeEach(async function () {
+ await snapshot.restore();
+ });
+
+ it("setTreasuryAddress(): only owner can", async function () {
+ const newTreasury = ethers.Wallet.createRandom().address;
+ await expect(omniVault.setTreasuryAddress(newTreasury))
+ .to.emit(omniVault, "TreasuryUpdated")
+ .withArgs(newTreasury);
+ expect(await omniVault.treasuryAddress()).to.be.eq(newTreasury);
+ });
+
+ it("setTreasuryAddress(): reverts when set to zero address", async function () {
+ await expect(omniVault.setTreasuryAddress(ethers.ZeroAddress)).to.be.revertedWithCustomError(
+ omniVault,
+ "NullParams",
+ );
+ });
+
+ it("setTreasuryAddress(): reverts when caller is not an owner", async function () {
+ await expect(omniVault.connect(staker1).setTreasuryAddress(staker1.address)).to.be.revertedWithCustomError(
+ omniVault,
+ "OwnableUnauthorizedAccount",
+ );
+ });
+
+ it("setRatioFeed(): only owner can", async function () {
+ const ratioFeed = await omniVault.ratioFeed();
+ const iRatioFeedFactory = await ethers.getContractFactory("InceptionRatioFeed");
+ const newRatioFeed = await upgrades.deployProxy(iRatioFeedFactory, []);
+ newRatioFeed.address = await newRatioFeed.getAddress();
+ await expect(omniVault.setRatioFeed(newRatioFeed.address))
+ .to.emit(omniVault, "RatioFeedChanged")
+ .withArgs(ratioFeed, newRatioFeed.address);
+ expect(await omniVault.ratioFeed()).to.be.eq(newRatioFeed.address);
+
+ const ratio = randomBI(18);
+ await newRatioFeed.updateRatioBatch([await iToken.getAddress()], [ratio]);
+ expect(await omniVault.ratio()).to.be.eq(ratio);
+ });
+
+ it("setRatioFeed(): reverts when new value is zero address", async function () {
+ await expect(omniVault.setRatioFeed(ethers.ZeroAddress)).to.be.revertedWithCustomError(omniVault, "NullParams");
+ });
+
+ it("setRatioFeed(): reverts when caller is not an owner", async function () {
+ const newRatioFeed = ethers.Wallet.createRandom().address;
+ await expect(omniVault.connect(staker1).setRatioFeed(newRatioFeed)).to.be.revertedWithCustomError(
+ omniVault,
+ "OwnableUnauthorizedAccount",
+ );
+ });
+
+ it("setMinAmount(): only owner can", async function () {
+ const prevValue = await omniVault.minAmount();
+ const newMinAmount = randomBI(4);
+ await expect(omniVault.setMinAmount(newMinAmount))
+ .to.emit(omniVault, "MinAmountChanged")
+ .withArgs(prevValue, newMinAmount);
+ expect(await omniVault.minAmount()).to.be.eq(newMinAmount);
+ await expect(omniVault.connect(staker1).deposit(newMinAmount - 1n, staker1.address))
+ .to.be.revertedWithCustomError(omniVault, "LowerMinAmount")
+ .withArgs(newMinAmount);
+ });
+
+ it("setMinAmount(): reverts when called by not an owner", async function () {
+ await expect(omniVault.connect(staker1).setMinAmount(randomBI(3))).to.be.revertedWithCustomError(
+ omniVault,
+ "OwnableUnauthorizedAccount",
+ );
+ });
+
+ it("setTargetFlashCapacity(): only owner can", async function () {
+ const prevValue = await omniVault.targetCapacity();
+ const newValue = randomBI(18);
+ await expect(omniVault.setTargetFlashCapacity(newValue))
+ .to.emit(omniVault, "TargetCapacityChanged")
+ .withArgs(prevValue, newValue);
+ expect(await omniVault.targetCapacity()).to.be.eq(newValue);
+ });
+
+ it("setTargetFlashCapacity(): reverts when called by not an owner", async function () {
+ const newValue = randomBI(18);
+ await expect(omniVault.connect(staker1).setTargetFlashCapacity(newValue)).to.be.revertedWithCustomError(
+ omniVault,
+ "OwnableUnauthorizedAccount",
+ );
+ });
+
+ it("setTargetFlashCapacity(): reverts when sets to 0", async function () {
+ await expect(omniVault.setTargetFlashCapacity(0n)).to.be.revertedWithCustomError(omniVault, "NullParams");
+ });
+
+ it("setName(): only owner can", async function () {
+ const prevValue = await omniVault.name();
+ const newValue = "New name";
+ await expect(omniVault.setName(newValue)).to.emit(omniVault, "NameChanged").withArgs(prevValue, newValue);
+ expect(await omniVault.name()).to.be.eq(newValue);
+ });
+
+ it("setName(): reverts when new name is blank", async function () {
+ await expect(omniVault.setName("")).to.be.revertedWithCustomError(omniVault, "NullParams");
+ });
+
+ it("setName(): reverts when called by not an owner", async function () {
+ await expect(omniVault.connect(staker1).setName("New name")).to.be.revertedWithCustomError(
+ omniVault,
+ "OwnableUnauthorizedAccount",
+ );
+ });
+
+ it("pause(): only owner can", async function () {
+ expect(await omniVault.paused()).is.false;
+ await expect(omniVault.pause()).to.emit(omniVault, "Paused").withArgs(owner.address);
+ expect(await omniVault.paused()).is.true;
+ });
+
+ it("pause(): reverts when called by not an owner", async function () {
+ await expect(omniVault.connect(staker1).pause()).to.be.revertedWithCustomError(
+ omniVault,
+ "OwnableUnauthorizedAccount",
+ );
+ });
+
+ it("pause(): reverts when already paused", async function () {
+ await omniVault.pause();
+ await expect(omniVault.pause()).to.be.revertedWithCustomError(omniVault, "EnforcedPause");
+ });
+
+ it("unpause(): only owner can", async function () {
+ await omniVault.pause();
+ expect(await omniVault.paused()).is.true;
+
+ await expect(omniVault.unpause()).to.emit(omniVault, "Unpaused").withArgs(owner.address);
+ expect(await omniVault.paused()).is.false;
+ });
+
+ it("unpause(): reverts when called by not an owner", async function () {
+ await omniVault.pause();
+ expect(await omniVault.paused()).is.true;
+ await expect(omniVault.connect(staker1).unpause()).to.be.revertedWithCustomError(
+ omniVault,
+ "OwnableUnauthorizedAccount",
+ );
+ });
+ });
+});
diff --git a/projects/vaults/test/InceptionOmniVault.js b/projects/vaults/test/InceptionOmniVault.js
new file mode 100644
index 00000000..40f4ab95
--- /dev/null
+++ b/projects/vaults/test/InceptionOmniVault.js
@@ -0,0 +1,1192 @@
+const { ethers, upgrades, network } = require("hardhat");
+const { expect } = require("chai");
+const { takeSnapshot } = require("@nomicfoundation/hardhat-network-helpers");
+const { toWei, randomBI, e18, randomBIMax, calculateRatioOmniVault } = require("./helpers/utils");
+BigInt.prototype.format = function () {
+ return this.toLocaleString("de-DE");
+};
+
+let transactErr = 2n;
+
+async function init(operator) {
+ console.log("- iToken");
+ const iTokenFactory = await ethers.getContractFactory("InceptionToken");
+ const iToken = await upgrades.deployProxy(iTokenFactory, ["TEST InceptionLRT Token", "tINt"]);
+ iToken.address = await iToken.getAddress();
+
+ console.log("- Ratio feed");
+ const iRatioFeedFactory = await ethers.getContractFactory("InceptionRatioFeed");
+ const ratioFeed = await upgrades.deployProxy(iRatioFeedFactory, []);
+ await ratioFeed.updateRatioBatch([await iToken.getAddress()], [e18]);
+ ratioFeed.address = await ratioFeed.getAddress();
+
+ console.log("- Update Mock Ratio Feed with Mock Token");
+ await ratioFeed.updateRatioBatch([iToken.address], [e18]);
+
+ // Deploy the OmniVault
+ console.log("- Deploying OmniVault");
+ const adapter = ethers.Wallet.createRandom().address;
+ const omniVaultFactory = await ethers.getContractFactory("InEthOmniVault");
+ const omniVault = await upgrades.deployProxy(
+ omniVaultFactory,
+ [iToken.address, await operator.getAddress(), adapter],
+ {},
+ );
+ omniVault.address = await omniVault.getAddress();
+
+ await omniVault.setRatioFeed(ratioFeed.address);
+ await iToken.setVault(omniVault.address);
+
+ return [iToken, omniVault, ratioFeed];
+}
+
+describe("InceptionOmniVault: Native", function () {
+ this.timeout(150000);
+ let omniVault, iToken, ratioFeedL2;
+ let owner, operator, signer1, signer2, signer3, treasury;
+ let snapshot;
+ let TARGET;
+
+ async function addReplenishBonusToOmniVault(amount) {
+ if (amount > 0n) {
+ expect(await iToken.balanceOf(signer3.address)).to.be.eq(0n);
+ await omniVault.connect(signer3).deposit(signer3.address, { value: amount });
+ const shares = await iToken.balanceOf(signer3.address);
+ await omniVault.connect(signer3).flashWithdraw(shares, signer3.address);
+ }
+ return await omniVault.depositBonusAmount();
+ }
+
+ before(async function () {
+ [owner, operator, signer1, signer2, signer3] = await ethers.getSigners();
+ [iToken, omniVault, ratioFeedL2] = await init(operator);
+ treasury = await omniVault.treasury();
+ snapshot = await takeSnapshot();
+ });
+
+ describe("Base flow", function () {
+ let deposited, freeBalance, depositFees;
+
+ before(async function () {
+ await snapshot.restore();
+ TARGET = toWei(10);
+ await omniVault.setTargetFlashCapacity(TARGET);
+ });
+
+ it("Initial ratio", async function () {
+ const ratio = await omniVault.ratio();
+ console.log(`Initial ratio:\t\t${ratio.format()}`);
+ });
+
+ it("Deposit to vault", async function () {
+ freeBalance = randomBI(19);
+ deposited = TARGET + freeBalance;
+ const expectedShares = (deposited * e18) / (await omniVault.ratio());
+ const tx = await omniVault.connect(signer1).deposit(signer1.address, { value: deposited });
+ const receipt = await tx.wait();
+ const events = receipt?.logs.filter(e => e.eventName === "Deposit");
+ expect(events.length).to.be.eq(1);
+ expect(events[0].args["sender"]).to.be.eq(signer1.address);
+ expect(events[0].args["receiver"]).to.be.eq(signer1.address);
+ expect(events[0].args["amount"]).to.be.eq(deposited);
+ expect(events[0].args["iShares"]).to.be.closeTo(expectedShares, 1n);
+ expect(receipt?.logs.find(l => l.eventName === "DepositBonus")).to.be.undefined; //Because there is no replenish rewards has been collected yet
+ console.log(`Ratio after:\t\t${(await omniVault.ratio()).format()}`);
+
+ expect(await iToken.balanceOf(signer1.address)).to.be.closeTo(expectedShares, 1n);
+ expect(await omniVault.totalAssets()).to.be.eq(deposited);
+ expect(await omniVault.getFlashCapacity()).to.be.eq(deposited);
+ expect(await omniVault.ratio()).to.be.eq(e18);
+ });
+
+ it("Update ratio", async function () {
+ //
+ await owner.sendTransaction({ to: await omniVault.getAddress(), value: "1000000000000" });
+ const ratio = await calculateRatioOmniVault(omniVault, iToken);
+ console.log(`Calculated ratio:\t\t\t${ratio.format()}`);
+ await ratioFeedL2.updateRatioBatch([iToken.address], [ratio]);
+ console.log(`New ratio is:\t\t\t\t\t${(await omniVault.ratio()).format()}`);
+ expect(await omniVault.ratio()).lt(e18);
+ });
+
+ it("Flash withdraw all", async function () {
+ const sharesBefore = await iToken.balanceOf(signer1);
+ const senderBalanceBefore = await ethers.provider.getBalance(signer1);
+ const receiver = signer2;
+ const receiverBalanceBefore = await ethers.provider.getBalance(receiver);
+ const treasuryBalanceBefore = await ethers.provider.getBalance(owner);
+ const totalAssetsBefore = await omniVault.totalAssets();
+ const flashCapacityBefore = await omniVault.getFlashCapacity();
+ console.log(`Flash capacity before:\t${flashCapacityBefore.format()}`);
+
+ const amount = await omniVault.convertToAssets(sharesBefore);
+ const expectedFee = await omniVault.calculateFlashWithdrawFee(amount);
+ console.log(`Amount:\t\t\t\t\t${amount.format()}`);
+ console.log(`Shares:\t\t\t\t\t${sharesBefore.format()}`);
+ console.log(`Expected fee:\t\t\t${expectedFee.format()}`);
+
+ let tx = await omniVault.connect(signer1).flashWithdraw(sharesBefore, receiver.address);
+ const receipt = await tx.wait();
+ const txFee = BigInt(receipt.gasUsed * receipt.gasPrice);
+ const withdrawEvent = receipt?.logs.filter(e => e.eventName === "FlashWithdraw");
+ expect(withdrawEvent.length).to.be.eq(1);
+ expect(withdrawEvent[0].args["sender"]).to.be.eq(signer1.address);
+ expect(withdrawEvent[0].args["receiver"]).to.be.eq(receiver.address);
+ expect(withdrawEvent[0].args["owner"]).to.be.eq(signer1.address);
+ expect(withdrawEvent[0].args["amount"]).to.be.closeTo(amount - expectedFee, 1n);
+ expect(withdrawEvent[0].args["iShares"]).to.be.closeTo(sharesBefore, 1n);
+ expect(withdrawEvent[0].args["fee"]).to.be.closeTo(expectedFee, 1n);
+ const collectedFees = withdrawEvent[0].args["fee"];
+ depositFees = collectedFees / 2n;
+
+ const sharesAfter = await iToken.balanceOf(signer1);
+ const senderBalanceAfter = await ethers.provider.getBalance(signer1);
+ const receiverBalanceAfter = await ethers.provider.getBalance(receiver);
+ const treasuryBalanceAfter = await ethers.provider.getBalance(owner);
+ const totalAssetsAfter = await omniVault.totalAssets();
+ const flashCapacityAfter = await omniVault.getFlashCapacity();
+ console.log(`Shares balance diff:\t${(sharesBefore - sharesAfter).format()}`);
+ console.log(`Sender balance diff:\t${(senderBalanceBefore - senderBalanceAfter).format()}`);
+ console.log(`Receiver balance diff:\t${(receiverBalanceAfter - receiverBalanceBefore).format()}`);
+ console.log(`Treasury balance diff:\t${(treasuryBalanceAfter - treasuryBalanceBefore).format()}`);
+ console.log(`Total assets diff:\t\t${(totalAssetsBefore - totalAssetsAfter).format()}`);
+ console.log(`Flash capacity diff:\t${(flashCapacityBefore - flashCapacityAfter).format()}`);
+ console.log(`Fee collected:\t\t\t${collectedFees.format()}`);
+
+ expect(sharesBefore - sharesAfter).to.be.eq(sharesBefore);
+ expect(senderBalanceBefore - senderBalanceAfter).to.be.closeTo(txFee, 1n);
+ expect(receiverBalanceAfter - receiverBalanceBefore).to.be.closeTo(amount - expectedFee, 1n);
+ expect(treasuryBalanceAfter - treasuryBalanceBefore).to.be.closeTo(expectedFee / 2n, 1n);
+ expect(totalAssetsBefore - totalAssetsAfter).to.be.closeTo(amount - expectedFee / 2n, 1n);
+ expect(flashCapacityBefore - flashCapacityAfter).to.be.closeTo(amount, 1n);
+ });
+ });
+
+ describe("Deposit", function () {
+ let TARGET;
+
+ beforeEach(async function () {
+ await snapshot.restore();
+ TARGET = toWei(10);
+ await omniVault.setTargetFlashCapacity(TARGET);
+ });
+
+ const args = [
+ {
+ name: "1st time < TARGET",
+ predepositAmount: () => 0n,
+ amount: async () => TARGET / 2n,
+ withdrawFeeFrom: () => 0n,
+ receiver: () => signer1.address,
+ },
+ {
+ name: "1st time > TARGET",
+ predepositAmount: () => 0n,
+ amount: async () => randomBIMax(TARGET),
+ withdrawFeeFrom: () => 0n,
+ receiver: () => signer1.address,
+ },
+ {
+ name: "more wo rewards",
+ predepositAmount: () => TARGET / 3n,
+ amount: async () => randomBIMax(TARGET / 3n),
+ withdrawFeeFrom: () => 0n,
+ receiver: () => signer1.address,
+ },
+ {
+ name: "more with rewards",
+ predepositAmount: () => TARGET / 3n,
+ amount: async () => randomBIMax(TARGET / 3n),
+ withdrawFeeFrom: () => TARGET,
+ receiver: () => signer1.address,
+ },
+ {
+ name: "min amount",
+ predepositAmount: () => 0n,
+ amount: async () => await omniVault.minAmount(),
+ withdrawFeeFrom: () => TARGET,
+ receiver: () => signer1.address,
+ },
+ {
+ name: "and redeem all rewards",
+ predepositAmount: () => TARGET / 10n,
+ amount: async () => (TARGET * 8n) / 10n,
+ withdrawFeeFrom: () => TARGET / 10n,
+ receiver: () => signer1.address,
+ },
+ {
+ name: "up to target cap and above",
+ predepositAmount: () => TARGET / 10n,
+ amount: async () => TARGET,
+ withdrawFeeFrom: () => TARGET / 2n,
+ receiver: () => signer1.address,
+ },
+ {
+ name: "above target cap",
+ predepositAmount: () => TARGET + 1n,
+ amount: async () => randomBI(19),
+ withdrawFeeFrom: () => TARGET,
+ receiver: () => signer1.address,
+ },
+ {
+ name: "to another address",
+ predepositAmount: () => TARGET / 10n,
+ amount: async () => TARGET,
+ withdrawFeeFrom: () => TARGET,
+ receiver: () => signer2.address,
+ },
+
+ //Ratio < 1
+ {
+ name: "more wo rewards when ratio < 1",
+ predepositAmount: () => TARGET / 3n,
+ amount: async () => randomBIMax(TARGET / 3n),
+ withdrawFeeFrom: () => 0n,
+ ratio: toWei(0.9),
+ receiver: () => signer1.address,
+ },
+ {
+ name: "more with rewards when ratio < 1",
+ predepositAmount: () => TARGET / 3n,
+ amount: async () => randomBIMax(TARGET / 3n),
+ withdrawFeeFrom: () => TARGET,
+ ratio: toWei(0.9),
+ receiver: () => signer1.address,
+ },
+ {
+ name: "min amount when ratio < 1",
+ predepositAmount: () => 0n,
+ amount: async () => await omniVault.minAmount(),
+ withdrawFeeFrom: () => TARGET,
+ ratio: toWei(0.9),
+ receiver: () => signer1.address,
+ },
+ ];
+
+ args.forEach(function (arg) {
+ it(`Deposit ${arg.name}`, async function () {
+ //Predeposit
+ const predepositAmount = arg.predepositAmount();
+ if (predepositAmount > 0n) {
+ const randomAddress = ethers.Wallet.createRandom().address;
+ await omniVault.connect(signer3).deposit(randomAddress, { value: predepositAmount });
+ expect(await omniVault.getFlashCapacity()).to.be.closeTo(predepositAmount, 2n);
+ }
+
+ //Add rewards
+ let availableBonus = await addReplenishBonusToOmniVault(arg.withdrawFeeFrom());
+
+ if (arg.ratio) {
+ await ratioFeedL2.updateRatioBatch([await iToken.getAddress()], [arg.ratio]);
+ console.log(`Ratio updated:\t\t\t${(await omniVault.ratio()).format()}`);
+ }
+
+ const receiver = arg.receiver();
+ const stakerSharesBefore = await iToken.balanceOf(receiver);
+ const totalAssetsBefore = await omniVault.totalAssets();
+ const flashCapacityBefore = await omniVault.getFlashCapacity();
+ console.log(`Flash capacity before:\t${flashCapacityBefore.format()}`);
+
+ const amount = await arg.amount();
+ console.log(`Amount:\t\t\t\t\t${amount.format()}`);
+ const calculatedBonus = await omniVault.calculateDepositBonus(amount);
+ console.log(`Preview bonus:\t\t\t${calculatedBonus.format()}`);
+ console.log(`Available bonus:\t\t${availableBonus.format()}`);
+ const expectedBonus = calculatedBonus <= availableBonus ? calculatedBonus : availableBonus;
+ availableBonus -= expectedBonus;
+ console.log(`Expected bonus:\t\t\t${expectedBonus.format()}`);
+ const convertedShares = await omniVault.convertToShares(amount + expectedBonus);
+ const expectedShares = ((amount + expectedBonus) * (await omniVault.ratio())) / e18;
+
+ const tx = await omniVault.connect(signer1).deposit(receiver, { value: amount });
+ const receipt = await tx.wait();
+ const depositEvent = receipt?.logs.filter(e => e.eventName === "Deposit");
+ expect(depositEvent.length).to.be.eq(1);
+ expect(depositEvent[0].args["sender"]).to.be.eq(signer1.address);
+ expect(depositEvent[0].args["receiver"]).to.be.eq(receiver);
+ expect(depositEvent[0].args["amount"]).to.be.eq(amount);
+ expect(depositEvent[0].args["iShares"]).to.be.closeTo(convertedShares, 1n);
+ //DepositBonus event
+ const actualBonus = receipt?.logs.find(l => l.eventName === "DepositBonus")?.args.amount || 0n;
+ console.log(`Actual bonus:\t\t\t${actualBonus.format()}`);
+
+ const stakerSharesAfter = await iToken.balanceOf(receiver);
+ const totalAssetsAfter = await omniVault.totalAssets();
+ const flashCapacityAfter = await omniVault.getFlashCapacity();
+ console.log(`Bonus after:\t\t\t${availableBonus.format()}`);
+
+ expect(stakerSharesAfter - stakerSharesBefore).to.be.closeTo(expectedShares, 1n);
+ expect(stakerSharesAfter - stakerSharesBefore).to.be.closeTo(convertedShares, 1n);
+ expect(totalAssetsAfter - totalAssetsBefore).to.be.eq(amount); //omniVault balance is the same
+ expect(actualBonus).to.be.closeTo(expectedBonus, 1n);
+ expect(flashCapacityAfter - flashCapacityBefore).to.be.closeTo(amount + expectedBonus, 1n); //rewarded bonus goes to flash capacity
+ });
+ });
+
+ const invalidArgs = [
+ {
+ name: "amount is 0",
+ amount: async () => 0n,
+ receiver: () => signer1.address,
+ customError: "LowerMinAmount",
+ },
+ {
+ name: "amount < min",
+ amount: async () => (await omniVault.minAmount()) - 1n,
+ receiver: () => signer1.address,
+ customError: "LowerMinAmount",
+ },
+ {
+ name: "to zero address",
+ amount: async () => randomBI(18),
+ receiver: () => ethers.ZeroAddress,
+ customError: "NullParams",
+ },
+ ];
+
+ invalidArgs.forEach(function (arg) {
+ it(`Reverts when deposit ${arg.name}`, async function () {
+ const amount = await arg.amount();
+ const receiver = arg.receiver();
+ if (arg.customError) {
+ await expect(omniVault.connect(signer1).deposit(receiver, { value: amount })).to.be.revertedWithCustomError(
+ omniVault,
+ arg.customError,
+ );
+ } else {
+ await expect(omniVault.connect(signer1).deposit(receiver, { value: amount })).to.be.revertedWith(arg.error);
+ }
+ });
+ });
+
+ it("Reverts when omniVault is paused", async function () {
+ await omniVault.pause();
+ const depositAmount = randomBI(19);
+ await expect(
+ omniVault.connect(signer1).deposit(signer1.address, { value: depositAmount }),
+ ).to.be.revertedWithCustomError(omniVault, "EnforcedPause");
+ await omniVault.unpause();
+ });
+
+ it("Reverts when shares is 0", async function () {
+ await omniVault.setMinAmount(0n);
+ await expect(omniVault.connect(signer1).deposit(signer1.address, { value: 0n })).to.be.revertedWithCustomError(
+ omniVault,
+ "DepositInconsistentResultedState",
+ );
+ });
+ });
+
+ describe("Deposit bonus params setter and calculation", function () {
+ let TARGET, MAX_PERCENT, localSnapshot;
+ before(async function () {
+ MAX_PERCENT = await omniVault.MAX_PERCENT();
+ });
+
+ const depositBonusSegment = [
+ {
+ fromUtilization: async () => 0n,
+ fromPercent: async () => await omniVault.maxBonusRate(),
+ toUtilization: async () => await omniVault.depositUtilizationKink(),
+ toPercent: async () => await omniVault.optimalBonusRate(),
+ },
+ {
+ fromUtilization: async () => await omniVault.depositUtilizationKink(),
+ fromPercent: async () => await omniVault.optimalBonusRate(),
+ toUtilization: async () => await omniVault.MAX_PERCENT(),
+ toPercent: async () => await omniVault.optimalBonusRate(),
+ },
+ {
+ fromUtilization: async () => await omniVault.MAX_PERCENT(),
+ fromPercent: async () => 0n,
+ toUtilization: async () => ethers.MaxUint256,
+ toPercent: async () => 0n,
+ },
+ ];
+
+ const args = [
+ {
+ name: "Normal bonus rewards profile > 0",
+ newMaxBonusRate: BigInt(2 * 10 ** 8), //2%
+ newOptimalBonusRate: BigInt(0.2 * 10 ** 8), //0.2%
+ newDepositUtilizationKink: BigInt(25 * 10 ** 8), //25%
+ },
+ {
+ name: "Optimal utilization = 0 => always optimal rate",
+ newMaxBonusRate: BigInt(2 * 10 ** 8),
+ newOptimalBonusRate: BigInt(10 ** 8), //1%
+ newDepositUtilizationKink: 0n,
+ },
+ {
+ name: "Optimal bonus rate = 0",
+ newMaxBonusRate: BigInt(2 * 10 ** 8),
+ newOptimalBonusRate: 0n,
+ newDepositUtilizationKink: BigInt(25 * 10 ** 8),
+ },
+ {
+ name: "Optimal bonus rate = max > 0 => rate is constant over utilization",
+ newMaxBonusRate: BigInt(2 * 10 ** 8),
+ newOptimalBonusRate: BigInt(2 * 10 ** 8),
+ newDepositUtilizationKink: BigInt(25 * 10 ** 8),
+ },
+ {
+ name: "Optimal bonus rate = max = 0 => no bonus",
+ newMaxBonusRate: 0n,
+ newOptimalBonusRate: 0n,
+ newDepositUtilizationKink: BigInt(25 * 10 ** 8),
+ },
+ //Will fail when OptimalBonusRate > MaxBonusRate
+ ];
+
+ const amounts = [
+ {
+ name: "min amount from 0",
+ flashCapacity: () => 0n,
+ amount: async () => (await omniVault.convertToAssets(await omniVault.minAmount())) + 1n,
+ },
+ {
+ name: "1 wei from 0",
+ flashCapacity: () => 0n,
+ amount: async () => 1n,
+ },
+ {
+ name: "from 0 to 25% of TARGET",
+ flashCapacity: () => 0n,
+ amount: async () => (TARGET * 25n) / 100n,
+ },
+ {
+ name: "from 0 to 25% + 1wei of TARGET",
+ flashCapacity: () => 0n,
+ amount: async () => (TARGET * 25n) / 100n,
+ },
+ {
+ name: "from 25% to 100% of TARGET",
+ flashCapacity: () => (TARGET * 25n) / 100n,
+ amount: async () => (TARGET * 75n) / 100n,
+ },
+ {
+ name: "from 0% to 100% of TARGET",
+ flashCapacity: () => 0n,
+ amount: async () => TARGET,
+ },
+ {
+ name: "from 0% to 200% of TARGET",
+ flashCapacity: () => 0n,
+ amount: async () => TARGET * 2n,
+ },
+ ];
+
+ args.forEach(function (arg) {
+ it(`setDepositBonusParams: ${arg.name}`, async function () {
+ await snapshot.restore();
+ TARGET = e18;
+ await omniVault.connect(owner).setTargetFlashCapacity(TARGET);
+
+ await expect(
+ omniVault.setDepositBonusParams(arg.newMaxBonusRate, arg.newOptimalBonusRate, arg.newDepositUtilizationKink),
+ )
+ .to.emit(omniVault, "DepositBonusParamsChanged")
+ .withArgs(arg.newMaxBonusRate, arg.newOptimalBonusRate, arg.newDepositUtilizationKink);
+
+ expect(await omniVault.maxBonusRate()).to.be.eq(arg.newMaxBonusRate);
+ expect(await omniVault.optimalBonusRate()).to.be.eq(arg.newOptimalBonusRate);
+ expect(await omniVault.depositUtilizationKink()).to.be.eq(arg.newDepositUtilizationKink);
+ localSnapshot = await takeSnapshot();
+ });
+
+ amounts.forEach(function (amount) {
+ it(`calculateDepositBonus for ${amount.name}`, async function () {
+ await localSnapshot.restore();
+ let flashCapacity = amount.flashCapacity();
+ if (flashCapacity > 0n) {
+ await omniVault.connect(signer1).deposit(signer1.address, { value: flashCapacity });
+ }
+ let _amount = await amount.amount();
+ let depositBonus = 0n;
+ while (_amount > 0n) {
+ for (const feeFunc of depositBonusSegment) {
+ const utilization = (flashCapacity * MAX_PERCENT) / TARGET;
+ const fromUtilization = await feeFunc.fromUtilization();
+ const toUtilization = await feeFunc.toUtilization();
+ if (_amount > 0n && fromUtilization <= utilization && utilization < toUtilization) {
+ const fromPercent = await feeFunc.fromPercent();
+ const toPercent = await feeFunc.toPercent();
+ const upperBound = (toUtilization * TARGET) / MAX_PERCENT;
+ const replenished = upperBound > flashCapacity + _amount ? _amount : upperBound - flashCapacity;
+ const slope = ((toPercent - fromPercent) * MAX_PERCENT) / (toUtilization - fromUtilization);
+ const bonusPercent = fromPercent + (slope * (flashCapacity + replenished / 2n)) / TARGET;
+ const bonus = (replenished * bonusPercent) / MAX_PERCENT;
+ console.log(`Replenished:\t\t\t${replenished.format()}`);
+ console.log(`Bonus percent:\t\t\t${bonusPercent.format()}`);
+ console.log(`Bonus:\t\t\t\t\t${bonus.format()}`);
+ flashCapacity += replenished;
+ _amount -= replenished;
+ depositBonus += bonus;
+ }
+ }
+ }
+ let contractBonus = await omniVault.calculateDepositBonus(await amount.amount());
+ console.log(`Expected deposit bonus:\t${depositBonus.format()}`);
+ console.log(`Contract deposit bonus:\t${contractBonus.format()}`);
+ expect(contractBonus).to.be.closeTo(depositBonus, 1n);
+ });
+ });
+ });
+
+ const invalidArgs = [
+ {
+ name: "MaxBonusRate > MAX_PERCENT",
+ newMaxBonusRate: () => MAX_PERCENT + 1n,
+ newOptimalBonusRate: () => BigInt(0.2 * 10 ** 8), //0.2%
+ newDepositUtilizationKink: () => BigInt(25 * 10 ** 8),
+ customError: "ParameterExceedsLimits",
+ },
+ {
+ name: "OptimalBonusRate > MAX_PERCENT",
+ newMaxBonusRate: () => BigInt(2 * 10 ** 8),
+ newOptimalBonusRate: () => MAX_PERCENT + 1n,
+ newDepositUtilizationKink: () => BigInt(25 * 10 ** 8),
+ customError: "ParameterExceedsLimits",
+ },
+ {
+ name: "DepositUtilizationKink > MAX_PERCENT",
+ newMaxBonusRate: () => BigInt(2 * 10 ** 8),
+ newOptimalBonusRate: () => BigInt(0.2 * 10 ** 8), //0.2%
+ newDepositUtilizationKink: () => MAX_PERCENT + 1n,
+ customError: "ParameterExceedsLimits",
+ },
+ ];
+ invalidArgs.forEach(function (arg) {
+ it(`setDepositBonusParams reverts when ${arg.name}`, async function () {
+ await expect(
+ omniVault.setDepositBonusParams(
+ arg.newMaxBonusRate(),
+ arg.newOptimalBonusRate(),
+ arg.newDepositUtilizationKink(),
+ ),
+ ).to.be.revertedWithCustomError(omniVault, arg.customError);
+ });
+ });
+
+ it("setDepositBonusParams reverts when caller is not an owner", async function () {
+ await expect(
+ omniVault
+ .connect(signer1)
+ .setDepositBonusParams(BigInt(2 * 10 ** 8), BigInt(0.2 * 10 ** 8), BigInt(25 * 10 ** 8)),
+ ).to.be.revertedWithCustomError(omniVault, "OwnableUnauthorizedAccount");
+ });
+ });
+
+ describe("Flash withdraw", function () {
+ let TARGET, MAX_PERCENT, ratio;
+ beforeEach(async function () {
+ await snapshot.restore();
+ TARGET = toWei(10);
+ await omniVault.setTargetFlashCapacity(TARGET);
+ MAX_PERCENT = await omniVault.MAX_PERCENT();
+ });
+
+ const args = [
+ {
+ name: "some amount when capacity > TARGET",
+ poolCapacity: () => TARGET * 2n,
+ amount: async () => randomBIMax(TARGET / 2n),
+ receiver: () => signer1,
+ },
+ {
+ name: "all capacity above TARGET",
+ poolCapacity: () => TARGET * 2n,
+ amount: async () => (await omniVault.getFlashCapacity()) - TARGET,
+ receiver: () => signer1,
+ },
+ {
+ name: "all when pool capacity > TARGET",
+ poolCapacity: () => TARGET + e18,
+ amount: async () => await omniVault.getFlashCapacity(),
+ receiver: () => signer1,
+ },
+ {
+ name: "partially when pool capacity = TARGET",
+ poolCapacity: () => TARGET,
+ amount: async () => (await omniVault.getFlashCapacity()) / 2n,
+ receiver: () => signer1,
+ },
+ {
+ name: "all when pool capacity = TARGET",
+ poolCapacity: () => TARGET,
+ amount: async () => await omniVault.getFlashCapacity(),
+ receiver: () => signer1,
+ },
+ {
+ name: "partially when pool capacity < TARGET",
+ poolCapacity: () => (TARGET * 3n) / 4n,
+ amount: async () => (await omniVault.getFlashCapacity()) / 2n,
+ receiver: () => signer1,
+ },
+ {
+ name: "all when pool capacity < TARGET",
+ poolCapacity: () => (TARGET * 3n) / 4n,
+ amount: async () => await omniVault.getFlashCapacity(),
+ receiver: () => signer1,
+ },
+ {
+ name: "to another address",
+ poolCapacity: () => (TARGET * 3n) / 4n,
+ amount: async () => (await omniVault.getFlashCapacity()) / 2n,
+ receiver: () => signer2,
+ },
+ {
+ name: "after protocol fee has been changed",
+ poolCapacity: () => TARGET,
+ amount: async () => await omniVault.getFlashCapacity(),
+ receiver: () => signer1,
+ protocolFee: () => BigInt(25 * 10 ** 8),
+ },
+ ];
+
+ args.forEach(function (arg) {
+ it(`flashWithdraw: ${arg.name}`, async function () {
+ ratio = toWei(0.8);
+ await ratioFeedL2.updateRatioBatch([iToken.address], [ratio]);
+ //Deposit
+ const predepositAmount = arg.poolCapacity();
+ await omniVault.connect(signer1).deposit(signer1.address, { value: predepositAmount });
+ //Set protocol fee
+ let protocolFee = await omniVault.protocolFee();
+ if (arg.protocolFee) {
+ protocolFee = arg.protocolFee();
+ await omniVault.setProtocolFee(protocolFee);
+ }
+ //flashWithdraw
+ const ratioBefore = await omniVault.ratio();
+ console.log(`Ratio before:\t\t\t${ratioBefore.format()}`);
+
+ const receiver = await arg.receiver();
+ const sharesBefore = await iToken.balanceOf(signer1);
+ const assetBalanceBefore = await ethers.provider.getBalance(receiver);
+ const treasuryBalanceBefore = await ethers.provider.getBalance(treasury);
+ const totalAssetsBefore = await omniVault.totalAssets();
+ const flashCapacityBefore = await omniVault.getFlashCapacity();
+ console.log(`Flash capacity before:\t${flashCapacityBefore.format()}`);
+
+ const amount = await arg.amount();
+ const shares = await omniVault.convertToShares(amount);
+ const expectedFee = await omniVault.calculateFlashWithdrawFee(amount);
+ console.log(`Expected fee:\t\t\t${expectedFee.format()}`);
+
+ let tx = await omniVault.connect(signer1).flashWithdraw(shares, receiver.address);
+ const receipt = await tx.wait();
+ const txFee = receiver.address === signer1.address ? BigInt(receipt.gasUsed * receipt.gasPrice) : 0n;
+ const withdrawEvent = receipt?.logs.filter(e => e.eventName === "FlashWithdraw");
+ expect(withdrawEvent.length).to.be.eq(1);
+ expect(withdrawEvent[0].args["sender"]).to.be.eq(signer1.address);
+ expect(withdrawEvent[0].args["receiver"]).to.be.eq(receiver.address);
+ expect(withdrawEvent[0].args["owner"]).to.be.eq(signer1.address);
+ expect(withdrawEvent[0].args["amount"]).to.be.closeTo(amount - expectedFee, 1n);
+ expect(withdrawEvent[0].args["iShares"]).to.be.closeTo(shares, 1n);
+ const actualFee = withdrawEvent[0].args["fee"];
+ console.log(`Actual fee:\t\t\t\t${actualFee.format()}`);
+
+ const sharesAfter = await iToken.balanceOf(signer1);
+ const assetBalanceAfter = await ethers.provider.getBalance(receiver);
+ const treasuryBalanceAfter = await ethers.provider.getBalance(treasury);
+ const totalAssetsAfter = await omniVault.totalAssets();
+ const flashCapacityAfter = await omniVault.getFlashCapacity();
+ console.log(`Shares diff:\t\t\t${(sharesBefore - sharesAfter).format()}`);
+ console.log(`Receiver balance diff:\t${(assetBalanceAfter - assetBalanceBefore).format()}`);
+ console.log(`TotalAssets diff:\t\t${(totalAssetsBefore - totalAssetsAfter).format()}`);
+ console.log(`Flash capacity diff:\t${(flashCapacityBefore - flashCapacityAfter).format()}`);
+
+ expect(sharesBefore - sharesAfter).to.be.eq(shares);
+ expect(assetBalanceAfter - assetBalanceBefore).to.be.closeTo(amount - expectedFee - txFee, 1n);
+ expect(actualFee).to.be.closeTo(expectedFee, 1n);
+ const toDepositBonus = (expectedFee * (MAX_PERCENT - protocolFee)) / MAX_PERCENT;
+ const toTreasury = (expectedFee * protocolFee) / MAX_PERCENT;
+ expect(treasuryBalanceAfter - treasuryBalanceBefore).to.be.closeTo(toTreasury, transactErr);
+ expect(totalAssetsBefore - totalAssetsAfter).to.be.closeTo(amount - toDepositBonus, transactErr);
+ expect(flashCapacityBefore - flashCapacityAfter).to.be.closeTo(amount, transactErr);
+ });
+ });
+
+ it("Reverts when capacity is not sufficient", async function () {
+ await omniVault.connect(signer1).deposit(signer1.address, { value: toWei(1) });
+ ratio = toWei(0.8);
+ await ratioFeedL2.updateRatioBatch([iToken.address], [ratio]);
+ const shares = await iToken.balanceOf(signer1.address);
+ const capacity = await omniVault.getFlashCapacity();
+ await expect(omniVault.connect(signer1).flashWithdraw(shares, signer1.address))
+ .to.be.revertedWithCustomError(omniVault, "InsufficientCapacity")
+ .withArgs(capacity);
+ });
+
+ it("Reverts when amount < min", async function () {
+ await omniVault.connect(signer1).deposit(signer1.address, { value: toWei(1) });
+ const minAmount = await omniVault.minAmount();
+ const shares = (await omniVault.convertToShares(minAmount)) - 1n;
+ await expect(omniVault.connect(signer1).flashWithdraw(shares, signer1.address))
+ .to.be.revertedWithCustomError(omniVault, "LowerMinAmount")
+ .withArgs(minAmount);
+ });
+
+ it("Reverts when omniVault is paused", async function () {
+ await omniVault.connect(signer1).deposit(signer1.address, { value: toWei(1) });
+ await omniVault.pause();
+ const shares = await iToken.balanceOf(signer1.address);
+ await expect(
+ omniVault.connect(signer1).flashWithdraw(shares / 2n, signer1.address),
+ ).to.be.revertedWithCustomError(omniVault, "EnforcedPause");
+ });
+
+ it("Reverts when withdraws to 0 address", async function () {
+ await omniVault.connect(signer1).deposit(signer1.address, { value: toWei(1) });
+ const shares = await iToken.balanceOf(signer1.address);
+ await expect(
+ omniVault.connect(signer1).flashWithdraw(shares / 2n, ethers.ZeroAddress),
+ ).to.be.revertedWithCustomError(omniVault, "NullParams");
+ });
+
+ it("Reverts when shares = 0", async function () {
+ await omniVault.connect(signer1).deposit(signer1.address, { value: toWei(1) });
+ await expect(omniVault.connect(signer1).flashWithdraw(0n, signer1.address)).to.be.revertedWithCustomError(
+ omniVault,
+ "NullParams",
+ );
+ });
+ });
+
+ describe("Withdraw fee params setter and calculation", function () {
+ let TARGET, MAX_PERCENT, localSnapshot;
+ before(async function () {
+ MAX_PERCENT = await omniVault.MAX_PERCENT();
+ });
+
+ const withdrawFeeSegment = [
+ {
+ fromUtilization: async () => 0n,
+ fromPercent: async () => await omniVault.maxFlashFeeRate(),
+ toUtilization: async () => await omniVault.withdrawUtilizationKink(),
+ toPercent: async () => await omniVault.optimalWithdrawalRate(),
+ },
+ {
+ fromUtilization: async () => await omniVault.withdrawUtilizationKink(),
+ fromPercent: async () => await omniVault.optimalWithdrawalRate(),
+ toUtilization: async () => await omniVault.MAX_PERCENT(),
+ toPercent: async () => await omniVault.optimalWithdrawalRate(),
+ },
+ {
+ fromUtilization: async () => await omniVault.MAX_PERCENT(),
+ fromPercent: async () => 0n,
+ toUtilization: async () => ethers.MaxUint256,
+ toPercent: async () => 0n,
+ },
+ ];
+
+ const args = [
+ {
+ name: "Normal withdraw fee profile > 0",
+ newMaxFlashFeeRate: BigInt(2 * 10 ** 8), //2%
+ newOptimalWithdrawalRate: BigInt(0.2 * 10 ** 8), //0.2%
+ newWithdrawUtilizationKink: BigInt(25 * 10 ** 8),
+ },
+ {
+ name: "Optimal utilization = 0 => always optimal rate",
+ newMaxFlashFeeRate: BigInt(2 * 10 ** 8),
+ newOptimalWithdrawalRate: BigInt(10 ** 8), //1%
+ newWithdrawUtilizationKink: 0n,
+ },
+ {
+ name: "Optimal withdraw rate = 0",
+ newMaxFlashFeeRate: BigInt(2 * 10 ** 8),
+ newOptimalWithdrawalRate: 0n,
+ newWithdrawUtilizationKink: BigInt(25 * 10 ** 8),
+ },
+ {
+ name: "Optimal withdraw rate = max > 0 => rate is constant over utilization",
+ newMaxFlashFeeRate: BigInt(2 * 10 ** 8),
+ newOptimalWithdrawalRate: BigInt(2 * 10 ** 8),
+ newWithdrawUtilizationKink: BigInt(25 * 10 ** 8),
+ },
+ {
+ name: "Optimal withdraw rate = max = 0 => no fee",
+ newMaxFlashFeeRate: 0n,
+ newOptimalWithdrawalRate: 0n,
+ newWithdrawUtilizationKink: BigInt(25 * 10 ** 8),
+ },
+ //Will fail when optimalWithdrawalRate > MaxFlashFeeRate
+ ];
+
+ const amounts = [
+ {
+ name: "from 200% to 0% of TARGET",
+ flashCapacity: () => TARGET * 2n,
+ amount: async () => await omniVault.getFlashCapacity(),
+ },
+ {
+ name: "from 100% to 0% of TARGET",
+ flashCapacity: () => TARGET,
+ amount: async () => await omniVault.getFlashCapacity(),
+ },
+ {
+ name: "1 wei from 100%",
+ flashCapacity: () => TARGET,
+ amount: async () => 1n,
+ },
+ {
+ name: "min amount from 100%",
+ flashCapacity: () => TARGET,
+ amount: async () => (await omniVault.convertToAssets(await omniVault.minAmount())) + 1n,
+ },
+ {
+ name: "from 100% to 25% of TARGET",
+ flashCapacity: () => TARGET,
+ amount: async () => (TARGET * 75n) / 100n,
+ },
+ {
+ name: "from 100% to 25% - 1wei of TARGET",
+ flashCapacity: () => TARGET,
+ amount: async () => (TARGET * 75n) / 100n + 1n,
+ },
+ {
+ name: "from 25% to 0% of TARGET",
+ flashCapacity: () => (TARGET * 25n) / 100n,
+ amount: async () => await omniVault.getFlashCapacity(),
+ },
+ ];
+
+ args.forEach(function (arg) {
+ it(`setFlashWithdrawFeeParams: ${arg.name}`, async function () {
+ await snapshot.restore();
+ TARGET = e18;
+ await omniVault.connect(owner).setTargetFlashCapacity(TARGET);
+
+ await expect(
+ omniVault.setFlashWithdrawFeeParams(
+ arg.newMaxFlashFeeRate,
+ arg.newOptimalWithdrawalRate,
+ arg.newWithdrawUtilizationKink,
+ ),
+ )
+ .to.emit(omniVault, "WithdrawFeeParamsChanged")
+ .withArgs(arg.newMaxFlashFeeRate, arg.newOptimalWithdrawalRate, arg.newWithdrawUtilizationKink);
+
+ expect(await omniVault.maxFlashFeeRate()).to.be.eq(arg.newMaxFlashFeeRate);
+ expect(await omniVault.optimalWithdrawalRate()).to.be.eq(arg.newOptimalWithdrawalRate);
+ expect(await omniVault.withdrawUtilizationKink()).to.be.eq(arg.newWithdrawUtilizationKink);
+ localSnapshot = await takeSnapshot();
+ });
+
+ amounts.forEach(function (amount) {
+ it(`calculateFlashWithdrawFee for: ${amount.name}`, async function () {
+ await localSnapshot.restore();
+ if (amount.flashCapacity() > 0n) {
+ await omniVault.connect(signer1).deposit(signer1.address, { value: amount.flashCapacity() });
+ }
+ let flashCapacity = await omniVault.getFlashCapacity();
+ console.log(`flash capacity: ${flashCapacity.format()}`);
+ let _amount = await amount.amount();
+ let withdrawFee = 0n;
+ while (_amount > 0n) {
+ for (const feeFunc of withdrawFeeSegment) {
+ const utilization = (flashCapacity * MAX_PERCENT) / TARGET;
+ const fromUtilization = await feeFunc.fromUtilization();
+ const toUtilization = await feeFunc.toUtilization();
+ if (_amount > 0n && fromUtilization < utilization && utilization <= toUtilization) {
+ console.log(`Utilization:\t\t\t${utilization.format()}`);
+ const fromPercent = await feeFunc.fromPercent();
+ const toPercent = await feeFunc.toPercent();
+ const lowerBound = (fromUtilization * TARGET) / MAX_PERCENT;
+ const replenished = lowerBound > flashCapacity - _amount ? flashCapacity - lowerBound : _amount;
+ const slope = ((toPercent - fromPercent) * MAX_PERCENT) / (toUtilization - fromUtilization);
+ const withdrawFeePercent = fromPercent + (slope * (flashCapacity - replenished / 2n)) / TARGET;
+ const fee = (replenished * withdrawFeePercent) / MAX_PERCENT;
+ console.log(`Replenished:\t\t\t${replenished.format()}`);
+ console.log(`Fee percent:\t\t\t${withdrawFeePercent.format()}`);
+ console.log(`Fee:\t\t\t\t\t${fee.format()}`);
+ flashCapacity -= replenished;
+ _amount -= replenished;
+ withdrawFee += fee;
+ }
+ }
+ }
+ let contractFee = await omniVault.calculateFlashWithdrawFee(await amount.amount());
+ console.log(`Expected withdraw fee:\t${withdrawFee.format()}`);
+ console.log(`Contract withdraw fee:\t${contractFee.format()}`);
+ expect(contractFee).to.be.closeTo(withdrawFee, 1n);
+ });
+ });
+ });
+
+ const invalidArgs = [
+ {
+ name: "MaxBonusRate > MAX_PERCENT",
+ newMaxFlashFeeRate: () => MAX_PERCENT + 1n,
+ newOptimalWithdrawalRate: () => BigInt(0.2 * 10 ** 8), //0.2%
+ newWithdrawUtilizationKink: () => BigInt(25 * 10 ** 8),
+ customError: "ParameterExceedsLimits",
+ },
+ {
+ name: "OptimalBonusRate > MAX_PERCENT",
+ newMaxFlashFeeRate: () => BigInt(2 * 10 ** 8),
+ newOptimalWithdrawalRate: () => MAX_PERCENT + 1n,
+ newWithdrawUtilizationKink: () => BigInt(25 * 10 ** 8),
+ customError: "ParameterExceedsLimits",
+ },
+ {
+ name: "DepositUtilizationKink > MAX_PERCENT",
+ newMaxFlashFeeRate: () => BigInt(2 * 10 ** 8),
+ newOptimalWithdrawalRate: () => BigInt(0.2 * 10 ** 8), //0.2%
+ newWithdrawUtilizationKink: () => MAX_PERCENT + 1n,
+ customError: "ParameterExceedsLimits",
+ },
+ ];
+ invalidArgs.forEach(function (arg) {
+ it(`setFlashWithdrawFeeParams reverts when ${arg.name}`, async function () {
+ await expect(
+ omniVault.setFlashWithdrawFeeParams(
+ arg.newMaxFlashFeeRate(),
+ arg.newOptimalWithdrawalRate(),
+ arg.newWithdrawUtilizationKink(),
+ ),
+ ).to.be.revertedWithCustomError(omniVault, arg.customError);
+ });
+ });
+
+ it("calculateFlashWithdrawFee reverts when capacity is not sufficient", async function () {
+ await snapshot.restore();
+ await omniVault.connect(signer1).deposit(signer1.address, { value: randomBI(19) });
+ const capacity = await omniVault.getFlashCapacity();
+ await expect(omniVault.calculateFlashWithdrawFee(capacity + 1n))
+ .to.be.revertedWithCustomError(omniVault, "InsufficientCapacity")
+ .withArgs(capacity);
+ });
+
+ it("setFlashWithdrawFeeParams reverts when caller is not an owner", async function () {
+ await expect(
+ omniVault
+ .connect(signer1)
+ .setFlashWithdrawFeeParams(BigInt(2 * 10 ** 8), BigInt(0.2 * 10 ** 8), BigInt(25 * 10 ** 8)),
+ ).to.be.revertedWithCustomError(omniVault, "OwnableUnauthorizedAccount");
+ });
+ });
+
+ describe("Setters", function () {
+ beforeEach(async function () {
+ await snapshot.restore();
+ });
+
+ it("setTreasuryAddress(): only owner can", async function () {
+ const newTreasury = ethers.Wallet.createRandom().address;
+ await expect(omniVault.setTreasuryAddress(newTreasury))
+ .to.emit(omniVault, "TreasuryUpdated")
+ .withArgs(newTreasury);
+ expect(await omniVault.treasury()).to.be.eq(newTreasury);
+ });
+
+ it("setTreasuryAddress(): reverts when set to zero address", async function () {
+ await expect(omniVault.setTreasuryAddress(ethers.ZeroAddress)).to.be.revertedWithCustomError(
+ omniVault,
+ "NullParams",
+ );
+ });
+
+ it("setTreasuryAddress(): reverts when caller is not an owner", async function () {
+ await expect(omniVault.connect(signer1).setTreasuryAddress(signer1.address)).to.be.revertedWithCustomError(
+ omniVault,
+ "OwnableUnauthorizedAccount",
+ );
+ });
+
+ it("setRatioFeed(): only owner can", async function () {
+ const ratioFeed = await omniVault.ratioFeed();
+ const iRatioFeedFactory = await ethers.getContractFactory("InceptionRatioFeed");
+ const newRatioFeed = await upgrades.deployProxy(iRatioFeedFactory, []);
+ newRatioFeed.address = await newRatioFeed.getAddress();
+ await expect(omniVault.setRatioFeed(newRatioFeed.address))
+ .to.emit(omniVault, "RatioFeedChanged")
+ .withArgs(ratioFeed, newRatioFeed.address);
+ expect(await omniVault.ratioFeed()).to.be.eq(newRatioFeed.address);
+
+ const ratio = randomBI(18);
+ await newRatioFeed.updateRatioBatch([await iToken.getAddress()], [ratio]);
+ expect(await omniVault.ratio()).to.be.eq(ratio);
+ });
+
+ it("setRatioFeed(): reverts when new value is zero address", async function () {
+ await expect(omniVault.setRatioFeed(ethers.ZeroAddress)).to.be.revertedWithCustomError(omniVault, "NullParams");
+ });
+
+ it("setRatioFeed(): reverts when caller is not an owner", async function () {
+ const newRatioFeed = ethers.Wallet.createRandom().address;
+ await expect(omniVault.connect(signer1).setRatioFeed(newRatioFeed)).to.be.revertedWithCustomError(
+ omniVault,
+ "OwnableUnauthorizedAccount",
+ );
+ });
+
+ it("setOperator(): only owner can", async function () {
+ const newValue = ethers.Wallet.createRandom().address;
+ await expect(omniVault.setOperator(newValue))
+ .to.emit(omniVault, "OperatorChanged")
+ .withArgs(operator.address, newValue);
+ expect(await omniVault.operator()).to.be.eq(newValue);
+ });
+
+ it("setOperator(): reverts when caller is not an owner", async function () {
+ await expect(omniVault.connect(signer1).setOperator(signer1.address)).to.be.revertedWithCustomError(
+ omniVault,
+ "OwnableUnauthorizedAccount",
+ );
+ });
+
+ it("ratio() reverts when ratioFeed is 0 address", async function () {
+ const omniVaultFactory = await ethers.getContractFactory("InceptionOmniVault");
+ const omniVault = await upgrades.deployProxy(
+ omniVaultFactory,
+ ["Omnivault", operator.address, iToken.address, ethers.ZeroAddress],
+ { initializer: "__InceptionOmniVault_init" },
+ );
+ omniVault.address = await omniVault.getAddress();
+ await iToken.setVault(omniVault.address);
+ await expect(omniVault.ratio()).to.be.reverted;
+ });
+
+ it("setCrossChainAdapter(): only owner can", async function () {
+ const newValue = ethers.Wallet.createRandom().address;
+ await expect(omniVault.setCrossChainAdapter(newValue))
+ .to.emit(omniVault, "CrossChainAdapterChanged")
+ .withArgs(newValue);
+ expect(await omniVault.crossChainAdapter()).to.be.eq(newValue);
+ });
+
+ it("setCrossChainAdapter(): reverts when set to zero address", async function () {
+ await expect(omniVault.setCrossChainAdapter(ethers.ZeroAddress)).to.be.revertedWithCustomError(
+ omniVault,
+ "NullParams",
+ );
+ });
+
+ it("setCrossChainAdapter(): reverts when caller is not an owner", async function () {
+ await expect(omniVault.connect(signer1).setCrossChainAdapter(signer1.address)).to.be.revertedWithCustomError(
+ omniVault,
+ "OwnableUnauthorizedAccount",
+ );
+ });
+
+ it("setMinAmount(): only owner can", async function () {
+ const prevValue = await omniVault.minAmount();
+ const newMinAmount = randomBI(4);
+ await expect(omniVault.setMinAmount(newMinAmount))
+ .to.emit(omniVault, "MinAmountChanged")
+ .withArgs(prevValue, newMinAmount);
+ expect(await omniVault.minAmount()).to.be.eq(newMinAmount);
+ await expect(omniVault.connect(signer1).deposit(signer1.address, { value: newMinAmount - 1n }))
+ .to.be.revertedWithCustomError(omniVault, "LowerMinAmount")
+ .withArgs(newMinAmount);
+ });
+
+ it("setMinAmount(): reverts when called by not an owner", async function () {
+ await expect(omniVault.connect(signer1).setMinAmount(randomBI(3))).to.be.revertedWithCustomError(
+ omniVault,
+ "OwnableUnauthorizedAccount",
+ );
+ });
+
+ it("setTargetFlashCapacity(): only owner can", async function () {
+ const prevValue = await omniVault.targetCapacity();
+ const newValue = randomBI(18);
+ await expect(omniVault.setTargetFlashCapacity(newValue))
+ .to.emit(omniVault, "TargetCapacityChanged")
+ .withArgs(prevValue, newValue);
+ expect(await omniVault.targetCapacity()).to.be.eq(newValue);
+ });
+
+ it("setTargetFlashCapacity(): reverts when called by not an owner", async function () {
+ const newValue = randomBI(18);
+ await expect(omniVault.connect(signer1).setTargetFlashCapacity(newValue)).to.be.revertedWithCustomError(
+ omniVault,
+ "OwnableUnauthorizedAccount",
+ );
+ });
+
+ it("setTargetFlashCapacity(): reverts when sets to 0", async function () {
+ await expect(omniVault.setTargetFlashCapacity(0n)).to.be.revertedWithCustomError(omniVault, "NullParams");
+ });
+
+ it("setProtocolFee(): sets share of flashWithdrawFee that goes to treasury", async function () {
+ const prevValue = await omniVault.protocolFee();
+ const newValue = randomBI(10);
+ await expect(omniVault.setProtocolFee(newValue))
+ .to.emit(omniVault, "ProtocolFeeChanged")
+ .withArgs(prevValue, newValue);
+ expect(await omniVault.protocolFee()).to.be.eq(newValue);
+ });
+
+ it("setProtocolFee(): reverts when > MAX_PERCENT", async function () {
+ const newValue = (await omniVault.MAX_PERCENT()) + 1n;
+ await expect(omniVault.setProtocolFee(newValue))
+ .to.be.revertedWithCustomError(omniVault, "ParameterExceedsLimits")
+ .withArgs(newValue);
+ });
+
+ it("setProtocolFee(): reverts when caller is not an owner", async function () {
+ const newValue = randomBI(10);
+ await expect(omniVault.connect(signer1).setProtocolFee(newValue)).to.be.revertedWithCustomError(
+ omniVault,
+ "OwnableUnauthorizedAccount",
+ );
+ });
+
+ it("setName(): only owner can", async function () {
+ const prevValue = await omniVault.name();
+ const newValue = "New name";
+ await expect(omniVault.setName(newValue)).to.emit(omniVault, "NameChanged").withArgs(prevValue, newValue);
+ expect(await omniVault.name()).to.be.eq(newValue);
+ });
+
+ it("setName(): reverts when new name is blank", async function () {
+ await expect(omniVault.setName("")).to.be.revertedWithCustomError(omniVault, "NullParams");
+ });
+
+ it("setName(): reverts when called by not an owner", async function () {
+ await expect(omniVault.connect(signer1).setName("New name")).to.be.revertedWithCustomError(
+ omniVault,
+ "OwnableUnauthorizedAccount",
+ );
+ });
+
+ it("pause(): only owner can", async function () {
+ expect(await omniVault.paused()).is.false;
+ await expect(omniVault.pause()).to.emit(omniVault, "Paused").withArgs(owner.address);
+ expect(await omniVault.paused()).is.true;
+ });
+
+ it("pause(): reverts when called by not an owner", async function () {
+ await expect(omniVault.connect(signer1).pause()).to.be.revertedWithCustomError(
+ omniVault,
+ "OwnableUnauthorizedAccount",
+ );
+ });
+
+ it("pause(): reverts when already paused", async function () {
+ await omniVault.pause();
+ await expect(omniVault.pause()).revertedWithCustomError(omniVault, "EnforcedPause");
+ });
+
+ it("unpause(): only owner can", async function () {
+ await omniVault.pause();
+ expect(await omniVault.paused()).is.true;
+
+ await expect(omniVault.unpause()).to.emit(omniVault, "Unpaused").withArgs(owner.address);
+ expect(await omniVault.paused()).is.false;
+ });
+
+ it("unpause(): reverts when called by not an owner", async function () {
+ await omniVault.pause();
+ expect(await omniVault.paused()).is.true;
+ await expect(omniVault.connect(signer1).unpause()).to.be.revertedWithCustomError(
+ omniVault,
+ "OwnableUnauthorizedAccount",
+ );
+ });
+ });
+});
diff --git a/projects/vaults/test/InceptionToken.js b/projects/vaults/test/InceptionToken.js
index 16560927..18522e80 100644
--- a/projects/vaults/test/InceptionToken.js
+++ b/projects/vaults/test/InceptionToken.js
@@ -47,16 +47,15 @@ describe("Inception token", function () {
it("set on pause", async function () {
expect(await iToken.paused()).equal(false);
- await expect(iToken.connect(staker1).pause()).to.be.revertedWith("Ownable: caller is not the owner");
+ await expect(iToken.connect(staker1).pause()).to.be.revertedWithCustomError(iToken, "OwnableUnauthorizedAccount");
await iToken.connect(owner).pause();
await expect(iToken.connect(owner).pause()).to.be.revertedWith("InceptionToken: paused");
expect(await iToken.paused()).equal(true);
});
it("mint && burn are paused", async function () {
- await expect(iToken.connect(owner).mint(staker1.address, e18)).to.be.revertedWith(
- "InceptionToken: token transfer while paused",
- );
+ await expect(iToken.connect(owner).mint(staker1.address, e18))
+ .to.be.revertedWith("InceptionToken: token transfer while paused");
await expect(iToken.connect(owner).burn(staker1.address, e18)).to.be.revertedWith(
"InceptionToken: token transfer while paused",
);
@@ -73,7 +72,7 @@ describe("Inception token", function () {
it("unpause", async function () {
expect(await iToken.paused()).equal(true);
- await expect(iToken.connect(staker1).unpause()).to.be.revertedWith("Ownable: caller is not the owner");
+ await expect(iToken.connect(staker1).unpause()).to.be.revertedWithCustomError(iToken, "OwnableUnauthorizedAccount");
await iToken.connect(owner).unpause();
await expect(iToken.connect(owner).unpause()).to.be.revertedWith("InceptionToken: not paused");
expect(await iToken.paused()).equal(false);
diff --git a/projects/vaults/test/InceptionVaultV2.js b/projects/vaults/test/InceptionVaultV2.js
index 175b55a6..e215d6ae 100644
--- a/projects/vaults/test/InceptionVaultV2.js
+++ b/projects/vaults/test/InceptionVaultV2.js
@@ -739,7 +739,10 @@ assets.forEach(function (a) {
});
it("setTreasuryAddress(): reverts when caller is not an operator", async function () {
- await expect(iVault.connect(staker).setTreasuryAddress(staker2.address)).to.be.revertedWith("Ownable: caller is not the owner");
+ await expect(iVault.connect(staker).setTreasuryAddress(staker2.address)).to.be.revertedWithCustomError(
+ iToken,
+ "OwnableUnauthorizedAccount",
+ );
});
it("setOperator(): only owner can", async function () {
@@ -761,7 +764,10 @@ assets.forEach(function (a) {
});
it("setOperator(): reverts when caller is not an operator", async function () {
- await expect(iVault.connect(staker).setOperator(staker2.address)).to.be.revertedWith("Ownable: caller is not the owner");
+ await expect(iVault.connect(staker).setOperator(staker2.address)).to.be.revertedWithCustomError(
+ iToken,
+ "OwnableUnauthorizedAccount",
+ );
});
it("addELOperator(): only owner can", async function () {
@@ -774,7 +780,10 @@ assets.forEach(function (a) {
});
it("addELOperator(): reverts when caller is not an owner", async function () {
- await expect(iVault.connect(iVaultOperator).addELOperator(nodeOperators[0])).to.be.revertedWith("Ownable: caller is not the owner");
+ await expect(iVault.connect(iVaultOperator).addELOperator(nodeOperators[0])).to.be.revertedWithCustomError(
+ iToken,
+ "OwnableUnauthorizedAccount",
+ );
});
it("addELOperator(): reverts when address is not a staker-operator", async function () {
@@ -797,8 +806,11 @@ assets.forEach(function (a) {
);
});
- it("setDelegationManager(): reverts when caller is not an operator", async function () {
- await expect(iVault.connect(staker).setDelegationManager(staker2.address)).to.be.revertedWith("Ownable: caller is not the owner");
+ it("setDelegationManager(): reverts when caller is not an owner", async function () {
+ await expect(iVault.connect(staker).setDelegationManager(staker2.address)).to.be.revertedWithCustomError(
+ iToken,
+ "OwnableUnauthorizedAccount",
+ );
});
it("setRatioFeed(): only owner can", async function () {
@@ -814,7 +826,10 @@ assets.forEach(function (a) {
it("setRatioFeed(): reverts when caller is not an owner", async function () {
const newRatioFeed = ethers.Wallet.createRandom().address;
- await expect(iVault.connect(staker).setRatioFeed(newRatioFeed)).to.be.revertedWith("Ownable: caller is not the owner");
+ await expect(iVault.connect(staker).setRatioFeed(newRatioFeed)).to.be.revertedWithCustomError(
+ iToken,
+ "OwnableUnauthorizedAccount",
+ );
});
it("setMinAmount(): only owner can", async function () {
@@ -830,7 +845,10 @@ assets.forEach(function (a) {
});
it("setMinAmount(): another address can not", async function () {
- await expect(iVault.connect(staker).setMinAmount(randomBI(3))).to.be.revertedWith("Ownable: caller is not the owner");
+ await expect(iVault.connect(staker).setMinAmount(randomBI(3))).to.be.revertedWithCustomError(
+ iToken,
+ "OwnableUnauthorizedAccount",
+ );
});
it("setName(): only owner can", async function () {
@@ -845,12 +863,18 @@ assets.forEach(function (a) {
});
it("setName(): another address can not", async function () {
- await expect(iVault.connect(staker).setName("New name")).to.be.revertedWith("Ownable: caller is not the owner");
+ await expect(iVault.connect(staker).setName("New name")).to.be.revertedWithCustomError(
+ iToken,
+ "OwnableUnauthorizedAccount",
+ );
});
it("updateEpoch(): reverts when paused", async function () {
await iVault.pause();
- await expect(iVault.connect(iVaultOperator).updateEpoch()).to.be.revertedWith("Pausable: paused");
+ await expect(iVault.connect(iVaultOperator).updateEpoch()).to.be.revertedWithCustomError(
+ iVault,
+ "EnforcedPause",
+ );
});
it("pause(): only owner can", async function () {
@@ -860,12 +884,15 @@ assets.forEach(function (a) {
});
it("pause(): another address can not", async function () {
- await expect(iVault.connect(staker).pause()).to.be.revertedWith("Ownable: caller is not the owner");
+ await expect(iVault.connect(staker).pause()).to.be.revertedWithCustomError(
+ iToken,
+ "OwnableUnauthorizedAccount",
+ );
});
it("pause(): reverts when already paused", async function () {
await iVault.pause();
- await expect(iVault.pause()).to.be.revertedWith("Pausable: paused");
+ await expect(iVault.pause()).to.be.revertedWithCustomError(iVault, "EnforcedPause");
});
it("unpause(): only owner can", async function () {
@@ -879,7 +906,10 @@ assets.forEach(function (a) {
it("unpause(): another address can not", async function () {
await iVault.pause();
expect(await iVault.paused()).is.true;
- await expect(iVault.connect(staker).unpause()).to.be.revertedWith("Ownable: caller is not the owner");
+ await expect(iVault.connect(staker).unpause()).to.be.revertedWithCustomError(
+ iToken,
+ "OwnableUnauthorizedAccount",
+ );
});
it("upgradeTo(): only owner can", async function () {
@@ -898,15 +928,19 @@ assets.forEach(function (a) {
it("upgradeTo(): reverts when caller is not an operator", async function () {
const newRestakeImp = await ethers.deployContract("InceptionRestaker");
- await expect(iVault.connect(staker).upgradeTo(await newRestakeImp.getAddress())).to.be.revertedWith(
- "Ownable: caller is not the owner"
+ await expect(iVault.connect(staker).upgradeTo(await newRestakeImp.getAddress())).to.be.revertedWithCustomError(
+ iToken,
+ "OwnableUnauthorizedAccount",
);
});
it("upgradeTo(): reverts when paused", async function () {
const newRestakeImp = await ethers.deployContract("InceptionRestaker");
await iVault.pause();
- await expect(iVault.upgradeTo(await newRestakeImp.getAddress())).to.be.revertedWith("Pausable: paused");
+ await expect(iVault.upgradeTo(await newRestakeImp.getAddress())).revertedWithCustomError(
+ iVault,
+ "EnforcedPause",
+ );
await iVault.unpause();
});
@@ -921,7 +955,10 @@ assets.forEach(function (a) {
it("setTargetFlashCapacity(): reverts when caller is not an owner", async function () {
const newValue = randomBI(18);
- await expect(iVault.connect(staker).setTargetFlashCapacity(newValue)).to.be.revertedWith("Ownable: caller is not the owner");
+ await expect(iVault.connect(staker).setTargetFlashCapacity(newValue)).to.be.revertedWithCustomError(
+ iToken,
+ "OwnableUnauthorizedAccount",
+ );
});
it("setProtocolFee(): sets share of flashWithdrawFee that goes to treasury", async function () {
@@ -938,7 +975,10 @@ assets.forEach(function (a) {
it("setProtocolFee(): reverts when caller is not an owner", async function () {
const newValue = randomBI(10);
- await expect(iVault.connect(staker).setProtocolFee(newValue)).to.be.revertedWith("Ownable: caller is not the owner");
+ await expect(iVault.connect(staker).setProtocolFee(newValue)).to.be.revertedWithCustomError(
+ iToken,
+ "OwnableUnauthorizedAccount",
+ );
});
});
@@ -1138,8 +1178,10 @@ assets.forEach(function (a) {
it("setDepositBonusParams reverts when caller is not an owner", async function () {
await expect(
- iVault.connect(staker).setDepositBonusParams(BigInt(2 * 10 ** 8), BigInt(0.2 * 10 ** 8), BigInt(25 * 10 ** 8))
- ).to.be.revertedWith("Ownable: caller is not the owner");
+ iVault
+ .connect(staker)
+ .setDepositBonusParams(BigInt(2 * 10 ** 8), BigInt(0.2 * 10 ** 8), BigInt(25 * 10 ** 8)),
+ ).to.be.revertedWithCustomError(iToken, "OwnableUnauthorizedAccount");
});
});
@@ -1355,7 +1397,7 @@ assets.forEach(function (a) {
iVault
.connect(staker)
.setFlashWithdrawFeeParams(BigInt(2 * 10 ** 8), BigInt(0.2 * 10 ** 8), BigInt(25 * 10 ** 8)),
- ).to.be.revertedWith("Ownable: caller is not the owner");
+ ).to.be.revertedWithCustomError(iToken, "OwnableUnauthorizedAccount");
});
});
@@ -1382,7 +1424,10 @@ assets.forEach(function (a) {
});
it("setVault(): another address can not", async function () {
- await expect(iToken.connect(staker).setVault(staker2.address)).to.be.revertedWith("Ownable: caller is not the owner");
+ await expect(iToken.connect(staker).setVault(staker2.address)).to.be.revertedWithCustomError(
+ iToken,
+ "OwnableUnauthorizedAccount",
+ );
});
it("pause(): only owner can", async function () {
@@ -1392,7 +1437,10 @@ assets.forEach(function (a) {
});
it("pause(): another address can not", async function () {
- await expect(iToken.connect(staker).pause()).to.be.revertedWith("Ownable: caller is not the owner");
+ await expect(iToken.connect(staker).pause()).to.be.revertedWithCustomError(
+ iToken,
+ "OwnableUnauthorizedAccount",
+ );
});
it("pause(): reverts when it has already been paused", async function () {
@@ -1424,7 +1472,10 @@ assets.forEach(function (a) {
it("unpause(): another address can not", async function () {
await iToken.pause();
expect(await iToken.paused()).is.true;
- await expect(iToken.connect(staker).unpause()).to.be.revertedWith("Ownable: caller is not the owner");
+ await expect(iToken.connect(staker).unpause()).to.be.revertedWithCustomError(
+ iToken,
+ "OwnableUnauthorizedAccount",
+ );
});
it("unpause(): when it is not paused", async function () {
@@ -1531,7 +1582,10 @@ assets.forEach(function (a) {
});
it("pause(): another address can not", async function () {
- await expect(restaker.connect(staker).pause()).to.be.revertedWith("Ownable: caller is not the owner");
+ await expect(restaker.connect(staker).pause()).to.be.revertedWithCustomError(
+ iToken,
+ "OwnableUnauthorizedAccount",
+ );
});
it("unpause(): only owner can", async function () {
@@ -1545,7 +1599,10 @@ assets.forEach(function (a) {
it("unpause(): another address can not", async function () {
await restaker.connect(iVaultMock).pause();
expect(await restaker.paused()).is.true;
- await expect(restaker.connect(staker).unpause()).to.be.revertedWith("Ownable: caller is not the owner");
+ await expect(restaker.connect(staker).unpause()).to.be.revertedWithCustomError(
+ iToken,
+ "OwnableUnauthorizedAccount",
+ );
});
});
@@ -1722,7 +1779,10 @@ assets.forEach(function (a) {
it("Reverts: deposit when iVault is paused", async function () {
await iVault.pause();
const depositAmount = randomBI(19);
- await expect(iVault.connect(staker).deposit(depositAmount, staker.address)).to.be.revertedWith("Pausable: paused");
+ await expect(iVault.connect(staker).deposit(depositAmount, staker.address)).to.be.revertedWithCustomError(
+ iVault,
+ "EnforcedPause",
+ );
await iVault.unpause();
});
@@ -1730,7 +1790,9 @@ assets.forEach(function (a) {
await iVault.pause();
const depositAmount = randomBI(19);
const code = ethers.encodeBytes32String(randomAddress().slice(0, 8));
- await expect(iVault.connect(staker).depositWithReferral(depositAmount, staker, code)).to.be.revertedWith("Pausable: paused");
+ await expect(
+ iVault.connect(staker).depositWithReferral(depositAmount, staker, code),
+ ).to.be.revertedWithCustomError(iVault, "EnforcedPause");
await iVault.unpause();
});
@@ -2236,8 +2298,10 @@ assets.forEach(function (a) {
await iVault.connect(staker).deposit(amount, staker.address);
await iVault.pause();
await expect(
- iVault.connect(iVaultOperator).delegateToOperator(amount, nodeOperators[0], ethers.ZeroHash, [ethers.ZeroHash, 0])
- ).to.be.revertedWith("Pausable: paused");
+ iVault
+ .connect(iVaultOperator)
+ .delegateToOperator(amount, nodeOperators[0], ethers.ZeroHash, [ethers.ZeroHash, 0]),
+ ).to.be.revertedWithCustomError(iVault, "EnforcedPause");
await iVault.unpause();
});
@@ -2403,28 +2467,28 @@ assets.forEach(function (a) {
name: "> balance",
amount: async () => (await iToken.balanceOf(staker.address)) + 1n,
receiver: () => staker.address,
- isCustom: false,
- error: "ERC20: burn amount exceeds balance",
+ contract: () => iToken,
+ error: "ERC20InsufficientBalance",
},
{
name: "< min amount",
amount: async () => (await iVault.minAmount()) - 1n,
receiver: () => staker.address,
- isCustom: true,
+ contract: () => iVault,
error: "LowerMinAmount",
},
{
name: "0",
amount: async () => 0n,
receiver: () => staker.address,
- isCustom: true,
+ contract: () => iVault,
error: "NullParams",
},
{
name: "to zero address",
amount: async () => randomBI(15),
receiver: () => ethers.ZeroAddress,
- isCustom: true,
+ contract: () => iVault,
error: "NullParams",
},
];
@@ -2433,11 +2497,10 @@ assets.forEach(function (a) {
it(`Reverts: withdraws ${test.name}`, async function () {
const amount = await test.amount();
const receiver = test.receiver();
- if (test.isCustom) {
- await expect(iVault.connect(staker).withdraw(amount, receiver)).to.be.revertedWithCustomError(iVault, test.error);
- } else {
- await expect(iVault.connect(staker).withdraw(amount, receiver)).to.be.revertedWith(test.error);
- }
+ await expect(iVault.connect(staker).withdraw(amount, receiver)).to.be.revertedWithCustomError(
+ test.contract(),
+ test.error,
+ );
});
});
@@ -2462,7 +2525,10 @@ assets.forEach(function (a) {
it("Reverts: withdraw when iVault is paused", async function () {
await iVault.pause();
- await expect(iVault.connect(staker).withdraw(toWei(0.1), staker.address)).to.be.revertedWith("Pausable: paused");
+ await expect(iVault.connect(staker).withdraw(toWei(1), staker.address)).to.be.revertedWithCustomError(
+ iVault,
+ "EnforcedPause",
+ );
await iVault.unpause();
});
@@ -2615,7 +2681,10 @@ assets.forEach(function (a) {
await iVault.connect(staker).deposit(toWei(0.001), staker.address);
await iVault.pause();
const amount = await iVault.getFlashCapacity();
- await expect(iVault.connect(staker).flashWithdraw(amount, staker.address)).to.be.revertedWith("Pausable: paused");
+ await expect(iVault.connect(staker).flashWithdraw(amount, staker.address)).to.be.revertedWithCustomError(
+ iVault,
+ "EnforcedPause",
+ );
});
});
@@ -3168,7 +3237,9 @@ assets.forEach(function (a) {
it("Reverts: undelegate when iVault is paused", async function () {
const amount = randomBI(18);
await iVault.pause();
- await expect(iVault.connect(iVaultOperator).undelegateFrom(nodeOperators[0], amount)).to.be.revertedWith("Pausable: paused");
+ await expect(
+ iVault.connect(iVaultOperator).undelegateFrom(nodeOperators[0], amount),
+ ).to.be.revertedWithCustomError(iVault, "EnforcedPause");
await iVault.unpause();
});
});
@@ -3214,7 +3285,10 @@ assets.forEach(function (a) {
it("Reverts: undelegate when iVault is paused", async function () {
const amount = randomBI(18);
await iVault.pause();
- await expect(iVault.connect(iVaultOperator).undelegateVault(amount)).to.be.revertedWith("Pausable: paused");
+ await expect(iVault.connect(iVaultOperator).undelegateVault(amount)).to.be.revertedWithCustomError(
+ iVault,
+ "EnforcedPause",
+ );
await iVault.unpause();
});
});
@@ -3377,7 +3451,9 @@ assets.forEach(function (a) {
it("Reverts: when iVault is paused", async function () {
await iVault.pause();
- await expect(iVault.claimCompletedWithdrawals(withdrawalData[2], [withdrawalData])).to.be.revertedWith("Pausable: paused");
+ await expect(
+ iVault.claimCompletedWithdrawals(withdrawalData[2], [withdrawalData]),
+ ).to.be.revertedWithCustomError(iVault, "EnforcedPause");
});
it("Reverts: when claim without delay", async function () {
@@ -3536,7 +3612,10 @@ assets.forEach(function (a) {
it("Reverts: redeem when iVault is paused", async function () {
await iVault.pause();
- await expect(iVault.connect(iVaultOperator).redeem(staker.address)).to.be.revertedWith("Pausable: paused");
+ await expect(iVault.connect(iVaultOperator).redeem(staker.address)).to.be.revertedWithCustomError(
+ iVault,
+ "EnforcedPause",
+ );
});
it("Unpause after previous test", async function () {
diff --git a/projects/vaults/test/helpers/utils.js b/projects/vaults/test/helpers/utils.js
index c6a9e757..35bba10e 100644
--- a/projects/vaults/test/helpers/utils.js
+++ b/projects/vaults/test/helpers/utils.js
@@ -26,6 +26,26 @@ const addRewardsToStrategy = async (strategyAddress, amount, staker) => {
// await bEigen.connect(staker).transfer(strategyAddress, amount);
};
+const calculateRatioOmniVault = async (vault, token) => {
+ const totalSupply = await token.totalSupply();
+ const totalDeposited = await vault.getTotalDeposited();
+
+ const denominator = totalDeposited;
+
+ if (denominator === 0n || totalSupply === 0n) {
+ const ratio = e18;
+ // console.log(`Current ratio is:\t\t\t\t${ratio.format()}`);
+ return ratio;
+ }
+
+ const ratio = (totalSupply * e18) / denominator;
+ if ((totalSupply * e18) % denominator !== 0n) {
+ return ratio + 1n;
+ }
+ // console.log(`Current ratio is:\t\t\t\t${ratio.format()}`);
+ return ratio;
+};
+
const calculateRatio = async (vault, token) => {
const totalSupply = await token.totalSupply();
const totalDeposited = await vault.getTotalDeposited();
@@ -143,6 +163,7 @@ module.exports = {
withdrawDataFromTx,
impersonateWithEth,
calculateRatio,
+ calculateRatioOmniVault,
getStaker,
getRandomStaker,
mineBlocks,
diff --git a/projects/vaults/yarn.lock b/projects/vaults/yarn.lock
index a6ff90ff..cd9a36d3 100644
--- a/projects/vaults/yarn.lock
+++ b/projects/vaults/yarn.lock
@@ -24,6 +24,17 @@
dependencies:
"@truffle/hdwallet-provider" "^1.0.0"
+"@arbitrum/nitro-contracts@^2.1.0":
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/@arbitrum/nitro-contracts/-/nitro-contracts-2.1.0.tgz#b2900c0b9fad38716dce29c2b3cc96eb35611b55"
+ integrity sha512-Bh89H5/ihWVcAI2eNBc1McybZAmpTHJ5eFLauLz8bjicZTOD545vSYAreJN41Uo+AlHKVAMtODUQdoP0NVtg3Q==
+ dependencies:
+ "@offchainlabs/upgrade-executor" "1.1.0-beta.0"
+ "@openzeppelin/contracts" "4.5.0"
+ "@openzeppelin/contracts-upgradeable" "4.5.2"
+ patch-package "^6.4.7"
+ solady "0.0.182"
+
"@aws-crypto/sha256-js@1.2.2":
version "1.2.2"
resolved "https://registry.yarnpkg.com/@aws-crypto/sha256-js/-/sha256-js-1.2.2.tgz#02acd1a1fda92896fc5a28ec7c6e164644ea32fc"
@@ -521,11 +532,6 @@
"@ethersproject/properties" "^5.7.0"
"@ethersproject/strings" "^5.7.0"
-"@fastify/busboy@^2.0.0":
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/@fastify/busboy/-/busboy-2.1.0.tgz#0709e9f4cb252351c609c6e6d8d6779a8d25edff"
- integrity sha512-+KpH+QxZU7O4675t3mnkQKcZZg56u+K/Ct2K+N2AZYNVK8kyeo/bI18tI8aPm3tvNNRyTWfj6s5tnGNlcbQRsA==
-
"@jridgewell/resolve-uri@^3.0.3":
version "3.1.1"
resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz#c08679063f279615a3326583ba3a90d1d82cc721"
@@ -544,6 +550,20 @@
"@jridgewell/resolve-uri" "^3.0.3"
"@jridgewell/sourcemap-codec" "^1.4.10"
+"@layerzerolabs/lz-v2-utilities@^3.0.7":
+ version "3.0.7"
+ resolved "https://registry.yarnpkg.com/@layerzerolabs/lz-v2-utilities/-/lz-v2-utilities-3.0.7.tgz#f64475d30d151cfd670fd73b791aa807b865ed1b"
+ integrity sha512-82gK2cT3wMMwN2BgX1uUnJPhRD4/uk4Bwjd44/7KyIdx8aqdZobHZ6Z/xrCfsc4ADGEn2S6r5+CSDN9Xs7IcRg==
+ dependencies:
+ "@ethersproject/abi" "^5.7.0"
+ "@ethersproject/address" "^5.7.0"
+ "@ethersproject/bignumber" "^5.7.0"
+ "@ethersproject/bytes" "^5.7.0"
+ "@ethersproject/keccak256" "^5.7.0"
+ "@ethersproject/solidity" "^5.7.0"
+ bs58 "^5.0.0"
+ tiny-invariant "^1.3.1"
+
"@metamask/eth-sig-util@^4.0.0":
version "4.0.1"
resolved "https://registry.yarnpkg.com/@metamask/eth-sig-util/-/eth-sig-util-4.0.1.tgz#3ad61f6ea9ad73ba5b19db780d40d9aae5157088"
@@ -606,53 +626,53 @@
"@nodelib/fs.scandir" "2.1.5"
fastq "^1.6.0"
-"@nomicfoundation/edr-darwin-arm64@0.4.2":
- version "0.4.2"
- resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-darwin-arm64/-/edr-darwin-arm64-0.4.2.tgz#2ff98535f272c9f2a7d06eeda93fe7b207a348a4"
- integrity sha512-S+hhepupfqpBvMa9M1PVS08sVjGXsLnjyAsjhrrsjsNuTHVLhKzhkguvBD5g4If5skrwgOaVqpag4wnQbd15kQ==
+"@nomicfoundation/edr-darwin-arm64@0.6.4":
+ version "0.6.4"
+ resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-darwin-arm64/-/edr-darwin-arm64-0.6.4.tgz#6eaa64a6ea5201e4c92b121f2b7fd197b26e450a"
+ integrity sha512-QNQErISLgssV9+qia8sIjRANqtbW8snSDvjspixT/kSQ5ZSGxxctTg7x72wPSrcu8+EBEveIe5uqENIp5GH8HQ==
-"@nomicfoundation/edr-darwin-x64@0.4.2":
- version "0.4.2"
- resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-darwin-x64/-/edr-darwin-x64-0.4.2.tgz#001dcd0e7fa4c52046d283b0dc61e63a60c614dd"
- integrity sha512-/zM94AUrXz6CmcsecRNHJ50jABDUFafmGc4iBmkfX/mTp4tVZj7XTyIogrQIt0FnTaeb4CgZoLap2+8tW/Uldg==
+"@nomicfoundation/edr-darwin-x64@0.6.4":
+ version "0.6.4"
+ resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-darwin-x64/-/edr-darwin-x64-0.6.4.tgz#d15ca89e9deef7d0a710cf90e79f3cc270a5a999"
+ integrity sha512-cjVmREiwByyc9+oGfvAh49IAw+oVJHF9WWYRD+Tm/ZlSpnEVWxrGNBak2bd/JSYjn+mZE7gmWS4SMRi4nKaLUg==
-"@nomicfoundation/edr-linux-arm64-gnu@0.4.2":
- version "0.4.2"
- resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-linux-arm64-gnu/-/edr-linux-arm64-gnu-0.4.2.tgz#6d19f8265c8ffb22e29bc5bbbb5d1913fe4b306b"
- integrity sha512-TV3Pr2tFvvmCfPCi9PaCGLtqn+oLaPKfL2NWpnoCeFFdzDQXi2L930yP1oUPY5RXd78NLdVHMkEkbhb2b6Wuvg==
+"@nomicfoundation/edr-linux-arm64-gnu@0.6.4":
+ version "0.6.4"
+ resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-linux-arm64-gnu/-/edr-linux-arm64-gnu-0.6.4.tgz#e73c41ca015dfddb5f4cb6cd3d9b2cbe5cc28989"
+ integrity sha512-96o9kRIVD6W5VkgKvUOGpWyUGInVQ5BRlME2Fa36YoNsRQMaKtmYJEU0ACosYES6ZTpYC8U5sjMulvPtVoEfOA==
-"@nomicfoundation/edr-linux-arm64-musl@0.4.2":
- version "0.4.2"
- resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-linux-arm64-musl/-/edr-linux-arm64-musl-0.4.2.tgz#0b01aa405fdc8048c7a8e95c737f29b437536a30"
- integrity sha512-PALwrLBk1M9rolXyhSX8xdhe5jL0qf/PgiCIF7W7lUyVKrI/I0oiU0EHDk/Xw7yi2UJg4WRyhhZoHYa0g4g8Qg==
+"@nomicfoundation/edr-linux-arm64-musl@0.6.4":
+ version "0.6.4"
+ resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-linux-arm64-musl/-/edr-linux-arm64-musl-0.6.4.tgz#90906f733e4ad26657baeb22d28855d934ab7541"
+ integrity sha512-+JVEW9e5plHrUfQlSgkEj/UONrIU6rADTEk+Yp9pbe+mzNkJdfJYhs5JYiLQRP4OjxH4QOrXI97bKU6FcEbt5Q==
-"@nomicfoundation/edr-linux-x64-gnu@0.4.2":
- version "0.4.2"
- resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-linux-x64-gnu/-/edr-linux-x64-gnu-0.4.2.tgz#10959fd4db9b333d3e0559cb893e109611889af0"
- integrity sha512-5svkftypDjAZ1LxV1onojlaqPRxrTEjJLkrUwLL+Fao5ZMe7aTnk5QQ1Jv76gW6WYZnMXNgjPhRcnw3oSNrqFA==
+"@nomicfoundation/edr-linux-x64-gnu@0.6.4":
+ version "0.6.4"
+ resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-linux-x64-gnu/-/edr-linux-x64-gnu-0.6.4.tgz#11b8bd73df145a192e5a08199e5e81995fcde502"
+ integrity sha512-nzYWW+fO3EZItOeP4CrdMgDXfaGBIBkKg0Y/7ySpUxLqzut40O4Mb0/+quqLAFkacUSWMlFp8nsmypJfOH5zoA==
-"@nomicfoundation/edr-linux-x64-musl@0.4.2":
- version "0.4.2"
- resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-linux-x64-musl/-/edr-linux-x64-musl-0.4.2.tgz#8de64a2dfd869dad930dd0eb9572a0593d382379"
- integrity sha512-qiMlXQTggdH9zfOB4Eil4rQ95z8s7QdLJcOfz5Aym12qJNkCyF9hi4cc4dDCWA0CdI3x3oLbuf8qb81SF8R45w==
+"@nomicfoundation/edr-linux-x64-musl@0.6.4":
+ version "0.6.4"
+ resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-linux-x64-musl/-/edr-linux-x64-musl-0.6.4.tgz#a34b9a2c9e34853207824dc81622668a069ca642"
+ integrity sha512-QFRoE9qSQ2boRrVeQ1HdzU+XN7NUgwZ1SIy5DQt4d7jCP+5qTNsq8LBNcqhRBOATgO63nsweNUhxX/Suj5r1Sw==
-"@nomicfoundation/edr-win32-x64-msvc@0.4.2":
- version "0.4.2"
- resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-win32-x64-msvc/-/edr-win32-x64-msvc-0.4.2.tgz#13ad4bab9fd68853930e1a3d87c78d69d1d0e2ef"
- integrity sha512-hDkAb0iaMmGYwBY/rA1oCX8VpsezfQcHPEPIEGXEcWC3WbnOgIZo0Qkpu/g0OMtFOJSQlWLXvKZuV7blhnrQag==
+"@nomicfoundation/edr-win32-x64-msvc@0.6.4":
+ version "0.6.4"
+ resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-win32-x64-msvc/-/edr-win32-x64-msvc-0.6.4.tgz#ca035c6f66ae9f88fa3ef123a1f3a2099cce7a5a"
+ integrity sha512-2yopjelNkkCvIjUgBGhrn153IBPLwnsDeNiq6oA0WkeM8tGmQi4td+PGi9jAriUDAkc59Yoi2q9hYA6efiY7Zw==
-"@nomicfoundation/edr@^0.4.1":
- version "0.4.2"
- resolved "https://registry.yarnpkg.com/@nomicfoundation/edr/-/edr-0.4.2.tgz#9d7550182d4f75d7510e265ebd3474c4f6fcb62a"
- integrity sha512-U7v0HuZHfrsl/5FpUzuB2FYA0+FUglHHwiO6NhvLtNYKMZcPzdS6iUriMp/7GWs0SVxW3bAht9GinZPxdhVwWg==
+"@nomicfoundation/edr@^0.6.3":
+ version "0.6.4"
+ resolved "https://registry.yarnpkg.com/@nomicfoundation/edr/-/edr-0.6.4.tgz#1cd336c46a60f5af774e6cf0f1943f49f63dded6"
+ integrity sha512-YgrSuT3yo5ZQkbvBGqQ7hG+RDvz3YygSkddg4tb1Z0Y6pLXFzwrcEwWaJCFAVeeZxdxGfCgGMUYgRVneK+WXkw==
dependencies:
- "@nomicfoundation/edr-darwin-arm64" "0.4.2"
- "@nomicfoundation/edr-darwin-x64" "0.4.2"
- "@nomicfoundation/edr-linux-arm64-gnu" "0.4.2"
- "@nomicfoundation/edr-linux-arm64-musl" "0.4.2"
- "@nomicfoundation/edr-linux-x64-gnu" "0.4.2"
- "@nomicfoundation/edr-linux-x64-musl" "0.4.2"
- "@nomicfoundation/edr-win32-x64-msvc" "0.4.2"
+ "@nomicfoundation/edr-darwin-arm64" "0.6.4"
+ "@nomicfoundation/edr-darwin-x64" "0.6.4"
+ "@nomicfoundation/edr-linux-arm64-gnu" "0.6.4"
+ "@nomicfoundation/edr-linux-arm64-musl" "0.6.4"
+ "@nomicfoundation/edr-linux-x64-gnu" "0.6.4"
+ "@nomicfoundation/edr-linux-x64-musl" "0.6.4"
+ "@nomicfoundation/edr-win32-x64-msvc" "0.6.4"
"@nomicfoundation/ethereumjs-common@4.0.4":
version "4.0.4"
@@ -731,10 +751,10 @@
resolved "https://registry.yarnpkg.com/@nomicfoundation/hardhat-toolbox/-/hardhat-toolbox-5.0.0.tgz#165b47f8a3d2bf668cc5d453ce7f496a1156948d"
integrity sha512-FnUtUC5PsakCbwiVNsqlXVIWG5JIb5CEZoSXbJUsEBun22Bivx2jhF1/q9iQbzuaGpJKFQyOhemPB2+XlEE6pQ==
-"@nomicfoundation/hardhat-verify@^2.0.0":
- version "2.0.8"
- resolved "https://registry.yarnpkg.com/@nomicfoundation/hardhat-verify/-/hardhat-verify-2.0.8.tgz#6a77dc03de990a1a3aa8e6dc073c393263dbf258"
- integrity sha512-x/OYya7A2Kcz+3W/J78dyDHxr0ezU23DKTrRKfy5wDPCnePqnr79vm8EXqX3gYps6IjPBYyGPZ9K6E5BnrWx5Q==
+"@nomicfoundation/hardhat-verify@^2.0.11":
+ version "2.0.11"
+ resolved "https://registry.yarnpkg.com/@nomicfoundation/hardhat-verify/-/hardhat-verify-2.0.11.tgz#4ce12b592e01ee93a81933924609c233ed00d951"
+ integrity sha512-lGIo4dNjVQFdsiEgZp3KP6ntLiF7xJEJsbNHfSyIiFCyI0Yv0518ElsFtMC5uCuHEChiBBMrib9jWQvHHT+X3Q==
dependencies:
"@ethersproject/abi" "^5.1.2"
"@ethersproject/address" "^5.0.2"
@@ -766,6 +786,66 @@
resolved "https://registry.yarnpkg.com/@nomicfoundation/ignition-ui/-/ignition-ui-0.15.5.tgz#ef9e11ccbffccc2360c02b20f12713756dfc37da"
integrity sha512-ZcE4rIn10qKahR4OqS8rl8NM2Fbg2QYiBXgMgj74ZI0++LlCcZgB5HyaBbX+lsnKHjTXtjYD3b+2mtg7jFbAMQ==
+"@nomicfoundation/slang-darwin-arm64@0.17.0":
+ version "0.17.0"
+ resolved "https://registry.yarnpkg.com/@nomicfoundation/slang-darwin-arm64/-/slang-darwin-arm64-0.17.0.tgz#8cded3c24322624e3b6618760caba8e840bd1c1d"
+ integrity sha512-O0q94EUtoWy9A5kOTOa9/khtxXDYnLqmuda9pQELurSiwbQEVCPQL8kb34VbOW+ifdre66JM/05Xw9JWhIZ9sA==
+
+"@nomicfoundation/slang-darwin-x64@0.17.0":
+ version "0.17.0"
+ resolved "https://registry.yarnpkg.com/@nomicfoundation/slang-darwin-x64/-/slang-darwin-x64-0.17.0.tgz#6ebeb33a2ced89fc6023f6cda4af96403486038a"
+ integrity sha512-IaDbHzvT08sBK2HyGzonWhq1uu8IxdjmTqAWHr25Oh/PYnamdi8u4qchZXXYKz/DHLoYN3vIpBXoqLQIomhD/g==
+
+"@nomicfoundation/slang-linux-arm64-gnu@0.17.0":
+ version "0.17.0"
+ resolved "https://registry.yarnpkg.com/@nomicfoundation/slang-linux-arm64-gnu/-/slang-linux-arm64-gnu-0.17.0.tgz#41c7e57a9b1a3aee6911f0cab22e683c149fb470"
+ integrity sha512-Lj4anvOsQZxs1SycG8VyT2Rl2oqIhyLSUCgGepTt3CiJ/bM+8r8bLJIgh8vKkki4BWz49YsYIgaJB2IPv8FFTw==
+
+"@nomicfoundation/slang-linux-arm64-musl@0.17.0":
+ version "0.17.0"
+ resolved "https://registry.yarnpkg.com/@nomicfoundation/slang-linux-arm64-musl/-/slang-linux-arm64-musl-0.17.0.tgz#9c4b51689274ae75c2c8a4cddd2e1cc0a79c191d"
+ integrity sha512-/xkTCa9d5SIWUBQE3BmLqDFfJRr4yUBwbl4ynPiGUpRXrD69cs6pWKkwjwz/FdBpXqVo36I+zY95qzoTj/YhOA==
+
+"@nomicfoundation/slang-linux-x64-gnu@0.17.0":
+ version "0.17.0"
+ resolved "https://registry.yarnpkg.com/@nomicfoundation/slang-linux-x64-gnu/-/slang-linux-x64-gnu-0.17.0.tgz#c3a3b6a7b775fc617832958d10e6664bf86d39d0"
+ integrity sha512-oe5IO5vntOqYvTd67deCHPIWuSuWm6aYtT2/0Kqz2/VLtGz4ClEulBSRwfnNzBVtw2nksWipE1w8BzhImI7Syg==
+
+"@nomicfoundation/slang-linux-x64-musl@0.17.0":
+ version "0.17.0"
+ resolved "https://registry.yarnpkg.com/@nomicfoundation/slang-linux-x64-musl/-/slang-linux-x64-musl-0.17.0.tgz#725118ff99a7217b9f1d1bd84411d9442084077d"
+ integrity sha512-PpYCI5K/kgLAMXaPY0V4VST5gCDprEOh7z/47tbI8kJQumI5odjsj/Cs8MpTo7/uRH6flKYbVNgUzcocWVYrAQ==
+
+"@nomicfoundation/slang-win32-arm64-msvc@0.17.0":
+ version "0.17.0"
+ resolved "https://registry.yarnpkg.com/@nomicfoundation/slang-win32-arm64-msvc/-/slang-win32-arm64-msvc-0.17.0.tgz#9c8bc4ccf21eaaac0cfcb6d3954ede4e2dea4c02"
+ integrity sha512-u/Mkf7OjokdBilP7QOJj6QYJU4/mjkbKnTX21wLyCIzeVWS7yafRPYpBycKIBj2pRRZ6ceAY5EqRpb0aiCq+0Q==
+
+"@nomicfoundation/slang-win32-ia32-msvc@0.17.0":
+ version "0.17.0"
+ resolved "https://registry.yarnpkg.com/@nomicfoundation/slang-win32-ia32-msvc/-/slang-win32-ia32-msvc-0.17.0.tgz#3fc5d00a3f8c1d85a5e94146af78a5526a4f3d27"
+ integrity sha512-XJBVQfNnZQUv0tP2JSJ573S+pmgrLWgqSZOGaMllnB/TL1gRci4Z7dYRJUF2s82GlRJE+FHSI2Ro6JISKmlXCg==
+
+"@nomicfoundation/slang-win32-x64-msvc@0.17.0":
+ version "0.17.0"
+ resolved "https://registry.yarnpkg.com/@nomicfoundation/slang-win32-x64-msvc/-/slang-win32-x64-msvc-0.17.0.tgz#f6a5e3250fa07cbda49151edeb80f09090e5b71a"
+ integrity sha512-zPGsAeiTfqfPNYHD8BfrahQmYzA78ZraoHKTGraq/1xwJwzBK4bu/NtvVA4pJjBV+B4L6DCxVhSbpn40q26JQA==
+
+"@nomicfoundation/slang@^0.17.0":
+ version "0.17.0"
+ resolved "https://registry.yarnpkg.com/@nomicfoundation/slang/-/slang-0.17.0.tgz#d9c25cd711ebf3490c9d0c99e9b4ca2481341a6b"
+ integrity sha512-1GlkGRcGpVnjFw9Z1vvDKOKo2mzparFt7qrl2pDxWp+jrVtlvej98yCMX52pVyrYE7ZeOSZFnx/DtsSgoukStQ==
+ dependencies:
+ "@nomicfoundation/slang-darwin-arm64" "0.17.0"
+ "@nomicfoundation/slang-darwin-x64" "0.17.0"
+ "@nomicfoundation/slang-linux-arm64-gnu" "0.17.0"
+ "@nomicfoundation/slang-linux-arm64-musl" "0.17.0"
+ "@nomicfoundation/slang-linux-x64-gnu" "0.17.0"
+ "@nomicfoundation/slang-linux-x64-musl" "0.17.0"
+ "@nomicfoundation/slang-win32-arm64-msvc" "0.17.0"
+ "@nomicfoundation/slang-win32-ia32-msvc" "0.17.0"
+ "@nomicfoundation/slang-win32-x64-msvc" "0.17.0"
+
"@nomicfoundation/solidity-analyzer-darwin-arm64@0.1.1":
version "0.1.1"
resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-darwin-arm64/-/solidity-analyzer-darwin-arm64-0.1.1.tgz#4c858096b1c17fe58a474fe81b46815f93645c15"
@@ -896,82 +976,97 @@
table "^6.8.0"
undici "^5.14.0"
-"@openzeppelin/contracts-upgradeable@^4.8.3":
- version "4.9.6"
- resolved "https://registry.yarnpkg.com/@openzeppelin/contracts-upgradeable/-/contracts-upgradeable-4.9.6.tgz#38b21708a719da647de4bb0e4802ee235a0d24df"
- integrity sha512-m4iHazOsOCv1DgM7eD7GupTJ+NFVujRZt1wzddDPSVGpWdKq1SKkla5htKG7+IS4d2XOCtzkUNwRZ7Vq5aEUMA==
+"@offchainlabs/upgrade-executor@1.1.0-beta.0":
+ version "1.1.0-beta.0"
+ resolved "https://registry.yarnpkg.com/@offchainlabs/upgrade-executor/-/upgrade-executor-1.1.0-beta.0.tgz#c4b1375176546a18aaef01a43956abfb58250e0a"
+ integrity sha512-mpn6PHjH/KDDjNX0pXHEKdyv8m6DVGQiI2nGzQn0JbM1nOSHJpWx6fvfjtH7YxHJ6zBZTcsKkqGkFKDtCfoSLw==
+ dependencies:
+ "@openzeppelin/contracts" "4.7.3"
+ "@openzeppelin/contracts-upgradeable" "4.7.3"
-"@openzeppelin/contracts@^4.8.3":
- version "4.9.6"
- resolved "https://registry.yarnpkg.com/@openzeppelin/contracts/-/contracts-4.9.6.tgz#2a880a24eb19b4f8b25adc2a5095f2aa27f39677"
- integrity sha512-xSmezSupL+y9VkHZJGDoCBpmnB2ogM13ccaYDWqJTfS3dbuHkgjuwDFUmaFauBCboQMGB/S5UqUl2y54X99BmA==
+"@openzeppelin/contracts-upgradeable@4.5.2":
+ version "4.5.2"
+ resolved "https://registry.yarnpkg.com/@openzeppelin/contracts-upgradeable/-/contracts-upgradeable-4.5.2.tgz#90d9e47bacfd8693bfad0ac8a394645575528d05"
+ integrity sha512-xgWZYaPlrEOQo3cBj97Ufiuv79SPd8Brh4GcFYhPgb6WvAq4ppz8dWKL6h+jLAK01rUqMRp/TS9AdXgAeNvCLA==
-"@openzeppelin/defender-admin-client@^1.52.0":
- version "1.54.1"
- resolved "https://registry.yarnpkg.com/@openzeppelin/defender-admin-client/-/defender-admin-client-1.54.1.tgz#b877972992b95a0dc3787f2ade2f044586621357"
- integrity sha512-kRpSUdTsnSqntp4FOXIm95t+6VKHc8CUY2Si71VDuxs0q7HSPZkdpRPSntcolwEzWy9L4a8NS/QMwDF5NJ4X1g==
- dependencies:
- "@openzeppelin/defender-base-client" "1.54.1"
- axios "^1.4.0"
- ethers "^5.7.2"
- lodash "^4.17.19"
- node-fetch "^2.6.0"
+"@openzeppelin/contracts-upgradeable@4.7.3":
+ version "4.7.3"
+ resolved "https://registry.yarnpkg.com/@openzeppelin/contracts-upgradeable/-/contracts-upgradeable-4.7.3.tgz#f1d606e2827d409053f3e908ba4eb8adb1dd6995"
+ integrity sha512-+wuegAMaLcZnLCJIvrVUDzA9z/Wp93f0Dla/4jJvIhijRrPabjQbZe6fWiECLaJyfn5ci9fqf9vTw3xpQOad2A==
-"@openzeppelin/defender-base-client@1.54.1", "@openzeppelin/defender-base-client@^1.52.0":
- version "1.54.1"
- resolved "https://registry.yarnpkg.com/@openzeppelin/defender-base-client/-/defender-base-client-1.54.1.tgz#ed777ae56908d5a920e1f72ac735c63694e65b30"
- integrity sha512-DRGz/7KN3ZQwu28YWMOaojrC7jjPkz/uCwkC8/C8B11qwZhA5qIVvyhYHhhFOCl0J84+E3TNdvkPD2q3p2WaJw==
- dependencies:
- amazon-cognito-identity-js "^6.0.1"
- async-retry "^1.3.3"
- axios "^1.4.0"
- lodash "^4.17.19"
- node-fetch "^2.6.0"
+"@openzeppelin/contracts-upgradeable@^5.1.0":
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/@openzeppelin/contracts-upgradeable/-/contracts-upgradeable-5.1.0.tgz#4d37648b7402929c53e2ff6e45749ecff91eb2b6"
+ integrity sha512-AIElwP5Ck+cslNE+Hkemf5SxjJoF4wBvvjxc27Rp+9jaPs/CLIaUBMYe1FNzhdiN0cYuwGRmYaRHmmntuiju4Q==
-"@openzeppelin/defender-sdk-base-client@^1.8.0":
- version "1.8.0"
- resolved "https://registry.yarnpkg.com/@openzeppelin/defender-sdk-base-client/-/defender-sdk-base-client-1.8.0.tgz#2209a060ce61b4dfc44c7ac0c2b1d86e18b69f7d"
- integrity sha512-XIJat6BW2CTM74AwG5IL0Q/aE6RXj8x7smnVKmBql4wMvmirVW+njfwzZCLhUTiBXg9AlHxIInEF14SabfIisg==
+"@openzeppelin/contracts@4.5.0":
+ version "4.5.0"
+ resolved "https://registry.yarnpkg.com/@openzeppelin/contracts/-/contracts-4.5.0.tgz#3fd75d57de172b3743cdfc1206883f56430409cc"
+ integrity sha512-fdkzKPYMjrRiPK6K4y64e6GzULR7R7RwxSigHS8DDp7aWDeoReqsQI+cxHV1UuhAqX69L1lAaWDxenfP+xiqzA==
+
+"@openzeppelin/contracts@4.7.3":
+ version "4.7.3"
+ resolved "https://registry.yarnpkg.com/@openzeppelin/contracts/-/contracts-4.7.3.tgz#939534757a81f8d69cc854c7692805684ff3111e"
+ integrity sha512-dGRS0agJzu8ybo44pCIf3xBaPQN/65AIXNgK8+4gzKd5kbvlqyxryUYVLJv7fK98Seyd2hDZzVEHSWAh0Bt1Yw==
+
+"@openzeppelin/contracts@^5.1.0":
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/@openzeppelin/contracts/-/contracts-5.1.0.tgz#4e61162f2a2bf414c4e10c45eca98ce5f1aadbd4"
+ integrity sha512-p1ULhl7BXzjjbha5aqst+QMLY+4/LCWADXOCsmLHRM77AqiPjnd9vvUN9sosUfhL9JGKpZ0TjEGxgvnizmWGSA==
+
+"@openzeppelin/defender-sdk-base-client@^1.14.4", "@openzeppelin/defender-sdk-base-client@^1.15.0":
+ version "1.15.0"
+ resolved "https://registry.yarnpkg.com/@openzeppelin/defender-sdk-base-client/-/defender-sdk-base-client-1.15.0.tgz#5c6af6929c399dd7ef9ca1eb4ca042ae7e772367"
+ integrity sha512-nuf/xegMIuKCO0hMrxI1KQKTzQw1iCl/9kew2nJM9MrFIohhfEXItc5rbJRoV/jehmK/Jhi9ATF9OHH09StEsQ==
dependencies:
amazon-cognito-identity-js "^6.3.6"
async-retry "^1.3.3"
-"@openzeppelin/defender-sdk-deploy-client@^1.8.0":
- version "1.8.0"
- resolved "https://registry.yarnpkg.com/@openzeppelin/defender-sdk-deploy-client/-/defender-sdk-deploy-client-1.8.0.tgz#1e186d2b3ff176c6a4c03e8207bad8022528975f"
- integrity sha512-/tNS2EnHuA5l095wzMbIkGMDNHZLcZQ2eLUP8z+AeKaAUeR2z4qzZ1ul21kR3EJURAyoy8aULFZanLggoBWHrA==
+"@openzeppelin/defender-sdk-deploy-client@^1.14.4":
+ version "1.15.0"
+ resolved "https://registry.yarnpkg.com/@openzeppelin/defender-sdk-deploy-client/-/defender-sdk-deploy-client-1.15.0.tgz#affbeb93bf633ab9914ae7ca6326ff9dcdbbb670"
+ integrity sha512-2ODMN4j5pPYWyIOvA/zRQmJ0tJyqi6NV3S/PyvufBXa3oj/MDnVO5bMGSQFH0M2VE3bg+i/rcUb0hdbX9Rtm5Q==
dependencies:
- "@ethersproject/abi" "^5.7.0"
- "@openzeppelin/defender-sdk-base-client" "^1.8.0"
- axios "^1.4.0"
+ "@openzeppelin/defender-sdk-base-client" "^1.15.0"
+ axios "^1.7.2"
lodash "^4.17.21"
-"@openzeppelin/hardhat-upgrades@^3.0.0":
- version "3.0.2"
- resolved "https://registry.yarnpkg.com/@openzeppelin/hardhat-upgrades/-/hardhat-upgrades-3.0.2.tgz#3f21415ec802e94443bb1c0fc83992c178be1026"
- integrity sha512-Fk940cxwew++bfSZKWHEXVUCr3tRBiRZZBw1nl1wUVq29cq7BrlwDkZ6hTab/+p0IOnx0l6HJHLu3amDxxs3/w==
- dependencies:
- "@openzeppelin/defender-admin-client" "^1.52.0"
- "@openzeppelin/defender-base-client" "^1.52.0"
- "@openzeppelin/defender-sdk-base-client" "^1.8.0"
- "@openzeppelin/defender-sdk-deploy-client" "^1.8.0"
- "@openzeppelin/upgrades-core" "^1.32.0"
+"@openzeppelin/defender-sdk-network-client@^1.14.4":
+ version "1.15.0"
+ resolved "https://registry.yarnpkg.com/@openzeppelin/defender-sdk-network-client/-/defender-sdk-network-client-1.15.0.tgz#43eb2bb06fa69a127305f073089fa3201a65367c"
+ integrity sha512-tNynCqFB1XYancq/8yGuj0HCSIyNLSRSuH53Hp2Tl+DpM7W5vIkzSRfvJJxC+8Sld83bVavyNJzTN9xid992Ag==
+ dependencies:
+ "@openzeppelin/defender-sdk-base-client" "^1.15.0"
+ axios "^1.7.2"
+ lodash "^4.17.21"
+
+"@openzeppelin/hardhat-upgrades@^3.5.0":
+ version "3.5.0"
+ resolved "https://registry.yarnpkg.com/@openzeppelin/hardhat-upgrades/-/hardhat-upgrades-3.5.0.tgz#90ed0508fed8415b7fa9ee1c04ade8ec57091d46"
+ integrity sha512-Ju/JnT7NRiOMi5m5Y0dGiz37d8wnjVBep1v5Vr7+6+MFNuQa1yddUEVWhWhoEw4udI3/mYwyw4Sfz3sq7vhicQ==
+ dependencies:
+ "@openzeppelin/defender-sdk-base-client" "^1.14.4"
+ "@openzeppelin/defender-sdk-deploy-client" "^1.14.4"
+ "@openzeppelin/defender-sdk-network-client" "^1.14.4"
+ "@openzeppelin/upgrades-core" "^1.40.0"
chalk "^4.1.0"
debug "^4.1.1"
ethereumjs-util "^7.1.5"
proper-lockfile "^4.1.1"
- undici "^5.28.2"
+ undici "^6.11.1"
-"@openzeppelin/upgrades-core@^1.32.0":
- version "1.32.3"
- resolved "https://registry.yarnpkg.com/@openzeppelin/upgrades-core/-/upgrades-core-1.32.3.tgz#7f92aeab6f6c7300c8fa4c1cde14253b2bd62341"
- integrity sha512-v04RbrBOTRiIhfkTRfY4M34I2wIcuz+K1cUk/6duulsMXvRpM6/IPWeXh+1Xr1K+xedJi7gcS/pNSXfYhYNXIg==
+"@openzeppelin/upgrades-core@^1.40.0":
+ version "1.40.0"
+ resolved "https://registry.yarnpkg.com/@openzeppelin/upgrades-core/-/upgrades-core-1.40.0.tgz#f01647afb99b46356b3e7b98e3b2c7f864d85add"
+ integrity sha512-4bPSXdEqHsNRL5T1ybPLneWGYjzGl6XWGWkv7aUoFFgz8mOdarstRBX1Wi4XJFw6IeHPUI7mMSQr2jdz8Y2ypQ==
dependencies:
+ "@nomicfoundation/slang" "^0.17.0"
cbor "^9.0.0"
chalk "^4.1.0"
compare-versions "^6.0.0"
debug "^4.1.1"
ethereumjs-util "^7.0.3"
+ minimatch "^9.0.5"
minimist "^1.2.7"
proper-lockfile "^4.1.1"
solidity-ast "^0.4.51"
@@ -1231,7 +1326,7 @@
resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.4.tgz#0b92dcc0cc1c81f6f306a381f28e31b1a56536e9"
integrity sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==
-"@typechain/ethers-v6@^0.5.0":
+"@typechain/ethers-v6@^0.5.1":
version "0.5.1"
resolved "https://registry.yarnpkg.com/@typechain/ethers-v6/-/ethers-v6-0.5.1.tgz#42fe214a19a8b687086c93189b301e2b878797ea"
integrity sha512-F+GklO8jBWlsaVV+9oHaPh5NJdd6rAKN4tklGfInX1Q7h0xPgVLP39Jl3eCulPB5qexI71ZFHwbljx4ZXNfouA==
@@ -1239,7 +1334,7 @@
lodash "^4.17.15"
ts-essentials "^7.0.1"
-"@typechain/hardhat@^9.0.0":
+"@typechain/hardhat@^9.1.0":
version "9.1.0"
resolved "https://registry.yarnpkg.com/@typechain/hardhat/-/hardhat-9.1.0.tgz#6985015f01dfb37ef2ca8a29c742d05890351ddc"
integrity sha512-mtaUlzLlkqTlfPwB3FORdejqBskSnh+Jl8AIJGjXNAQfRQ4ofHADPl1+oU7Z3pAJzmZbUXII8MhOLQltcHgKnA==
@@ -1370,6 +1465,11 @@
dependencies:
"@types/node" "*"
+"@yarnpkg/lockfile@^1.1.0":
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz#e77a97fbd345b76d83245edcd17d393b1b41fb31"
+ integrity sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==
+
abbrev@1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8"
@@ -1459,17 +1559,6 @@ ajv@^8.0.1:
require-from-string "^2.0.2"
uri-js "^4.2.2"
-amazon-cognito-identity-js@^6.0.1:
- version "6.3.6"
- resolved "https://registry.yarnpkg.com/amazon-cognito-identity-js/-/amazon-cognito-identity-js-6.3.6.tgz#a5baa3615dc5771d9f9edeedf13d6e6df5e202d6"
- integrity sha512-kBq+GE6OkLrxtFj3ZduIOlKBFYeOqZK3EhxbDBkv476UTvy+uwfR0tlriTq2QzNdnvlQAjBIXnXuOM7DwR1UEQ==
- dependencies:
- "@aws-crypto/sha256-js" "1.2.2"
- buffer "4.9.2"
- fast-base64-decode "^1.0.0"
- isomorphic-unfetch "^3.0.0"
- js-cookie "^2.2.1"
-
amazon-cognito-identity-js@^6.3.6:
version "6.3.7"
resolved "https://registry.yarnpkg.com/amazon-cognito-identity-js/-/amazon-cognito-identity-js-6.3.7.tgz#65c3d7ee4e0c0a1ffea01927248989c5bd1d1868"
@@ -1732,12 +1821,12 @@ axios@^0.21.1:
dependencies:
follow-redirects "^1.14.0"
-axios@^1.4.0:
- version "1.5.0"
- resolved "https://registry.yarnpkg.com/axios/-/axios-1.5.0.tgz#f02e4af823e2e46a9768cfc74691fdd0517ea267"
- integrity sha512-D4DdjDo5CY50Qms0qGQTTw6Q44jl7zRwY7bthds06pUGfChBCTcQs+N743eFWGEd6pRTMd6A+I87aWyFV5wiZQ==
+axios@^1.7.2, axios@^1.7.7:
+ version "1.7.7"
+ resolved "https://registry.yarnpkg.com/axios/-/axios-1.7.7.tgz#2f554296f9892a72ac8d8e4c5b79c14a91d0a47f"
+ integrity sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==
dependencies:
- follow-redirects "^1.15.0"
+ follow-redirects "^1.15.6"
form-data "^4.0.0"
proxy-from-env "^1.1.0"
@@ -1784,6 +1873,11 @@ base-x@^3.0.2:
dependencies:
safe-buffer "^5.0.1"
+base-x@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/base-x/-/base-x-4.0.0.tgz#d0e3b7753450c73f8ad2389b5c018a4af7b2224a"
+ integrity sha512-FuwxlW4H5kh37X/oW59pwTzzTKRzfrrQwhmyspRM7swOEZcHtDZSCt45U6oKgtuFE+WYPblePMVIPR4RZrh/hw==
+
base64-js@^1.0.2:
version "1.5.1"
resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a"
@@ -1862,6 +1956,13 @@ braces@^3.0.2, braces@~3.0.2:
dependencies:
fill-range "^7.0.1"
+braces@^3.0.3:
+ version "3.0.3"
+ resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789"
+ integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==
+ dependencies:
+ fill-range "^7.1.1"
+
brorand@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f"
@@ -1901,6 +2002,13 @@ bs58@^4.0.0:
dependencies:
base-x "^3.0.2"
+bs58@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/bs58/-/bs58-5.0.0.tgz#865575b4d13c09ea2a84622df6c8cbeb54ffc279"
+ integrity sha512-r+ihvQJvahgYT50JD05dyJNKlmmSlMoOGwn1lCcEzanPglg7TxYjioQUYehQ9mAR/+hOSd2jRc/Z2y5UxBymvQ==
+ dependencies:
+ base-x "^4.0.0"
+
bs58check@^2.1.2:
version "2.1.2"
resolved "https://registry.yarnpkg.com/bs58check/-/bs58check-2.1.2.tgz#53b018291228d82a5aa08e7d796fdafda54aebfc"
@@ -2068,7 +2176,7 @@ chokidar@3.3.0:
optionalDependencies:
fsevents "~2.1.1"
-chokidar@3.5.3, chokidar@^3.4.0:
+chokidar@3.5.3:
version "3.5.3"
resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd"
integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==
@@ -2098,6 +2206,13 @@ chokidar@^3.5.2, chokidar@^3.5.3:
optionalDependencies:
fsevents "~2.3.2"
+chokidar@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-4.0.1.tgz#4a6dff66798fb0f72a94f616abbd7e1a19f31d41"
+ integrity sha512-n8enUVCED/KVRQlab1hr3MVpcVMvxtZjmEa956u+4YijlmQED223XMSYj2tLuKvr4jcCTzNNMpQDUer72MMmzA==
+ dependencies:
+ readdirp "^4.0.1"
+
ci-info@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46"
@@ -2319,6 +2434,17 @@ cross-fetch@^2.1.0, cross-fetch@^2.1.1:
node-fetch "^2.6.7"
whatwg-fetch "^2.0.4"
+cross-spawn@^6.0.5:
+ version "6.0.5"
+ resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4"
+ integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==
+ dependencies:
+ nice-try "^1.0.4"
+ path-key "^2.0.1"
+ semver "^5.5.0"
+ shebang-command "^1.2.0"
+ which "^1.2.9"
+
"crypt@>= 0.0.1":
version "0.0.2"
resolved "https://registry.yarnpkg.com/crypt/-/crypt-0.0.2.tgz#88d7ff7ec0dfb86f713dc87bbb42d044d3e6c41b"
@@ -2473,10 +2599,10 @@ dom-walk@^0.1.0:
resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.2.tgz#0c548bef048f4d1f2a97249002236060daa3fd84"
integrity sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==
-dotenv@^16.3.1:
- version "16.3.1"
- resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.3.1.tgz#369034de7d7e5b120972693352a3bf112172cc3e"
- integrity sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==
+dotenv@^16.4.5:
+ version "16.4.5"
+ resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.4.5.tgz#cdd3b3b604cb327e286b4762e13502f717cb099f"
+ integrity sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==
ecc-jsbn@~0.1.1:
version "0.1.2"
@@ -2995,7 +3121,7 @@ ethers@^4.0.40:
uuid "2.0.1"
xmlhttprequest "1.8.0"
-ethers@^5.6.1, ethers@^5.7.0, ethers@^5.7.2, ethers@~5.7.0:
+ethers@^5.6.1, ethers@^5.7.0, ethers@~5.7.0:
version "5.7.2"
resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.7.2.tgz#3a7deeabbb8c030d4126b24f84e525466145872e"
integrity sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==
@@ -3152,6 +3278,13 @@ fill-range@^7.0.1:
dependencies:
to-regex-range "^5.0.1"
+fill-range@^7.1.1:
+ version "7.1.1"
+ resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292"
+ integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==
+ dependencies:
+ to-regex-range "^5.0.1"
+
find-replace@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/find-replace/-/find-replace-3.0.0.tgz#3e7e23d3b05167a76f770c9fbd5258b0def68c38"
@@ -3181,6 +3314,13 @@ find-up@^2.1.0:
dependencies:
locate-path "^2.0.0"
+find-yarn-workspace-root@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/find-yarn-workspace-root/-/find-yarn-workspace-root-2.0.0.tgz#f47fb8d239c900eb78179aa81b66673eac88f7bd"
+ integrity sha512-1IMnbjt4KzsQfnhnzNd8wUEgXZ44IzZaZmnLYx7D5FZlaHt2gW20Cri8Q+E/t5tIj4+epTBub+2Zxu/vNILzqQ==
+ dependencies:
+ micromatch "^4.0.2"
+
flat@^4.1.0:
version "4.1.1"
resolved "https://registry.yarnpkg.com/flat/-/flat-4.1.1.tgz#a392059cc382881ff98642f5da4dde0a959f309b"
@@ -3200,7 +3340,7 @@ fmix@^0.1.0:
dependencies:
imul "^1.0.0"
-follow-redirects@^1.12.1, follow-redirects@^1.15.0:
+follow-redirects@^1.12.1:
version "1.15.2"
resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13"
integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==
@@ -3210,6 +3350,11 @@ follow-redirects@^1.14.0:
resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.6.tgz#7f815c0cda4249c74ff09e95ef97c23b5fd0399b"
integrity sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==
+follow-redirects@^1.15.6:
+ version "1.15.9"
+ resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.9.tgz#a604fa10e443bf98ca94228d9eebcc2e8a2c8ee1"
+ integrity sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==
+
for-each@^0.3.3:
version "0.3.3"
resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e"
@@ -3286,7 +3431,7 @@ fs-extra@^8.1.0:
jsonfile "^4.0.0"
universalify "^0.1.0"
-fs-extra@^9.1.0:
+fs-extra@^9.0.0, fs-extra@^9.1.0:
version "9.1.0"
resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d"
integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==
@@ -3544,7 +3689,7 @@ gopd@^1.0.1:
dependencies:
get-intrinsic "^1.1.3"
-graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4:
+graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4:
version "4.2.11"
resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3"
integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==
@@ -3643,14 +3788,14 @@ hardhat-tracer@^2.6.0:
debug "^4.3.4"
ethers "^5.6.1"
-hardhat@^2.14.0:
- version "2.22.6"
- resolved "https://registry.yarnpkg.com/hardhat/-/hardhat-2.22.6.tgz#d73caece246cd8219a1815554dabc31d400fa035"
- integrity sha512-abFEnd9QACwEtSvZZGSmzvw7N3zhQN1cDKz5SLHAupfG24qTHofCjqvD5kT5Wwsq5XOL0ON1Mq5rr4v0XX5ciw==
+hardhat@^2.22.13:
+ version "2.22.13"
+ resolved "https://registry.yarnpkg.com/hardhat/-/hardhat-2.22.13.tgz#1d2c7c4b640d060ae0f5b04757322118a003955a"
+ integrity sha512-psVJX4FSXDpSXwsU8OcKTJN04pQEj9cFBMX5OPko+OFwbIoiOpvRmafa954/UaA1934npTj8sV3gaTSdx9bPbA==
dependencies:
"@ethersproject/abi" "^5.1.2"
"@metamask/eth-sig-util" "^4.0.0"
- "@nomicfoundation/edr" "^0.4.1"
+ "@nomicfoundation/edr" "^0.6.3"
"@nomicfoundation/ethereumjs-common" "4.0.4"
"@nomicfoundation/ethereumjs-tx" "5.0.4"
"@nomicfoundation/ethereumjs-util" "9.0.4"
@@ -3663,7 +3808,7 @@ hardhat@^2.14.0:
ansi-escapes "^4.3.0"
boxen "^5.1.2"
chalk "^2.4.2"
- chokidar "^3.4.0"
+ chokidar "^4.0.0"
ci-info "^2.0.0"
debug "^4.1.1"
enquirer "^2.3.0"
@@ -3676,6 +3821,7 @@ hardhat@^2.14.0:
glob "7.2.0"
immutable "^4.0.0-rc.12"
io-ts "1.10.4"
+ json-stream-stringify "^3.1.4"
keccak "^3.0.2"
lodash "^4.17.11"
mnemonist "^0.38.0"
@@ -3985,6 +4131,13 @@ is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7:
resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055"
integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==
+is-ci@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c"
+ integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==
+ dependencies:
+ ci-info "^2.0.0"
+
is-core-module@^2.11.0:
version "2.12.1"
resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.12.1.tgz#0c0b6885b6f80011c71541ce15c8d66cf5a4f9fd"
@@ -3999,6 +4152,11 @@ is-date-object@^1.0.1:
dependencies:
has-tostringtag "^1.0.0"
+is-docker@^2.0.0:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa"
+ integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==
+
is-extglob@^2.1.1:
version "2.1.1"
resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
@@ -4127,6 +4285,13 @@ is-weakref@^1.0.2:
dependencies:
call-bind "^1.0.2"
+is-wsl@^2.1.1:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271"
+ integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==
+ dependencies:
+ is-docker "^2.0.0"
+
isarray@0.0.1:
version "0.0.1"
resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf"
@@ -4238,6 +4403,11 @@ json-stable-stringify@^1.0.1:
dependencies:
jsonify "^0.0.1"
+json-stream-stringify@^3.1.4:
+ version "3.1.4"
+ resolved "https://registry.yarnpkg.com/json-stream-stringify/-/json-stream-stringify-3.1.4.tgz#d5b10c4c709b27d3c3ef07a1926ffcc1b67c4c5d"
+ integrity sha512-oGoz05ft577LolnXFQHD2CjnXDxXVA5b8lHwfEZgRXQUZeCMo6sObQQRq+NXuHQ3oTeMZHHmmPY2rjVwyqR62A==
+
json-stringify-safe@^5.0.1, json-stringify-safe@~5.0.1:
version "5.0.1"
resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb"
@@ -4293,6 +4463,13 @@ kind-of@^6.0.2:
resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd"
integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==
+klaw-sync@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/klaw-sync/-/klaw-sync-6.0.0.tgz#1fd2cfd56ebb6250181114f0a581167099c2b28c"
+ integrity sha512-nIeuVSzdCCs6TDPTqI8w1Yre34sSq7AkZ4B3sfOBbI2CgVSB4Du4aLQijFU2+lhAFCwt9+42Hel6lQNIv6AntQ==
+ dependencies:
+ graceful-fs "^4.1.11"
+
kleur@^3.0.3:
version "3.0.3"
resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e"
@@ -4520,6 +4697,14 @@ merkle-patricia-tree@^2.1.2, merkle-patricia-tree@^2.3.2:
rlp "^2.0.0"
semaphore ">=1.0.1"
+micromatch@^4.0.2:
+ version "4.0.8"
+ resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202"
+ integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==
+ dependencies:
+ braces "^3.0.3"
+ picomatch "^2.3.1"
+
micromatch@^4.0.4:
version "4.0.5"
resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6"
@@ -4585,6 +4770,13 @@ minimatch@^5.0.1, minimatch@^5.1.6:
dependencies:
brace-expansion "^2.0.1"
+minimatch@^9.0.5:
+ version "9.0.5"
+ resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.5.tgz#d74f9dd6b57d83d8e98cfb82133b03978bc929e5"
+ integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==
+ dependencies:
+ brace-expansion "^2.0.1"
+
minimist@^1.2.5, minimist@^1.2.6, minimist@^1.2.7:
version "1.2.8"
resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c"
@@ -4744,6 +4936,11 @@ neo-async@^2.6.0:
resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f"
integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==
+nice-try@^1.0.4:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366"
+ integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==
+
node-addon-api@^2.0.0:
version "2.0.2"
resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-2.0.2.tgz#432cfa82962ce494b132e9d72a15b29f71ff5d32"
@@ -4764,7 +4961,7 @@ node-environment-flags@1.0.6:
object.getownpropertydescriptors "^2.0.3"
semver "^5.7.0"
-node-fetch@^2.6.0, node-fetch@^2.6.1:
+node-fetch@^2.6.1:
version "2.7.0"
resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d"
integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==
@@ -4894,6 +5091,14 @@ once@1.x, once@^1.3.0:
dependencies:
wrappy "1"
+open@^7.4.2:
+ version "7.4.2"
+ resolved "https://registry.yarnpkg.com/open/-/open-7.4.2.tgz#b8147e26dcf3e426316c730089fd71edd29c2321"
+ integrity sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==
+ dependencies:
+ is-docker "^2.0.0"
+ is-wsl "^2.1.1"
+
optionator@^0.8.1:
version "0.8.3"
resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495"
@@ -4985,6 +5190,26 @@ parse-headers@^2.0.0:
resolved "https://registry.yarnpkg.com/parse-headers/-/parse-headers-2.0.5.tgz#069793f9356a54008571eb7f9761153e6c770da9"
integrity sha512-ft3iAoLOB/MlwbNXgzy43SWGP6sQki2jQvAyBg/zDFAgr9bfNWZIUj42Kw2eJIl8kEi4PbgE6U1Zau/HwI75HA==
+patch-package@^6.4.7:
+ version "6.5.1"
+ resolved "https://registry.yarnpkg.com/patch-package/-/patch-package-6.5.1.tgz#3e5d00c16997e6160291fee06a521c42ac99b621"
+ integrity sha512-I/4Zsalfhc6bphmJTlrLoOcAF87jcxko4q0qsv4bGcurbr8IskEOtdnt9iCmsQVGL1B+iUhSQqweyTLJfCF9rA==
+ dependencies:
+ "@yarnpkg/lockfile" "^1.1.0"
+ chalk "^4.1.2"
+ cross-spawn "^6.0.5"
+ find-yarn-workspace-root "^2.0.0"
+ fs-extra "^9.0.0"
+ is-ci "^2.0.0"
+ klaw-sync "^6.0.0"
+ minimist "^1.2.6"
+ open "^7.4.2"
+ rimraf "^2.6.3"
+ semver "^5.6.0"
+ slash "^2.0.0"
+ tmp "^0.0.33"
+ yaml "^1.10.2"
+
path-exists@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515"
@@ -5000,6 +5225,11 @@ path-is-absolute@^1.0.0:
resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==
+path-key@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40"
+ integrity sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==
+
path-parse@^1.0.6, path-parse@^1.0.7:
version "1.0.7"
resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735"
@@ -5216,6 +5446,11 @@ readable-stream@~1.0.15:
isarray "0.0.1"
string_decoder "~0.10.x"
+readdirp@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-4.0.1.tgz#b2fe35f8dca63183cd3b86883ecc8f720ea96ae6"
+ integrity sha512-GkMg9uOTpIWWKbSsgwb5fA4EavTR+SG/PMPoAY8hkhHfEEY0/vqljY+XHqtDf2cr2IJtoNRDbrrEpZUiZCkYRw==
+
readdirp@~3.2.0:
version "3.2.0"
resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.2.0.tgz#c30c33352b12c96dfb4b895421a49fd5a9593839"
@@ -5384,6 +5619,13 @@ reusify@^1.0.4:
resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76"
integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==
+rimraf@^2.6.3:
+ version "2.7.1"
+ resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec"
+ integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==
+ dependencies:
+ glob "^7.1.3"
+
ripemd160@^2.0.0, ripemd160@^2.0.1:
version "2.0.2"
resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c"
@@ -5511,6 +5753,11 @@ semver@^5.5.0, semver@^5.7.0:
resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7"
integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==
+semver@^5.6.0:
+ version "5.7.2"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8"
+ integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==
+
semver@^6.1.1, semver@^6.1.2, semver@^6.3.0:
version "6.3.0"
resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d"
@@ -5604,6 +5851,18 @@ sha1@^1.1.1:
charenc ">= 0.0.1"
crypt ">= 0.0.1"
+shebang-command@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea"
+ integrity sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==
+ dependencies:
+ shebang-regex "^1.0.0"
+
+shebang-regex@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3"
+ integrity sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==
+
shelljs@^0.8.3:
version "0.8.5"
resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.8.5.tgz#de055408d8361bed66c669d2f000538ced8ee20c"
@@ -5647,6 +5906,11 @@ sisteransi@^1.0.5:
resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed"
integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==
+slash@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44"
+ integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==
+
slash@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634"
@@ -5661,6 +5925,11 @@ slice-ansi@^4.0.0:
astral-regex "^2.0.0"
is-fullwidth-code-point "^3.0.0"
+solady@0.0.182:
+ version "0.0.182"
+ resolved "https://registry.yarnpkg.com/solady/-/solady-0.0.182.tgz#bd8c47f128a3a752358ad052782773966d74c400"
+ integrity sha512-FW6xo1akJoYpkXMzu58/56FcNU3HYYNamEbnFO3iSibXk0nSHo0DV2Gu/zI3FPg3So5CCX6IYli1TT1IWATnvg==
+
solc@0.8.26:
version "0.8.26"
resolved "https://registry.yarnpkg.com/solc/-/solc-0.8.26.tgz#afc78078953f6ab3e727c338a2fefcd80dd5b01a"
@@ -6018,7 +6287,12 @@ through2@^4.0.0:
dependencies:
readable-stream "3"
-tmp@0.0.33:
+tiny-invariant@^1.3.1:
+ version "1.3.3"
+ resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.3.3.tgz#46680b7a873a0d5d10005995eb90a70d74d60127"
+ integrity sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==
+
+tmp@0.0.33, tmp@^0.0.33:
version "0.0.33"
resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9"
integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==
@@ -6272,12 +6546,10 @@ undici@^5.14.0:
dependencies:
busboy "^1.6.0"
-undici@^5.28.2:
- version "5.28.2"
- resolved "https://registry.yarnpkg.com/undici/-/undici-5.28.2.tgz#fea200eac65fc7ecaff80a023d1a0543423b4c91"
- integrity sha512-wh1pHJHnUeQV5Xa8/kyQhO7WFa8M34l026L5P/+2TYiakvGy5Rdc8jWZVyG7ieht/0WgJLEd3kcU5gKx+6GC8w==
- dependencies:
- "@fastify/busboy" "^2.0.0"
+undici@^6.11.1:
+ version "6.20.1"
+ resolved "https://registry.yarnpkg.com/undici/-/undici-6.20.1.tgz#fbb87b1e2b69d963ff2d5410a40ffb4c9e81b621"
+ integrity sha512-AjQF1QsmqfJys+LXfGTNum+qw4S88CojRInG/6t31W/1fk6G59s92bnAvGz5Cmur+kQv2SURXEvvudLmbrE8QA==
unfetch@^4.2.0:
version "4.2.0"
@@ -6428,7 +6700,7 @@ which-typed-array@^1.1.9:
has-tostringtag "^1.0.0"
is-typed-array "^1.1.10"
-which@1.3.1, which@^1.1.1, which@^1.3.1:
+which@1.3.1, which@^1.1.1, which@^1.2.9, which@^1.3.1:
version "1.3.1"
resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a"
integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==
@@ -6569,6 +6841,11 @@ yallist@^4.0.0:
resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72"
integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==
+yaml@^1.10.2:
+ version "1.10.2"
+ resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b"
+ integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==
+
yargs-parser@13.1.2, yargs-parser@^13.1.2:
version "13.1.2"
resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38"