From f7df33b159a71b163b8b5c7e7381c0d8f193da99 Mon Sep 17 00:00:00 2001 From: A5 Pickle Date: Mon, 4 Dec 2023 15:09:16 -0600 Subject: [PATCH] evm: refactor * add WormholeCctpTokenMessenger * inherit above in CircleIntegration * remove updateWormholeFinality (gov) * reorganize * add more forge tests * remove integration tests * add gas snapshot --- .github/main.yml | 17 - .github/workflows/ci.yml | 31 + evm/.gas-snapshot-current | 36 + evm/.gitignore | 3 +- evm/.prettierrc.json | 24 + evm/Makefile | 41 +- evm/README.md | 5 +- evm/env/mainnet/arbitrum-mainnet.env | 1 - evm/env/mainnet/optimism-mainnet.env | 1 - evm/env/testing.env | 27 +- evm/env/testnet/arbitrum-testnet.env | 1 - evm/env/testnet/avax-testnet.env | 1 - evm/env/testnet/eth-testnet.env | 1 - evm/env/testnet/optimism-testnet.env | 1 - evm/forge-scripts/deploy_contracts.sol | 75 - evm/forge-test/CircleIntegration.t.sol | 813 -- evm/forge/scripts/deploy_contracts.sol | 65 + .../scripts}/deploy_implementation_only.sol | 3 +- .../scripts}/deploy_mock_contracts.sol | 2 +- .../scripts}/read_governance_variables.sol | 2 +- .../scripts}/submit_testnet_registration.sol | 26 +- evm/forge/tests/CircleIntegration.t.sol | 486 + evm/forge/tests/ForkSlots.t.sol | 354 + evm/forge/tests/Governance.t.sol | 524 + evm/forge/tests/InheritingWormholeCctp.t.sol | 199 + evm/forge/tests/WormholeCctpMessages.t.sol | 74 + .../gas/CircleIntegrationComparison.t.sol | 434 + .../circle => forge/tests/helpers}/IUSDC.sol | 9 + .../libraries/CircleIntegrationOverride.sol | 399 + .../tests/helpers/libraries/SlotCheck.sol | 89 + .../tests/helpers/libraries/UsdcDeal.sol | 21 + .../helpers/libraries/WormholeOverride.sol | 210 + .../ComposingWithCircleIntegration.sol | 65 + .../integrations/InheritingWormholeCctp.sol | 67 + evm/foundry-test.toml | 22 - evm/foundry.toml | 15 +- evm/modules/README.md | 11 - evm/modules/src/WormholeSimulator.sol | 291 - evm/package-lock.json | 8847 +++++++++++++++++ evm/package.json | 8 +- evm/{shell-scripts => sh}/deploy_contracts.sh | 2 +- .../deploy_implementation_only.sh | 2 +- .../make_ethers_types.sh | 0 .../submit_testnet_registration.sh | 2 +- evm/{shell-scripts => sh}/upgrade_proxy.sh | 0 .../verify_implementation.sh | 2 +- evm/{shell-scripts => sh}/verify_proxy.sh | 4 +- evm/{shell-scripts => sh}/verify_setup.sh | 2 +- evm/shell-scripts/run_integration_tests.sh | 65 - .../circle_integration/CircleIntegration.sol | 261 - .../CircleIntegrationGetters.sol | 145 - .../CircleIntegrationGovernance.sol | 222 - .../CircleIntegrationImplementation.sol | 26 - .../CircleIntegrationMessages.sol | 101 - .../CircleIntegrationProxy.sol | 8 - .../CircleIntegrationSetters.sol | 63 - .../CircleIntegrationSetup.sol | 53 - .../CircleIntegrationState.sol | 61 - .../CircleIntegrationStructs.sol | 28 - .../CircleIntegration/Governance.sol | 206 + .../CircleIntegration/Implementation.sol | 48 + evm/src/contracts/CircleIntegration/Logic.sol | 236 + evm/src/contracts/CircleIntegration/Setup.sol | 19 + evm/src/contracts/CircleIntegration/State.sol | 14 + .../contracts/CircleIntegration/Storage.sol | 80 + .../contracts/WormholeCctpTokenMessenger.sol | 362 + evm/src/interfaces/ICircleIntegration.sol | 273 +- evm/src/interfaces/IGovernance.sol | 66 + .../{circle => }/IMessageTransmitter.sol | 14 +- .../ICircleBridge.sol => ITokenMessenger.sol} | 31 +- .../interfaces/{circle => }/ITokenMinter.sol | 2 +- evm/src/interfaces/IWormhole.sol | 71 +- evm/src/interfaces/mock/IMockIntegration.sol | 25 - evm/src/libraries/BytesParsing.sol | 1396 +++ evm/src/libraries/Utils.sol | 31 + evm/src/libraries/WormholeCctpMessages.sol | 264 + evm/src/mock/MockIntegration.sol | 84 - evm/ts/scripts/contract_governance.ts | 153 +- evm/ts/scripts/upgrade_proxy.ts | 98 +- evm/ts/src/.gitignore | 1 - evm/ts/src/logs.ts | 18 +- evm/ts/src/types.ts | 30 +- evm/ts/test/00_environment.ts | 533 - evm/ts/test/01_registration.ts | 129 - evm/ts/test/02_send_receive.ts | 971 -- evm/ts/test/03_upgrade.ts | 168 - evm/ts/test/helpers/consts.ts | 27 - evm/ts/test/helpers/mock.ts | 80 - evm/ts/test/helpers/utils.ts | 100 - evm/yarn.lock | 4427 --------- 90 files changed, 15149 insertions(+), 9156 deletions(-) delete mode 100644 .github/main.yml create mode 100644 .github/workflows/ci.yml create mode 100644 evm/.gas-snapshot-current create mode 100644 evm/.prettierrc.json delete mode 100644 evm/forge-scripts/deploy_contracts.sol delete mode 100644 evm/forge-test/CircleIntegration.t.sol create mode 100644 evm/forge/scripts/deploy_contracts.sol rename evm/{forge-scripts => forge/scripts}/deploy_implementation_only.sol (82%) rename evm/{forge-scripts => forge/scripts}/deploy_mock_contracts.sol (87%) rename evm/{forge-scripts => forge/scripts}/read_governance_variables.sol (94%) rename evm/{forge-scripts => forge/scripts}/submit_testnet_registration.sol (85%) create mode 100644 evm/forge/tests/CircleIntegration.t.sol create mode 100644 evm/forge/tests/ForkSlots.t.sol create mode 100644 evm/forge/tests/Governance.t.sol create mode 100644 evm/forge/tests/InheritingWormholeCctp.t.sol create mode 100644 evm/forge/tests/WormholeCctpMessages.t.sol create mode 100644 evm/forge/tests/gas/CircleIntegrationComparison.t.sol rename evm/{src/interfaces/circle => forge/tests/helpers}/IUSDC.sol (98%) create mode 100644 evm/forge/tests/helpers/libraries/CircleIntegrationOverride.sol create mode 100644 evm/forge/tests/helpers/libraries/SlotCheck.sol create mode 100644 evm/forge/tests/helpers/libraries/UsdcDeal.sol create mode 100644 evm/forge/tests/helpers/libraries/WormholeOverride.sol create mode 100644 evm/forge/tests/integrations/ComposingWithCircleIntegration.sol create mode 100644 evm/forge/tests/integrations/InheritingWormholeCctp.sol delete mode 100644 evm/foundry-test.toml delete mode 100644 evm/modules/README.md delete mode 100644 evm/modules/src/WormholeSimulator.sol create mode 100644 evm/package-lock.json rename evm/{shell-scripts => sh}/deploy_contracts.sh (58%) rename evm/{shell-scripts => sh}/deploy_implementation_only.sh (67%) rename evm/{shell-scripts => sh}/make_ethers_types.sh (100%) rename evm/{shell-scripts => sh}/submit_testnet_registration.sh (79%) rename evm/{shell-scripts => sh}/upgrade_proxy.sh (100%) rename evm/{shell-scripts => sh}/verify_implementation.sh (68%) rename evm/{shell-scripts => sh}/verify_proxy.sh (73%) rename evm/{shell-scripts => sh}/verify_setup.sh (71%) delete mode 100755 evm/shell-scripts/run_integration_tests.sh delete mode 100644 evm/src/circle_integration/CircleIntegration.sol delete mode 100644 evm/src/circle_integration/CircleIntegrationGetters.sol delete mode 100644 evm/src/circle_integration/CircleIntegrationGovernance.sol delete mode 100644 evm/src/circle_integration/CircleIntegrationImplementation.sol delete mode 100644 evm/src/circle_integration/CircleIntegrationMessages.sol delete mode 100644 evm/src/circle_integration/CircleIntegrationProxy.sol delete mode 100644 evm/src/circle_integration/CircleIntegrationSetters.sol delete mode 100644 evm/src/circle_integration/CircleIntegrationSetup.sol delete mode 100644 evm/src/circle_integration/CircleIntegrationState.sol delete mode 100644 evm/src/circle_integration/CircleIntegrationStructs.sol create mode 100644 evm/src/contracts/CircleIntegration/Governance.sol create mode 100644 evm/src/contracts/CircleIntegration/Implementation.sol create mode 100644 evm/src/contracts/CircleIntegration/Logic.sol create mode 100644 evm/src/contracts/CircleIntegration/Setup.sol create mode 100644 evm/src/contracts/CircleIntegration/State.sol create mode 100644 evm/src/contracts/CircleIntegration/Storage.sol create mode 100644 evm/src/contracts/WormholeCctpTokenMessenger.sol create mode 100644 evm/src/interfaces/IGovernance.sol rename evm/src/interfaces/{circle => }/IMessageTransmitter.sol (90%) rename evm/src/interfaces/{circle/ICircleBridge.sol => ITokenMessenger.sol} (85%) rename evm/src/interfaces/{circle => }/ITokenMinter.sol (93%) delete mode 100644 evm/src/interfaces/mock/IMockIntegration.sol create mode 100644 evm/src/libraries/BytesParsing.sol create mode 100644 evm/src/libraries/Utils.sol create mode 100644 evm/src/libraries/WormholeCctpMessages.sol delete mode 100644 evm/src/mock/MockIntegration.sol delete mode 100644 evm/ts/src/.gitignore delete mode 100644 evm/ts/test/00_environment.ts delete mode 100644 evm/ts/test/01_registration.ts delete mode 100644 evm/ts/test/02_send_receive.ts delete mode 100644 evm/ts/test/03_upgrade.ts delete mode 100644 evm/ts/test/helpers/consts.ts delete mode 100644 evm/ts/test/helpers/mock.ts delete mode 100644 evm/ts/test/helpers/utils.ts delete mode 100644 evm/yarn.lock diff --git a/.github/main.yml b/.github/main.yml deleted file mode 100644 index 6d8dcb4..0000000 --- a/.github/main.yml +++ /dev/null @@ -1,17 +0,0 @@ -name: Build -on: - workflow_dispatch: - pull_request: - push: - branches: - - main - -jobs: - ethereum: - runs-on: ubuntu-20.04 - steps: - - name: Checkout - uses: actions/checkout@v3 - - run: cd evm && bash ../scripts/install_foundry.sh - - run: cd evm && PATH=$PATH:$HOME/.foundry/bin/ make dependencies - - run: cd evm && PATH=$PATH:$HOME/.foundry/bin/ && source env/testing.env && ETH_FORK_RPC=${{ secrets.ETH_RPC }} forge test --fork-url ${{ secrets.ETH_RPC }} diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..7fdd7ae --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,31 @@ +name: "CI" + +env: + FOUNDRY_PROFILE: "ci" + +on: + workflow_dispatch: + pull_request: + push: + branches: + - "main" + +jobs: + evm-test: + runs-on: "ubuntu-latest" + steps: + - name: "Check out the repo" + uses: "actions/checkout@v3" + with: + submodules: "recursive" + + - name: "Install Foundry" + uses: "foundry-rs/foundry-toolchain@v1" + + - name: "Run the tests" + run: "cd evm && make test" + + - name: "Add test summary" + run: | + echo "## Tests result" >> $GITHUB_STEP_SUMMARY + echo "✅ Passed" >> $GITHUB_STEP_SUMMARY diff --git a/evm/.gas-snapshot-current b/evm/.gas-snapshot-current new file mode 100644 index 0000000..d19db9a --- /dev/null +++ b/evm/.gas-snapshot-current @@ -0,0 +1,36 @@ +CircleIntegrationComparison:test_Composed__RedeemUsdc(uint256,bytes32,bytes32) (runs: 256, μ: 267202, ~: 267111) +CircleIntegrationComparison:test_Composed__TransferUsdc(uint256,bytes32,bytes32) (runs: 256, μ: 295433, ~: 295430) +CircleIntegrationComparison:test_Control__RedeemTokensWithPayload(uint256,bytes32,bytes32) (runs: 256, μ: 73756, ~: 73625) +CircleIntegrationComparison:test_Control__TransferTokensWithPayload(uint256,bytes32,bytes32) (runs: 256, μ: 135806, ~: 135676) +CircleIntegrationComparison:test_Fork__RedeemTokensWithPayload(uint256,bytes32,bytes32) (runs: 256, μ: 275608, ~: 275475) +CircleIntegrationComparison:test_Fork__TransferTokensWithPayload(uint256,bytes32,bytes32) (runs: 256, μ: 273234, ~: 273231) +CircleIntegrationComparison:test_Inherited__RedeemUsdc(uint256,bytes32,bytes32) (runs: 256, μ: 226968, ~: 226904) +CircleIntegrationComparison:test_Inherited__TransferUsdc(uint256,bytes32,bytes32) (runs: 256, μ: 248858, ~: 248856) +CircleIntegrationComparison:test_Latest__RedeemTokensWithPayload(uint256,bytes32,bytes32) (runs: 256, μ: 252196, ~: 252072) +CircleIntegrationComparison:test_Latest__TransferTokensWithPayload(uint256,bytes32,bytes32) (runs: 256, μ: 263957, ~: 263956) +CircleIntegrationTest:test_CannotRedeemTokensWithPayloadCallerMustBeMintRecipient(address) (runs: 256, μ: 76012, ~: 76012) +CircleIntegrationTest:test_CannotRedeemTokensWithPayloadInvalidMessagePair() (gas: 95486) +CircleIntegrationTest:test_CannotRedeemTokensWithPayloadMintTokenNotSupported(bytes32) (runs: 256, μ: 141797, ~: 141789) +CircleIntegrationTest:test_CannotRedeemTokensWithPayloadUnknownEmitter(bytes32) (runs: 256, μ: 203129, ~: 203121) +CircleIntegrationTest:test_CannotTransferTokensWithPayloadInvalidMintRecipient() (gas: 177584) +CircleIntegrationTest:test_CannotTransferTokensWithPayloadInvalidToken() (gas: 248030) +CircleIntegrationTest:test_CannotTransferTokensWithPayloadTargetContractNotRegistered() (gas: 120482) +CircleIntegrationTest:test_CannotTransferTokensWithPayloadZeroAmount() (gas: 49696) +CircleIntegrationTest:test_RedeemTokensWithPayload(uint256) (runs: 256, μ: 255379, ~: 255334) +CircleIntegrationTest:test_TransferTokensWithPayload(uint256,bytes32) (runs: 256, μ: 394493, ~: 394457) +ForkSlots:test_UpgradeForkAndCheckSlots() (gas: 2316557) +GovernanceTest:test_CannotConsumeGovernanceMessageInvalidAction(uint8,uint8) (runs: 256, μ: 61609, ~: 61609) +GovernanceTest:test_CannotConsumeGovernanceMessageInvalidGovernanceChainId(uint16,uint8) (runs: 256, μ: 62307, ~: 62307) +GovernanceTest:test_CannotConsumeGovernanceMessageInvalidGovernanceContract(bytes32,uint8) (runs: 256, μ: 62055, ~: 62055) +GovernanceTest:test_CannotConsumeGovernanceMessageInvalidModule(bytes32,uint8) (runs: 256, μ: 61414, ~: 61414) +GovernanceTest:test_CannotRegisterEmitterAndDomainInvalidDomain(uint16,bytes32) (runs: 256, μ: 94755, ~: 94755) +GovernanceTest:test_CannotRegisterEmitterAndDomainInvalidEmitterAddress(uint16,uint32) (runs: 256, μ: 95882, ~: 95882) +GovernanceTest:test_CannotRegisterEmitterAndDomainInvalidForeignChain(bytes32,uint32) (runs: 256, μ: 163511, ~: 163511) +GovernanceTest:test_CannotRegisterEmitterAndDomainInvalidLength(uint16,bytes32,uint32) (runs: 256, μ: 96605, ~: 96605) +GovernanceTest:test_CannotRegisterEmitterAndDomainInvalidTargetChain(uint16,uint16,bytes32,uint32) (runs: 256, μ: 96243, ~: 96243) +GovernanceTest:test_CannotUpgradeContractInvalidImplementation(bytes12,address) (runs: 256, μ: 208638, ~: 208638) +GovernanceTest:test_RegisterEmitterAndDomain(uint16,bytes32,uint32) (runs: 256, μ: 214666, ~: 214666) +GovernanceTest:test_RegisterEmitterAndDomainNoTarget() (gas: 155128) +GovernanceTest:test_UpgradeContract() (gas: 2272176) +InheritingWormholeCctpTest:test_TransferUsdc(uint256,bytes32) (runs: 256, μ: 268693, ~: 268654) +MessagesTest:test_DepositWithPayloadSerde(bytes32,uint256,uint32,uint32,uint64,bytes32,bytes32,bytes) (runs: 256, μ: 7871, ~: 7706) \ No newline at end of file diff --git a/evm/.gitignore b/evm/.gitignore index 9a4dd88..d3f140e 100644 --- a/evm/.gitignore +++ b/evm/.gitignore @@ -1,10 +1,9 @@ .env .private .vscode -anvil*.log broadcast* cache -deploy.out lib node_modules out +ts/src/ethers-contracts diff --git a/evm/.prettierrc.json b/evm/.prettierrc.json new file mode 100644 index 0000000..43cc278 --- /dev/null +++ b/evm/.prettierrc.json @@ -0,0 +1,24 @@ +{ + "overrides": [ + { + "files": "*.sol", + "options": { + "printWidth": 100, + "tabWidth": 4, + "useTabs": false, + "singleQuote": false, + "bracketSpacing": false + } + }, + { + "files": "*.ts", + "options": { + "printWidth": 100, + "tabWidth": 4, + "useTabs": false, + "singleQuote": false, + "bracketSpacing": true + } + } + ] +} diff --git a/evm/Makefile b/evm/Makefile index f010c32..d1e1bd9 100644 --- a/evm/Makefile +++ b/evm/Makefile @@ -1,48 +1,37 @@ include env/testing.env -.PHONY: dependencies unit-test forge-test integration-test clean all +.PHONY: dependencies test clean all all: build .PHONY: clean clean: - rm -rf anvil.log node_modules lib out ts/src/ethers-contracts + forge clean + rm -rf node_modules lib out ts/src/ethers-contracts .PHONY: dependencies -dependencies: node_modules lib/forge-std lib/wormhole +dependencies: node_modules lib/forge-std node_modules: - yarn + npm ci lib/forge-std: forge install --no-git --no-commit foundry-rs/forge-std -lib/wormhole: - forge install --no-git --no-commit wormhole=wormhole-foundation/wormhole +ts/src/ethers-contracts: + npm run build-types build: dependencies forge build - yarn build-types -.PHONY: unit-test -unit-test: forge-test - -.PHONY: forge-test -forge-test: dependencies - forge test \ - -vv \ - --fork-url ${TESTING_FORK_RPC} \ +.PHONY: test +test: dependencies + forge test --fork-url ${TESTING_FORK_RPC} -vv -.PHONY: forge-test +.PHONY: gas-report gas-report: dependencies - forge test \ - --fork-url ${TESTING_FORK_RPC} \ - --gas-report - -.PHONY: integration-test -integration-test: dependencies build - bash shell-scripts/run_integration_tests.sh - -.PHONY: test -test: forge-test integration-test + forge test --fork-url ${TESTING_FORK_RPC} --match-path forge/tests/gas/* --fuzz-runs 512 --gas-report +.PHONY: gas-snapshot +gas-snapshot: dependencies + forge snapshot --fork-url ${TESTING_FORK_RPC} --diff .gas-snapshot-current diff --git a/evm/README.md b/evm/README.md index c4f4d0f..6c86ecd 100644 --- a/evm/README.md +++ b/evm/README.md @@ -25,16 +25,13 @@ export RELEASE_WORMHOLE_ADDRESS=0x # Circle Bridge Contract Address (TokenMessenger) export RELEASE_CIRCLE_BRIDGE_ADDRESS=0x - -# Circle Message Transmitter Address -export RELEASE_WORMHOLE_FINALITY= ``` Then run the following command to deploy (and set up) the proxy contract: ``` # sample deployment command -. env/put_your_env_file_here.env && PRIVATE_KEY=put_your_private_key_here bash shell-scripts/deploy_contracts.sh +. env/put_your_env_file_here.env && PRIVATE_KEY=put_your_private_key_here bash sh/deploy_contracts.sh ``` ## Test Suite diff --git a/evm/env/mainnet/arbitrum-mainnet.env b/evm/env/mainnet/arbitrum-mainnet.env index ba67259..daf670a 100644 --- a/evm/env/mainnet/arbitrum-mainnet.env +++ b/evm/env/mainnet/arbitrum-mainnet.env @@ -3,7 +3,6 @@ export RPC="https://arbitrum-one.public.blastapi.io" ### Contract addresses export RELEASE_WORMHOLE_ADDRESS=0xa5f208e072434bC67592E4C49C1B991BA79BCA46 export RELEASE_CIRCLE_BRIDGE_ADDRESS=0x19330d10D9Cc8751218eaf51E8885D058642E08A -export RELEASE_WORMHOLE_FINALITY=1 ### Deployed Circle Integration addresses export CIRCLE_INTEGRATION_IMPLEMENTATION=0xD73aFD826D6bDD4D2fEF326DF5091451A5d8130a diff --git a/evm/env/mainnet/optimism-mainnet.env b/evm/env/mainnet/optimism-mainnet.env index f55e296..52b1e39 100644 --- a/evm/env/mainnet/optimism-mainnet.env +++ b/evm/env/mainnet/optimism-mainnet.env @@ -3,7 +3,6 @@ export RPC="https://rpc.ankr.com/optimism" ### Contract addresses export RELEASE_WORMHOLE_ADDRESS=0xEe91C335eab126dF5fDB3797EA9d6aD93aeC9722 export RELEASE_CIRCLE_BRIDGE_ADDRESS=0x2B4069517957735bE00ceE0fadAE88a26365528f -export RELEASE_WORMHOLE_FINALITY=1 ### Deployed Circle Integration addresses export CIRCLE_INTEGRATION_IMPLEMENTATION=0xD73aFD826D6bDD4D2fEF326DF5091451A5d8130a diff --git a/evm/env/testing.env b/evm/env/testing.env index e849569..9942a38 100644 --- a/evm/env/testing.env +++ b/evm/env/testing.env @@ -1,14 +1,13 @@ ############################################################################### # -# Ethereum Testnet (Goerli) +# Polygon Testnet (Mumbai) # ############################################################################### -export ETH_FORK_RPC= -export ETH_FORK_CHAIN_ID=5 -export ETH_USDC_TOKEN_ADDRESS=0x07865c6E87B9F70255377e024ace6630C1Eaa37F -export ETH_CIRCLE_BRIDGE_ADDRESS=0xd0c3da58f55358142b8d3e06c1c30c5c6114efe8 -export ETH_WORMHOLE_ADDRESS=0x706abc4E45D419950511e474C7B9Ed348A4a716c -export ETH_WORMHOLE_FINALITY=15 +export ETH_FORK_RPC=https://polygon-mumbai-bor.publicnode.com +export ETH_FORK_CHAIN_ID=80001 +export ETH_USDC_TOKEN_ADDRESS=0x9999f7Fea5938fD3b1E26A12c3f2fb024e194f97 +export ETH_CIRCLE_BRIDGE_ADDRESS=0x9f3B8679c73C2Fef8b59B4f3444d4e156fb70AA5 +export ETH_WORMHOLE_ADDRESS=0x0CBE91CF822c73C2315FB05100C2F714765d5c20 ############################################################################### # @@ -20,7 +19,6 @@ export AVAX_FORK_CHAIN_ID=43113 export AVAX_USDC_TOKEN_ADDRESS=0x5425890298aed601595a70AB815c96711a31Bc65 export AVAX_CIRCLE_BRIDGE_ADDRESS=0xeb08f243e5d3fcff26a9e38ae5520a669f4019d0 export AVAX_WORMHOLE_ADDRESS=0x7bbcE28e64B3F8b84d876Ab298393c38ad7aac4C -export AVAX_WORMHOLE_FINALITY=1 ############################################################################### # @@ -31,19 +29,6 @@ export TESTING_DEVNET_GUARDIAN=cfb12303a19cde580bb4dd771639b0d26bc68353645571a8c export TESTING_WORMHOLE_ADDRESS=${ETH_WORMHOLE_ADDRESS} export TESTING_FORK_RPC=${ETH_FORK_RPC} export TESTING_FORK_CHAIN_ID=${ETH_FORK_CHAIN_ID} -export TESTING_WORMHOLE_CHAIN_ID=2 -export TESTING_WORMHOLE_MESSAGE_FEE=0 -export TESTING_WORMHOLE_GUARDIAN_SET_INDEX=0 export TESTING_CIRCLE_BRIDGE_ADDRESS=${ETH_CIRCLE_BRIDGE_ADDRESS} -export TESTING_MESSAGE_ATTESTER_ADDRESS=0x749945748f72C66D5127D5172279405dfa195bF0 export TESTING_USDC_TOKEN_ADDRESS=${ETH_USDC_TOKEN_ADDRESS} export TESTING_FOREIGN_USDC_TOKEN_ADDRESS=${AVAX_USDC_TOKEN_ADDRESS} -export TESTING_LAST_NONCE=94802 - -############################################################################### -# -# Integration (Anvil) Test -# -############################################################################### -export WALLET_PRIVATE_KEY=4f3edf983ac636a65a842ce7c78d9aa706d3b113bce9c46f30d7d21715b23b1d -export WALLET_PRIVATE_KEY_TWO=92db14e403b83dfe3df233f83dfa3a0d7096f21ca9b0d6d6b8d88b2b4ec1564e diff --git a/evm/env/testnet/arbitrum-testnet.env b/evm/env/testnet/arbitrum-testnet.env index cde6f12..e19cadb 100644 --- a/evm/env/testnet/arbitrum-testnet.env +++ b/evm/env/testnet/arbitrum-testnet.env @@ -3,7 +3,6 @@ export RPC="" ### Contract addresses export RELEASE_WORMHOLE_ADDRESS=0xC7A204bDBFe983FCD8d8E61D02b475D4073fF97e export RELEASE_CIRCLE_BRIDGE_ADDRESS=0x12dcfd3fe2e9eac2859fd1ed86d2ab8c5a2f9352 -export RELEASE_WORMHOLE_FINALITY=1 ### Deployed Circle Integration addresses export CIRCLE_INTEGRATION_IMPLEMENTATION=0xa098368aaadc0fdf3e309cda710d7a5f8bdeecd9 diff --git a/evm/env/testnet/avax-testnet.env b/evm/env/testnet/avax-testnet.env index d8d54e4..308b6af 100644 --- a/evm/env/testnet/avax-testnet.env +++ b/evm/env/testnet/avax-testnet.env @@ -3,7 +3,6 @@ export RPC="https://api.avax-test.network/ext/bc/C/rpc" ### Contract addresses export RELEASE_WORMHOLE_ADDRESS=0x7bbcE28e64B3F8b84d876Ab298393c38ad7aac4C export RELEASE_CIRCLE_BRIDGE_ADDRESS=0xeb08f243e5d3fcff26a9e38ae5520a669f4019d0 -export RELEASE_WORMHOLE_FINALITY=1 ### Deployed Circle Integration addresses export CIRCLE_INTEGRATION_IMPLEMENTATION=0xf0ff9898918351148ffd97c7ddb412086505eae1 diff --git a/evm/env/testnet/eth-testnet.env b/evm/env/testnet/eth-testnet.env index c335cba..028e150 100644 --- a/evm/env/testnet/eth-testnet.env +++ b/evm/env/testnet/eth-testnet.env @@ -3,7 +3,6 @@ export RPC="" ### Contract addresses export RELEASE_WORMHOLE_ADDRESS=0x706abc4E45D419950511e474C7B9Ed348A4a716c export RELEASE_CIRCLE_BRIDGE_ADDRESS=0xd0c3da58f55358142b8d3e06c1c30c5c6114efe8 -export RELEASE_WORMHOLE_FINALITY=200 ### Deployed Circle Integration addresses export CIRCLE_INTEGRATION_IMPLEMENTATION=0x4fa4b2c3744b29D0e4F1AaFE8B758F953FaCf1A4 diff --git a/evm/env/testnet/optimism-testnet.env b/evm/env/testnet/optimism-testnet.env index 4dc7cc3..d5cd777 100644 --- a/evm/env/testnet/optimism-testnet.env +++ b/evm/env/testnet/optimism-testnet.env @@ -3,7 +3,6 @@ export RPC="https://goerli.optimism.io" ### Contract addresses export RELEASE_WORMHOLE_ADDRESS=0x6b9C8671cdDC8dEab9c719bB87cBd3e782bA6a35 export RELEASE_CIRCLE_BRIDGE_ADDRESS=0x23a04d5935ed8bc8e3eb78db3541f0abfb001c6e -export RELEASE_WORMHOLE_FINALITY=1 ### Deployed Circle Integration addresses diff --git a/evm/forge-scripts/deploy_contracts.sol b/evm/forge-scripts/deploy_contracts.sol deleted file mode 100644 index 1b5a1b4..0000000 --- a/evm/forge-scripts/deploy_contracts.sol +++ /dev/null @@ -1,75 +0,0 @@ -// SPDX-License-Identifier: Apache 2 - -pragma solidity ^0.8.19; - -import "forge-std/Script.sol"; -import "forge-std/console2.sol"; - -import {IWormhole} from "wormhole/interfaces/IWormhole.sol"; - -import {ICircleBridge} from "../src/interfaces/circle/ICircleBridge.sol"; -import {IMessageTransmitter} from "../src/interfaces/circle/IMessageTransmitter.sol"; - -import {CircleIntegrationSetup} from "../src/circle_integration/CircleIntegrationSetup.sol"; -import {CircleIntegrationImplementation} from "../src/circle_integration/CircleIntegrationImplementation.sol"; -import {CircleIntegrationProxy} from "../src/circle_integration/CircleIntegrationProxy.sol"; -import {ICircleIntegration} from "../src/interfaces/ICircleIntegration.sol"; - -contract ContractScript is Script { - // Wormhole - IWormhole wormhole; - - // Circle - ICircleBridge circleBridge; - - // Circle Integration - CircleIntegrationSetup setup; - CircleIntegrationImplementation implementation; - CircleIntegrationProxy proxy; - - function setUp() public { - // Wormhole - wormhole = IWormhole(vm.envAddress("RELEASE_WORMHOLE_ADDRESS")); - - // Circle - circleBridge = ICircleBridge(vm.envAddress("RELEASE_CIRCLE_BRIDGE_ADDRESS")); - } - - function deployCircleIntegration() public { - // first Setup - setup = new CircleIntegrationSetup(); - console2.log("CircleIntegrationSetup address: %s", address(setup)); - - // next Implementation - implementation = new CircleIntegrationImplementation(); - console2.log("CircleIntegrationImplementation address: %s", address(implementation)); - - - console2.log("Wormhole address: %s, chainId: %s", address(wormhole), wormhole.chainId()); - - // setup Proxy using Implementation - proxy = new CircleIntegrationProxy( - address(setup), - abi.encodeCall(CircleIntegrationSetup.setup, ( - address(implementation), - address(wormhole), - uint8(vm.envUint("RELEASE_WORMHOLE_FINALITY")), - address(circleBridge), - wormhole.governanceChainId(), - wormhole.governanceContract() - )) - ); - console2.log("CircleIntegrationProxy address: %s", address(proxy)); - } - - function run() public { - // begin sending transactions - vm.startBroadcast(); - - // deploy Circle Integration proxy - deployCircleIntegration(); - - // finished - vm.stopBroadcast(); - } -} diff --git a/evm/forge-test/CircleIntegration.t.sol b/evm/forge-test/CircleIntegration.t.sol deleted file mode 100644 index 99dcdcd..0000000 --- a/evm/forge-test/CircleIntegration.t.sol +++ /dev/null @@ -1,813 +0,0 @@ -// SPDX-License-Identifier: Apache 2 -pragma solidity ^0.8.19; - -import "forge-std/Test.sol"; -import "forge-std/console.sol"; - -import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; -import {BytesLib} from "wormhole/libraries/external/BytesLib.sol"; - -import {IWormhole} from "wormhole/interfaces/IWormhole.sol"; -import {ICircleIntegration} from "../src/interfaces/ICircleIntegration.sol"; -import {IUSDC} from "../src/interfaces/circle/IUSDC.sol"; - -import {CircleIntegrationStructs} from "../src/circle_integration/CircleIntegrationStructs.sol"; -import {CircleIntegrationSetup} from "../src/circle_integration/CircleIntegrationSetup.sol"; -import {CircleIntegrationImplementation} from "../src/circle_integration/CircleIntegrationImplementation.sol"; -import {CircleIntegrationProxy} from "../src/circle_integration/CircleIntegrationProxy.sol"; - -import {WormholeSimulator} from "wormhole-forge-sdk/WormholeSimulator.sol"; - -contract CircleIntegrationTest is Test { - using BytesLib for bytes; - - bytes32 constant GOVERNANCE_MODULE = 0x000000000000000000000000000000436972636c65496e746567726174696f6e; - - uint8 constant GOVERNANCE_UPDATE_WORMHOLE_FINALITY = 1; - uint8 constant GOVERNANCE_REGISTER_EMITTER_AND_DOMAIN = 2; - uint8 constant GOVERNANCE_UPGRADE_CONTRACT = 3; - - // USDC - IUSDC usdc; - - // dependencies - WormholeSimulator wormholeSimulator; - IWormhole wormhole; - - ICircleIntegration circleIntegration; - - // foreign - bytes32 foreignUsdc; - - function maxUSDCAmountToMint() public view returns (uint256) { - return type(uint256).max - usdc.totalSupply(); - } - - function mintUSDC(uint256 amount) public { - require(amount <= maxUSDCAmountToMint(), "total supply overflow"); - usdc.mint(address(this), amount); - } - - function setupWormhole() public { - // Set up this chain's Wormhole - wormholeSimulator = new WormholeSimulator( - vm.envAddress("TESTING_WORMHOLE_ADDRESS"), uint256(vm.envBytes32("TESTING_DEVNET_GUARDIAN"))); - wormhole = wormholeSimulator.wormhole(); - } - - function setupUSDC() public { - usdc = IUSDC(vm.envAddress("TESTING_USDC_TOKEN_ADDRESS")); - - (, bytes memory queriedDecimals) = address(usdc).staticcall(abi.encodeWithSignature("decimals()")); - uint8 decimals = abi.decode(queriedDecimals, (uint8)); - require(decimals == 6, "wrong USDC"); - - // spoof .configureMinter() call with the master minter account - // allow this test contract to mint USDC - vm.prank(usdc.masterMinter()); - usdc.configureMinter(address(this), type(uint256).max); - - uint256 amount = 42069; - mintUSDC(amount); - require(usdc.balanceOf(address(this)) == amount); - } - - function setupCircleIntegration() public { - // deploy Setup - CircleIntegrationSetup setup = new CircleIntegrationSetup(); - - // deploy Implementation - CircleIntegrationImplementation implementation = new CircleIntegrationImplementation(); - - // deploy Proxy - CircleIntegrationProxy proxy = new CircleIntegrationProxy( - address(setup), - abi.encodeWithSelector( - bytes4(keccak256("setup(address,address,uint8,address,uint16,bytes32)")), - address(implementation), - address(wormhole), - uint8(1), // finality - vm.envAddress("TESTING_CIRCLE_BRIDGE_ADDRESS"), // circleBridge - uint16(1), - bytes32(0x0000000000000000000000000000000000000000000000000000000000000004) - ) - ); - - circleIntegration = ICircleIntegration(address(proxy)); - } - - function setUp() public { - // set up circle contracts (transferring ownership to address(this), etc) - setupUSDC(); - - // set up wormhole simulator - setupWormhole(); - - // now our contract - setupCircleIntegration(); - - foreignUsdc = bytes32(uint256(uint160(vm.envAddress("TESTING_FOREIGN_USDC_TOKEN_ADDRESS")))); - } - - function registerContract(uint16 foreignChain, bytes32 foreignEmitter, uint32 domain) public { - bytes memory encodedMessage = wormholeSimulator.makeSignedGovernanceObservation( - wormholeSimulator.governanceChainId(), - wormholeSimulator.governanceContract(), - GOVERNANCE_MODULE, - GOVERNANCE_REGISTER_EMITTER_AND_DOMAIN, - circleIntegration.chainId(), - abi.encodePacked(foreignChain, foreignEmitter, domain) - ); - - // Register emitter and domain. - circleIntegration.registerEmitterAndDomain(encodedMessage); - } - - function prepareCircleIntegrationTest(uint256 amount) public { - // Set up USDC token for test - if (amount > 0) { - // First mint USDC. - mintUSDC(amount); - - // Next set allowance. - usdc.approve(address(circleIntegration), amount); - } - } - - function testEncodeDepositWithPayload( - bytes32 token, - uint256 amount, - uint32 sourceDomain, - uint32 targetDomain, - uint64 nonce, - bytes32 fromAddress, - bytes32 mintRecipient, - bytes memory payload - ) public view { - vm.assume(token != bytes32(0)); - vm.assume(amount > 0); - vm.assume(targetDomain != sourceDomain); - vm.assume(nonce > 0); - vm.assume(fromAddress != bytes32(0)); - vm.assume(mintRecipient != bytes32(0)); - vm.assume(payload.length > 0); - - ICircleIntegration.DepositWithPayload memory deposit; - deposit.token = token; - deposit.amount = amount; - - deposit.sourceDomain = sourceDomain; - deposit.targetDomain = targetDomain; - - deposit.nonce = nonce; - deposit.fromAddress = fromAddress; - deposit.mintRecipient = mintRecipient; - deposit.payload = payload; - - bytes memory serialized = circleIntegration.encodeDepositWithPayload(deposit); - - // payload ID - require(serialized.toUint8(0) == 1, "invalid payload"); - - // token - for (uint256 i = 0; i < 32;) { - require(deposit.token[i] == serialized[i + 1], "invalid token serialization"); - unchecked { - i += 1; - } - } - - // amount - for (uint256 i = 0; i < 32;) { - require(bytes32(deposit.amount)[i] == serialized[i + 33], "invalid amount serialization"); - unchecked { - i += 1; - } - } - - // sourceDomain 65 - for (uint256 i = 0; i < 4;) { - require(bytes4(deposit.sourceDomain)[i] == serialized[i + 65], "invalid sourceDomain serialization"); - unchecked { - i += 1; - } - } - // targetDomain 69 (hehe) - for (uint256 i = 0; i < 4;) { - require(bytes4(deposit.targetDomain)[i] == serialized[i + 69], "invalid targetDomain serialization"); - unchecked { - i += 1; - } - } - - // nonce - for (uint256 i = 0; i < 8;) { - require(bytes8(deposit.nonce)[i] == serialized[i + 73], "invalid nonce serialization"); - unchecked { - i += 1; - } - } - - // fromAddress - for (uint256 i = 0; i < 8;) { - require(deposit.fromAddress[i] == serialized[i + 81], "invalid fromAddress serialization"); - unchecked { - i += 1; - } - } - - // mintRecipient - for (uint256 i = 0; i < 8;) { - require(deposit.mintRecipient[i] == serialized[i + 113], "invalid mintRecipient serialization"); - unchecked { - i += 1; - } - } - - // payload length - uint256 payloadLen = deposit.payload.length; - for (uint256 i = 0; i < 2;) { - require(bytes32(payloadLen)[i + 30] == serialized[i + 145], "invalid payload length serialization"); - unchecked { - i += 1; - } - } - - // payload - for (uint256 i = 0; i < payloadLen;) { - require(deposit.payload[i] == serialized[i + 147], "invalid payload serialization"); - unchecked { - i += 1; - } - } - } - - function testDecodeDepositWithPayload( - bytes32 token, - uint256 amount, - uint32 sourceDomain, - uint32 targetDomain, - uint64 nonce, - bytes32 fromAddress, - bytes32 mintRecipient, - bytes memory payload - ) public view { - vm.assume(token != bytes32(0)); - vm.assume(amount > 0); - vm.assume(targetDomain != sourceDomain); - vm.assume(nonce > 0); - vm.assume(fromAddress != bytes32(0)); - vm.assume(mintRecipient != bytes32(0)); - vm.assume(payload.length > 0); - - ICircleIntegration.DepositWithPayload memory expected; - expected.token = token; - expected.amount = amount; - - expected.sourceDomain = 0; - expected.targetDomain = 1; - - expected.nonce = nonce; - expected.fromAddress = fromAddress; - expected.mintRecipient = mintRecipient; - expected.payload = payload; - - bytes memory serialized = circleIntegration.encodeDepositWithPayload(expected); - - ICircleIntegration.DepositWithPayload memory deposit = circleIntegration.decodeDepositWithPayload(serialized); - require(deposit.token == expected.token, "token != expected"); - require(deposit.amount == expected.amount, "amount != expected"); - require(deposit.sourceDomain == expected.sourceDomain, "sourceDomain != expected"); - require(deposit.targetDomain == expected.targetDomain, "targetDomain != expected"); - require(deposit.nonce == expected.nonce, "nonce != expected"); - require(deposit.fromAddress == expected.fromAddress, "fromAddress != expected"); - require(deposit.mintRecipient == expected.mintRecipient, "mintRecipient != expected"); - - for (uint256 i = 0; i < deposit.payload.length;) { - require(deposit.payload[i] == expected.payload[i], "payload != expected"); - unchecked { - i += 1; - } - } - } - - function testCannotConsumeGovernanceMessageInvalidGovernanceChainId(uint16 governanceChainId, uint8 action) - public - { - vm.assume(governanceChainId != wormholeSimulator.governanceChainId()); - - bytes memory encodedMessage = wormholeSimulator.makeSignedGovernanceObservation( - governanceChainId, - wormholeSimulator.governanceContract(), - GOVERNANCE_MODULE, - action, - circleIntegration.chainId(), - abi.encodePacked("Mission accomplished.") - ); - - // You shall not pass! - vm.expectRevert("invalid governance chain"); - circleIntegration.verifyGovernanceMessage(encodedMessage, action); - } - - function testCannotConsumeGovernanceMessageInvalidGovernanceContract(bytes32 governanceContract, uint8 action) - public - { - vm.assume(governanceContract != wormholeSimulator.governanceContract()); - - bytes memory encodedMessage = wormholeSimulator.makeSignedGovernanceObservation( - wormholeSimulator.governanceChainId(), - governanceContract, - GOVERNANCE_MODULE, - action, - circleIntegration.chainId(), - abi.encodePacked("Mission accomplished.") - ); - - // You shall not pass! - vm.expectRevert("invalid governance contract"); - circleIntegration.verifyGovernanceMessage(encodedMessage, action); - } - - function testCannotConsumeGovernanceMessageInvalidModule(bytes32 governanceModule, uint8 action) public { - vm.assume(governanceModule != GOVERNANCE_MODULE); - - bytes memory encodedMessage = wormholeSimulator.makeSignedGovernanceObservation( - wormholeSimulator.governanceChainId(), - wormholeSimulator.governanceContract(), - governanceModule, - action, - circleIntegration.chainId(), - abi.encodePacked("Mission accomplished.") - ); - - // You shall not pass! - vm.expectRevert("invalid governance module"); - circleIntegration.verifyGovernanceMessage(encodedMessage, action); - } - - function testCannotConsumeGovernanceMessageInvalidAction(uint8 action, uint8 wrongAction) public { - vm.assume(action != wrongAction); - - bytes memory encodedMessage = wormholeSimulator.makeSignedGovernanceObservation( - wormholeSimulator.governanceChainId(), - wormholeSimulator.governanceContract(), - GOVERNANCE_MODULE, - action, - circleIntegration.chainId(), - abi.encodePacked("Mission accomplished.") - ); - - // You shall not pass! - vm.expectRevert("invalid governance action"); - circleIntegration.verifyGovernanceMessage(encodedMessage, wrongAction); - } - - function testCannotUpdateWormholeFinalityInvalidLength(uint8 finality) public { - vm.assume(finality > 0 && finality != circleIntegration.wormholeFinality()); - - bytes memory encodedMessage = wormholeSimulator.makeSignedGovernanceObservation( - wormholeSimulator.governanceChainId(), - wormholeSimulator.governanceContract(), - GOVERNANCE_MODULE, - GOVERNANCE_UPDATE_WORMHOLE_FINALITY, - circleIntegration.chainId(), - abi.encodePacked(finality, "But wait! There's more.") - ); - - // You shall not pass! - vm.expectRevert("invalid governance payload length"); - circleIntegration.updateWormholeFinality(encodedMessage); - } - - function testCannotUpdateWormholeFinalityInvalidTargetChain(uint16 targetChainId, uint8 finality) public { - vm.assume(targetChainId != circleIntegration.chainId()); - vm.assume(finality > 0 && finality != circleIntegration.wormholeFinality()); - - bytes memory encodedMessage = wormholeSimulator.makeSignedGovernanceObservation( - wormholeSimulator.governanceChainId(), - wormholeSimulator.governanceContract(), - GOVERNANCE_MODULE, - GOVERNANCE_UPDATE_WORMHOLE_FINALITY, - targetChainId, - abi.encodePacked(finality) - ); - - // You shall not pass! - vm.expectRevert("invalid target chain"); - circleIntegration.updateWormholeFinality(encodedMessage); - } - - function testUpdateWormholeFinality(uint8 finality) public { - vm.assume(finality > 0 && finality != circleIntegration.wormholeFinality()); - - assertEq(circleIntegration.wormholeFinality(), 1, "starting finality incorrect"); - - bytes memory encodedMessage = wormholeSimulator.makeSignedGovernanceObservation( - wormholeSimulator.governanceChainId(), - wormholeSimulator.governanceContract(), - GOVERNANCE_MODULE, - GOVERNANCE_UPDATE_WORMHOLE_FINALITY, - circleIntegration.chainId(), - abi.encodePacked(finality) - ); - - // Update with governance message - circleIntegration.updateWormholeFinality(encodedMessage); - - assertEq(circleIntegration.wormholeFinality(), finality, "new finality incorrect"); - } - - function testCannotRegisterEmitterAndDomainInvalidLength(uint16 foreignChain, bytes32 foreignEmitter, uint32 domain) - public - { - vm.assume(foreignChain > 0); - vm.assume(foreignChain != circleIntegration.chainId()); - vm.assume(foreignEmitter != bytes32(0)); - // For the purposes of this test, we will assume the domain set is > 0 - vm.assume(domain > 0); - vm.assume(domain != circleIntegration.localDomain()); - - // No emitters should be registered for this chain. - assertEq(circleIntegration.getRegisteredEmitter(foreignChain), bytes32(0), "already registered"); - assertEq(circleIntegration.getDomainFromChainId(foreignChain), 0, "domain already registered"); - assertEq(circleIntegration.getChainIdFromDomain(domain), 0, "chain already registered"); - - bytes memory encodedMessage = wormholeSimulator.makeSignedGovernanceObservation( - wormholeSimulator.governanceChainId(), - wormholeSimulator.governanceContract(), - GOVERNANCE_MODULE, - GOVERNANCE_REGISTER_EMITTER_AND_DOMAIN, - circleIntegration.chainId(), - abi.encodePacked(foreignChain, foreignEmitter, domain, "But wait! There's more.") - ); - - // You shall not pass! - vm.expectRevert("invalid governance payload length"); - circleIntegration.registerEmitterAndDomain(encodedMessage); - } - - function testCannotRegisterEmitterAndDomainInvalidTargetChain( - uint16 targetChain, - uint16 foreignChain, - bytes32 foreignEmitter, - uint32 domain - ) public { - vm.assume( - targetChain != circleIntegration.chainId() && - targetChain != 0 - ); - vm.assume(foreignChain > 0); - vm.assume(foreignChain != circleIntegration.chainId()); - vm.assume(foreignEmitter != bytes32(0)); - // For the purposes of this test, we will assume the domain set is > 0 - vm.assume(domain > 0); - vm.assume(domain != circleIntegration.localDomain()); - - // No emitters should be registered for this chain. - assertEq(circleIntegration.getRegisteredEmitter(foreignChain), bytes32(0), "already registered"); - assertEq(circleIntegration.getDomainFromChainId(foreignChain), 0, "domain already registered"); - assertEq(circleIntegration.getChainIdFromDomain(domain), 0, "chain already registered"); - - bytes memory encodedMessage = wormholeSimulator.makeSignedGovernanceObservation( - wormholeSimulator.governanceChainId(), - wormholeSimulator.governanceContract(), - GOVERNANCE_MODULE, - GOVERNANCE_REGISTER_EMITTER_AND_DOMAIN, - targetChain, - abi.encodePacked(foreignChain, foreignEmitter, domain) - ); - - // You shall not pass! - vm.expectRevert("invalid target chain"); - circleIntegration.registerEmitterAndDomain(encodedMessage); - } - - function testCannotRegisterEmitterAndDomainInvalidForeignChain(bytes32 foreignEmitter, uint32 domain) public { - vm.assume(foreignEmitter != bytes32(0)); - // For the purposes of this test, we will assume the domain set is > 0 - vm.assume(domain > 0); - vm.assume(domain != circleIntegration.localDomain()); - - // No emitters should be registered for this chain. - - // emitterChain cannot be zero - { - uint16 foreignChain = 0; - assertEq(circleIntegration.getRegisteredEmitter(foreignChain), bytes32(0), "already registered"); - assertEq(circleIntegration.getDomainFromChainId(foreignChain), 0, "domain already registered"); - assertEq(circleIntegration.getChainIdFromDomain(domain), 0, "chain already registered"); - - bytes memory encodedMessage = wormholeSimulator.makeSignedGovernanceObservation( - wormholeSimulator.governanceChainId(), - wormholeSimulator.governanceContract(), - GOVERNANCE_MODULE, - GOVERNANCE_REGISTER_EMITTER_AND_DOMAIN, - circleIntegration.chainId(), - abi.encodePacked(foreignChain, foreignEmitter, domain) - ); - - // You shall not pass! - vm.expectRevert("invalid chain"); - circleIntegration.registerEmitterAndDomain(encodedMessage); - } - - // emitterChain cannot be this chain's - { - uint16 foreignChain = circleIntegration.chainId(); - assertEq(circleIntegration.getRegisteredEmitter(foreignChain), bytes32(0), "already registered"); - assertEq(circleIntegration.getDomainFromChainId(foreignChain), 0, "domain already registered"); - assertEq(circleIntegration.getChainIdFromDomain(domain), 0, "chain already registered"); - - bytes memory encodedMessage = wormholeSimulator.makeSignedGovernanceObservation( - wormholeSimulator.governanceChainId(), - wormholeSimulator.governanceContract(), - GOVERNANCE_MODULE, - GOVERNANCE_REGISTER_EMITTER_AND_DOMAIN, - circleIntegration.chainId(), - abi.encodePacked(foreignChain, foreignEmitter, domain) - ); - - // You shall not pass! - vm.expectRevert("invalid chain"); - circleIntegration.registerEmitterAndDomain(encodedMessage); - } - } - - function testCannotRegisterEmitterAndDomainInvalidEmitterAddress(uint16 foreignChain, uint32 domain) public { - vm.assume(foreignChain > 0); - vm.assume(foreignChain != circleIntegration.chainId()); - // For the purposes of this test, we will assume the domain set is > 0 - vm.assume(domain > 0); - vm.assume(domain != circleIntegration.localDomain()); - - // No emitters should be registered for this chain. - assertEq(circleIntegration.getRegisteredEmitter(foreignChain), bytes32(0), "already registered"); - assertEq(circleIntegration.getDomainFromChainId(foreignChain), 0, "domain already registered"); - assertEq(circleIntegration.getChainIdFromDomain(domain), 0, "chain already registered"); - - bytes memory encodedMessage = wormholeSimulator.makeSignedGovernanceObservation( - wormholeSimulator.governanceChainId(), - wormholeSimulator.governanceContract(), - GOVERNANCE_MODULE, - GOVERNANCE_REGISTER_EMITTER_AND_DOMAIN, - circleIntegration.chainId(), - abi.encodePacked( - foreignChain, - bytes32(0), // emitterAddress - domain - ) - ); - - // You shall not pass! - vm.expectRevert("emitter cannot be zero address"); - circleIntegration.registerEmitterAndDomain(encodedMessage); - } - - function testCannotRegisterEmitterAndDomainInvalidDomain(uint16 foreignChain, bytes32 foreignEmitter) public { - vm.assume(foreignChain > 0); - vm.assume(foreignChain != circleIntegration.chainId()); - vm.assume(foreignEmitter != bytes32(0)); - - // No emitters should be registered for this chain. - assertEq(circleIntegration.getRegisteredEmitter(foreignChain), bytes32(0), "already registered"); - assertEq(circleIntegration.getDomainFromChainId(foreignChain), 0, "domain already registered"); - - { - uint32 domain = circleIntegration.localDomain(); - assertEq(circleIntegration.getChainIdFromDomain(domain), 0, "chain already registered"); - - bytes memory encodedMessage = wormholeSimulator.makeSignedGovernanceObservation( - wormholeSimulator.governanceChainId(), - wormholeSimulator.governanceContract(), - GOVERNANCE_MODULE, - GOVERNANCE_REGISTER_EMITTER_AND_DOMAIN, - circleIntegration.chainId(), - abi.encodePacked(foreignChain, foreignEmitter, domain) - ); - - // You shall not pass! - vm.expectRevert("domain == localDomain()"); - circleIntegration.registerEmitterAndDomain(encodedMessage); - } - } - - function testRegisterEmitterAndDomainNoTarget() public { - uint16 foreignChain = 42069; - bytes32 foreignEmitter = bytes32(uint256(uint160(vm.envAddress("TESTING_FOREIGN_USDC_TOKEN_ADDRESS")))); - uint32 domain = 69420; - - // No emitters should be registered for this chain. - assertEq(circleIntegration.getRegisteredEmitter(foreignChain), bytes32(0), "already registered"); - assertEq(circleIntegration.getDomainFromChainId(foreignChain), 0, "domain already registered"); - assertEq(circleIntegration.getChainIdFromDomain(domain), 0, "chain already registered"); - - bytes memory encodedMessage = wormholeSimulator.makeSignedGovernanceObservation( - wormholeSimulator.governanceChainId(), - wormholeSimulator.governanceContract(), - GOVERNANCE_MODULE, - GOVERNANCE_REGISTER_EMITTER_AND_DOMAIN, - 0, // NOTE: set the target chain to zero - abi.encodePacked(foreignChain, foreignEmitter, domain) - ); - - // Register emitter and domain. - circleIntegration.registerEmitterAndDomain(encodedMessage); - - require(circleIntegration.getRegisteredEmitter(foreignChain) == foreignEmitter, "wrong foreignEmitter"); - require(circleIntegration.getDomainFromChainId(foreignChain) == domain, "wrong domain"); - require(circleIntegration.getChainIdFromDomain(domain) == foreignChain, "wrong chain"); - } - - function testRegisterEmitterAndDomain(uint16 foreignChain, bytes32 foreignEmitter, uint32 domain) public { - vm.assume(foreignChain > 0); - vm.assume(foreignChain != circleIntegration.chainId()); - vm.assume(foreignEmitter != bytes32(0)); - // For the purposes of this test, we will assume the domain set is > 0 - vm.assume(domain > 0); - vm.assume(domain != circleIntegration.localDomain()); - - // No emitters should be registered for this chain. - assertEq(circleIntegration.getRegisteredEmitter(foreignChain), bytes32(0), "already registered"); - assertEq(circleIntegration.getDomainFromChainId(foreignChain), 0, "domain already registered"); - assertEq(circleIntegration.getChainIdFromDomain(domain), 0, "chain already registered"); - - bytes memory encodedMessage = wormholeSimulator.makeSignedGovernanceObservation( - wormholeSimulator.governanceChainId(), - wormholeSimulator.governanceContract(), - GOVERNANCE_MODULE, - GOVERNANCE_REGISTER_EMITTER_AND_DOMAIN, - circleIntegration.chainId(), - abi.encodePacked(foreignChain, foreignEmitter, domain) - ); - - // Register emitter and domain. - circleIntegration.registerEmitterAndDomain(encodedMessage); - - require(circleIntegration.getRegisteredEmitter(foreignChain) == foreignEmitter, "wrong foreignEmitter"); - require(circleIntegration.getDomainFromChainId(foreignChain) == domain, "wrong domain"); - require(circleIntegration.getChainIdFromDomain(domain) == foreignChain, "wrong chain"); - - // we cannot register for this chain again - { - bytes memory anotherMessage = wormholeSimulator.makeSignedGovernanceObservation( - wormholeSimulator.governanceChainId(), - wormholeSimulator.governanceContract(), - GOVERNANCE_MODULE, - GOVERNANCE_REGISTER_EMITTER_AND_DOMAIN, - circleIntegration.chainId(), - abi.encodePacked(foreignChain, foreignEmitter, domain) - ); - - // You shall not pass! - vm.expectRevert("chain already registered"); - circleIntegration.registerEmitterAndDomain(anotherMessage); - } - } - - function testCannotUpgradeContractInvalidImplementation(bytes12 garbage, address newImplementation) public { - vm.assume(garbage != bytes12(0)); - vm.assume(newImplementation != address(0) && !circleIntegration.isInitialized(newImplementation)); - - // First attempt to submit garbage implementation - { - bytes memory encodedMessage = wormholeSimulator.makeSignedGovernanceObservation( - wormholeSimulator.governanceChainId(), - wormholeSimulator.governanceContract(), - GOVERNANCE_MODULE, - GOVERNANCE_UPGRADE_CONTRACT, - circleIntegration.chainId(), - abi.encodePacked(garbage, newImplementation) - ); - - // You shall not pass! - vm.expectRevert("invalid address"); - circleIntegration.upgradeContract(encodedMessage); - } - - // Now use legitimate-looking ERC20 address - { - bytes memory encodedMessage = wormholeSimulator.makeSignedGovernanceObservation( - wormholeSimulator.governanceChainId(), - wormholeSimulator.governanceContract(), - GOVERNANCE_MODULE, - GOVERNANCE_UPGRADE_CONTRACT, - circleIntegration.chainId(), - abi.encodePacked(bytes12(0), newImplementation) - ); - - // You shall not pass! - vm.expectRevert("invalid implementation"); - circleIntegration.upgradeContract(encodedMessage); - } - - // Now use one of Wormhole's implementations - { - address wormholeImplementation = 0x46DB25598441915D59df8955DD2E4256bC3c6e95; - - bytes memory encodedMessage = wormholeSimulator.makeSignedGovernanceObservation( - wormholeSimulator.governanceChainId(), - wormholeSimulator.governanceContract(), - GOVERNANCE_MODULE, - GOVERNANCE_UPGRADE_CONTRACT, - circleIntegration.chainId(), - abi.encodePacked(bytes12(0), wormholeImplementation) - ); - - // You shall not pass! - vm.expectRevert("invalid implementation"); - circleIntegration.upgradeContract(encodedMessage); - } - } - - function testUpgradeContract() public { - // Deploy new implementation. - CircleIntegrationImplementation implementation = new CircleIntegrationImplementation(); - - // Should not be initialized yet. - require(!circleIntegration.isInitialized(address(implementation)), "already initialized"); - - bytes memory encodedMessage = wormholeSimulator.makeSignedGovernanceObservation( - wormholeSimulator.governanceChainId(), - wormholeSimulator.governanceContract(), - GOVERNANCE_MODULE, - GOVERNANCE_UPGRADE_CONTRACT, - circleIntegration.chainId(), - abi.encodePacked(bytes12(0), address(implementation)) - ); - - // Upgrade contract. - circleIntegration.upgradeContract(encodedMessage); - - // Should not be initialized yet. - require(circleIntegration.isInitialized(address(implementation)), "implementation not initialized"); - } - - function testCannotTransferTokensWithPayloadInvalidToken( - address token, - uint256 amount, - uint16 targetChain, - bytes32 mintRecipient - ) public { - vm.assume(token != address(usdc)); - vm.assume(amount > 0 && amount <= maxUSDCAmountToMint()); - vm.assume(targetChain > 0 && targetChain != circleIntegration.chainId()); - vm.assume(mintRecipient != bytes32(0)); - - prepareCircleIntegrationTest(amount); - - // You shall not pass! - vm.expectRevert("token not accepted"); - circleIntegration.transferTokensWithPayload( - ICircleIntegration.TransferParameters({ - token: token, - amount: amount, - targetChain: targetChain, - mintRecipient: mintRecipient - }), - 0, // batchId - abi.encodePacked("All your base are belong to us") // payload - ); - } - - function testCannotTransferTokensWithPayloadZeroAmount(uint16 targetChain, bytes32 mintRecipient) public { - vm.assume(targetChain > 0 && targetChain != circleIntegration.chainId()); - vm.assume(mintRecipient != bytes32(0)); - - uint256 amount = 0; - prepareCircleIntegrationTest(amount); - - // You shall not pass! - vm.expectRevert("amount must be > 0"); - circleIntegration.transferTokensWithPayload( - ICircleIntegration.TransferParameters({ - token: address(usdc), - amount: amount, - targetChain: targetChain, - mintRecipient: mintRecipient - }), - 0, // batchId - abi.encodePacked("All your base are belong to us") // payload - ); - } - - function testCannotTransferTokensWithPayloadInvalidMintRecipient(uint256 amount, uint16 targetChain) public { - vm.assume(amount > 0 && amount <= maxUSDCAmountToMint()); - vm.assume(targetChain > 0 && targetChain != circleIntegration.chainId()); - - prepareCircleIntegrationTest(amount); - - // You shall not pass! - vm.expectRevert("invalid mint recipient"); - circleIntegration.transferTokensWithPayload( - ICircleIntegration.TransferParameters({ - token: address(usdc), - amount: amount, - targetChain: targetChain, - mintRecipient: bytes32(0) - }), - 0, // batchId - abi.encodePacked("All your base are belong to us") // payload - ); - } -} diff --git a/evm/forge/scripts/deploy_contracts.sol b/evm/forge/scripts/deploy_contracts.sol new file mode 100644 index 0000000..024e71c --- /dev/null +++ b/evm/forge/scripts/deploy_contracts.sol @@ -0,0 +1,65 @@ +// SPDX-License-Identifier: Apache 2 + +pragma solidity ^0.8.19; + +import "forge-std/Script.sol"; +import "forge-std/console2.sol"; + +import {ERC1967Proxy} from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol"; + +import {IWormhole} from "src/interfaces/IWormhole.sol"; +import {ITokenMessenger} from "src/interfaces/ITokenMessenger.sol"; +import {IMessageTransmitter} from "src/interfaces/IMessageTransmitter.sol"; +import {ICircleIntegration} from "src/interfaces/ICircleIntegration.sol"; + +import {Setup} from "src/contracts/CircleIntegration/Setup.sol"; +import {Implementation} from "src/contracts/CircleIntegration/Implementation.sol"; + +contract ContractScript is Script { + // Wormhole + IWormhole wormhole; + + // Circle + ITokenMessenger circleBridge; + + // Circle Integration + CircleIntegrationSetup setup; + CircleIntegrationImplementation implementation; + ERC1967Proxy proxy; + + function setUp() public { + // Wormhole + wormhole = IWormhole(vm.envAddress("RELEASE_WORMHOLE_ADDRESS")); + + // Circle + circleBridge = ITokenMessenger(vm.envAddress("RELEASE_CIRCLE_BRIDGE_ADDRESS")); + } + + function deployCircleIntegration() public { + // first Setup + setup = new Setup(); + console2.log("CircleIntegrationSetup address: %s", address(setup)); + + // next Implementation + implementation = new Implementation(address(wormhole), address(circleBridge)); + console2.log("CircleIntegrationImplementation address: %s", address(implementation)); + + console2.log("Wormhole address: %s, chainId: %s", address(wormhole), wormhole.chainId()); + + // setup Proxy using Implementation + proxy = + new ERC1967Proxy(address(setup), abi.encodeCall(setup.setup, address(implementation))); + console2.log("ERC1967Proxy address: %s", address(proxy)); + } + + function run() public { + // begin sending transactions + vm.startBroadcast(); + + // deploy Circle Integration proxy + deployCircleIntegration(); + + // finished + vm.stopBroadcast(); + } +} diff --git a/evm/forge-scripts/deploy_implementation_only.sol b/evm/forge/scripts/deploy_implementation_only.sol similarity index 82% rename from evm/forge-scripts/deploy_implementation_only.sol rename to evm/forge/scripts/deploy_implementation_only.sol index df96651..d07446a 100644 --- a/evm/forge-scripts/deploy_implementation_only.sol +++ b/evm/forge/scripts/deploy_implementation_only.sol @@ -5,7 +5,8 @@ pragma solidity ^0.8.19; import "forge-std/Script.sol"; import "forge-std/console.sol"; -import {CircleIntegrationImplementation} from "../src/circle_integration/CircleIntegrationImplementation.sol"; +import {CircleIntegrationImplementation} from + "../../src/CircleIntegration/CircleIntegrationImplementation.sol"; contract ContractScript is Script { function run() public { diff --git a/evm/forge-scripts/deploy_mock_contracts.sol b/evm/forge/scripts/deploy_mock_contracts.sol similarity index 87% rename from evm/forge-scripts/deploy_mock_contracts.sol rename to evm/forge/scripts/deploy_mock_contracts.sol index b5b901c..cd4665e 100644 --- a/evm/forge-scripts/deploy_mock_contracts.sol +++ b/evm/forge/scripts/deploy_mock_contracts.sol @@ -5,7 +5,7 @@ pragma solidity ^0.8.19; import "forge-std/Script.sol"; import "forge-std/console.sol"; -import {MockIntegration} from "../src/mock/MockIntegration.sol"; +import {MockIntegration} from "../../src/mock/MockIntegration.sol"; contract ContractScript is Script { function deployMockIntegration() public { diff --git a/evm/forge-scripts/read_governance_variables.sol b/evm/forge/scripts/read_governance_variables.sol similarity index 94% rename from evm/forge-scripts/read_governance_variables.sol rename to evm/forge/scripts/read_governance_variables.sol index 8066f43..2530804 100644 --- a/evm/forge-scripts/read_governance_variables.sol +++ b/evm/forge/scripts/read_governance_variables.sol @@ -5,7 +5,7 @@ pragma solidity ^0.8.19; import "forge-std/Script.sol"; import "forge-std/console.sol"; -import {ICircleIntegration} from "../src/interfaces/ICircleIntegration.sol"; +import {ICircleIntegration} from "../../src/interfaces/ICircleIntegration.sol"; contract ContractScript is Script { // Circle integration diff --git a/evm/forge-scripts/submit_testnet_registration.sol b/evm/forge/scripts/submit_testnet_registration.sol similarity index 85% rename from evm/forge-scripts/submit_testnet_registration.sol rename to evm/forge/scripts/submit_testnet_registration.sol index 75df771..5711032 100644 --- a/evm/forge-scripts/submit_testnet_registration.sol +++ b/evm/forge/scripts/submit_testnet_registration.sol @@ -5,8 +5,8 @@ pragma solidity ^0.8.19; import "forge-std/Script.sol"; import "forge-std/console.sol"; -import {ICircleIntegration} from "../src/interfaces/ICircleIntegration.sol"; -import {IWormhole} from "../src/interfaces/IWormhole.sol"; +import {ICircleIntegration} from "../../src/interfaces/ICircleIntegration.sol"; +import {IWormhole} from "../../src/interfaces/IWormhole.sol"; contract ContractScript is Script { // Circle integration @@ -16,7 +16,8 @@ contract ContractScript is Script { IWormhole wormhole; // Circle integration governance - bytes32 constant GOVERNANCE_MODULE = 0x000000000000000000000000000000436972636c65496e746567726174696f6e; + bytes32 constant GOVERNANCE_MODULE = + 0x000000000000000000000000000000436972636c65496e746567726174696f6e; uint8 constant GOVERNANCE_REGISTER_EMITTER_AND_DOMAIN = 2; function setUp() public { @@ -31,7 +32,11 @@ contract ContractScript is Script { return keccak256(abi.encodePacked(keccak256(body))); } - function encodeObservation(IWormhole.VM memory wormholeMessage) public pure returns (bytes memory) { + function encodeObservation(IWormhole.VM memory wormholeMessage) + public + pure + returns (bytes memory) + { return abi.encodePacked( wormholeMessage.timestamp, wormholeMessage.nonce, @@ -69,9 +74,11 @@ contract ContractScript is Script { ); } - function makeRegistrationObservation( - bytes memory decree - ) internal view returns (IWormhole.VM memory message) { + function makeRegistrationObservation(bytes memory decree) + internal + view + returns (IWormhole.VM memory message) + { message.timestamp = uint32(block.timestamp); message.nonce = 0; message.emitterChainId = wormhole.governanceChainId(); @@ -96,10 +103,7 @@ contract ContractScript is Script { ); // sign the governance message with the signer key - vaa = signObservation( - uint256(vm.envBytes32("SIGNER_KEY")), - message - ); + vaa = signObservation(uint256(vm.envBytes32("SIGNER_KEY")), message); } function submitRegistrationVaa() internal { diff --git a/evm/forge/tests/CircleIntegration.t.sol b/evm/forge/tests/CircleIntegration.t.sol new file mode 100644 index 0000000..cd98257 --- /dev/null +++ b/evm/forge/tests/CircleIntegration.t.sol @@ -0,0 +1,486 @@ +// SPDX-License-Identifier: Apache 2 +pragma solidity ^0.8.19; + +import "forge-std/Test.sol"; +import "forge-std/console.sol"; + +import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import {ERC1967Proxy} from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol"; + +import {IWormhole} from "src/interfaces/IWormhole.sol"; +import {ICircleIntegration} from "src/interfaces/ICircleIntegration.sol"; + +import {Utils} from "src/libraries/Utils.sol"; +import {WormholeCctpMessages} from "src/libraries/WormholeCctpMessages.sol"; + +import {Setup} from "src/contracts/CircleIntegration/Setup.sol"; +import {Implementation} from "src/contracts/CircleIntegration/Implementation.sol"; + +import { + CircleIntegrationOverride, + CraftedCctpMessageParams, + CraftedVaaParams +} from "test-helpers/libraries/CircleIntegrationOverride.sol"; +import {UsdcDeal} from "test-helpers/libraries/UsdcDeal.sol"; +import {WormholeOverride} from "test-helpers/libraries/WormholeOverride.sol"; + +contract CircleIntegrationTest is Test { + using Utils for *; + using WormholeCctpMessages for *; + using CircleIntegrationOverride for *; + using WormholeOverride for *; + using UsdcDeal for address; + + address immutable USDC_ADDRESS = vm.envAddress("TESTING_USDC_TOKEN_ADDRESS"); + bytes32 immutable FOREIGN_USDC_ADDRESS = + bytes32(uint256(uint160(vm.envAddress("TESTING_FOREIGN_USDC_TOKEN_ADDRESS")))); + + bytes32 constant GOVERNANCE_MODULE = + 0x000000000000000000000000000000436972636c65496e746567726174696f6e; + + // dependencies + IWormhole wormhole; + + ICircleIntegration circleIntegration; + + function setupWormhole() public { + wormhole = IWormhole(vm.envAddress("TESTING_WORMHOLE_ADDRESS")); + } + + function setupUSDC() public { + (, bytes memory queriedDecimals) = + USDC_ADDRESS.staticcall(abi.encodeWithSignature("decimals()")); + uint8 decimals = abi.decode(queriedDecimals, (uint8)); + assertEq(decimals, 6, "wrong USDC"); + } + + function setupCircleIntegration() public { + // deploy Setup + Setup setup = new Setup(); + + // deploy Implementation + Implementation implementation = new Implementation( + address(wormhole), + vm.envAddress("TESTING_CIRCLE_BRIDGE_ADDRESS") // tokenMessenger + ); + + // deploy Proxy + ERC1967Proxy proxy = + new ERC1967Proxy(address(setup), abi.encodeCall(setup.setup, address(implementation))); + + circleIntegration = ICircleIntegration(address(proxy)); + + circleIntegration.setUpOverride(uint256(vm.envBytes32("TESTING_DEVNET_GUARDIAN"))); + assertEq(wormhole.guardianPrivateKey(), uint256(vm.envBytes32("TESTING_DEVNET_GUARDIAN"))); + } + + function setUp() public { + setupUSDC(); + setupWormhole(); + setupCircleIntegration(); + } + + function test_CannotTransferTokensWithPayloadInvalidToken() public { + (uint16 targetChain,) = _registerEmitterAndDomain(); + + uint256 amount = 69; + + // Perform test with WETH. + address token = 0x9c3C9283D3e44854697Cd22D3Faa240Cfb032889; + deal(token, address(this), amount); + IERC20(token).approve(address(circleIntegration), amount); + + // You shall not pass! + _expectRevert( + abi.encodeCall( + circleIntegration.transferTokensWithPayload, + ( + ICircleIntegration.TransferParameters({ + token: token, + amount: amount, + targetChain: targetChain, + mintRecipient: 0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef + }), + 0, // wormholeNonce + abi.encodePacked("All your base are belong to us") // payload + ) + ), + abi.encodeCall(this.Error, ("Burn token not supported")) // CCTP Token Messenger error + ); + } + + function test_CannotTransferTokensWithPayloadZeroAmount() public { + (uint16 targetChain,) = _registerEmitterAndDomain(); + + // You shall not pass! + _expectRevert( + abi.encodeCall( + circleIntegration.transferTokensWithPayload, + ( + ICircleIntegration.TransferParameters({ + token: USDC_ADDRESS, + amount: 0, + targetChain: targetChain, + mintRecipient: 0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef + }), + 0, // wormholeNonce + abi.encodePacked("All your base are belong to us") // payload + ) + ), + abi.encodeCall(this.Error, ("Amount must be nonzero")) // CCTP Token Messenger error + ); + } + + function test_CannotTransferTokensWithPayloadInvalidMintRecipient() public { + uint256 amount = 69; + + (uint16 targetChain,) = _registerEmitterAndDomain(); + + _dealAndApproveUsdc(amount); + + // You shall not pass! + _expectRevert( + abi.encodeCall( + circleIntegration.transferTokensWithPayload, + ( + ICircleIntegration.TransferParameters({ + token: USDC_ADDRESS, + amount: amount, + targetChain: targetChain, + mintRecipient: 0 + }), + 0, // wormholeNonce + abi.encodePacked("All your base are belong to us") // payload + ) + ), + abi.encodeCall(this.Error, ("Mint recipient must be nonzero")) // CCTP Token Messenger error + ); + } + + function test_CannotTransferTokensWithPayloadTargetContractNotRegistered() public { + uint256 amount = 69; + + uint16 targetChain = 1; + + _dealAndApproveUsdc(amount); + + // You shall not pass! + _expectRevert( + abi.encodeCall( + circleIntegration.transferTokensWithPayload, + ( + ICircleIntegration.TransferParameters({ + token: USDC_ADDRESS, + amount: amount, + targetChain: targetChain, + mintRecipient: 0 + }), + 0, // wormholeNonce + abi.encodePacked("All your base are belong to us") // payload + ) + ), + abi.encodeCall(this.Error, ("target contract not registered")) + ); + } + + function test_TransferTokensWithPayload(uint256 amount, bytes32 mintRecipient) public { + amount = bound(amount, 1, _cctpBurnLimit()); + vm.assume(mintRecipient != bytes32(0)); + + (uint16 targetChain, uint32 targetDomain) = _registerEmitterAndDomain(); + bytes[2] memory payloads = [ + abi.encodePacked("All your base are belong to us"), + abi.encodePacked("You are on the way to destruction") + ]; + + _dealAndApproveUsdc(2 * amount); + + uint256 balanceBefore = IERC20(USDC_ADDRESS).balanceOf(address(this)); + + vm.recordLogs(); + uint64[2] memory sequences = [ + circleIntegration.transferTokensWithPayload( + ICircleIntegration.TransferParameters({ + token: USDC_ADDRESS, + amount: amount, + targetChain: targetChain, + mintRecipient: mintRecipient + }), + 420, // wormholeNonce + payloads[0] + ), + circleIntegration.transferTokensWithPayload( + ICircleIntegration.TransferParameters({ + token: USDC_ADDRESS, + amount: amount, + targetChain: targetChain, + mintRecipient: mintRecipient + }), + 420, // wormholeNonce + payloads[1] + ) + ]; + + Vm.Log[] memory logs = vm.getRecordedLogs(); + + bytes[] memory fetchedPayloads = logs.fetchWormholePublishedPayloads(); + assertEq(fetchedPayloads.length, 2); + + for (uint256 i; i < 2;) { + assertEq(sequences[i], uint64(i)); + assertEq( + keccak256(fetchedPayloads[i]), + keccak256( + USDC_ADDRESS.encodeDeposit( + amount, + circleIntegration.circleBridge().localMessageTransmitter().localDomain(), + targetDomain, + circleIntegration.circleBridge().localMessageTransmitter() + .nextAvailableNonce() - 2 + uint64(i), + address(this).toUniversalAddress(), + mintRecipient, + payloads[i] + ) + ) + ); + unchecked { + ++i; + } + } + + assertEq(IERC20(USDC_ADDRESS).balanceOf(address(this)) + 2 * amount, balanceBefore); + } + + function test_CannotRedeemTokensWithPayloadUnknownEmitter(bytes32 messageSender) public { + uint32 remoteDomain = 1; + uint16 emitterChain = 6; + + ICircleIntegration.RedeemParameters memory redeemParams = circleIntegration + .craftRedeemParameters( + CraftedCctpMessageParams({ + remoteDomain: remoteDomain, + nonce: 2 ** 64 - 1, + remoteToken: FOREIGN_USDC_ADDRESS, + mintRecipient: address(this).toUniversalAddress(), + amount: 69 + }), + CraftedVaaParams({emitterChain: emitterChain, sequence: 88}), + 0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef, // fromAddress + abi.encodePacked("Somebody set up us the bomb"), + messageSender + ); + + // You shall not pass! + _expectRevert( + abi.encodeCall(circleIntegration.redeemTokensWithPayload, (redeemParams)), + abi.encodeCall(this.Error, ("unknown emitter")) + ); + } + + function test_CannotRedeemTokensWithPayloadCallerMustBeMintRecipient(address mintRecipient) + public + { + vm.assume(mintRecipient != address(0) && mintRecipient != address(this)); + + (uint16 emitterChain, uint32 remoteDomain) = _registerEmitterAndDomain(); + + ICircleIntegration.RedeemParameters memory redeemParams = circleIntegration + .craftRedeemParameters( + CraftedCctpMessageParams({ + remoteDomain: remoteDomain, + nonce: 2 ** 64 - 1, + remoteToken: FOREIGN_USDC_ADDRESS, + mintRecipient: mintRecipient.toUniversalAddress(), + amount: 69 + }), + CraftedVaaParams({emitterChain: emitterChain, sequence: 88}), + 0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef, // fromAddress + abi.encodePacked("Somebody set up us the bomb") + ); + + // You shall not pass! + _expectRevert( + abi.encodeCall(circleIntegration.redeemTokensWithPayload, (redeemParams)), + abi.encodeCall(this.Error, ("caller must be mintRecipient")) + ); + } + + function test_CannotRedeemTokensWithPayloadMintTokenNotSupported(bytes32 remoteToken) public { + vm.assume(remoteToken != FOREIGN_USDC_ADDRESS); + + (uint16 emitterChain, uint32 remoteDomain) = _registerEmitterAndDomain(); + + ICircleIntegration.RedeemParameters memory redeemParams = circleIntegration + .craftRedeemParameters( + CraftedCctpMessageParams({ + remoteDomain: remoteDomain, + nonce: 2 ** 64 - 1, + remoteToken: remoteToken, + mintRecipient: address(this).toUniversalAddress(), + amount: 69 + }), + CraftedVaaParams({emitterChain: emitterChain, sequence: 88}), + 0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef, // fromAddress + abi.encodePacked("Somebody set up us the bomb") + ); + + // You shall not pass! + _expectRevert( + abi.encodeCall(circleIntegration.redeemTokensWithPayload, (redeemParams)), + abi.encodeCall(this.Error, ("Mint token not supported")) // CCTP Token Minter error + ); + } + + function test_CannotRedeemTokensWithPayloadInvalidMessagePair() public { + (uint16 emitterChain, uint32 remoteDomain) = _registerEmitterAndDomain(); + + ICircleIntegration.RedeemParameters memory redeemParams1 = circleIntegration + .craftRedeemParameters( + CraftedCctpMessageParams({ + remoteDomain: remoteDomain, + nonce: 2 ** 64 - 2, + remoteToken: FOREIGN_USDC_ADDRESS, + mintRecipient: address(this).toUniversalAddress(), + amount: 69 + }), + CraftedVaaParams({emitterChain: emitterChain, sequence: 88}), + 0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef, // fromAddress + abi.encodePacked("Somebody set up us the bomb") + ); + + ICircleIntegration.RedeemParameters memory redeemParams2 = circleIntegration + .craftRedeemParameters( + CraftedCctpMessageParams({ + remoteDomain: remoteDomain, + nonce: 2 ** 64 - 1, + remoteToken: FOREIGN_USDC_ADDRESS, + mintRecipient: address(this).toUniversalAddress(), + amount: 69 + }), + CraftedVaaParams({emitterChain: emitterChain, sequence: 89}), + 0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef, // fromAddress + abi.encodePacked("Somebody set up us the bomb") + ); + + // Swap VAAs. + bytes memory tmpEncodedVaa = redeemParams2.encodedVaa; + redeemParams2.encodedVaa = redeemParams1.encodedVaa; + redeemParams1.encodedVaa = tmpEncodedVaa; + + // You shall not pass! + _expectRevert( + abi.encodeCall(circleIntegration.redeemTokensWithPayload, (redeemParams1)), + abi.encodeCall(this.Error, ("invalid message pair")) + ); + } + + function test_RedeemTokensWithPayload(uint256 amount) public { + amount = bound(amount, 1, _cctpMintLimit()); + (uint16 emitterChain, uint32 remoteDomain) = _registerEmitterAndDomain(); + + ICircleIntegration.DepositWithPayload memory expected = ICircleIntegration + .DepositWithPayload({ + token: USDC_ADDRESS.toUniversalAddress(), + amount: amount, + sourceDomain: remoteDomain, + targetDomain: circleIntegration.circleBridge().localMessageTransmitter().localDomain(), + nonce: 2 ** 64 - 1, + fromAddress: 0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef, + mintRecipient: address(this).toUniversalAddress(), + payload: abi.encodePacked("Somebody set up us the bomb") + }); + + ICircleIntegration.RedeemParameters memory redeemParams = circleIntegration + .craftRedeemParameters( + CraftedCctpMessageParams({ + remoteDomain: expected.sourceDomain, + nonce: expected.nonce, + remoteToken: FOREIGN_USDC_ADDRESS, + mintRecipient: expected.mintRecipient, + amount: expected.amount + }), + CraftedVaaParams({emitterChain: emitterChain, sequence: 88}), + expected.fromAddress, // fromAddress + expected.payload + ); + + uint256 balanceBefore = IERC20(USDC_ADDRESS).balanceOf(address(this)); + + ICircleIntegration.DepositWithPayload memory deposit = + circleIntegration.redeemTokensWithPayload(redeemParams); + assertEq( + keccak256(circleIntegration.encodeDepositWithPayload(deposit)), + keccak256(circleIntegration.encodeDepositWithPayload(expected)) + ); + + assertEq(IERC20(USDC_ADDRESS).balanceOf(address(this)), amount + balanceBefore); + } + + function _getUsdcBalance(address owner) internal view returns (uint256 balance) { + balance = IERC20(USDC_ADDRESS).balanceOf(owner); + } + + function _getUsdcBalance() internal view returns (uint256 balance) { + balance = _getUsdcBalance(address(this)); + } + + function _expectRevert(bytes memory encodedCall, bytes memory expectedError) internal { + (bool success, bytes memory response) = + address(circleIntegration).call{value: msg.value}(encodedCall); + assertFalse(success, "call did not revert"); + // console.logBytes(response); + // console.logBytes(expectedError); + + // compare revert strings + assertEq(keccak256(response), keccak256(expectedError), "call did not revert as expected"); + } + + function _dealAndApproveUsdc(uint256 amount) internal { + USDC_ADDRESS.dealAndApprove(address(circleIntegration), amount); + } + + function _cctpBurnLimit() internal returns (uint256 limit) { + limit = circleIntegration.circleBridge().localMinter().burnLimitsPerMessage(USDC_ADDRESS); + + // Having this check prevents us forking a network where Circle has not set a burn limit. + assertGt(limit, 0); + } + + function _cctpMintLimit() internal returns (uint256 limit) { + // This is a hack, assuming the burn limit == mint limit. This really is not the case + // because there is a mint allowance that is enforced by the USDC contract per registered + // minter. We use this out of convenience since inbound transfers can never be greater than + // outbound transfers (which are managed by the burn limit). + return _cctpBurnLimit(); + } + + function _registerEmitterAndDomain() + internal + returns (uint16 foreignChain, uint32 cctpDomain) + { + // Register Avalanche. + foreignChain = 6; + cctpDomain = 1; + + bytes32 foreignEmitter = 0xDeaDbeefdEAdbeefdEadbEEFdeadbeEFdEaDbeeF.toUniversalAddress(); + vm.store( + address(circleIntegration), + keccak256(abi.encode(foreignChain, uint256(6))), + foreignEmitter + ); + vm.store( + address(circleIntegration), + keccak256(abi.encode(foreignChain, uint256(7))), + bytes32(uint256(cctpDomain)) + ); + vm.store( + address(circleIntegration), + keccak256(abi.encode(cctpDomain, uint256(8))), + bytes32(uint256(foreignChain)) + ); + } + + function Error(string memory text) public pure returns (string memory) { + return text; + } +} diff --git a/evm/forge/tests/ForkSlots.t.sol b/evm/forge/tests/ForkSlots.t.sol new file mode 100644 index 0000000..2e5d582 --- /dev/null +++ b/evm/forge/tests/ForkSlots.t.sol @@ -0,0 +1,354 @@ +// SPDX-License-Identifier: Apache 2 +pragma solidity ^0.8.19; + +import "forge-std/Test.sol"; +import "forge-std/console.sol"; + +import {IWormhole} from "src/interfaces/IWormhole.sol"; +import {ICircleIntegration} from "src/interfaces/ICircleIntegration.sol"; + +import {Utils} from "src/libraries/Utils.sol"; + +import {Implementation} from "src/contracts/CircleIntegration/Implementation.sol"; + +import {CircleIntegrationOverride} from "test-helpers/libraries/CircleIntegrationOverride.sol"; +import {SlotCheck} from "test-helpers/libraries/SlotCheck.sol"; +import {WormholeOverride} from "test-helpers/libraries/WormholeOverride.sol"; + +contract ForkSlots is Test { + using CircleIntegrationOverride for *; + using WormholeOverride for *; + using Utils for address; + using SlotCheck for *; + + bytes32 constant GOVERNANCE_MODULE = + 0x000000000000000000000000000000436972636c65496e746567726174696f6e; + + address constant FORKED_CIRCLE_INTEGRATION_ADDRESS = 0x2703483B1a5a7c577e8680de9Df8Be03c6f30e3c; + + ICircleIntegration forked; + address forkedAddress; + + IWormhole wormhole; + + // Expected at slot 0x0. + + uint16 expectedChainId; + uint8 expectedWormholeFinality; + uint32 expectedLocalDomain; + address expectedWormholeAddress; + uint16 expectedGovernanceChainId; + + // Expected at slot 0x1. + bytes32 expectedGovernanceContract; + + // Expected at slot 0x2. + address expectedCircleBridgeAddress; + + // Expected at slot 0x3. + address expectedCircleTransmitterAddress; + + // Expected at slot 0x4. + address expectedCircleTokenMinterAddress; + + // Expected at slot 0xa. + uint256 expectedEvmChain; + + function setUp() public { + forked = ICircleIntegration(FORKED_CIRCLE_INTEGRATION_ADDRESS); + forked.setUpOverride(uint256(vm.envBytes32("TESTING_DEVNET_GUARDIAN"))); + forkedAddress = address(forked); + + wormhole = forked.wormhole(); + + // Set expected values. + expectedChainId = forked.chainId(); + expectedWormholeFinality = forked.wormholeFinality(); + expectedLocalDomain = forked.localDomain(); + expectedWormholeAddress = address(forked.wormhole()); + expectedGovernanceChainId = forked.governanceChainId(); + expectedGovernanceContract = forked.governanceContract(); + expectedCircleBridgeAddress = address(forked.circleBridge()); + expectedCircleTransmitterAddress = address(forked.circleTransmitter()); + expectedCircleTokenMinterAddress = address(forked.circleTokenMinter()); + expectedEvmChain = forked.evmChain(); + } + + function test_UpgradeForkAndCheckSlots() public { + // Deploy new implementation. + Implementation implementation = new Implementation( + address(wormhole), + vm.envAddress("TESTING_CIRCLE_BRIDGE_ADDRESS") // tokenMessenger + ); + + // Should not be initialized yet. + bool isInitialized = forked.isInitialized(address(implementation)); + assertFalse(isInitialized, "already initialized"); + + (IWormhole.VM memory vaa, bytes memory encodedVaa) = wormhole.craftGovernanceVaa( + GOVERNANCE_MODULE, + 3, // action + forked.chainId(), + 69, // sequence + abi.encodePacked(address(implementation).toUniversalAddress()) + ); + + // This VAA should not have been consumed yet. + bool isVaaConsumed = forked.isMessageConsumed(vaa.hash); + assertFalse(isVaaConsumed, "VAA already consumed"); + + // Before upgrading, fetch some expected values. + uint16 expectedRegisteredChainId = 2; + bytes32 expectedEmitter = forked.getRegisteredEmitter(expectedRegisteredChainId); + uint32 expectedCctpDomain = forked.getDomainFromChainId(expectedRegisteredChainId); + + // Check slots before upgrade. + { + bytes32 slotZeroData = vm.load(address(forked), bytes32(0)); + + // If the data is already zeroed, check the remaining zeroed slots. Otherwise check that + // the slots are the expected values from the existing getters. + if (slotZeroData != 0) { + // Now check slots that will be zeroed. + uint256 bitOffset; + + // First 2 bytes is chain ID. + assertEq( + uint16(uint256(slotZeroData >> bitOffset)), + expectedChainId, + "slot 0x0 not equal to expected before upgrade" + ); + bitOffset += 16; + + // Next byte is wormhole finality. + assertEq( + uint8(uint256(slotZeroData >> bitOffset)), + expectedWormholeFinality, + "slot 0x0 not equal to expected before upgrade" + ); + bitOffset += 8; + + // Next 4 bytes is local domain. + assertEq( + uint32(uint256(slotZeroData >> bitOffset)), + expectedLocalDomain, + "slot 0x0 not equal to expected before upgrade" + ); + bitOffset += 32; + + // Next 20 bytes is wormhole address. + assertEq( + address(uint160(uint256(slotZeroData >> bitOffset))), + expectedWormholeAddress, + "slot 0x0 not equal to expected before upgrade" + ); + bitOffset += 160; + + // Next 2 bytes is governance chain ID. + assertEq( + uint16(uint256(slotZeroData >> bitOffset)), + expectedGovernanceChainId, + "slot 0x0 not equal to expected before upgrade" + ); + bitOffset += 16; + + // Remaining bytes are zero. + assertEq( + uint256(slotZeroData >> bitOffset), + 0, + "slot 0x0 not equal to expected before upgrade" + ); + } + if (slotZeroData == 0) { + assertTrue( + forkedAddress.slotValueZero(0x1), + "slot 0x1 not equal to expected before upgrade" + ); + assertTrue( + forkedAddress.slotValueZero(0x2), + "slot 0x2 not equal to expected before upgrade" + ); + assertTrue( + forkedAddress.slotValueZero(0x3), + "slot 0x3 not equal to expected before upgrade" + ); + assertTrue( + forkedAddress.slotValueZero(0x4), + "slot 0x4 not equal to expected before upgrade" + ); + } else { + assertTrue( + forkedAddress.slotValueEquals(0x1, expectedGovernanceContract), + "slot 0x1 not equal to expected before upgrade" + ); + assertTrue( + forkedAddress.slotValueEquals(0x2, expectedCircleBridgeAddress), + "slot 0x2 not equal to expected before upgrade" + ); + assertTrue( + forkedAddress.slotValueEquals(0x3, expectedCircleTransmitterAddress), + "slot 0x3 not equal to expected before upgrade" + ); + assertTrue( + forkedAddress.slotValueEquals(0x4, expectedCircleTokenMinterAddress), + "slot 0x4 not equal to expected before upgrade" + ); + } + assertTrue( + forkedAddress.slotValueEquals( + keccak256(abi.encode(address(implementation), uint256(0x5))), isInitialized + ), + "mapped slot 0x5 not equal to expected before upgrade" + ); + assertTrue( + forkedAddress.slotValueEquals( + keccak256(abi.encode(expectedRegisteredChainId, uint256(0x6))), expectedEmitter + ), + "mapped slot 0x6 not equal to expected before upgrade" + ); + assertTrue( + forkedAddress.slotValueEquals( + keccak256(abi.encode(expectedRegisteredChainId, uint256(0x7))), + expectedCctpDomain + ), + "mapped slot 0x7 not equal to expected before upgrade" + ); + assertTrue( + forkedAddress.slotValueEquals( + keccak256(abi.encode(expectedCctpDomain, uint256(0x8))), + expectedRegisteredChainId + ), + "mapped slot 0x8 not equal to expected before upgrade" + ); + assertTrue( + forkedAddress.slotValueEquals( + keccak256(abi.encode(vaa.hash, uint256(0x9))), isVaaConsumed + ), + "mapped slot 0x9 not equal to expected before upgrade" + ); + if (slotZeroData == 0) { + assertTrue( + forkedAddress.slotValueZero(0xa), + "slot 0xa not equal to expected before upgrade" + ); + } else { + assertTrue( + forkedAddress.slotValueEquals(0xa, expectedEvmChain), + "slot 0xa not equal to expected before upgrade" + ); + } + } + + // Upgrade contract. + forked.upgradeContract(encodedVaa); + + // Now initialized. + isInitialized = forked.isInitialized(address(implementation)); + assertTrue(isInitialized, "implementation not initialized"); + + // VAA now consumed. + isVaaConsumed = forked.isMessageConsumed(vaa.hash); + assertTrue(isVaaConsumed, "VAA not consumed"); + + // Now check all slots that were checked before. + { + assertTrue( + forkedAddress.slotValueZero(bytes32(0)), + "slot 0x0 not equal to expected after upgrade" + ); + assertTrue( + forkedAddress.slotValueZero(0x1), "slot 0x1 not equal to expected after upgrade" + ); + assertTrue( + forkedAddress.slotValueZero(0x2), "slot 0x2 not equal to expected after upgrade" + ); + assertTrue( + forkedAddress.slotValueZero(0x3), "slot 0x3 not equal to expected after upgrade" + ); + assertTrue( + forkedAddress.slotValueZero(0x4), "slot 0x4 not equal to expected after upgrade" + ); + assertTrue( + forkedAddress.slotValueEquals( + keccak256(abi.encode(address(implementation), uint256(0x5))), isInitialized + ), + "mapped slot 0x5 not equal to expected after upgrade" + ); + assertTrue( + forkedAddress.slotValueEquals( + keccak256(abi.encode(expectedRegisteredChainId, uint256(0x6))), expectedEmitter + ), + "mapped slot 0x6 not equal to expected after upgrade" + ); + assertTrue( + forkedAddress.slotValueEquals( + keccak256(abi.encode(expectedRegisteredChainId, uint256(0x7))), + expectedCctpDomain + ), + "mapped slot 0x7 not equal to expected after upgrade" + ); + assertTrue( + forkedAddress.slotValueEquals( + keccak256(abi.encode(expectedCctpDomain, uint256(0x8))), + expectedRegisteredChainId + ), + "mapped slot 0x8 not equal to expected after upgrade" + ); + assertTrue( + forkedAddress.slotValueEquals( + keccak256(abi.encode(vaa.hash, uint256(0x9))), isVaaConsumed + ), + "mapped slot 0x9 not equal to expected after upgrade" + ); + assertTrue( + forkedAddress.slotValueZero(0xa), "slot 0xa not equal to expected after upgrade" + ); + } + + // Make sure getters still retrieve expected values. + assertEq(forked.chainId(), expectedChainId, "chainId not equal to expected after upgrade"); + assertEq( + forked.wormholeFinality(), + expectedWormholeFinality, + "wormholeFinality not equal to expected after upgrade" + ); + assertEq( + forked.localDomain(), + expectedLocalDomain, + "localDomain not equal to expected after upgrade" + ); + assertEq( + address(forked.wormhole()), + expectedWormholeAddress, + "wormholeAddress not equal to expected after upgrade" + ); + assertEq( + forked.governanceChainId(), + expectedGovernanceChainId, + "governanceChainId not equal to expected after upgrade" + ); + assertEq( + forked.governanceContract(), + expectedGovernanceContract, + "governanceContract not equal to expected after upgrade" + ); + assertEq( + address(forked.circleBridge()), + expectedCircleBridgeAddress, + "circleBridgeAddress not equal to expected after upgrade" + ); + assertEq( + address(forked.circleTransmitter()), + expectedCircleTransmitterAddress, + "circleTransmitterAddress not equal to expected after upgrade" + ); + assertEq( + address(forked.circleTokenMinter()), + expectedCircleTokenMinterAddress, + "circleTokenMinterAddress not equal to expected after upgrade" + ); + assertEq( + forked.evmChain(), expectedEvmChain, "evmChain not equal to expected after upgrade" + ); + } +} diff --git a/evm/forge/tests/Governance.t.sol b/evm/forge/tests/Governance.t.sol new file mode 100644 index 0000000..c68afe9 --- /dev/null +++ b/evm/forge/tests/Governance.t.sol @@ -0,0 +1,524 @@ +// SPDX-License-Identifier: Apache 2 +pragma solidity ^0.8.19; + +import "forge-std/Test.sol"; +import "forge-std/console.sol"; + +import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import {ERC1967Proxy} from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol"; + +import {IWormhole} from "src/interfaces/IWormhole.sol"; +import {ICircleIntegration} from "src/interfaces/ICircleIntegration.sol"; + +import {Setup} from "src/contracts/CircleIntegration/Setup.sol"; +import {Implementation} from "src/contracts/CircleIntegration/Implementation.sol"; + +import { + CircleIntegrationOverride, + CraftedCctpMessageParams, + CraftedVaaParams +} from "test-helpers/libraries/CircleIntegrationOverride.sol"; +import {WormholeOverride} from "test-helpers/libraries/WormholeOverride.sol"; + +contract GovernanceTest is Test { + using CircleIntegrationOverride for *; + using WormholeOverride for *; + + bytes32 constant GOVERNANCE_MODULE = + 0x000000000000000000000000000000436972636c65496e746567726174696f6e; + + uint8 constant GOVERNANCE_REGISTER_EMITTER_AND_DOMAIN = 2; + uint8 constant GOVERNANCE_UPGRADE_CONTRACT = 3; + + IWormhole wormhole; + + ICircleIntegration circleIntegration; + + function setupWormhole() public { + wormhole = IWormhole(vm.envAddress("TESTING_WORMHOLE_ADDRESS")); + } + + function setupCircleIntegration() public { + // deploy Setup + Setup setup = new Setup(); + + // deploy Implementation + Implementation implementation = new Implementation( + address(wormhole), + vm.envAddress("TESTING_CIRCLE_BRIDGE_ADDRESS") // tokenMessenger + ); + + // deploy Proxy + ERC1967Proxy proxy = + new ERC1967Proxy(address(setup), abi.encodeCall(setup.setup, address(implementation))); + + circleIntegration = ICircleIntegration(address(proxy)); + + circleIntegration.setUpOverride(uint256(vm.envBytes32("TESTING_DEVNET_GUARDIAN"))); + assertEq(wormhole.guardianPrivateKey(), uint256(vm.envBytes32("TESTING_DEVNET_GUARDIAN"))); + } + + function setUp() public { + setupWormhole(); + setupCircleIntegration(); + } + + function test_CannotConsumeGovernanceMessageInvalidGovernanceChainId( + uint16 governanceChainId, + uint8 action + ) public { + vm.assume(governanceChainId != circleIntegration.governanceChainId()); + + (, bytes memory encodedVaa) = wormhole.craftGovernanceVaa( + governanceChainId, + circleIntegration.governanceContract(), + GOVERNANCE_MODULE, + action, + circleIntegration.chainId(), + 69, // sequence + abi.encodePacked("Mission accomplished.") + ); + + // You shall not pass! + vm.expectRevert("invalid governance chain"); + circleIntegration.verifyGovernanceMessage(encodedVaa, action); + } + + function test_CannotConsumeGovernanceMessageInvalidGovernanceContract( + bytes32 governanceContract, + uint8 action + ) public { + vm.assume(governanceContract != circleIntegration.governanceContract()); + + (, bytes memory encodedVaa) = wormhole.craftGovernanceVaa( + circleIntegration.governanceChainId(), + governanceContract, + GOVERNANCE_MODULE, + action, + circleIntegration.chainId(), + 69, // sequence + abi.encodePacked("Mission accomplished.") + ); + + // You shall not pass! + vm.expectRevert("invalid governance contract"); + circleIntegration.verifyGovernanceMessage(encodedVaa, action); + } + + function test_CannotConsumeGovernanceMessageInvalidModule( + bytes32 governanceModule, + uint8 action + ) public { + vm.assume(governanceModule != GOVERNANCE_MODULE); + + (, bytes memory encodedVaa) = wormhole.craftGovernanceVaa( + governanceModule, + action, + circleIntegration.chainId(), + 69, // sequence + abi.encodePacked("Mission accomplished.") + ); + + // You shall not pass! + vm.expectRevert("invalid governance module"); + circleIntegration.verifyGovernanceMessage(encodedVaa, action); + } + + function test_CannotConsumeGovernanceMessageInvalidAction(uint8 action, uint8 wrongAction) + public + { + vm.assume(action != wrongAction); + + (, bytes memory encodedVaa) = wormhole.craftGovernanceVaa( + GOVERNANCE_MODULE, + action, + circleIntegration.chainId(), + 69, // sequence + abi.encodePacked("Mission accomplished.") + ); + + // You shall not pass! + vm.expectRevert("invalid governance action"); + circleIntegration.verifyGovernanceMessage(encodedVaa, wrongAction); + } + + function test_CannotRegisterEmitterAndDomainInvalidLength( + uint16 foreignChain, + bytes32 foreignEmitter, + uint32 domain + ) public { + vm.assume(foreignChain > 0); + vm.assume(foreignChain != circleIntegration.chainId()); + vm.assume(foreignEmitter != bytes32(0)); + // For the purposes of this test, we will assume the domain set is > 0 + vm.assume(domain > 0); + vm.assume(domain != circleIntegration.localDomain()); + + // No emitters should be registered for this chain. + assertEq( + circleIntegration.getRegisteredEmitter(foreignChain), bytes32(0), "already registered" + ); + assertEq( + circleIntegration.getDomainFromChainId(foreignChain), 0, "domain already registered" + ); + assertEq(circleIntegration.getChainIdFromDomain(domain), 0, "chain already registered"); + + (, bytes memory encodedVaa) = wormhole.craftGovernanceVaa( + GOVERNANCE_MODULE, + GOVERNANCE_REGISTER_EMITTER_AND_DOMAIN, // action + circleIntegration.chainId(), + 69, // sequence + abi.encodePacked(foreignChain, foreignEmitter, domain, "But wait! There's more.") + ); + + // You shall not pass! + vm.expectRevert("invalid governance payload length"); + circleIntegration.registerEmitterAndDomain(encodedVaa); + } + + function test_CannotRegisterEmitterAndDomainInvalidTargetChain( + uint16 targetChain, + uint16 foreignChain, + bytes32 foreignEmitter, + uint32 domain + ) public { + vm.assume(targetChain != circleIntegration.chainId() && targetChain != 0); + vm.assume(foreignChain > 0); + vm.assume(foreignChain != circleIntegration.chainId()); + vm.assume(foreignEmitter != bytes32(0)); + // For the purposes of this test, we will assume the domain set is > 0 + vm.assume(domain > 0); + vm.assume(domain != circleIntegration.localDomain()); + + // No emitters should be registered for this chain. + assertEq( + circleIntegration.getRegisteredEmitter(foreignChain), bytes32(0), "already registered" + ); + assertEq( + circleIntegration.getDomainFromChainId(foreignChain), 0, "domain already registered" + ); + assertEq(circleIntegration.getChainIdFromDomain(domain), 0, "chain already registered"); + + (, bytes memory encodedVaa) = wormhole.craftGovernanceVaa( + GOVERNANCE_MODULE, + GOVERNANCE_REGISTER_EMITTER_AND_DOMAIN, // action + targetChain, + 69, // sequence + abi.encodePacked(foreignChain, foreignEmitter, domain) + ); + + // You shall not pass! + vm.expectRevert("invalid target chain"); + circleIntegration.registerEmitterAndDomain(encodedVaa); + } + + function test_CannotRegisterEmitterAndDomainInvalidForeignChain( + bytes32 foreignEmitter, + uint32 domain + ) public { + vm.assume(foreignEmitter != bytes32(0)); + // For the purposes of this test, we will assume the domain set is > 0 + vm.assume(domain > 0); + vm.assume(domain != circleIntegration.localDomain()); + + // No emitters should be registered for this chain. + + // emitterChain cannot be zero + { + uint16 foreignChain = 0; + assertEq( + circleIntegration.getRegisteredEmitter(foreignChain), + bytes32(0), + "already registered" + ); + assertEq( + circleIntegration.getDomainFromChainId(foreignChain), 0, "domain already registered" + ); + assertEq(circleIntegration.getChainIdFromDomain(domain), 0, "chain already registered"); + + (, bytes memory encodedVaa) = wormhole.craftGovernanceVaa( + GOVERNANCE_MODULE, + GOVERNANCE_REGISTER_EMITTER_AND_DOMAIN, // action + circleIntegration.chainId(), + 69, // sequence + abi.encodePacked(foreignChain, foreignEmitter, domain) + ); + + // You shall not pass! + vm.expectRevert("invalid chain"); + circleIntegration.registerEmitterAndDomain(encodedVaa); + } + + // emitterChain cannot be this chain's + { + uint16 foreignChain = circleIntegration.chainId(); + assertEq( + circleIntegration.getRegisteredEmitter(foreignChain), + bytes32(0), + "already registered" + ); + assertEq( + circleIntegration.getDomainFromChainId(foreignChain), 0, "domain already registered" + ); + assertEq(circleIntegration.getChainIdFromDomain(domain), 0, "chain already registered"); + + (, bytes memory encodedVaa) = wormhole.craftGovernanceVaa( + GOVERNANCE_MODULE, + GOVERNANCE_REGISTER_EMITTER_AND_DOMAIN, // action + circleIntegration.chainId(), + 69, // sequence + abi.encodePacked(foreignChain, foreignEmitter, domain) + ); + + // You shall not pass! + vm.expectRevert("invalid chain"); + circleIntegration.registerEmitterAndDomain(encodedVaa); + } + } + + function test_CannotRegisterEmitterAndDomainInvalidEmitterAddress( + uint16 foreignChain, + uint32 domain + ) public { + vm.assume(foreignChain > 0); + vm.assume(foreignChain != circleIntegration.chainId()); + // For the purposes of this test, we will assume the domain set is > 0 + vm.assume(domain > 0); + vm.assume(domain != circleIntegration.localDomain()); + + // No emitters should be registered for this chain. + assertEq( + circleIntegration.getRegisteredEmitter(foreignChain), bytes32(0), "already registered" + ); + assertEq( + circleIntegration.getDomainFromChainId(foreignChain), 0, "domain already registered" + ); + assertEq(circleIntegration.getChainIdFromDomain(domain), 0, "chain already registered"); + + (, bytes memory encodedVaa) = wormhole.craftGovernanceVaa( + GOVERNANCE_MODULE, + GOVERNANCE_REGISTER_EMITTER_AND_DOMAIN, // action + circleIntegration.chainId(), + 69, // sequence + abi.encodePacked( + foreignChain, + bytes32(0), // emitterAddress + domain + ) + ); + + // You shall not pass! + vm.expectRevert("emitter cannot be zero address"); + circleIntegration.registerEmitterAndDomain(encodedVaa); + } + + function test_CannotRegisterEmitterAndDomainInvalidDomain( + uint16 foreignChain, + bytes32 foreignEmitter + ) public { + vm.assume(foreignChain > 0); + vm.assume(foreignChain != circleIntegration.chainId()); + vm.assume(foreignEmitter != bytes32(0)); + + // No emitters should be registered for this chain. + assertEq( + circleIntegration.getRegisteredEmitter(foreignChain), bytes32(0), "already registered" + ); + assertEq( + circleIntegration.getDomainFromChainId(foreignChain), 0, "domain already registered" + ); + + { + uint32 domain = circleIntegration.localDomain(); + assertEq(circleIntegration.getChainIdFromDomain(domain), 0, "chain already registered"); + + (, bytes memory encodedVaa) = wormhole.craftGovernanceVaa( + GOVERNANCE_MODULE, + GOVERNANCE_REGISTER_EMITTER_AND_DOMAIN, // action + circleIntegration.chainId(), + 69, // sequence + abi.encodePacked(foreignChain, foreignEmitter, domain) + ); + + // You shall not pass! + vm.expectRevert("domain == localDomain()"); + circleIntegration.registerEmitterAndDomain(encodedVaa); + } + } + + function test_RegisterEmitterAndDomainNoTarget() public { + uint16 foreignChain = 42069; + bytes32 foreignEmitter = + bytes32(uint256(uint160(vm.envAddress("TESTING_FOREIGN_USDC_TOKEN_ADDRESS")))); + uint32 domain = 69420; + + // No emitters should be registered for this chain. + assertEq( + circleIntegration.getRegisteredEmitter(foreignChain), bytes32(0), "already registered" + ); + assertEq( + circleIntegration.getDomainFromChainId(foreignChain), 0, "domain already registered" + ); + assertEq(circleIntegration.getChainIdFromDomain(domain), 0, "chain already registered"); + + (, bytes memory encodedVaa) = wormhole.craftGovernanceVaa( + GOVERNANCE_MODULE, + GOVERNANCE_REGISTER_EMITTER_AND_DOMAIN, // action + 0, // targetChain + 69, // sequence + abi.encodePacked(foreignChain, foreignEmitter, domain) + ); + + // Register emitter and domain. + circleIntegration.registerEmitterAndDomain(encodedVaa); + + assertEq( + circleIntegration.getRegisteredEmitter(foreignChain), + foreignEmitter, + "wrong foreignEmitter" + ); + assertEq(circleIntegration.getDomainFromChainId(foreignChain), domain, "wrong domain"); + assertEq(circleIntegration.getChainIdFromDomain(domain), foreignChain, "wrong chain"); + } + + function test_RegisterEmitterAndDomain( + uint16 foreignChain, + bytes32 foreignEmitter, + uint32 domain + ) public { + vm.assume(foreignChain > 0); + vm.assume(foreignChain != circleIntegration.chainId()); + vm.assume(foreignEmitter != bytes32(0)); + // For the purposes of this test, we will assume the domain set is > 0 + vm.assume(domain > 0); + vm.assume(domain != circleIntegration.localDomain()); + + // No emitters should be registered for this chain. + assertEq( + circleIntegration.getRegisteredEmitter(foreignChain), bytes32(0), "already registered" + ); + assertEq( + circleIntegration.getDomainFromChainId(foreignChain), 0, "domain already registered" + ); + assertEq(circleIntegration.getChainIdFromDomain(domain), 0, "chain already registered"); + + (, bytes memory encodedVaa) = wormhole.craftGovernanceVaa( + GOVERNANCE_MODULE, + GOVERNANCE_REGISTER_EMITTER_AND_DOMAIN, // action + circleIntegration.chainId(), + 69, // sequence + abi.encodePacked(foreignChain, foreignEmitter, domain) + ); + + // Register emitter and domain. + circleIntegration.registerEmitterAndDomain(encodedVaa); + + assertEq( + circleIntegration.getRegisteredEmitter(foreignChain), + foreignEmitter, + "wrong foreignEmitter" + ); + assertEq(circleIntegration.getDomainFromChainId(foreignChain), domain, "wrong domain"); + assertEq(circleIntegration.getChainIdFromDomain(domain), foreignChain, "wrong chain"); + + // we cannot register for this chain again + { + (, bytes memory anotherEncodedVaa) = wormhole.craftGovernanceVaa( + GOVERNANCE_MODULE, + GOVERNANCE_REGISTER_EMITTER_AND_DOMAIN, // action + circleIntegration.chainId(), + 70, // sequence + abi.encodePacked(foreignChain, foreignEmitter, domain) + ); + + // You shall not pass! + vm.expectRevert("chain already registered"); + circleIntegration.registerEmitterAndDomain(anotherEncodedVaa); + } + } + + function test_CannotUpgradeContractInvalidImplementation( + bytes12 garbage, + address newImplementation + ) public { + vm.assume(garbage != bytes12(0)); + vm.assume( + newImplementation != address(0) && !circleIntegration.isInitialized(newImplementation) + ); + + // First attempt to submit garbage implementation + { + (, bytes memory encodedVaa) = wormhole.craftGovernanceVaa( + GOVERNANCE_MODULE, + GOVERNANCE_UPGRADE_CONTRACT, // action + circleIntegration.chainId(), + 69, // sequence + abi.encodePacked(garbage, newImplementation) + ); + + // You shall not pass! + vm.expectRevert("invalid address"); + circleIntegration.upgradeContract(encodedVaa); + } + + // Now use legitimate-looking ERC20 address + { + (, bytes memory encodedVaa) = wormhole.craftGovernanceVaa( + GOVERNANCE_MODULE, + GOVERNANCE_UPGRADE_CONTRACT, // action + circleIntegration.chainId(), + 69, // sequence + abi.encodePacked(bytes12(0), newImplementation) + ); + + // You shall not pass! + vm.expectRevert("invalid implementation"); + circleIntegration.upgradeContract(encodedVaa); + } + + // Now use one of Wormhole's implementations + { + address wormholeImplementation = 0x46DB25598441915D59df8955DD2E4256bC3c6e95; + + (, bytes memory encodedVaa) = wormhole.craftGovernanceVaa( + GOVERNANCE_MODULE, + GOVERNANCE_UPGRADE_CONTRACT, // action + circleIntegration.chainId(), + 69, // sequence + abi.encodePacked(bytes12(0), wormholeImplementation) + ); + + // You shall not pass! + vm.expectRevert("invalid implementation"); + circleIntegration.upgradeContract(encodedVaa); + } + } + + function test_UpgradeContract() public { + // Deploy new implementation. + Implementation implementation = new Implementation( + address(wormhole), + vm.envAddress("TESTING_CIRCLE_BRIDGE_ADDRESS") // tokenMessenger + ); + + // Should not be initialized yet. + assertFalse(circleIntegration.isInitialized(address(implementation)), "already initialized"); + + (, bytes memory encodedVaa) = wormhole.craftGovernanceVaa( + GOVERNANCE_MODULE, + GOVERNANCE_UPGRADE_CONTRACT, // action + circleIntegration.chainId(), + 69, // sequence + abi.encodePacked(bytes12(0), address(implementation)) + ); + + // Upgrade contract. + circleIntegration.upgradeContract(encodedVaa); + + // Should not be initialized yet. + assertTrue( + circleIntegration.isInitialized(address(implementation)), + "implementation not initialized" + ); + } +} diff --git a/evm/forge/tests/InheritingWormholeCctp.t.sol b/evm/forge/tests/InheritingWormholeCctp.t.sol new file mode 100644 index 0000000..1947dfb --- /dev/null +++ b/evm/forge/tests/InheritingWormholeCctp.t.sol @@ -0,0 +1,199 @@ +// SPDX-License-Identifier: Apache 2 +pragma solidity ^0.8.19; + +import "forge-std/Test.sol"; +import "forge-std/console.sol"; + +import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import {ERC1967Proxy} from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol"; + +import {ICircleIntegration} from "src/interfaces/ICircleIntegration.sol"; +import {IWormhole} from "src/interfaces/IWormhole.sol"; + +import {Utils} from "src/libraries/Utils.sol"; +import {WormholeCctpMessages} from "src/libraries/WormholeCctpMessages.sol"; + +import {Setup} from "src/contracts/CircleIntegration/Setup.sol"; +import {Implementation} from "src/contracts/CircleIntegration/Implementation.sol"; + +import {InheritingWormholeCctp} from "./integrations/InheritingWormholeCctp.sol"; + +import { + CircleIntegrationOverride, + CctpMessage, + CraftedCctpMessageParams, + CraftedVaaParams +} from "test-helpers/libraries/CircleIntegrationOverride.sol"; +import {UsdcDeal} from "test-helpers/libraries/UsdcDeal.sol"; +import {WormholeOverride} from "test-helpers/libraries/WormholeOverride.sol"; + +contract InheritingWormholeCctpTest is Test { + using Utils for *; + using WormholeCctpMessages for *; + using CircleIntegrationOverride for *; + using WormholeOverride for *; + using UsdcDeal for address; + + address immutable USDC_ADDRESS = vm.envAddress("TESTING_USDC_TOKEN_ADDRESS"); + bytes32 immutable FOREIGN_USDC_ADDRESS = + bytes32(uint256(uint160(vm.envAddress("TESTING_FOREIGN_USDC_TOKEN_ADDRESS")))); + + // dependencies + IWormhole wormhole; + + // Not a dependency, but using the override as a convenience. + ICircleIntegration circleIntegration; + + InheritingWormholeCctp inheritedContract; + + function setupWormhole() public { + wormhole = IWormhole(vm.envAddress("TESTING_WORMHOLE_ADDRESS")); + } + + function setupUSDC() public { + (, bytes memory queriedDecimals) = + USDC_ADDRESS.staticcall(abi.encodeWithSignature("decimals()")); + uint8 decimals = abi.decode(queriedDecimals, (uint8)); + assertEq(decimals, 6, "wrong USDC"); + } + + function setupCircleIntegration() public { + // deploy Setup + Setup setup = new Setup(); + + // deploy Implementation + Implementation implementation = new Implementation( + address(wormhole), + vm.envAddress("TESTING_CIRCLE_BRIDGE_ADDRESS") // tokenMessenger + ); + + // deploy Proxy + ERC1967Proxy proxy = + new ERC1967Proxy(address(setup), abi.encodeCall(setup.setup, address(implementation))); + + circleIntegration = ICircleIntegration(address(proxy)); + + circleIntegration.setUpOverride(uint256(vm.envBytes32("TESTING_DEVNET_GUARDIAN"))); + assertEq(wormhole.guardianPrivateKey(), uint256(vm.envBytes32("TESTING_DEVNET_GUARDIAN"))); + } + + function setUp() public { + setupUSDC(); + setupWormhole(); + setupCircleIntegration(); + + // set up the inheriting contract + inheritedContract = new InheritingWormholeCctp( + address(wormhole), + address(circleIntegration.circleBridge()), // tokenMessenger + USDC_ADDRESS + ); + } + + function test_TransferUsdc(uint256 amount, bytes32 mintRecipient) public { + amount = bound(amount, 1, _cctpBurnLimit()); + vm.assume(mintRecipient != bytes32(0)); + + bytes memory payload = abi.encodePacked("All your base are belong to us"); + + _dealAndApproveUsdc(amount); + + uint256 balanceBefore = IERC20(USDC_ADDRESS).balanceOf(address(this)); + + vm.recordLogs(); + uint64 wormholeSequence = inheritedContract.transferUsdc(amount, mintRecipient, payload); + assertEq(wormholeSequence, 0); + + Vm.Log[] memory logs = vm.getRecordedLogs(); + + bytes[] memory fetchedPayloads = logs.fetchWormholePublishedPayloads(); + assertEq(fetchedPayloads.length, 1); + assertEq( + keccak256(fetchedPayloads[0]), + keccak256( + USDC_ADDRESS.encodeDeposit( + amount, + 7, // sourceCctpDomain + inheritedContract.myBffDomain(), // targetCctpDomain + circleIntegration.circleBridge().localMessageTransmitter().nextAvailableNonce() + - 1, + address(this).toUniversalAddress(), + mintRecipient, + payload + ) + ) + ); + + CctpMessage[] memory fetchedCctpMessages = logs.fetchCctpMessages(); + assertEq(fetchedCctpMessages.length, 1); + assertEq(fetchedCctpMessages[0].header.destinationCaller, inheritedContract.myBffAddr()); + + assertEq(IERC20(USDC_ADDRESS).balanceOf(address(this)) + amount, balanceBefore); + } + + function _getUsdcBalance(address owner) internal view returns (uint256 balance) { + balance = IERC20(USDC_ADDRESS).balanceOf(owner); + } + + function _getUsdcBalance() internal view returns (uint256 balance) { + balance = _getUsdcBalance(address(this)); + } + + function _expectRevert(bytes memory encodedCall, bytes memory expectedError) internal { + (bool success, bytes memory response) = + address(circleIntegration).call{value: msg.value}(encodedCall); + assertFalse(success, "call did not revert"); + + // compare revert strings + assertEq(keccak256(response), keccak256(expectedError), "call did not revert as expected"); + } + + function _dealAndApproveUsdc(uint256 amount) internal { + USDC_ADDRESS.dealAndApprove(address(inheritedContract), amount); + } + + function _cctpBurnLimit() internal returns (uint256 limit) { + limit = circleIntegration.circleBridge().localMinter().burnLimitsPerMessage(USDC_ADDRESS); + + // Having this check prevents us forking a network where Circle has not set a burn limit. + assertGt(limit, 0); + } + + function _cctpMintLimit() internal returns (uint256 limit) { + // This is a hack, assuming the burn limit == mint limit. This really is not the case + // because there is a mint allowance that is enforced by the USDC contract per registered + // minter. We use this out of convenience since inbound transfers can never be greater than + // outbound transfers (which are managed by the burn limit). + return _cctpBurnLimit(); + } + + function _registerEmitterAndDomain() + internal + returns (uint16 foreignChain, uint32 cctpDomain) + { + // Register Avalanche. + foreignChain = 6; + bytes32 foreignEmitter = 0xDeaDbeefdEAdbeefdEadbEEFdeadbeEFdEaDbeeF.toUniversalAddress(); + cctpDomain = 1; + + vm.store( + address(circleIntegration), + keccak256(abi.encode(foreignChain, uint256(6))), + foreignEmitter + ); + vm.store( + address(circleIntegration), + keccak256(abi.encode(foreignChain, uint256(7))), + bytes32(uint256(cctpDomain)) + ); + vm.store( + address(circleIntegration), + keccak256(abi.encode(cctpDomain, uint256(8))), + bytes32(uint256(foreignChain)) + ); + } + + function Error(string memory text) public pure returns (string memory) { + return text; + } +} diff --git a/evm/forge/tests/WormholeCctpMessages.t.sol b/evm/forge/tests/WormholeCctpMessages.t.sol new file mode 100644 index 0000000..f74ea3c --- /dev/null +++ b/evm/forge/tests/WormholeCctpMessages.t.sol @@ -0,0 +1,74 @@ +// SPDX-License-Identifier: Apache 2 + +pragma solidity ^0.8.19; + +import "forge-std/Test.sol"; +import "forge-std/console.sol"; + +import {IWormhole} from "src/interfaces/IWormhole.sol"; + +import {WormholeCctpMessages} from "src/libraries/WormholeCctpMessages.sol"; + +contract MessagesTest is Test { + using WormholeCctpMessages for *; + + function test_DepositWithPayloadSerde( + bytes32 token, + uint256 amount, + uint32 sourceCctpDomain, + uint32 targetCctpDomain, + uint64 cctpNonce, + bytes32 burnSource, + bytes32 mintRecipient, + bytes memory payload + ) public { + vm.assume(targetCctpDomain != sourceCctpDomain); + vm.assume(payload.length > 0); + vm.assume(payload.length < type(uint16).max); + + IWormhole.VM memory fakeVaa; + fakeVaa.payload = token.encodeDeposit( + amount, + sourceCctpDomain, + targetCctpDomain, + cctpNonce, + burnSource, + mintRecipient, + payload + ); + + // NOTE: 147 is the encoded message length up to the actual payload (including payload ID). + assertEq(fakeVaa.payload.length, 147 + payload.length); + + uint8 payloadId = uint8(bytes1(fakeVaa.payload)); + assertEq(payloadId, 1); + + bytes32 decodedToken; + uint256 decodedAmount; + uint32 decodedSourceCctpDomain; + uint32 decodedTargetCctpDomain; + uint64 decodedCctpNonce; + bytes32 decodedBurnSource; + bytes32 decodedMintRecipient; + bytes memory takenPayload; + ( + decodedToken, + decodedAmount, + decodedSourceCctpDomain, + decodedTargetCctpDomain, + decodedCctpNonce, + decodedBurnSource, + decodedMintRecipient, + takenPayload + ) = fakeVaa.decodeDeposit(); + + assertEq(decodedToken, token); + assertEq(decodedAmount, amount); + assertEq(decodedSourceCctpDomain, sourceCctpDomain); + assertEq(decodedTargetCctpDomain, targetCctpDomain); + assertEq(decodedCctpNonce, cctpNonce); + assertEq(decodedBurnSource, burnSource); + assertEq(decodedMintRecipient, mintRecipient); + assertEq(keccak256(abi.encode(takenPayload)), keccak256(abi.encode(payload))); + } +} diff --git a/evm/forge/tests/gas/CircleIntegrationComparison.t.sol b/evm/forge/tests/gas/CircleIntegrationComparison.t.sol new file mode 100644 index 0000000..68d78ce --- /dev/null +++ b/evm/forge/tests/gas/CircleIntegrationComparison.t.sol @@ -0,0 +1,434 @@ +// SPDX-License-Identifier: Apache 2 +pragma solidity ^0.8.19; + +import "forge-std/Test.sol"; +import "forge-std/console.sol"; + +import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import {ERC1967Proxy} from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol"; + +import {IWormhole} from "src/interfaces/IWormhole.sol"; +import {ICircleIntegration} from "src/interfaces/ICircleIntegration.sol"; + +import {Utils} from "src/libraries/Utils.sol"; +import {WormholeCctpMessages} from "src/libraries/WormholeCctpMessages.sol"; + +import {Setup} from "src/contracts/CircleIntegration/Setup.sol"; +import {Implementation} from "src/contracts/CircleIntegration/Implementation.sol"; + +import {ComposingWithCircleIntegration} from "../integrations/ComposingWithCircleIntegration.sol"; +import {InheritingWormholeCctp} from "../integrations/InheritingWormholeCctp.sol"; + +import { + CircleIntegrationOverride, + CraftedCctpMessageParams, + CraftedVaaParams +} from "test-helpers/libraries/CircleIntegrationOverride.sol"; +import {UsdcDeal} from "test-helpers/libraries/UsdcDeal.sol"; +import {WormholeOverride} from "test-helpers/libraries/WormholeOverride.sol"; + +contract CircleIntegrationComparison is Test { + using Utils for *; + using WormholeCctpMessages for *; + using CircleIntegrationOverride for *; + using WormholeOverride for *; + using UsdcDeal for address; + + address immutable USDC_ADDRESS = vm.envAddress("TESTING_USDC_TOKEN_ADDRESS"); + bytes32 immutable FOREIGN_USDC_ADDRESS = + bytes32(uint256(uint160(vm.envAddress("TESTING_FOREIGN_USDC_TOKEN_ADDRESS")))); + + address constant FORKED_CIRCLE_INTEGRATION_ADDRESS = 0x2703483B1a5a7c577e8680de9Df8Be03c6f30e3c; + + // dependencies + IWormhole wormhole; + + ICircleIntegration circleIntegration; + ICircleIntegration forkedCircleIntegration; + + ComposingWithCircleIntegration composedContract; + InheritingWormholeCctp inheritedContract; + + function setupWormhole() public { + wormhole = IWormhole(vm.envAddress("TESTING_WORMHOLE_ADDRESS")); + } + + function setupUSDC() public { + (, bytes memory queriedDecimals) = + USDC_ADDRESS.staticcall(abi.encodeWithSignature("decimals()")); + uint8 decimals = abi.decode(queriedDecimals, (uint8)); + assertEq(decimals, 6, "wrong USDC"); + } + + function setupCircleIntegration() public { + // deploy Setup + Setup setup = new Setup(); + + // deploy Implementation + Implementation implementation = new Implementation( + address(wormhole), + vm.envAddress("TESTING_CIRCLE_BRIDGE_ADDRESS") // tokenMessenger + ); + + // deploy Proxy + ERC1967Proxy proxy = + new ERC1967Proxy(address(setup), abi.encodeCall(setup.setup, address(implementation))); + + circleIntegration = ICircleIntegration(address(proxy)); + circleIntegration.setUpOverride(uint256(vm.envBytes32("TESTING_DEVNET_GUARDIAN"))); + + forkedCircleIntegration = ICircleIntegration(FORKED_CIRCLE_INTEGRATION_ADDRESS); + } + + function setUp() public { + setupUSDC(); + setupWormhole(); + setupCircleIntegration(); + + composedContract = + new ComposingWithCircleIntegration(address(circleIntegration), USDC_ADDRESS); + + inheritedContract = new InheritingWormholeCctp( + address(wormhole), + address(circleIntegration.circleBridge()), // tokenMessenger + USDC_ADDRESS + ); + } + + function test_Inherited__TransferUsdc(uint256 amount, bytes32 mintRecipient, bytes32 data) + public + { + amount = bound(amount, 1, _cctpBurnLimit()); + vm.assume(mintRecipient != bytes32(0)); + vm.assume(data != bytes32(0)); + + (uint16 targetChain,) = _registerEmitterAndDomain(circleIntegration); + bytes memory payload = _generatePayload512(data); + + _dealAndApproveUsdc(amount, inheritedContract); + + inheritedContract.transferUsdc(amount, mintRecipient, payload); + + // This is here to avoid the unused variable warning. + targetChain; + } + + function test_Composed__TransferUsdc(uint256 amount, bytes32 mintRecipient, bytes32 data) + public + { + amount = bound(amount, 1, _cctpBurnLimit()); + vm.assume(mintRecipient != bytes32(0)); + vm.assume(data != bytes32(0)); + + (uint16 targetChain,) = _registerEmitterAndDomain(circleIntegration); + bytes memory payload = _generatePayload512(data); + + _dealAndApproveUsdc(amount, composedContract); + + composedContract.transferUsdc(targetChain, amount, mintRecipient, payload); + } + + function test_Latest__TransferTokensWithPayload( + uint256 amount, + bytes32 mintRecipient, + bytes32 data + ) public { + amount = bound(amount, 1, _cctpBurnLimit()); + vm.assume(mintRecipient != bytes32(0)); + vm.assume(data != bytes32(0)); + + (uint16 targetChain,) = _registerEmitterAndDomain(circleIntegration); + bytes memory payload = _generatePayload512(data); + + _dealAndApproveUsdc(amount, circleIntegration); + + circleIntegration.transferTokensWithPayload( + ICircleIntegration.TransferParameters({ + token: USDC_ADDRESS, + amount: amount, + targetChain: targetChain, + mintRecipient: mintRecipient + }), + 420, // wormholeNonce + payload + ); + } + + function test_Fork__TransferTokensWithPayload( + uint256 amount, + bytes32 mintRecipient, + bytes32 data + ) public { + amount = bound(amount, 1, _cctpBurnLimit()); + vm.assume(mintRecipient != bytes32(0)); + vm.assume(data != bytes32(0)); + + (uint16 targetChain,) = _registerEmitterAndDomain(forkedCircleIntegration); + bytes memory payload = _generatePayload512(data); + + _dealAndApproveUsdc(amount, forkedCircleIntegration); + + forkedCircleIntegration.transferTokensWithPayload( + ICircleIntegration.TransferParameters({ + token: USDC_ADDRESS, + amount: amount, + targetChain: targetChain, + mintRecipient: mintRecipient + }), + 420, // wormholeNonce + payload + ); + } + + function test_Control__TransferTokensWithPayload( + uint256 amount, + bytes32 mintRecipient, + bytes32 data + ) public { + amount = bound(amount, 1, _cctpBurnLimit()); + vm.assume(mintRecipient != bytes32(0)); + vm.assume(data != bytes32(0)); + + (uint16 targetChain,) = _registerEmitterAndDomain(forkedCircleIntegration); + bytes memory payload = _generatePayload512(data); + + _dealAndApproveUsdc(amount, circleIntegration); + + // This is here to avoid the unused variable warning. + mintRecipient; + targetChain; + payload; + } + + function test_Inherited__RedeemUsdc(uint256 amount, bytes32 fromAddress, bytes32 data) public { + amount = bound(amount, 1, _cctpMintLimit()); + vm.assume(fromAddress != bytes32(0)); + vm.assume(data != bytes32(0)); + + (uint16 emitterChain, uint32 remoteDomain) = _registerEmitterAndDomain(circleIntegration); + + ICircleIntegration.RedeemParameters memory redeemParams = circleIntegration + .craftRedeemParameters( + CraftedCctpMessageParams({ + remoteDomain: remoteDomain, + nonce: 2 ** 64 - 1, + remoteToken: FOREIGN_USDC_ADDRESS, + mintRecipient: address(this).toUniversalAddress(), + amount: amount + }), + CraftedVaaParams({emitterChain: emitterChain, sequence: 88}), + fromAddress, + _generatePayload512(data), // payload + circleIntegration.getRegisteredEmitter( + circleIntegration.getChainIdFromDomain(remoteDomain) + ), // messageSender + address(inheritedContract).toUniversalAddress() // destinationCaller + ); + + inheritedContract.redeemUsdc( + redeemParams.encodedCctpMessage, redeemParams.cctpAttestation, redeemParams.encodedVaa + ); + } + + function test_Composed__RedeemUsdc(uint256 amount, bytes32 fromAddress, bytes32 data) public { + amount = bound(amount, 1, _cctpMintLimit()); + vm.assume(fromAddress != bytes32(0)); + vm.assume(data != bytes32(0)); + + (uint16 emitterChain, uint32 remoteDomain) = _registerEmitterAndDomain(circleIntegration); + + ICircleIntegration.RedeemParameters memory redeemParams = circleIntegration + .craftRedeemParameters( + CraftedCctpMessageParams({ + remoteDomain: remoteDomain, + nonce: 2 ** 64 - 1, + remoteToken: FOREIGN_USDC_ADDRESS, + mintRecipient: address(composedContract).toUniversalAddress(), + amount: amount + }), + CraftedVaaParams({emitterChain: emitterChain, sequence: 88}), + fromAddress, + _generatePayload512(data) // payload + ); + + composedContract.redeemUsdc(redeemParams); + } + + function test_Latest__RedeemTokensWithPayload(uint256 amount, bytes32 fromAddress, bytes32 data) + public + { + amount = bound(amount, 1, _cctpMintLimit()); + vm.assume(fromAddress != bytes32(0)); + vm.assume(data != bytes32(0)); + + (uint16 emitterChain, uint32 remoteDomain) = _registerEmitterAndDomain(circleIntegration); + + ICircleIntegration.RedeemParameters memory redeemParams = circleIntegration + .craftRedeemParameters( + CraftedCctpMessageParams({ + remoteDomain: remoteDomain, + nonce: 2 ** 64 - 1, + remoteToken: FOREIGN_USDC_ADDRESS, + mintRecipient: address(this).toUniversalAddress(), + amount: amount + }), + CraftedVaaParams({emitterChain: emitterChain, sequence: 88}), + fromAddress, + _generatePayload512(data) // payload + ); + + circleIntegration.redeemTokensWithPayload(redeemParams); + } + + function test_Fork__RedeemTokensWithPayload(uint256 amount, bytes32 fromAddress, bytes32 data) + public + { + amount = bound(amount, 1, _cctpMintLimit()); + vm.assume(fromAddress != bytes32(0)); + vm.assume(data != bytes32(0)); + + (uint16 emitterChain, uint32 remoteDomain) = + _registerEmitterAndDomain(forkedCircleIntegration); + + ICircleIntegration.RedeemParameters memory redeemParams = forkedCircleIntegration + .craftRedeemParameters( + CraftedCctpMessageParams({ + remoteDomain: remoteDomain, + nonce: 2 ** 64 - 1, + remoteToken: FOREIGN_USDC_ADDRESS, + mintRecipient: address(this).toUniversalAddress(), + amount: amount + }), + CraftedVaaParams({emitterChain: emitterChain, sequence: 88}), + fromAddress, + _generatePayload512(data) // payload + ); + + forkedCircleIntegration.redeemTokensWithPayload(redeemParams); + } + + function test_Control__RedeemTokensWithPayload( + uint256 amount, + bytes32 fromAddress, + bytes32 data + ) public { + amount = bound(amount, 1, _cctpMintLimit()); + vm.assume(fromAddress != bytes32(0)); + vm.assume(data != bytes32(0)); + + (uint16 emitterChain, uint32 remoteDomain) = + _registerEmitterAndDomain(forkedCircleIntegration); + + ICircleIntegration.RedeemParameters memory redeemParams = forkedCircleIntegration + .craftRedeemParameters( + CraftedCctpMessageParams({ + remoteDomain: remoteDomain, + nonce: 2 ** 64 - 1, + remoteToken: FOREIGN_USDC_ADDRESS, + mintRecipient: address(this).toUniversalAddress(), + amount: amount + }), + CraftedVaaParams({emitterChain: emitterChain, sequence: 88}), + fromAddress, + _generatePayload512(data) // payload + ); + + // This is here to avoid the unused variable warning. + redeemParams; + } + + function _getUsdcBalance(address owner) internal view returns (uint256 balance) { + balance = IERC20(USDC_ADDRESS).balanceOf(owner); + } + + function _getUsdcBalance() internal view returns (uint256 balance) { + balance = _getUsdcBalance(address(this)); + } + + function _expectRevert(bytes memory encodedCall, bytes memory expectedError) internal { + (bool success, bytes memory response) = + address(circleIntegration).call{value: msg.value}(encodedCall); + assertFalse(success, "call did not revert"); + + // compare revert strings + assertEq(keccak256(response), keccak256(expectedError), "call did not revert as expected"); + } + + function _dealAndApproveUsdc(uint256 amount, ICircleIntegration integration) internal { + USDC_ADDRESS.dealAndApprove(address(integration), amount); + } + + function _dealAndApproveUsdc(uint256 amount, ComposingWithCircleIntegration integration) + internal + { + USDC_ADDRESS.dealAndApprove(address(integration), amount); + } + + function _dealAndApproveUsdc(uint256 amount, InheritingWormholeCctp integration) internal { + USDC_ADDRESS.dealAndApprove(address(integration), amount); + } + + function _cctpBurnLimit() internal returns (uint256 limit) { + limit = circleIntegration.circleBridge().localMinter().burnLimitsPerMessage(USDC_ADDRESS); + + // Having this check prevents us forking a network where Circle has not set a burn limit. + assertGt(limit, 0); + } + + function _cctpMintLimit() internal returns (uint256 limit) { + // This is a hack, assuming the burn limit == mint limit. This really is not the case + // because there is a mint allowance that is enforced by the USDC contract per registered + // minter. We use this out of convenience since inbound transfers can never be greater than + // outbound transfers (which are managed by the burn limit). + return _cctpBurnLimit(); + } + + function _registerEmitterAndDomain(ICircleIntegration integration) + internal + returns (uint16 foreignChain, uint32 cctpDomain) + { + // Register Avalanche. + foreignChain = 6; + bytes32 foreignEmitter = 0xDeaDbeefdEAdbeefdEadbEEFdeadbeEFdEaDbeeF.toUniversalAddress(); + cctpDomain = 1; + + vm.store( + address(integration), keccak256(abi.encode(foreignChain, uint256(6))), foreignEmitter + ); + vm.store( + address(integration), + keccak256(abi.encode(foreignChain, uint256(7))), + bytes32(uint256(cctpDomain)) + ); + vm.store( + address(integration), + keccak256(abi.encode(cctpDomain, uint256(8))), + bytes32(uint256(foreignChain)) + ); + } + + function _generatePayload512(bytes32 data) internal pure returns (bytes memory payload) { + payload = abi.encode( + data, + data, + data, + data, + data, + data, + data, + data, + data, + data, + data, + data, + data, + data, + data, + data + ); + } + + function Error(string memory text) public pure returns (string memory) { + return text; + } +} diff --git a/evm/src/interfaces/circle/IUSDC.sol b/evm/forge/tests/helpers/IUSDC.sol similarity index 98% rename from evm/src/interfaces/circle/IUSDC.sol rename to evm/forge/tests/helpers/IUSDC.sol index 4712ce5..b2eec0d 100644 --- a/evm/src/interfaces/circle/IUSDC.sol +++ b/evm/forge/tests/helpers/IUSDC.sol @@ -3,16 +3,25 @@ pragma solidity ^0.8.19; interface IUSDC { function mint(address to, uint256 amount) external; + function configureMinter(address minter, uint256 minterAllowedAmount) external; + function masterMinter() external view returns (address); + function owner() external view returns (address); + function blacklister() external view returns (address); // IERC20 function totalSupply() external view returns (uint256); + function balanceOf(address account) external view returns (uint256); + function transfer(address to, uint256 amount) external returns (bool); + function allowance(address owner, address spender) external view returns (uint256); + function approve(address spender, uint256 amount) external returns (bool); + function transferFrom(address from, address to, uint256 amount) external returns (bool); } diff --git a/evm/forge/tests/helpers/libraries/CircleIntegrationOverride.sol b/evm/forge/tests/helpers/libraries/CircleIntegrationOverride.sol new file mode 100644 index 0000000..4611848 --- /dev/null +++ b/evm/forge/tests/helpers/libraries/CircleIntegrationOverride.sol @@ -0,0 +1,399 @@ +// SPDX-License-Identifier: Apache 2 +pragma solidity ^0.8.19; + +import {ICircleIntegration} from "src/interfaces/ICircleIntegration.sol"; +import {IMessageTransmitter} from "src/interfaces/IMessageTransmitter.sol"; +import {IWormhole} from "src/interfaces/IWormhole.sol"; + +import {BytesParsing} from "src/libraries/BytesParsing.sol"; +import {Utils} from "src/libraries/Utils.sol"; +import {WormholeCctpMessages} from "src/libraries/WormholeCctpMessages.sol"; + +import "forge-std/Test.sol"; +import "forge-std/console.sol"; +import {Vm} from "forge-std/Vm.sol"; + +import {WormholeOverride} from "./WormholeOverride.sol"; + +struct CctpHeader { + uint32 version; + uint32 sourceDomain; + uint32 destinationDomain; + uint64 nonce; + bytes32 sender; + bytes32 recipient; + bytes32 destinationCaller; +} + +struct CctpMessage { + CctpHeader header; + bytes payload; +} + +struct CctpTokenBurnMessage { + CctpHeader header; + uint32 version; + bytes32 burnToken; + bytes32 mintRecipient; + uint256 amount; + bytes32 messageSender; +} + +struct CraftedCctpMessageParams { + uint32 remoteDomain; + uint64 nonce; + bytes32 remoteToken; + bytes32 mintRecipient; + uint256 amount; +} + +struct CraftedVaaParams { + uint16 emitterChain; + uint64 sequence; +} + +library CircleIntegrationOverride { + using WormholeCctpMessages for *; + using WormholeOverride for IWormhole; + using Utils for address; + using BytesParsing for bytes; + + error NoLogsFound(); + + address constant VM_ADDRESS = address(bytes20(uint160(uint256(keccak256("hevm cheat code"))))); + Vm constant vm = Vm(VM_ADDRESS); + + function setUpOverride(ICircleIntegration circleIntegration, uint256 signer) internal { + circleIntegration.wormhole().setUpOverride(signer); + + // instantiate circle attester + IMessageTransmitter transmitter = circleIntegration.circleTransmitter(); + + // enable the guardian key as an attester + vm.startPrank(transmitter.attesterManager()); + + // set the signature threshold to 1 + transmitter.setSignatureThreshold(1); + + // enable our key as the attester + transmitter.enableAttester(vm.addr(signer)); + + vm.stopPrank(); + } + + function circleAttester(ICircleIntegration circleIntegration) + internal + view + returns (uint256 pk) + { + pk = circleIntegration.wormhole().guardianPrivateKey(); + } + + function fetchCctpMessages(Vm.Log[] memory logs) + internal + pure + returns (CctpMessage[] memory cctpMessages) + { + if (logs.length == 0) { + revert NoLogsFound(); + } + + bytes32 topic = keccak256("MessageSent(bytes)"); + + uint256 count; + uint256 n = logs.length; + for (uint256 i; i < n;) { + unchecked { + if (logs[i].topics[0] == topic) { + ++count; + } + ++i; + } + } + + // create log array to save published messages + cctpMessages = new CctpMessage[](count); + + uint256 publishedIndex; + for (uint256 i; i < n;) { + unchecked { + if (logs[i].topics[0] == topic) { + cctpMessages[publishedIndex] = + decodeCctpMessage(abi.decode(logs[i].data, (bytes))); + ++publishedIndex; + } + ++i; + } + } + } + + function decodeCctpMessage(bytes memory encodedCctpMessage) + internal + pure + returns (CctpMessage memory cctpMessage) + { + uint256 offset; + + (cctpMessage.header.version, offset) = encodedCctpMessage.asUint32Unchecked(offset); + (cctpMessage.header.sourceDomain, offset) = encodedCctpMessage.asUint32Unchecked(offset); + (cctpMessage.header.destinationDomain, offset) = + encodedCctpMessage.asUint32Unchecked(offset); + (cctpMessage.header.nonce, offset) = encodedCctpMessage.asUint64Unchecked(offset); + (cctpMessage.header.sender, offset) = encodedCctpMessage.asBytes32Unchecked(offset); + (cctpMessage.header.recipient, offset) = encodedCctpMessage.asBytes32Unchecked(offset); + (cctpMessage.header.destinationCaller, offset) = + encodedCctpMessage.asBytes32Unchecked(offset); + (cctpMessage.payload, offset) = _takeRemainingBytes(encodedCctpMessage, offset); + + return cctpMessage; + } + + function craftCctpTokenBurnMessage( + ICircleIntegration circleIntegration, + uint32 remoteDomain, + uint64 nonce, + bytes32 remoteToken, + bytes32 mintRecipient, + uint256 amount + ) + internal + view + returns ( + CctpTokenBurnMessage memory burnMsg, + bytes memory encoded, + bytes memory attestation + ) + { + (burnMsg, encoded, attestation) = _craftCctpTokenBurnMessage( + circleIntegration, + remoteDomain, + nonce, + remoteToken, + mintRecipient, + amount, + circleIntegration.getRegisteredEmitter( + circleIntegration.getChainIdFromDomain(remoteDomain) + ), + address(circleIntegration).toUniversalAddress() + ); + } + + function craftCctpTokenBurnMessage( + ICircleIntegration circleIntegration, + uint32 remoteDomain, + uint64 nonce, + bytes32 remoteToken, + bytes32 mintRecipient, + uint256 amount, + bytes32 messageSender + ) + internal + view + returns ( + CctpTokenBurnMessage memory burnMsg, + bytes memory encoded, + bytes memory attestation + ) + { + (burnMsg, encoded, attestation) = _craftCctpTokenBurnMessage( + circleIntegration, + remoteDomain, + nonce, + remoteToken, + mintRecipient, + amount, + messageSender, + address(circleIntegration).toUniversalAddress() + ); + } + + function craftCctpTokenBurnMessage( + ICircleIntegration circleIntegration, + uint32 remoteDomain, + uint64 nonce, + bytes32 remoteToken, + bytes32 mintRecipient, + uint256 amount, + bytes32 messageSender, + bytes32 destinationCaller + ) + internal + view + returns ( + CctpTokenBurnMessage memory burnMsg, + bytes memory encoded, + bytes memory attestation + ) + { + (burnMsg, encoded, attestation) = _craftCctpTokenBurnMessage( + circleIntegration, + remoteDomain, + nonce, + remoteToken, + mintRecipient, + amount, + messageSender, + destinationCaller + ); + } + + function craftRedeemParameters( + ICircleIntegration circleIntegration, + CraftedCctpMessageParams memory cctpParams, + CraftedVaaParams memory vaaParams, + bytes32 fromAddress, + bytes memory payload, + bytes32 messageSender, + bytes32 destinationCaller + ) internal view returns (ICircleIntegration.RedeemParameters memory params) { + params = _craftRedeemParameters( + circleIntegration, + cctpParams, + vaaParams, + fromAddress, + payload, + messageSender, + destinationCaller + ); + } + + function craftRedeemParameters( + ICircleIntegration circleIntegration, + CraftedCctpMessageParams memory cctpParams, + CraftedVaaParams memory vaaParams, + bytes32 fromAddress, + bytes memory payload, + bytes32 messageSender + ) internal view returns (ICircleIntegration.RedeemParameters memory params) { + params = _craftRedeemParameters( + circleIntegration, + cctpParams, + vaaParams, + fromAddress, + payload, + messageSender, + address(circleIntegration).toUniversalAddress() + ); + } + + function craftRedeemParameters( + ICircleIntegration circleIntegration, + CraftedCctpMessageParams memory cctpParams, + CraftedVaaParams memory vaaParams, + bytes32 fromAddress, + bytes memory payload + ) internal view returns (ICircleIntegration.RedeemParameters memory params) { + params = _craftRedeemParameters( + circleIntegration, + cctpParams, + vaaParams, + fromAddress, + payload, + circleIntegration.getRegisteredEmitter( + circleIntegration.getChainIdFromDomain(cctpParams.remoteDomain) + ), + address(circleIntegration).toUniversalAddress() + ); + } + + // private + + function _takeRemainingBytes(bytes memory encoded, uint256 startOffset) + private + pure + returns (bytes memory payload, uint256 offset) + { + uint256 payloadLength = encoded.length - startOffset; + (payload, offset) = encoded.sliceUnchecked(offset, payloadLength); + } + + function _craftRedeemParameters( + ICircleIntegration circleIntegration, + CraftedCctpMessageParams memory cctpParams, + CraftedVaaParams memory vaaParams, + bytes32 burnSource, + bytes memory payload, + bytes32 messageSender, + bytes32 destinationCaller + ) private view returns (ICircleIntegration.RedeemParameters memory params) { + CctpTokenBurnMessage memory burnMsg; + (burnMsg, params.encodedCctpMessage, params.cctpAttestation) = _craftCctpTokenBurnMessage( + circleIntegration, + cctpParams.remoteDomain, + cctpParams.nonce, + cctpParams.remoteToken, + cctpParams.mintRecipient, + cctpParams.amount, + messageSender, + destinationCaller + ); + + (, params.encodedVaa) = circleIntegration.wormhole().craftVaa( + vaaParams.emitterChain, + burnMsg.messageSender, + vaaParams.sequence, + burnMsg.burnToken.encodeDeposit( + burnMsg.amount, + burnMsg.header.sourceDomain, + burnMsg.header.destinationDomain, + burnMsg.header.nonce, + burnSource, + burnMsg.mintRecipient, + payload + ) + ); + } + + function _craftCctpTokenBurnMessage( + ICircleIntegration circleIntegration, + uint32 remoteDomain, + uint64 nonce, + bytes32 remoteToken, + bytes32 mintRecipient, + uint256 amount, + bytes32 messageSender, + bytes32 destinationCaller + ) + private + view + returns ( + CctpTokenBurnMessage memory burnMsg, + bytes memory encoded, + bytes memory attestation + ) + { + burnMsg.header = CctpHeader({ + version: 0, + sourceDomain: remoteDomain, + destinationDomain: circleIntegration.localDomain(), + nonce: nonce, + sender: circleIntegration.circleBridge().remoteTokenMessengers(remoteDomain), + recipient: address(circleIntegration.circleBridge()).toUniversalAddress(), + destinationCaller: destinationCaller + }); + + burnMsg.burnToken = remoteToken; + burnMsg.mintRecipient = mintRecipient; + burnMsg.amount = amount; + burnMsg.messageSender = messageSender; + + encoded = abi.encodePacked( + burnMsg.header.version, + burnMsg.header.sourceDomain, + burnMsg.header.destinationDomain, + burnMsg.header.nonce, + burnMsg.header.sender, + burnMsg.header.recipient, + burnMsg.header.destinationCaller, + burnMsg.version, + burnMsg.burnToken, + burnMsg.mintRecipient, + burnMsg.amount, + burnMsg.messageSender + ); + + (uint8 v, bytes32 r, bytes32 s) = + vm.sign(circleAttester(circleIntegration), keccak256(encoded)); + attestation = abi.encodePacked(r, s, v); + } +} diff --git a/evm/forge/tests/helpers/libraries/SlotCheck.sol b/evm/forge/tests/helpers/libraries/SlotCheck.sol new file mode 100644 index 0000000..2b217c2 --- /dev/null +++ b/evm/forge/tests/helpers/libraries/SlotCheck.sol @@ -0,0 +1,89 @@ +// SPDX-License-Identifier: Apache 2 +pragma solidity ^0.8.19; + +import {Vm} from "forge-std/Vm.sol"; + +library SlotCheck { + address constant VM_ADDRESS = address(bytes20(uint160(uint256(keccak256("hevm cheat code"))))); + Vm constant vm = Vm(VM_ADDRESS); + + function slotValueEquals(address contractAddr, uint256 slot, bool expected) + internal + view + returns (bool agrees) + { + agrees = slotValueEquals(contractAddr, bytes32(slot), expected); + } + + function slotValueEquals(address contractAddr, uint256 slot, uint256 expected) + internal + view + returns (bool agrees) + { + agrees = slotValueEquals(contractAddr, bytes32(slot), expected); + } + + function slotValueEquals(address contractAddr, uint256 slot, address expected) + internal + view + returns (bool agrees) + { + agrees = slotValueEquals(contractAddr, bytes32(slot), expected); + } + + function slotValueEquals(address contractAddr, uint256 slot, bytes32 expected) + internal + view + returns (bool agrees) + { + agrees = slotValueEquals(contractAddr, bytes32(slot), expected); + } + + function slotValueEquals(address contractAddr, bytes32 slot, bool expected) + internal + view + returns (bool agrees) + { + agrees = slotValueEquals(contractAddr, slot, uint256(expected ? 1 : 0)); + } + + function slotValueEquals(address contractAddr, bytes32 slot, uint256 expected) + internal + view + returns (bool agrees) + { + agrees = slotValueEquals(contractAddr, slot, bytes32(expected)); + } + + function slotValueEquals(address contractAddr, bytes32 slot, address expected) + internal + view + returns (bool agrees) + { + agrees = slotValueEquals(contractAddr, slot, bytes32(uint256(uint160(expected)))); + } + + function slotValueEquals(address contractAddr, bytes32 slot, bytes32 expected) + internal + view + returns (bool agrees) + { + agrees = vm.load(contractAddr, slot) == expected; + } + + function slotValueZero(address contractAddr, uint256 slot) + internal + view + returns (bool agrees) + { + agrees = slotValueZero(contractAddr, bytes32(slot)); + } + + function slotValueZero(address contractAddr, bytes32 slot) + internal + view + returns (bool agrees) + { + agrees = slotValueEquals(contractAddr, slot, bytes32(0)); + } +} diff --git a/evm/forge/tests/helpers/libraries/UsdcDeal.sol b/evm/forge/tests/helpers/libraries/UsdcDeal.sol new file mode 100644 index 0000000..19cfadd --- /dev/null +++ b/evm/forge/tests/helpers/libraries/UsdcDeal.sol @@ -0,0 +1,21 @@ +// SPDX-License-Identifier: Apache 2 +pragma solidity ^0.8.19; + +import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; + +import {Vm} from "forge-std/Vm.sol"; + +import {IUSDC} from "../IUSDC.sol"; + +library UsdcDeal { + address constant VM_ADDRESS = address(bytes20(uint160(uint256(keccak256("hevm cheat code"))))); + Vm constant vm = Vm(VM_ADDRESS); + + function dealAndApprove(address usdcAddress, address to, uint256 amount) internal { + IUSDC usdc = IUSDC(usdcAddress); + vm.prank(usdc.masterMinter()); + usdc.configureMinter(address(this), amount); + usdc.mint(address(this), amount); + IERC20(usdcAddress).approve(to, amount); + } +} diff --git a/evm/forge/tests/helpers/libraries/WormholeOverride.sol b/evm/forge/tests/helpers/libraries/WormholeOverride.sol new file mode 100644 index 0000000..a1425e7 --- /dev/null +++ b/evm/forge/tests/helpers/libraries/WormholeOverride.sol @@ -0,0 +1,210 @@ +// SPDX-License-Identifier: Apache 2 +pragma solidity ^0.8.19; + +import {IWormhole} from "src/interfaces/IWormhole.sol"; + +import {BytesParsing} from "src/libraries/BytesParsing.sol"; +import {Utils} from "src/libraries/Utils.sol"; + +import "forge-std/Test.sol"; +import "forge-std/console.sol"; +import {Vm} from "forge-std/Vm.sol"; + +library WormholeOverride { + using Utils for address; + using BytesParsing for bytes; + + address constant VM_ADDRESS = address(bytes20(uint160(uint256(keccak256("hevm cheat code"))))); + Vm constant vm = Vm(VM_ADDRESS); + + uint16 constant GOVERNANCE_CHAIN_ID = 1; + bytes32 constant GOVERNANCE_CONTRACT = + 0x0000000000000000000000000000000000000000000000000000000000000004; + + // keccak256("devnetGuardianPrivateKey") - 1 + bytes32 constant DEVNET_GUARDIAN_PK_SLOT = + 0x4c7087e9f1bf599f9f9fff4deb3ecae99b29adaab34a0f53d9fa9d61aeaecb63; + + error IncorrectSlot(bytes32); + error UnexpectedGuardianLength(uint256); + error UnexpectedGuardianSet(uint256, address); + error NoLogsFound(); + + function setUpOverride(IWormhole wormhole, uint256 signer) internal { + address devnetGuardian = vm.addr(signer); + + bytes32 data = vm.load(address(wormhole), bytes32(uint256(2))); + if (data != 0) { + revert IncorrectSlot(bytes32(uint256(2))); + } + + // Get slot for Guardian Set at the current index + uint32 guardianSetIndex = wormhole.getCurrentGuardianSetIndex(); + bytes32 guardianSetSlot = keccak256(abi.encode(guardianSetIndex, 2)); + + // Overwrite all but first guardian set to zero address. This isn't + // necessary, but just in case we inadvertently access these slots + // for any reason. + uint256 numGuardians = uint256(vm.load(address(wormhole), guardianSetSlot)); + for (uint256 i = 1; i < numGuardians;) { + vm.store( + address(wormhole), + bytes32(uint256(keccak256(abi.encodePacked(guardianSetSlot))) + i), + 0 + ); + unchecked { + ++i; + } + } + + // Now overwrite the first guardian key with the devnet key specified + // in the function argument. + vm.store( + address(wormhole), + bytes32(uint256(keccak256(abi.encodePacked(guardianSetSlot))) + 0), // just explicit w/ index 0 + devnetGuardian.toUniversalAddress() + ); + + // Change the length to 1 guardian + vm.store( + address(wormhole), + guardianSetSlot, + bytes32(uint256(1)) // length == 1 + ); + + // Confirm guardian set override + address[] memory guardians = wormhole.getGuardianSet(guardianSetIndex).keys; + if (guardians.length != 1 || guardians[0] != devnetGuardian) { + revert UnexpectedGuardianSet(guardians.length, guardians[0]); + } + + // Now do something crazy. Save the private key in a specific slot of Wormhole's storage for + // retrieval later. + vm.store(address(wormhole), DEVNET_GUARDIAN_PK_SLOT, bytes32(signer)); + } + + function guardianPrivateKey(IWormhole wormhole) internal view returns (uint256 pk) { + pk = uint256(vm.load(address(wormhole), DEVNET_GUARDIAN_PK_SLOT)); + } + + function fetchWormholePublishedPayloads(Vm.Log[] memory logs) + internal + pure + returns (bytes[] memory payloads) + { + if (logs.length == 0) { + revert NoLogsFound(); + } + + bytes32 topic = keccak256("LogMessagePublished(address,uint64,uint32,bytes,uint8)"); + + uint256 count; + uint256 n = logs.length; + for (uint256 i; i < n;) { + unchecked { + if (logs[i].topics[0] == topic) { + ++count; + } + ++i; + } + } + + // create log array to save published messages + payloads = new bytes[](count); + + uint256 publishedIndex; + for (uint256 i; i < n;) { + unchecked { + if (logs[i].topics[0] == topic) { + (,, payloads[publishedIndex],) = + abi.decode(logs[i].data, (uint64, uint32, bytes, uint8)); + ++publishedIndex; + } + ++i; + } + } + } + + function craftVaa( + IWormhole wormhole, + uint16 emitterChain, + bytes32 emitterAddress, + uint64 sequence, + bytes memory payload + ) internal view returns (IWormhole.VM memory vaa, bytes memory encoded) { + vaa.version = 1; + vaa.timestamp = uint32(block.timestamp); + vaa.nonce = 420; + vaa.emitterChainId = emitterChain; + vaa.emitterAddress = emitterAddress; + vaa.sequence = sequence; + vaa.consistencyLevel = 1; + vaa.payload = payload; + + bytes memory encodedBody = abi.encodePacked( + vaa.timestamp, + vaa.nonce, + vaa.emitterChainId, + vaa.emitterAddress, + vaa.sequence, + vaa.consistencyLevel, + vaa.payload + ); + vaa.hash = keccak256(abi.encodePacked(keccak256(encodedBody))); + + vaa.signatures = new IWormhole.Signature[](1); + (vaa.signatures[0].v, vaa.signatures[0].r, vaa.signatures[0].s) = + vm.sign(guardianPrivateKey(wormhole), vaa.hash); + vaa.signatures[0].v -= 27; + + encoded = abi.encodePacked( + vaa.version, + wormhole.getCurrentGuardianSetIndex(), + uint8(vaa.signatures.length), + vaa.signatures[0].guardianIndex, + vaa.signatures[0].r, + vaa.signatures[0].s, + vaa.signatures[0].v, + encodedBody + ); + } + + function craftGovernanceVaa( + IWormhole wormhole, + bytes32 module, + uint8 action, + uint16 targetChain, + uint64 sequence, + bytes memory decree + ) internal view returns (IWormhole.VM memory vaa, bytes memory encoded) { + (vaa, encoded) = craftGovernanceVaa( + wormhole, + GOVERNANCE_CHAIN_ID, + GOVERNANCE_CONTRACT, + module, + action, + targetChain, + sequence, + decree + ); + } + + function craftGovernanceVaa( + IWormhole wormhole, + uint16 governanceChain, + bytes32 governanceContract, + bytes32 module, + uint8 action, + uint16 targetChain, + uint64 sequence, + bytes memory decree + ) internal view returns (IWormhole.VM memory vaa, bytes memory encoded) { + (vaa, encoded) = craftVaa( + wormhole, + governanceChain, + governanceContract, + sequence, + abi.encodePacked(module, action, targetChain, decree) + ); + } +} diff --git a/evm/forge/tests/integrations/ComposingWithCircleIntegration.sol b/evm/forge/tests/integrations/ComposingWithCircleIntegration.sol new file mode 100644 index 0000000..94f160b --- /dev/null +++ b/evm/forge/tests/integrations/ComposingWithCircleIntegration.sol @@ -0,0 +1,65 @@ +// SPDX-License-Identifier: Apache 2 +pragma solidity ^0.8.19; + +import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import {SafeERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; + +import {ICircleIntegration} from "src/interfaces/ICircleIntegration.sol"; +import {IWormhole} from "src/interfaces/IWormhole.sol"; + +import {Utils} from "src/libraries/Utils.sol"; + +contract ComposingWithCircleIntegration { + using SafeERC20 for IERC20; + using Utils for address; + + uint32 constant _MY_BFF_DOMAIN = 1; + bytes32 constant _MY_BFF_ADDR = + 0x000000000000000000000000deadbeefdeadbeefdeadbeefdeadbeefdeadbeef; + + ICircleIntegration immutable _circleIntegration; + address immutable _usdcAddress; + + constructor(address circleIntegration, address usdcAddress) { + _circleIntegration = ICircleIntegration(circleIntegration); + _usdcAddress = usdcAddress; + + // YOLO. + IERC20(_usdcAddress).forceApprove(address(_circleIntegration), 2 ** 256 - 1); + } + + function transferUsdc( + uint16 targetChain, + uint256 amount, + bytes32 mintRecipient, + bytes calldata payload + ) public payable returns (uint64 wormholeSequence) { + IERC20(_usdcAddress).safeTransferFrom(msg.sender, address(this), amount); + + wormholeSequence = _circleIntegration.transferTokensWithPayload{value: msg.value}( + ICircleIntegration.TransferParameters({ + token: _usdcAddress, + amount: amount, + targetChain: targetChain, + mintRecipient: mintRecipient + }), + 0, // wormholeNonce + payload + ); + } + + function redeemUsdc(ICircleIntegration.RedeemParameters calldata params) public { + ICircleIntegration.DepositWithPayload memory deposit = + _circleIntegration.redeemTokensWithPayload(params); + + IERC20(_usdcAddress).safeTransfer(msg.sender, deposit.amount); + } + + function myBffDomain() public pure returns (uint32 domain) { + domain = _MY_BFF_DOMAIN; + } + + function myBffAddr() public pure returns (bytes32 addr) { + addr = _MY_BFF_ADDR; + } +} diff --git a/evm/forge/tests/integrations/InheritingWormholeCctp.sol b/evm/forge/tests/integrations/InheritingWormholeCctp.sol new file mode 100644 index 0000000..456c949 --- /dev/null +++ b/evm/forge/tests/integrations/InheritingWormholeCctp.sol @@ -0,0 +1,67 @@ +// SPDX-License-Identifier: Apache 2 +pragma solidity ^0.8.19; + +import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import {SafeERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; + +import {IWormhole} from "src/interfaces/IWormhole.sol"; + +import {Utils} from "src/libraries/Utils.sol"; + +import {WormholeCctpTokenMessenger} from "src/contracts/WormholeCctpTokenMessenger.sol"; + +contract InheritingWormholeCctp is WormholeCctpTokenMessenger { + using Utils for address; + using SafeERC20 for IERC20; + + uint32 constant _MY_BFF_DOMAIN = 1; + bytes32 constant _MY_BFF_ADDR = + 0x000000000000000000000000deadbeefdeadbeefdeadbeefdeadbeefdeadbeef; + + address immutable _usdcAddress; + + constructor(address wormhole, address cctpTokenMessenger, address usdcAddress) + WormholeCctpTokenMessenger(wormhole, cctpTokenMessenger) + { + _usdcAddress = usdcAddress; + + // YOLO. + setTokenMessengerApproval(_usdcAddress, 2 ** 256 - 1); + } + + function transferUsdc(uint256 amount, bytes32 mintRecipient, bytes calldata payload) + public + payable + returns (uint64 wormholeSequence) + { + // Deposit tokens into this contract to prepare for burning. + IERC20(_usdcAddress).safeTransferFrom(msg.sender, address(this), amount); + + (wormholeSequence,) = burnAndPublish( + _MY_BFF_ADDR, + _MY_BFF_DOMAIN, + _usdcAddress, + amount, + mintRecipient, + 0, // wormholeNonce + payload, + msg.value + ); + } + + function redeemUsdc( + bytes calldata encodedCctpMessage, + bytes calldata cctpAttestation, + bytes calldata encodedVaa + ) public { + verifyVaaAndMint(encodedCctpMessage, cctpAttestation, encodedVaa); + } + + function myBffDomain() public pure returns (uint32 domain) { + domain = _MY_BFF_DOMAIN; + } + + function myBffAddr() public pure returns (bytes32 addr) { + addr = _MY_BFF_ADDR; + } +} diff --git a/evm/foundry-test.toml b/evm/foundry-test.toml deleted file mode 100644 index 2cdcfc5..0000000 --- a/evm/foundry-test.toml +++ /dev/null @@ -1,22 +0,0 @@ -[profile.default] -solc_version = "0.8.19" -optimizer = true -optimizer_runs = 200 - -test = "forge-test" -broadcast = "broadcast-test" - -libs = [ - "lib", - "node_modules", -] -remappings = [ - "@openzeppelin/=node_modules/@openzeppelin/", - "@solidity-parser/=node_modules/@solidity-parser/", - "ds-test/=lib/forge-std/lib/ds-test/src/", - "forge-std/=lib/forge-std/src/", - "wormhole/=lib/wormhole/ethereum/contracts", - "wormhole-forge-sdk/=modules/src", -] - -# See more config options https://github.com/foundry-rs/foundry/tree/master/config diff --git a/evm/foundry.toml b/evm/foundry.toml index 5a88c40..6d181f9 100644 --- a/evm/foundry.toml +++ b/evm/foundry.toml @@ -1,22 +1,33 @@ +[fmt] +line_length=100 + [profile.default] solc_version = "0.8.19" optimizer = true optimizer_runs = 200 evm_version = "paris" +via_ir = true +extra_output = ["metadata", "storageLayout", "evm.deployedBytecode.immutableReferences"] -test = "forge-test" +test = "forge/tests" libs = [ "lib", "node_modules", ] + remappings = [ "@openzeppelin/=node_modules/@openzeppelin/", "@solidity-parser/=node_modules/@solidity-parser/", "ds-test/=lib/forge-std/lib/ds-test/src/", "forge-std/=lib/forge-std/src/", - "wormhole/=lib/wormhole/ethereum/contracts", "wormhole-forge-sdk/=modules/src", + "src/=src", + "test-helpers/=forge/tests/helpers", ] +gas_reports = ["*"] + +gas_limit = "18446744073709551615" + # See more config options https://github.com/foundry-rs/foundry/tree/master/config diff --git a/evm/modules/README.md b/evm/modules/README.md deleted file mode 100644 index 590e21c..0000000 --- a/evm/modules/README.md +++ /dev/null @@ -1,11 +0,0 @@ -# Solidity Modules - -The intent of this directory is to warehouse common Solidity helpers that we can -one day put into its own package (so we can import it via package.json) as opposed -to free-floating for integrators to have to port around. - -### Contents - -- src - - _WormholeSimulator.sol_ - diff --git a/evm/modules/src/WormholeSimulator.sol b/evm/modules/src/WormholeSimulator.sol deleted file mode 100644 index 1db06cc..0000000 --- a/evm/modules/src/WormholeSimulator.sol +++ /dev/null @@ -1,291 +0,0 @@ -// SPDX-License-Identifier: Apache 2 -pragma solidity ^0.8.19; - -import {IWormhole} from "wormhole/interfaces/IWormhole.sol"; -import {BytesLib} from "wormhole/libraries/external/BytesLib.sol"; - -import {Setup} from "wormhole/Setup.sol"; -import {Implementation} from "wormhole/Implementation.sol"; -import {Wormhole} from "wormhole/Wormhole.sol"; - -import "forge-std/Vm.sol"; -import "forge-std/console.sol"; - -contract WormholeSimulator { - using BytesLib for bytes; - - uint16 constant GOVERNANCE_CHAIN_ID = 1; - bytes32 constant GOVERNANCE_CONTRACT = 0x0000000000000000000000000000000000000000000000000000000000000004; - - // Taken from forge-std/Script.sol - address private constant VM_ADDRESS = address(bytes20(uint160(uint256(keccak256("hevm cheat code"))))); - Vm public constant vm = Vm(VM_ADDRESS); - - // Allow access to Wormhole - IWormhole public wormhole; - - // Save the guardian PK to sign messages with - uint256 private devnetGuardianPK; - address public devnetGuardian; - - // storage - uint64 governanceSequence; - - constructor(address wormhole_, uint256 devnetGuardian_) { - governanceSequence = 0; - - wormhole = IWormhole(wormhole_); - - if (devnetGuardian_ > 0) { - devnetGuardianPK = devnetGuardian_; - devnetGuardian = vm.addr(devnetGuardianPK); - overrideToDevnetGuardian(); - } - } - - function overrideToDevnetGuardian() internal { - bytes32 data = vm.load(address(wormhole), bytes32(uint256(2))); - require(data == bytes32(0), "incorrect slot"); - - // Get slot for Guardian Set at the current index - uint32 guardianSetIndex = wormhole.getCurrentGuardianSetIndex(); - bytes32 guardianSetSlot = keccak256(abi.encode(guardianSetIndex, 2)); - - // Overwrite all but first guardian set to zero address. This isn't - // necessary, but just in case we inadvertently access these slots - // for any reason. - uint256 numGuardians = uint256(vm.load(address(wormhole), guardianSetSlot)); - for (uint256 i = 1; i < numGuardians;) { - vm.store(address(wormhole), bytes32(uint256(keccak256(abi.encodePacked(guardianSetSlot))) + i), bytes32(0)); - unchecked { - i += 1; - } - } - - // Now overwrite the first guardian key with the devnet key specified - // in the function argument. - vm.store( - address(wormhole), - bytes32(uint256(keccak256(abi.encodePacked(guardianSetSlot))) + 0), // just explicit w/ index 0 - bytes32(uint256(uint160(devnetGuardian))) - ); - - // Change the length to 1 guardian - vm.store( - address(wormhole), - guardianSetSlot, - bytes32(uint256(1)) // length == 1 - ); - - // Confirm guardian set override - address[] memory guardians = wormhole.getGuardianSet(guardianSetIndex).keys; - require(guardians.length == 1, "guardians.length != 1"); - require(guardians[0] == devnetGuardian, "incorrect guardian set override"); - } - - function doubleKeccak256(bytes memory body) internal pure returns (bytes32) { - return keccak256(abi.encodePacked(keccak256(body))); - } - - function parseVMFromLogs(Vm.Log memory log) internal pure returns (IWormhole.VM memory vm_) { - uint256 index = 0; - - // emitterAddress - vm_.emitterAddress = bytes32(log.topics[1]); - - // sequence - vm_.sequence = log.data.toUint64(index + 32 - 8); - index += 32; - - // nonce - vm_.nonce = log.data.toUint32(index + 32 - 4); - index += 32; - - // skip random bytes - index += 32; - - // consistency level - vm_.consistencyLevel = log.data.toUint8(index + 32 - 1); - index += 32; - - // length of payload - uint256 payloadLen = log.data.toUint256(index); - index += 32; - - vm_.payload = log.data.slice(index, payloadLen); - index += payloadLen; - - // trailing bytes (due to 32 byte slot overlap) - index += log.data.length - index; - - require(index == log.data.length, "failed to parse wormhole message"); - } - - function encodeObservation(IWormhole.VM memory wormholeMessage) public pure returns (bytes memory) { - return abi.encodePacked( - wormholeMessage.timestamp, - wormholeMessage.nonce, - wormholeMessage.emitterChainId, - wormholeMessage.emitterAddress, - wormholeMessage.sequence, - wormholeMessage.consistencyLevel, - wormholeMessage.payload - ); - } - - function signObservation(uint256 guardian, IWormhole.VM memory wormholeMessage) - public - view - returns (bytes memory) - { - require(guardian != 0, "devnetGuardian is zero address"); - - bytes memory body = encodeObservation(wormholeMessage); - - // Sign the hash with the devnet guardian private key - IWormhole.Signature[] memory sigs = new IWormhole.Signature[](1); - (sigs[0].v, sigs[0].r, sigs[0].s) = vm.sign(guardian, doubleKeccak256(body)); - sigs[0].guardianIndex = 0; - - return abi.encodePacked( - uint8(1), - wormhole.getCurrentGuardianSetIndex(), - uint8(sigs.length), - sigs[0].guardianIndex, - sigs[0].r, - sigs[0].s, - sigs[0].v - 27, - body - ); - } - - function signDevnetObservation(IWormhole.VM memory wormholeMessage) public view returns (bytes memory) { - return signObservation(devnetGuardianPK, wormholeMessage); - } - - function findLogMessagePublishedInLogs(Vm.Log[] memory entries) - public - pure - returns (uint64, uint32, bytes memory, uint8) - { - uint256 numEntries = entries.length; - for (uint256 i = 0; i < numEntries;) { - if (entries[i].topics[0] == keccak256("LogMessagePublished(address,uint64,uint32,bytes,uint8)")) { - return abi.decode(entries[i].data, (uint64, uint32, bytes, uint8)); - } - unchecked { - i += 1; - } - } - revert("LogMessagePublished not found"); - } - - function fetchSignedMessageFromLogs(Vm.Log memory log, uint16 emitterChainId, bytes32 emitterAddress) - public - view - returns (bytes memory) - { - // Create message instance - IWormhole.VM memory vm_; - - // Parse wormhole message from ethereum logs - vm_ = parseVMFromLogs(log); - - // Set empty body values before computing the hash - vm_.version = uint8(1); - vm_.timestamp = uint32(block.timestamp); - vm_.emitterChainId = emitterChainId; - vm_.emitterAddress = emitterAddress; - - // Compute the hash of the body - bytes memory body = encodeObservation(vm_); - vm_.hash = doubleKeccak256(body); - - // Sign the hash with the devnet guardian private key - IWormhole.Signature[] memory sigs = new IWormhole.Signature[](1); - (sigs[0].v, sigs[0].r, sigs[0].s) = vm.sign(devnetGuardianPK, vm_.hash); - sigs[0].guardianIndex = 0; - - return abi.encodePacked( - vm_.version, - wormhole.getCurrentGuardianSetIndex(), - uint8(sigs.length), - sigs[0].guardianIndex, - sigs[0].r, - sigs[0].s, - sigs[0].v - 27, - body - ); - } - - function deployForeignWormhole(uint16 chainId) public returns (address) { - require(chainId != wormhole.chainId(), "chainId cannot equal this chain's"); - - // deploy Setup - Setup setup = new Setup(); - - // deploy Implementation - Implementation implementation = new Implementation(); - - address[] memory guardians = new address[](1); - guardians[0] = devnetGuardian; - - // deploy Wormhole - Wormhole foreignWormhole = new Wormhole( - address(setup), - abi.encodeWithSelector( - bytes4(keccak256("setup(address,address[],uint16,uint16,bytes32,uint256)")), - address(implementation), - guardians, - chainId, - GOVERNANCE_CHAIN_ID, - GOVERNANCE_CONTRACT, - block.chainid // evm chain id - ) - ); - - return address(foreignWormhole); - } - - function makeGovernanceObservation( - uint16 governanceChainId_, - bytes32 governanceContract_, - bytes32 module, - uint8 action, - uint16 chainId, - bytes memory decree - ) public returns (IWormhole.VM memory message) { - message.timestamp = uint32(block.timestamp); - message.nonce = 0; - message.emitterChainId = governanceChainId_; - message.emitterAddress = governanceContract_; - unchecked { - governanceSequence += 1; - } - message.sequence = governanceSequence; - message.consistencyLevel = 1; - message.payload = abi.encodePacked(module, action, chainId, decree); - } - - function makeSignedGovernanceObservation( - uint16 governanceChainId_, - bytes32 governanceContract_, - bytes32 module, - uint8 action, - uint16 chainId, - bytes memory decree - ) public returns (bytes memory) { - return signObservation( - devnetGuardianPK, - makeGovernanceObservation(governanceChainId_, governanceContract_, module, action, chainId, decree) - ); - } - - function governanceChainId() public pure returns (uint16) { - return GOVERNANCE_CHAIN_ID; - } - - function governanceContract() public pure returns (bytes32) { - return GOVERNANCE_CONTRACT; - } -} diff --git a/evm/package-lock.json b/evm/package-lock.json new file mode 100644 index 0000000..33e9524 --- /dev/null +++ b/evm/package-lock.json @@ -0,0 +1,8847 @@ +{ + "name": "wormhole-circle-integration-evm", + "version": "0.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "wormhole-circle-integration-evm", + "version": "0.1.0", + "license": "ISC", + "dependencies": { + "@certusone/wormhole-sdk": "^0.9.0", + "@improbable-eng/grpc-web-node-http-transport": "^0.15.0", + "@openzeppelin/contracts": "^4.9.5", + "@typechain/ethers-v5": "^10.1.1", + "@types/argparse": "^2.0.10", + "@types/chai": "^4.3.3", + "@types/mocha": "^9.1.1", + "argparse": "^2.0.1", + "axios": "^1.1.3", + "dotenv": "^16.0.3", + "elliptic": "^6.5.4", + "express": "^4.18.2", + "mocha": "^10.0.0", + "ts-mocha": "^10.0.0", + "ts-node": "^10.9.1", + "typechain": "^8.1.1", + "typescript": "^4.8.3" + }, + "devDependencies": { + "@types/node": "^18.11.17", + "chai": "^4.3.6", + "ethers": "^5.7.1" + } + }, + "node_modules/@apollo/client": { + "version": "3.8.8", + "resolved": "https://registry.npmjs.org/@apollo/client/-/client-3.8.8.tgz", + "integrity": "sha512-omjd9ryGDkadZrKW6l5ktUAdS4SNaFOccYQ4ZST0HLW83y8kQaSZOCTNlpkoBUK8cv6qP8+AxOKwLm2ho8qQ+Q==", + "optional": true, + "dependencies": { + "@graphql-typed-document-node/core": "^3.1.1", + "@wry/equality": "^0.5.6", + "@wry/trie": "^0.5.0", + "graphql-tag": "^2.12.6", + "hoist-non-react-statics": "^3.3.2", + "optimism": "^0.18.0", + "prop-types": "^15.7.2", + "response-iterator": "^0.2.6", + "symbol-observable": "^4.0.0", + "ts-invariant": "^0.10.3", + "tslib": "^2.3.0", + "zen-observable-ts": "^1.2.5" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0", + "graphql-ws": "^5.5.5", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0", + "subscriptions-transport-ws": "^0.9.0 || ^0.11.0" + }, + "peerDependenciesMeta": { + "graphql-ws": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + }, + "subscriptions-transport-ws": { + "optional": true + } + } + }, + "node_modules/@babel/runtime": { + "version": "7.20.13", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.13.tgz", + "integrity": "sha512-gt3PKXs0DBoL9xCvOIIZ2NEqAGZqHjAnmVbfQtB620V0uReIQutpel14KcneZuer7UioY8ALKZ7iocavvzTNFA==", + "dependencies": { + "regenerator-runtime": "^0.13.11" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@certusone/wormhole-sdk": { + "version": "0.9.24", + "resolved": "https://registry.npmjs.org/@certusone/wormhole-sdk/-/wormhole-sdk-0.9.24.tgz", + "integrity": "sha512-O2Ejd2fCP0uhM0ysQyXzuzZMBpMpySQN6fcJlL/Xk1LCVJQLPQtNfRK4oR04tYAnEJBVsAzoNYiX8dPSw+eNJQ==", + "dependencies": { + "@certusone/wormhole-sdk-proto-web": "0.0.6", + "@certusone/wormhole-sdk-wasm": "^0.0.1", + "@coral-xyz/borsh": "0.2.6", + "@mysten/sui.js": "0.32.2", + "@project-serum/anchor": "^0.25.0", + "@solana/spl-token": "^0.3.5", + "@solana/web3.js": "^1.66.2", + "@terra-money/terra.js": "3.1.9", + "@xpla/xpla.js": "^0.2.1", + "algosdk": "^2.4.0", + "aptos": "1.5.0", + "axios": "^0.24.0", + "bech32": "^2.0.0", + "binary-parser": "^2.2.1", + "bs58": "^4.0.1", + "elliptic": "^6.5.4", + "js-base64": "^3.6.1", + "near-api-js": "^1.0.0" + }, + "optionalDependencies": { + "@injectivelabs/networks": "1.10.12", + "@injectivelabs/sdk-ts": "1.10.72", + "@injectivelabs/utils": "1.10.12" + } + }, + "node_modules/@certusone/wormhole-sdk-proto-web": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/@certusone/wormhole-sdk-proto-web/-/wormhole-sdk-proto-web-0.0.6.tgz", + "integrity": "sha512-LTyjsrWryefx5WmkoBP6FQ2EjLxhMExAGxLkloHUhufVQZdrbGh0htBBUviP+HaDSJBCMPMtulNFwkBJV6muqQ==", + "dependencies": { + "@improbable-eng/grpc-web": "^0.15.0", + "protobufjs": "^7.0.0", + "rxjs": "^7.5.6" + } + }, + "node_modules/@certusone/wormhole-sdk-proto-web/node_modules/long": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", + "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==" + }, + "node_modules/@certusone/wormhole-sdk-proto-web/node_modules/protobufjs": { + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.2.5.tgz", + "integrity": "sha512-gGXRSXvxQ7UiPgfw8gevrfRWcTlSbOFg+p/N+JVJEK5VhueL2miT6qTymqAmjr1Q5WbOCyJbyrk6JfWKwlFn6A==", + "hasInstallScript": true, + "dependencies": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/node": ">=13.7.0", + "long": "^5.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/@certusone/wormhole-sdk-wasm": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/@certusone/wormhole-sdk-wasm/-/wormhole-sdk-wasm-0.0.1.tgz", + "integrity": "sha512-LdIwLhOyr4pPs2jqYubqC7d4UkqYBX0EG/ppspQlW3qlVE0LZRMrH6oVzzLMyHtV0Rw7O9sIKzORW/T3mrJv2w==", + "license": "Apache-2.0", + "dependencies": { + "@types/long": "^4.0.2", + "@types/node": "^18.0.3" + } + }, + "node_modules/@certusone/wormhole-sdk/node_modules/axios": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.24.0.tgz", + "integrity": "sha512-Q6cWsys88HoPgAaFAVUb0WpPk0O8iTeisR9IMqy9G8AbO4NlpVknrnQS03zzF9PGAWgO3cgletO3VjV/P7VztA==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.14.4" + } + }, + "node_modules/@classic-terra/terra.proto": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@classic-terra/terra.proto/-/terra.proto-1.1.0.tgz", + "integrity": "sha512-bYhQG5LUaGF0KPRY9hYT/HEcd1QExZPQd6zLV/rQkCe/eDxfwFRLzZHpaaAdfWoAAZjsRWqJbUCqCg7gXBbJpw==", + "dependencies": { + "@improbable-eng/grpc-web": "^0.14.1", + "google-protobuf": "^3.17.3", + "long": "^4.0.0", + "protobufjs": "~6.11.2" + } + }, + "node_modules/@classic-terra/terra.proto/node_modules/@improbable-eng/grpc-web": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/@improbable-eng/grpc-web/-/grpc-web-0.14.1.tgz", + "integrity": "sha512-XaIYuunepPxoiGVLLHmlnVminUGzBTnXr8Wv7khzmLWbNw4TCwJKX09GSMJlKhu/TRk6gms0ySFxewaETSBqgw==", + "dependencies": { + "browser-headers": "^0.4.1" + }, + "peerDependencies": { + "google-protobuf": "^3.14.0" + } + }, + "node_modules/@confio/ics23": { + "version": "0.6.8", + "resolved": "https://registry.npmjs.org/@confio/ics23/-/ics23-0.6.8.tgz", + "integrity": "sha512-wB6uo+3A50m0sW/EWcU64xpV/8wShZ6bMTa7pF8eYsTrSkQA7oLUIJcs/wb8g4y2Oyq701BaGiO6n/ak5WXO1w==", + "optional": true, + "dependencies": { + "@noble/hashes": "^1.0.0", + "protobufjs": "^6.8.8" + } + }, + "node_modules/@coral-xyz/borsh": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/@coral-xyz/borsh/-/borsh-0.2.6.tgz", + "integrity": "sha512-y6nmHw1bFcJib7sMHsQPpC8r47xhqDZVvhUdna7NUPzpSbOZG6f46N21+aXsQ2w/tG8Ggls488J/ZmwbgVmyjg==", + "dependencies": { + "bn.js": "^5.1.2", + "buffer-layout": "^1.2.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@solana/web3.js": "^1.2.0" + } + }, + "node_modules/@cosmjs/amino": { + "version": "0.30.1", + "resolved": "https://registry.npmjs.org/@cosmjs/amino/-/amino-0.30.1.tgz", + "integrity": "sha512-yNHnzmvAlkETDYIpeCTdVqgvrdt1qgkOXwuRVi8s27UKI5hfqyE9fJ/fuunXE6ZZPnKkjIecDznmuUOMrMvw4w==", + "optional": true, + "dependencies": { + "@cosmjs/crypto": "^0.30.1", + "@cosmjs/encoding": "^0.30.1", + "@cosmjs/math": "^0.30.1", + "@cosmjs/utils": "^0.30.1" + } + }, + "node_modules/@cosmjs/crypto": { + "version": "0.30.1", + "resolved": "https://registry.npmjs.org/@cosmjs/crypto/-/crypto-0.30.1.tgz", + "integrity": "sha512-rAljUlake3MSXs9xAm87mu34GfBLN0h/1uPPV6jEwClWjNkAMotzjC0ab9MARy5FFAvYHL3lWb57bhkbt2GtzQ==", + "optional": true, + "dependencies": { + "@cosmjs/encoding": "^0.30.1", + "@cosmjs/math": "^0.30.1", + "@cosmjs/utils": "^0.30.1", + "@noble/hashes": "^1", + "bn.js": "^5.2.0", + "elliptic": "^6.5.4", + "libsodium-wrappers": "^0.7.6" + } + }, + "node_modules/@cosmjs/encoding": { + "version": "0.30.1", + "resolved": "https://registry.npmjs.org/@cosmjs/encoding/-/encoding-0.30.1.tgz", + "integrity": "sha512-rXmrTbgqwihORwJ3xYhIgQFfMSrwLu1s43RIK9I8EBudPx3KmnmyAKzMOVsRDo9edLFNuZ9GIvysUCwQfq3WlQ==", + "optional": true, + "dependencies": { + "base64-js": "^1.3.0", + "bech32": "^1.1.4", + "readonly-date": "^1.0.0" + } + }, + "node_modules/@cosmjs/encoding/node_modules/bech32": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz", + "integrity": "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==", + "optional": true + }, + "node_modules/@cosmjs/json-rpc": { + "version": "0.30.1", + "resolved": "https://registry.npmjs.org/@cosmjs/json-rpc/-/json-rpc-0.30.1.tgz", + "integrity": "sha512-pitfC/2YN9t+kXZCbNuyrZ6M8abnCC2n62m+JtU9vQUfaEtVsgy+1Fk4TRQ175+pIWSdBMFi2wT8FWVEE4RhxQ==", + "optional": true, + "dependencies": { + "@cosmjs/stream": "^0.30.1", + "xstream": "^11.14.0" + } + }, + "node_modules/@cosmjs/math": { + "version": "0.30.1", + "resolved": "https://registry.npmjs.org/@cosmjs/math/-/math-0.30.1.tgz", + "integrity": "sha512-yaoeI23pin9ZiPHIisa6qqLngfnBR/25tSaWpkTm8Cy10MX70UF5oN4+/t1heLaM6SSmRrhk3psRkV4+7mH51Q==", + "optional": true, + "dependencies": { + "bn.js": "^5.2.0" + } + }, + "node_modules/@cosmjs/proto-signing": { + "version": "0.30.1", + "resolved": "https://registry.npmjs.org/@cosmjs/proto-signing/-/proto-signing-0.30.1.tgz", + "integrity": "sha512-tXh8pPYXV4aiJVhTKHGyeZekjj+K9s2KKojMB93Gcob2DxUjfKapFYBMJSgfKPuWUPEmyr8Q9km2hplI38ILgQ==", + "optional": true, + "dependencies": { + "@cosmjs/amino": "^0.30.1", + "@cosmjs/crypto": "^0.30.1", + "@cosmjs/encoding": "^0.30.1", + "@cosmjs/math": "^0.30.1", + "@cosmjs/utils": "^0.30.1", + "cosmjs-types": "^0.7.1", + "long": "^4.0.0" + } + }, + "node_modules/@cosmjs/socket": { + "version": "0.30.1", + "resolved": "https://registry.npmjs.org/@cosmjs/socket/-/socket-0.30.1.tgz", + "integrity": "sha512-r6MpDL+9N+qOS/D5VaxnPaMJ3flwQ36G+vPvYJsXArj93BjgyFB7BwWwXCQDzZ+23cfChPUfhbINOenr8N2Kow==", + "optional": true, + "dependencies": { + "@cosmjs/stream": "^0.30.1", + "isomorphic-ws": "^4.0.1", + "ws": "^7", + "xstream": "^11.14.0" + } + }, + "node_modules/@cosmjs/stargate": { + "version": "0.30.1", + "resolved": "https://registry.npmjs.org/@cosmjs/stargate/-/stargate-0.30.1.tgz", + "integrity": "sha512-RdbYKZCGOH8gWebO7r6WvNnQMxHrNXInY/gPHPzMjbQF6UatA6fNM2G2tdgS5j5u7FTqlCI10stNXrknaNdzog==", + "optional": true, + "dependencies": { + "@confio/ics23": "^0.6.8", + "@cosmjs/amino": "^0.30.1", + "@cosmjs/encoding": "^0.30.1", + "@cosmjs/math": "^0.30.1", + "@cosmjs/proto-signing": "^0.30.1", + "@cosmjs/stream": "^0.30.1", + "@cosmjs/tendermint-rpc": "^0.30.1", + "@cosmjs/utils": "^0.30.1", + "cosmjs-types": "^0.7.1", + "long": "^4.0.0", + "protobufjs": "~6.11.3", + "xstream": "^11.14.0" + } + }, + "node_modules/@cosmjs/stream": { + "version": "0.30.1", + "resolved": "https://registry.npmjs.org/@cosmjs/stream/-/stream-0.30.1.tgz", + "integrity": "sha512-Fg0pWz1zXQdoxQZpdHRMGvUH5RqS6tPv+j9Eh7Q953UjMlrwZVo0YFLC8OTf/HKVf10E4i0u6aM8D69Q6cNkgQ==", + "optional": true, + "dependencies": { + "xstream": "^11.14.0" + } + }, + "node_modules/@cosmjs/tendermint-rpc": { + "version": "0.30.1", + "resolved": "https://registry.npmjs.org/@cosmjs/tendermint-rpc/-/tendermint-rpc-0.30.1.tgz", + "integrity": "sha512-Z3nCwhXSbPZJ++v85zHObeUggrEHVfm1u18ZRwXxFE9ZMl5mXTybnwYhczuYOl7KRskgwlB+rID0WYACxj4wdQ==", + "optional": true, + "dependencies": { + "@cosmjs/crypto": "^0.30.1", + "@cosmjs/encoding": "^0.30.1", + "@cosmjs/json-rpc": "^0.30.1", + "@cosmjs/math": "^0.30.1", + "@cosmjs/socket": "^0.30.1", + "@cosmjs/stream": "^0.30.1", + "@cosmjs/utils": "^0.30.1", + "axios": "^0.21.2", + "readonly-date": "^1.0.0", + "xstream": "^11.14.0" + } + }, + "node_modules/@cosmjs/tendermint-rpc/node_modules/axios": { + "version": "0.21.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", + "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", + "optional": true, + "dependencies": { + "follow-redirects": "^1.14.0" + } + }, + "node_modules/@cosmjs/utils": { + "version": "0.30.1", + "resolved": "https://registry.npmjs.org/@cosmjs/utils/-/utils-0.30.1.tgz", + "integrity": "sha512-KvvX58MGMWh7xA+N+deCfunkA/ZNDvFLw4YbOmX3f/XBIkqrVY7qlotfy2aNb1kgp6h4B6Yc8YawJPDTfvWX7g==", + "optional": true + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@ethereumjs/common": { + "version": "2.6.5", + "resolved": "https://registry.npmjs.org/@ethereumjs/common/-/common-2.6.5.tgz", + "integrity": "sha512-lRyVQOeCDaIVtgfbowla32pzeDv2Obr8oR8Put5RdUBNRGr1VGPGQNGP6elWIpgK3YdpzqTOh4GyUGOureVeeA==", + "optional": true, + "dependencies": { + "crc-32": "^1.2.0", + "ethereumjs-util": "^7.1.5" + } + }, + "node_modules/@ethereumjs/tx": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/@ethereumjs/tx/-/tx-3.5.2.tgz", + "integrity": "sha512-gQDNJWKrSDGu2w7w0PzVXVBNMzb7wwdDOmOqczmhNjqFxFuIbhVJDwiGEnxFNC2/b8ifcZzY7MLcluizohRzNw==", + "optional": true, + "dependencies": { + "@ethereumjs/common": "^2.6.4", + "ethereumjs-util": "^7.1.5" + } + }, + "node_modules/@ethersproject/abi": { + "version": "5.6.1", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "peer": true, + "dependencies": { + "@ethersproject/address": "^5.6.0", + "@ethersproject/bignumber": "^5.6.0", + "@ethersproject/bytes": "^5.6.0", + "@ethersproject/constants": "^5.6.0", + "@ethersproject/hash": "^5.6.0", + "@ethersproject/keccak256": "^5.6.0", + "@ethersproject/logger": "^5.6.0", + "@ethersproject/properties": "^5.6.0", + "@ethersproject/strings": "^5.6.0" + } + }, + "node_modules/@ethersproject/abi/node_modules/@ethersproject/bytes": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.6.1.tgz", + "integrity": "sha512-NwQt7cKn5+ZE4uDn+X5RAXLp46E1chXoaMmrxAyA0rblpxz8t58lVkrHXoRIn0lz1joQElQ8410GqhTqMOwc6g==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "peer": true, + "dependencies": { + "@ethersproject/logger": "^5.6.0" + } + }, + "node_modules/@ethersproject/abi/node_modules/@ethersproject/keccak256": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.6.0.tgz", + "integrity": "sha512-tk56BJ96mdj/ksi7HWZVWGjCq0WVl/QvfhFQNeL8fxhBlGoP+L80uDCiQcpJPd+2XxkivS3lwRm3E0CXTfol0w==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "peer": true, + "dependencies": { + "@ethersproject/bytes": "^5.6.0", + "js-sha3": "0.8.0" + } + }, + "node_modules/@ethersproject/abstract-provider": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.6.0.tgz", + "integrity": "sha512-oPMFlKLN+g+y7a79cLK3WiLcjWFnZQtXWgnLAbHZcN3s7L4v90UHpTOrLk+m3yr0gt+/h9STTM6zrr7PM8uoRw==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "peer": true, + "dependencies": { + "@ethersproject/bignumber": "^5.6.0", + "@ethersproject/bytes": "^5.6.0", + "@ethersproject/logger": "^5.6.0", + "@ethersproject/networks": "^5.6.0", + "@ethersproject/properties": "^5.6.0", + "@ethersproject/transactions": "^5.6.0", + "@ethersproject/web": "^5.6.0" + } + }, + "node_modules/@ethersproject/abstract-provider/node_modules/@ethersproject/bytes": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.6.1.tgz", + "integrity": "sha512-NwQt7cKn5+ZE4uDn+X5RAXLp46E1chXoaMmrxAyA0rblpxz8t58lVkrHXoRIn0lz1joQElQ8410GqhTqMOwc6g==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "peer": true, + "dependencies": { + "@ethersproject/logger": "^5.6.0" + } + }, + "node_modules/@ethersproject/abstract-signer": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.6.0.tgz", + "integrity": "sha512-WOqnG0NJKtI8n0wWZPReHtaLkDByPL67tn4nBaDAhmVq8sjHTPbCdz4DRhVu/cfTOvfy9w3iq5QZ7BX7zw56BQ==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "peer": true, + "dependencies": { + "@ethersproject/abstract-provider": "^5.6.0", + "@ethersproject/bignumber": "^5.6.0", + "@ethersproject/bytes": "^5.6.0", + "@ethersproject/logger": "^5.6.0", + "@ethersproject/properties": "^5.6.0" + } + }, + "node_modules/@ethersproject/abstract-signer/node_modules/@ethersproject/bytes": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.6.1.tgz", + "integrity": "sha512-NwQt7cKn5+ZE4uDn+X5RAXLp46E1chXoaMmrxAyA0rblpxz8t58lVkrHXoRIn0lz1joQElQ8410GqhTqMOwc6g==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "peer": true, + "dependencies": { + "@ethersproject/logger": "^5.6.0" + } + }, + "node_modules/@ethersproject/address": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.6.0.tgz", + "integrity": "sha512-6nvhYXjbXsHPS+30sHZ+U4VMagFC/9zAk6Gd/h3S21YW4+yfb0WfRtaAIZ4kfM4rrVwqiy284LP0GtL5HXGLxQ==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "peer": true, + "dependencies": { + "@ethersproject/bignumber": "^5.6.0", + "@ethersproject/bytes": "^5.6.0", + "@ethersproject/keccak256": "^5.6.0", + "@ethersproject/logger": "^5.6.0", + "@ethersproject/rlp": "^5.6.0" + } + }, + "node_modules/@ethersproject/address/node_modules/@ethersproject/bytes": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.6.1.tgz", + "integrity": "sha512-NwQt7cKn5+ZE4uDn+X5RAXLp46E1chXoaMmrxAyA0rblpxz8t58lVkrHXoRIn0lz1joQElQ8410GqhTqMOwc6g==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "peer": true, + "dependencies": { + "@ethersproject/logger": "^5.6.0" + } + }, + "node_modules/@ethersproject/address/node_modules/@ethersproject/keccak256": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.6.0.tgz", + "integrity": "sha512-tk56BJ96mdj/ksi7HWZVWGjCq0WVl/QvfhFQNeL8fxhBlGoP+L80uDCiQcpJPd+2XxkivS3lwRm3E0CXTfol0w==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "peer": true, + "dependencies": { + "@ethersproject/bytes": "^5.6.0", + "js-sha3": "0.8.0" + } + }, + "node_modules/@ethersproject/base64": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.7.0.tgz", + "integrity": "sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/bytes": "^5.7.0" + } + }, + "node_modules/@ethersproject/bignumber": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.6.0.tgz", + "integrity": "sha512-VziMaXIUHQlHJmkv1dlcd6GY2PmT0khtAqaMctCIDogxkrarMzA9L94KN1NeXqqOfFD6r0sJT3vCTOFSmZ07DA==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "peer": true, + "dependencies": { + "@ethersproject/bytes": "^5.6.0", + "@ethersproject/logger": "^5.6.0", + "bn.js": "^4.11.9" + } + }, + "node_modules/@ethersproject/bignumber/node_modules/@ethersproject/bytes": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.6.1.tgz", + "integrity": "sha512-NwQt7cKn5+ZE4uDn+X5RAXLp46E1chXoaMmrxAyA0rblpxz8t58lVkrHXoRIn0lz1joQElQ8410GqhTqMOwc6g==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "peer": true, + "dependencies": { + "@ethersproject/logger": "^5.6.0" + } + }, + "node_modules/@ethersproject/bignumber/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "license": "MIT", + "peer": true + }, + "node_modules/@ethersproject/bytes": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.7.0.tgz", + "integrity": "sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/logger": "^5.7.0" + } + }, + "node_modules/@ethersproject/bytes/node_modules/@ethersproject/logger": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.7.0.tgz", + "integrity": "sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT" + }, + "node_modules/@ethersproject/constants": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.6.0.tgz", + "integrity": "sha512-SrdaJx2bK0WQl23nSpV/b1aq293Lh0sUaZT/yYKPDKn4tlAbkH96SPJwIhwSwTsoQQZxuh1jnqsKwyymoiBdWA==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "peer": true, + "dependencies": { + "@ethersproject/bignumber": "^5.6.0" + } + }, + "node_modules/@ethersproject/contracts": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/contracts/-/contracts-5.7.0.tgz", + "integrity": "sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "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" + } + }, + "node_modules/@ethersproject/contracts/node_modules/@ethersproject/abi": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.7.0.tgz", + "integrity": "sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "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" + } + }, + "node_modules/@ethersproject/contracts/node_modules/@ethersproject/abstract-provider": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz", + "integrity": "sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "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" + } + }, + "node_modules/@ethersproject/contracts/node_modules/@ethersproject/abstract-signer": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.7.0.tgz", + "integrity": "sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "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" + } + }, + "node_modules/@ethersproject/contracts/node_modules/@ethersproject/address": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz", + "integrity": "sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "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" + } + }, + "node_modules/@ethersproject/contracts/node_modules/@ethersproject/bignumber": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.7.0.tgz", + "integrity": "sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "bn.js": "^5.2.1" + } + }, + "node_modules/@ethersproject/contracts/node_modules/@ethersproject/constants": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.7.0.tgz", + "integrity": "sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/bignumber": "^5.7.0" + } + }, + "node_modules/@ethersproject/contracts/node_modules/@ethersproject/hash": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.7.0.tgz", + "integrity": "sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "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" + } + }, + "node_modules/@ethersproject/contracts/node_modules/@ethersproject/logger": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.7.0.tgz", + "integrity": "sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT" + }, + "node_modules/@ethersproject/contracts/node_modules/@ethersproject/networks": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.7.1.tgz", + "integrity": "sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/logger": "^5.7.0" + } + }, + "node_modules/@ethersproject/contracts/node_modules/@ethersproject/properties": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.7.0.tgz", + "integrity": "sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/logger": "^5.7.0" + } + }, + "node_modules/@ethersproject/contracts/node_modules/@ethersproject/rlp": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.7.0.tgz", + "integrity": "sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0" + } + }, + "node_modules/@ethersproject/contracts/node_modules/@ethersproject/strings": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.7.0.tgz", + "integrity": "sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/constants": "^5.7.0", + "@ethersproject/logger": "^5.7.0" + } + }, + "node_modules/@ethersproject/contracts/node_modules/@ethersproject/transactions": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.7.0.tgz", + "integrity": "sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "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" + } + }, + "node_modules/@ethersproject/contracts/node_modules/@ethersproject/web": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/@ethersproject/web/-/web-5.7.1.tgz", + "integrity": "sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "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" + } + }, + "node_modules/@ethersproject/hash": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.6.0.tgz", + "integrity": "sha512-fFd+k9gtczqlr0/BruWLAu7UAOas1uRRJvOR84uDf4lNZ+bTkGl366qvniUZHKtlqxBRU65MkOobkmvmpHU+jA==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "peer": true, + "dependencies": { + "@ethersproject/abstract-signer": "^5.6.0", + "@ethersproject/address": "^5.6.0", + "@ethersproject/bignumber": "^5.6.0", + "@ethersproject/bytes": "^5.6.0", + "@ethersproject/keccak256": "^5.6.0", + "@ethersproject/logger": "^5.6.0", + "@ethersproject/properties": "^5.6.0", + "@ethersproject/strings": "^5.6.0" + } + }, + "node_modules/@ethersproject/hash/node_modules/@ethersproject/bytes": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.6.1.tgz", + "integrity": "sha512-NwQt7cKn5+ZE4uDn+X5RAXLp46E1chXoaMmrxAyA0rblpxz8t58lVkrHXoRIn0lz1joQElQ8410GqhTqMOwc6g==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "peer": true, + "dependencies": { + "@ethersproject/logger": "^5.6.0" + } + }, + "node_modules/@ethersproject/hash/node_modules/@ethersproject/keccak256": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.6.0.tgz", + "integrity": "sha512-tk56BJ96mdj/ksi7HWZVWGjCq0WVl/QvfhFQNeL8fxhBlGoP+L80uDCiQcpJPd+2XxkivS3lwRm3E0CXTfol0w==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "peer": true, + "dependencies": { + "@ethersproject/bytes": "^5.6.0", + "js-sha3": "0.8.0" + } + }, + "node_modules/@ethersproject/keccak256": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.7.0.tgz", + "integrity": "sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/bytes": "^5.7.0", + "js-sha3": "0.8.0" + } + }, + "node_modules/@ethersproject/logger": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.6.0.tgz", + "integrity": "sha512-BiBWllUROH9w+P21RzoxJKzqoqpkyM1pRnEKG69bulE9TSQD8SAIvTQqIMZmmCO8pUNkgLP1wndX1gKghSpBmg==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "peer": true + }, + "node_modules/@ethersproject/networks": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.6.2.tgz", + "integrity": "sha512-9uEzaJY7j5wpYGTojGp8U89mSsgQLc40PCMJLMCnFXTs7nhBveZ0t7dbqWUNrepWTszDbFkYD6WlL8DKx5huHA==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "peer": true, + "dependencies": { + "@ethersproject/logger": "^5.6.0" + } + }, + "node_modules/@ethersproject/properties": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.6.0.tgz", + "integrity": "sha512-szoOkHskajKePTJSZ46uHUWWkbv7TzP2ypdEK6jGMqJaEt2sb0jCgfBo0gH0m2HBpRixMuJ6TBRaQCF7a9DoCg==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "peer": true, + "dependencies": { + "@ethersproject/logger": "^5.6.0" + } + }, + "node_modules/@ethersproject/providers": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/@ethersproject/providers/-/providers-5.7.2.tgz", + "integrity": "sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "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" + } + }, + "node_modules/@ethersproject/providers/node_modules/@ethersproject/abstract-provider": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz", + "integrity": "sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "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" + } + }, + "node_modules/@ethersproject/providers/node_modules/@ethersproject/abstract-signer": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.7.0.tgz", + "integrity": "sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "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" + } + }, + "node_modules/@ethersproject/providers/node_modules/@ethersproject/address": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz", + "integrity": "sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "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" + } + }, + "node_modules/@ethersproject/providers/node_modules/@ethersproject/basex": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/basex/-/basex-5.7.0.tgz", + "integrity": "sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/properties": "^5.7.0" + } + }, + "node_modules/@ethersproject/providers/node_modules/@ethersproject/bignumber": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.7.0.tgz", + "integrity": "sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "bn.js": "^5.2.1" + } + }, + "node_modules/@ethersproject/providers/node_modules/@ethersproject/constants": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.7.0.tgz", + "integrity": "sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/bignumber": "^5.7.0" + } + }, + "node_modules/@ethersproject/providers/node_modules/@ethersproject/hash": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.7.0.tgz", + "integrity": "sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "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" + } + }, + "node_modules/@ethersproject/providers/node_modules/@ethersproject/logger": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.7.0.tgz", + "integrity": "sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT" + }, + "node_modules/@ethersproject/providers/node_modules/@ethersproject/networks": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.7.1.tgz", + "integrity": "sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/logger": "^5.7.0" + } + }, + "node_modules/@ethersproject/providers/node_modules/@ethersproject/properties": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.7.0.tgz", + "integrity": "sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/logger": "^5.7.0" + } + }, + "node_modules/@ethersproject/providers/node_modules/@ethersproject/random": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/random/-/random-5.7.0.tgz", + "integrity": "sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0" + } + }, + "node_modules/@ethersproject/providers/node_modules/@ethersproject/rlp": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.7.0.tgz", + "integrity": "sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0" + } + }, + "node_modules/@ethersproject/providers/node_modules/@ethersproject/sha2": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/sha2/-/sha2-5.7.0.tgz", + "integrity": "sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "hash.js": "1.1.7" + } + }, + "node_modules/@ethersproject/providers/node_modules/@ethersproject/strings": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.7.0.tgz", + "integrity": "sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/constants": "^5.7.0", + "@ethersproject/logger": "^5.7.0" + } + }, + "node_modules/@ethersproject/providers/node_modules/@ethersproject/transactions": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.7.0.tgz", + "integrity": "sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "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" + } + }, + "node_modules/@ethersproject/providers/node_modules/@ethersproject/web": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/@ethersproject/web/-/web-5.7.1.tgz", + "integrity": "sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "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" + } + }, + "node_modules/@ethersproject/providers/node_modules/bech32": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz", + "integrity": "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==", + "license": "MIT" + }, + "node_modules/@ethersproject/rlp": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.6.0.tgz", + "integrity": "sha512-dz9WR1xpcTL+9DtOT/aDO+YyxSSdO8YIS0jyZwHHSlAmnxA6cKU3TrTd4Xc/bHayctxTgGLYNuVVoiXE4tTq1g==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "peer": true, + "dependencies": { + "@ethersproject/bytes": "^5.6.0", + "@ethersproject/logger": "^5.6.0" + } + }, + "node_modules/@ethersproject/rlp/node_modules/@ethersproject/bytes": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.6.1.tgz", + "integrity": "sha512-NwQt7cKn5+ZE4uDn+X5RAXLp46E1chXoaMmrxAyA0rblpxz8t58lVkrHXoRIn0lz1joQElQ8410GqhTqMOwc6g==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "peer": true, + "dependencies": { + "@ethersproject/logger": "^5.6.0" + } + }, + "node_modules/@ethersproject/signing-key": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.7.0.tgz", + "integrity": "sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "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" + } + }, + "node_modules/@ethersproject/signing-key/node_modules/@ethersproject/logger": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.7.0.tgz", + "integrity": "sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT" + }, + "node_modules/@ethersproject/signing-key/node_modules/@ethersproject/properties": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.7.0.tgz", + "integrity": "sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/logger": "^5.7.0" + } + }, + "node_modules/@ethersproject/solidity": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/solidity/-/solidity-5.7.0.tgz", + "integrity": "sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "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" + } + }, + "node_modules/@ethersproject/solidity/node_modules/@ethersproject/bignumber": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.7.0.tgz", + "integrity": "sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "bn.js": "^5.2.1" + } + }, + "node_modules/@ethersproject/solidity/node_modules/@ethersproject/constants": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.7.0.tgz", + "integrity": "sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/bignumber": "^5.7.0" + } + }, + "node_modules/@ethersproject/solidity/node_modules/@ethersproject/logger": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.7.0.tgz", + "integrity": "sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT" + }, + "node_modules/@ethersproject/solidity/node_modules/@ethersproject/sha2": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/sha2/-/sha2-5.7.0.tgz", + "integrity": "sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "hash.js": "1.1.7" + } + }, + "node_modules/@ethersproject/solidity/node_modules/@ethersproject/strings": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.7.0.tgz", + "integrity": "sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/constants": "^5.7.0", + "@ethersproject/logger": "^5.7.0" + } + }, + "node_modules/@ethersproject/strings": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.6.0.tgz", + "integrity": "sha512-uv10vTtLTZqrJuqBZR862ZQjTIa724wGPWQqZrofaPI/kUsf53TBG0I0D+hQ1qyNtllbNzaW+PDPHHUI6/65Mg==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "peer": true, + "dependencies": { + "@ethersproject/bytes": "^5.6.0", + "@ethersproject/constants": "^5.6.0", + "@ethersproject/logger": "^5.6.0" + } + }, + "node_modules/@ethersproject/strings/node_modules/@ethersproject/bytes": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.6.1.tgz", + "integrity": "sha512-NwQt7cKn5+ZE4uDn+X5RAXLp46E1chXoaMmrxAyA0rblpxz8t58lVkrHXoRIn0lz1joQElQ8410GqhTqMOwc6g==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "peer": true, + "dependencies": { + "@ethersproject/logger": "^5.6.0" + } + }, + "node_modules/@ethersproject/transactions": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.6.0.tgz", + "integrity": "sha512-4HX+VOhNjXHZyGzER6E/LVI2i6lf9ejYeWD6l4g50AdmimyuStKc39kvKf1bXWQMg7QNVh+uC7dYwtaZ02IXeg==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "peer": true, + "dependencies": { + "@ethersproject/address": "^5.6.0", + "@ethersproject/bignumber": "^5.6.0", + "@ethersproject/bytes": "^5.6.0", + "@ethersproject/constants": "^5.6.0", + "@ethersproject/keccak256": "^5.6.0", + "@ethersproject/logger": "^5.6.0", + "@ethersproject/properties": "^5.6.0", + "@ethersproject/rlp": "^5.6.0", + "@ethersproject/signing-key": "^5.6.0" + } + }, + "node_modules/@ethersproject/transactions/node_modules/@ethersproject/bytes": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.6.1.tgz", + "integrity": "sha512-NwQt7cKn5+ZE4uDn+X5RAXLp46E1chXoaMmrxAyA0rblpxz8t58lVkrHXoRIn0lz1joQElQ8410GqhTqMOwc6g==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "peer": true, + "dependencies": { + "@ethersproject/logger": "^5.6.0" + } + }, + "node_modules/@ethersproject/transactions/node_modules/@ethersproject/keccak256": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.6.0.tgz", + "integrity": "sha512-tk56BJ96mdj/ksi7HWZVWGjCq0WVl/QvfhFQNeL8fxhBlGoP+L80uDCiQcpJPd+2XxkivS3lwRm3E0CXTfol0w==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "peer": true, + "dependencies": { + "@ethersproject/bytes": "^5.6.0", + "js-sha3": "0.8.0" + } + }, + "node_modules/@ethersproject/transactions/node_modules/@ethersproject/signing-key": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.6.0.tgz", + "integrity": "sha512-S+njkhowmLeUu/r7ir8n78OUKx63kBdMCPssePS89So1TH4hZqnWFsThEd/GiXYp9qMxVrydf7KdM9MTGPFukA==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "peer": true, + "dependencies": { + "@ethersproject/bytes": "^5.6.0", + "@ethersproject/logger": "^5.6.0", + "@ethersproject/properties": "^5.6.0", + "bn.js": "^4.11.9", + "elliptic": "6.5.4", + "hash.js": "1.1.7" + } + }, + "node_modules/@ethersproject/transactions/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "license": "MIT", + "peer": true + }, + "node_modules/@ethersproject/units": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/units/-/units-5.7.0.tgz", + "integrity": "sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/constants": "^5.7.0", + "@ethersproject/logger": "^5.7.0" + } + }, + "node_modules/@ethersproject/units/node_modules/@ethersproject/bignumber": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.7.0.tgz", + "integrity": "sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "bn.js": "^5.2.1" + } + }, + "node_modules/@ethersproject/units/node_modules/@ethersproject/constants": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.7.0.tgz", + "integrity": "sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/bignumber": "^5.7.0" + } + }, + "node_modules/@ethersproject/units/node_modules/@ethersproject/logger": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.7.0.tgz", + "integrity": "sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT" + }, + "node_modules/@ethersproject/wallet": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/wallet/-/wallet-5.7.0.tgz", + "integrity": "sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "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" + } + }, + "node_modules/@ethersproject/wallet/node_modules/@ethersproject/abstract-provider": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz", + "integrity": "sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "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" + } + }, + "node_modules/@ethersproject/wallet/node_modules/@ethersproject/abstract-signer": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.7.0.tgz", + "integrity": "sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "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" + } + }, + "node_modules/@ethersproject/wallet/node_modules/@ethersproject/address": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz", + "integrity": "sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "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" + } + }, + "node_modules/@ethersproject/wallet/node_modules/@ethersproject/basex": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/basex/-/basex-5.7.0.tgz", + "integrity": "sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/properties": "^5.7.0" + } + }, + "node_modules/@ethersproject/wallet/node_modules/@ethersproject/bignumber": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.7.0.tgz", + "integrity": "sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "bn.js": "^5.2.1" + } + }, + "node_modules/@ethersproject/wallet/node_modules/@ethersproject/constants": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.7.0.tgz", + "integrity": "sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/bignumber": "^5.7.0" + } + }, + "node_modules/@ethersproject/wallet/node_modules/@ethersproject/hash": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.7.0.tgz", + "integrity": "sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "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" + } + }, + "node_modules/@ethersproject/wallet/node_modules/@ethersproject/hdnode": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/hdnode/-/hdnode-5.7.0.tgz", + "integrity": "sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "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" + } + }, + "node_modules/@ethersproject/wallet/node_modules/@ethersproject/json-wallets": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/json-wallets/-/json-wallets-5.7.0.tgz", + "integrity": "sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "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" + } + }, + "node_modules/@ethersproject/wallet/node_modules/@ethersproject/logger": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.7.0.tgz", + "integrity": "sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT" + }, + "node_modules/@ethersproject/wallet/node_modules/@ethersproject/networks": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.7.1.tgz", + "integrity": "sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/logger": "^5.7.0" + } + }, + "node_modules/@ethersproject/wallet/node_modules/@ethersproject/pbkdf2": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/pbkdf2/-/pbkdf2-5.7.0.tgz", + "integrity": "sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/sha2": "^5.7.0" + } + }, + "node_modules/@ethersproject/wallet/node_modules/@ethersproject/properties": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.7.0.tgz", + "integrity": "sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/logger": "^5.7.0" + } + }, + "node_modules/@ethersproject/wallet/node_modules/@ethersproject/random": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/random/-/random-5.7.0.tgz", + "integrity": "sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0" + } + }, + "node_modules/@ethersproject/wallet/node_modules/@ethersproject/rlp": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.7.0.tgz", + "integrity": "sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0" + } + }, + "node_modules/@ethersproject/wallet/node_modules/@ethersproject/sha2": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/sha2/-/sha2-5.7.0.tgz", + "integrity": "sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "hash.js": "1.1.7" + } + }, + "node_modules/@ethersproject/wallet/node_modules/@ethersproject/strings": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.7.0.tgz", + "integrity": "sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/constants": "^5.7.0", + "@ethersproject/logger": "^5.7.0" + } + }, + "node_modules/@ethersproject/wallet/node_modules/@ethersproject/transactions": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.7.0.tgz", + "integrity": "sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "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" + } + }, + "node_modules/@ethersproject/wallet/node_modules/@ethersproject/web": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/@ethersproject/web/-/web-5.7.1.tgz", + "integrity": "sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "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" + } + }, + "node_modules/@ethersproject/wallet/node_modules/@ethersproject/wordlists": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/wordlists/-/wordlists-5.7.0.tgz", + "integrity": "sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "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" + } + }, + "node_modules/@ethersproject/web": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/@ethersproject/web/-/web-5.6.0.tgz", + "integrity": "sha512-G/XHj0hV1FxI2teHRfCGvfBUHFmU+YOSbCxlAMqJklxSa7QMiHFQfAxvwY2PFqgvdkxEKwRNr/eCjfAPEm2Ctg==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "peer": true, + "dependencies": { + "@ethersproject/base64": "^5.6.0", + "@ethersproject/bytes": "^5.6.0", + "@ethersproject/logger": "^5.6.0", + "@ethersproject/properties": "^5.6.0", + "@ethersproject/strings": "^5.6.0" + } + }, + "node_modules/@ethersproject/web/node_modules/@ethersproject/base64": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.6.0.tgz", + "integrity": "sha512-2Neq8wxJ9xHxCF9TUgmKeSh9BXJ6OAxWfeGWvbauPh8FuHEjamgHilllx8KkSd5ErxyHIX7Xv3Fkcud2kY9ezw==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "peer": true, + "dependencies": { + "@ethersproject/bytes": "^5.6.0" + } + }, + "node_modules/@ethersproject/web/node_modules/@ethersproject/bytes": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.6.1.tgz", + "integrity": "sha512-NwQt7cKn5+ZE4uDn+X5RAXLp46E1chXoaMmrxAyA0rblpxz8t58lVkrHXoRIn0lz1joQElQ8410GqhTqMOwc6g==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "peer": true, + "dependencies": { + "@ethersproject/logger": "^5.6.0" + } + }, + "node_modules/@graphql-typed-document-node/core": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@graphql-typed-document-node/core/-/core-3.2.0.tgz", + "integrity": "sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ==", + "optional": true, + "peerDependencies": { + "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@improbable-eng/grpc-web": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@improbable-eng/grpc-web/-/grpc-web-0.15.0.tgz", + "integrity": "sha512-ERft9/0/8CmYalqOVnJnpdDry28q+j+nAlFFARdjyxXDJ+Mhgv9+F600QC8BR9ygOfrXRlAk6CvST2j+JCpQPg==", + "dependencies": { + "browser-headers": "^0.4.1" + }, + "peerDependencies": { + "google-protobuf": "^3.14.0" + } + }, + "node_modules/@improbable-eng/grpc-web-node-http-transport": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@improbable-eng/grpc-web-node-http-transport/-/grpc-web-node-http-transport-0.15.0.tgz", + "integrity": "sha512-HLgJfVolGGpjc9DWPhmMmXJx8YGzkek7jcCFO1YYkSOoO81MWRZentPOd/JiKiZuU08wtc4BG+WNuGzsQB5jZA==", + "peerDependencies": { + "@improbable-eng/grpc-web": ">=0.13.0" + } + }, + "node_modules/@injectivelabs/core-proto-ts": { + "version": "0.0.14", + "resolved": "https://registry.npmjs.org/@injectivelabs/core-proto-ts/-/core-proto-ts-0.0.14.tgz", + "integrity": "sha512-NZWlgBzgVrXow9IknFQHvcYKX4QkUD25taRigoNYQK8PDn4+VXd9xM5WFUDRhzm2smTCguyl/+MghpEp4oTPWw==", + "optional": true, + "dependencies": { + "@injectivelabs/grpc-web": "^0.0.1", + "google-protobuf": "^3.14.0", + "protobufjs": "^7.0.0", + "rxjs": "^7.4.0" + } + }, + "node_modules/@injectivelabs/core-proto-ts/node_modules/long": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", + "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==", + "optional": true + }, + "node_modules/@injectivelabs/core-proto-ts/node_modules/protobufjs": { + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.2.5.tgz", + "integrity": "sha512-gGXRSXvxQ7UiPgfw8gevrfRWcTlSbOFg+p/N+JVJEK5VhueL2miT6qTymqAmjr1Q5WbOCyJbyrk6JfWKwlFn6A==", + "hasInstallScript": true, + "optional": true, + "dependencies": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/node": ">=13.7.0", + "long": "^5.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/@injectivelabs/exceptions": { + "version": "1.14.4", + "resolved": "https://registry.npmjs.org/@injectivelabs/exceptions/-/exceptions-1.14.4.tgz", + "integrity": "sha512-mJVzDsw+anL85NzXl0l1Ortk7MEgHdD5EQwFp/XaI1U3cupsHKUfHpAuXjggD+XQVFeWoYOFzk4CJPCBgz6u+w==", + "hasInstallScript": true, + "optional": true, + "dependencies": { + "@injectivelabs/grpc-web": "^0.0.1", + "@injectivelabs/ts-types": "^1.14.4", + "http-status-codes": "^2.2.0", + "link-module-alias": "^1.2.0", + "shx": "^0.3.2" + } + }, + "node_modules/@injectivelabs/grpc-web": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/@injectivelabs/grpc-web/-/grpc-web-0.0.1.tgz", + "integrity": "sha512-Pu5YgaZp+OvR5UWfqbrPdHer3+gDf+b5fQoY+t2VZx1IAVHX8bzbN9EreYTvTYtFeDpYRWM8P7app2u4EX5wTw==", + "optional": true, + "dependencies": { + "browser-headers": "^0.4.1" + }, + "peerDependencies": { + "google-protobuf": "^3.14.0" + } + }, + "node_modules/@injectivelabs/grpc-web-node-http-transport": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/@injectivelabs/grpc-web-node-http-transport/-/grpc-web-node-http-transport-0.0.2.tgz", + "integrity": "sha512-rpyhXLiGY/UMs6v6YmgWHJHiO9l0AgDyVNv+jcutNVt4tQrmNvnpvz2wCAGOFtq5LuX/E9ChtTVpk3gWGqXcGA==", + "optional": true, + "peerDependencies": { + "@injectivelabs/grpc-web": ">=0.0.1" + } + }, + "node_modules/@injectivelabs/grpc-web-react-native-transport": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/@injectivelabs/grpc-web-react-native-transport/-/grpc-web-react-native-transport-0.0.2.tgz", + "integrity": "sha512-mk+aukQXnYNgPsPnu3KBi+FD0ZHQpazIlaBZ2jNZG7QAVmxTWtv3R66Zoq99Wx2dnE946NsZBYAoa0K5oSjnow==", + "optional": true, + "peerDependencies": { + "@injectivelabs/grpc-web": ">=0.0.1" + } + }, + "node_modules/@injectivelabs/indexer-proto-ts": { + "version": "1.10.8-rc.4", + "resolved": "https://registry.npmjs.org/@injectivelabs/indexer-proto-ts/-/indexer-proto-ts-1.10.8-rc.4.tgz", + "integrity": "sha512-IwbepTfsHHAv3Z36As6yH/+HIplOEpUu6SFHBCVgdSIaQ8GuvTib4HETiVnV4mjYqoyVgWs+zLSAfih46rdMJQ==", + "optional": true, + "dependencies": { + "@injectivelabs/grpc-web": "^0.0.1", + "google-protobuf": "^3.14.0", + "protobufjs": "^7.0.0", + "rxjs": "^7.4.0" + } + }, + "node_modules/@injectivelabs/indexer-proto-ts/node_modules/long": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", + "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==", + "optional": true + }, + "node_modules/@injectivelabs/indexer-proto-ts/node_modules/protobufjs": { + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.2.5.tgz", + "integrity": "sha512-gGXRSXvxQ7UiPgfw8gevrfRWcTlSbOFg+p/N+JVJEK5VhueL2miT6qTymqAmjr1Q5WbOCyJbyrk6JfWKwlFn6A==", + "hasInstallScript": true, + "optional": true, + "dependencies": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/node": ">=13.7.0", + "long": "^5.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/@injectivelabs/mito-proto-ts": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@injectivelabs/mito-proto-ts/-/mito-proto-ts-1.0.9.tgz", + "integrity": "sha512-+TZMvJ4SHwcn6SFPdqaiQFZdNhjH7hyRFozY15nOTC2utdGij9jEsjz1NsyOejfYDA0s1z5Wm1SgrMYKaVpAmQ==", + "optional": true, + "dependencies": { + "@injectivelabs/grpc-web": "^0.0.1", + "google-protobuf": "^3.14.0", + "protobufjs": "^7.0.0", + "rxjs": "^7.4.0" + } + }, + "node_modules/@injectivelabs/mito-proto-ts/node_modules/long": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", + "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==", + "optional": true + }, + "node_modules/@injectivelabs/mito-proto-ts/node_modules/protobufjs": { + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.2.5.tgz", + "integrity": "sha512-gGXRSXvxQ7UiPgfw8gevrfRWcTlSbOFg+p/N+JVJEK5VhueL2miT6qTymqAmjr1Q5WbOCyJbyrk6JfWKwlFn6A==", + "hasInstallScript": true, + "optional": true, + "dependencies": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/node": ">=13.7.0", + "long": "^5.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/@injectivelabs/networks": { + "version": "1.10.12", + "resolved": "https://registry.npmjs.org/@injectivelabs/networks/-/networks-1.10.12.tgz", + "integrity": "sha512-tTHyLls1Nik5QTs/S03qqG2y/ITvNwI8CJOQbMmmsr1CL2CdjJBtzRYn9Dyx2p8XgzRFf9hmlybpe20tq9O3SA==", + "hasInstallScript": true, + "optional": true, + "dependencies": { + "@injectivelabs/exceptions": "^1.10.12", + "@injectivelabs/ts-types": "^1.10.12", + "@injectivelabs/utils": "^1.10.12", + "link-module-alias": "^1.2.0", + "shx": "^0.3.2" + } + }, + "node_modules/@injectivelabs/sdk-ts": { + "version": "1.10.72", + "resolved": "https://registry.npmjs.org/@injectivelabs/sdk-ts/-/sdk-ts-1.10.72.tgz", + "integrity": "sha512-A5mHNNBgO4fI1c/7CZ0bGfVXliy8laP+VaYZ++aWh1YyudoZw4CTCEmLetZRy7AUU3XcfbHa8sAImRi7db+v6Q==", + "hasInstallScript": true, + "optional": true, + "dependencies": { + "@apollo/client": "^3.5.8", + "@cosmjs/amino": "^0.30.1", + "@cosmjs/proto-signing": "^0.30.1", + "@cosmjs/stargate": "^0.30.1", + "@ethersproject/bytes": "^5.7.0", + "@injectivelabs/core-proto-ts": "^0.0.14", + "@injectivelabs/exceptions": "^1.10.12", + "@injectivelabs/grpc-web": "^0.0.1", + "@injectivelabs/grpc-web-node-http-transport": "^0.0.2", + "@injectivelabs/grpc-web-react-native-transport": "^0.0.2", + "@injectivelabs/indexer-proto-ts": "1.10.8-rc.4", + "@injectivelabs/mito-proto-ts": "1.0.9", + "@injectivelabs/networks": "^1.10.12", + "@injectivelabs/test-utils": "^1.10.12", + "@injectivelabs/token-metadata": "^1.10.42", + "@injectivelabs/ts-types": "^1.10.12", + "@injectivelabs/utils": "^1.10.12", + "@metamask/eth-sig-util": "^4.0.0", + "axios": "^0.27.2", + "bech32": "^2.0.0", + "bip39": "^3.0.4", + "cosmjs-types": "^0.7.1", + "eth-crypto": "^2.6.0", + "ethereumjs-util": "^7.1.4", + "ethers": "^5.7.2", + "google-protobuf": "^3.21.0", + "graphql": "^16.3.0", + "http-status-codes": "^2.2.0", + "js-sha3": "^0.8.0", + "jscrypto": "^1.0.3", + "keccak256": "^1.0.6", + "link-module-alias": "^1.2.0", + "rxjs": "^7.8.0", + "secp256k1": "^4.0.3", + "shx": "^0.3.2", + "snakecase-keys": "^5.4.1" + } + }, + "node_modules/@injectivelabs/sdk-ts/node_modules/axios": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz", + "integrity": "sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==", + "optional": true, + "dependencies": { + "follow-redirects": "^1.14.9", + "form-data": "^4.0.0" + } + }, + "node_modules/@injectivelabs/test-utils": { + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/@injectivelabs/test-utils/-/test-utils-1.14.3.tgz", + "integrity": "sha512-dVe262sACa7YkRr7mfXx58yI/ieuQqm3IMGq7EMweFKI6Kh2gh8FAM2bsDgm1cGewEIhJ9tWh6OM5uNheeVamg==", + "hasInstallScript": true, + "optional": true, + "dependencies": { + "axios": "^0.21.1", + "bignumber.js": "^9.0.1", + "link-module-alias": "^1.2.0", + "shx": "^0.3.2", + "snakecase-keys": "^5.1.2", + "store2": "^2.12.0" + } + }, + "node_modules/@injectivelabs/test-utils/node_modules/axios": { + "version": "0.21.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", + "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", + "optional": true, + "dependencies": { + "follow-redirects": "^1.14.0" + } + }, + "node_modules/@injectivelabs/token-metadata": { + "version": "1.14.4", + "resolved": "https://registry.npmjs.org/@injectivelabs/token-metadata/-/token-metadata-1.14.4.tgz", + "integrity": "sha512-g0jrIFpEdQ4kjUUaMcXWmXWu5owpIGE6GQPj7Gx07kkPTDNDiIfcaHUQ0nzTmcG02h0AhFx1eSpkHZFLSwyG/Q==", + "hasInstallScript": true, + "optional": true, + "dependencies": { + "@injectivelabs/exceptions": "^1.14.4", + "@injectivelabs/networks": "^1.14.4", + "@injectivelabs/ts-types": "^1.14.4", + "@injectivelabs/utils": "^1.14.4", + "@types/lodash.values": "^4.3.6", + "copyfiles": "^2.4.1", + "jsonschema": "^1.4.0", + "link-module-alias": "^1.2.0", + "lodash": "^4.17.21", + "lodash.values": "^4.3.0", + "shx": "^0.3.2" + } + }, + "node_modules/@injectivelabs/token-metadata/node_modules/@injectivelabs/networks": { + "version": "1.14.4", + "resolved": "https://registry.npmjs.org/@injectivelabs/networks/-/networks-1.14.4.tgz", + "integrity": "sha512-2DbbaiI/v5PY+X90zhFMstVcVokpxEytMWZZvRKls6YqSBERhE3lxUF696lk0TEecfZ37CikuxZ7E9hx+eXg2A==", + "hasInstallScript": true, + "optional": true, + "dependencies": { + "@injectivelabs/exceptions": "^1.14.4", + "@injectivelabs/ts-types": "^1.14.4", + "@injectivelabs/utils": "^1.14.4", + "link-module-alias": "^1.2.0", + "shx": "^0.3.2" + } + }, + "node_modules/@injectivelabs/token-metadata/node_modules/@injectivelabs/utils": { + "version": "1.14.4", + "resolved": "https://registry.npmjs.org/@injectivelabs/utils/-/utils-1.14.4.tgz", + "integrity": "sha512-eyx6XpgqdmEhEhdwNT4zEDYx+wXOhW01foCGC6e0Dmmrcxv5Bjd+R2BuLopKJ9h22OYNJm6dAX3ZtcoFwpFYbQ==", + "hasInstallScript": true, + "optional": true, + "dependencies": { + "@injectivelabs/exceptions": "^1.14.4", + "@injectivelabs/ts-types": "^1.14.4", + "axios": "^0.21.1", + "bignumber.js": "^9.0.1", + "http-status-codes": "^2.2.0", + "link-module-alias": "^1.2.0", + "shx": "^0.3.2", + "snakecase-keys": "^5.1.2", + "store2": "^2.12.0" + } + }, + "node_modules/@injectivelabs/token-metadata/node_modules/axios": { + "version": "0.21.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", + "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", + "optional": true, + "dependencies": { + "follow-redirects": "^1.14.0" + } + }, + "node_modules/@injectivelabs/ts-types": { + "version": "1.14.4", + "resolved": "https://registry.npmjs.org/@injectivelabs/ts-types/-/ts-types-1.14.4.tgz", + "integrity": "sha512-c8g81bdrOQoi6S1CbeERRifkwNhjyLWB8lmF7liwRnPjyDciVHfHjikZjVWFLS9tJegNm44N9PWsM4RN9g0rXQ==", + "hasInstallScript": true, + "optional": true, + "dependencies": { + "link-module-alias": "^1.2.0", + "shx": "^0.3.2" + } + }, + "node_modules/@injectivelabs/utils": { + "version": "1.10.12", + "resolved": "https://registry.npmjs.org/@injectivelabs/utils/-/utils-1.10.12.tgz", + "integrity": "sha512-c8al79nxIJgV1cBAdW2TPDGldj/8gm5k0h5TIN/AJs8/AeIjpTwwVGfLY3QvPOpRsxuQ9CjBkTXrAcSL1wwkcw==", + "hasInstallScript": true, + "optional": true, + "dependencies": { + "@injectivelabs/exceptions": "^1.10.12", + "@injectivelabs/ts-types": "^1.10.12", + "axios": "^0.21.1", + "bignumber.js": "^9.0.1", + "http-status-codes": "^2.2.0", + "link-module-alias": "^1.2.0", + "shx": "^0.3.2", + "snakecase-keys": "^5.1.2", + "store2": "^2.12.0" + } + }, + "node_modules/@injectivelabs/utils/node_modules/axios": { + "version": "0.21.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", + "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", + "optional": true, + "dependencies": { + "follow-redirects": "^1.14.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@metamask/eth-sig-util": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@metamask/eth-sig-util/-/eth-sig-util-4.0.1.tgz", + "integrity": "sha512-tghyZKLHZjcdlDqCA3gNZmLeR0XvOE9U1qoQO9ohyAZT6Pya+H9vkBPcsyXytmYLNgVoin7CKCmweo/R43V+tQ==", + "optional": true, + "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" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/@metamask/eth-sig-util/node_modules/@types/bn.js": { + "version": "4.11.6", + "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-4.11.6.tgz", + "integrity": "sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==", + "optional": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@metamask/eth-sig-util/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "optional": true + }, + "node_modules/@metamask/eth-sig-util/node_modules/ethereumjs-util": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz", + "integrity": "sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw==", + "optional": true, + "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" + } + }, + "node_modules/@mysten/bcs": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/@mysten/bcs/-/bcs-0.7.1.tgz", + "integrity": "sha512-wFPb8bkhwrbiStfZMV5rFM7J+umpke59/dNjDp+UYJKykNlW23LCk2ePyEUvGdb62HGJM1jyOJ8g4egE3OmdKA==", + "dependencies": { + "bs58": "^5.0.0" + } + }, + "node_modules/@mysten/bcs/node_modules/base-x": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-4.0.0.tgz", + "integrity": "sha512-FuwxlW4H5kh37X/oW59pwTzzTKRzfrrQwhmyspRM7swOEZcHtDZSCt45U6oKgtuFE+WYPblePMVIPR4RZrh/hw==" + }, + "node_modules/@mysten/bcs/node_modules/bs58": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/bs58/-/bs58-5.0.0.tgz", + "integrity": "sha512-r+ihvQJvahgYT50JD05dyJNKlmmSlMoOGwn1lCcEzanPglg7TxYjioQUYehQ9mAR/+hOSd2jRc/Z2y5UxBymvQ==", + "dependencies": { + "base-x": "^4.0.0" + } + }, + "node_modules/@mysten/sui.js": { + "version": "0.32.2", + "resolved": "https://registry.npmjs.org/@mysten/sui.js/-/sui.js-0.32.2.tgz", + "integrity": "sha512-/Hm4xkGolJhqj8FvQr7QSHDTlxIvL52mtbOao9f75YjrBh7y1Uh9kbJSY7xiTF1NY9sv6p5hUVlYRJuM0Hvn9A==", + "dependencies": { + "@mysten/bcs": "0.7.1", + "@noble/curves": "^1.0.0", + "@noble/hashes": "^1.3.0", + "@scure/bip32": "^1.3.0", + "@scure/bip39": "^1.2.0", + "@suchipi/femver": "^1.0.0", + "jayson": "^4.0.0", + "rpc-websockets": "^7.5.1", + "superstruct": "^1.0.3", + "tweetnacl": "^1.0.3" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@mysten/sui.js/node_modules/@noble/hashes": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.2.tgz", + "integrity": "sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@mysten/sui.js/node_modules/@types/node": { + "version": "12.20.55", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", + "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==" + }, + "node_modules/@mysten/sui.js/node_modules/jayson": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/jayson/-/jayson-4.1.0.tgz", + "integrity": "sha512-R6JlbyLN53Mjku329XoRT2zJAE6ZgOQ8f91ucYdMCD4nkGCF9kZSrcGXpHIU4jeKj58zUZke2p+cdQchU7Ly7A==", + "dependencies": { + "@types/connect": "^3.4.33", + "@types/node": "^12.12.54", + "@types/ws": "^7.4.4", + "commander": "^2.20.3", + "delay": "^5.0.0", + "es6-promisify": "^5.0.0", + "eyes": "^0.1.8", + "isomorphic-ws": "^4.0.1", + "json-stringify-safe": "^5.0.1", + "JSONStream": "^1.3.5", + "uuid": "^8.3.2", + "ws": "^7.4.5" + }, + "bin": { + "jayson": "bin/jayson.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@mysten/sui.js/node_modules/superstruct": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/superstruct/-/superstruct-1.0.3.tgz", + "integrity": "sha512-8iTn3oSS8nRGn+C2pgXSKPI3jmpm6FExNazNpjvqS6ZUJQCej3PUXEKM8NjHBOs54ExM+LPW/FBRhymrdcCiSg==", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@noble/curves": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.2.0.tgz", + "integrity": "sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==", + "dependencies": { + "@noble/hashes": "1.3.2" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@noble/curves/node_modules/@noble/hashes": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.2.tgz", + "integrity": "sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@noble/ed25519": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@noble/ed25519/-/ed25519-1.7.1.tgz", + "integrity": "sha512-Rk4SkJFaXZiznFyC/t77Q0NKS4FL7TLJJsVG2V2oiEq3kJVeTdxysEe/yRWSpnWMe808XRDJ+VFh5pt/FN5plw==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "license": "MIT" + }, + "node_modules/@noble/hashes": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.1.3.tgz", + "integrity": "sha512-CE0FCR57H2acVI5UOzIGSSIYxZ6v/HOhDR0Ro9VLyhnzLwx0o8W1mmgaqlEUx4049qJDlIBRztv5k+MM8vbO3A==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "license": "MIT" + }, + "node_modules/@openzeppelin/contracts": { + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-4.9.5.tgz", + "integrity": "sha512-ZK+W5mVhRppff9BE6YdR8CC52C8zAvsVAiWhEtQ5+oNxFE6h1WdeWo+FJSF8KKvtxxVYZ7MTP/5KoVpAU3aSWg==" + }, + "node_modules/@project-serum/anchor": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@project-serum/anchor/-/anchor-0.25.0.tgz", + "integrity": "sha512-E6A5Y/ijqpfMJ5psJvbw0kVTzLZFUcOFgs6eSM2M2iWE1lVRF18T6hWZVNl6zqZsoz98jgnNHtVGJMs+ds9A7A==", + "license": "(MIT OR Apache-2.0)", + "dependencies": { + "@project-serum/borsh": "^0.2.5", + "@solana/web3.js": "^1.36.0", + "base64-js": "^1.5.1", + "bn.js": "^5.1.2", + "bs58": "^4.0.1", + "buffer-layout": "^1.2.2", + "camelcase": "^5.3.1", + "cross-fetch": "^3.1.5", + "crypto-hash": "^1.3.0", + "eventemitter3": "^4.0.7", + "js-sha256": "^0.9.0", + "pako": "^2.0.3", + "snake-case": "^3.0.4", + "superstruct": "^0.15.4", + "toml": "^3.0.0" + }, + "engines": { + "node": ">=11" + } + }, + "node_modules/@project-serum/anchor/node_modules/superstruct": { + "version": "0.15.5", + "resolved": "https://registry.npmjs.org/superstruct/-/superstruct-0.15.5.tgz", + "integrity": "sha512-4AOeU+P5UuE/4nOUkmcQdW5y7i9ndt1cQd/3iUe+LTz3RxESf/W/5lg4B74HbDMMv8PHnPnGCQFH45kBcrQYoQ==", + "license": "MIT" + }, + "node_modules/@project-serum/borsh": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/@project-serum/borsh/-/borsh-0.2.5.tgz", + "integrity": "sha512-UmeUkUoKdQ7rhx6Leve1SssMR/Ghv8qrEiyywyxSWg7ooV7StdpPBhciiy5eB3T0qU1BXvdRNC8TdrkxK7WC5Q==", + "license": "Apache-2.0", + "dependencies": { + "bn.js": "^5.1.2", + "buffer-layout": "^1.2.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@solana/web3.js": "^1.2.0" + } + }, + "node_modules/@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", + "license": "BSD-3-Clause", + "dependencies": { + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" + } + }, + "node_modules/@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==", + "license": "BSD-3-Clause" + }, + "node_modules/@scure/base": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.3.tgz", + "integrity": "sha512-/+SgoRjLq7Xlf0CWuLHq2LUZeL/w65kfzAPG5NH9pcmBhs+nunQTn4gvdwgMTIXnt9b2C/1SeL2XiysZEyIC9Q==", + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@scure/bip32": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.3.2.tgz", + "integrity": "sha512-N1ZhksgwD3OBlwTv3R6KFEcPojl/W4ElJOeCZdi+vuI5QmTFwLq3OFf2zd2ROpKvxFdgZ6hUpb0dx9bVNEwYCA==", + "dependencies": { + "@noble/curves": "~1.2.0", + "@noble/hashes": "~1.3.2", + "@scure/base": "~1.1.2" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@scure/bip32/node_modules/@noble/hashes": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.2.tgz", + "integrity": "sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@scure/bip39": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.2.1.tgz", + "integrity": "sha512-Z3/Fsz1yr904dduJD0NpiyRHhRYHdcnyh73FZWiV+/qhWi83wNJ3NWolYqCEN+ZWsUz2TWwajJggcRE9r1zUYg==", + "dependencies": { + "@noble/hashes": "~1.3.0", + "@scure/base": "~1.1.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@scure/bip39/node_modules/@noble/hashes": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.2.tgz", + "integrity": "sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@solana/buffer-layout": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@solana/buffer-layout/-/buffer-layout-4.0.0.tgz", + "integrity": "sha512-lR0EMP2HC3+Mxwd4YcnZb0smnaDw7Bl2IQWZiTevRH5ZZBZn6VRWn3/92E3qdU4SSImJkA6IDHawOHAnx/qUvQ==", + "license": "MIT", + "dependencies": { + "buffer": "~6.0.3" + }, + "engines": { + "node": ">=5.10" + } + }, + "node_modules/@solana/buffer-layout-utils": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@solana/buffer-layout-utils/-/buffer-layout-utils-0.2.0.tgz", + "integrity": "sha512-szG4sxgJGktbuZYDg2FfNmkMi0DYQoVjN2h7ta1W1hPrwzarcFLBq9UpX1UjNXsNpT9dn+chgprtWGioUAr4/g==", + "license": "Apache-2.0", + "dependencies": { + "@solana/buffer-layout": "^4.0.0", + "@solana/web3.js": "^1.32.0", + "bigint-buffer": "^1.1.5", + "bignumber.js": "^9.0.1" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@solana/spl-token": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@solana/spl-token/-/spl-token-0.3.6.tgz", + "integrity": "sha512-P9pTXjDIRvVbjr3J0mCnSamYqLnICeds7IoH1/Ro2R9OBuOHdp5pqKZoscfZ3UYrgnCWUc1bc9M2m/YPHjw+1g==", + "license": "Apache-2.0", + "dependencies": { + "@solana/buffer-layout": "^4.0.0", + "@solana/buffer-layout-utils": "^0.2.0", + "buffer": "^6.0.3" + }, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "@solana/web3.js": "^1.47.4" + } + }, + "node_modules/@solana/web3.js": { + "version": "1.66.2", + "resolved": "https://registry.npmjs.org/@solana/web3.js/-/web3.js-1.66.2.tgz", + "integrity": "sha512-RyaHMR2jGmaesnYP045VLeBGfR/gAW3cvZHzMFGg7bkO+WOYOYp1nEllf0/la4U4qsYGKCsO9eEevR5fhHiVHg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.5", + "@noble/ed25519": "^1.7.0", + "@noble/hashes": "^1.1.2", + "@noble/secp256k1": "^1.6.3", + "@solana/buffer-layout": "^4.0.0", + "bigint-buffer": "^1.1.5", + "bn.js": "^5.0.0", + "borsh": "^0.7.0", + "bs58": "^4.0.1", + "buffer": "6.0.1", + "fast-stable-stringify": "^1.0.0", + "jayson": "^3.4.4", + "node-fetch": "2", + "rpc-websockets": "^7.5.0", + "superstruct": "^0.14.2" + }, + "engines": { + "node": ">=12.20.0" + } + }, + "node_modules/@solana/web3.js/node_modules/@noble/secp256k1": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@noble/secp256k1/-/secp256k1-1.7.1.tgz", + "integrity": "sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ] + }, + "node_modules/@solana/web3.js/node_modules/buffer": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.1.tgz", + "integrity": "sha512-rVAXBwEcEoYtxnHSO5iWyhzV/O1WMtkUYWlfdLS7FjU4PnSJJHEfHXi/uHPI5EwltmOA794gN3bm3/pzuctWjQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/@suchipi/femver": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@suchipi/femver/-/femver-1.0.0.tgz", + "integrity": "sha512-bprE8+K5V+DPX7q2e2K57ImqNBdfGHDIWaGI5xHxZoxbKOuQZn4wzPiUxOAHnsUr3w3xHrWXwN7gnG/iIuEMIg==" + }, + "node_modules/@terra-money/legacy.proto": { + "name": "@terra-money/terra.proto", + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/@terra-money/terra.proto/-/terra.proto-0.1.7.tgz", + "integrity": "sha512-NXD7f6pQCulvo6+mv6MAPzhOkUzRjgYVuHZE/apih+lVnPG5hDBU0rRYnOGGofwvKT5/jQoOENnFn/gioWWnyQ==", + "license": "Apache-2.0", + "dependencies": { + "google-protobuf": "^3.17.3", + "long": "^4.0.0", + "protobufjs": "~6.11.2" + } + }, + "node_modules/@terra-money/terra.js": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/@terra-money/terra.js/-/terra.js-3.1.9.tgz", + "integrity": "sha512-JulSvOHLM56fL7s+cIjIbZeWPBluq883X1soWxA4TG5rKkDythT/DHeLXr3jP5Ld/26VENPSg6lNvK7cEYKpiw==", + "dependencies": { + "@classic-terra/terra.proto": "^1.1.0", + "@terra-money/terra.proto": "^2.1.0", + "axios": "^0.27.2", + "bech32": "^2.0.0", + "bip32": "^2.0.6", + "bip39": "^3.0.3", + "bufferutil": "^4.0.3", + "decimal.js": "^10.2.1", + "jscrypto": "^1.0.1", + "readable-stream": "^3.6.0", + "secp256k1": "^4.0.2", + "tmp": "^0.2.1", + "utf-8-validate": "^5.0.5", + "ws": "^7.5.9" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@terra-money/terra.js/node_modules/axios": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz", + "integrity": "sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==", + "dependencies": { + "follow-redirects": "^1.14.9", + "form-data": "^4.0.0" + } + }, + "node_modules/@terra-money/terra.js/node_modules/ws": { + "version": "7.5.9", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", + "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/@terra-money/terra.proto": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@terra-money/terra.proto/-/terra.proto-2.1.0.tgz", + "integrity": "sha512-rhaMslv3Rkr+QsTQEZs64FKA4QlfO0DfQHaR6yct/EovenMkibDEQ63dEL6yJA6LCaEQGYhyVB9JO9pTUA8ybw==", + "license": "Apache-2.0", + "dependencies": { + "@improbable-eng/grpc-web": "^0.14.1", + "google-protobuf": "^3.17.3", + "long": "^4.0.0", + "protobufjs": "~6.11.2" + } + }, + "node_modules/@terra-money/terra.proto/node_modules/@improbable-eng/grpc-web": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/@improbable-eng/grpc-web/-/grpc-web-0.14.1.tgz", + "integrity": "sha512-XaIYuunepPxoiGVLLHmlnVminUGzBTnXr8Wv7khzmLWbNw4TCwJKX09GSMJlKhu/TRk6gms0ySFxewaETSBqgw==", + "license": "Apache-2.0", + "dependencies": { + "browser-headers": "^0.4.1" + }, + "peerDependencies": { + "google-protobuf": "^3.14.0" + } + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==" + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==" + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==" + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==" + }, + "node_modules/@typechain/ethers-v5": { + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/@typechain/ethers-v5/-/ethers-v5-10.2.1.tgz", + "integrity": "sha512-n3tQmCZjRE6IU4h6lqUGiQ1j866n5MTCBJreNEHHVWXa2u9GJTaeYyU1/k+1qLutkyw+sS6VAN+AbeiTqsxd/A==", + "dependencies": { + "lodash": "^4.17.15", + "ts-essentials": "^7.0.1" + }, + "peerDependencies": { + "@ethersproject/abi": "^5.0.0", + "@ethersproject/providers": "^5.0.0", + "ethers": "^5.1.3", + "typechain": "^8.1.1", + "typescript": ">=4.3.0" + } + }, + "node_modules/@types/argparse": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/@types/argparse/-/argparse-2.0.14.tgz", + "integrity": "sha512-jJ6NMs9rXQ0rsqNt3TL4Elcwhd6wygo3lJOVoiHzURD34vsCcAlw443uGu4PXTtEmMF7sYKoadTCLXNmuJuQGw==" + }, + "node_modules/@types/bn.js": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.0.tgz", + "integrity": "sha512-QSSVYj7pYFN49kW77o2s9xTCwZ8F2xLbjLLSEVh8D2F4JUhZtPAGOFLTD+ffqksBx/u4cE/KImFjyhqCjn/LIA==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/chai": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.3.tgz", + "integrity": "sha512-hC7OMnszpxhZPduX+m+nrx+uFoLkWOMiR4oa/AZF3MuSETYTZmFfJAHqZEM8MVlvfG7BEUcgvtwoCTxBp6hm3g==", + "license": "MIT" + }, + "node_modules/@types/connect": { + "version": "3.4.35", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", + "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "license": "MIT", + "optional": true + }, + "node_modules/@types/lodash": { + "version": "4.14.202", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.202.tgz", + "integrity": "sha512-OvlIYQK9tNneDlS0VN54LLd5uiPCBOp7gS5Z0f1mjoJYBrtStzgmJBxONW3U6OZqdtNzZPmn9BS/7WI7BFFcFQ==", + "optional": true + }, + "node_modules/@types/lodash.values": { + "version": "4.3.9", + "resolved": "https://registry.npmjs.org/@types/lodash.values/-/lodash.values-4.3.9.tgz", + "integrity": "sha512-IJ20OEfqNwm3k8ENwoM3q0yOs4UMpgtD4GqxB4lwBHToGthHWqhyh5DdSgQjioocz0QK2SSBkJfCq95ZTV8BTw==", + "optional": true, + "dependencies": { + "@types/lodash": "*" + } + }, + "node_modules/@types/long": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz", + "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==", + "license": "MIT" + }, + "node_modules/@types/mocha": { + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-9.1.1.tgz", + "integrity": "sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw==", + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "18.19.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.2.tgz", + "integrity": "sha512-6wzfBdbWpe8QykUkXBjtmO3zITA0A3FIjoy+in0Y2K4KrCiRhNYJIdwAPDffZ3G6GnaKaSLSEa9ZuORLfEoiwg==", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/pbkdf2": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@types/pbkdf2/-/pbkdf2-3.1.0.tgz", + "integrity": "sha512-Cf63Rv7jCQ0LaL8tNXmEyqTHuIJxRdlS5vMh1mj5voN4+QFhVZnlZruezqpWYDiJ8UTzhP0VmeLXCmBk66YrMQ==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/prettier": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.3.tgz", + "integrity": "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==" + }, + "node_modules/@types/secp256k1": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@types/secp256k1/-/secp256k1-4.0.3.tgz", + "integrity": "sha512-Da66lEIFeIz9ltsdMZcpQvmrmmoqrfju8pm1BH8WbYjZSwUgCwXLb9C+9XYogwBITnbsSaMdVPb2ekf7TV+03w==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/ws": { + "version": "7.4.7", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-7.4.7.tgz", + "integrity": "sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@ungap/promise-all-settled": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", + "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==", + "license": "ISC" + }, + "node_modules/@wry/caches": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@wry/caches/-/caches-1.0.1.tgz", + "integrity": "sha512-bXuaUNLVVkD20wcGBWRyo7j9N3TxePEWFZj2Y+r9OoUzfqmavM84+mFykRicNsBqatba5JLay1t48wxaXaWnlA==", + "optional": true, + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@wry/context": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/@wry/context/-/context-0.7.4.tgz", + "integrity": "sha512-jmT7Sb4ZQWI5iyu3lobQxICu2nC/vbUhP0vIdd6tHC9PTfenmRmuIFqktc6GH9cgi+ZHnsLWPvfSvc4DrYmKiQ==", + "optional": true, + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@wry/equality": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@wry/equality/-/equality-0.5.7.tgz", + "integrity": "sha512-BRFORjsTuQv5gxcXsuDXx6oGRhuVsEGwZy6LOzRRfgu+eSfxbhUQ9L9YtSEIuIjY/o7g3iWFjrc5eSY1GXP2Dw==", + "optional": true, + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@wry/trie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@wry/trie/-/trie-0.5.0.tgz", + "integrity": "sha512-FNoYzHawTMk/6KMQoEG5O4PuioX19UbwdQKF44yw0nLfOypfQdjtfZzo/UIJWAJ23sNIFbD1Ug9lbaDGMwbqQA==", + "optional": true, + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@xpla/xpla.js": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@xpla/xpla.js/-/xpla.js-0.2.1.tgz", + "integrity": "sha512-+2v9/rxnRaaZBShT232bB3sow0JMe5ghIzLUPy7XJQasf6fu3mmVgMUIl9QCrILkuTZwh3yNsFOvkZTPH28Fmw==", + "license": "MIT", + "dependencies": { + "@ethersproject/bytes": "^5.6.1", + "@ethersproject/keccak256": "^5.6.1", + "@ethersproject/signing-key": "^5.6.2", + "@terra-money/legacy.proto": "npm:@terra-money/terra.proto@^0.1.7", + "@terra-money/terra.proto": "^2.1.0", + "axios": "^0.26.1", + "bech32": "^2.0.0", + "bip32": "^2.0.6", + "bip39": "^3.0.3", + "bufferutil": "^4.0.3", + "crypto-addr-codec": "^0.1.7", + "decimal.js": "^10.2.1", + "elliptic": "^6.5.4", + "ethereumjs-util": "^7.1.5", + "jscrypto": "^1.0.1", + "readable-stream": "^3.6.0", + "secp256k1": "^4.0.2", + "tmp": "^0.2.1", + "utf-8-validate": "^5.0.5", + "ws": "^7.5.8" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@xpla/xpla.js/node_modules/axios": { + "version": "0.26.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.26.1.tgz", + "integrity": "sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.14.8" + } + }, + "node_modules/@xpla/xpla.js/node_modules/ws": { + "version": "7.5.9", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", + "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", + "license": "MIT", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.11.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", + "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.0.tgz", + "integrity": "sha512-FS7hV565M5l1R08MXqo8odwMTB02C2UqzB17RVgu9EyuYFBqJZ3/ZY97sQD5FewVu1UyDFc1yztUDrAwT0EypA==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/aes-js": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz", + "integrity": "sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==", + "license": "MIT" + }, + "node_modules/algo-msgpack-with-bigint": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/algo-msgpack-with-bigint/-/algo-msgpack-with-bigint-2.1.1.tgz", + "integrity": "sha512-F1tGh056XczEaEAqu7s+hlZUDWwOBT70Eq0lfMpBP2YguSQVyxRbprLq5rELXKQOyOaixTWYhMeMQMzP0U5FoQ==", + "engines": { + "node": ">= 10" + } + }, + "node_modules/algosdk": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/algosdk/-/algosdk-2.7.0.tgz", + "integrity": "sha512-sBE9lpV7bup3rZ+q2j3JQaFAE9JwZvjWKX00vPlG8e9txctXbgLL56jZhSWZndqhDI9oI+0P4NldkuQIWdrUyg==", + "dependencies": { + "algo-msgpack-with-bigint": "^2.1.1", + "buffer": "^6.0.3", + "hi-base32": "^0.5.1", + "js-sha256": "^0.9.0", + "js-sha3": "^0.8.0", + "js-sha512": "^0.8.0", + "json-bigint": "^1.0.0", + "tweetnacl": "^1.0.3", + "vlq": "^2.0.4" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/aptos": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/aptos/-/aptos-1.5.0.tgz", + "integrity": "sha512-N7OuRtU7IYHkDkNx+4QS3g/QQGCp+36KzYn3oXPmT7Kttfuv+UKliQVdjy3cLmwd/DCQSh9ObTovwdxnHjUn0g==", + "dependencies": { + "@noble/hashes": "1.1.3", + "@scure/bip39": "1.1.0", + "axios": "0.27.2", + "form-data": "4.0.0", + "tweetnacl": "1.0.3" + }, + "engines": { + "node": ">=11.0.0" + } + }, + "node_modules/aptos/node_modules/@scure/bip39": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.1.0.tgz", + "integrity": "sha512-pwrPOS16VeTKg98dYXQyIjJEcWfz7/1YJIwxUEPFfQPtc86Ym/1sVgQ2RLoD43AazMk2l/unK4ITySSpW2+82w==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "@noble/hashes": "~1.1.1", + "@scure/base": "~1.1.0" + } + }, + "node_modules/aptos/node_modules/axios": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz", + "integrity": "sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==", + "dependencies": { + "follow-redirects": "^1.14.9", + "form-data": "^4.0.0" + } + }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==" + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "license": "Python-2.0" + }, + "node_modules/array-back": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-3.1.0.tgz", + "integrity": "sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==", + "engines": { + "node": ">=6" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + }, + "node_modules/arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" + }, + "node_modules/axios": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.2.tgz", + "integrity": "sha512-7i24Ri4pmDRfJTR7LDBhsOTtcm+9kjX5WiY1X3wIisx6G9So3pfMkEiU7emUBe46oceVImccTEM3k6C5dbVW8A==", + "dependencies": { + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "license": "MIT" + }, + "node_modules/base-x": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.9.tgz", + "integrity": "sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==", + "license": "MIT", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/bech32": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/bech32/-/bech32-2.0.0.tgz", + "integrity": "sha512-LcknSilhIGatDAsY1ak2I8VtGaHNhgMSYVxFrGLXv+xLHytaKZKcaUJJUE7qmBr7h33o5YQwP55pMI0xmkpJwg==", + "license": "MIT" + }, + "node_modules/big-integer": { + "version": "1.6.36", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.36.tgz", + "integrity": "sha512-t70bfa7HYEA1D9idDbmuv7YbsbVkQ+Hp+8KFSul4aE5e/i1bjCNIRYJZlA8Q8p0r9T8cF/RVvwUgRA//FydEyg==", + "license": "Unlicense", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/bigint-buffer": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/bigint-buffer/-/bigint-buffer-1.1.5.tgz", + "integrity": "sha512-trfYco6AoZ+rKhKnxA0hgX0HAbVP/s808/EuDSe2JDzUnCp/xAsli35Orvk67UrTEcwuxZqYZDmfA2RXJgxVvA==", + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "bindings": "^1.3.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/bignumber.js": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.2.tgz", + "integrity": "sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==", + "engines": { + "node": "*" + } + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/binary-parser": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/binary-parser/-/binary-parser-2.2.1.tgz", + "integrity": "sha512-5ATpz/uPDgq5GgEDxTB4ouXCde7q2lqAQlSdBRQVl/AJnxmQmhIfyxJx+0MGu//D5rHQifkfGbWWlaysG0o9NA==", + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "license": "MIT", + "dependencies": { + "file-uri-to-path": "1.0.0" + } + }, + "node_modules/bip32": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/bip32/-/bip32-2.0.6.tgz", + "integrity": "sha512-HpV5OMLLGTjSVblmrtYRfFFKuQB+GArM0+XP8HGWfJ5vxYBqo+DesvJwOdC2WJ3bCkZShGf0QIfoIpeomVzVdA==", + "license": "MIT", + "dependencies": { + "@types/node": "10.12.18", + "bs58check": "^2.1.1", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "tiny-secp256k1": "^1.1.3", + "typeforce": "^1.11.5", + "wif": "^2.0.6" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/bip32/node_modules/@types/node": { + "version": "10.12.18", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.12.18.tgz", + "integrity": "sha512-fh+pAqt4xRzPfqA6eh3Z2y6fyZavRIumvjhaCL753+TVkGKGhpPeyrJG2JftD0T9q4GF00KjefsQ+PQNDdWQaQ==", + "license": "MIT" + }, + "node_modules/bip39": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/bip39/-/bip39-3.0.4.tgz", + "integrity": "sha512-YZKQlb752TrUWqHWj7XAwCSjYEgGAk+/Aas3V7NyjQeZYsztO8JnQUaCWhcnL4T+jL8nvB8typ2jRPzTlgugNw==", + "license": "ISC", + "dependencies": { + "@types/node": "11.11.6", + "create-hash": "^1.1.0", + "pbkdf2": "^3.0.9", + "randombytes": "^2.0.1" + } + }, + "node_modules/bip39/node_modules/@types/node": { + "version": "11.11.6", + "resolved": "https://registry.npmjs.org/@types/node/-/node-11.11.6.tgz", + "integrity": "sha512-Exw4yUWMBXM3X+8oqzJNRqZSwUAaS4+7NdvHqQuFi/d+synz++xmX3QIf+BFqneW8N31R8Ky+sikfZUXq07ggQ==", + "license": "MIT" + }, + "node_modules/bip66": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/bip66/-/bip66-1.1.5.tgz", + "integrity": "sha512-nemMHz95EmS38a26XbbdxIYj5csHd3RMP3H5bwQknX0WYHF01qhpufP42mLOwVICuH2JmhIhXiWs89MfUGL7Xw==", + "optional": true, + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, + "node_modules/blakejs": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/blakejs/-/blakejs-1.2.1.tgz", + "integrity": "sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ==", + "license": "MIT" + }, + "node_modules/bn.js": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", + "license": "MIT" + }, + "node_modules/body-parser": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "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.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/borsh": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/borsh/-/borsh-0.7.0.tgz", + "integrity": "sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA==", + "license": "Apache-2.0", + "dependencies": { + "bn.js": "^5.2.0", + "bs58": "^4.0.0", + "text-encoding-utf-8": "^1.0.2" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "license": "MIT", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==", + "license": "MIT" + }, + "node_modules/browser-headers": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/browser-headers/-/browser-headers-0.4.1.tgz", + "integrity": "sha512-CA9hsySZVo9371qEHjHZtYxV2cFtVj5Wj/ZHi8ooEsrtm4vOnl9Y9HmyYWk9q+05d7K3rdoAE0j3MVEFVvtQtg==", + "license": "Apache-2.0" + }, + "node_modules/browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "license": "ISC" + }, + "node_modules/browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "license": "MIT", + "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" + } + }, + "node_modules/bs58": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", + "integrity": "sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==", + "license": "MIT", + "dependencies": { + "base-x": "^3.0.2" + } + }, + "node_modules/bs58check": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-2.1.2.tgz", + "integrity": "sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==", + "license": "MIT", + "dependencies": { + "bs58": "^4.0.0", + "create-hash": "^1.1.0", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "license": "MIT" + }, + "node_modules/buffer-layout": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/buffer-layout/-/buffer-layout-1.2.2.tgz", + "integrity": "sha512-kWSuLN694+KTk8SrYvCqwP2WcgQjoRCiF5b4QDvkkz8EmgD+aWAIceGFKMIAdmF/pH+vpgNV3d3kAKorcdAmWA==", + "license": "MIT", + "engines": { + "node": ">=4.5" + } + }, + "node_modules/buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==", + "license": "MIT" + }, + "node_modules/bufferutil": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.6.tgz", + "integrity": "sha512-jduaYOYtnio4aIAyc6UbvPCVcgq7nYpVnucyxr6eCYg/Woad9Hf/oxxBRDnGGjPfjUm6j5O/uBWhIu4iLebFaw==", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "node-gyp-build": "^4.3.0" + }, + "engines": { + "node": ">=6.14.2" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", + "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", + "dependencies": { + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.1", + "set-function-length": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/capability": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/capability/-/capability-0.2.5.tgz", + "integrity": "sha512-rsJZYVCgXd08sPqwmaIqjAd5SUTfonV0z/gDJ8D6cN8wQphky1kkAYEqQ+hmDxTw7UihvBfjUVUSY+DBEe44jg==", + "license": "MIT" + }, + "node_modules/chai": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.6.tgz", + "integrity": "sha512-bbcp3YfHCUzMOvKqsztczerVgBKSsEijCySNlHHbX3VG1nskvqjz5Rfso1gGwD6w6oOV3eI60pKuMOV5MV7p3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.2", + "deep-eql": "^3.0.1", + "get-func-name": "^2.0.0", + "loupe": "^2.3.1", + "pathval": "^1.1.1", + "type-detect": "^4.0.5" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "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" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chalk/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chalk/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/chalk/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/chalk/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/chalk/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/chalk/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/check-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "license": "MIT", + "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" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "license": "MIT" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/command-line-args": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.2.1.tgz", + "integrity": "sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==", + "dependencies": { + "array-back": "^3.1.0", + "find-replace": "^3.0.0", + "lodash.camelcase": "^4.3.0", + "typical": "^4.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/command-line-usage": { + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-6.1.3.tgz", + "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" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/command-line-usage/node_modules/array-back": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz", + "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/command-line-usage/node_modules/typical": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", + "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "license": "MIT" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "license": "MIT" + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + }, + "node_modules/copyfiles": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/copyfiles/-/copyfiles-2.4.1.tgz", + "integrity": "sha512-fereAvAvxDrQDOXybk3Qu3dPbOoKoysFMWtkY3mv5BsL8//OSZVL5DCLYqgRfY5cWirgRzlC+WSrxp6Bo3eNZg==", + "optional": true, + "dependencies": { + "glob": "^7.0.5", + "minimatch": "^3.0.3", + "mkdirp": "^1.0.4", + "noms": "0.0.0", + "through2": "^2.0.1", + "untildify": "^4.0.0", + "yargs": "^16.1.0" + }, + "bin": { + "copyfiles": "copyfiles", + "copyup": "copyfiles" + } + }, + "node_modules/copyfiles/node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "optional": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/copyfiles/node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "optional": true, + "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" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "optional": true + }, + "node_modules/cosmjs-types": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cosmjs-types/-/cosmjs-types-0.7.2.tgz", + "integrity": "sha512-vf2uLyktjr/XVAgEq0DjMxeAWh1yYREe7AMHDKd7EiHVqxBPCaBS+qEEQUkXbR9ndnckqr1sUG8BQhazh4X5lA==", + "optional": true, + "dependencies": { + "long": "^4.0.0", + "protobufjs": "~6.11.2" + } + }, + "node_modules/crc-32": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", + "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", + "optional": true, + "bin": { + "crc32": "bin/crc32.njs" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "license": "MIT", + "dependencies": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "node_modules/create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "license": "MIT", + "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" + } + }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==" + }, + "node_modules/cross-fetch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz", + "integrity": "sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==", + "license": "MIT", + "dependencies": { + "node-fetch": "2.6.7" + } + }, + "node_modules/crypto-addr-codec": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/crypto-addr-codec/-/crypto-addr-codec-0.1.7.tgz", + "integrity": "sha512-X4hzfBzNhy4mAc3UpiXEC/L0jo5E8wAa9unsnA8nNXYzXjCcGk83hfC5avJWCSGT8V91xMnAS9AKMHmjw5+XCg==", + "license": "MIT", + "dependencies": { + "base-x": "^3.0.8", + "big-integer": "1.6.36", + "blakejs": "^1.1.0", + "bs58": "^4.0.1", + "ripemd160-min": "0.0.6", + "safe-buffer": "^5.2.0", + "sha3": "^2.1.1" + } + }, + "node_modules/crypto-hash": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/crypto-hash/-/crypto-hash-1.3.0.tgz", + "integrity": "sha512-lyAZ0EMyjDkVvz8WOeVnuCPvKVBXcMv1l5SVqO1yC7PzTwrD/pPje/BIRbWhMoPe436U+Y2nD7f5bFx0kt+Sbg==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/decamelize": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decimal.js": { + "version": "10.4.2", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.2.tgz", + "integrity": "sha512-ic1yEvwT6GuvaYwBLLY6/aFFgjZdySKTE8en/fkU3QICTmRtgtSlFn0u0BXN06InZwtfCelR7j8LRiDI/02iGA==", + "license": "MIT" + }, + "node_modules/deep-eql": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", + "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-detect": "^4.0.0" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/define-data-property": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", + "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", + "dependencies": { + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "optional": true, + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/delay": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/delay/-/delay-5.0.0.tgz", + "integrity": "sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/diff": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", + "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "license": "MIT", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/dotenv": { + "version": "16.0.3", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz", + "integrity": "sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + } + }, + "node_modules/drbg.js": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/drbg.js/-/drbg.js-1.0.1.tgz", + "integrity": "sha512-F4wZ06PvqxYLFEZKkFxTDcns9oFNk34hvmJSEwdzsxVQ8YI5YaxtACgQatkYgv2VI2CFkUd2Y+xosPQnHv809g==", + "optional": true, + "dependencies": { + "browserify-aes": "^1.0.6", + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/eccrypto": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/eccrypto/-/eccrypto-1.1.6.tgz", + "integrity": "sha512-d78ivVEzu7Tn0ZphUUaL43+jVPKTMPFGtmgtz1D0LrFn7cY3K8CdrvibuLz2AAkHBLKZtR8DMbB2ukRYFk987A==", + "hasInstallScript": true, + "optional": true, + "dependencies": { + "acorn": "7.1.1", + "elliptic": "6.5.4", + "es6-promise": "4.2.8", + "nan": "2.14.0" + }, + "optionalDependencies": { + "secp256k1": "3.7.1" + } + }, + "node_modules/eccrypto/node_modules/acorn": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.1.tgz", + "integrity": "sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg==", + "optional": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/eccrypto/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "optional": true + }, + "node_modules/eccrypto/node_modules/secp256k1": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-3.7.1.tgz", + "integrity": "sha512-1cf8sbnRreXrQFdH6qsg2H71Xw91fCCS9Yp021GnUNJzWJS/py96fS4lHbnTnouLp08Xj6jBoBB6V78Tdbdu5g==", + "hasInstallScript": true, + "optional": true, + "dependencies": { + "bindings": "^1.5.0", + "bip66": "^1.1.5", + "bn.js": "^4.11.8", + "create-hash": "^1.2.0", + "drbg.js": "^1.0.1", + "elliptic": "^6.4.1", + "nan": "^2.14.0", + "safe-buffer": "^5.1.2" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, + "node_modules/elliptic": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", + "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", + "license": "MIT", + "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" + } + }, + "node_modules/elliptic/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "license": "MIT" + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/error-polyfill": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/error-polyfill/-/error-polyfill-0.1.3.tgz", + "integrity": "sha512-XHJk60ufE+TG/ydwp4lilOog549iiQF2OAPhkk9DdiYWMrltz5yhDz/xnKuenNwP7gy3dsibssO5QpVhkrSzzg==", + "license": "MIT", + "dependencies": { + "capability": "^0.2.5", + "o3": "^1.0.3", + "u3": "^0.1.1" + } + }, + "node_modules/es6-promise": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", + "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", + "license": "MIT" + }, + "node_modules/es6-promisify": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", + "integrity": "sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ==", + "license": "MIT", + "dependencies": { + "es6-promise": "^4.0.3" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/eth-crypto": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/eth-crypto/-/eth-crypto-2.6.0.tgz", + "integrity": "sha512-GCX4ffFYRUGgnuWR5qxcZIRQJ1KEqPFiyXU9yVy7s6dtXIMlUXZQ2h+5ID6rFaOHWbpJbjfkC6YdhwtwRYCnug==", + "optional": true, + "dependencies": { + "@babel/runtime": "7.20.13", + "@ethereumjs/tx": "3.5.2", + "@types/bn.js": "5.1.1", + "eccrypto": "1.1.6", + "ethereumjs-util": "7.1.5", + "ethers": "5.7.2", + "secp256k1": "5.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/pubkey" + } + }, + "node_modules/eth-crypto/node_modules/@types/bn.js": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.1.tgz", + "integrity": "sha512-qNrYbZqMx0uJAfKnKclPh+dTwK33KfLHYqtyODwd5HnXOjnkhc4qgn3BrK6RWyGZm5+sIFE7Q7Vz6QQtJB7w7g==", + "optional": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/eth-crypto/node_modules/node-addon-api": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.1.0.tgz", + "integrity": "sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==", + "optional": true + }, + "node_modules/eth-crypto/node_modules/secp256k1": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-5.0.0.tgz", + "integrity": "sha512-TKWX8xvoGHrxVdqbYeZM9w+izTF4b9z3NhSaDkdn81btvuh+ivbIMGT/zQvDtTFWhRlThpoz6LEYTr7n8A5GcA==", + "hasInstallScript": true, + "optional": true, + "dependencies": { + "elliptic": "^6.5.4", + "node-addon-api": "^5.0.0", + "node-gyp-build": "^4.2.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/ethereum-cryptography": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", + "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", + "license": "MIT", + "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" + } + }, + "node_modules/ethereumjs-abi": { + "version": "0.6.8", + "resolved": "https://registry.npmjs.org/ethereumjs-abi/-/ethereumjs-abi-0.6.8.tgz", + "integrity": "sha512-Tx0r/iXI6r+lRsdvkFDlut0N08jWMnKRZ6Gkq+Nmw75lZe4e6o3EkSnkaBP5NF6+m5PTGAr9JP43N3LyeoglsA==", + "optional": true, + "dependencies": { + "bn.js": "^4.11.8", + "ethereumjs-util": "^6.0.0" + } + }, + "node_modules/ethereumjs-abi/node_modules/@types/bn.js": { + "version": "4.11.6", + "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-4.11.6.tgz", + "integrity": "sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==", + "optional": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/ethereumjs-abi/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "optional": true + }, + "node_modules/ethereumjs-abi/node_modules/ethereumjs-util": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz", + "integrity": "sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw==", + "optional": true, + "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" + } + }, + "node_modules/ethereumjs-util": { + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz", + "integrity": "sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==", + "license": "MPL-2.0", + "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" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/ethers": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz", + "integrity": "sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "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" + } + }, + "node_modules/ethers/node_modules/@ethersproject/abi": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.7.0.tgz", + "integrity": "sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "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" + } + }, + "node_modules/ethers/node_modules/@ethersproject/abstract-provider": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz", + "integrity": "sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "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" + } + }, + "node_modules/ethers/node_modules/@ethersproject/abstract-signer": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.7.0.tgz", + "integrity": "sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "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" + } + }, + "node_modules/ethers/node_modules/@ethersproject/address": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz", + "integrity": "sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "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" + } + }, + "node_modules/ethers/node_modules/@ethersproject/basex": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/basex/-/basex-5.7.0.tgz", + "integrity": "sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/properties": "^5.7.0" + } + }, + "node_modules/ethers/node_modules/@ethersproject/bignumber": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.7.0.tgz", + "integrity": "sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "bn.js": "^5.2.1" + } + }, + "node_modules/ethers/node_modules/@ethersproject/constants": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.7.0.tgz", + "integrity": "sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/bignumber": "^5.7.0" + } + }, + "node_modules/ethers/node_modules/@ethersproject/hash": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.7.0.tgz", + "integrity": "sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "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" + } + }, + "node_modules/ethers/node_modules/@ethersproject/hdnode": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/hdnode/-/hdnode-5.7.0.tgz", + "integrity": "sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "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" + } + }, + "node_modules/ethers/node_modules/@ethersproject/json-wallets": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/json-wallets/-/json-wallets-5.7.0.tgz", + "integrity": "sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "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" + } + }, + "node_modules/ethers/node_modules/@ethersproject/logger": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.7.0.tgz", + "integrity": "sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT" + }, + "node_modules/ethers/node_modules/@ethersproject/networks": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.7.1.tgz", + "integrity": "sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/logger": "^5.7.0" + } + }, + "node_modules/ethers/node_modules/@ethersproject/pbkdf2": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/pbkdf2/-/pbkdf2-5.7.0.tgz", + "integrity": "sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/sha2": "^5.7.0" + } + }, + "node_modules/ethers/node_modules/@ethersproject/properties": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.7.0.tgz", + "integrity": "sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/logger": "^5.7.0" + } + }, + "node_modules/ethers/node_modules/@ethersproject/random": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/random/-/random-5.7.0.tgz", + "integrity": "sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0" + } + }, + "node_modules/ethers/node_modules/@ethersproject/rlp": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.7.0.tgz", + "integrity": "sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0" + } + }, + "node_modules/ethers/node_modules/@ethersproject/sha2": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/sha2/-/sha2-5.7.0.tgz", + "integrity": "sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "hash.js": "1.1.7" + } + }, + "node_modules/ethers/node_modules/@ethersproject/strings": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.7.0.tgz", + "integrity": "sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/constants": "^5.7.0", + "@ethersproject/logger": "^5.7.0" + } + }, + "node_modules/ethers/node_modules/@ethersproject/transactions": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.7.0.tgz", + "integrity": "sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "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" + } + }, + "node_modules/ethers/node_modules/@ethersproject/web": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/@ethersproject/web/-/web-5.7.1.tgz", + "integrity": "sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "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" + } + }, + "node_modules/ethers/node_modules/@ethersproject/wordlists": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/wordlists/-/wordlists-5.7.0.tgz", + "integrity": "sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "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" + } + }, + "node_modules/ethjs-util": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/ethjs-util/-/ethjs-util-0.1.6.tgz", + "integrity": "sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w==", + "optional": true, + "dependencies": { + "is-hex-prefixed": "1.0.0", + "strip-hex-prefix": "1.0.0" + }, + "engines": { + "node": ">=6.5.0", + "npm": ">=3" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "license": "MIT" + }, + "node_modules/evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "license": "MIT", + "dependencies": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/express": { + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.1", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/eyes": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz", + "integrity": "sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ==", + "engines": { + "node": "> 0.1.90" + } + }, + "node_modules/fast-stable-stringify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fast-stable-stringify/-/fast-stable-stringify-1.0.0.tgz", + "integrity": "sha512-wpYMUmFu5f00Sm0cj2pfivpmawLZ0NKdviQ4w9zJeR8JVtOpOxHmLaJuj0vxvGqMJQWyP/COUkF75/57OKyRag==", + "license": "MIT" + }, + "node_modules/file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "license": "MIT" + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/find-replace": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-3.0.0.tgz", + "integrity": "sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==", + "dependencies": { + "array-back": "^3.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "license": "BSD-3-Clause", + "bin": { + "flat": "cli.js" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-func-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", + "integrity": "sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", + "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", + "dependencies": { + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "license": "ISC", + "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" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/globalthis": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "optional": true, + "dependencies": { + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/google-protobuf": { + "version": "3.21.2", + "resolved": "https://registry.npmjs.org/google-protobuf/-/google-protobuf-3.21.2.tgz", + "integrity": "sha512-3MSOYFO5U9mPGikIYCzK0SaThypfGgS6bHqrUGXG3DPHCrb+txNqeEcns1W0lkGfk0rCyNXm7xB9rMxnCiZOoA==", + "license": "(BSD-3-Clause AND Apache-2.0)" + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + }, + "node_modules/graphql": { + "version": "16.8.1", + "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.8.1.tgz", + "integrity": "sha512-59LZHPdGZVh695Ud9lRzPBVTtlX9ZCV150Er2W43ro37wVof0ctenSaskPPjN7lVTIN8mSZt8PHUNKZuNQUuxw==", + "optional": true, + "engines": { + "node": "^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0" + } + }, + "node_modules/graphql-tag": { + "version": "2.12.6", + "resolved": "https://registry.npmjs.org/graphql-tag/-/graphql-tag-2.12.6.tgz", + "integrity": "sha512-FdSNcu2QQcWnM2VNvSCCDCVS5PpPqpzgFT8+GXzqJuoDd0CBncxCY278u4mhRO7tMgo2JjgJA5aZ+nWSQ/Z+xg==", + "optional": true, + "dependencies": { + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "graphql": "^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", + "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", + "dependencies": { + "get-intrinsic": "^1.2.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hash-base": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", + "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "node_modules/hasown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", + "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "license": "MIT", + "bin": { + "he": "bin/he" + } + }, + "node_modules/hi-base32": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/hi-base32/-/hi-base32-0.5.1.tgz", + "integrity": "sha512-EmBBpvdYh/4XxsnUybsPag6VikPYnN30td+vQk+GI3qpahVEG9+gTkG0aXVxTjBqQ5T6ijbWIu77O+C5WFWsnA==" + }, + "node_modules/hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", + "license": "MIT", + "dependencies": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "optional": true, + "dependencies": { + "react-is": "^16.7.0" + } + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "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" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-status-codes": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/http-status-codes/-/http-status-codes-2.3.0.tgz", + "integrity": "sha512-RJ8XvFvpPM/Dmc5SV+dC4y5PCeOhT3x1Hq0NU3rjGeg5a/CqlhZ7uudknPwZFz4aeAXDcbAyaeP7GAo9lvngtA==", + "optional": true + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "optional": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "optional": true, + "dependencies": { + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-hex-prefixed": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz", + "integrity": "sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA==", + "optional": true, + "engines": { + "node": ">=6.5.0", + "npm": ">=3" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", + "optional": true + }, + "node_modules/isomorphic-ws": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz", + "integrity": "sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==", + "license": "MIT", + "peerDependencies": { + "ws": "*" + } + }, + "node_modules/jayson": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/jayson/-/jayson-3.7.0.tgz", + "integrity": "sha512-tfy39KJMrrXJ+mFcMpxwBvFDetS8LAID93+rycFglIQM4kl3uNR3W4lBLE/FFhsoUCEox5Dt2adVpDm/XtebbQ==", + "license": "MIT", + "dependencies": { + "@types/connect": "^3.4.33", + "@types/node": "^12.12.54", + "@types/ws": "^7.4.4", + "commander": "^2.20.3", + "delay": "^5.0.0", + "es6-promisify": "^5.0.0", + "eyes": "^0.1.8", + "isomorphic-ws": "^4.0.1", + "json-stringify-safe": "^5.0.1", + "JSONStream": "^1.3.5", + "lodash": "^4.17.20", + "uuid": "^8.3.2", + "ws": "^7.4.5" + }, + "bin": { + "jayson": "bin/jayson.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jayson/node_modules/@types/node": { + "version": "12.20.55", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", + "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==", + "license": "MIT" + }, + "node_modules/js-base64": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-3.7.2.tgz", + "integrity": "sha512-NnRs6dsyqUXejqk/yv2aiXlAvOs56sLkX6nUdeaNezI5LFFLlsZjOThmwnrcwh5ZZRwZlCMnVAY3CvhIhoVEKQ==", + "license": "BSD-3-Clause" + }, + "node_modules/js-sha256": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/js-sha256/-/js-sha256-0.9.0.tgz", + "integrity": "sha512-sga3MHh9sgQN2+pJ9VYZ+1LPwXOxuBJBA5nrR5/ofPfuiJBE2hnjsaN8se8JznOmGLN2p49Pe5U/ttafcs/apA==", + "license": "MIT" + }, + "node_modules/js-sha3": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", + "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==", + "license": "MIT" + }, + "node_modules/js-sha512": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/js-sha512/-/js-sha512-0.8.0.tgz", + "integrity": "sha512-PWsmefG6Jkodqt+ePTvBZCSMFgN7Clckjd0O7su3I0+BW2QWUTJNzjktHsztGLhncP2h8mcF9V9Y2Ha59pAViQ==" + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "optional": true + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jscrypto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/jscrypto/-/jscrypto-1.0.3.tgz", + "integrity": "sha512-lryZl0flhodv4SZHOqyb1bx5sKcJxj0VBo0Kzb4QMAg3L021IC9uGpl0RCZa+9KJwlRGSK2C80ITcwbe19OKLQ==", + "license": "MIT", + "bin": { + "jscrypto": "bin/cli.js" + } + }, + "node_modules/json-bigint": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", + "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", + "dependencies": { + "bignumber.js": "^9.0.0" + } + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", + "license": "ISC" + }, + "node_modules/json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "license": "MIT", + "optional": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", + "engines": [ + "node >= 0.2.0" + ], + "license": "MIT" + }, + "node_modules/jsonschema": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.4.1.tgz", + "integrity": "sha512-S6cATIPVv1z0IlxdN+zUk5EPjkGCdnhN4wVSBlvoUO1tOLJootbo9CquNJmbIh4yikWHiUedhRYrNPn1arpEmQ==", + "optional": true, + "engines": { + "node": "*" + } + }, + "node_modules/JSONStream": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", + "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", + "license": "(MIT OR Apache-2.0)", + "dependencies": { + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" + }, + "bin": { + "JSONStream": "bin.js" + }, + "engines": { + "node": "*" + } + }, + "node_modules/keccak": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/keccak/-/keccak-3.0.4.tgz", + "integrity": "sha512-3vKuW0jV8J3XNTzvfyicFR5qvxrSAGl7KIhvgOu5cmWwM7tZRj3fMbj/pfIf4be7aznbc+prBWGjywox/g2Y6Q==", + "hasInstallScript": true, + "dependencies": { + "node-addon-api": "^2.0.0", + "node-gyp-build": "^4.2.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/keccak256": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/keccak256/-/keccak256-1.0.6.tgz", + "integrity": "sha512-8GLiM01PkdJVGUhR1e6M/AvWnSqYS0HaERI+K/QtStGDGlSTx2B1zTqZk4Zlqu5TxHJNTxWAdP9Y+WI50OApUw==", + "optional": true, + "dependencies": { + "bn.js": "^5.2.0", + "buffer": "^6.0.3", + "keccak": "^3.0.2" + } + }, + "node_modules/libsodium": { + "version": "0.7.13", + "resolved": "https://registry.npmjs.org/libsodium/-/libsodium-0.7.13.tgz", + "integrity": "sha512-mK8ju0fnrKXXfleL53vtp9xiPq5hKM0zbDQtcxQIsSmxNgSxqCj6R7Hl9PkrNe2j29T4yoDaF7DJLK9/i5iWUw==", + "optional": true + }, + "node_modules/libsodium-wrappers": { + "version": "0.7.13", + "resolved": "https://registry.npmjs.org/libsodium-wrappers/-/libsodium-wrappers-0.7.13.tgz", + "integrity": "sha512-kasvDsEi/r1fMzKouIDv7B8I6vNmknXwGiYodErGuESoFTohGSKZplFtVxZqHaoQ217AynyIFgnOVRitpHs0Qw==", + "optional": true, + "dependencies": { + "libsodium": "^0.7.13" + } + }, + "node_modules/link-module-alias": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/link-module-alias/-/link-module-alias-1.2.0.tgz", + "integrity": "sha512-ahPjXepbSVKbahTB6LxR//VHm8HPfI+QQygCH+E82spBY4HR5VPJTvlhKBc9F7muVxnS6C1rRfoPOXAbWO/fyw==", + "optional": true, + "dependencies": { + "chalk": "^2.4.1" + }, + "bin": { + "link-module-alias": "index.js" + }, + "engines": { + "node": "> 8.0.0" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "license": "MIT" + }, + "node_modules/lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==" + }, + "node_modules/lodash.values": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.values/-/lodash.values-4.3.0.tgz", + "integrity": "sha512-r0RwvdCv8id9TUblb/O7rYPwVy6lerCbcawrfdo9iC/1t1wsNMJknO79WNBgwkH0hIeJ08jmvvESbFpNb4jH0Q==", + "optional": true + }, + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "license": "MIT", + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-symbols/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/log-symbols/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/long": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", + "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==", + "license": "Apache-2.0" + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "optional": true, + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/loupe": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.4.tgz", + "integrity": "sha512-OvKfgCC2Ndby6aSTREl5aCCPTNIzlDfQZvZxNUrBrihDhL3xcrYegTblhmEiCrg2kKQz4XsFIaemE5BF4ybSaQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-func-name": "^2.0.0" + } + }, + "node_modules/lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "license": "ISC" + }, + "node_modules/map-obj": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", + "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", + "optional": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "license": "MIT", + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "license": "ISC" + }, + "node_modules/minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==", + "license": "MIT" + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", + "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mocha": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.0.0.tgz", + "integrity": "sha512-0Wl+elVUD43Y0BqPZBzZt8Tnkw9CMUdNYnUsTfOM1vuhJVZL+kiesFYsqwBkEEuEixaiPe5ZQdqDgX2jddhmoA==", + "license": "MIT", + "dependencies": { + "@ungap/promise-all-settled": "1.1.2", + "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" + }, + "bin": { + "_mocha": "bin/_mocha", + "mocha": "bin/mocha.js" + }, + "engines": { + "node": ">= 14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mochajs" + } + }, + "node_modules/mocha/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/mocha/node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/mocha/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/mocha/node_modules/debug/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "license": "MIT" + }, + "node_modules/mocha/node_modules/minimatch": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", + "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mocha/node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "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" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/mustache": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz", + "integrity": "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==", + "license": "MIT", + "bin": { + "mustache": "bin/mustache" + } + }, + "node_modules/nan": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", + "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==", + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz", + "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==", + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/near-api-js": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/near-api-js/-/near-api-js-1.1.0.tgz", + "integrity": "sha512-qYKv1mYsaDZc2uYndhS+ttDhR9+60qFc+ZjD6lWsAxr3ZskMjRwPffDGQZYhC7BRDQMe1HEbk6d5mf+TVm0Lqg==", + "license": "(MIT AND Apache-2.0)", + "dependencies": { + "bn.js": "5.2.1", + "borsh": "^0.7.0", + "bs58": "^4.0.0", + "depd": "^2.0.0", + "error-polyfill": "^0.1.3", + "http-errors": "^1.7.2", + "js-sha256": "^0.9.0", + "mustache": "^4.0.0", + "node-fetch": "^2.6.1", + "text-encoding-utf-8": "^1.0.2", + "tweetnacl": "^1.0.1" + } + }, + "node_modules/near-api-js/node_modules/http-errors": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", + "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", + "license": "MIT", + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/near-api-js/node_modules/http-errors/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/near-api-js/node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "license": "MIT", + "dependencies": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "node_modules/node-addon-api": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz", + "integrity": "sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==", + "license": "MIT" + }, + "node_modules/node-fetch": { + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-gyp-build": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.5.0.tgz", + "integrity": "sha512-2iGbaQBV+ITgCz76ZEjmhUKAKVf7xfY1sRl4UiKQspfZMH2h06SyhNsnSVy50cwkFQDGLyif6m/6uFXHkOZ6rg==", + "license": "MIT", + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" + } + }, + "node_modules/noms": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/noms/-/noms-0.0.0.tgz", + "integrity": "sha512-lNDU9VJaOPxUmXcLb+HQFeUgQQPtMI24Gt6hgfuMHRJgMRHMF/qZ4HJD3GDru4sSw9IQl2jPjAYnQrdIeLbwow==", + "optional": true, + "dependencies": { + "inherits": "^2.0.1", + "readable-stream": "~1.0.31" + } + }, + "node_modules/noms/node_modules/readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==", + "optional": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "node_modules/noms/node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", + "optional": true + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/o3": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/o3/-/o3-1.0.3.tgz", + "integrity": "sha512-f+4n+vC6s4ysy7YO7O2gslWZBUu8Qj2i2OUJOvjRxQva7jVjYjB29jrr9NCjmxZQR0gzrOcv1RnqoYOeMs5VRQ==", + "license": "MIT", + "dependencies": { + "capability": "^0.2.5" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "optional": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/optimism": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/optimism/-/optimism-0.18.0.tgz", + "integrity": "sha512-tGn8+REwLRNFnb9WmcY5IfpOqeX2kpaYJ1s6Ae3mn12AeydLkR3j+jSCmVQFoXqU8D41PAJ1RG1rCRNWmNZVmQ==", + "optional": true, + "dependencies": { + "@wry/caches": "^1.0.0", + "@wry/context": "^0.7.0", + "@wry/trie": "^0.4.3", + "tslib": "^2.3.0" + } + }, + "node_modules/optimism/node_modules/@wry/trie": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@wry/trie/-/trie-0.4.3.tgz", + "integrity": "sha512-I6bHwH0fSf6RqQcnnXLJKhkSXG45MFral3GxPaY4uAl0LYDZM+YDVDAiU9bYwjTuysy1S0IeecWtmq1SZA3M1w==", + "optional": true, + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pako": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/pako/-/pako-2.1.0.tgz", + "integrity": "sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==", + "license": "(MIT AND Zlib)" + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "optional": true + }, + "node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + }, + "node_modules/pathval": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/pbkdf2": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", + "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", + "license": "MIT", + "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" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/prettier": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", + "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "optional": true + }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "optional": true, + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/protobufjs": { + "version": "6.11.3", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.3.tgz", + "integrity": "sha512-xL96WDdCZYdU7Slin569tFX712BxsxslWwAfAhCYjQKGTq7dAU91Lomy6nLLhh/dyGhk/YH4TwTSRxTzhuHyZg==", + "hasInstallScript": true, + "license": "BSD-3-Clause", + "dependencies": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/long": "^4.0.1", + "@types/node": ">=13.7.0", + "long": "^4.0.0" + }, + "bin": { + "pbjs": "bin/pbjs", + "pbts": "bin/pbts" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "license": "MIT" + }, + "node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "license": "MIT", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/react": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", + "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "optional": true, + "peer": true, + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", + "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", + "optional": true, + "peer": true, + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.0" + }, + "peerDependencies": { + "react": "^18.2.0" + } + }, + "node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "optional": true + }, + "node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/readonly-date": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/readonly-date/-/readonly-date-1.0.0.tgz", + "integrity": "sha512-tMKIV7hlk0h4mO3JTmmVuIlJVXjKk3Sep9Bf5OH0O+758ruuVkUy2J9SttDLm91IEX/WHlXPSpxMGjPj4beMIQ==", + "optional": true + }, + "node_modules/rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "optional": true, + "dependencies": { + "resolve": "^1.1.6" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/reduce-flatten": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-2.0.0.tgz", + "integrity": "sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w==", + "engines": { + "node": ">=6" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "optional": true, + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/response-iterator": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/response-iterator/-/response-iterator-0.2.6.tgz", + "integrity": "sha512-pVzEEzrsg23Sh053rmDUvLSkGXluZio0qu8VT6ukrYuvtjVfCbDZH9d6PGXb8HZfzdNZt8feXv/jvUzlhRgLnw==", + "optional": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "license": "MIT", + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "node_modules/ripemd160-min": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/ripemd160-min/-/ripemd160-min-0.0.6.tgz", + "integrity": "sha512-+GcJgQivhs6S9qvLogusiTcS9kQUfgR75whKuy5jIhuiOfQuJ8fjqxV6EGD5duH1Y/FawFUMtMhyeq3Fbnib8A==", + "engines": { + "node": ">=8" + } + }, + "node_modules/rlp": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/rlp/-/rlp-2.2.7.tgz", + "integrity": "sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ==", + "license": "MPL-2.0", + "dependencies": { + "bn.js": "^5.2.0" + }, + "bin": { + "rlp": "bin/rlp" + } + }, + "node_modules/rpc-websockets": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/rpc-websockets/-/rpc-websockets-7.8.0.tgz", + "integrity": "sha512-AStkq6KDvSAmA4WiwlK1pDvj/33BWmExTATUokC0v+NhWekXSTNzXS5OGXeYwq501/pj6lBZMofg/h4dx4/tCg==", + "dependencies": { + "@babel/runtime": "^7.17.2", + "eventemitter3": "^4.0.7", + "uuid": "^8.3.2", + "ws": "^8.5.0" + }, + "funding": { + "type": "paypal", + "url": "https://paypal.me/kozjak" + }, + "optionalDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + } + }, + "node_modules/rpc-websockets/node_modules/ws": { + "version": "8.9.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.9.0.tgz", + "integrity": "sha512-Ja7nszREasGaYUYCI2k4lCKIRTt+y7XuqVoHR44YpI49TtryyqbqvDMn5eqfW7e6HzTukDRIsXqzVHScqRcafg==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/scheduler": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", + "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", + "optional": true, + "peer": true, + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/scrypt-js": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz", + "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==", + "license": "MIT" + }, + "node_modules/secp256k1": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-4.0.3.tgz", + "integrity": "sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA==", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "elliptic": "^6.5.4", + "node-addon-api": "^2.0.0", + "node-gyp-build": "^4.2.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "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" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/serialize-javascript": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", + "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "license": "BSD-3-Clause", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-function-length": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz", + "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==", + "dependencies": { + "define-data-property": "^1.1.1", + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", + "license": "MIT" + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "license": "ISC" + }, + "node_modules/sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "license": "(MIT AND BSD-3-Clause)", + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + }, + "bin": { + "sha.js": "bin.js" + } + }, + "node_modules/sha3": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/sha3/-/sha3-2.1.4.tgz", + "integrity": "sha512-S8cNxbyb0UGUM2VhRD4Poe5N58gJnJsLJ5vC7FYWGUmGhcsj4++WaIOBFVDxlG0W3To6xBuiRh+i0Qp2oNCOtg==", + "license": "MIT", + "dependencies": { + "buffer": "6.0.3" + } + }, + "node_modules/shelljs": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "optional": true, + "dependencies": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + }, + "bin": { + "shjs": "bin/shjs" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/shx": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/shx/-/shx-0.3.4.tgz", + "integrity": "sha512-N6A9MLVqjxZYcVn8hLmtneQWIJtp8IKzMP4eMnx+nqkvXoqinUPCbUFLp2UcWTEIUONhlk0ewxr/jaVGlc+J+g==", + "optional": true, + "dependencies": { + "minimist": "^1.2.3", + "shelljs": "^0.8.5" + }, + "bin": { + "shx": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/snake-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz", + "integrity": "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==", + "license": "MIT", + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/snakecase-keys": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/snakecase-keys/-/snakecase-keys-5.5.0.tgz", + "integrity": "sha512-r3kRtnoPu3FxGJ3fny6PKNnU3pteb29o6qAa0ugzhSseKNWRkw1dw8nIjXMyyKaU9vQxxVIE62Mb3bKbdrgpiw==", + "optional": true, + "dependencies": { + "map-obj": "^4.1.0", + "snake-case": "^3.0.4", + "type-fest": "^3.12.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/store2": { + "version": "2.14.2", + "resolved": "https://registry.npmjs.org/store2/-/store2-2.14.2.tgz", + "integrity": "sha512-siT1RiqlfQnGqgT/YzXVUNsom9S0H1OX+dpdGN1xkyYATo4I6sep5NmsRD/40s3IIOvlCq6akxkqG82urIZW1w==", + "optional": true + }, + "node_modules/string_decoder": { + "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==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-format": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/string-format/-/string-format-2.0.0.tgz", + "integrity": "sha512-bbEs3scLeYNXLecRRuk6uJxdXUSj6le/8rNPHChIJTn2V79aXVTR1EH2OH5zLKKoz0V02fOUKZZcw01pLUShZA==" + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "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" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-hex-prefix": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz", + "integrity": "sha512-q8d4ue7JGEiVcypji1bALTos+0pWtyGlivAWyPuTkHzuTCJqrK9sWxYQZUq6Nq3cuyv3bm734IhHvHtGGURU6A==", + "optional": true, + "dependencies": { + "is-hex-prefixed": "1.0.0" + }, + "engines": { + "node": ">=6.5.0", + "npm": ">=3" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/superstruct": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/superstruct/-/superstruct-0.14.2.tgz", + "integrity": "sha512-nPewA6m9mR3d6k7WkZ8N8zpTWfenFH3q9pA2PkuiZxINr9DKB2+40wEQf0ixn8VaGuJ78AB6iWOtStI+/4FKZQ==", + "license": "MIT" + }, + "node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "optional": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/symbol-observable": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-4.0.0.tgz", + "integrity": "sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ==", + "optional": true, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/table-layout": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-1.0.2.tgz", + "integrity": "sha512-qd/R7n5rQTRFi+Zf2sk5XVVd9UQl6ZkduPFC3S7WEGJAmetDTjY3qPN50eSKzwuzEyQKy5TN2TiZdkIjos2L6A==", + "dependencies": { + "array-back": "^4.0.1", + "deep-extend": "~0.6.0", + "typical": "^5.2.0", + "wordwrapjs": "^4.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/table-layout/node_modules/array-back": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz", + "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/table-layout/node_modules/typical": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", + "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/text-encoding-utf-8": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/text-encoding-utf-8/-/text-encoding-utf-8-1.0.2.tgz", + "integrity": "sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg==" + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "license": "MIT" + }, + "node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "optional": true, + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/through2/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "optional": true + }, + "node_modules/through2/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "optional": true, + "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" + } + }, + "node_modules/through2/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "optional": true + }, + "node_modules/through2/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "optional": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/tiny-secp256k1": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/tiny-secp256k1/-/tiny-secp256k1-1.1.6.tgz", + "integrity": "sha512-FmqJZGduTyvsr2cF3375fqGHUovSwDi/QytexX1Se4BPuPZpTE5Ftp5fg+EFSuEf3lhZqgCRjEG3ydUQ/aNiwA==", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "bindings": "^1.3.0", + "bn.js": "^4.11.8", + "create-hmac": "^1.1.7", + "elliptic": "^6.4.0", + "nan": "^2.13.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/tiny-secp256k1/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "license": "MIT" + }, + "node_modules/tmp": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", + "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "license": "MIT", + "dependencies": { + "rimraf": "^3.0.0" + }, + "engines": { + "node": ">=8.17.0" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/toml": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/toml/-/toml-3.0.0.tgz", + "integrity": "sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w==", + "license": "MIT" + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "license": "MIT" + }, + "node_modules/ts-command-line-args": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/ts-command-line-args/-/ts-command-line-args-2.5.1.tgz", + "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" + }, + "bin": { + "write-markdown": "dist/write-markdown.js" + } + }, + "node_modules/ts-command-line-args/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/ts-command-line-args/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ts-essentials": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/ts-essentials/-/ts-essentials-7.0.3.tgz", + "integrity": "sha512-8+gr5+lqO3G84KdiTSMRLtuyJ+nTBVRKuCrK4lidMPdVeEp0uqC875uE5NMcaA7YYMN7XsNiFQuMvasF8HT/xQ==", + "peerDependencies": { + "typescript": ">=3.7.0" + } + }, + "node_modules/ts-invariant": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/ts-invariant/-/ts-invariant-0.10.3.tgz", + "integrity": "sha512-uivwYcQaxAucv1CzRp2n/QdYPo4ILf9VXgH19zEIjFx2EJufV16P0JtJVpYHy89DItG6Kwj2oIUjrcK5au+4tQ==", + "optional": true, + "dependencies": { + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ts-mocha": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/ts-mocha/-/ts-mocha-10.0.0.tgz", + "integrity": "sha512-VRfgDO+iiuJFlNB18tzOfypJ21xn2xbuZyDvJvqpTbWgkAgD17ONGr8t+Tl8rcBtOBdjXp5e/Rk+d39f7XBHRw==", + "license": "MIT", + "dependencies": { + "ts-node": "7.0.1" + }, + "bin": { + "ts-mocha": "bin/ts-mocha" + }, + "engines": { + "node": ">= 6.X.X" + }, + "optionalDependencies": { + "tsconfig-paths": "^3.5.0" + }, + "peerDependencies": { + "mocha": "^3.X.X || ^4.X.X || ^5.X.X || ^6.X.X || ^7.X.X || ^8.X.X || ^9.X.X || ^10.X.X" + } + }, + "node_modules/ts-mocha/node_modules/diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/ts-mocha/node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "license": "MIT", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/ts-mocha/node_modules/ts-node": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-7.0.1.tgz", + "integrity": "sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw==", + "license": "MIT", + "dependencies": { + "arrify": "^1.0.0", + "buffer-from": "^1.1.0", + "diff": "^3.1.0", + "make-error": "^1.1.1", + "minimist": "^1.2.0", + "mkdirp": "^0.5.1", + "source-map-support": "^0.5.6", + "yn": "^2.0.0" + }, + "bin": { + "ts-node": "dist/bin.js" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/ts-mocha/node_modules/yn": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yn/-/yn-2.0.0.tgz", + "integrity": "sha512-uTv8J/wiWTgUTg+9vLTi//leUl5vDQS6uii/emeTb2ssY7vl6QWf2fFbIIGjnhjvbdKlU0ed7QPgY1htTC86jQ==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/ts-node": { + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", + "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" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, + "node_modules/ts-node/node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/tsconfig-paths": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz", + "integrity": "sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==", + "license": "MIT", + "optional": true, + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.1", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "node_modules/tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", + "license": "0BSD" + }, + "node_modules/tweetnacl": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", + "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==", + "license": "Unlicense" + }, + "node_modules/tweetnacl-util": { + "version": "0.15.1", + "resolved": "https://registry.npmjs.org/tweetnacl-util/-/tweetnacl-util-0.15.1.tgz", + "integrity": "sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw==", + "optional": true + }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.13.1.tgz", + "integrity": "sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==", + "optional": true, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typechain": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/typechain/-/typechain-8.3.2.tgz", + "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" + }, + "bin": { + "typechain": "dist/cli/cli.js" + }, + "peerDependencies": { + "typescript": ">=4.3.0" + } + }, + "node_modules/typechain/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/typechain/node_modules/glob": { + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", + "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" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/typechain/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/typeforce": { + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/typeforce/-/typeforce-1.18.0.tgz", + "integrity": "sha512-7uc1O8h1M1g0rArakJdf0uLRSSgFcYexrVoKo+bzJd32gd4gDy2L/Z+8/FjPnU9ydY3pEnVPtr9FyscYY60K1g==", + "license": "MIT" + }, + "node_modules/typescript": { + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/typical": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/typical/-/typical-4.0.0.tgz", + "integrity": "sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/u3": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/u3/-/u3-0.1.1.tgz", + "integrity": "sha512-+J5D5ir763y+Am/QY6hXNRlwljIeRMZMGs0cT6qqZVVzzT3X3nFPXVyPOFRMOR4kupB0T8JnCdpWdp6Q/iXn3w==", + "license": "MIT" + }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" + }, + "node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/untildify": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", + "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", + "optional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/utf-8-validate": { + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.9.tgz", + "integrity": "sha512-Yek7dAy0v3Kl0orwMlvi7TPtiCNrdfHNd7Gcc/pLq4BLXqfAmd0J7OWMizUQnTTJsyjKn02mU7anqwfmUP4J8Q==", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "node-gyp-build": "^4.3.0" + }, + "engines": { + "node": ">=6.14.2" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==" + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/vlq": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/vlq/-/vlq-2.0.4.tgz", + "integrity": "sha512-aodjPa2wPQFkra1G8CzJBTHXhgk3EVSwxSWXNPr1fgdFLUb8kvLV1iEb6rFgasIsjP82HWI6dsb5Io26DDnasA==" + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "license": "BSD-2-Clause" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "license": "MIT", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/wif": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/wif/-/wif-2.0.6.tgz", + "integrity": "sha512-HIanZn1zmduSF+BQhkE+YXIbEiH0xPr1012QbFEGB0xsKqJii0/SqJjyn8dFv6y36kOznMgMB+LGcbZTJ1xACQ==", + "license": "MIT", + "dependencies": { + "bs58check": "<3.0.0" + } + }, + "node_modules/wordwrapjs": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-4.0.1.tgz", + "integrity": "sha512-kKlNACbvHrkpIw6oPeYDSmdCTu2hdMHoyXLTcUKala++lx5Y+wjJ/e474Jqv5abnVmwxw08DiTuHmw69lJGksA==", + "dependencies": { + "reduce-flatten": "^2.0.0", + "typical": "^5.2.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/wordwrapjs/node_modules/typical": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", + "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/workerpool": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", + "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==", + "license": "Apache-2.0" + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "license": "ISC" + }, + "node_modules/ws": { + "version": "7.4.6", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", + "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", + "license": "MIT", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xstream": { + "version": "11.14.0", + "resolved": "https://registry.npmjs.org/xstream/-/xstream-11.14.0.tgz", + "integrity": "sha512-1bLb+kKKtKPbgTK6i/BaoAn03g47PpFstlbe1BA+y3pNS/LfvcaghS5BFf9+EE1J+KwSQsEpfJvFN5GqFtiNmw==", + "optional": true, + "dependencies": { + "globalthis": "^1.0.1", + "symbol-observable": "^2.0.3" + } + }, + "node_modules/xstream/node_modules/symbol-observable": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-2.0.3.tgz", + "integrity": "sha512-sQV7phh2WCYAn81oAkakC5qjq2Ml0g8ozqz03wOGnx9dDlG1de6yrF+0RAzSJD8fPUow3PTSMf2SAbOGxb93BA==", + "optional": true, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "optional": true, + "engines": { + "node": ">=0.4" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-parser": { + "version": "20.2.4", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", + "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-unparser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", + "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", + "license": "MIT", + "dependencies": { + "camelcase": "^6.0.0", + "decamelize": "^4.0.0", + "flat": "^5.0.2", + "is-plain-obj": "^2.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-unparser/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "engines": { + "node": ">=6" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zen-observable": { + "version": "0.8.15", + "resolved": "https://registry.npmjs.org/zen-observable/-/zen-observable-0.8.15.tgz", + "integrity": "sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ==", + "optional": true + }, + "node_modules/zen-observable-ts": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/zen-observable-ts/-/zen-observable-ts-1.2.5.tgz", + "integrity": "sha512-QZWQekv6iB72Naeake9hS1KxHlotfRpe+WGNbNx5/ta+R3DNjVO2bswf63gXlWDcs+EMd7XY8HfVQyP1X6T4Zg==", + "optional": true, + "dependencies": { + "zen-observable": "0.8.15" + } + } + } +} diff --git a/evm/package.json b/evm/package.json index e3842c4..5f248c5 100644 --- a/evm/package.json +++ b/evm/package.json @@ -11,7 +11,7 @@ "dependencies": { "@certusone/wormhole-sdk": "^0.9.0", "@improbable-eng/grpc-web-node-http-transport": "^0.15.0", - "@openzeppelin/contracts": "^4.7.3", + "@openzeppelin/contracts": "^4.9.5", "@typechain/ethers-v5": "^10.1.1", "@types/argparse": "^2.0.10", "@types/chai": "^4.3.3", @@ -28,8 +28,8 @@ "typescript": "^4.8.3" }, "scripts": { - "build-types": "bash shell-scripts/make_ethers_types.sh", - "deploy-implementation-only": "bash shell-scripts/deploy_implementation_only.sh", - "upgrade-proxy": "bash shell-scripts/upgrade_proxy.sh" + "build-types": "typechain --target=ethers-v5 --out-dir=ts/src/ethers-contracts out/*/*.json", + "deploy-implementation-only": "bash sh/deploy_implementation_only.sh", + "upgrade-proxy": "bash sh/upgrade_proxy.sh" } } diff --git a/evm/shell-scripts/deploy_contracts.sh b/evm/sh/deploy_contracts.sh similarity index 58% rename from evm/shell-scripts/deploy_contracts.sh rename to evm/sh/deploy_contracts.sh index e793b3d..9d334be 100755 --- a/evm/shell-scripts/deploy_contracts.sh +++ b/evm/sh/deploy_contracts.sh @@ -1,6 +1,6 @@ #!/bin/bash -forge script $(dirname $0)/../forge-scripts/deploy_contracts.sol \ +forge script $(dirname $0)/../forge/scripts/deploy_contracts.sol \ --rpc-url $RPC \ --private-key $PRIVATE_KEY \ --broadcast --slow \ No newline at end of file diff --git a/evm/shell-scripts/deploy_implementation_only.sh b/evm/sh/deploy_implementation_only.sh similarity index 67% rename from evm/shell-scripts/deploy_implementation_only.sh rename to evm/sh/deploy_implementation_only.sh index a4a6ac4..b3f82ec 100755 --- a/evm/shell-scripts/deploy_implementation_only.sh +++ b/evm/sh/deploy_implementation_only.sh @@ -2,7 +2,7 @@ set -euo pipefail -forge script $(dirname $0)/../forge-scripts/deploy_implementation_only.sol \ +forge script $(dirname $0)/../forge/scripts/deploy_implementation_only.sol \ -vv \ --rpc-url $RPC \ --private-key $PRIVATE_KEY \ diff --git a/evm/shell-scripts/make_ethers_types.sh b/evm/sh/make_ethers_types.sh similarity index 100% rename from evm/shell-scripts/make_ethers_types.sh rename to evm/sh/make_ethers_types.sh diff --git a/evm/shell-scripts/submit_testnet_registration.sh b/evm/sh/submit_testnet_registration.sh similarity index 79% rename from evm/shell-scripts/submit_testnet_registration.sh rename to evm/sh/submit_testnet_registration.sh index 0fd4100..7a27b01 100755 --- a/evm/shell-scripts/submit_testnet_registration.sh +++ b/evm/sh/submit_testnet_registration.sh @@ -8,7 +8,7 @@ export FOREIGN_EMITTER=$3 export FOREIGN_DOMAIN=$4 export SIGNER_KEY=$5 -forge script $(dirname $0)/../forge-scripts/generate_registration_vaa.sol \ +forge script $(dirname $0)/../forge/scripts/generate_registration_vaa.sol \ -vv \ --rpc-url $RPC \ --private-key $PRIVATE_KEY \ diff --git a/evm/shell-scripts/upgrade_proxy.sh b/evm/sh/upgrade_proxy.sh similarity index 100% rename from evm/shell-scripts/upgrade_proxy.sh rename to evm/sh/upgrade_proxy.sh diff --git a/evm/shell-scripts/verify_implementation.sh b/evm/sh/verify_implementation.sh similarity index 68% rename from evm/shell-scripts/verify_implementation.sh rename to evm/sh/verify_implementation.sh index 1f39eb7..ca7a5ac 100755 --- a/evm/shell-scripts/verify_implementation.sh +++ b/evm/sh/verify_implementation.sh @@ -4,5 +4,5 @@ etherscan_key=$1 forge verify-contract --chain-id $RELEASE_EVM_CHAIN_ID --watch \ --compiler-version v0.8.19 $CIRCLE_INTEGRATION_IMPLEMENTATION \ - src/circle_integration/CircleIntegrationImplementation.sol:CircleIntegrationImplementation \ + src/CircleIntegration/CircleIntegrationImplementation.sol:CircleIntegrationImplementation \ --etherscan-api-key $etherscan_key diff --git a/evm/shell-scripts/verify_proxy.sh b/evm/sh/verify_proxy.sh similarity index 73% rename from evm/shell-scripts/verify_proxy.sh rename to evm/sh/verify_proxy.sh index 4c1bbad..2d96819 100755 --- a/evm/shell-scripts/verify_proxy.sh +++ b/evm/sh/verify_proxy.sh @@ -5,10 +5,10 @@ etherscan_key=$1 governance_chain_id=1 governance_contract=0x0000000000000000000000000000000000000000000000000000000000000004 -setup_bytes=$(cast calldata "function setup(address,address,uint8,address,uint16,bytes32)" $CIRCLE_INTEGRATION_IMPLEMENTATION $RELEASE_WORMHOLE_ADDRESS $RELEASE_WORMHOLE_FINALITY $RELEASE_CIRCLE_BRIDGE_ADDRESS $governance_chain_id $governance_contract) +setup_bytes=$(cast calldata "function setup(address,address,uint8,address,uint16,bytes32)" $CIRCLE_INTEGRATION_IMPLEMENTATION $RELEASE_WORMHOLE_ADDRESS $RELEASE_CIRCLE_BRIDGE_ADDRESS $governance_chain_id $governance_contract) forge verify-contract --chain-id $RELEASE_EVM_CHAIN_ID --watch \ --constructor-args $(cast abi-encode "constructor(address,bytes)" $CIRCLE_INTEGRATION_SETUP $setup_bytes) \ --compiler-version v0.8.19 $CIRCLE_INTEGRATION_PROXY \ - src/circle_integration/CircleIntegrationProxy.sol:CircleIntegrationProxy \ + src/CircleIntegration/CircleIntegrationProxy.sol:CircleIntegrationProxy \ --etherscan-api-key $etherscan_key diff --git a/evm/shell-scripts/verify_setup.sh b/evm/sh/verify_setup.sh similarity index 71% rename from evm/shell-scripts/verify_setup.sh rename to evm/sh/verify_setup.sh index 8c70696..f542c7f 100755 --- a/evm/shell-scripts/verify_setup.sh +++ b/evm/sh/verify_setup.sh @@ -4,5 +4,5 @@ etherscan_key=$1 forge verify-contract --chain-id $RELEASE_EVM_CHAIN_ID --watch \ --compiler-version v0.8.19 $CIRCLE_INTEGRATION_SETUP \ - src/circle_integration/CircleIntegrationSetup.sol:CircleIntegrationSetup \ + src/CircleIntegration/CircleIntegrationSetup.sol:CircleIntegrationSetup \ --etherscan-api-key $etherscan_key diff --git a/evm/shell-scripts/run_integration_tests.sh b/evm/shell-scripts/run_integration_tests.sh deleted file mode 100755 index 00aaa7e..0000000 --- a/evm/shell-scripts/run_integration_tests.sh +++ /dev/null @@ -1,65 +0,0 @@ -#/bin/bash - -pgrep anvil > /dev/null -if [ $? -eq 0 ]; then - echo "anvil already running" - exit 1; -fi - -# ethereum goerli testnet -anvil \ - -m "myth like bonus scare over problem client lizard pioneer submit female collect" \ - --port 8546 \ - --fork-url $ETH_FORK_RPC > anvil_eth.log & - -# avalanche fuji testnet -anvil \ - -m "myth like bonus scare over problem client lizard pioneer submit female collect" \ - --port 8547 \ - --fork-url $AVAX_FORK_RPC > anvil_avax.log & - -sleep 2 - -## first key from mnemonic above -export PRIVATE_KEY="0x4f3edf983ac636a65a842ce7c78d9aa706d3b113bce9c46f30d7d21715b23b1d" - -echo "overriding foundry.toml with foundry-test.toml" -mkdir -p cache -cp -v foundry.toml cache/foundry.toml -cp -v foundry-test.toml foundry.toml - -EVM_ROOT=$(dirname $0)/../ - -echo "deploy contracts" -RELEASE_WORMHOLE_ADDRESS=$ETH_WORMHOLE_ADDRESS \ -RELEASE_CIRCLE_BRIDGE_ADDRESS=$ETH_CIRCLE_BRIDGE_ADDRESS \ -RELEASE_WORMHOLE_FINALITY=$ETH_WORMHOLE_FINALITY \ -forge script $EVM_ROOT/forge-scripts/deploy_contracts.sol \ - --rpc-url http://localhost:8546 \ - --private-key $PRIVATE_KEY \ - --broadcast --slow > deploy.out 2>&1 - -RELEASE_WORMHOLE_ADDRESS=$AVAX_WORMHOLE_ADDRESS \ -RELEASE_CIRCLE_BRIDGE_ADDRESS=$AVAX_CIRCLE_BRIDGE_ADDRESS \ -RELEASE_WORMHOLE_FINALITY=$AVAX_WORMHOLE_FINALITY \ -forge script $EVM_ROOT/forge-scripts/deploy_contracts.sol \ - --rpc-url http://localhost:8547 \ - --private-key $PRIVATE_KEY \ - --broadcast --slow >> deploy.out 2>&1 - -forge script $EVM_ROOT/forge-scripts/deploy_mock_contracts.sol \ - --rpc-url http://localhost:8547 \ - --private-key $PRIVATE_KEY \ - --broadcast --slow >> deploy.out 2>&1 - -echo "overriding foundry.toml with cache/foundry.toml" -mv -v cache/foundry.toml foundry.toml - -echo "running tests (found in ts/test)" -npx ts-mocha -t 1000000 ts/test/*.ts - -echo "running 'Circle Integration Send and Receive' again after upgrade" -npx ts-mocha -t 1000000 ts/test/02_send_receive.ts - -# nuke -pkill anvil diff --git a/evm/src/circle_integration/CircleIntegration.sol b/evm/src/circle_integration/CircleIntegration.sol deleted file mode 100644 index 8b75c49..0000000 --- a/evm/src/circle_integration/CircleIntegration.sol +++ /dev/null @@ -1,261 +0,0 @@ -// SPDX-License-Identifier: Apache 2 -pragma solidity ^0.8.19; - -import {ReentrancyGuard} from "@openzeppelin/contracts/security/ReentrancyGuard.sol"; -import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; -import {SafeERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; -import {IWormhole} from "wormhole/interfaces/IWormhole.sol"; -import {BytesLib} from "wormhole/libraries/external/BytesLib.sol"; - -import {ICircleBridge} from "../interfaces/circle/ICircleBridge.sol"; - -import {CircleIntegrationGovernance} from "./CircleIntegrationGovernance.sol"; -import {CircleIntegrationMessages} from "./CircleIntegrationMessages.sol"; - -/** - * @notice This contract burns and mints Circle-supported tokens by using Circle's Cross-Chain Transfer Protocol. It also emits - * Wormhole messages with arbitrary payloads to allow for additional composability when performing cross-chain - * transfers of Circle-suppored assets. - */ -contract CircleIntegration is CircleIntegrationMessages, CircleIntegrationGovernance, ReentrancyGuard { - using BytesLib for bytes; - - /** - * @notice Emitted when Circle-supported assets have been minted to the mintRecipient - * @param emitterChainId Wormhole chain ID of emitter contract on source chain - * @param emitterAddress Address (bytes32 zero-left-padded) of emitter on source chain - * @param sequence Sequence of Wormhole message used to mint tokens - */ - event Redeemed(uint16 indexed emitterChainId, bytes32 indexed emitterAddress, uint64 indexed sequence); - - /** - * @notice `transferTokensWithPayload` calls the Circle Bridge contract to burn Circle-supported tokens. It emits - * a Wormhole message containing a user-specified payload with instructions for what to do with - * the Circle-supported assets once they have been minted on the target chain. - * @dev reverts if: - * - user passes insufficient value to pay Wormhole message fee - * - `token` is not supported by Circle Bridge - * - `amount` is zero - * - `targetChain` is not supported - * - `mintRecipient` is bytes32(0) - * @param transferParams Struct containing the following attributes: - * - `token` Address of the token to be burned - * - `amount` Amount of `token` to be burned - * - `targetChain` Wormhole chain ID of the target blockchain - * - `mintRecipient` The recipient wallet or contract address on the target chain - * @param batchId ID for Wormhole message batching - * @param payload Arbitrary payload to be delivered to the target chain via Wormhole - * @return messageSequence Wormhole sequence number for this contract - */ - function transferTokensWithPayload(TransferParameters memory transferParams, uint32 batchId, bytes memory payload) - public - payable - nonReentrant - returns (uint64 messageSequence) - { - // cache wormhole instance and fees to save on gas - IWormhole wormhole = wormhole(); - uint256 wormholeFee = wormhole.messageFee(); - - // confirm that the caller has sent enough ether to pay for the wormhole message fee - require(msg.value == wormholeFee, "insufficient value"); - - // Call the circle bridge and `depositForBurnWithCaller`. The `mintRecipient` - // should be the target contract (or wallet) composing on this contract. - (uint64 nonce, uint256 amountReceived) = _transferTokens( - transferParams.token, transferParams.amount, transferParams.targetChain, transferParams.mintRecipient - ); - - // encode DepositWithPayload message - bytes memory encodedMessage = encodeDepositWithPayload( - DepositWithPayload({ - token: addressToBytes32(transferParams.token), - amount: amountReceived, - sourceDomain: localDomain(), - targetDomain: getDomainFromChainId(transferParams.targetChain), - nonce: nonce, - fromAddress: addressToBytes32(msg.sender), - mintRecipient: transferParams.mintRecipient, - payload: payload - }) - ); - - // send the DepositWithPayload wormhole message - messageSequence = wormhole.publishMessage{value: wormholeFee}(batchId, encodedMessage, wormholeFinality()); - } - - function _transferTokens(address token, uint256 amount, uint16 targetChain, bytes32 mintRecipient) - internal - returns (uint64 nonce, uint256 amountReceived) - { - // sanity check user input - require(amount > 0, "amount must be > 0"); - require(mintRecipient != bytes32(0), "invalid mint recipient"); - require(isAcceptedToken(token), "token not accepted"); - require(getRegisteredEmitter(targetChain) != bytes32(0), "target contract not registered"); - - // take custody of tokens - amountReceived = custodyTokens(token, amount); - - // cache Circle Bridge instance - ICircleBridge circleBridge = circleBridge(); - - // approve the Circle Bridge to spend tokens - SafeERC20.safeApprove(IERC20(token), address(circleBridge), amountReceived); - - // burn tokens on the bridge - nonce = circleBridge.depositForBurnWithCaller( - amountReceived, getDomainFromChainId(targetChain), mintRecipient, token, getRegisteredEmitter(targetChain) - ); - } - - function custodyTokens(address token, uint256 amount) internal returns (uint256) { - // query own token balance before transfer - (, bytes memory queriedBalanceBefore) = - token.staticcall(abi.encodeWithSelector(IERC20.balanceOf.selector, address(this))); - uint256 balanceBefore = abi.decode(queriedBalanceBefore, (uint256)); - - // deposit tokens - SafeERC20.safeTransferFrom(IERC20(token), msg.sender, address(this), amount); - - // query own token balance after transfer - (, bytes memory queriedBalanceAfter) = - token.staticcall(abi.encodeWithSelector(IERC20.balanceOf.selector, address(this))); - uint256 balanceAfter = abi.decode(queriedBalanceAfter, (uint256)); - - return balanceAfter - balanceBefore; - } - - /** - * @notice `redeemTokensWithPayload` verifies the Wormhole message from the source chain and - * verifies that the passed Circle Bridge message is valid. It calls the Circle Bridge - * contract by passing the Circle message and attestation to mint tokens to the specified - * mint recipient. It also verifies that the caller is the specified mint recipient to ensure - * atomic execution of the additional instructions in the Wormhole message. - * @dev reverts if: - * - Wormhole message is not properly attested - * - Wormhole message was not emitted from a registered contrat - * - Wormhole message was already consumed by this contract - * - msg.sender is not the encoded mintRecipient - * - Circle Bridge message and Wormhole message are not associated - * - `receiveMessage` call to Circle Transmitter fails - * @param params Struct containing the following attributes: - * - `encodedWormholeMessage` Wormhole message emitted by a registered contract including - * information regarding the token burn on the source chain and an arbitrary message. - * - `circleBridgeMessage` Message emitted by Circle Bridge contract with information regarding - * the token burn on the source chain. - * - `circleAttestation` Serialized EC Signature attesting the cross-chain transfer - * @return depositInfo Struct containing the following attributes: - * - `token` Address (bytes32 left-zero-padded) of token to be minted - * - `amount` Amount of tokens to be minted - * - `sourceDomain` Circle domain for the source chain - * - `targetDomain` Circle domain for the target chain - * - `nonce` Circle sequence number for the transfer - * - `fromAddress` Source CircleIntegration contract caller's address - * - `mintRecipient` Recipient of minted tokens (must be caller of this contract) - * - `payload` Arbitrary Wormhole message payload - */ - function redeemTokensWithPayload(RedeemParameters calldata params) - public - returns (DepositWithPayload memory depositInfo) - { - // verify the wormhole message - IWormhole.VM memory verifiedMessage = verifyWormholeRedeemMessage(params.encodedWormholeMessage); - - // Decode the message payload into the DepositWithPayload struct. Call the Circle TokenMinter - // contract to determine the address of the encoded token on this chain. - depositInfo = decodeDepositWithPayload(verifiedMessage.payload); - depositInfo.token = fetchLocalTokenAddress(depositInfo.sourceDomain, depositInfo.token); - - // confirm that circle gave us a valid token address - require(depositInfo.token != bytes32(0), "invalid local token address"); - - // confirm that the caller is the `mintRecipient` to ensure atomic execution - require(addressToBytes32(msg.sender) == depositInfo.mintRecipient, "caller must be mintRecipient"); - - // confirm that the caller passed the correct message pair - require( - verifyCircleMessage( - params.circleBridgeMessage, depositInfo.sourceDomain, depositInfo.targetDomain, depositInfo.nonce - ), - "invalid message pair" - ); - - // call the circle bridge to mint tokens to the recipient - bool success = circleTransmitter().receiveMessage(params.circleBridgeMessage, params.circleAttestation); - require(success, "CIRCLE_INTEGRATION: failed to mint tokens"); - - // emit Redeemed event - emit Redeemed(verifiedMessage.emitterChainId, verifiedMessage.emitterAddress, verifiedMessage.sequence); - } - - function verifyWormholeRedeemMessage(bytes memory encodedMessage) internal returns (IWormhole.VM memory) { - require(evmChain() == block.chainid, "invalid evm chain"); - - // parse and verify the Wormhole core message - (IWormhole.VM memory verifiedMessage, bool valid, string memory reason) = - wormhole().parseAndVerifyVM(encodedMessage); - - // confirm that the core layer verified the message - require(valid, reason); - - // verify that this message was emitted by a trusted contract - require(verifyEmitter(verifiedMessage), "unknown emitter"); - - // revert if this message has been consumed already - require(!isMessageConsumed(verifiedMessage.hash), "message already consumed"); - consumeMessage(verifiedMessage.hash); - - return verifiedMessage; - } - - function verifyEmitter(IWormhole.VM memory vm) internal view returns (bool) { - // verify that the sender of the wormhole message is a trusted - return ( - getRegisteredEmitter(vm.emitterChainId) == vm.emitterAddress && - vm.emitterAddress != bytes32(0) - ); - } - - function verifyCircleMessage(bytes memory circleMessage, uint32 sourceDomain, uint32 targetDomain, uint64 nonce) - internal - pure - returns (bool) - { - // parse the circle bridge message inline - uint32 circleSourceDomain = circleMessage.toUint32(4); - uint32 circleTargetDomain = circleMessage.toUint32(8); - uint64 circleNonce = circleMessage.toUint64(12); - - // confirm that both the Wormhole message and Circle message share the same transfer info - return (sourceDomain == circleSourceDomain && targetDomain == circleTargetDomain && nonce == circleNonce); - } - - /** - * @notice Fetches the local token address given an address and domain from - * a different chain. - * @param sourceDomain Circle domain for the sending chain. - * @param sourceToken Address of the token for the sending chain. - * @return Address bytes32 formatted address of the `sourceToken` on this chain. - */ - function fetchLocalTokenAddress(uint32 sourceDomain, bytes32 sourceToken) - public - view - returns (bytes32) - { - return addressToBytes32( - circleTokenMinter().remoteTokensToLocalTokens( - keccak256(abi.encodePacked(sourceDomain, sourceToken)) - ) - ); - } - - /** - * @notice Converts type address to bytes32 (left-zero-padded) - * @param address_ Address to convert to bytes32 - * @return Address bytes32 - */ - function addressToBytes32(address address_) public pure returns (bytes32) { - return bytes32(uint256(uint160(address_))); - } -} diff --git a/evm/src/circle_integration/CircleIntegrationGetters.sol b/evm/src/circle_integration/CircleIntegrationGetters.sol deleted file mode 100644 index 280ac2b..0000000 --- a/evm/src/circle_integration/CircleIntegrationGetters.sol +++ /dev/null @@ -1,145 +0,0 @@ -// SPDX-License-Identifier: Apache 2 -pragma solidity ^0.8.19; - -import {IWormhole} from "wormhole/interfaces/IWormhole.sol"; -import {ICircleBridge} from "../interfaces/circle/ICircleBridge.sol"; -import {IMessageTransmitter} from "../interfaces/circle/IMessageTransmitter.sol"; -import {ITokenMinter} from "../interfaces/circle/ITokenMinter.sol"; - -import {CircleIntegrationSetters} from "./CircleIntegrationSetters.sol"; - -contract CircleIntegrationGetters is CircleIntegrationSetters { - /** - * @notice isInitialized boolean for implementation (logic) contract - * @param impl Address of implementation contract - * @return IsInitialized bool - */ - function isInitialized(address impl) public view returns (bool) { - return _state.initializedImplementations[impl]; - } - - /** - * @notice Wormhole contract interface - * @return IWormhole interface - */ - function wormhole() public view returns (IWormhole) { - return IWormhole(_state.wormhole); - } - - /** - * @notice Wormhole chain ID of this chain - * @return chainId uint16 - */ - function chainId() public view returns (uint16) { - return _state.chainId; - } - - /** - * @notice Wormhole message finality - * @return wormholeFinality uint8 - */ - function wormholeFinality() public view returns (uint8) { - return _state.wormholeFinality; - } - - /** - * @notice Circle Bridge contract interface - * @return ICircleBridge interface - */ - function circleBridge() public view returns (ICircleBridge) { - return ICircleBridge(_state.circleBridgeAddress); - } - - /** - * @notice Circle Transmitter contract interface - * @return ICircleTransmitter interface - */ - function circleTransmitter() public view returns (IMessageTransmitter) { - return IMessageTransmitter(_state.circleTransmitterAddress); - } - - /** - * @notice Circle Token Minter contract interface - * @return ITokenMinter interface - */ - function circleTokenMinter() public view returns (ITokenMinter) { - return ITokenMinter(_state.circleTokenMinterAddress); - } - - /** - * @notice Registered Circle Integration contracts on other blockchains - * @param emitterChainId Wormhole chain ID for message sender - * @return RegisteredEmitter bytes32 - */ - function getRegisteredEmitter(uint16 emitterChainId) public view returns (bytes32) { - return _state.registeredEmitters[emitterChainId]; - } - - /** - * @notice Circle Bridge registered token boolean - * @param token Address of token being checked against the Circle TokenMinter - * @return AcceptedToken bool - */ - function isAcceptedToken(address token) public view returns (bool) { - return circleTokenMinter().burnLimitsPerMessage(token) > 0; - } - - /** - * @notice Circle domain to Wormhole chain ID - * @param chainId_ Wormhole chain ID - * @return CircleDomain uint32 - */ - function getDomainFromChainId(uint16 chainId_) public view returns (uint32) { - return _state.chainIdToDomain[chainId_]; - } - - /** - * @notice Wormhole chain ID to Circle domain - * @param domain Circle domain - * @return chainId uint16 - */ - function getChainIdFromDomain(uint32 domain) public view returns (uint16) { - return _state.domainToChainId[domain]; - } - - /** - * @notice Checks if Wormhole message was already consumed by this contract - * @param hash Wormhole message hash - * @return IsMessageConsumed bool - */ - function isMessageConsumed(bytes32 hash) public view returns (bool) { - return _state.consumedMessages[hash]; - } - - /** - * @notice Circle domain on this chain - * @return LocalDomain uint32 - */ - function localDomain() public view returns (uint32) { - return _state.localDomain; - } - - /** - * @notice Wormhole governance chain ID - * @return GovernanceChainId uint16 - */ - function governanceChainId() public view returns (uint16) { - return _state.governanceChainId; - } - - /** - * @notice Wormhole governance contract address (zero-left-padded address less than 32 bytes) - * @return GovernanceContract bytes32 - */ - function governanceContract() public view returns (bytes32) { - return _state.governanceContract; - } - - /** - * @notice EVM chain ID - * @return EVMChainID uint256 - */ - function evmChain() public view returns (uint256) { - return _state.evmChain; - } -} diff --git a/evm/src/circle_integration/CircleIntegrationGovernance.sol b/evm/src/circle_integration/CircleIntegrationGovernance.sol deleted file mode 100644 index d8e765b..0000000 --- a/evm/src/circle_integration/CircleIntegrationGovernance.sol +++ /dev/null @@ -1,222 +0,0 @@ -// SPDX-License-Identifier: Apache 2 -pragma solidity ^0.8.19; - -import {ERC1967Upgrade} from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Upgrade.sol"; - -import {IWormhole} from "wormhole/interfaces/IWormhole.sol"; -import {BytesLib} from "wormhole/libraries/external/BytesLib.sol"; - -import {CircleIntegrationSetters} from "./CircleIntegrationSetters.sol"; -import {CircleIntegrationGetters} from "./CircleIntegrationGetters.sol"; -import {CircleIntegrationState} from "./CircleIntegrationState.sol"; -import {ICircleIntegration} from "../interfaces/ICircleIntegration.sol"; - -contract CircleIntegrationGovernance is CircleIntegrationGetters, ERC1967Upgrade { - using BytesLib for bytes; - - /** - * @notice Emitted when implementation (logic) contracts are upgraded - * @param oldContract Previous implementation contract address - * @param newContract New implementation contract address - */ - event ContractUpgraded(address indexed oldContract, address indexed newContract); - - /** - * @notice Emitted when the Wormhole message finality state variable changes - * @param oldFinality Previous `wormholeFinality` value - * @param newFinality New `wormholeFinality` value - */ - event WormholeFinalityUpdated(uint8 indexed oldFinality, uint8 indexed newFinality); - - // "CircleIntegration" (left-zero-padded) - bytes32 constant GOVERNANCE_MODULE = 0x000000000000000000000000000000436972636c65496e746567726174696f6e; - - // for updating `wormholeFinality` - uint8 constant GOVERNANCE_UPDATE_WORMHOLE_FINALITY = 1; - uint256 constant GOVERNANCE_UPDATE_WORMHOLE_FINALITY_LENGTH = 36; - - // for registering an emitter (CircleIntegration contact on other blockchains) and Circle Bridge domain - uint8 constant GOVERNANCE_REGISTER_EMITTER_AND_DOMAIN = 2; - uint256 constant GOVERNANCE_REGISTER_EMITTER_AND_DOMAIN_LENGTH = 73; - - // for upgrading implementation (logic) contracts - uint8 constant GOVERNANCE_UPGRADE_CONTRACT = 3; - uint256 constant GOVERNANCE_UPGRADE_CONTRACT_LENGTH = 67; - - /** - * @notice `updateWormholeFinality` changes the wormhole message consistencyLevel. - * @param encodedMessage Attested Wormhole governance message with the following - * relevant fields: - * - Field Bytes Type Index - * - finality 1 uint8 35 - */ - function updateWormholeFinality(bytes memory encodedMessage) public { - bytes memory payload = verifyAndConsumeGovernanceMessage(encodedMessage, GOVERNANCE_UPDATE_WORMHOLE_FINALITY); - require(payload.length == GOVERNANCE_UPDATE_WORMHOLE_FINALITY_LENGTH, "invalid governance payload length"); - - // cache the current `wormholeFinality` value - uint8 currentWormholeFinality = wormholeFinality(); - - // updating finality should only be relevant for this contract's chain ID - require(payload.toUint16(33) == chainId(), "invalid target chain"); - - // parse the new `wormholeFinality` value at byte 35 - uint8 newWormholeFinality = payload.toUint8(35); - require(newWormholeFinality > 0, "invalid finality"); - - setWormholeFinality(newWormholeFinality); - - emit WormholeFinalityUpdated(currentWormholeFinality, newWormholeFinality); - } - - /** - * @notice `registerEmitterAndDomain` saves trusted CircleIntegration contract addresses - * and Circle's chain domains. - * @param encodedMessage Attested Wormhole governance message with the following - * relevant fields: - * - Field Bytes Type Index - * - foreignEmitterChainId 2 uint16 35 - * - foreignEmitterAddress 32 bytes32 37 - * - domain 4 uint32 69 - */ - function registerEmitterAndDomain(bytes memory encodedMessage) public { - bytes memory payload = verifyAndConsumeGovernanceMessage(encodedMessage, GOVERNANCE_REGISTER_EMITTER_AND_DOMAIN); - require(payload.length == GOVERNANCE_REGISTER_EMITTER_AND_DOMAIN_LENGTH, "invalid governance payload length"); - - // Registering emitters should only be relevant for this contract's chain ID, - // unless the target chain is 0 (which means all chains). - uint16 targetChainId = payload.toUint16(33); - require(targetChainId == 0 || targetChainId == chainId(), "invalid target chain"); - - // emitterChainId at byte 35 - uint16 emitterChainId = payload.toUint16(35); - require(emitterChainId > 0 && emitterChainId != chainId(), "invalid chain"); - require(getRegisteredEmitter(emitterChainId) == bytes32(0), "chain already registered"); - - // emitterAddress at byte 37 - bytes32 emitterAddress = payload.toBytes32(37); - require(emitterAddress != bytes32(0), "emitter cannot be zero address"); - - // domain at byte 69 (hehe) - uint32 domain = payload.toUint32(69); - require(domain != localDomain(), "domain == localDomain()"); - - // update the registeredEmitters state variable - setEmitter(emitterChainId, emitterAddress); - - // update the chainId to domain (and domain to chainId) mappings - setChainIdToDomain(emitterChainId, domain); - setDomainToChainId(domain, emitterChainId); - } - - /** - * @notice `upgradeContract` upgrades the implementation (logic) contract and - * initializes the new implementation. - * @param encodedMessage Attested Wormhole governance message with the following - * relevant fields: - * - Field Bytes Type Index - * - newImplementation 32 bytes32 35 - */ - function upgradeContract(bytes memory encodedMessage) public { - bytes memory payload = verifyAndConsumeGovernanceMessage(encodedMessage, GOVERNANCE_UPGRADE_CONTRACT); - require(payload.length == GOVERNANCE_UPGRADE_CONTRACT_LENGTH, "invalid governance payload length"); - - // contract upgrades should only be relevant for this contract's chain ID - require(payload.toUint16(33) == chainId(), "invalid target chain"); - - address currentImplementation = _getImplementation(); - - // newImplementation at byte 35 (32 bytes, but last 20 is the address) - address newImplementation = readAddressFromBytes32(payload, 35); - { - (, bytes memory queried) = - newImplementation.staticcall(abi.encodeWithSignature("circleIntegrationImplementation()")); - require(queried.length == 32, "invalid implementation"); - require( - abi.decode(queried, (bytes32)) == keccak256("circleIntegrationImplementation()"), - "invalid implementation" - ); - } - - _upgradeTo(newImplementation); - - // call initialize function of the new implementation - (bool success, bytes memory reason) = newImplementation.delegatecall(abi.encodeWithSignature("initialize()")); - require(success, string(reason)); - - emit ContractUpgraded(currentImplementation, newImplementation); - } - - function verifyAndConsumeGovernanceMessage(bytes memory encodedMessage, uint8 action) - internal - returns (bytes memory) - { - // verify the governance message - (bytes32 messageHash, bytes memory payload) = verifyGovernanceMessage(encodedMessage, action); - - // store the hash for replay protection - consumeMessage(messageHash); - - return payload; - } - - /** - * @notice `verifyGovernanceMessage` validates governance messages attested by - * Wormhole's network of guardians. - * @dev reverts if: - * - the EVM blockchain has forked - * - the governance message was not attested - * - the governance message was generated on the wrong blockchain - * - the governance message was already consumed - * - the encoded governance module is incorrect - * - the encoded governance action is incorrect - * @param encodedMessage Attested Wormhole governance message with the following - * relevant fields: - * - Field Bytes Type Index - * - governanceModule 32 bytes32 0 - * - governanceAction 1 uint8 32 - * @param action Expected governance action - * @return messageHash Wormhole governance message hash - * @return payload Verified Wormhole governance message payload - */ - function verifyGovernanceMessage(bytes memory encodedMessage, uint8 action) - public - view - returns (bytes32 messageHash, bytes memory payload) - { - // make sure the blockchain has not forked - require(evmChain() == block.chainid, "invalid evm chain"); - - // verify the governance message - (IWormhole.VM memory vm, bool valid, string memory reason) = wormhole().parseAndVerifyVM(encodedMessage); - require(valid, reason); - - // confirm that the governance message was sent from the governance contract - require(vm.emitterChainId == governanceChainId(), "invalid governance chain"); - require(vm.emitterAddress == governanceContract(), "invalid governance contract"); - - // confirm that this governance action has not been consumed already - require(!isMessageConsumed(vm.hash), "governance action already consumed"); - - // module at byte 0 - require(vm.payload.toBytes32(0) == GOVERNANCE_MODULE, "invalid governance module"); - - // action at byte 32 - require(vm.payload.toUint8(32) == action, "invalid governance action"); - - // set return values - payload = vm.payload; - messageHash = vm.hash; - } - - function readAddressFromBytes32(bytes memory serialized, uint256 start) internal pure returns (address) { - uint256 end = start + 12; - for (uint256 i = start; i < end;) { - require(serialized.toUint8(i) == 0, "invalid address"); - unchecked { - i += 1; - } - } - return serialized.toAddress(end); - } -} diff --git a/evm/src/circle_integration/CircleIntegrationImplementation.sol b/evm/src/circle_integration/CircleIntegrationImplementation.sol deleted file mode 100644 index e412a9e..0000000 --- a/evm/src/circle_integration/CircleIntegrationImplementation.sol +++ /dev/null @@ -1,26 +0,0 @@ -// SPDX-License-Identifier: Apache 2 -pragma solidity ^0.8.19; - -import {ERC1967Upgrade} from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Upgrade.sol"; - -import {CircleIntegration} from "./CircleIntegration.sol"; - -contract CircleIntegrationImplementation is CircleIntegration { - function initialize() public virtual initializer { - // this function needs to be exposed for an upgrade to pass - } - - modifier initializer() { - address impl = ERC1967Upgrade._getImplementation(); - - require(!isInitialized(impl), "already initialized"); - - setInitialized(impl); - - _; - } - - function circleIntegrationImplementation() public pure returns (bytes32) { - return keccak256("circleIntegrationImplementation()"); - } -} diff --git a/evm/src/circle_integration/CircleIntegrationMessages.sol b/evm/src/circle_integration/CircleIntegrationMessages.sol deleted file mode 100644 index d863efd..0000000 --- a/evm/src/circle_integration/CircleIntegrationMessages.sol +++ /dev/null @@ -1,101 +0,0 @@ -// SPDX-License-Identifier: Apache 2 -pragma solidity ^0.8.19; - -import {BytesLib} from "wormhole/libraries/external/BytesLib.sol"; - -import {CircleIntegrationStructs} from "./CircleIntegrationStructs.sol"; - -contract CircleIntegrationMessages is CircleIntegrationStructs { - using BytesLib for bytes; - - /** - * @notice `encodeDepositWithPayload` encodes the `DepositWithPayload` struct into bytes - * so that it can be sent as an arbitrary message payload via Wormhole. - * @param message `DepositWithPayload` struct containing the following attributes: - * - `token` Address (bytes32 left-zero-padded) of token to be minted - * - `amount` Amount of tokens to be minted - * - `sourceDomain` Circle domain for the source chain - * - `targetDomain` Circle domain for the target chain - * - `nonce` Circle sequence number for the transfer - * - `fromAddress` Source CircleIntegration contract caller's address - * - `mintRecipient` Recipient of minted tokens (must be caller of this contract) - * - `payload` Arbitrary Wormhole message payload - * @return EncodedDepositWithPayload bytes - */ - function encodeDepositWithPayload(DepositWithPayload memory message) public pure returns (bytes memory) { - return abi.encodePacked( - uint8(1), // payloadId - message.token, - message.amount, - message.sourceDomain, - message.targetDomain, - message.nonce, - message.fromAddress, - message.mintRecipient, - uint16(message.payload.length), - message.payload - ); - } - - /** - * @notice `decodeDepositWithPayload` decodes an encoded `DepositWithPayload` struct - * @dev reverts if: - * - the first byte (payloadId) does not equal 1 - * - the length of the payload is short or longer than expected - * @param encoded Encoded `DepositWithPayload` struct - * @return message `DepositWithPayload` struct containing the following attributes: - * - `token` Address (bytes32 left-zero-padded) of token to be minted - * - `amount` Amount of tokens to be minted - * - `sourceDomain` Circle domain for the source chain - * - `targetDomain` Circle domain for the target chain - * - `nonce` Circle sequence number for the transfer - * - `fromAddress` Source CircleIntegration contract caller's address - * - `mintRecipient` Recipient of minted tokens (must be caller of this contract) - * - `payload` Arbitrary Wormhole message payload - */ - function decodeDepositWithPayload(bytes memory encoded) public pure returns (DepositWithPayload memory message) { - // payloadId - require(encoded.toUint8(0) == 1, "invalid message payloadId"); - - uint256 index = 1; - - // token address - message.token = encoded.toBytes32(index); - index += 32; - - // token amount - message.amount = encoded.toUint256(index); - index += 32; - - // source domain - message.sourceDomain = encoded.toUint32(index); - index += 4; - - // target domain - message.targetDomain = encoded.toUint32(index); - index += 4; - - // nonce - message.nonce = encoded.toUint64(index); - index += 8; - - // fromAddress (contract caller) - message.fromAddress = encoded.toBytes32(index); - index += 32; - - // mintRecipient (target contract) - message.mintRecipient = encoded.toBytes32(index); - index += 32; - - // message payload length - uint256 payloadLen = encoded.toUint16(index); - index += 2; - - // parse the additional payload to confirm the entire message was parsed - message.payload = encoded.slice(index, payloadLen); - index += payloadLen; - - // confirm that the message payload is the expected length - require(index == encoded.length, "invalid message length"); - } -} diff --git a/evm/src/circle_integration/CircleIntegrationProxy.sol b/evm/src/circle_integration/CircleIntegrationProxy.sol deleted file mode 100644 index 1acba7d..0000000 --- a/evm/src/circle_integration/CircleIntegrationProxy.sol +++ /dev/null @@ -1,8 +0,0 @@ -// SPDX-License-Identifier: Apache 2 -pragma solidity ^0.8.19; - -import {ERC1967Proxy} from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol"; - -contract CircleIntegrationProxy is ERC1967Proxy { - constructor(address implementation, bytes memory initData) ERC1967Proxy(implementation, initData) {} -} diff --git a/evm/src/circle_integration/CircleIntegrationSetters.sol b/evm/src/circle_integration/CircleIntegrationSetters.sol deleted file mode 100644 index b1ce0fb..0000000 --- a/evm/src/circle_integration/CircleIntegrationSetters.sol +++ /dev/null @@ -1,63 +0,0 @@ -// SPDX-License-Identifier: Apache 2 -pragma solidity ^0.8.19; - -import {CircleIntegrationState} from "./CircleIntegrationState.sol"; - -contract CircleIntegrationSetters is CircleIntegrationState { - function setInitialized(address implementatiom) internal { - _state.initializedImplementations[implementatiom] = true; - } - - function setWormhole(address wormhole_) internal { - _state.wormhole = payable(wormhole_); - } - - function setChainId(uint16 chainId_) internal { - _state.chainId = chainId_; - } - - function setWormholeFinality(uint8 finality) internal { - _state.wormholeFinality = finality; - } - - function setCircleBridge(address circleBridgeAddress_) internal { - _state.circleBridgeAddress = circleBridgeAddress_; - } - - function setCircleTransmitter(address circleTransmitterAddress_) internal { - _state.circleTransmitterAddress = circleTransmitterAddress_; - } - - function setCircleTokenMinter(address circleTokenMinterAddress_) internal { - _state.circleTokenMinterAddress = circleTokenMinterAddress_; - } - - function setEmitter(uint16 chainId_, bytes32 emitter) internal { - _state.registeredEmitters[chainId_] = emitter; - } - - function setChainIdToDomain(uint16 chainId_, uint32 domain) internal { - _state.chainIdToDomain[chainId_] = domain; - } - - function setDomainToChainId(uint32 domain, uint16 chainId_) internal { - _state.domainToChainId[domain] = chainId_; - } - - function consumeMessage(bytes32 hash) internal { - _state.consumedMessages[hash] = true; - } - - function setLocalDomain(uint32 domain) internal { - _state.localDomain = domain; - } - - function setGovernance(uint16 governanceChainId, bytes32 governanceContract) internal { - _state.governanceChainId = governanceChainId; - _state.governanceContract = governanceContract; - } - - function setEvmChain(uint256 evmChain) internal { - _state.evmChain = evmChain; - } -} diff --git a/evm/src/circle_integration/CircleIntegrationSetup.sol b/evm/src/circle_integration/CircleIntegrationSetup.sol deleted file mode 100644 index 6571c85..0000000 --- a/evm/src/circle_integration/CircleIntegrationSetup.sol +++ /dev/null @@ -1,53 +0,0 @@ -// SPDX-License-Identifier: Apache 2 -pragma solidity ^0.8.19; - -import {ERC1967Upgrade} from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Upgrade.sol"; -import {Context} from "@openzeppelin/contracts/utils/Context.sol"; -import {IWormhole} from "wormhole/interfaces/IWormhole.sol"; -import {ICircleBridge} from "../interfaces/circle/ICircleBridge.sol"; -import {IMessageTransmitter} from "../interfaces/circle/IMessageTransmitter.sol"; -import {ITokenMinter} from "../interfaces/circle/ITokenMinter.sol"; - -import {CircleIntegrationSetters} from "./CircleIntegrationSetters.sol"; - -contract CircleIntegrationSetup is CircleIntegrationSetters, ERC1967Upgrade, Context { - function setup( - address implementation, - address wormholeAddress, - uint8 finality, - address circleBridgeAddress, - uint16 governanceChainId, - bytes32 governanceContract - ) public { - require(implementation != address(0), "invalid implementation"); - require(wormholeAddress != address(0), "invalid wormhole address"); - require(circleBridgeAddress != address(0), "invalid circle bridge address"); - - setWormhole(wormholeAddress); - setChainId(IWormhole(wormholeAddress).chainId()); - setWormholeFinality(finality); - setCircleBridge(circleBridgeAddress); - setGovernance(governanceChainId, governanceContract); - - // Cache circle bridge - ICircleBridge circleBridge = ICircleBridge(circleBridgeAddress); - - // Circle message transmitter contract - IMessageTransmitter messageTransmitter = circleBridge.localMessageTransmitter(); - setCircleTransmitter(address(messageTransmitter)); - setLocalDomain(messageTransmitter.localDomain()); - - // Circle token minter contract - ITokenMinter tokenMinter = circleBridge.localMinter(); - setCircleTokenMinter(address(tokenMinter)); - - setEvmChain(block.chainid); - - // set the implementation - _upgradeTo(implementation); - - // call initialize function of the new implementation - (bool success, bytes memory reason) = implementation.delegatecall(abi.encodeWithSignature("initialize()")); - require(success, string(reason)); - } -} diff --git a/evm/src/circle_integration/CircleIntegrationState.sol b/evm/src/circle_integration/CircleIntegrationState.sol deleted file mode 100644 index 26fe2cf..0000000 --- a/evm/src/circle_integration/CircleIntegrationState.sol +++ /dev/null @@ -1,61 +0,0 @@ -// SPDX-License-Identifier: Apache 2 -pragma solidity ^0.8.19; - -contract CircleIntegrationStorage { - struct State { - /// Wormhole chain ID of this contract - uint16 chainId; - - /** - * The number of block confirmations needed before the wormhole network - * will attest a message. - */ - uint8 wormholeFinality; - - /// Circle domain for this blockchain (grabbed from Circle's MessageTransmitter) - uint32 localDomain; - - /// address of the Wormhole contract on this chain - address wormhole; - - /// Wormhole governance chain ID - uint16 governanceChainId; - - /// Wormhole governance contract address (bytes32 zero-left-padded) - bytes32 governanceContract; - - /// address of the Circle Bridge contract on this chain - address circleBridgeAddress; - - /// address of the Circle Message Transmitter on this chain - address circleTransmitterAddress; - - /// address of the Circle Token Minter on this chain - address circleTokenMinterAddress; - - /// mapping of initialized implementation (logic) contracts - mapping(address => bool) initializedImplementations; - - /// Wormhole chain ID to known emitter address mapping - mapping(uint16 => bytes32) registeredEmitters; - - /// Wormhole chain ID to Circle chain domain mapping - mapping(uint16 => uint32) chainIdToDomain; - - /// Wormhole chain ID to Circle chain domain mapping - mapping(uint32 => uint16) domainToChainId; - - /// verified Wormhole message hash to boolean - mapping(bytes32 => bool) consumedMessages; - - /// expected EVM chain ID - uint256 evmChain; - - /// storage gap for additional state variables in future versions - uint256[50] ______gap; - } -} - -contract CircleIntegrationState { - CircleIntegrationStorage.State _state; -} diff --git a/evm/src/circle_integration/CircleIntegrationStructs.sol b/evm/src/circle_integration/CircleIntegrationStructs.sol deleted file mode 100644 index e2f9106..0000000 --- a/evm/src/circle_integration/CircleIntegrationStructs.sol +++ /dev/null @@ -1,28 +0,0 @@ -// SPDX-License-Identifier: Apache 2 -pragma solidity ^0.8.19; - -contract CircleIntegrationStructs { - struct TransferParameters { - address token; - uint256 amount; - uint16 targetChain; - bytes32 mintRecipient; - } - - struct RedeemParameters { - bytes encodedWormholeMessage; - bytes circleBridgeMessage; - bytes circleAttestation; - } - - struct DepositWithPayload { - bytes32 token; - uint256 amount; - uint32 sourceDomain; - uint32 targetDomain; - uint64 nonce; - bytes32 fromAddress; - bytes32 mintRecipient; - bytes payload; - } -} diff --git a/evm/src/contracts/CircleIntegration/Governance.sol b/evm/src/contracts/CircleIntegration/Governance.sol new file mode 100644 index 0000000..1fd9ec3 --- /dev/null +++ b/evm/src/contracts/CircleIntegration/Governance.sol @@ -0,0 +1,206 @@ +// SPDX-License-Identifier: Apache 2 +pragma solidity ^0.8.19; + +import {ERC1967Upgrade} from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Upgrade.sol"; + +import {BytesParsing} from "src/libraries/BytesParsing.sol"; +import {IWormhole} from "src/interfaces/IWormhole.sol"; +import {IGovernance} from "src/interfaces/IGovernance.sol"; + +import {State} from "./State.sol"; +import { + getRegisteredEmitters, + getChainToDomain, + getConsumedVaas, + getDomainToChain +} from "./Storage.sol"; + +abstract contract Governance is IGovernance, State, ERC1967Upgrade { + using BytesParsing for bytes; + + /** + * @dev Governance emitter chain ID. + */ + uint16 constant _GOVERNANCE_CHAIN = 1; + + /** + * @dev Governance emitter address. + */ + bytes32 constant _GOVERNANCE_EMITTER = + 0x0000000000000000000000000000000000000000000000000000000000000004; + + /** + * @dev "CircleIntegration" (left-padded with zeros). + */ + bytes32 constant GOVERNANCE_MODULE = + 0x000000000000000000000000000000436972636c65496e746567726174696f6e; + + /** + * @dev Governance action ID indicating decree to register new emitter and CCTP domain. + */ + uint8 constant _ACTION_REGISTER_EMITTER_AND_DOMAIN = 2; + + /** + * @dev Governance action ID indicating decree to upgrade contract. + */ + uint8 constant _ACTION_CONTRACT_UPGRADE = 3; + + /// @inheritdoc IGovernance + function registerEmitterAndDomain(bytes memory encodedVaa) public { + (IWormhole.VM memory vaa, uint256 offset) = + _verifyAndConsumeGovernanceMessage(encodedVaa, _ACTION_REGISTER_EMITTER_AND_DOMAIN); + + // Registering emitters should only be relevant for this contract's chain ID, + // unless the target chain is 0 (which means all chains). + uint16 targetChain; + (targetChain, offset) = vaa.payload.asUint16Unchecked(offset); + require(targetChain == 0 || targetChain == _chainId, "invalid target chain"); + + uint16 foreignChain; + (foreignChain, offset) = vaa.payload.asUint16Unchecked(offset); + require(foreignChain != 0 && foreignChain != _chainId, "invalid chain"); + + mapping(uint16 => bytes32) storage registeredEmitters = getRegisteredEmitters(); + + // For now, ensure that we cannot register the same foreign chain again. + require(registeredEmitters[foreignChain] == 0, "chain already registered"); + + bytes32 foreignAddress; + (foreignAddress, offset) = vaa.payload.asBytes32Unchecked(offset); + require(foreignAddress != 0, "emitter cannot be zero address"); + + uint32 cctpDomain; + (cctpDomain, offset) = vaa.payload.asUint32Unchecked(offset); + require(cctpDomain != _localCctpDomain, "domain == localDomain()"); + + _checkLength(vaa.payload, offset); + + // Set the registeredEmitters state variable. + registeredEmitters[foreignChain] = foreignAddress; + + // update the chainId to domain (and domain to chainId) mappings + getChainToDomain()[foreignChain] = cctpDomain; + getDomainToChain()[cctpDomain] = foreignChain; + } + + /// @inheritdoc IGovernance + function upgradeContract(bytes memory encodedVaa) public { + (IWormhole.VM memory vaa, uint256 offset) = + _verifyAndConsumeGovernanceMessage(encodedVaa, _ACTION_CONTRACT_UPGRADE); + + // contract upgrades should only be relevant for this contract's chain ID + uint16 targetChain; + (targetChain, offset) = vaa.payload.asUint16Unchecked(offset); + require(targetChain == _chainId, "invalid target chain"); + + bytes32 encodedImplementation; + (encodedImplementation, offset) = vaa.payload.asBytes32Unchecked(offset); + require(bytes12(encodedImplementation) == 0, "invalid address"); + + _checkLength(vaa.payload, offset); + + address newImplementation; + assembly ("memory-safe") { + newImplementation := encodedImplementation + } + + // Verify new implementation is CircleIntegration. + { + (, bytes memory queried) = newImplementation.staticcall( + abi.encodeWithSignature("circleIntegrationImplementation()") + ); + + require(queried.length == 32, "invalid implementation"); + require( + abi.decode(queried, (bytes32)) == keccak256("circleIntegrationImplementation()"), + "invalid implementation" + ); + } + + // Save the current implementation address for event. + address currentImplementation = _getImplementation(); + + _upgradeTo(newImplementation); + + // call initialize function of the new implementation + (bool success, bytes memory reason) = + newImplementation.delegatecall(abi.encodeWithSignature("initialize()")); + require(success, string(reason)); + + emit ContractUpgraded(currentImplementation, newImplementation); + } + + /// @inheritdoc IGovernance + function verifyGovernanceMessage(bytes memory encodedVaa, uint8 action) + public + view + returns (bytes32, bytes memory) + { + (IWormhole.VM memory vaa,) = _verifyGovernanceMessage(getConsumedVaas(), encodedVaa, action); + return (vaa.hash, vaa.payload); + } + + function _verifyAndConsumeGovernanceMessage(bytes memory encodedVaa, uint8 action) + private + returns (IWormhole.VM memory, uint256) + { + mapping(bytes32 => bool) storage consumedVaas = getConsumedVaas(); + + // verify the governance message + (IWormhole.VM memory vaa, uint256 offset) = + _verifyGovernanceMessage(consumedVaas, encodedVaa, action); + + // store the hash for replay protection + consumedVaas[vaa.hash] = true; + + return (vaa, offset); + } + + function _verifyGovernanceMessage( + mapping(bytes32 => bool) storage consumedVaas, + bytes memory encodedVaa, + uint8 action + ) private view returns (IWormhole.VM memory vaa, uint256 offset) { + // Make sure the blockchain has not forked. + require(block.chainid == _evmChain, "invalid evm chain"); + + // verify the governance message + bool valid; + string memory reason; + (vaa, valid, reason) = _wormhole.parseAndVerifyVM(encodedVaa); + require(valid, reason); + + // Confirm that the governance message was sent from the governance contract. + require(vaa.emitterChainId == _GOVERNANCE_CHAIN, "invalid governance chain"); + require(vaa.emitterAddress == _GOVERNANCE_EMITTER, "invalid governance contract"); + + // Confirm that this governance action has not been consumed already. + require(!consumedVaas[vaa.hash], "governance action already consumed"); + + bytes32 govModule; + (govModule, offset) = vaa.payload.asBytes32Unchecked(offset); + + require(govModule == GOVERNANCE_MODULE, "invalid governance module"); + + uint8 govAction; + (govAction, offset) = vaa.payload.asUint8Unchecked(offset); + + require(govAction == action, "invalid governance action"); + } + + function _checkLength(bytes memory encoded, uint256 expected) private pure { + require(encoded.length == expected, "invalid governance payload length"); + } + + // getters + + /// @inheritdoc IGovernance + function governanceChainId() public pure returns (uint16) { + return _GOVERNANCE_CHAIN; + } + + /// @inheritdoc IGovernance + function governanceContract() public pure returns (bytes32) { + return _GOVERNANCE_EMITTER; + } +} diff --git a/evm/src/contracts/CircleIntegration/Implementation.sol b/evm/src/contracts/CircleIntegration/Implementation.sol new file mode 100644 index 0000000..4b701ec --- /dev/null +++ b/evm/src/contracts/CircleIntegration/Implementation.sol @@ -0,0 +1,48 @@ +// SPDX-License-Identifier: Apache 2 +pragma solidity ^0.8.19; + +import {ERC1967Upgrade} from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Upgrade.sol"; + +import {Logic} from "./Logic.sol"; +import {State} from "./State.sol"; +import {getInitializedImplementations} from "./Storage.sol"; + +contract Implementation is Logic { + constructor(address wormhole, address cctpTokenMessenger) State(wormhole, cctpTokenMessenger) {} + + function initialize() public virtual initializer { + // This function needs to be exposed for an upgrade to pass. Any additional logic can be + // placed here. + + // WARNING: This snippet should be removed for any following contract upgrades + // We are using the below snippet to reset storage slots that are no longer being used + // for safety and to free them up for future use. We don't want to inadvertantly wipe + // the same slots on future upgrades. See Storage.sol for reasoning. + assembly ("memory-safe") { + sstore(0x0, 0x0) + sstore(0x1, 0x0) + sstore(0x2, 0x0) + sstore(0x3, 0x0) + sstore(0x4, 0x0) + sstore(0xA, 0x0) + } + } + + modifier initializer() { + address impl = ERC1967Upgrade._getImplementation(); + + mapping(address => bool) storage initialized = getInitializedImplementations(); + + // NOTE: Reverting with Error(string) comes from the old implementation, so we preserve it. + require(!initialized[impl], "already initialized"); + + // Mark implementation as initialized. + initialized[impl] = true; + + _; + } + + function circleIntegrationImplementation() public pure returns (bytes32) { + return keccak256("circleIntegrationImplementation()"); + } +} diff --git a/evm/src/contracts/CircleIntegration/Logic.sol b/evm/src/contracts/CircleIntegration/Logic.sol new file mode 100644 index 0000000..4c2bf0f --- /dev/null +++ b/evm/src/contracts/CircleIntegration/Logic.sol @@ -0,0 +1,236 @@ +// SPDX-License-Identifier: Apache 2 +pragma solidity ^0.8.19; + +import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import {SafeERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; + +import {IWormhole} from "src/interfaces/IWormhole.sol"; +import {IMessageTransmitter} from "src/interfaces/IMessageTransmitter.sol"; +import {ITokenMessenger} from "src/interfaces/ITokenMessenger.sol"; +import {ITokenMinter} from "src/interfaces/ITokenMinter.sol"; +import {ICircleIntegration} from "src/interfaces/ICircleIntegration.sol"; + +import {Utils} from "src/libraries/Utils.sol"; +import {WormholeCctpMessages} from "src/libraries/WormholeCctpMessages.sol"; + +import {Governance} from "./Governance.sol"; +import { + getChainToDomain, + getConsumedVaas, + getDomainToChain, + getInitializedImplementations, + getRegisteredEmitters +} from "./Storage.sol"; + +abstract contract Logic is ICircleIntegration, Governance { + using Utils for address; + using SafeERC20 for IERC20; + using WormholeCctpMessages for *; + + /// @inheritdoc ICircleIntegration + function transferTokensWithPayload( + TransferParameters calldata transferParams, + uint32 wormholeNonce, + bytes calldata payload + ) public payable returns (uint64 wormholeSequence) { + // Is the foreign Wormhole Circle Integration registered? + bytes32 destinationCaller = getRegisteredEmitters()[transferParams.targetChain]; + require(destinationCaller != 0, "target contract not registered"); + + // Deposit tokens into this contract to prepare for burning. + IERC20(transferParams.token).safeTransferFrom( + msg.sender, address(this), transferParams.amount + ); + + // Approve the Token Messenger to spend tokens. + setTokenMessengerApproval(transferParams.token, transferParams.amount); + + // Invoke Token Messenger to burn tokens and emit a CCTP token burn message. + (wormholeSequence,) = burnAndPublish( + destinationCaller, + getChainToDomain()[transferParams.targetChain], + transferParams.token, + transferParams.amount, + transferParams.mintRecipient, + wormholeNonce, + payload, + msg.value + ); + } + + /// @inheritdoc ICircleIntegration + function redeemTokensWithPayload(RedeemParameters calldata params) + public + returns (DepositWithPayload memory deposit) + { + // This check prevents this contract existing on this network's potential fork, where it was + // not freshly deployed. This is a safety measure to prevent replay attacks on the forked + // network. + require(evmChain() == block.chainid, "invalid evm chain"); + + // Verify the VAA and mint tokens. Set the deposit struct with WormholeCctpTokenMessenger's + // return values. + IWormhole.VM memory vaa; + ( + vaa, + deposit.token, + deposit.amount, + deposit.sourceDomain, + deposit.targetDomain, + deposit.nonce, + deposit.fromAddress, + deposit.mintRecipient, + deposit.payload + ) = verifyVaaAndMintLegacy( + params.encodedCctpMessage, params.cctpAttestation, params.encodedVaa + ); + + // Confirm that the caller is the `mintRecipient` to ensure atomic execution. + require( + msg.sender.toUniversalAddress() == deposit.mintRecipient, "caller must be mintRecipient" + ); + + // If this VAA does not come from a registered Wormhole Circle Integration contract, revert. + requireEmitterLegacy(vaa, getRegisteredEmitters()[vaa.emitterChainId]); + + mapping(bytes32 => bool) storage consumedVaas = getConsumedVaas(); + + // Revert if this message has been consumed already. This check is meant to prevent replay + // attacks, but it may not be necessary because the CCTP Message Transmitter already keeps + // track of used nonces. + require(!consumedVaas[vaa.hash], "message already consumed"); + + // Mark as consumed. + consumedVaas[vaa.hash] = true; + + // Emit Redeemed event. + emit Redeemed(vaa.emitterChainId, vaa.emitterAddress, vaa.sequence); + } + + // getters + + /// @inheritdoc ICircleIntegration + function fetchLocalTokenAddress(uint32 remoteDomain, bytes32 remoteToken) + public + view + returns (bytes32) + { + return fetchLocalToken(remoteDomain, remoteToken); + } + + /// @inheritdoc ICircleIntegration + function addressToBytes32(address evmAddr) public pure returns (bytes32 converted) { + converted = evmAddr.toUniversalAddress(); + } + + /// @inheritdoc ICircleIntegration + function decodeDepositWithPayload(bytes memory encoded) + public + pure + returns (DepositWithPayload memory deposit) + { + // This is a hack to get around using the decodeDeposit method. This is not a real VM + // obviously. + // + // Plus, this getter should never be used in practice. + IWormhole.VM memory fakeVaa; + fakeVaa.payload = encoded; + ( + deposit.token, + deposit.amount, + deposit.sourceDomain, + deposit.targetDomain, + deposit.nonce, + deposit.fromAddress, + deposit.mintRecipient, + deposit.payload + ) = fakeVaa.decodeDeposit(); + } + + /// @inheritdoc ICircleIntegration + function encodeDepositWithPayload(DepositWithPayload memory message) + public + pure + returns (bytes memory encoded) + { + encoded = message.token.encodeDeposit( + message.amount, + message.sourceDomain, + message.targetDomain, + message.nonce, + message.fromAddress, + message.mintRecipient, + message.payload + ); + } + + /// @inheritdoc ICircleIntegration + function isInitialized(address impl) public view returns (bool) { + return getInitializedImplementations()[impl]; + } + + /// @inheritdoc ICircleIntegration + function wormhole() public view returns (IWormhole) { + return _wormhole; + } + + /// @inheritdoc ICircleIntegration + function chainId() public view returns (uint16) { + return _chainId; + } + + /// @inheritdoc ICircleIntegration + function wormholeFinality() public pure returns (uint8) { + return _MESSAGE_FINALITY; + } + + /// @inheritdoc ICircleIntegration + function circleBridge() public view returns (ITokenMessenger) { + return _tokenMessenger; + } + + /// @inheritdoc ICircleIntegration + function circleTokenMinter() public view returns (ITokenMinter) { + return _tokenMinter; + } + + /// @inheritdoc ICircleIntegration + function circleTransmitter() public view returns (IMessageTransmitter) { + return _messageTransmitter; + } + + /// @inheritdoc ICircleIntegration + function getRegisteredEmitter(uint16 chain) public view returns (bytes32) { + return getRegisteredEmitters()[chain]; + } + + /// @inheritdoc ICircleIntegration + function isAcceptedToken(address token) public view returns (bool) { + return _tokenMinter.burnLimitsPerMessage(token) > 0; + } + + /// @inheritdoc ICircleIntegration + function getDomainFromChainId(uint16 chain) public view returns (uint32) { + return getChainToDomain()[chain]; + } + + /// @inheritdoc ICircleIntegration + function getChainIdFromDomain(uint32 cctpDomain) public view returns (uint16) { + return getDomainToChain()[cctpDomain]; + } + + /// @inheritdoc ICircleIntegration + function isMessageConsumed(bytes32 vaaHash) public view returns (bool) { + return getConsumedVaas()[vaaHash]; + } + + /// @inheritdoc ICircleIntegration + function localDomain() public view returns (uint32) { + return _localCctpDomain; + } + + /// @inheritdoc ICircleIntegration + function evmChain() public view returns (uint256) { + return _evmChain; + } +} diff --git a/evm/src/contracts/CircleIntegration/Setup.sol b/evm/src/contracts/CircleIntegration/Setup.sol new file mode 100644 index 0000000..d5546b8 --- /dev/null +++ b/evm/src/contracts/CircleIntegration/Setup.sol @@ -0,0 +1,19 @@ +// SPDX-License-Identifier: Apache 2 +pragma solidity ^0.8.19; + +import {ERC1967Upgrade} from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Upgrade.sol"; +import {Context} from "@openzeppelin/contracts/utils/Context.sol"; + +contract Setup is ERC1967Upgrade, Context { + function setup(address implementation) public { + require(implementation != address(0), "invalid implementation"); + + // set the implementation + _upgradeTo(implementation); + + // call initialize function of the new implementation + (bool success, bytes memory reason) = + implementation.delegatecall(abi.encodeWithSignature("initialize()")); + require(success, string(reason)); + } +} diff --git a/evm/src/contracts/CircleIntegration/State.sol b/evm/src/contracts/CircleIntegration/State.sol new file mode 100644 index 0000000..9038044 --- /dev/null +++ b/evm/src/contracts/CircleIntegration/State.sol @@ -0,0 +1,14 @@ +// SPDX-License-Identifier: Apache 2 +pragma solidity ^0.8.19; + +import {WormholeCctpTokenMessenger} from "src/contracts/WormholeCctpTokenMessenger.sol"; + +abstract contract State is WormholeCctpTokenMessenger { + uint256 immutable _evmChain; + + constructor(address wormhole, address cctpTokenMessenger) + WormholeCctpTokenMessenger(wormhole, cctpTokenMessenger) + { + _evmChain = block.chainid; + } +} diff --git a/evm/src/contracts/CircleIntegration/Storage.sol b/evm/src/contracts/CircleIntegration/Storage.sol new file mode 100644 index 0000000..81d0584 --- /dev/null +++ b/evm/src/contracts/CircleIntegration/Storage.sol @@ -0,0 +1,80 @@ +// SPDX-License-Identifier: Apache 2 +pragma solidity ^0.8.19; + +/** + * WARNING: This is the state layout of V0 before the first upgrade. + * Slots 0 -> 4 inclusive and slot 10 will be wiped to 0 on initialisation of the new + * implementation and will be safe to use again in the future. We are no longer + * using those variables in state, but they are instead immutables in the new implementation. + * If using those slots again, ensure the slots are not being wiped to 0 in the + * initialiser in future upgrades. + */ +/** + * struct State { + * // state.slot := 0x0 + * uint16 chainId; + * uint8 wormholeFinality; + * uint32 localDomain; + * address wormhole; + * uint16 governanceChainId; + * + * // state.slot := 0x1 + * bytes32 governanceContract; + * + * // state.slot := 0x2 + * address circleBridgeAddress; + * + * // state.slot := 0x3 + * address circleTransmitterAddress; + * + * // state.slot := 0x4 + * address circleTokenMinterAddress; + * + * // state.slot := 0x5 + * mapping(address => bool) initializedImplementations; + * + * // state.slot := 0x6 + * mapping(uint16 => bytes32) registeredEmitters; + * + * // state.slot := 0x7 + * mapping(uint16 => uint32) chainIdToDomain; + * + * // state.slot := 0x8 + * mapping(uint32 => uint16) domainToChainId; + * + * // state.slot := 0x9 + * mapping(bytes32 => bool) consumedMessages; + * + * // state.slot := 0xa + * uint256 evmChain; + * } + */ +function getInitializedImplementations() pure returns (mapping(address => bool) storage state) { + assembly ("memory-safe") { + state.slot := 0x5 + } +} + +function getRegisteredEmitters() pure returns (mapping(uint16 => bytes32) storage state) { + assembly ("memory-safe") { + state.slot := 0x6 + } +} + +function getChainToDomain() pure returns (mapping(uint16 => uint32) storage state) { + assembly ("memory-safe") { + state.slot := 0x7 + } +} + +function getDomainToChain() pure returns (mapping(uint32 => uint16) storage state) { + assembly ("memory-safe") { + state.slot := 0x8 + } +} + +function getConsumedVaas() pure returns (mapping(bytes32 => bool) storage state) { + assembly ("memory-safe") { + state.slot := 0x9 + } +} diff --git a/evm/src/contracts/WormholeCctpTokenMessenger.sol b/evm/src/contracts/WormholeCctpTokenMessenger.sol new file mode 100644 index 0000000..836c457 --- /dev/null +++ b/evm/src/contracts/WormholeCctpTokenMessenger.sol @@ -0,0 +1,362 @@ +// SPDX-License-Identifier: Apache 2 +pragma solidity ^0.8.19; + +import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import {SafeERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; + +import {IWormhole} from "src/interfaces/IWormhole.sol"; +import {IMessageTransmitter} from "src/interfaces/IMessageTransmitter.sol"; +import {ITokenMessenger} from "src/interfaces/ITokenMessenger.sol"; +import {ITokenMinter} from "src/interfaces/ITokenMinter.sol"; + +import {Utils} from "src/libraries/Utils.sol"; +import {WormholeCctpMessages} from "src/libraries/WormholeCctpMessages.sol"; + +/** + * @notice A way to associate a CCTP token burn message with a Wormhole message. + * @dev To construct the contract, the addresses to the Wormhole Core Bridge and CCTP Token + * Messenger must be provided. Using the CCTP Token Messenger, the Message Transmitter and Token + * Minter are derived. + * + * NOTE: For more information on CCTP message formats, please refer to the following: + * https://developers.circle.com/stablecoins/docs/message-format. + */ +abstract contract WormholeCctpTokenMessenger { + using Utils for address; + using SafeERC20 for IERC20; + using WormholeCctpMessages for *; + + /** + * @dev Parsing and verifying VAA reverted at the Wormhole Core Bridge contract level. + */ + error InvalidVaa(); + + /** + * @dev The CCTP message's source domain, destination domain and nonce must match the VAA's. + * NOTE: This nonce is the one acting as the CCTP message sequence (and not the arbitrary one + * specified when publishing Wormhole messages). + */ + error CctpVaaMismatch(uint32, uint32, uint64); + + /** + * @dev The emitter of the VAA must match the expected emitter. + */ + error UnexpectedEmitter(bytes32, bytes32); + + /** + * @dev Wormhole message finality. This value indicates a "finalized" consistency level, where + * finalized means the transaction where this message (event) lives will not be rolled back. + */ + uint8 constant _MESSAGE_FINALITY = 1; + + /** + * @dev Wormhole Core Bridge contract address. + */ + IWormhole immutable _wormhole; + + /** + * @dev Wormhole Chain ID. NOTE: This is NOT the EVM chain ID. + */ + uint16 immutable _chainId; + + /** + * @dev CCTP Message Transmitter contract interface. + */ + IMessageTransmitter immutable _messageTransmitter; + + /** + * @dev CCTP Token Messenger contract interface. + */ + ITokenMessenger immutable _tokenMessenger; + + /** + * @dev CCTP Token Minter contract interface. + */ + ITokenMinter immutable _tokenMinter; + + /** + * @dev CCTP domain for this network (configured by the CCTP Message Transmitter). + */ + uint32 immutable _localCctpDomain; + + constructor(address wormhole, address cctpTokenMessenger) { + _wormhole = IWormhole(wormhole); + _chainId = _wormhole.chainId(); + + _tokenMessenger = ITokenMessenger(cctpTokenMessenger); + _messageTransmitter = _tokenMessenger.localMessageTransmitter(); + _tokenMinter = _tokenMessenger.localMinter(); + _localCctpDomain = _messageTransmitter.localDomain(); + } + + /** + * @dev A convenience method to set the token spending allowance for the CCTP Token Messenger, + * who will ultimately be burning the tokens. + */ + function setTokenMessengerApproval(address token, uint256 amount) internal { + IERC20(token).approve(address(_tokenMessenger), amount); + } + + /** + * @dev Method to burn tokens via CCTP Token Messenger and publish a Wormhole message associated + * with the CCTP Token Burn message. The Wormhole message encodes a `Deposit` (ID == 1), which + * has the same source domain, destination domain and nonce as the CCTP Token Burn message. + * + * NOTE: This method does not protect against re-entrancy here because it relies on the CCTP + * Token Messenger to protect against any possible re-entrancy. We are leaning on the fact that + * the Token Messenger keeps track of its local tokens, which are the only tokens it allows to + * burn (and in turn, mint on another network). + * + * NOTE: The wormhole message fee is not required to be paid by the transaction sender (so an + * integrator can use ETH funds in his contract to pay for this fee if he wants to). + */ + function burnAndPublish( + bytes32 destinationCaller, + uint32 destinationCctpDomain, + address token, + uint256 amount, + bytes32 mintRecipient, + uint32 wormholeNonce, + bytes memory payload, + uint256 wormholeFee + ) internal returns (uint64 wormholeSequence, uint64 cctpNonce) { + // Invoke Token Messenger to burn tokens and emit a CCTP token burn message. + cctpNonce = _tokenMessenger.depositForBurnWithCaller( + amount, destinationCctpDomain, mintRecipient, token, destinationCaller + ); + + // Publish deposit message via Wormhole Core Bridge. + wormholeSequence = _wormhole.publishMessage{value: wormholeFee}( + wormholeNonce, + token.encodeDeposit( + amount, + _localCctpDomain, // sourceCctpDomain + destinationCctpDomain, + cctpNonce, + msg.sender.toUniversalAddress(), // burnSource + mintRecipient, + payload + ), + _MESSAGE_FINALITY + ); + } + + /** + * @dev Method to verify and reconcile CCTP and Wormhole messages in order to mint tokens for + * the encoded mint recipient. This method will revert with custom errors. + * NOTE: This method does not require the caller to be the mint recipient. If your contract + * requires that the mint recipient is the caller, you should add a check after calling this + * method to see if msg.sender.toUniversalAddress() == mintRecipient. + */ + function verifyVaaAndMint( + bytes calldata encodedCctpMessage, + bytes calldata cctpAttestation, + bytes calldata encodedVaa + ) + internal + returns ( + IWormhole.VM memory vaa, + bytes32 token, + uint256 amount, + bytes32 burnSource, + bytes32 mintRecipient, + bytes memory payload + ) + { + // First parse and verify VAA. + vaa = _parseAndVerifyVaa( + encodedVaa, + true // revertCustomErrors + ); + + // Decode the deposit message so we can match the Wormhole message with the CCTP message. + uint32 sourceCctpDomain; + uint32 destinationCctpDomain; + uint64 cctpNonce; + ( + token, + amount, + sourceCctpDomain, + destinationCctpDomain, + cctpNonce, + burnSource, + mintRecipient, + payload + ) = vaa.decodeDeposit(); + + // Finally reconcile messages and mint tokens to the mint recipient. + token = _matchMessagesAndMint( + encodedCctpMessage, + cctpAttestation, + sourceCctpDomain, + destinationCctpDomain, + cctpNonce, + token, + true // revertCustomErrors + ); + } + + /** + * @dev PLEASE USE `verifyVaaAndMint` INSTEAD. Method to verify and reconcile CCTP and Wormhole + * messages in order to mint tokens for the encoded mint recipient. This method will revert with + * Solidity's built-in Error(string). + * NOTE: This method does not require the caller to be the mint recipient. If your contract + * requires that the mint recipient is the caller, you should add a check after calling this + * method to see if msg.sender.toUniversalAddress() == mintRecipient. + */ + function verifyVaaAndMintLegacy( + bytes calldata encodedCctpMessage, + bytes calldata cctpAttestation, + bytes calldata encodedVaa + ) + internal + returns ( + IWormhole.VM memory vaa, + bytes32 token, + uint256 amount, + uint32 sourceCctpDomain, + uint32 destinationCctpDomain, + uint64 cctpNonce, + bytes32 burnSource, + bytes32 mintRecipient, + bytes memory payload + ) + { + // First parse and verify VAA. + vaa = _parseAndVerifyVaa( + encodedVaa, + false // revertCustomErrors + ); + + // Decode the deposit message so we can match the Wormhole message with the CCTP message. + ( + token, + amount, + sourceCctpDomain, + destinationCctpDomain, + cctpNonce, + burnSource, + mintRecipient, + payload + ) = vaa.decodeDeposit(); + + // Finally reconcile messages and mint tokens to the mint recipient. + token = _matchMessagesAndMint( + encodedCctpMessage, + cctpAttestation, + sourceCctpDomain, + destinationCctpDomain, + cctpNonce, + token, + false // revertCustomErrors + ); + } + + /** + * @dev For a given remote domain and token, fetch the corresponding local token, for which the + * CCTP Token Minter has minting authority. + */ + function fetchLocalToken(uint32 remoteDomain, bytes32 remoteToken) + internal + view + returns (bytes32 localToken) + { + localToken = _tokenMinter.remoteTokensToLocalTokens( + keccak256(abi.encodePacked(remoteDomain, remoteToken)) + ).toUniversalAddress(); + } + + /** + * @dev We encourage an integrator to use this method to make sure the VAA is emitted from one + * that his contract trusts. Usually foreign emitters are stored in a mapping keyed off by + * Wormhole Chain ID (uint16). + * + * NOTE: Reverts with `UnexpectedEmitter(bytes32, bytes32)`. + */ + function requireEmitter(IWormhole.VM memory vaa, bytes32 expectedEmitter) internal pure { + if (expectedEmitter != 0 && vaa.emitterAddress != expectedEmitter) { + revert UnexpectedEmitter(vaa.emitterAddress, expectedEmitter); + } + } + + /** + * @dev We encourage an integrator to use this method to make sure the VAA is emitted from one + * that his contract trusts. Usually foreign emitters are stored in a mapping keyed off by + * Wormhole Chain ID (uint16). + * + * NOTE: Reverts with built-in Error(string). + */ + function requireEmitterLegacy(IWormhole.VM memory vaa, bytes32 expectedEmitter) internal pure { + require(expectedEmitter != 0 && vaa.emitterAddress == expectedEmitter, "unknown emitter"); + } + + // private + + function _parseAndVerifyVaa(bytes calldata encodedVaa, bool revertCustomErrors) + private + view + returns (IWormhole.VM memory vaa) + { + bool valid; + string memory reason; + (vaa, valid, reason) = _wormhole.parseAndVerifyVM(encodedVaa); + + if (!valid) { + if (revertCustomErrors) { + revert InvalidVaa(); + } else { + Utils.revertBuiltIn(reason); + } + } + } + + function _matchMessagesAndMint( + bytes calldata encodedCctpMessage, + bytes calldata cctpAttestation, + uint32 vaaSourceCctpDomain, + uint32 vaaDestinationCctpDomain, + uint64 vaaCctpNonce, + bytes32 burnToken, + bool revertCustomErrors + ) private returns (bytes32 mintToken) { + // Confirm that the caller passed the correct message pair. + { + uint32 sourceDomain; + uint32 destinationDomain; + uint64 nonce; + + assembly ("memory-safe") { + // NOTE: First four bytes is the CCTP message version. + let ptr := calldataload(encodedCctpMessage.offset) + + // NOTE: There is no need to mask here because the types defined outside of this + // block will already perform big-endian masking. + + // Source domain is bytes 4..8, so shift 24 bytes to the right. + sourceDomain := shr(192, ptr) + // Destination domain is bytes 8..12, so shift 20 bytes to the right. + destinationDomain := shr(160, ptr) + // Nonce is bytes 12..20, so shift 12 bytes to the right. + nonce := shr(96, ptr) + } + + if ( + vaaSourceCctpDomain != sourceDomain || vaaDestinationCctpDomain != destinationDomain + || vaaCctpNonce != nonce + ) { + if (revertCustomErrors) { + revert CctpVaaMismatch(sourceDomain, destinationDomain, nonce); + } else { + Utils.revertBuiltIn("invalid message pair"); + } + } + } + + // Call the circle bridge to mint tokens to the recipient. + _messageTransmitter.receiveMessage(encodedCctpMessage, cctpAttestation); + + // We should trust that this getter will not return the zero address because the TokenMinter + // will have already minted the valid token for the mint recipient. + mintToken = fetchLocalToken(vaaSourceCctpDomain, burnToken); + } +} diff --git a/evm/src/interfaces/ICircleIntegration.sol b/evm/src/interfaces/ICircleIntegration.sol index 5985c1b..bd7ea61 100644 --- a/evm/src/interfaces/ICircleIntegration.sol +++ b/evm/src/interfaces/ICircleIntegration.sol @@ -1,25 +1,25 @@ // SPDX-License-Identifier: Apache 2 +pragma solidity ^0.8.0; -pragma solidity ^0.8.19; +import {IWormhole} from "./IWormhole.sol"; +import {IMessageTransmitter} from "./IMessageTransmitter.sol"; +import {ITokenMessenger} from "./ITokenMessenger.sol"; +import {ITokenMinter} from "./ITokenMinter.sol"; -import {IWormhole} from "wormhole/interfaces/IWormhole.sol"; -import {ICircleBridge} from "./circle/ICircleBridge.sol"; -import {IMessageTransmitter} from "./circle/IMessageTransmitter.sol"; - -interface ICircleIntegration { - struct TransferParameters { - address token; - uint256 amount; - uint16 targetChain; - bytes32 mintRecipient; - } - - struct RedeemParameters { - bytes encodedWormholeMessage; - bytes circleBridgeMessage; - bytes circleAttestation; - } +import {IGovernance} from "./IGovernance.sol"; +/** + * @title Wormhole Circle Integration. + * @notice This contract burns and mints Circle-supported tokens by using Circle's Cross-Chain + * Transfer Protocol. It also emits Wormhole messages with arbitrary payloads to allow for + * additional composability when performing cross-chain transfers of Circle-suppored assets. These + * messages are paired with each other by encoding the CCTP source domain, target domain, and nonce. + */ +interface ICircleIntegration is IGovernance { + /** + * @notice Message encoded in Wormhole message payload. Wormhole CCTP ensures that this message + * is paired with the corresponding CCTP Token Burn message. + */ struct DepositWithPayload { bytes32 token; uint256 amount; @@ -31,59 +31,246 @@ interface ICircleIntegration { bytes payload; } - function transferTokensWithPayload(TransferParameters memory transferParams, uint32 batchId, bytes memory payload) - external - payable - returns (uint64 messageSequence); + /** + * @notice Parameters used for outbound transfers. + */ + struct TransferParameters { + address token; + uint256 amount; + uint16 targetChain; + bytes32 mintRecipient; + } + + /** + * @notice Parameters used for inbound transfers. + */ + struct RedeemParameters { + bytes encodedVaa; + bytes encodedCctpMessage; + bytes cctpAttestation; + } - function redeemTokensWithPayload(RedeemParameters memory params) + /** + * @notice Emitted when Circle-supported assets have been minted to the mintRecipient. + * @param emitterChainId Wormhole chain ID of source emitter contract. + * @param emitterAddress Universal address of source emitter. + * @param sequence Wormhole message sequence used to mint tokens. + */ + event Redeemed( + uint16 indexed emitterChainId, bytes32 indexed emitterAddress, uint64 indexed sequence + ); + + /** + * @notice This method calls the CCTP Token Messenger contract to burn Circle-supported tokens. + * It emits a Wormhole message containing a user-specified payload with instructions for what to + * do with the Circle-supported assets once they have been minted on the target chain. + * @dev This method does not protect against re-entrancy here because we rely on the CCTP Token + * Messenger contract to protect against any possible re-entrancy. We are leaning on the fact + * that the Token Messenger keeps track of its local tokens, which are the only tokens it allows + * to burn. + * + * Reverts if: + * - `targetChain` is not supported (i.e. no Wormhole Circle Integration exists on targeted + * network). + * - User passes insufficient value to pay Wormhole message fee (reverts at Wormhole level). + * - `token` is not supported by CCTP Token Messenger (reverts at CCTP level). + * - `amount` is zero (reverts at CCTP level). + * - `mintRecipient` is zero address (reverts at CCTP level). + * @param transferParams Struct containing the following attributes: + * - `token` Address of the token to be burned. + * - `amount` Amount of `token` to be burned. + * - `targetChain` Wormhole chain ID of the target blockchain. + * - `mintRecipient` The recipient wallet or contract address on the target chain. + * @param wormholeNonce Arbitrary ID for integrator-specific use. + * @param payload Arbitrary payload to be delivered to the target chain via Wormhole. + * @return wormholeSequence Wormhole message sequence number for this contract. + */ + function transferTokensWithPayload( + TransferParameters calldata transferParams, + uint32 wormholeNonce, + bytes calldata payload + ) external payable returns (uint64 wormholeSequence); + + /** + * @notice This method verifies a Wormhole VAA from the source chain and reconciles this message + * with the CCTP message. It calls the CCTP Message Transmitter using the CCTP attestation to + * allow the CCTP Token Minter to mint tokens to the specified mint recipient. + * @dev This contract requires that the mint recipient is the caller to ensure atomic execution + * of the additional instructions in the Wormhole message. + * + * Reverts if: + * - Wormhole message is not properly attested (reverts at Wormhole level). + * - Wormhole message was not emitted from a registered contract. + * - Wormhole message was already consumed by this contract. + * - msg.sender is not the encoded mint recipient. + * - CCTP Token Burn message and Wormhole message are not associated with each other. + * - CCTP Message Transmitter's `receiveMessage` call fails (reverts at CCTP level). + * @param params Struct containing the following attributes: + * - `encodedVaa` Wormhole VAA reflecting message emitted by a registered contract, encoding the + * CCTP message information to reconcile with the provided CCTP message. + * - `encodedCctpMessage` CCTP Message emitted by the CCTP Token Messenger contract with + * information regarding the token burned from the source network. + * - `cctpAttestation` Serialized EC signature(s) attesting the CCTP message. + * @return deposit Struct containing the following attributes: + * - `token` Address (left padded with zeros) of minted token. + * - `amount` Amount of tokens minted. + * - `sourceDomain` CCTP domain of originating network (where tokens were burned). + * - `targetDomain` CCTP domain of this network. + * - `nonce` CCTP sequence number for token burn. + * - `fromAddress` Source network's caller address. + * - `mintRecipient` Recipient of minted tokens (must be caller of this contract). + * - `payload` Message encoding integrator-specific information. + */ + function redeemTokensWithPayload(RedeemParameters calldata params) external - returns (DepositWithPayload memory depositWithPayload); + returns (DepositWithPayload memory deposit); + /** + * @notice Fetches the local token address given an address and domain from + * a different chain. + * @param sourceDomain CCTP domain for the sending chain. + * @param sourceToken Address of the token for the sending chain. + * @return LocalToken address left-padded with zeros. + */ function fetchLocalTokenAddress(uint32 sourceDomain, bytes32 sourceToken) external view returns (bytes32); - function encodeDepositWithPayload(DepositWithPayload memory message) external pure returns (bytes memory); + /** + * @notice Converts EVM address to universal (32-bytes left-padded with zeros) address. + * @param evmAddr Address to convert. + * @return converted Universal address. + */ + function addressToBytes32(address evmAddr) external view returns (bytes32 converted); + + /** + * @notice This method encodes the `DepositWithPayload` struct into the Wormhole message + * payload, which includes its payload ID. + * @param message `DepositWithPayload` struct containing the following attributes: + * - `token` Address (left padded with zeros) of minted token. + * - `amount` Amount of tokens minted. + * - `sourceDomain` CCTP domain of originating network (where tokens were burned). + * - `targetDomain` CCTP domain of target network. + * - `nonce` CCTP sequence number for token burn. + * - `fromAddress` Source network's caller address. + * - `mintRecipient` Recipient of minted tokens (must be caller of this contract). + * - `payload` Message encoding integrator-specific information. + * @return EncodedDepositWithPayload bytes + */ + function encodeDepositWithPayload(DepositWithPayload memory message) + external + pure + returns (bytes memory); - function decodeDepositWithPayload(bytes memory encoded) external pure returns (DepositWithPayload memory message); + /** + * @notice This method decodes an encoded `DepositWithPayload` struct. + * @dev Reverts if: + * - The first byte (payloadId) does not equal 1. + * - The length of the payload does not equal the encoded length. + * @param encoded Encoded `DepositWithPayload` message. + * @return deposit `DepositWithPayload` struct containing the following attributes: + * - `token` Address (left padded with zeros) of minted token. + * - `amount` Amount of tokens minted. + * - `sourceDomain` CCTP domain of originating network (where tokens were burned). + * - `targetDomain` CCTP domain of target network. + * - `nonce` CCTP sequence number for token burn. + * - `fromAddress` Source network's caller address. + * - `mintRecipient` Recipient of minted tokens (must be caller of this contract). + * - `payload` Message encoding integrator-specific information. + */ + function decodeDepositWithPayload(bytes memory encoded) + external + pure + returns (DepositWithPayload memory deposit); + /** + * @notice This method checks whether deployed implementation has been initialized. + * @param impl Address of implementation (logic) contract. + * @return IsInitialized indicating whether implementation has been initialized. + */ function isInitialized(address impl) external view returns (bool); + /** + * @notice Wormhole contract interface. + * @return IWormhole interface. + */ function wormhole() external view returns (IWormhole); + /** + * @notice Wormhole chain ID of this network. + * @return ChainId value. + */ function chainId() external view returns (uint16); + /** + * @notice Wormhole message finality. + * @return WormholeFinality value. + */ function wormholeFinality() external view returns (uint8); - function circleBridge() external view returns (ICircleBridge); + /** + * @notice CCTP Token Messenger contract interface. + * @return ITokenMessenger interface. + */ + function circleBridge() external view returns (ITokenMessenger); + + /** + * @notice CCTP Token Minter contract interface. + * @return ITokenMinter interface. + */ + function circleTokenMinter() external view returns (ITokenMinter); + /** + * @notice CCTP Message Transmitter contract interface. + * @return ICircleTransmitter interface. + */ function circleTransmitter() external view returns (IMessageTransmitter); - function getRegisteredEmitter(uint16 emitterChainId) external view returns (bytes32); + /** + * @notice Registered Circle Integration contract for a particular Wormhole chain ID. + * @param chain Wormhole chain ID for message sender. + * @return RegisteredEmitter as universal address. + */ + function getRegisteredEmitter(uint16 chain) external view returns (bytes32); + /** + * @notice This method checks whether token is valid using CCTP Token Minter's burn limit. + * @param token Address of Circle-supported token. + * @return AcceptedToken indicating whether token is valid. + */ function isAcceptedToken(address token) external view returns (bool); - function getDomainFromChainId(uint16 chainId_) external view returns (uint32); + /** + * @notice Convert CCTP domain to Wormhole chain ID. + * @param chain Wormhole chain ID. + * @return CctpDomain value. + */ + function getDomainFromChainId(uint16 chain) external view returns (uint32); - function getChainIdFromDomain(uint32 domain) external view returns (uint16); + /** + * @notice Convert Wormhole chain ID to CCTP domain. + * @param cctpDomain CCTP domain. + * @return ChainId value. + */ + function getChainIdFromDomain(uint32 cctpDomain) external view returns (uint16); - function isMessageConsumed(bytes32 hash) external view returns (bool); + /** + * @notice This method checks if Wormhole message was already consumed by this contract. + * @param vaaHash Wormhole message hash. + * @return IsMessageConsumed indicating whether message has been consumed. + */ + function isMessageConsumed(bytes32 vaaHash) external view returns (bool); + /** + * @notice Fetch CCTP domain of this network. + * @return LocalDomain value. + */ function localDomain() external view returns (uint32); - function verifyGovernanceMessage(bytes memory encodedMessage, uint8 action) - external - view - returns (bytes32 messageHash, bytes memory payload); - + /** + * @notice Fetch this network's EVM chain ID. + * @return EVMChainID value. + */ function evmChain() external view returns (uint256); - - // guardian governance only - function updateWormholeFinality(bytes memory encodedMessage) external; - - function registerEmitterAndDomain(bytes memory encodedMessage) external; - - function upgradeContract(bytes memory encodedMessage) external; } diff --git a/evm/src/interfaces/IGovernance.sol b/evm/src/interfaces/IGovernance.sol new file mode 100644 index 0000000..1578e58 --- /dev/null +++ b/evm/src/interfaces/IGovernance.sol @@ -0,0 +1,66 @@ +// SPDX-License-Identifier: Apache 2 +pragma solidity ^0.8.0; + +interface IGovernance { + /** + * @notice Event indicating when proxy is pointing to new implementation (logic) contract. + * @param oldContract Previous implementation contract address. + * @param newContract New implementation contract address. + */ + event ContractUpgraded(address indexed oldContract, address indexed newContract); + + /** + * @notice This method consumes a governance VAA to save a trusted foreign Circle Integration + * contract address and to associate a Wormhole chain ID with a CCTP domain of the same network. + * @param encodedVaa Wormhole governance VAA. + * @dev The governance VAA is encoded with the following encoded information: + * Field | Bytes | Type | Index + * ----------------------------------------- + * Foreign Chain | 2 | uint16 | 35 + * Foreign Emitter | 32 | bytes32 | 37 + * CCTP Domain | 4 | uint32 | 69 + */ + function registerEmitterAndDomain(bytes memory encodedVaa) external; + + /** + * @notice This method consumes a governance VAA to upgrade the implementation (logic) contract + * and to initialize this implementation. + * @param encodedVaa Wormhole governance VAA. + * @dev The governance VAA is encoded with the following encoded information: + * Field | Bytes | Type | Index + * -------------------------------------------- + * New Implementation | 32 | bytes32 | 35 + */ + function upgradeContract(bytes memory encodedVaa) external; + + /** + * @notice This method validates a governance VAA. + * @dev Reverts if: + * - The EVM network has forked. + * - The governance message was not attested. + * - The governance message was generated on the wrong network. + * - The governance message was already consumed. + * - The encoded governance module is not the Circle Integration's governance module. + * - The encoded governance action does not equal the provided one. + * @param encodedVaa Wormhole governance VAA. + * @param action Expected governance action. + * @return messageHash Wormhole governance message hash. + * @return payload Verified Wormhole governance message payload. + */ + function verifyGovernanceMessage(bytes memory encodedVaa, uint8 action) + external + view + returns (bytes32 messageHash, bytes memory payload); + + /** + * @notice Fetch Circle Integration's governance chain ID. + * @return GovernanceChainId value. + */ + function governanceChainId() external returns (uint16); + + /** + * @notice Fetch Circle Integration's governance emitter address. + * @return GovernanceContract address. + */ + function governanceContract() external returns (bytes32); +} diff --git a/evm/src/interfaces/circle/IMessageTransmitter.sol b/evm/src/interfaces/IMessageTransmitter.sol similarity index 90% rename from evm/src/interfaces/circle/IMessageTransmitter.sol rename to evm/src/interfaces/IMessageTransmitter.sol index 3d9ffe5..d567df3 100644 --- a/evm/src/interfaces/circle/IMessageTransmitter.sol +++ b/evm/src/interfaces/IMessageTransmitter.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: Apache 2 -pragma solidity ^0.8.19; +pragma solidity ^0.8.0; interface IMessageTransmitter { event MessageSent(bytes message); @@ -40,12 +40,12 @@ interface IMessageTransmitter { * of the attester address recovered from signatures. * @return success bool, true if successful */ - function receiveMessage(bytes memory _message, bytes calldata _attestation) external returns (bool success); + function receiveMessage(bytes memory _message, bytes calldata _attestation) + external + returns (bool success); function attesterManager() external view returns (address); - function availableNonces(uint32 domain) external view returns (uint64); - function getNumEnabledAttesters() external view returns (uint256); function isEnabledAttester(address _attester) external view returns (bool); @@ -54,6 +54,8 @@ interface IMessageTransmitter { function maxMessageBodySize() external view returns (uint256); + function nextAvailableNonce() external view returns (uint64); + function owner() external view returns (address); function paused() external view returns (bool); @@ -62,6 +64,10 @@ interface IMessageTransmitter { function rescuer() external view returns (address); + function signatureThreshold() external view returns (uint256); + + function usedNonces(bytes32) external view returns (uint256); + function version() external view returns (uint32); // owner only methods diff --git a/evm/src/interfaces/circle/ICircleBridge.sol b/evm/src/interfaces/ITokenMessenger.sol similarity index 85% rename from evm/src/interfaces/circle/ICircleBridge.sol rename to evm/src/interfaces/ITokenMessenger.sol index a8ae46a..bb028e8 100644 --- a/evm/src/interfaces/circle/ICircleBridge.sol +++ b/evm/src/interfaces/ITokenMessenger.sol @@ -1,10 +1,10 @@ // SPDX-License-Identifier: Apache 2 -pragma solidity ^0.8.19; +pragma solidity ^0.8.0; import {IMessageTransmitter} from "./IMessageTransmitter.sol"; import {ITokenMinter} from "./ITokenMinter.sol"; -interface ICircleBridge { +interface ITokenMessenger { /** * @notice Deposits and burns tokens from sender to be minted on destination domain. * Emits a `DepositForBurn` event. @@ -21,9 +21,12 @@ interface ICircleBridge { * @param _burnToken address of contract to burn deposited tokens, on local domain * @return _nonce unique nonce reserved by message */ - function depositForBurn(uint256 _amount, uint32 _destinationDomain, bytes32 _mintRecipient, address _burnToken) - external - returns (uint64 _nonce); + function depositForBurn( + uint256 _amount, + uint32 _destinationDomain, + bytes32 _mintRecipient, + address _burnToken + ) external returns (uint64 _nonce); /** * @notice Deposits and burns tokens from sender to be minted on destination domain. The mint @@ -55,19 +58,25 @@ interface ICircleBridge { bytes32 _destinationCaller ) external returns (uint64 _nonce); + function localMessageTransmitter() external view returns (IMessageTransmitter); + + function localMinter() external view returns (ITokenMinter); + + function messageBodyVersion() external view returns (uint32); + function owner() external view returns (address); + function pendingOwner() external view returns (address); + + function rescuer() external view returns (address); + + function remoteTokenMessengers(uint32 domain) external view returns (bytes32); + function handleReceiveMessage(uint32 _remoteDomain, bytes32 _sender, bytes memory messageBody) external view returns (bool); - function localMessageTransmitter() external view returns (IMessageTransmitter); - - function localMinter() external view returns (ITokenMinter); - - function remoteCircleBridges(uint32 domain) external view returns (bytes32); - // owner only methods function transferOwnership(address newOwner) external; } diff --git a/evm/src/interfaces/circle/ITokenMinter.sol b/evm/src/interfaces/ITokenMinter.sol similarity index 93% rename from evm/src/interfaces/circle/ITokenMinter.sol rename to evm/src/interfaces/ITokenMinter.sol index 5dff82f..2e2a19b 100644 --- a/evm/src/interfaces/circle/ITokenMinter.sol +++ b/evm/src/interfaces/ITokenMinter.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: Apache 2 -pragma solidity ^0.8.19; +pragma solidity ^0.8.0; /** * @title ITokenMinter diff --git a/evm/src/interfaces/IWormhole.sol b/evm/src/interfaces/IWormhole.sol index eba9f6f..cc31f30 100644 --- a/evm/src/interfaces/IWormhole.sol +++ b/evm/src/interfaces/IWormhole.sol @@ -1,6 +1,4 @@ -// contracts/Messages.sol // SPDX-License-Identifier: Apache 2 - pragma solidity ^0.8.0; interface IWormhole { @@ -25,10 +23,8 @@ interface IWormhole { uint64 sequence; uint8 consistencyLevel; bytes payload; - uint32 guardianSetIndex; Signature[] signatures; - bytes32 hash; } @@ -36,7 +32,6 @@ interface IWormhole { bytes32 module; uint8 action; uint16 chain; - address newContract; } @@ -44,7 +39,6 @@ interface IWormhole { bytes32 module; uint8 action; uint16 chain; - GuardianSet newGuardianSet; uint32 newGuardianSetIndex; } @@ -53,7 +47,6 @@ interface IWormhole { bytes32 module; uint8 action; uint16 chain; - uint256 messageFee; } @@ -61,7 +54,6 @@ interface IWormhole { bytes32 module; uint8 action; uint16 chain; - uint256 amount; bytes32 recipient; } @@ -69,32 +61,42 @@ interface IWormhole { struct RecoverChainId { bytes32 module; uint8 action; - uint256 evmChainId; uint16 newChainId; } - event LogMessagePublished(address indexed sender, uint64 sequence, uint32 nonce, bytes payload, uint8 consistencyLevel); + event LogMessagePublished( + address indexed sender, uint64 sequence, uint32 nonce, bytes payload, uint8 consistencyLevel + ); event ContractUpgraded(address indexed oldContract, address indexed newContract); event GuardianSetAdded(uint32 indexed index); - function publishMessage( - uint32 nonce, - bytes memory payload, - uint8 consistencyLevel - ) external payable returns (uint64 sequence); + function publishMessage(uint32 nonce, bytes memory payload, uint8 consistencyLevel) + external + payable + returns (uint64 sequence); function initialize() external; - function parseAndVerifyVM(bytes calldata encodedVM) external view returns (VM memory vm, bool valid, string memory reason); + function parseAndVerifyVM(bytes calldata encodedVM) + external + view + returns (VM memory vm, bool valid, string memory reason); function verifyVM(VM memory vm) external view returns (bool valid, string memory reason); - function verifySignatures(bytes32 hash, Signature[] memory signatures, GuardianSet memory guardianSet) external pure returns (bool valid, string memory reason); + function verifySignatures( + bytes32 hash, + Signature[] memory signatures, + GuardianSet memory guardianSet + ) external pure returns (bool valid, string memory reason); function parseVM(bytes memory encodedVM) external pure returns (VM memory vm); - function quorum(uint numGuardians) external pure returns (uint numSignaturesRequiredForQuorum); + function quorum(uint256 numGuardians) + external + pure + returns (uint256 numSignaturesRequiredForQuorum); function getGuardianSet(uint32 index) external view returns (GuardianSet memory); @@ -120,15 +122,30 @@ interface IWormhole { function nextSequence(address emitter) external view returns (uint64); - function parseContractUpgrade(bytes memory encodedUpgrade) external pure returns (ContractUpgrade memory cu); - - function parseGuardianSetUpgrade(bytes memory encodedUpgrade) external pure returns (GuardianSetUpgrade memory gsu); - - function parseSetMessageFee(bytes memory encodedSetMessageFee) external pure returns (SetMessageFee memory smf); - - function parseTransferFees(bytes memory encodedTransferFees) external pure returns (TransferFees memory tf); - - function parseRecoverChainId(bytes memory encodedRecoverChainId) external pure returns (RecoverChainId memory rci); + function parseContractUpgrade(bytes memory encodedUpgrade) + external + pure + returns (ContractUpgrade memory cu); + + function parseGuardianSetUpgrade(bytes memory encodedUpgrade) + external + pure + returns (GuardianSetUpgrade memory gsu); + + function parseSetMessageFee(bytes memory encodedSetMessageFee) + external + pure + returns (SetMessageFee memory smf); + + function parseTransferFees(bytes memory encodedTransferFees) + external + pure + returns (TransferFees memory tf); + + function parseRecoverChainId(bytes memory encodedRecoverChainId) + external + pure + returns (RecoverChainId memory rci); function submitContractUpgrade(bytes memory _vm) external; diff --git a/evm/src/interfaces/mock/IMockIntegration.sol b/evm/src/interfaces/mock/IMockIntegration.sol deleted file mode 100644 index 26234fa..0000000 --- a/evm/src/interfaces/mock/IMockIntegration.sol +++ /dev/null @@ -1,25 +0,0 @@ -// SPDX-License-Identifier: Apache 2 -pragma solidity ^0.8.19; - -import { ICircleIntegration } from "../ICircleIntegration.sol"; - -interface IMockIntegration { - function owner() external view returns (address); - function trustedSender() external view returns (address); - function trustedChainId() external view returns (uint16); - function redemptionSequence() external view returns (uint256); - function circleIntegration() external view returns (ICircleIntegration); - - function redeemTokensWithPayload( - ICircleIntegration.RedeemParameters memory redeemParams, - address transferRecipient - ) external returns (uint256); - - function getPayload(uint256 redemptionSequence_) external view returns (bytes memory); - - function setup( - address circleIntegrationAddress, - address trustedRecipient_, - uint16 trustedChainId_ - ) external; -} diff --git a/evm/src/libraries/BytesParsing.sol b/evm/src/libraries/BytesParsing.sol new file mode 100644 index 0000000..8ec30a8 --- /dev/null +++ b/evm/src/libraries/BytesParsing.sol @@ -0,0 +1,1396 @@ +// SPDX-License-Identifier: Apache 2 +pragma solidity ^0.8.19; + +library BytesParsing { + uint256 private constant freeMemoryPtr = 0x40; + uint256 private constant wordSize = 32; + + error OutOfBounds(uint256 offset, uint256 length); + + function checkBound(uint256 offset, uint256 length) internal pure { + if (offset > length) { + revert OutOfBounds(offset, length); + } + } + + function sliceUnchecked(bytes memory encoded, uint256 offset, uint256 length) + internal + pure + returns (bytes memory ret, uint256 nextOffset) + { + //bail early for degenerate case + if (length == 0) { + return (new bytes(0), offset); + } + + assembly ("memory-safe") { + nextOffset := add(offset, length) + ret := mload(freeMemoryPtr) + + //Explanation on how we copy data here: + // The bytes type has the following layout in memory: + // [length: 32 bytes, data: length bytes] + // So if we allocate `bytes memory foo = new bytes(1);` then `foo` will be a pointer to 33 + // bytes where the first 32 bytes contain the length and the last byte is the actual data. + // Since mload always loads 32 bytes of memory at once, we use our shift variable to align + // our reads so that our last read lines up exactly with the last 32 bytes of `encoded`. + // However this also means that if the length of `encoded` is not a multiple of 32 bytes, our + // first read will necessarily partly contain bytes from `encoded`'s 32 length bytes that + // will be written into the length part of our `ret` slice. + // We remedy this issue by writing the length of our `ret` slice at the end, thus + // overwritting those garbage bytes. + let shift := and(length, 31) //equivalent to `mod(length, 32)` but 2 gas cheaper + if iszero(shift) { shift := wordSize } + + let dest := add(ret, shift) + let end := add(dest, length) + for { let src := add(add(encoded, shift), offset) } lt(dest, end) { + src := add(src, wordSize) + dest := add(dest, wordSize) + } { mstore(dest, mload(src)) } + + mstore(ret, length) + //When compiling with --via-ir then normally allocated memory (i.e. via new) will have 32 byte + // memory alignment and so we enforce the same memory alignment here. + mstore(freeMemoryPtr, and(add(dest, 31), not(31))) + } + } + + function slice(bytes memory encoded, uint256 offset, uint256 length) + internal + pure + returns (bytes memory ret, uint256 nextOffset) + { + (ret, nextOffset) = sliceUnchecked(encoded, offset, length); + checkBound(nextOffset, encoded.length); + } + + function asAddressUnchecked(bytes memory encoded, uint256 offset) + internal + pure + returns (address, uint256) + { + (uint160 ret, uint256 nextOffset) = asUint160(encoded, offset); + return (address(ret), nextOffset); + } + + function asAddress(bytes memory encoded, uint256 offset) + internal + pure + returns (address ret, uint256 nextOffset) + { + (ret, nextOffset) = asAddressUnchecked(encoded, offset); + checkBound(nextOffset, encoded.length); + } + + function asBoolUnckecked(bytes memory encoded, uint256 offset) + internal + pure + returns (bool, uint256) + { + (uint8 ret, uint256 nextOffset) = asUint8(encoded, offset); + return (ret != 0, nextOffset); + } + + function asBool(bytes memory encoded, uint256 offset) + internal + pure + returns (bool ret, uint256 nextOffset) + { + (ret, nextOffset) = asBoolUnckecked(encoded, offset); + checkBound(nextOffset, encoded.length); + } + + /* ------------------------------------------------------------------------------------------------- + Remaining library code below was auto-generated by via the following js/node code: + + for (let bytes = 1; bytes <= 32; ++bytes) { + const bits = bytes*8; + console.log( + `function asUint${bits}Unchecked( + bytes memory encoded, + uint offset + ) internal pure returns (uint${bits} ret, uint nextOffset) { + assembly ("memory-safe") { + nextOffset := add(offset, ${bytes}) + ret := mload(add(encoded, nextOffset)) + } + return (ret, nextOffset); + } + + function asUint${bits}( + bytes memory encoded, + uint offset + ) internal pure returns (uint${bits} ret, uint nextOffset) { + (ret, nextOffset) = asUint${bits}Unchecked(encoded, offset); + checkBound(nextOffset, encoded.length); + } + + function asBytes${bytes}Unchecked( + bytes memory encoded, + uint offset + ) internal pure returns (bytes${bytes}, uint) { + (uint${bits} ret, uint nextOffset) = asUint${bits}Unchecked(encoded, offset); + return (bytes${bytes}(ret), nextOffset); + } + + function asBytes${bytes}( + bytes memory encoded, + uint offset + ) internal pure returns (bytes${bytes}, uint) { + (uint${bits} ret, uint nextOffset) = asUint${bits}(encoded, offset); + return (bytes${bytes}(ret), nextOffset); + } + ` + ); + } + ------------------------------------------------------------------------------------------------- */ + + function asUint8Unchecked(bytes memory encoded, uint256 offset) + internal + pure + returns (uint8 ret, uint256 nextOffset) + { + assembly ("memory-safe") { + nextOffset := add(offset, 1) + ret := mload(add(encoded, nextOffset)) + } + return (ret, nextOffset); + } + + function asUint8(bytes memory encoded, uint256 offset) + internal + pure + returns (uint8 ret, uint256 nextOffset) + { + (ret, nextOffset) = asUint8Unchecked(encoded, offset); + checkBound(nextOffset, encoded.length); + } + + function asBytes1Unchecked(bytes memory encoded, uint256 offset) + internal + pure + returns (bytes1, uint256) + { + (uint8 ret, uint256 nextOffset) = asUint8Unchecked(encoded, offset); + return (bytes1(ret), nextOffset); + } + + function asBytes1(bytes memory encoded, uint256 offset) + internal + pure + returns (bytes1, uint256) + { + (uint8 ret, uint256 nextOffset) = asUint8(encoded, offset); + return (bytes1(ret), nextOffset); + } + + function asUint16Unchecked(bytes memory encoded, uint256 offset) + internal + pure + returns (uint16 ret, uint256 nextOffset) + { + assembly ("memory-safe") { + nextOffset := add(offset, 2) + ret := mload(add(encoded, nextOffset)) + } + return (ret, nextOffset); + } + + function asUint16(bytes memory encoded, uint256 offset) + internal + pure + returns (uint16 ret, uint256 nextOffset) + { + (ret, nextOffset) = asUint16Unchecked(encoded, offset); + checkBound(nextOffset, encoded.length); + } + + function asBytes2Unchecked(bytes memory encoded, uint256 offset) + internal + pure + returns (bytes2, uint256) + { + (uint16 ret, uint256 nextOffset) = asUint16Unchecked(encoded, offset); + return (bytes2(ret), nextOffset); + } + + function asBytes2(bytes memory encoded, uint256 offset) + internal + pure + returns (bytes2, uint256) + { + (uint16 ret, uint256 nextOffset) = asUint16(encoded, offset); + return (bytes2(ret), nextOffset); + } + + function asUint24Unchecked(bytes memory encoded, uint256 offset) + internal + pure + returns (uint24 ret, uint256 nextOffset) + { + assembly ("memory-safe") { + nextOffset := add(offset, 3) + ret := mload(add(encoded, nextOffset)) + } + return (ret, nextOffset); + } + + function asUint24(bytes memory encoded, uint256 offset) + internal + pure + returns (uint24 ret, uint256 nextOffset) + { + (ret, nextOffset) = asUint24Unchecked(encoded, offset); + checkBound(nextOffset, encoded.length); + } + + function asBytes3Unchecked(bytes memory encoded, uint256 offset) + internal + pure + returns (bytes3, uint256) + { + (uint24 ret, uint256 nextOffset) = asUint24Unchecked(encoded, offset); + return (bytes3(ret), nextOffset); + } + + function asBytes3(bytes memory encoded, uint256 offset) + internal + pure + returns (bytes3, uint256) + { + (uint24 ret, uint256 nextOffset) = asUint24(encoded, offset); + return (bytes3(ret), nextOffset); + } + + function asUint32Unchecked(bytes memory encoded, uint256 offset) + internal + pure + returns (uint32 ret, uint256 nextOffset) + { + assembly ("memory-safe") { + nextOffset := add(offset, 4) + ret := mload(add(encoded, nextOffset)) + } + return (ret, nextOffset); + } + + function asUint32(bytes memory encoded, uint256 offset) + internal + pure + returns (uint32 ret, uint256 nextOffset) + { + (ret, nextOffset) = asUint32Unchecked(encoded, offset); + checkBound(nextOffset, encoded.length); + } + + function asBytes4Unchecked(bytes memory encoded, uint256 offset) + internal + pure + returns (bytes4, uint256) + { + (uint32 ret, uint256 nextOffset) = asUint32Unchecked(encoded, offset); + return (bytes4(ret), nextOffset); + } + + function asBytes4(bytes memory encoded, uint256 offset) + internal + pure + returns (bytes4, uint256) + { + (uint32 ret, uint256 nextOffset) = asUint32(encoded, offset); + return (bytes4(ret), nextOffset); + } + + function asUint40Unchecked(bytes memory encoded, uint256 offset) + internal + pure + returns (uint40 ret, uint256 nextOffset) + { + assembly ("memory-safe") { + nextOffset := add(offset, 5) + ret := mload(add(encoded, nextOffset)) + } + return (ret, nextOffset); + } + + function asUint40(bytes memory encoded, uint256 offset) + internal + pure + returns (uint40 ret, uint256 nextOffset) + { + (ret, nextOffset) = asUint40Unchecked(encoded, offset); + checkBound(nextOffset, encoded.length); + } + + function asBytes5Unchecked(bytes memory encoded, uint256 offset) + internal + pure + returns (bytes5, uint256) + { + (uint40 ret, uint256 nextOffset) = asUint40Unchecked(encoded, offset); + return (bytes5(ret), nextOffset); + } + + function asBytes5(bytes memory encoded, uint256 offset) + internal + pure + returns (bytes5, uint256) + { + (uint40 ret, uint256 nextOffset) = asUint40(encoded, offset); + return (bytes5(ret), nextOffset); + } + + function asUint48Unchecked(bytes memory encoded, uint256 offset) + internal + pure + returns (uint48 ret, uint256 nextOffset) + { + assembly ("memory-safe") { + nextOffset := add(offset, 6) + ret := mload(add(encoded, nextOffset)) + } + return (ret, nextOffset); + } + + function asUint48(bytes memory encoded, uint256 offset) + internal + pure + returns (uint48 ret, uint256 nextOffset) + { + (ret, nextOffset) = asUint48Unchecked(encoded, offset); + checkBound(nextOffset, encoded.length); + } + + function asBytes6Unchecked(bytes memory encoded, uint256 offset) + internal + pure + returns (bytes6, uint256) + { + (uint48 ret, uint256 nextOffset) = asUint48Unchecked(encoded, offset); + return (bytes6(ret), nextOffset); + } + + function asBytes6(bytes memory encoded, uint256 offset) + internal + pure + returns (bytes6, uint256) + { + (uint48 ret, uint256 nextOffset) = asUint48(encoded, offset); + return (bytes6(ret), nextOffset); + } + + function asUint56Unchecked(bytes memory encoded, uint256 offset) + internal + pure + returns (uint56 ret, uint256 nextOffset) + { + assembly ("memory-safe") { + nextOffset := add(offset, 7) + ret := mload(add(encoded, nextOffset)) + } + return (ret, nextOffset); + } + + function asUint56(bytes memory encoded, uint256 offset) + internal + pure + returns (uint56 ret, uint256 nextOffset) + { + (ret, nextOffset) = asUint56Unchecked(encoded, offset); + checkBound(nextOffset, encoded.length); + } + + function asBytes7Unchecked(bytes memory encoded, uint256 offset) + internal + pure + returns (bytes7, uint256) + { + (uint56 ret, uint256 nextOffset) = asUint56Unchecked(encoded, offset); + return (bytes7(ret), nextOffset); + } + + function asBytes7(bytes memory encoded, uint256 offset) + internal + pure + returns (bytes7, uint256) + { + (uint56 ret, uint256 nextOffset) = asUint56(encoded, offset); + return (bytes7(ret), nextOffset); + } + + function asUint64Unchecked(bytes memory encoded, uint256 offset) + internal + pure + returns (uint64 ret, uint256 nextOffset) + { + assembly ("memory-safe") { + nextOffset := add(offset, 8) + ret := mload(add(encoded, nextOffset)) + } + return (ret, nextOffset); + } + + function asUint64(bytes memory encoded, uint256 offset) + internal + pure + returns (uint64 ret, uint256 nextOffset) + { + (ret, nextOffset) = asUint64Unchecked(encoded, offset); + checkBound(nextOffset, encoded.length); + } + + function asBytes8Unchecked(bytes memory encoded, uint256 offset) + internal + pure + returns (bytes8, uint256) + { + (uint64 ret, uint256 nextOffset) = asUint64Unchecked(encoded, offset); + return (bytes8(ret), nextOffset); + } + + function asBytes8(bytes memory encoded, uint256 offset) + internal + pure + returns (bytes8, uint256) + { + (uint64 ret, uint256 nextOffset) = asUint64(encoded, offset); + return (bytes8(ret), nextOffset); + } + + function asUint72Unchecked(bytes memory encoded, uint256 offset) + internal + pure + returns (uint72 ret, uint256 nextOffset) + { + assembly ("memory-safe") { + nextOffset := add(offset, 9) + ret := mload(add(encoded, nextOffset)) + } + return (ret, nextOffset); + } + + function asUint72(bytes memory encoded, uint256 offset) + internal + pure + returns (uint72 ret, uint256 nextOffset) + { + (ret, nextOffset) = asUint72Unchecked(encoded, offset); + checkBound(nextOffset, encoded.length); + } + + function asBytes9Unchecked(bytes memory encoded, uint256 offset) + internal + pure + returns (bytes9, uint256) + { + (uint72 ret, uint256 nextOffset) = asUint72Unchecked(encoded, offset); + return (bytes9(ret), nextOffset); + } + + function asBytes9(bytes memory encoded, uint256 offset) + internal + pure + returns (bytes9, uint256) + { + (uint72 ret, uint256 nextOffset) = asUint72(encoded, offset); + return (bytes9(ret), nextOffset); + } + + function asUint80Unchecked(bytes memory encoded, uint256 offset) + internal + pure + returns (uint80 ret, uint256 nextOffset) + { + assembly ("memory-safe") { + nextOffset := add(offset, 10) + ret := mload(add(encoded, nextOffset)) + } + return (ret, nextOffset); + } + + function asUint80(bytes memory encoded, uint256 offset) + internal + pure + returns (uint80 ret, uint256 nextOffset) + { + (ret, nextOffset) = asUint80Unchecked(encoded, offset); + checkBound(nextOffset, encoded.length); + } + + function asBytes10Unchecked(bytes memory encoded, uint256 offset) + internal + pure + returns (bytes10, uint256) + { + (uint80 ret, uint256 nextOffset) = asUint80Unchecked(encoded, offset); + return (bytes10(ret), nextOffset); + } + + function asBytes10(bytes memory encoded, uint256 offset) + internal + pure + returns (bytes10, uint256) + { + (uint80 ret, uint256 nextOffset) = asUint80(encoded, offset); + return (bytes10(ret), nextOffset); + } + + function asUint88Unchecked(bytes memory encoded, uint256 offset) + internal + pure + returns (uint88 ret, uint256 nextOffset) + { + assembly ("memory-safe") { + nextOffset := add(offset, 11) + ret := mload(add(encoded, nextOffset)) + } + return (ret, nextOffset); + } + + function asUint88(bytes memory encoded, uint256 offset) + internal + pure + returns (uint88 ret, uint256 nextOffset) + { + (ret, nextOffset) = asUint88Unchecked(encoded, offset); + checkBound(nextOffset, encoded.length); + } + + function asBytes11Unchecked(bytes memory encoded, uint256 offset) + internal + pure + returns (bytes11, uint256) + { + (uint88 ret, uint256 nextOffset) = asUint88Unchecked(encoded, offset); + return (bytes11(ret), nextOffset); + } + + function asBytes11(bytes memory encoded, uint256 offset) + internal + pure + returns (bytes11, uint256) + { + (uint88 ret, uint256 nextOffset) = asUint88(encoded, offset); + return (bytes11(ret), nextOffset); + } + + function asUint96Unchecked(bytes memory encoded, uint256 offset) + internal + pure + returns (uint96 ret, uint256 nextOffset) + { + assembly ("memory-safe") { + nextOffset := add(offset, 12) + ret := mload(add(encoded, nextOffset)) + } + return (ret, nextOffset); + } + + function asUint96(bytes memory encoded, uint256 offset) + internal + pure + returns (uint96 ret, uint256 nextOffset) + { + (ret, nextOffset) = asUint96Unchecked(encoded, offset); + checkBound(nextOffset, encoded.length); + } + + function asBytes12Unchecked(bytes memory encoded, uint256 offset) + internal + pure + returns (bytes12, uint256) + { + (uint96 ret, uint256 nextOffset) = asUint96Unchecked(encoded, offset); + return (bytes12(ret), nextOffset); + } + + function asBytes12(bytes memory encoded, uint256 offset) + internal + pure + returns (bytes12, uint256) + { + (uint96 ret, uint256 nextOffset) = asUint96(encoded, offset); + return (bytes12(ret), nextOffset); + } + + function asUint104Unchecked(bytes memory encoded, uint256 offset) + internal + pure + returns (uint104 ret, uint256 nextOffset) + { + assembly ("memory-safe") { + nextOffset := add(offset, 13) + ret := mload(add(encoded, nextOffset)) + } + return (ret, nextOffset); + } + + function asUint104(bytes memory encoded, uint256 offset) + internal + pure + returns (uint104 ret, uint256 nextOffset) + { + (ret, nextOffset) = asUint104Unchecked(encoded, offset); + checkBound(nextOffset, encoded.length); + } + + function asBytes13Unchecked(bytes memory encoded, uint256 offset) + internal + pure + returns (bytes13, uint256) + { + (uint104 ret, uint256 nextOffset) = asUint104Unchecked(encoded, offset); + return (bytes13(ret), nextOffset); + } + + function asBytes13(bytes memory encoded, uint256 offset) + internal + pure + returns (bytes13, uint256) + { + (uint104 ret, uint256 nextOffset) = asUint104(encoded, offset); + return (bytes13(ret), nextOffset); + } + + function asUint112Unchecked(bytes memory encoded, uint256 offset) + internal + pure + returns (uint112 ret, uint256 nextOffset) + { + assembly ("memory-safe") { + nextOffset := add(offset, 14) + ret := mload(add(encoded, nextOffset)) + } + return (ret, nextOffset); + } + + function asUint112(bytes memory encoded, uint256 offset) + internal + pure + returns (uint112 ret, uint256 nextOffset) + { + (ret, nextOffset) = asUint112Unchecked(encoded, offset); + checkBound(nextOffset, encoded.length); + } + + function asBytes14Unchecked(bytes memory encoded, uint256 offset) + internal + pure + returns (bytes14, uint256) + { + (uint112 ret, uint256 nextOffset) = asUint112Unchecked(encoded, offset); + return (bytes14(ret), nextOffset); + } + + function asBytes14(bytes memory encoded, uint256 offset) + internal + pure + returns (bytes14, uint256) + { + (uint112 ret, uint256 nextOffset) = asUint112(encoded, offset); + return (bytes14(ret), nextOffset); + } + + function asUint120Unchecked(bytes memory encoded, uint256 offset) + internal + pure + returns (uint120 ret, uint256 nextOffset) + { + assembly ("memory-safe") { + nextOffset := add(offset, 15) + ret := mload(add(encoded, nextOffset)) + } + return (ret, nextOffset); + } + + function asUint120(bytes memory encoded, uint256 offset) + internal + pure + returns (uint120 ret, uint256 nextOffset) + { + (ret, nextOffset) = asUint120Unchecked(encoded, offset); + checkBound(nextOffset, encoded.length); + } + + function asBytes15Unchecked(bytes memory encoded, uint256 offset) + internal + pure + returns (bytes15, uint256) + { + (uint120 ret, uint256 nextOffset) = asUint120Unchecked(encoded, offset); + return (bytes15(ret), nextOffset); + } + + function asBytes15(bytes memory encoded, uint256 offset) + internal + pure + returns (bytes15, uint256) + { + (uint120 ret, uint256 nextOffset) = asUint120(encoded, offset); + return (bytes15(ret), nextOffset); + } + + function asUint128Unchecked(bytes memory encoded, uint256 offset) + internal + pure + returns (uint128 ret, uint256 nextOffset) + { + assembly ("memory-safe") { + nextOffset := add(offset, 16) + ret := mload(add(encoded, nextOffset)) + } + return (ret, nextOffset); + } + + function asUint128(bytes memory encoded, uint256 offset) + internal + pure + returns (uint128 ret, uint256 nextOffset) + { + (ret, nextOffset) = asUint128Unchecked(encoded, offset); + checkBound(nextOffset, encoded.length); + } + + function asBytes16Unchecked(bytes memory encoded, uint256 offset) + internal + pure + returns (bytes16, uint256) + { + (uint128 ret, uint256 nextOffset) = asUint128Unchecked(encoded, offset); + return (bytes16(ret), nextOffset); + } + + function asBytes16(bytes memory encoded, uint256 offset) + internal + pure + returns (bytes16, uint256) + { + (uint128 ret, uint256 nextOffset) = asUint128(encoded, offset); + return (bytes16(ret), nextOffset); + } + + function asUint136Unchecked(bytes memory encoded, uint256 offset) + internal + pure + returns (uint136 ret, uint256 nextOffset) + { + assembly ("memory-safe") { + nextOffset := add(offset, 17) + ret := mload(add(encoded, nextOffset)) + } + return (ret, nextOffset); + } + + function asUint136(bytes memory encoded, uint256 offset) + internal + pure + returns (uint136 ret, uint256 nextOffset) + { + (ret, nextOffset) = asUint136Unchecked(encoded, offset); + checkBound(nextOffset, encoded.length); + } + + function asBytes17Unchecked(bytes memory encoded, uint256 offset) + internal + pure + returns (bytes17, uint256) + { + (uint136 ret, uint256 nextOffset) = asUint136Unchecked(encoded, offset); + return (bytes17(ret), nextOffset); + } + + function asBytes17(bytes memory encoded, uint256 offset) + internal + pure + returns (bytes17, uint256) + { + (uint136 ret, uint256 nextOffset) = asUint136(encoded, offset); + return (bytes17(ret), nextOffset); + } + + function asUint144Unchecked(bytes memory encoded, uint256 offset) + internal + pure + returns (uint144 ret, uint256 nextOffset) + { + assembly ("memory-safe") { + nextOffset := add(offset, 18) + ret := mload(add(encoded, nextOffset)) + } + return (ret, nextOffset); + } + + function asUint144(bytes memory encoded, uint256 offset) + internal + pure + returns (uint144 ret, uint256 nextOffset) + { + (ret, nextOffset) = asUint144Unchecked(encoded, offset); + checkBound(nextOffset, encoded.length); + } + + function asBytes18Unchecked(bytes memory encoded, uint256 offset) + internal + pure + returns (bytes18, uint256) + { + (uint144 ret, uint256 nextOffset) = asUint144Unchecked(encoded, offset); + return (bytes18(ret), nextOffset); + } + + function asBytes18(bytes memory encoded, uint256 offset) + internal + pure + returns (bytes18, uint256) + { + (uint144 ret, uint256 nextOffset) = asUint144(encoded, offset); + return (bytes18(ret), nextOffset); + } + + function asUint152Unchecked(bytes memory encoded, uint256 offset) + internal + pure + returns (uint152 ret, uint256 nextOffset) + { + assembly ("memory-safe") { + nextOffset := add(offset, 19) + ret := mload(add(encoded, nextOffset)) + } + return (ret, nextOffset); + } + + function asUint152(bytes memory encoded, uint256 offset) + internal + pure + returns (uint152 ret, uint256 nextOffset) + { + (ret, nextOffset) = asUint152Unchecked(encoded, offset); + checkBound(nextOffset, encoded.length); + } + + function asBytes19Unchecked(bytes memory encoded, uint256 offset) + internal + pure + returns (bytes19, uint256) + { + (uint152 ret, uint256 nextOffset) = asUint152Unchecked(encoded, offset); + return (bytes19(ret), nextOffset); + } + + function asBytes19(bytes memory encoded, uint256 offset) + internal + pure + returns (bytes19, uint256) + { + (uint152 ret, uint256 nextOffset) = asUint152(encoded, offset); + return (bytes19(ret), nextOffset); + } + + function asUint160Unchecked(bytes memory encoded, uint256 offset) + internal + pure + returns (uint160 ret, uint256 nextOffset) + { + assembly ("memory-safe") { + nextOffset := add(offset, 20) + ret := mload(add(encoded, nextOffset)) + } + return (ret, nextOffset); + } + + function asUint160(bytes memory encoded, uint256 offset) + internal + pure + returns (uint160 ret, uint256 nextOffset) + { + (ret, nextOffset) = asUint160Unchecked(encoded, offset); + checkBound(nextOffset, encoded.length); + } + + function asBytes20Unchecked(bytes memory encoded, uint256 offset) + internal + pure + returns (bytes20, uint256) + { + (uint160 ret, uint256 nextOffset) = asUint160Unchecked(encoded, offset); + return (bytes20(ret), nextOffset); + } + + function asBytes20(bytes memory encoded, uint256 offset) + internal + pure + returns (bytes20, uint256) + { + (uint160 ret, uint256 nextOffset) = asUint160(encoded, offset); + return (bytes20(ret), nextOffset); + } + + function asUint168Unchecked(bytes memory encoded, uint256 offset) + internal + pure + returns (uint168 ret, uint256 nextOffset) + { + assembly ("memory-safe") { + nextOffset := add(offset, 21) + ret := mload(add(encoded, nextOffset)) + } + return (ret, nextOffset); + } + + function asUint168(bytes memory encoded, uint256 offset) + internal + pure + returns (uint168 ret, uint256 nextOffset) + { + (ret, nextOffset) = asUint168Unchecked(encoded, offset); + checkBound(nextOffset, encoded.length); + } + + function asBytes21Unchecked(bytes memory encoded, uint256 offset) + internal + pure + returns (bytes21, uint256) + { + (uint168 ret, uint256 nextOffset) = asUint168Unchecked(encoded, offset); + return (bytes21(ret), nextOffset); + } + + function asBytes21(bytes memory encoded, uint256 offset) + internal + pure + returns (bytes21, uint256) + { + (uint168 ret, uint256 nextOffset) = asUint168(encoded, offset); + return (bytes21(ret), nextOffset); + } + + function asUint176Unchecked(bytes memory encoded, uint256 offset) + internal + pure + returns (uint176 ret, uint256 nextOffset) + { + assembly ("memory-safe") { + nextOffset := add(offset, 22) + ret := mload(add(encoded, nextOffset)) + } + return (ret, nextOffset); + } + + function asUint176(bytes memory encoded, uint256 offset) + internal + pure + returns (uint176 ret, uint256 nextOffset) + { + (ret, nextOffset) = asUint176Unchecked(encoded, offset); + checkBound(nextOffset, encoded.length); + } + + function asBytes22Unchecked(bytes memory encoded, uint256 offset) + internal + pure + returns (bytes22, uint256) + { + (uint176 ret, uint256 nextOffset) = asUint176Unchecked(encoded, offset); + return (bytes22(ret), nextOffset); + } + + function asBytes22(bytes memory encoded, uint256 offset) + internal + pure + returns (bytes22, uint256) + { + (uint176 ret, uint256 nextOffset) = asUint176(encoded, offset); + return (bytes22(ret), nextOffset); + } + + function asUint184Unchecked(bytes memory encoded, uint256 offset) + internal + pure + returns (uint184 ret, uint256 nextOffset) + { + assembly ("memory-safe") { + nextOffset := add(offset, 23) + ret := mload(add(encoded, nextOffset)) + } + return (ret, nextOffset); + } + + function asUint184(bytes memory encoded, uint256 offset) + internal + pure + returns (uint184 ret, uint256 nextOffset) + { + (ret, nextOffset) = asUint184Unchecked(encoded, offset); + checkBound(nextOffset, encoded.length); + } + + function asBytes23Unchecked(bytes memory encoded, uint256 offset) + internal + pure + returns (bytes23, uint256) + { + (uint184 ret, uint256 nextOffset) = asUint184Unchecked(encoded, offset); + return (bytes23(ret), nextOffset); + } + + function asBytes23(bytes memory encoded, uint256 offset) + internal + pure + returns (bytes23, uint256) + { + (uint184 ret, uint256 nextOffset) = asUint184(encoded, offset); + return (bytes23(ret), nextOffset); + } + + function asUint192Unchecked(bytes memory encoded, uint256 offset) + internal + pure + returns (uint192 ret, uint256 nextOffset) + { + assembly ("memory-safe") { + nextOffset := add(offset, 24) + ret := mload(add(encoded, nextOffset)) + } + return (ret, nextOffset); + } + + function asUint192(bytes memory encoded, uint256 offset) + internal + pure + returns (uint192 ret, uint256 nextOffset) + { + (ret, nextOffset) = asUint192Unchecked(encoded, offset); + checkBound(nextOffset, encoded.length); + } + + function asBytes24Unchecked(bytes memory encoded, uint256 offset) + internal + pure + returns (bytes24, uint256) + { + (uint192 ret, uint256 nextOffset) = asUint192Unchecked(encoded, offset); + return (bytes24(ret), nextOffset); + } + + function asBytes24(bytes memory encoded, uint256 offset) + internal + pure + returns (bytes24, uint256) + { + (uint192 ret, uint256 nextOffset) = asUint192(encoded, offset); + return (bytes24(ret), nextOffset); + } + + function asUint200Unchecked(bytes memory encoded, uint256 offset) + internal + pure + returns (uint200 ret, uint256 nextOffset) + { + assembly ("memory-safe") { + nextOffset := add(offset, 25) + ret := mload(add(encoded, nextOffset)) + } + return (ret, nextOffset); + } + + function asUint200(bytes memory encoded, uint256 offset) + internal + pure + returns (uint200 ret, uint256 nextOffset) + { + (ret, nextOffset) = asUint200Unchecked(encoded, offset); + checkBound(nextOffset, encoded.length); + } + + function asBytes25Unchecked(bytes memory encoded, uint256 offset) + internal + pure + returns (bytes25, uint256) + { + (uint200 ret, uint256 nextOffset) = asUint200Unchecked(encoded, offset); + return (bytes25(ret), nextOffset); + } + + function asBytes25(bytes memory encoded, uint256 offset) + internal + pure + returns (bytes25, uint256) + { + (uint200 ret, uint256 nextOffset) = asUint200(encoded, offset); + return (bytes25(ret), nextOffset); + } + + function asUint208Unchecked(bytes memory encoded, uint256 offset) + internal + pure + returns (uint208 ret, uint256 nextOffset) + { + assembly ("memory-safe") { + nextOffset := add(offset, 26) + ret := mload(add(encoded, nextOffset)) + } + return (ret, nextOffset); + } + + function asUint208(bytes memory encoded, uint256 offset) + internal + pure + returns (uint208 ret, uint256 nextOffset) + { + (ret, nextOffset) = asUint208Unchecked(encoded, offset); + checkBound(nextOffset, encoded.length); + } + + function asBytes26Unchecked(bytes memory encoded, uint256 offset) + internal + pure + returns (bytes26, uint256) + { + (uint208 ret, uint256 nextOffset) = asUint208Unchecked(encoded, offset); + return (bytes26(ret), nextOffset); + } + + function asBytes26(bytes memory encoded, uint256 offset) + internal + pure + returns (bytes26, uint256) + { + (uint208 ret, uint256 nextOffset) = asUint208(encoded, offset); + return (bytes26(ret), nextOffset); + } + + function asUint216Unchecked(bytes memory encoded, uint256 offset) + internal + pure + returns (uint216 ret, uint256 nextOffset) + { + assembly ("memory-safe") { + nextOffset := add(offset, 27) + ret := mload(add(encoded, nextOffset)) + } + return (ret, nextOffset); + } + + function asUint216(bytes memory encoded, uint256 offset) + internal + pure + returns (uint216 ret, uint256 nextOffset) + { + (ret, nextOffset) = asUint216Unchecked(encoded, offset); + checkBound(nextOffset, encoded.length); + } + + function asBytes27Unchecked(bytes memory encoded, uint256 offset) + internal + pure + returns (bytes27, uint256) + { + (uint216 ret, uint256 nextOffset) = asUint216Unchecked(encoded, offset); + return (bytes27(ret), nextOffset); + } + + function asBytes27(bytes memory encoded, uint256 offset) + internal + pure + returns (bytes27, uint256) + { + (uint216 ret, uint256 nextOffset) = asUint216(encoded, offset); + return (bytes27(ret), nextOffset); + } + + function asUint224Unchecked(bytes memory encoded, uint256 offset) + internal + pure + returns (uint224 ret, uint256 nextOffset) + { + assembly ("memory-safe") { + nextOffset := add(offset, 28) + ret := mload(add(encoded, nextOffset)) + } + return (ret, nextOffset); + } + + function asUint224(bytes memory encoded, uint256 offset) + internal + pure + returns (uint224 ret, uint256 nextOffset) + { + (ret, nextOffset) = asUint224Unchecked(encoded, offset); + checkBound(nextOffset, encoded.length); + } + + function asBytes28Unchecked(bytes memory encoded, uint256 offset) + internal + pure + returns (bytes28, uint256) + { + (uint224 ret, uint256 nextOffset) = asUint224Unchecked(encoded, offset); + return (bytes28(ret), nextOffset); + } + + function asBytes28(bytes memory encoded, uint256 offset) + internal + pure + returns (bytes28, uint256) + { + (uint224 ret, uint256 nextOffset) = asUint224(encoded, offset); + return (bytes28(ret), nextOffset); + } + + function asUint232Unchecked(bytes memory encoded, uint256 offset) + internal + pure + returns (uint232 ret, uint256 nextOffset) + { + assembly ("memory-safe") { + nextOffset := add(offset, 29) + ret := mload(add(encoded, nextOffset)) + } + return (ret, nextOffset); + } + + function asUint232(bytes memory encoded, uint256 offset) + internal + pure + returns (uint232 ret, uint256 nextOffset) + { + (ret, nextOffset) = asUint232Unchecked(encoded, offset); + checkBound(nextOffset, encoded.length); + } + + function asBytes29Unchecked(bytes memory encoded, uint256 offset) + internal + pure + returns (bytes29, uint256) + { + (uint232 ret, uint256 nextOffset) = asUint232Unchecked(encoded, offset); + return (bytes29(ret), nextOffset); + } + + function asBytes29(bytes memory encoded, uint256 offset) + internal + pure + returns (bytes29, uint256) + { + (uint232 ret, uint256 nextOffset) = asUint232(encoded, offset); + return (bytes29(ret), nextOffset); + } + + function asUint240Unchecked(bytes memory encoded, uint256 offset) + internal + pure + returns (uint240 ret, uint256 nextOffset) + { + assembly ("memory-safe") { + nextOffset := add(offset, 30) + ret := mload(add(encoded, nextOffset)) + } + return (ret, nextOffset); + } + + function asUint240(bytes memory encoded, uint256 offset) + internal + pure + returns (uint240 ret, uint256 nextOffset) + { + (ret, nextOffset) = asUint240Unchecked(encoded, offset); + checkBound(nextOffset, encoded.length); + } + + function asBytes30Unchecked(bytes memory encoded, uint256 offset) + internal + pure + returns (bytes30, uint256) + { + (uint240 ret, uint256 nextOffset) = asUint240Unchecked(encoded, offset); + return (bytes30(ret), nextOffset); + } + + function asBytes30(bytes memory encoded, uint256 offset) + internal + pure + returns (bytes30, uint256) + { + (uint240 ret, uint256 nextOffset) = asUint240(encoded, offset); + return (bytes30(ret), nextOffset); + } + + function asUint248Unchecked(bytes memory encoded, uint256 offset) + internal + pure + returns (uint248 ret, uint256 nextOffset) + { + assembly ("memory-safe") { + nextOffset := add(offset, 31) + ret := mload(add(encoded, nextOffset)) + } + return (ret, nextOffset); + } + + function asUint248(bytes memory encoded, uint256 offset) + internal + pure + returns (uint248 ret, uint256 nextOffset) + { + (ret, nextOffset) = asUint248Unchecked(encoded, offset); + checkBound(nextOffset, encoded.length); + } + + function asBytes31Unchecked(bytes memory encoded, uint256 offset) + internal + pure + returns (bytes31, uint256) + { + (uint248 ret, uint256 nextOffset) = asUint248Unchecked(encoded, offset); + return (bytes31(ret), nextOffset); + } + + function asBytes31(bytes memory encoded, uint256 offset) + internal + pure + returns (bytes31, uint256) + { + (uint248 ret, uint256 nextOffset) = asUint248(encoded, offset); + return (bytes31(ret), nextOffset); + } + + function asUint256Unchecked(bytes memory encoded, uint256 offset) + internal + pure + returns (uint256 ret, uint256 nextOffset) + { + assembly ("memory-safe") { + nextOffset := add(offset, 32) + ret := mload(add(encoded, nextOffset)) + } + return (ret, nextOffset); + } + + function asUint256(bytes memory encoded, uint256 offset) + internal + pure + returns (uint256 ret, uint256 nextOffset) + { + (ret, nextOffset) = asUint256Unchecked(encoded, offset); + checkBound(nextOffset, encoded.length); + } + + function asBytes32Unchecked(bytes memory encoded, uint256 offset) + internal + pure + returns (bytes32, uint256) + { + (uint256 ret, uint256 nextOffset) = asUint256Unchecked(encoded, offset); + return (bytes32(ret), nextOffset); + } + + function asBytes32(bytes memory encoded, uint256 offset) + internal + pure + returns (bytes32, uint256) + { + (uint256 ret, uint256 nextOffset) = asUint256(encoded, offset); + return (bytes32(ret), nextOffset); + } +} diff --git a/evm/src/libraries/Utils.sol b/evm/src/libraries/Utils.sol new file mode 100644 index 0000000..1365e9f --- /dev/null +++ b/evm/src/libraries/Utils.sol @@ -0,0 +1,31 @@ +// SPDX-License-Identifier: Apache 2 +pragma solidity ^0.8.19; + +library Utils { + error AddressOverflow(bytes32 addr); + + function toUniversalAddress(address evmAddr) internal pure returns (bytes32 converted) { + assembly ("memory-safe") { + converted := and(0xffffffffffffffffffffffffffffffffffffffff, evmAddr) + } + } + + function fromUniversalAddress(bytes32 universalAddr) + internal + pure + returns (address converted) + { + if (bytes12(universalAddr) != 0) { + revert AddressOverflow(universalAddr); + } + + assembly ("memory-safe") { + converted := universalAddr + } + } + + function revertBuiltIn(string memory reason) internal pure { + // NOTE: Using require is the easy way to revert with the built-in Error type. + require(false, reason); + } +} diff --git a/evm/src/libraries/WormholeCctpMessages.sol b/evm/src/libraries/WormholeCctpMessages.sol new file mode 100644 index 0000000..95980fc --- /dev/null +++ b/evm/src/libraries/WormholeCctpMessages.sol @@ -0,0 +1,264 @@ +// SPDX-License-Identifier: Apache 2 +pragma solidity ^0.8.19; + +import {IWormhole} from "src/interfaces/IWormhole.sol"; + +import {BytesParsing} from "src/libraries/BytesParsing.sol"; +import {Utils} from "src/libraries/Utils.sol"; + +library WormholeCctpMessages { + using Utils for address; + using BytesParsing for bytes; + + // Payload IDs. + // + // NOTE: This library reserves payloads 1 through 10 for future use. When using this library, + // please consider starting your own Wormhole message payloads at 11. + uint8 private constant DEPOSIT = 1; + uint8 private constant RESERVED_2 = 2; + uint8 private constant RESERVED_3 = 3; + uint8 private constant RESERVED_4 = 4; + uint8 private constant RESERVED_5 = 5; + uint8 private constant RESERVED_6 = 6; + uint8 private constant RESERVED_7 = 7; + uint8 private constant RESERVED_8 = 8; + uint8 private constant RESERVED_9 = 9; + uint8 private constant RESERVED_10 = 10; + + error MissingPayload(); + error PayloadTooLarge(uint256); + error InvalidMessage(); + error UnexpectedMessageLength(uint256, uint256); + + /** + * @dev NOTE: This method encodes the Wormhole message payload assuming the payload ID == 1. + */ + function encodeDeposit( + address token, + uint256 amount, + uint32 sourceCctpDomain, + uint32 targetCctpDomain, + uint64 cctpNonce, + bytes32 burnSource, + bytes32 mintRecipient, + bytes memory payload + ) internal pure returns (bytes memory encoded) { + encoded = encodeDeposit( + token.toUniversalAddress(), + DEPOSIT, + amount, + sourceCctpDomain, + targetCctpDomain, + cctpNonce, + burnSource, + mintRecipient, + payload + ); + } + + /** + * @dev NOTE: This method encodes the Wormhole message payload assuming the payload ID == 1. + */ + function encodeDeposit( + bytes32 universalTokenAddress, + uint256 amount, + uint32 sourceCctpDomain, + uint32 targetCctpDomain, + uint64 cctpNonce, + bytes32 burnSource, + bytes32 mintRecipient, + bytes memory payload + ) internal pure returns (bytes memory encoded) { + encoded = encodeDeposit( + universalTokenAddress, + DEPOSIT, + amount, + sourceCctpDomain, + targetCctpDomain, + cctpNonce, + burnSource, + mintRecipient, + payload + ); + } + + function encodeDeposit( + address token, + uint8 payloadId, + uint256 amount, + uint32 sourceCctpDomain, + uint32 targetCctpDomain, + uint64 cctpNonce, + bytes32 burnSource, + bytes32 mintRecipient, + bytes memory payload + ) internal pure returns (bytes memory encoded) { + encoded = encodeDeposit( + token.toUniversalAddress(), + payloadId, + amount, + sourceCctpDomain, + targetCctpDomain, + cctpNonce, + burnSource, + mintRecipient, + payload + ); + } + + function encodeDeposit( + bytes32 universalTokenAddress, + uint8 payloadId, + uint256 amount, + uint32 sourceCctpDomain, + uint32 targetCctpDomain, + uint64 cctpNonce, + bytes32 burnSource, + bytes32 mintRecipient, + bytes memory payload + ) internal pure returns (bytes memory encoded) { + uint256 payloadLen = payload.length; + if (payloadLen == 0) { + revert MissingPayload(); + } else if (payloadLen > type(uint16).max) { + revert PayloadTooLarge(payloadLen); + } + + encoded = abi.encodePacked( + payloadId, + universalTokenAddress, + amount, + sourceCctpDomain, + targetCctpDomain, + cctpNonce, + burnSource, + mintRecipient, + uint16(payloadLen), + payload + ); + } + + /** + * @dev NOTE: This method decodes the VAA payload assuming the payload ID == 1. + */ + function decodeDeposit(IWormhole.VM memory vaa) + internal + pure + returns ( + bytes32 token, + uint256 amount, + uint32 sourceCctpDomain, + uint32 targetCctpDomain, + uint64 cctpNonce, + bytes32 burnSource, + bytes32 mintRecipient, + bytes memory payload + ) + { + ( + token, + amount, + sourceCctpDomain, + targetCctpDomain, + cctpNonce, + burnSource, + mintRecipient, + payload + ) = decodeDeposit(vaa, DEPOSIT, true); + } + + function decodeDeposit(IWormhole.VM memory vaa, uint8 payloadId) + internal + pure + returns ( + bytes32 token, + uint256 amount, + uint32 sourceCctpDomain, + uint32 targetCctpDomain, + uint64 cctpNonce, + bytes32 burnSource, + bytes32 mintRecipient, + bytes memory payload + ) + { + ( + token, + amount, + sourceCctpDomain, + targetCctpDomain, + cctpNonce, + burnSource, + mintRecipient, + payload + ) = decodeDeposit(vaa, payloadId, true); + } + + function decodeDeposit(IWormhole.VM memory vaa, uint8 payloadId, bool revertCustomErrors) + internal + pure + returns ( + bytes32 token, + uint256 amount, + uint32 sourceCctpDomain, + uint32 targetCctpDomain, + uint64 cctpNonce, + bytes32 burnSource, + bytes32 mintRecipient, + bytes memory payload + ) + { + bytes memory encoded = vaa.payload; + uint256 offset = _checkPayloadId(encoded, 0, payloadId, revertCustomErrors); + + (token, offset) = encoded.asBytes32Unchecked(offset); + (amount, offset) = encoded.asUint256Unchecked(offset); + (sourceCctpDomain, offset) = encoded.asUint32Unchecked(offset); + (targetCctpDomain, offset) = encoded.asUint32Unchecked(offset); + (cctpNonce, offset) = encoded.asUint64Unchecked(offset); + (burnSource, offset) = encoded.asBytes32Unchecked(offset); + (mintRecipient, offset) = encoded.asBytes32Unchecked(offset); + (payload, offset) = _decodeBytes(encoded, offset); + + _checkLength(encoded.length, offset, revertCustomErrors); + } + + // ---------------------------------------- private ------------------------------------------- + + function _decodeBytes(bytes memory encoded, uint256 startOffset) + private + pure + returns (bytes memory payload, uint256 offset) + { + uint16 payloadLength; + (payloadLength, offset) = encoded.asUint16Unchecked(startOffset); + (payload, offset) = encoded.sliceUnchecked(offset, payloadLength); + } + + function _checkLength(uint256 actual, uint256 expected, bool revertCustomErrors) private pure { + if (actual != expected) { + if (revertCustomErrors) { + revert UnexpectedMessageLength(actual, expected); + } else { + Utils.revertBuiltIn("invalid message length"); + } + } + } + + function _checkPayloadId( + bytes memory encoded, + uint256 startOffset, + uint8 expectedPayloadId, + bool revertCustomErrors + ) private pure returns (uint256 offset) { + uint8 parsedPayloadId; + (parsedPayloadId, offset) = encoded.asUint8Unchecked(startOffset); + + if (parsedPayloadId != expectedPayloadId) { + if (revertCustomErrors) { + revert InvalidMessage(); + } else { + Utils.revertBuiltIn("invalid message payloadId"); + } + } + } +} diff --git a/evm/src/mock/MockIntegration.sol b/evm/src/mock/MockIntegration.sol deleted file mode 100644 index b66a6b0..0000000 --- a/evm/src/mock/MockIntegration.sol +++ /dev/null @@ -1,84 +0,0 @@ -// SPDX-License-Identifier: Apache 2 -pragma solidity ^0.8.19; - -import {IWormhole} from "wormhole/interfaces/IWormhole.sol"; -import {ICircleIntegration} from "../interfaces/ICircleIntegration.sol"; - -import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; -import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; - -contract MockIntegration { - // owner address - address public owner; - - // trusted sender address - address public trustedSender; - - // trusted Wormhole chainId - uint16 public trustedChainId; - - // redemption sequence - uint256 public redemptionSequence; - - // payload mapping - mapping(uint256 => bytes) payloadMap; - - // Wormhole's CircleIntegration instance - ICircleIntegration public circleIntegration; - - // save the deployer's address in the `owner` state variable - constructor() { - owner = msg.sender; - } - - function redeemTokensWithPayload( - ICircleIntegration.RedeemParameters memory redeemParams, - address transferRecipient - ) public returns (uint256) { - // mint USDC to this contract - ICircleIntegration.DepositWithPayload memory deposit = - circleIntegration.redeemTokensWithPayload(redeemParams); - - // verify that the sender is the trustedSender - require( - msg.sender == trustedSender && - circleIntegration.getChainIdFromDomain(deposit.sourceDomain) == trustedChainId, - "invalid sender" - ); - - // uptick sequence - redemptionSequence += 1; - - // save the payload - payloadMap[redemptionSequence] = deposit.payload; - - // send the tokens to the transferRecipient address - SafeERC20.safeTransfer( - IERC20(address(uint160(uint256(deposit.token)))), - transferRecipient, - deposit.amount - ); - - return redemptionSequence; - } - - function getPayload(uint256 redemptionSequence_) public view returns (bytes memory) { - return payloadMap[redemptionSequence_]; - } - - function setup( - address circleIntegrationAddress, - address trustedSender_, - uint16 trustedChainId_ - ) public onlyOwner { - // create contract interfaces and store `trustedSender` address - circleIntegration = ICircleIntegration(circleIntegrationAddress); - trustedSender = trustedSender_; - trustedChainId = trustedChainId_; - } - - modifier onlyOwner() { - require(owner == msg.sender, "caller not the owner"); - _; - } -} diff --git a/evm/ts/scripts/contract_governance.ts b/evm/ts/scripts/contract_governance.ts index e59abc2..2419977 100644 --- a/evm/ts/scripts/contract_governance.ts +++ b/evm/ts/scripts/contract_governance.ts @@ -1,33 +1,27 @@ -import {ethers} from "ethers"; -import {tryNativeToUint8Array} from "@certusone/wormhole-sdk"; -import {MockGuardians} from "@certusone/wormhole-sdk/lib/cjs/mock"; -import {CircleGovernanceEmitter} from "../test/helpers/mock"; -import {abi as WORMHOLE_ABI} from "../../out/IWormhole.sol/IWormhole.json"; -import {abi as CIRCLE_INTEGRATION_ABI} from "../../out/CircleIntegration.sol/CircleIntegration.json"; -import {getTimeNow} from "../test/helpers/utils"; -import {expect} from "chai"; +import { tryNativeToUint8Array } from "@certusone/wormhole-sdk"; +import { MockGuardians } from "@certusone/wormhole-sdk/lib/cjs/mock"; +import { expect } from "chai"; +import { ethers } from "ethers"; +import { abi as CIRCLE_INTEGRATION_ABI } from "../../out/CircleIntegration.sol/CircleIntegration.json"; +import { abi as WORMHOLE_ABI } from "../../out/IWormhole.sol/IWormhole.json"; +import { CircleGovernanceEmitter } from "../test/helpers/mock.js"; +import { getTimeNow } from "../test/helpers/utils"; -require("dotenv").config({path: process.argv.slice(2)[0]}); +require("dotenv").config({ path: process.argv.slice(2)[0] }); // ethereum wallet, CircleIntegration contract and USDC contract -const provider = new ethers.providers.StaticJsonRpcProvider( - process.env.SOURCE_PROVIDER! -); +const provider = new ethers.providers.StaticJsonRpcProvider(process.env.SOURCE_PROVIDER!); const wallet = new ethers.Wallet(process.env.WALLET_PRIVATE_KEY!, provider); // set up Wormhole instance -let wormhole = new ethers.Contract( - process.env.SOURCE_WORMHOLE!, - WORMHOLE_ABI, - provider -); +let wormhole = new ethers.Contract(process.env.SOURCE_WORMHOLE!, WORMHOLE_ABI, provider); wormhole = wormhole.connect(wallet); // set up circleIntegration contract let circleIntegration = new ethers.Contract( - process.env.SOURCE_CIRCLE_INTEGRATION_ADDRESS!, - CIRCLE_INTEGRATION_ABI, - provider + process.env.SOURCE_CIRCLE_INTEGRATION_ADDRESS!, + CIRCLE_INTEGRATION_ABI, + provider ); circleIntegration = circleIntegration.connect(wallet); @@ -35,86 +29,45 @@ circleIntegration = circleIntegration.connect(wallet); const governance = new CircleGovernanceEmitter(); async function registerEmitterAndDomain() { - // MockGuardians and MockCircleAttester objects - const guardians = new MockGuardians( - await wormhole.getCurrentGuardianSetIndex(), - [process.env.TESTNET_GUARDIAN_KEY!] - ); - - // put together VAA - const timestamp = getTimeNow(); - const chainId = Number(process.env.SOURCE_CHAIN_ID!); - const emitterChain = Number(process.env.TARGET_CHAIN_ID!); - const emitterAddress = Buffer.from( - tryNativeToUint8Array( - process.env.TARGET_CIRCLE_INTEGRATION_ADDRESS!, - "avalanche" - ) - ); - const domain = Number(process.env.TARGET_DOMAIN!); - - // create unsigned registerEmitterAndDomain governance message - const published = governance.publishCircleIntegrationRegisterEmitterAndDomain( - timestamp, - chainId, - emitterChain, - emitterAddress, - domain - ); - - // sign the governance VAA with the testnet guardian key - const signedMessage = guardians.addSignatures(published, [0]); - - // register the emitter and domain - const receipt = await circleIntegration - .registerEmitterAndDomain(signedMessage) - .then((tx: ethers.ContractTransaction) => tx.wait()) - .catch((msg: string) => { - // should not happen - console.log(msg); - return null; - }); - - // check contract state to verify the registration - const registeredEmitter = await circleIntegration - .getRegisteredEmitter(emitterChain) - .then((bytes: ethers.BytesLike) => - Buffer.from(ethers.utils.arrayify(bytes)) + // MockGuardians and MockCircleAttester objects + const guardians = new MockGuardians(await wormhole.getCurrentGuardianSetIndex(), [ + process.env.TESTNET_GUARDIAN_KEY!, + ]); + + // put together VAA + const timestamp = getTimeNow(); + const chainId = Number(process.env.SOURCE_CHAIN_ID!); + const emitterChain = Number(process.env.TARGET_CHAIN_ID!); + const emitterAddress = Buffer.from( + tryNativeToUint8Array(process.env.TARGET_CIRCLE_INTEGRATION_ADDRESS!, "avalanche") + ); + const domain = Number(process.env.TARGET_DOMAIN!); + + // create unsigned registerEmitterAndDomain governance message + const published = governance.publishCircleIntegrationRegisterEmitterAndDomain( + timestamp, + chainId, + emitterChain, + emitterAddress, + domain ); - expect(Buffer.compare(registeredEmitter, emitterAddress)).to.equal(0); -} - -async function updateFinality() { - // MockGuardians and MockCircleAttester objects - const guardians = new MockGuardians( - await wormhole.getCurrentGuardianSetIndex(), - [process.env.TESTNET_GUARDIAN_KEY!] - ); - - const timestamp = getTimeNow(); - const chainId = Number(process.env.SOURCE_CHAIN_ID!); - const finality = Number(process.env.SOURCE_FINALITY!); - - // create unsigned registerTargetChainToken governance message - const published = governance.publishCircleIntegrationUpdateFinality( - timestamp, - chainId, - finality - ); - - // sign governance message with guardian key - const signedMessage = guardians.addSignatures(published, [0]); - // register the target token - const receipt = await circleIntegration - .updateWormholeFinality(signedMessage) - .then((tx: ethers.ContractTransaction) => tx.wait()) - .catch((msg: string) => { - // should not happen - console.log(msg); - return null; - }); - expect(receipt).is.not.null; + // sign the governance VAA with the testnet guardian key + const signedMessage = guardians.addSignatures(published, [0]); + + // register the emitter and domain + const receipt = await circleIntegration + .registerEmitterAndDomain(signedMessage) + .then((tx: ethers.ContractTransaction) => tx.wait()) + .catch((msg: string) => { + // should not happen + console.log(msg); + return null; + }); + + // check contract state to verify the registration + const registeredEmitter = await circleIntegration + .getRegisteredEmitter(emitterChain) + .then((bytes: ethers.BytesLike) => Buffer.from(ethers.utils.arrayify(bytes))); + expect(Buffer.compare(registeredEmitter, emitterAddress)).to.equal(0); } - -updateFinality(); diff --git a/evm/ts/scripts/upgrade_proxy.ts b/evm/ts/scripts/upgrade_proxy.ts index 0fba77b..fe3160f 100644 --- a/evm/ts/scripts/upgrade_proxy.ts +++ b/evm/ts/scripts/upgrade_proxy.ts @@ -1,69 +1,63 @@ import { ArgumentParser, Namespace } from "argparse"; import { ethers } from "ethers"; -import { - ICircleIntegration, - ICircleIntegration__factory, -} from "../src/ethers-contracts"; +import { ICircleIntegration, ICircleIntegration__factory } from "../src/ethers-contracts"; interface Setup { - circleIntegration: ICircleIntegration; - governanceMessage: Buffer; + circleIntegration: ICircleIntegration; + governanceMessage: Buffer; } function setUp(): Setup { - const parser = new ArgumentParser({ - description: "Upgrade Circle Integration Proxy", - }); + const parser = new ArgumentParser({ + description: "Upgrade Circle Integration Proxy", + }); - parser.add_argument("-m", "--governance-message", { - required: true, - help: "Signed Governance Message", - }); - parser.add_argument("-p", "--proxy", { - required: true, - help: "Proxy Contract Address", - }); - parser.add_argument("--rpc-url", { required: true, help: "EVM RPC" }); - parser.add_argument("--private-key", { - required: true, - help: "EVM Private Key", - }); + parser.add_argument("-m", "--governance-message", { + required: true, + help: "Signed Governance Message", + }); + parser.add_argument("-p", "--proxy", { + required: true, + help: "Proxy Contract Address", + }); + parser.add_argument("--rpc-url", { required: true, help: "EVM RPC" }); + parser.add_argument("--private-key", { + required: true, + help: "EVM Private Key", + }); - const args: Namespace = parser.parse_args(); + const args: Namespace = parser.parse_args(); - const provider = new ethers.providers.StaticJsonRpcProvider(args.rpc_url); - const wallet = new ethers.Wallet(args.private_key, provider); - const circleIntegration = ICircleIntegration__factory.connect( - args.proxy, - wallet - ); + const provider = new ethers.providers.StaticJsonRpcProvider(args.rpc_url); + const wallet = new ethers.Wallet(args.private_key, provider); + const circleIntegration = ICircleIntegration__factory.connect(args.proxy, wallet); - return { - circleIntegration, - governanceMessage: Buffer.from(args.governance_message, "hex"), - }; + return { + circleIntegration, + governanceMessage: Buffer.from(args.governance_message, "hex"), + }; } async function main() { - const { circleIntegration, governanceMessage } = setUp(); - - const chainId = await circleIntegration.chainId(); - console.log(chainId); - - const tx = circleIntegration - .upgradeContract(governanceMessage) - .then((tx) => tx.wait()) - .catch((msg) => { - // should not happen - console.log(msg); - return null; - }); - if (tx === null) { - console.log("failed transaction"); - return 1; - } else { - return 0; - } + const { circleIntegration, governanceMessage } = setUp(); + + const chainId = await circleIntegration.chainId(); + console.log(chainId); + + const tx = circleIntegration + .upgradeContract(governanceMessage) + .then((tx) => tx.wait()) + .catch((msg) => { + // should not happen + console.log(msg); + return null; + }); + if (tx === null) { + console.log("failed transaction"); + return 1; + } else { + return 0; + } } main(); diff --git a/evm/ts/src/.gitignore b/evm/ts/src/.gitignore deleted file mode 100644 index bc1d395..0000000 --- a/evm/ts/src/.gitignore +++ /dev/null @@ -1 +0,0 @@ -ethers-contracts diff --git a/evm/ts/src/logs.ts b/evm/ts/src/logs.ts index 0f4d741..a2f26cd 100644 --- a/evm/ts/src/logs.ts +++ b/evm/ts/src/logs.ts @@ -1,17 +1,15 @@ import { ethers } from "ethers"; export function findCircleMessageInLogs( - logs: ethers.providers.Log[], - messageTransmitterAddress: string + logs: ethers.providers.Log[], + messageTransmitterAddress: string ): string | null { - for (const log of logs) { - if (log.address == messageTransmitterAddress) { - const iface = new ethers.utils.Interface([ - "event MessageSent(bytes message)", - ]); - return iface.parseLog(log).args.message as string; + for (const log of logs) { + if (log.address == messageTransmitterAddress) { + const iface = new ethers.utils.Interface(["event MessageSent(bytes message)"]); + return iface.parseLog(log).args.message as string; + } } - } - return null; + return null; } diff --git a/evm/ts/src/types.ts b/evm/ts/src/types.ts index 6006f61..b327ee2 100644 --- a/evm/ts/src/types.ts +++ b/evm/ts/src/types.ts @@ -1,25 +1,25 @@ import { ethers } from "ethers"; export interface TransferParameters { - token: string; - amount: ethers.BigNumber; - targetChain: number; - mintRecipient: Uint8Array; + token: string; + amount: ethers.BigNumber; + targetChain: number; + mintRecipient: Uint8Array; } export interface RedeemParameters { - encodedWormholeMessage: Uint8Array; - circleBridgeMessage: Uint8Array; - circleAttestation: Uint8Array; + encodedWormholeMessage: Uint8Array; + circleBridgeMessage: Uint8Array; + circleAttestation: Uint8Array; } export interface DepositWithPayload { - token: Buffer; - amount: ethers.BigNumber; - sourceDomain: number; - targetDomain: number; - nonce: number; - fromAddress: Buffer; - mintRecipient: Buffer; - payload: Buffer; + token: Buffer; + amount: ethers.BigNumber; + sourceDomain: number; + targetDomain: number; + nonce: number; + fromAddress: Buffer; + mintRecipient: Buffer; + payload: Buffer; } diff --git a/evm/ts/test/00_environment.ts b/evm/ts/test/00_environment.ts deleted file mode 100644 index 3b41af1..0000000 --- a/evm/ts/test/00_environment.ts +++ /dev/null @@ -1,533 +0,0 @@ -import {expect} from "chai"; -import {ethers} from "ethers"; -import { - CHAIN_ID_AVAX, - CHAIN_ID_ETH, - tryNativeToHexString, -} from "@certusone/wormhole-sdk"; -import { - ICircleBridge__factory, - IMessageTransmitter__factory, - IUSDC__factory, - IWormhole__factory, -} from "../src/ethers-contracts"; -import { - AVAX_CIRCLE_BRIDGE_ADDRESS, - AVAX_FORK_CHAIN_ID, - AVAX_LOCALHOST, - AVAX_USDC_TOKEN_ADDRESS, - AVAX_WORMHOLE_ADDRESS, - ETH_CIRCLE_BRIDGE_ADDRESS, - ETH_FORK_CHAIN_ID, - ETH_LOCALHOST, - ETH_USDC_TOKEN_ADDRESS, - ETH_WORMHOLE_ADDRESS, - GUARDIAN_PRIVATE_KEY, - WALLET_PRIVATE_KEY, - WORMHOLE_GUARDIAN_SET_INDEX, - WORMHOLE_MESSAGE_FEE, -} from "./helpers/consts"; - -describe("Environment Test", () => { - describe("Global", () => { - it("Environment Variables", () => { - expect(WORMHOLE_MESSAGE_FEE).is.not.undefined; - expect(WORMHOLE_GUARDIAN_SET_INDEX).is.not.undefined; - expect(GUARDIAN_PRIVATE_KEY).is.not.undefined; - expect(WALLET_PRIVATE_KEY).is.not.undefined; - }); - }); - - describe("Ethereum Goerli Testnet Fork", () => { - describe("Environment", () => { - it("Variables", () => { - expect(ETH_LOCALHOST).is.not.undefined; - expect(ETH_FORK_CHAIN_ID).is.not.undefined; - expect(ETH_WORMHOLE_ADDRESS).is.not.undefined; - expect(ETH_USDC_TOKEN_ADDRESS).is.not.undefined; - expect(ETH_CIRCLE_BRIDGE_ADDRESS).is.not.undefined; - }); - }); - - describe("RPC", () => { - const provider = new ethers.providers.StaticJsonRpcProvider( - ETH_LOCALHOST - ); - const wormhole = IWormhole__factory.connect( - ETH_WORMHOLE_ADDRESS, - provider - ); - expect(wormhole.address).to.equal(ETH_WORMHOLE_ADDRESS); - - it("EVM Chain ID", async () => { - const network = await provider.getNetwork(); - expect(network.chainId).to.equal(ETH_FORK_CHAIN_ID); - }); - - it("Wormhole", async () => { - const chainId = await wormhole.chainId(); - expect(chainId).to.equal(CHAIN_ID_ETH as number); - - // fetch current wormhole protocol fee - const messageFee: ethers.BigNumber = await wormhole.messageFee(); - expect(messageFee.eq(WORMHOLE_MESSAGE_FEE)).to.be.true; - - // Override guardian set - { - // check guardian set index - const guardianSetIndex = await wormhole.getCurrentGuardianSetIndex(); - expect(guardianSetIndex).to.equal(WORMHOLE_GUARDIAN_SET_INDEX); - - // override guardian set - const abiCoder = ethers.utils.defaultAbiCoder; - - // get slot for Guardian Set at the current index - const guardianSetSlot = ethers.utils.keccak256( - abiCoder.encode(["uint32", "uint256"], [guardianSetIndex, 2]) - ); - - // Overwrite all but first guardian set to zero address. This isn't - // necessary, but just in case we inadvertently access these slots - // for any reason. - const numGuardians = await provider - .getStorageAt(wormhole.address, guardianSetSlot) - .then((value) => ethers.BigNumber.from(value).toBigInt()); - for (let i = 1; i < numGuardians; ++i) { - await provider.send("anvil_setStorageAt", [ - wormhole.address, - abiCoder.encode( - ["uint256"], - [ - ethers.BigNumber.from( - ethers.utils.keccak256(guardianSetSlot) - ).add(i), - ] - ), - ethers.utils.hexZeroPad("0x0", 32), - ]); - } - - // Now overwrite the first guardian key with the devnet key specified - // in the function argument. - const devnetGuardian = new ethers.Wallet(GUARDIAN_PRIVATE_KEY) - .address; - await provider.send("anvil_setStorageAt", [ - wormhole.address, - abiCoder.encode( - ["uint256"], - [ - ethers.BigNumber.from( - ethers.utils.keccak256(guardianSetSlot) - ).add( - 0 // just explicit w/ index 0 - ), - ] - ), - ethers.utils.hexZeroPad(devnetGuardian, 32), - ]); - - // change the length to 1 guardian - await provider.send("anvil_setStorageAt", [ - wormhole.address, - guardianSetSlot, - ethers.utils.hexZeroPad("0x1", 32), - ]); - - // confirm guardian set override - const guardians = await wormhole - .getGuardianSet(guardianSetIndex) - .then( - (guardianSet: any) => guardianSet[0] // first element is array of keys - ); - expect(guardians.length).to.equal(1); - expect(guardians[0]).to.equal(devnetGuardian); - } - }); - - it("Wormhole SDK", async () => { - // confirm that the Wormhole SDK is installed - const accounts = await provider.listAccounts(); - expect(tryNativeToHexString(accounts[0], "ethereum")).to.equal( - "00000000000000000000000090f8bf6a479f320ead074411a4b0e7944ea8c9c1" - ); - }); - - it("Circle", async () => { - // instantiate Circle Bridge contract - const circleBridge = ICircleBridge__factory.connect( - ETH_CIRCLE_BRIDGE_ADDRESS, - provider - ); - - // fetch attestation manager address - const attesterManager = await circleBridge - .localMessageTransmitter() - .then((address) => - IMessageTransmitter__factory.connect(address, provider) - ) - .then((messageTransmitter) => messageTransmitter.attesterManager()); - const myAttester = new ethers.Wallet(GUARDIAN_PRIVATE_KEY, provider); - - // start prank (impersonate the attesterManager) - await provider.send("anvil_impersonateAccount", [attesterManager]); - - // instantiate message transmitter - const messageTransmitter = await circleBridge - .localMessageTransmitter() - .then((address) => - IMessageTransmitter__factory.connect( - address, - provider.getSigner(attesterManager) - ) - ); - - // update the number of required attestations to one - const receipt = await messageTransmitter - .setSignatureThreshold(ethers.BigNumber.from("1")) - .then((tx) => tx.wait()) - .catch((msg) => { - // should not happen - console.log(msg); - return null; - }); - expect(receipt).is.not.null; - - // enable devnet guardian as attester - { - const receipt = await messageTransmitter - .enableAttester(myAttester.address) - .then((tx) => tx.wait()) - .catch((msg) => { - // should not happen - console.log(msg); - return null; - }); - expect(receipt).is.not.null; - } - - // stop prank - await provider.send("anvil_stopImpersonatingAccount", [ - attesterManager, - ]); - - // fetch number of attesters - const numAttesters = await messageTransmitter.getNumEnabledAttesters(); - - // confirm that the attester address swap was successful - const attester = await circleBridge - .localMessageTransmitter() - .then((address) => - IMessageTransmitter__factory.connect(address, provider) - ) - .then((messageTransmitter) => - messageTransmitter.getEnabledAttester( - numAttesters.sub(ethers.BigNumber.from("1")) - ) - ); - expect(myAttester.address).to.equal(attester); - }); - - it("USDC", async () => { - // fetch master minter address - const masterMinter = await IUSDC__factory.connect( - ETH_USDC_TOKEN_ADDRESS, - provider - ).masterMinter(); - - const wallet = new ethers.Wallet(WALLET_PRIVATE_KEY, provider); - - // start prank (impersonate the Circle masterMinter) - await provider.send("anvil_impersonateAccount", [masterMinter]); - - // configure my wallet as minter - { - const usdc = IUSDC__factory.connect( - ETH_USDC_TOKEN_ADDRESS, - provider.getSigner(masterMinter) - ); - - const receipt = await usdc - .configureMinter(wallet.address, ethers.constants.MaxUint256) - .then((tx) => tx.wait()) - .catch((msg) => { - // should not happen - console.log(msg); - return null; - }); - expect(receipt).is.not.null; - } - - // stop prank - await provider.send("anvil_stopImpersonatingAccount", [masterMinter]); - - // mint USDC and confirm with a balance check - { - const usdc = IUSDC__factory.connect(ETH_USDC_TOKEN_ADDRESS, wallet); - const amount = ethers.utils.parseUnits("69420", 6); - - const balanceBefore = await usdc.balanceOf(wallet.address); - - const receipt = await usdc - .mint(wallet.address, amount) - .then((tx) => tx.wait()) - .catch((msg) => { - // should not happen - console.log(msg); - return null; - }); - expect(receipt).is.not.null; - - const balanceAfter = await usdc.balanceOf(wallet.address); - expect(balanceAfter.sub(balanceBefore).eq(amount)).is.true; - } - }); - }); - }); - - describe("Avalanche Fuji Testnet Fork", () => { - describe("Environment", () => { - it("Variables", () => { - expect(AVAX_LOCALHOST).is.not.undefined; - expect(AVAX_FORK_CHAIN_ID).is.not.undefined; - expect(AVAX_WORMHOLE_ADDRESS).is.not.undefined; - expect(AVAX_USDC_TOKEN_ADDRESS).is.not.undefined; - expect(AVAX_CIRCLE_BRIDGE_ADDRESS).is.not.undefined; - }); - }); - - describe("RPC", () => { - const provider = new ethers.providers.StaticJsonRpcProvider( - AVAX_LOCALHOST - ); - const wormhole = IWormhole__factory.connect( - AVAX_WORMHOLE_ADDRESS, - provider - ); - expect(wormhole.address).to.equal(AVAX_WORMHOLE_ADDRESS); - - it("EVM Chain ID", async () => { - const network = await provider.getNetwork(); - expect(network.chainId).to.equal(AVAX_FORK_CHAIN_ID); - }); - - it("Wormhole", async () => { - const chainId = await wormhole.chainId(); - expect(chainId).to.equal(CHAIN_ID_AVAX as number); - - // fetch current wormhole protocol fee - const messageFee = await wormhole.messageFee(); - expect(messageFee.eq(WORMHOLE_MESSAGE_FEE)).to.be.true; - - // override guardian set - { - // check guardian set index - const guardianSetIndex = await wormhole.getCurrentGuardianSetIndex(); - expect(guardianSetIndex).to.equal(WORMHOLE_GUARDIAN_SET_INDEX); - - // override guardian set - const abiCoder = ethers.utils.defaultAbiCoder; - - // get slot for Guardian Set at the current index - const guardianSetSlot = ethers.utils.keccak256( - abiCoder.encode(["uint32", "uint256"], [guardianSetIndex, 2]) - ); - - // Overwrite all but first guardian set to zero address. This isn't - // necessary, but just in case we inadvertently access these slots - // for any reason. - const numGuardians = await provider - .getStorageAt(wormhole.address, guardianSetSlot) - .then((value) => ethers.BigNumber.from(value).toBigInt()); - for (let i = 1; i < numGuardians; ++i) { - await provider.send("anvil_setStorageAt", [ - wormhole.address, - abiCoder.encode( - ["uint256"], - [ - ethers.BigNumber.from( - ethers.utils.keccak256(guardianSetSlot) - ).add(i), - ] - ), - ethers.utils.hexZeroPad("0x0", 32), - ]); - } - - // Now overwrite the first guardian key with the devnet key specified - // in the function argument. - const devnetGuardian = new ethers.Wallet(GUARDIAN_PRIVATE_KEY) - .address; - await provider.send("anvil_setStorageAt", [ - wormhole.address, - abiCoder.encode( - ["uint256"], - [ - ethers.BigNumber.from( - ethers.utils.keccak256(guardianSetSlot) - ).add( - 0 // just explicit w/ index 0 - ), - ] - ), - ethers.utils.hexZeroPad(devnetGuardian, 32), - ]); - - // change the length to 1 guardian - await provider.send("anvil_setStorageAt", [ - wormhole.address, - guardianSetSlot, - ethers.utils.hexZeroPad("0x1", 32), - ]); - - // Confirm guardian set override - const guardians = await wormhole - .getGuardianSet(guardianSetIndex) - .then( - (guardianSet: any) => guardianSet[0] // first element is array of keys - ); - expect(guardians.length).to.equal(1); - expect(guardians[0]).to.equal(devnetGuardian); - } - }); - - it("Wormhole SDK", async () => { - // confirm that the Wormhole SDK is installed - const accounts = await provider.listAccounts(); - expect(tryNativeToHexString(accounts[0], "ethereum")).to.equal( - "00000000000000000000000090f8bf6a479f320ead074411a4b0e7944ea8c9c1" - ); - }); - - it("Circle", async () => { - // instantiate Circle Bridge contract - const circleBridge = ICircleBridge__factory.connect( - AVAX_CIRCLE_BRIDGE_ADDRESS, - provider - ); - - // fetch attestation manager address - const attesterManager = await circleBridge - .localMessageTransmitter() - .then((address) => - IMessageTransmitter__factory.connect(address, provider) - ) - .then((messageTransmitter) => messageTransmitter.attesterManager()); - const myAttester = new ethers.Wallet(GUARDIAN_PRIVATE_KEY, provider); - - // start prank (impersonate the attesterManager) - await provider.send("anvil_impersonateAccount", [attesterManager]); - - // instantiate message transmitter - const messageTransmitter = await circleBridge - .localMessageTransmitter() - .then((address) => - IMessageTransmitter__factory.connect( - address, - provider.getSigner(attesterManager) - ) - ); - const existingAttester = await messageTransmitter.getEnabledAttester(0); - - // update the number of required attestations to one - const receipt = await messageTransmitter - .setSignatureThreshold(ethers.BigNumber.from("1")) - .then((tx) => tx.wait()) - .catch((msg) => { - // should not happen - console.log(msg); - return null; - }); - expect(receipt).is.not.null; - - // enable devnet guardian as attester - { - const receipt = await messageTransmitter - .enableAttester(myAttester.address) - .then((tx) => tx.wait()) - .catch((msg) => { - // should not happen - console.log(msg); - return null; - }); - expect(receipt).is.not.null; - } - - // stop prank - await provider.send("anvil_stopImpersonatingAccount", [ - attesterManager, - ]); - - // fetch number of attesters - const numAttesters = await messageTransmitter.getNumEnabledAttesters(); - - // confirm that the attester address swap was successful - const attester = await circleBridge - .localMessageTransmitter() - .then((address) => - IMessageTransmitter__factory.connect(address, provider) - ) - .then((messageTransmitter) => - messageTransmitter.getEnabledAttester( - numAttesters.sub(ethers.BigNumber.from("1")) - ) - ); - expect(myAttester.address).to.equal(attester); - }); - - it("USDC", async () => { - // fetch master minter address - const masterMinter = await IUSDC__factory.connect( - AVAX_USDC_TOKEN_ADDRESS, - provider - ).masterMinter(); - - const wallet = new ethers.Wallet(WALLET_PRIVATE_KEY, provider); - - // start prank (impersonate the Circle masterMinter) - await provider.send("anvil_impersonateAccount", [masterMinter]); - - // configure my wallet as minter - { - const usdc = IUSDC__factory.connect( - AVAX_USDC_TOKEN_ADDRESS, - provider.getSigner(masterMinter) - ); - - const receipt = await usdc - .configureMinter(wallet.address, ethers.constants.MaxUint256) - .then((tx) => tx.wait()) - .catch((msg) => { - // should not happen - console.log(msg); - return null; - }); - expect(receipt).is.not.null; - } - - // stop prank - await provider.send("anvil_stopImpersonatingAccount", [masterMinter]); - - // mint USDC and confirm with a balance check - { - const usdc = IUSDC__factory.connect(AVAX_USDC_TOKEN_ADDRESS, wallet); - const amount = ethers.utils.parseUnits("69420", 6); - - const balanceBefore = await usdc.balanceOf(wallet.address); - - const receipt = await usdc - .mint(wallet.address, amount) - .then((tx) => tx.wait()) - .catch((msg) => { - // should not happen - console.log(msg); - return null; - }); - expect(receipt).is.not.null; - - const balanceAfter = await usdc.balanceOf(wallet.address); - expect(balanceAfter.sub(balanceBefore).eq(amount)).is.true; - } - }); - }); - }); -}); diff --git a/evm/ts/test/01_registration.ts b/evm/ts/test/01_registration.ts deleted file mode 100644 index b2b49f8..0000000 --- a/evm/ts/test/01_registration.ts +++ /dev/null @@ -1,129 +0,0 @@ -import {expect} from "chai"; -import {ethers} from "ethers"; -import {tryNativeToUint8Array} from "@certusone/wormhole-sdk"; -import { - GUARDIAN_PRIVATE_KEY, - WORMHOLE_GUARDIAN_SET_INDEX, - ETH_LOCALHOST, - WALLET_PRIVATE_KEY, - AVAX_LOCALHOST, - ETH_FORK_CHAIN_ID, - AVAX_FORK_CHAIN_ID, -} from "./helpers/consts"; -import {ICircleIntegration__factory} from "../src/ethers-contracts"; -import {MockGuardians} from "@certusone/wormhole-sdk/lib/cjs/mock"; - -import {CircleGovernanceEmitter} from "./helpers/mock"; -import {getTimeNow, readCircleIntegrationProxyAddress} from "./helpers/utils"; - -describe("Circle Integration Registration", () => { - // ethereum wallet, CircleIntegration contract and USDC contract - const ethProvider = new ethers.providers.StaticJsonRpcProvider(ETH_LOCALHOST); - const ethWallet = new ethers.Wallet(WALLET_PRIVATE_KEY, ethProvider); - const ethCircleIntegration = ICircleIntegration__factory.connect( - readCircleIntegrationProxyAddress(ETH_FORK_CHAIN_ID), - ethWallet - ); - - // avalanche wallet, CircleIntegration contract and USDC contract - const avaxProvider = new ethers.providers.StaticJsonRpcProvider( - AVAX_LOCALHOST - ); - const avaxWallet = new ethers.Wallet(WALLET_PRIVATE_KEY, avaxProvider); - const avaxCircleIntegration = ICircleIntegration__factory.connect( - readCircleIntegrationProxyAddress(AVAX_FORK_CHAIN_ID), - avaxWallet - ); - - // MockGuardians and MockCircleAttester objects - const guardians = new MockGuardians(WORMHOLE_GUARDIAN_SET_INDEX, [ - GUARDIAN_PRIVATE_KEY, - ]); - - describe("Registrations", () => { - // produces governance VAAs for CircleAttestation contract - const governance = new CircleGovernanceEmitter(); - - describe("Ethereum Goerli Testnet", () => { - it("Should Register Foreign Circle Integration", async () => { - const timestamp = getTimeNow(); - const chainId = await ethCircleIntegration.chainId(); - const emitterChain = await avaxCircleIntegration.chainId(); - const emitterAddress = Buffer.from( - tryNativeToUint8Array(avaxCircleIntegration.address, "avalanche") - ); - const domain = await avaxCircleIntegration.localDomain(); - - // create unsigned registerEmitterAndDomain governance message - const published = - governance.publishCircleIntegrationRegisterEmitterAndDomain( - timestamp, - chainId, - emitterChain, - emitterAddress, - domain - ); - - // sign governance message with guardian key - const signedMessage = guardians.addSignatures(published, [0]); - - // register the emitter and domain - const receipt = await ethCircleIntegration - .registerEmitterAndDomain(signedMessage) - .then((tx) => tx.wait()) - .catch((msg) => { - // should not happen - console.log(msg); - return null; - }); - expect(receipt).is.not.null; - - // check contract state to verify the registration - const registeredEmitter = await ethCircleIntegration - .getRegisteredEmitter(emitterChain) - .then((bytes) => Buffer.from(ethers.utils.arrayify(bytes))); - expect(Buffer.compare(registeredEmitter, emitterAddress)).to.equal(0); - }); - }); - - describe("Avalanche Fuji Testnet", () => { - it("Should Register Foreign Circle Integration", async () => { - const timestamp = getTimeNow(); - const chainId = await avaxCircleIntegration.chainId(); - const emitterChain = await ethCircleIntegration.chainId(); - const emitterAddress = Buffer.from( - tryNativeToUint8Array(ethCircleIntegration.address, "avalanche") - ); - const domain = await ethCircleIntegration.localDomain(); - - // create unsigned registerEmitterAndDomain governance message - const published = - governance.publishCircleIntegrationRegisterEmitterAndDomain( - timestamp, - chainId, - emitterChain, - emitterAddress, - domain - ); - const signedMessage = guardians.addSignatures(published, [0]); - - // sign governance message with guardian key - const receipt = await avaxCircleIntegration - .registerEmitterAndDomain(signedMessage) - .then((tx) => tx.wait()) - .catch((msg) => { - // should not happen - console.log(msg); - return null; - }); - expect(receipt).is.not.null; - - // check contract state to verify the registration - const registeredEmitter = await avaxCircleIntegration - .getRegisteredEmitter(emitterChain) - .then((bytes) => Buffer.from(ethers.utils.arrayify(bytes))); - expect(Buffer.compare(registeredEmitter, emitterAddress)).to.equal(0); - }); - }); - }); -}); diff --git a/evm/ts/test/02_send_receive.ts b/evm/ts/test/02_send_receive.ts deleted file mode 100644 index 0a2a536..0000000 --- a/evm/ts/test/02_send_receive.ts +++ /dev/null @@ -1,971 +0,0 @@ -import {expect} from "chai"; -import {ethers} from "ethers"; -import { - CHAIN_ID_ALGORAND, - CHAIN_ID_AVAX, - CHAIN_ID_ETH, - tryNativeToUint8Array, -} from "@certusone/wormhole-sdk"; -import { - AVAX_USDC_TOKEN_ADDRESS, - ETH_USDC_TOKEN_ADDRESS, - GUARDIAN_PRIVATE_KEY, - WORMHOLE_GUARDIAN_SET_INDEX, - ETH_LOCALHOST, - WALLET_PRIVATE_KEY, - WALLET_PRIVATE_KEY_TWO, - AVAX_LOCALHOST, - ETH_FORK_CHAIN_ID, - AVAX_FORK_CHAIN_ID, - ETH_WORMHOLE_ADDRESS, - AVAX_WORMHOLE_ADDRESS, -} from "./helpers/consts"; -import { - ICircleIntegration__factory, - IUSDC__factory, - IMockIntegration__factory, - IWormhole__factory, -} from "../src/ethers-contracts"; -import {MockGuardians} from "@certusone/wormhole-sdk/lib/cjs/mock"; -import {RedeemParameters, TransferParameters} from "../src"; -import {findCircleMessageInLogs} from "../src/logs"; -import { - MockCircleAttester, - readCircleIntegrationProxyAddress, - readMockIntegrationAddress, - findWormholeMessageInLogs, - findRedeemEventInLogs, -} from "./helpers/utils"; - -describe("Circle Integration Send and Receive", () => { - // ethereum wallet, CircleIntegration contract and USDC contract - const ethProvider = new ethers.providers.StaticJsonRpcProvider(ETH_LOCALHOST); - const ethWallet = new ethers.Wallet(WALLET_PRIVATE_KEY, ethProvider); - const ethCircleIntegration = ICircleIntegration__factory.connect( - readCircleIntegrationProxyAddress(ETH_FORK_CHAIN_ID), - ethWallet - ); - const ethUsdc = IUSDC__factory.connect(ETH_USDC_TOKEN_ADDRESS, ethWallet); - - // avalanche wallet, CircleIntegration contract and USDC contract - const avaxProvider = new ethers.providers.StaticJsonRpcProvider( - AVAX_LOCALHOST - ); - const avaxWallet = new ethers.Wallet(WALLET_PRIVATE_KEY, avaxProvider); - const avaxCircleIntegration = ICircleIntegration__factory.connect( - readCircleIntegrationProxyAddress(AVAX_FORK_CHAIN_ID), - avaxWallet - ); - const avaxUsdc = IUSDC__factory.connect(AVAX_USDC_TOKEN_ADDRESS, avaxWallet); - - // mock integration contract on avax - const avaxMockIntegration = IMockIntegration__factory.connect( - readMockIntegrationAddress(AVAX_FORK_CHAIN_ID), - avaxWallet - ); - - // MockGuardians and MockCircleAttester objects - const guardians = new MockGuardians(WORMHOLE_GUARDIAN_SET_INDEX, [ - GUARDIAN_PRIVATE_KEY, - ]); - const circleAttester = new MockCircleAttester(GUARDIAN_PRIVATE_KEY); - - // Wormhole contracts - const ethWormhole = IWormhole__factory.connect( - ETH_WORMHOLE_ADDRESS, - ethWallet - ); - const avaxWormhole = IWormhole__factory.connect( - AVAX_WORMHOLE_ADDRESS, - avaxWallet - ); - - describe("Transfer With Payload Logic", () => { - const amountFromEth = ethers.BigNumber.from("69"); - const amountFromAvax = ethers.BigNumber.from("420"); - - let localVariables: any = {}; - - it("Should Transfer Tokens With Payload On Ethereum", async () => { - // define transferTokensWithPayload function arguments - const params: TransferParameters = { - token: ETH_USDC_TOKEN_ADDRESS, - amount: amountFromEth, - targetChain: CHAIN_ID_AVAX as number, - mintRecipient: tryNativeToUint8Array(avaxWallet.address, "avalanche"), - }; - const batchId = 0; // opt out of batching - const payload = Buffer.from("All your base are belong to us."); - - // increase allowance - { - const receipt = await ethUsdc - .approve(ethCircleIntegration.address, amountFromEth) - .then((tx) => tx.wait()); - } - - // grab USDC balance before performing the transfer - const balanceBefore = await ethUsdc.balanceOf(ethWallet.address); - - // call transferTokensWithPayload - const receipt = await ethCircleIntegration - .transferTokensWithPayload(params, batchId, payload) - .then(async (tx) => { - const receipt = await tx.wait(); - return receipt; - }) - .catch((msg) => { - // should not happen - console.log(msg); - return null; - }); - expect(receipt).is.not.null; - - // check USDC balance after to confirm the transfer worked - const balanceAfter = await ethUsdc.balanceOf(ethWallet.address); - expect(balanceBefore.sub(balanceAfter).eq(amountFromEth)).is.true; - - // grab Circle message from logs - const circleMessage = await ethCircleIntegration - .circleTransmitter() - .then((address) => findCircleMessageInLogs(receipt!.logs, address)); - expect(circleMessage).is.not.null; - - // grab attestation - const circleAttestation = circleAttester.attestMessage( - ethers.utils.arrayify(circleMessage!) - ); - - // now grab the Wormhole message - const wormholeMessage = await ethCircleIntegration - .wormhole() - .then((address) => - findWormholeMessageInLogs( - receipt!.logs, - address, - CHAIN_ID_ETH as number - ) - ); - expect(wormholeMessage).is.not.null; - - // sign the DepositWithPayload message - const encodedWormholeMessage = Uint8Array.from( - guardians.addSignatures(wormholeMessage!, [0]) - ); - - // save all of the redeem parameters - localVariables.circleBridgeMessage = circleMessage!; - localVariables.circleAttestation = circleAttestation!; - localVariables.encodedWormholeMessage = encodedWormholeMessage; - }); - - it("Should Redeem Tokens With Payload On Avax", async () => { - // create RedeemParameters struct to invoke the target contract with - const redeemParameters: RedeemParameters = { - circleBridgeMessage: localVariables.circleBridgeMessage!, - circleAttestation: localVariables.circleAttestation!, - encodedWormholeMessage: localVariables.encodedWormholeMessage!, - }; - - // clear the localVariables object - localVariables = {}; - - // grab the balance before redeeming the transfer - const balanceBefore = await avaxUsdc.balanceOf(avaxWallet.address); - - // redeem the transfer - const receipt = await avaxCircleIntegration - .redeemTokensWithPayload(redeemParameters) - .then(async (tx) => { - const receipt = await tx.wait(); - return receipt; - }) - .catch((msg) => { - // should not happen - console.log(msg); - return null; - }); - expect(receipt).is.not.null; - - // parse the wormhole message - const parsedMessage = await avaxWormhole.parseVM( - redeemParameters.encodedWormholeMessage - ); - - // fetch the Redeem event emitted by the contract - const event = findRedeemEventInLogs( - receipt!.logs, - avaxCircleIntegration.address - ); - expect(event.emitterChainId).to.equal(parsedMessage.emitterChainId); - expect(event.emitterAddress).to.equal(parsedMessage.emitterAddress); - expect(event.sequence.toString()).to.equal( - parsedMessage.sequence.toString() - ); - - // confirm expected balance change - const balanceAfter = await avaxUsdc.balanceOf(avaxWallet.address); - expect(balanceAfter.sub(balanceBefore).eq(amountFromEth)).is.true; - }); - - it("Should Transfer Tokens With Payload On Avax", async () => { - // define transferTokensWithPayload function arguments - const params: TransferParameters = { - token: AVAX_USDC_TOKEN_ADDRESS, - amount: amountFromAvax, - targetChain: CHAIN_ID_ETH as number, - mintRecipient: tryNativeToUint8Array(avaxWallet.address, "ethereum"), - }; - const batchId = 0; // opt out of batching - const payload = Buffer.from("Send me back to Ethereum!"); - - // increase allowance - { - const receipt = await avaxUsdc - .approve(avaxCircleIntegration.address, amountFromAvax) - .then((tx) => tx.wait()); - } - - // grab USDC balance before performing the transfer - const balanceBefore = await avaxUsdc.balanceOf(avaxWallet.address); - - // call transferTokensWithPayload - const receipt = await avaxCircleIntegration - .transferTokensWithPayload(params, batchId, payload) - .then(async (tx) => { - const receipt = await tx.wait(); - return receipt; - }) - .catch((msg) => { - // should not happen - console.log(msg); - return null; - }); - expect(receipt).is.not.null; - - // check USDC balance after to confirm the transfer worked - const balanceAfter = await avaxUsdc.balanceOf(avaxWallet.address); - expect(balanceBefore.sub(balanceAfter).eq(amountFromAvax)).is.true; - - // grab Circle message from logs - const circleMessage = await avaxCircleIntegration - .circleTransmitter() - .then((address) => findCircleMessageInLogs(receipt!.logs, address)); - expect(circleMessage).is.not.null; - - // grab attestation - const circleAttestation = circleAttester.attestMessage( - ethers.utils.arrayify(circleMessage!) - ); - - // now grab the Wormhole message - const wormholeMessage = await avaxCircleIntegration - .wormhole() - .then((address) => - findWormholeMessageInLogs( - receipt!.logs, - address, - CHAIN_ID_AVAX as number - ) - ); - expect(wormholeMessage).is.not.null; - - // sign the Wormhole message - const encodedWormholeMessage = Uint8Array.from( - guardians.addSignatures(wormholeMessage!, [0]) - ); - - // save all of the redeem parameters - localVariables.circleBridgeMessage = circleMessage!; - localVariables.circleAttestation = circleAttestation!; - localVariables.encodedWormholeMessage = encodedWormholeMessage; - }); - - it("Should Redeem Tokens With Payload On Ethereum", async () => { - // create RedeemParameters struct to invoke the target contract with - const redeemParameters: RedeemParameters = { - circleBridgeMessage: localVariables.circleBridgeMessage!, - circleAttestation: localVariables.circleAttestation!, - encodedWormholeMessage: localVariables.encodedWormholeMessage!, - }; - - // NOTICE: don't clear the localVariables object, the values are used in the next test - - // grab the balance before redeeming the transfer - const balanceBefore = await ethUsdc.balanceOf(ethWallet.address); - - // redeem the transfer - const receipt = await ethCircleIntegration - .redeemTokensWithPayload(redeemParameters) - .then(async (tx) => { - const receipt = await tx.wait(); - return receipt; - }) - .catch((msg) => { - // should not happen - console.log(msg); - return null; - }); - expect(receipt).is.not.null; - - // parse the wormhole message - const parsedMessage = await ethWormhole.parseVM( - redeemParameters.encodedWormholeMessage - ); - - // fetch the Redeem event emitted by the contract - const event = findRedeemEventInLogs( - receipt!.logs, - ethCircleIntegration.address - ); - expect(event.emitterChainId).to.equal(parsedMessage.emitterChainId); - expect(event.emitterAddress).to.equal(parsedMessage.emitterAddress); - expect(event.sequence.toString()).to.equal( - parsedMessage.sequence.toString() - ); - - // confirm expected balance change - const balanceAfter = await ethUsdc.balanceOf(ethWallet.address); - expect(balanceAfter.sub(balanceBefore).eq(amountFromAvax)).is.true; - }); - - it("Should Not Redeem a Transfer More Than Once", async () => { - // Reuse the RedeemParameters from the previous test to try to redeem again - const redeemParameters: RedeemParameters = { - circleBridgeMessage: localVariables.circleBridgeMessage!, - circleAttestation: localVariables.circleAttestation!, - encodedWormholeMessage: localVariables.encodedWormholeMessage!, - }; - - // clear the localVariables object - localVariables = {}; - - // grab the balance before redeeming the transfer - const balanceBefore = await ethUsdc.balanceOf(ethWallet.address); - - // try to redeem the transfer again - let failed: boolean = false; - try { - const receipt = await ethCircleIntegration - .redeemTokensWithPayload(redeemParameters) - .then(async (tx) => { - const receipt = await tx.wait(); - return receipt; - }); - } catch (e: any) { - expect(e.error.reason, "execution reverted: message already consumed") - .to.be.equal; - failed = true; - } - - // confirm that the call failed - expect(failed).is.true; - - // confirm expected balance change - const balanceAfter = await ethUsdc.balanceOf(ethWallet.address); - expect(balanceAfter.eq(balanceBefore)).is.true; - }); - - it("Should Not Allow Transfers for Zero Amount", async () => { - // define transferTokensWithPayload function arguments - const params: TransferParameters = { - token: avaxWallet.address, - amount: ethers.BigNumber.from("0"), // zero amount - targetChain: CHAIN_ID_ETH as number, - mintRecipient: tryNativeToUint8Array(ethWallet.address, "ethereum"), - }; - const batchId = 0; // opt out of batching - const payload = Buffer.from("Send zero tokens :)"); - - // try to initiate a transfer with an amount of zero - let failed: boolean = false; - try { - const receipt = await avaxCircleIntegration - .transferTokensWithPayload(params, batchId, payload) - .then(async (tx) => { - const receipt = await tx.wait(); - return receipt; - }); - } catch (e: any) { - expect(e.error.reason, "execution reverted: amount must be > 0").to.be - .equal; - failed = true; - } - - // confirm that the call failed - expect(failed).is.true; - }); - - it("Should Not Allow Transfers to the Zero Address", async () => { - // define transferTokensWithPayload function arguments - const params: TransferParameters = { - token: avaxWallet.address, - amount: amountFromAvax, - targetChain: CHAIN_ID_ETH as number, - mintRecipient: tryNativeToUint8Array("0x", "ethereum"), // zero address - }; - const batchId = 0; // opt out of batching - const payload = Buffer.from("Sending to bytes32(0) mintRecipient :)"); - - // try to initiate a transfer to the zero address - let failed: boolean = false; - try { - const receipt = await avaxCircleIntegration - .transferTokensWithPayload(params, batchId, payload) - .then(async (tx) => { - const receipt = await tx.wait(); - return receipt; - }); - } catch (e: any) { - expect(e.error.reason, "execution reverted: invalid mint recipient").to - .be.equal; - failed = true; - } - - // confirm that the call failed - expect(failed).is.true; - }); - - it("Should Not Allow Transfers for Unregistered Tokens", async () => { - // define transferTokensWithPayload function arguments - const params: TransferParameters = { - token: avaxWallet.address, // unregistered "token" - amount: amountFromAvax, - targetChain: CHAIN_ID_ETH as number, - mintRecipient: tryNativeToUint8Array(ethWallet.address, "ethereum"), - }; - const batchId = 0; // opt out of batching - const payload = Buffer.from("Sending an unregistered token :)"); - - // try to initiate a transfer for an unregistered token - let failed: boolean = false; - try { - const receipt = await avaxCircleIntegration - .transferTokensWithPayload(params, batchId, payload) - .then(async (tx) => { - const receipt = await tx.wait(); - return receipt; - }); - } catch (e: any) { - expect(e.error.reason, "execution reverted: token not accepted").to.be - .equal; - failed = true; - } - - // confirm that the call failed - expect(failed).is.true; - }); - - it("Should Not Allow Transfers to Unregistered Contracts", async () => { - // define transferTokensWithPayload function arguments - const params: TransferParameters = { - token: avaxWallet.address, - amount: amountFromAvax, - targetChain: CHAIN_ID_ALGORAND as number, // unregistered chain - mintRecipient: tryNativeToUint8Array(ethWallet.address, "ethereum"), - }; - const batchId = 0; // opt out of batching - const payload = Buffer.from("Sending to an unregistered chain :)"); - - // try to initiate a transfer to an unregistered CircleIntegration contract - let failed: boolean = false; - try { - const receipt = await avaxCircleIntegration - .transferTokensWithPayload(params, batchId, payload) - .then(async (tx) => { - const receipt = await tx.wait(); - return receipt; - }); - } catch (e: any) { - expect( - e.error.reason, - "execution reverted: target contract not registered" - ).to.be.equal; - failed = true; - } - - // confirm that the call failed - expect(failed).is.true; - }); - - it("Should Only Mint Tokens to the Mint Recipient", async () => { - // define transferTokensWithPayload function arguments - const params: TransferParameters = { - token: AVAX_USDC_TOKEN_ADDRESS, - amount: amountFromAvax, - targetChain: CHAIN_ID_ETH as number, - mintRecipient: tryNativeToUint8Array(ethWallet.address, "ethereum"), - }; - const batchId = 0; // opt out of batching - const payload = Buffer.from("Send me back to Ethereum!"); - - // increase allowance - const receipt = await avaxUsdc - .approve(avaxCircleIntegration.address, amountFromAvax) - .then((tx) => tx.wait()); - - // call transfer with payload and save redeemParameters struct - let redeemParameters = {} as RedeemParameters; - { - // grab USDC balance before performing the transfer - const balanceBefore = await avaxUsdc.balanceOf(avaxWallet.address); - - // call transferTokensWithPayload - const receipt = await avaxCircleIntegration - .transferTokensWithPayload(params, batchId, payload) - .then(async (tx) => { - const receipt = await tx.wait(); - return receipt; - }) - .catch((msg) => { - // should not happen - console.log(msg); - return null; - }); - expect(receipt).is.not.null; - - // check USDC balance after to confirm the transfer worked - const balanceAfter = await avaxUsdc.balanceOf(avaxWallet.address); - expect(balanceBefore.sub(balanceAfter).eq(amountFromAvax)).is.true; - - // grab Circle message from logs - const circleMessage = await avaxCircleIntegration - .circleTransmitter() - .then((address) => findCircleMessageInLogs(receipt!.logs, address)); - expect(circleMessage).is.not.null; - - // grab attestation - const circleAttestation = circleAttester.attestMessage( - ethers.utils.arrayify(circleMessage!) - ); - - // now grab the Wormhole Message - const wormholeMessage = await avaxCircleIntegration - .wormhole() - .then((address) => - findWormholeMessageInLogs( - receipt!.logs, - address, - CHAIN_ID_AVAX as number - ) - ); - expect(wormholeMessage).is.not.null; - - // sign the wormhole message with the guardian key - const encodedWormholeMessage = Uint8Array.from( - guardians.addSignatures(wormholeMessage!, [0]) - ); - - // save redeemParameters struct - redeemParameters = { - circleBridgeMessage: ethers.utils.arrayify(circleMessage!), - circleAttestation: circleAttestation!, - encodedWormholeMessage: encodedWormholeMessage!, - }; - } - - // try to redeem the transfer from a different wallet - { - // create wallet with different private key - const invalidEthWallet = new ethers.Wallet( - WALLET_PRIVATE_KEY_TWO, - ethProvider - ); - - // connect to contract with new wallet for redemption - const ethCircleIntegration = ICircleIntegration__factory.connect( - readCircleIntegrationProxyAddress(ETH_FORK_CHAIN_ID), - invalidEthWallet - ); - - let failed: boolean = false; - try { - // call redeemTokensWithPayload - const receipt = await ethCircleIntegration - .redeemTokensWithPayload(redeemParameters) - .then(async (tx) => { - const receipt = await tx.wait(); - return receipt; - }); - } catch (e: any) { - expect( - e.error.reason, - "execution reverted: caller must be mintRecipient" - ).to.be.equal; - failed = true; - } - - // confirm that the call failed - expect(failed).is.true; - } - - // clear the localVariables object - localVariables = {}; - }); - - it("Should Not Redeem Tokens With a Bad Message Pair", async () => { - // define transferTokensWithPayload function arguments - const params: TransferParameters = { - token: AVAX_USDC_TOKEN_ADDRESS, - amount: amountFromAvax, - targetChain: CHAIN_ID_ETH as number, - mintRecipient: tryNativeToUint8Array(ethWallet.address, "ethereum"), - }; - const batchId = 0; // opt out of batching - const payload = Buffer.from("Scrambled Messageggs!"); - - // increase the token allowance by 2x, since we will do two transfers - const receipt = await avaxUsdc - .approve(avaxCircleIntegration.address, amountFromAvax.mul(2)) - .then((tx) => tx.wait()); - - // send the same transfer twice and save the redeemParameters - let redeemParameters = {} as RedeemParameters[]; - { - for (let i = 0; i < 2; i++) { - // grab USDC balance before performing the transfer - const balanceBefore = await avaxUsdc.balanceOf(avaxWallet.address); - - // call transferTokensWithPayload - const receipt = await avaxCircleIntegration - .transferTokensWithPayload(params, batchId, payload) - .then(async (tx) => { - const receipt = await tx.wait(); - return receipt; - }) - .catch((msg) => { - // should not happen - console.log(msg); - return null; - }); - expect(receipt).is.not.null; - - // check USDC balance after to confirm the transfer worked - const balanceAfter = await avaxUsdc.balanceOf(avaxWallet.address); - expect(balanceBefore.sub(balanceAfter).eq(amountFromAvax)).is.true; - - // grab Circle message from logs - const circleMessage = await avaxCircleIntegration - .circleTransmitter() - .then((address) => findCircleMessageInLogs(receipt!.logs, address)); - expect(circleMessage).is.not.null; - - // grab attestation - const circleAttestation = circleAttester.attestMessage( - ethers.utils.arrayify(circleMessage!) - ); - - // now grab the Wormhole Message - const wormholeMessage = await avaxCircleIntegration - .wormhole() - .then((address) => - findWormholeMessageInLogs( - receipt!.logs, - address, - CHAIN_ID_AVAX as number - ) - ); - expect(wormholeMessage).is.not.null; - - // sign the wormhole message with the guardian key - const encodedWormholeMessage = Uint8Array.from( - guardians.addSignatures(wormholeMessage!, [0]) - ); - - // save redeemParameters struct - redeemParameters[i] = { - circleBridgeMessage: ethers.utils.arrayify(circleMessage!), - circleAttestation: circleAttestation!, - encodedWormholeMessage: encodedWormholeMessage!, - }; - } - } - - // Create new redeemParameters with an invalid message pair, by - // pairing the Wormhole message from the second transfer with - // the Circle message and attestation from the first transfer. - const invalidRedeemParameters: RedeemParameters = { - circleBridgeMessage: redeemParameters[0].circleBridgeMessage, - circleAttestation: redeemParameters[0].circleAttestation, - encodedWormholeMessage: redeemParameters[1].encodedWormholeMessage, - }; - - { - let failed: boolean = false; - try { - // call redeemTokensWithPayload - const receipt = await ethCircleIntegration - .redeemTokensWithPayload(invalidRedeemParameters) - .then(async (tx) => { - const receipt = await tx.wait(); - return receipt; - }); - } catch (e: any) { - expect(e.error.reason, "execution reverted: invalid message pair").to - .be.equal; - failed = true; - } - - // confirm that the call failed - expect(failed).is.true; - } - - // clear the localVariables object - localVariables = {}; - }); - - it("Should Revert if Circle Receiver Call Fails", async () => { - // define transferTokensWithPayload function arguments - const params: TransferParameters = { - token: AVAX_USDC_TOKEN_ADDRESS, - amount: amountFromAvax, - targetChain: CHAIN_ID_ETH as number, - mintRecipient: tryNativeToUint8Array(ethWallet.address, "ethereum"), - }; - const batchId = 0; // opt out of batching - const payload = Buffer.from("To the moon!"); - - // increase allowance - const receipt = await avaxUsdc - .approve(avaxCircleIntegration.address, amountFromAvax) - .then((tx) => tx.wait()); - - // call transfer with payload and save redeemParameters struct - let redeemParameters = {} as RedeemParameters; - { - // grab USDC balance before performing the transfer - const balanceBefore = await avaxUsdc.balanceOf(avaxWallet.address); - - // call transferTokensWithPayload - const receipt = await avaxCircleIntegration - .transferTokensWithPayload(params, batchId, payload) - .then(async (tx) => { - const receipt = await tx.wait(); - return receipt; - }) - .catch((msg) => { - // should not happen - console.log(msg); - return null; - }); - expect(receipt).is.not.null; - - // check USDC balance after to confirm the transfer worked - const balanceAfter = await avaxUsdc.balanceOf(avaxWallet.address); - expect(balanceBefore.sub(balanceAfter).eq(amountFromAvax)).is.true; - - // grab Circle message from logs - const circleMessage = await avaxCircleIntegration - .circleTransmitter() - .then((address) => findCircleMessageInLogs(receipt!.logs, address)); - expect(circleMessage).is.not.null; - - // now grab the Wormhole Message - const wormholeMessage = await avaxCircleIntegration - .wormhole() - .then((address) => - findWormholeMessageInLogs( - receipt!.logs, - address, - CHAIN_ID_AVAX as number - ) - ); - expect(wormholeMessage).is.not.null; - - // sign the wormhole message with the guardian key - const encodedWormholeMessage = Uint8Array.from( - guardians.addSignatures(wormholeMessage!, [0]) - ); - - // save redeemParameters struct - redeemParameters = { - circleBridgeMessage: ethers.utils.arrayify(circleMessage!), - circleAttestation: ethers.utils.arrayify("0x"), - encodedWormholeMessage: encodedWormholeMessage!, - }; - } - - // try to redeem the transfer from a different wallet - { - let failed: boolean = false; - try { - // call redeemTokensWithPayload - const receipt = await ethCircleIntegration - .redeemTokensWithPayload(redeemParameters) - .then(async (tx) => { - const receipt = await tx.wait(); - return receipt; - }); - } catch (e: any) { - expect( - e.error.reason, - "execution reverted: CIRCLE_INTEGRATION: failed to mint tokens" - ).to.be.equal; - failed = true; - } - - // confirm that the call failed - expect(failed).is.true; - } - }); - }); - - describe("Mock Integration Contract", () => { - const amountFromEth = ethers.BigNumber.from("42069"); - - // create new avax wallet for mock integration contract interaction - const avaxMockWallet = new ethers.Wallet( - WALLET_PRIVATE_KEY_TWO, - avaxProvider - ); - - let localVariables: any = {}; - - it("Should Set Up Mock Integration Contract on Avax", async () => { - // call the `setup` method on the MockIntegration contract - const receipt = await avaxMockIntegration - .setup(avaxCircleIntegration.address, ethWallet.address, CHAIN_ID_ETH) - .then((tx) => tx.wait()) - .catch((msg) => { - // should not happen - console.log(msg); - return null; - }); - expect(receipt).is.not.null; - - // confirm that the contract is set up correctly by querying the getters - const trustedChainId = await avaxMockIntegration.trustedChainId(); - expect(trustedChainId).to.equal(CHAIN_ID_ETH); - - const trustedSender = await avaxMockIntegration.trustedSender(); - expect(trustedSender).to.equal(ethWallet.address); - - const circleIntegration = await avaxMockIntegration.circleIntegration(); - expect(circleIntegration).to.equal(avaxCircleIntegration.address); - }); - - it("Should Transfer Tokens With Payload On Ethereum", async () => { - // define transferTokensWithPayload function arguments - const params: TransferParameters = { - token: ETH_USDC_TOKEN_ADDRESS, - amount: amountFromEth, - targetChain: CHAIN_ID_AVAX as number, - mintRecipient: tryNativeToUint8Array( - avaxMockIntegration.address, - "avalanche" - ), // set mint recipient as the avax mock integration contract - }; - const batchId = 0; // opt out of batching - const payload = Buffer.from("Coming to a mock contract near you."); - - // increase allowance - { - const receipt = await ethUsdc - .approve(ethCircleIntegration.address, amountFromEth) - .then((tx) => tx.wait()); - } - - // grab USDC balance before performing the transfer - const balanceBefore = await ethUsdc.balanceOf(ethWallet.address); - - // call transferTokensWithPayload - const receipt = await ethCircleIntegration - .transferTokensWithPayload(params, batchId, payload) - .then(async (tx) => { - const receipt = await tx.wait(); - return receipt; - }) - .catch((msg) => { - // should not happen - console.log(msg); - return null; - }); - expect(receipt).is.not.null; - - // check USDC balance after to confirm the transfer worked - const balanceAfter = await ethUsdc.balanceOf(ethWallet.address); - expect(balanceBefore.sub(balanceAfter).eq(amountFromEth)).is.true; - - // grab Circle message from logs - const circleMessage = await ethCircleIntegration - .circleTransmitter() - .then((address) => findCircleMessageInLogs(receipt!.logs, address)); - expect(circleMessage).is.not.null; - - // grab attestation - const circleAttestation = circleAttester.attestMessage( - ethers.utils.arrayify(circleMessage!) - ); - - // now grab the Wormhole Message - const wormholeMessage = await ethCircleIntegration - .wormhole() - .then((address) => - findWormholeMessageInLogs( - receipt!.logs, - address, - CHAIN_ID_ETH as number - ) - ); - expect(wormholeMessage).is.not.null; - - // sign the wormhole message with the guardian key - const encodedWormholeMessage = Uint8Array.from( - guardians.addSignatures(wormholeMessage!, [0]) - ); - - // save redeem parameters and custom payload - localVariables.circleBridgeMessage = circleMessage!; - localVariables.circleAttestation = circleAttestation!; - localVariables.encodedWormholeMessage = encodedWormholeMessage; - localVariables.payload = ethers.utils.hexlify(payload); - }); - - it("Should Redeem Tokens Via Mock Integration Contract on Avax and Verify the Saved Payload", async () => { - // create RedeemParameters struct to invoke the target contract with - const redeemParameters: RedeemParameters = { - circleBridgeMessage: localVariables.circleBridgeMessage!, - circleAttestation: localVariables.circleAttestation!, - encodedWormholeMessage: localVariables.encodedWormholeMessage!, - }; - - // grab USDC balance before redeeming the token transfer - const balanceBefore = await avaxUsdc.balanceOf(avaxMockWallet.address); - - // Invoke the mock contract with the trusted sender wallet, - // which shares address with eth wallet. - const receipt = await avaxMockIntegration - .redeemTokensWithPayload(redeemParameters, avaxMockWallet.address) - .then(async (tx) => { - const receipt = await tx.wait(); - return receipt; - }) - .catch((msg) => { - // should not happen - console.log(msg); - return null; - }); - expect(receipt).is.not.null; - - // confirm the expected balance change for the mock avax wallet - const balanceAfter = await avaxUsdc.balanceOf(avaxMockWallet.address); - expect(balanceAfter.sub(balanceBefore).eq(amountFromEth)).is.true; - - // query the mock contract and confirm that the payload was saved correctly - const savedPayload = await await avaxMockIntegration - .redemptionSequence() - .then(async (sequence) => { - return await avaxMockIntegration.getPayload(sequence); - }) - .catch((msg) => { - // should not happen - console.log(msg); - return null; - }); - expect(savedPayload).is.equal(localVariables.payload); - - // clear the localVariables object - localVariables = {}; - }); - }); -}); diff --git a/evm/ts/test/03_upgrade.ts b/evm/ts/test/03_upgrade.ts deleted file mode 100644 index d34188a..0000000 --- a/evm/ts/test/03_upgrade.ts +++ /dev/null @@ -1,168 +0,0 @@ -import {expect} from "chai"; -import {ethers} from "ethers"; -import {tryNativeToUint8Array} from "@certusone/wormhole-sdk"; -import { - GUARDIAN_PRIVATE_KEY, - WORMHOLE_GUARDIAN_SET_INDEX, - ETH_LOCALHOST, - WALLET_PRIVATE_KEY, - AVAX_LOCALHOST, - ETH_FORK_CHAIN_ID, - AVAX_FORK_CHAIN_ID, -} from "./helpers/consts"; -import {ICircleIntegration__factory} from "../src/ethers-contracts"; -import {MockGuardians} from "@certusone/wormhole-sdk/lib/cjs/mock"; - -import {CircleGovernanceEmitter} from "./helpers/mock"; -import {getTimeNow, readCircleIntegrationProxyAddress} from "./helpers/utils"; - -const {execSync} = require("child_process"); - -describe("Circle Integration Implementation Upgrade", () => { - // ethereum wallet, CircleIntegration contract and USDC contract - const ethProvider = new ethers.providers.StaticJsonRpcProvider(ETH_LOCALHOST); - const ethWallet = new ethers.Wallet(WALLET_PRIVATE_KEY, ethProvider); - const ethProxyAddress = readCircleIntegrationProxyAddress(ETH_FORK_CHAIN_ID); - const ethCircleIntegration = ICircleIntegration__factory.connect( - ethProxyAddress, - ethWallet - ); - - // avalanche wallet, CircleIntegration contract and USDC contract - const avaxProvider = new ethers.providers.StaticJsonRpcProvider( - AVAX_LOCALHOST - ); - const avaxWallet = new ethers.Wallet(WALLET_PRIVATE_KEY, avaxProvider); - const avaxProxyAddress = - readCircleIntegrationProxyAddress(AVAX_FORK_CHAIN_ID); - const avaxCircleIntegration = ICircleIntegration__factory.connect( - avaxProxyAddress, - avaxWallet - ); - - // MockGuardians and MockCircleAttester objects - const guardians = new MockGuardians(WORMHOLE_GUARDIAN_SET_INDEX, [ - GUARDIAN_PRIVATE_KEY, - ]); - - const newImplementations = new Map(); - - describe("Run `yarn deploy-implementation-only`", () => { - describe("Ethereum Goerli Testnet", () => { - it("Deploy", async () => { - const output = execSync( - `RPC=${ETH_LOCALHOST} PRIVATE_KEY=${WALLET_PRIVATE_KEY} yarn deploy-implementation-only` - ).toString(); - const address = output.match( - /CircleIntegrationImplementation: (0x[A-Fa-f0-9]+)/ - )[1]; - newImplementations.set("ethereum", address); - }); - }); - - describe("Avalanche Fuji Testnet", () => { - it("Deploy", async () => { - const output = execSync( - `RPC=${AVAX_LOCALHOST} PRIVATE_KEY=${WALLET_PRIVATE_KEY} yarn deploy-implementation-only` - ).toString(); - const address = output.match( - /CircleIntegrationImplementation: (0x[A-Fa-f0-9]+)/ - )[1]; - newImplementations.set("avalanche", address); - }); - }); - }); - - describe("Run `yarn upgrade-proxy`", () => { - // produces governance VAAs for CircleAttestation contract - const governance = new CircleGovernanceEmitter(); - - describe("Ethereum Goerli Testnet", () => { - const chainName = "ethereum"; - - it("Upgrade", async () => { - const timestamp = getTimeNow(); - const chainId = await ethCircleIntegration.chainId(); - const newImplementation = newImplementations.get(chainName); - expect(newImplementation).is.not.undefined; - - { - const initialized = await ethCircleIntegration.isInitialized( - newImplementation! - ); - expect(initialized).is.false; - } - - // create unsigned upgradeContract governance message - const published = governance.publishCircleIntegrationUpgradeContract( - timestamp, - chainId, - tryNativeToUint8Array(newImplementation!, chainName) - ); - - // sign governance message with guardian key - const signedMessage = guardians.addSignatures(published, [0]); - - // upgrade contract with new implementation - execSync( - `yarn upgrade-proxy \ - --rpc-url ${ETH_LOCALHOST} \ - --private-key ${WALLET_PRIVATE_KEY} \ - --proxy ${ethProxyAddress} \ - --governance-message ${signedMessage.toString("hex")}` - ); - - { - const initialized = await ethCircleIntegration.isInitialized( - newImplementation! - ); - expect(initialized).is.true; - } - }); - }); - - describe("Avalanche Fuji Testnet", () => { - const chainName = "avalanche"; - - it("Upgrade", async () => { - const timestamp = getTimeNow(); - const chainId = await avaxCircleIntegration.chainId(); - const newImplementation = newImplementations.get(chainName); - expect(newImplementation).is.not.undefined; - - { - const initialized = await avaxCircleIntegration.isInitialized( - newImplementation! - ); - expect(initialized).is.false; - } - - // create unsigned upgradeContract governance message - const published = governance.publishCircleIntegrationUpgradeContract( - timestamp, - chainId, - tryNativeToUint8Array(newImplementation!, chainName) - ); - - // sign governance message with guardian key - const signedMessage = guardians.addSignatures(published, [0]); - - // upgrade contract with new implementation - execSync( - `yarn upgrade-proxy \ - --rpc-url ${AVAX_LOCALHOST} \ - --private-key ${WALLET_PRIVATE_KEY} \ - --proxy ${avaxProxyAddress} \ - --governance-message ${signedMessage.toString("hex")}` - ); - - { - const initialized = await avaxCircleIntegration.isInitialized( - newImplementation! - ); - expect(initialized).is.true; - } - }); - }); - }); -}); diff --git a/evm/ts/test/helpers/consts.ts b/evm/ts/test/helpers/consts.ts deleted file mode 100644 index 9552a6d..0000000 --- a/evm/ts/test/helpers/consts.ts +++ /dev/null @@ -1,27 +0,0 @@ -import {ethers} from "ethers"; - -// ethereum goerli testnet fork -export const ETH_LOCALHOST = "http://localhost:8546"; -export const ETH_FORK_CHAIN_ID = Number(process.env.ETH_FORK_CHAIN_ID!); -export const ETH_WORMHOLE_ADDRESS = process.env.ETH_WORMHOLE_ADDRESS!; -export const ETH_USDC_TOKEN_ADDRESS = process.env.ETH_USDC_TOKEN_ADDRESS!; -export const ETH_CIRCLE_BRIDGE_ADDRESS = process.env.ETH_CIRCLE_BRIDGE_ADDRESS!; - -// avalanche fuji testnet fork -export const AVAX_LOCALHOST = "http://localhost:8547"; -export const AVAX_FORK_CHAIN_ID = Number(process.env.AVAX_FORK_CHAIN_ID!); -export const AVAX_WORMHOLE_ADDRESS = process.env.AVAX_WORMHOLE_ADDRESS!; -export const AVAX_USDC_TOKEN_ADDRESS = process.env.AVAX_USDC_TOKEN_ADDRESS!; -export const AVAX_CIRCLE_BRIDGE_ADDRESS = - process.env.AVAX_CIRCLE_BRIDGE_ADDRESS!; - -// global -export const WORMHOLE_MESSAGE_FEE = ethers.BigNumber.from( - process.env.TESTING_WORMHOLE_MESSAGE_FEE! -); -export const WORMHOLE_GUARDIAN_SET_INDEX = Number( - process.env.TESTING_WORMHOLE_GUARDIAN_SET_INDEX! -); -export const GUARDIAN_PRIVATE_KEY = process.env.TESTING_DEVNET_GUARDIAN!; -export const WALLET_PRIVATE_KEY = process.env.WALLET_PRIVATE_KEY!; -export const WALLET_PRIVATE_KEY_TWO = process.env.WALLET_PRIVATE_KEY_TWO!; diff --git a/evm/ts/test/helpers/mock.ts b/evm/ts/test/helpers/mock.ts deleted file mode 100644 index 777601b..0000000 --- a/evm/ts/test/helpers/mock.ts +++ /dev/null @@ -1,80 +0,0 @@ -import {GovernanceEmitter} from "@certusone/wormhole-sdk/lib/cjs/mock"; -import {ethers} from "ethers"; - -export interface Transfer { - token: string; - amount: ethers.BigNumber; - targetChain: number; - mintRecipient: Buffer; -} - -export interface MockDepositWithPayload { - nonce: number; - fromAddress: Buffer; -} - -export class CircleGovernanceEmitter extends GovernanceEmitter { - constructor(startSequence?: number) { - super( - "0000000000000000000000000000000000000000000000000000000000000004", - startSequence - ); - } - - publishCircleIntegrationUpdateFinality( - timestamp: number, - chain: number, - finality: number, - uptickSequence: boolean = true - ) { - const payload = Buffer.alloc(1); - payload.writeUIntBE(finality, 0, 1); - return this.publishGovernanceMessage( - timestamp, - "CircleIntegration", - payload, - 1, - chain, - uptickSequence - ); - } - - publishCircleIntegrationRegisterEmitterAndDomain( - timestamp: number, - chain: number, - emitterChain: number, - emitterAddress: Buffer, - domain: number, - uptickSequence: boolean = true - ) { - const payload = Buffer.alloc(38); - payload.writeUInt16BE(emitterChain, 0); - payload.write(emitterAddress.toString("hex"), 2, "hex"); - payload.writeUInt32BE(domain, 34); - return this.publishGovernanceMessage( - timestamp, - "CircleIntegration", - payload, - 2, - chain, - uptickSequence - ); - } - - publishCircleIntegrationUpgradeContract( - timestamp: number, - chain: number, - newImplementation: Uint8Array, - uptickSequence: boolean = true - ) { - const payload = Buffer.alloc(32, Buffer.from(newImplementation)); - return this.publishGovernanceMessage( - timestamp, - "CircleIntegration", - payload, - 3, - chain, - uptickSequence - ); - } -} diff --git a/evm/ts/test/helpers/utils.ts b/evm/ts/test/helpers/utils.ts deleted file mode 100644 index fbe87fc..0000000 --- a/evm/ts/test/helpers/utils.ts +++ /dev/null @@ -1,100 +0,0 @@ -import {tryNativeToHexString} from "@certusone/wormhole-sdk"; -import {ethSignWithPrivate} from "@certusone/wormhole-sdk/lib/cjs/mock"; -import {ethers} from "ethers"; -import * as fs from "fs"; - -export function getTimeNow() { - return Math.floor(Date.now() / 1000); -} - -export function readCircleIntegrationProxyAddress(chain: number): string { - return JSON.parse( - fs.readFileSync( - `${__dirname}/../../../broadcast-test/deploy_contracts.sol/${chain}/run-latest.json`, - "utf-8" - ) - ).transactions[2].contractAddress; -} - -export function readMockIntegrationAddress(chain: number): string { - return JSON.parse( - fs.readFileSync( - `${__dirname}/../../../broadcast-test/deploy_mock_contracts.sol/${chain}/run-latest.json`, - "utf-8" - ) - ).transactions[0].contractAddress; -} - -export function findWormholeMessageInLogs( - logs: ethers.providers.Log[], - wormholeAddress: string, - emitterChain: number -) { - for (const log of logs) { - if (log.address == wormholeAddress) { - const iface = new ethers.utils.Interface([ - "event LogMessagePublished(address indexed sender, uint64 sequence, uint32 nonce, bytes payload, uint8 consistencyLevel)", - ]); - - const result = iface.parseLog(log).args; - const payload = ethers.utils.arrayify(result.payload); - - const message = Buffer.alloc(51 + payload.length); - - message.writeUInt32BE(getTimeNow(), 0); - message.writeUInt32BE(Number(result.nonce), 4); - message.writeUInt16BE(emitterChain, 8); - message.write( - tryNativeToHexString(result.sender.toString(), "ethereum"), - 10, - "hex" - ); - message.writeBigUInt64BE(BigInt(result.sequence.toString()), 42); - message.writeUInt8(Number(result.consistencyLevel), 50); - message.write(Buffer.from(payload).toString("hex"), 51, "hex"); - - return message; - } - } - - return null; -} - -export function findRedeemEventInLogs( - logs: ethers.providers.Log[], - circleIntegrationAddress: string -): ethers.utils.Result { - let result: ethers.utils.Result = {} as ethers.utils.Result; - for (const log of logs) { - if (log.address == circleIntegrationAddress) { - const iface = new ethers.utils.Interface([ - "event Redeemed(uint16 indexed emitterChainId, bytes32 indexed emitterAddress, uint64 indexed sequence)", - ]); - - result = iface.parseLog(log).args; - break; - } - } - return result; -} - -export class MockCircleAttester { - privateKey: string; - - constructor(privateKey: string) { - this.privateKey = privateKey; - } - - attestMessage(message: Uint8Array): Uint8Array { - const signature = ethSignWithPrivate( - this.privateKey, - Buffer.from(ethers.utils.arrayify(ethers.utils.keccak256(message))) - ); - const out = Buffer.alloc(65); - - out.write(signature.r.toString(16).padStart(64, "0"), 0, "hex"); - out.write(signature.s.toString(16).padStart(64, "0"), 32, "hex"); - out.writeUInt8(signature.recoveryParam! + 27, 64); - return Uint8Array.from(out); - } -} diff --git a/evm/yarn.lock b/evm/yarn.lock deleted file mode 100644 index 7da93cf..0000000 --- a/evm/yarn.lock +++ /dev/null @@ -1,4427 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@apollo/client@^3.5.8": - version "3.7.0" - resolved "https://registry.npmjs.org/@apollo/client/-/client-3.7.0.tgz" - integrity sha512-hp4OvrH1ZIQACRYcIrh/C0WFnY7IM7G6nlTpC8DSTEWxfZQ2kvpvDY0I/hYmCs0oAVrg26g3ANEdOzGWTcYbPg== - dependencies: - "@graphql-typed-document-node/core" "^3.1.1" - "@wry/context" "^0.7.0" - "@wry/equality" "^0.5.0" - "@wry/trie" "^0.3.0" - graphql-tag "^2.12.6" - hoist-non-react-statics "^3.3.2" - optimism "^0.16.1" - prop-types "^15.7.2" - response-iterator "^0.2.6" - symbol-observable "^4.0.0" - ts-invariant "^0.10.3" - tslib "^2.3.0" - zen-observable-ts "^1.2.5" - -"@babel/runtime@7.17.9": - version "7.17.9" - resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.17.9.tgz" - integrity sha512-lSiBBvodq29uShpWGNbgFdKYNiFDo5/HIYsaCEY9ff4sb10x9jizo2+pRrSyF4jKZCXqgzuqBOQKbUm90gQwJg== - dependencies: - regenerator-runtime "^0.13.4" - -"@babel/runtime@^7.12.5", "@babel/runtime@^7.17.2": - version "7.19.4" - resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.19.4.tgz" - integrity sha512-EXpLCrk55f+cYqmHsSR+yD/0gAIMxxA9QK9lnQWzhMCvt+YmoBN7Zx94s++Kv0+unHk39vxNO8t+CMA2WSS3wA== - dependencies: - regenerator-runtime "^0.13.4" - -"@certusone/wormhole-sdk-proto-web@^0.0.5": - version "0.0.5" - resolved "https://registry.npmjs.org/@certusone/wormhole-sdk-proto-web/-/wormhole-sdk-proto-web-0.0.5.tgz" - integrity sha512-shZo7FG2Idu2RCTBU4f4KXQpzmSgb4ymtstTQrCDmIG0NPhGfraDMjESqMHtPd+aCcLrEnq/k2JBIeUKb0ThvQ== - dependencies: - "@improbable-eng/grpc-web" "^0.15.0" - protobufjs "^7.0.0" - rxjs "^7.5.6" - -"@certusone/wormhole-sdk-wasm@^0.0.1": - version "0.0.1" - resolved "https://registry.npmjs.org/@certusone/wormhole-sdk-wasm/-/wormhole-sdk-wasm-0.0.1.tgz" - integrity sha512-LdIwLhOyr4pPs2jqYubqC7d4UkqYBX0EG/ppspQlW3qlVE0LZRMrH6oVzzLMyHtV0Rw7O9sIKzORW/T3mrJv2w== - dependencies: - "@types/long" "^4.0.2" - "@types/node" "^18.0.3" - -"@certusone/wormhole-sdk@^0.9.0": - version "0.9.0" - resolved "https://registry.yarnpkg.com/@certusone/wormhole-sdk/-/wormhole-sdk-0.9.0.tgz#88b5b8bd40517765d01a9d2522345d59608a7bd2" - integrity sha512-RmMGQPvrySaJP6bjwW2m1NQ1b3QLhafvW33ZgkGRQlMNjw1Ph+CgZbE7y7xkctASLxFDYKCjpJhJWVOj/igGiw== - dependencies: - "@certusone/wormhole-sdk-proto-web" "^0.0.5" - "@certusone/wormhole-sdk-wasm" "^0.0.1" - "@injectivelabs/sdk-ts" "^1.0.75" - "@project-serum/anchor" "^0.25.0" - "@solana/spl-token" "^0.3.5" - "@solana/web3.js" "^1.66.2" - "@terra-money/terra.js" "^3.1.3" - "@xpla/xpla.js" "^0.2.1" - algosdk "^1.15.0" - aptos "^1.3.16" - axios "^0.24.0" - bech32 "^2.0.0" - binary-parser "^2.2.1" - elliptic "^6.5.4" - js-base64 "^3.6.1" - near-api-js "^1.0.0" - -"@cosmjs/amino@^0.29.0", "@cosmjs/amino@^0.29.2": - version "0.29.2" - resolved "https://registry.npmjs.org/@cosmjs/amino/-/amino-0.29.2.tgz" - integrity sha512-59Ta3liptOPPFNclziqaScm8Uvs5iwUkEU/Nl6SRMrmRU7lOdOYbNqsBgp27Ozc5jL2d8+ML4AyrJ1S5x8jgAw== - dependencies: - "@cosmjs/crypto" "^0.29.2" - "@cosmjs/encoding" "^0.29.2" - "@cosmjs/math" "^0.29.2" - "@cosmjs/utils" "^0.29.2" - -"@cosmjs/crypto@^0.29.2": - version "0.29.2" - resolved "https://registry.npmjs.org/@cosmjs/crypto/-/crypto-0.29.2.tgz" - integrity sha512-mm4BNiuLAvfJOPYilP8uCs4MKJIogri2A5jb0xn+ZiyFTdIw6xp5eLU7SLxI/V+F2VMPfQDNfS+syPEkDN7g/w== - dependencies: - "@cosmjs/encoding" "^0.29.2" - "@cosmjs/math" "^0.29.2" - "@cosmjs/utils" "^0.29.2" - "@noble/hashes" "^1" - bn.js "^5.2.0" - elliptic "^6.5.3" - libsodium-wrappers "^0.7.6" - -"@cosmjs/encoding@^0.29.2": - version "0.29.2" - resolved "https://registry.npmjs.org/@cosmjs/encoding/-/encoding-0.29.2.tgz" - integrity sha512-v62YsTVvDOSbSAHpD2u5oe0yk/ljitkgi+CM/hpL1qytaVKIlr1RSwBDhJ5cW11oqkIjMWM8UNsGeIG8lyt9JA== - dependencies: - base64-js "^1.3.0" - bech32 "^1.1.4" - readonly-date "^1.0.0" - -"@cosmjs/json-rpc@^0.29.2": - version "0.29.2" - resolved "https://registry.npmjs.org/@cosmjs/json-rpc/-/json-rpc-0.29.2.tgz" - integrity sha512-oJA12dZflR/VU8zqiu+6gTt1SbKAhJSr/D5qAbIPdUcRzfI44J5h6tOvxnAuzJIig4oAid4u92KeuibAKFRJeA== - dependencies: - "@cosmjs/stream" "^0.29.2" - xstream "^11.14.0" - -"@cosmjs/math@^0.29.2": - version "0.29.2" - resolved "https://registry.npmjs.org/@cosmjs/math/-/math-0.29.2.tgz" - integrity sha512-WhgvinqNauEG0GNF7OMNU/cWqBZQ537Zy5d6FAO1+5lOpLhxxBPshEJIO4l2VPU702/JcC5qa49AxyiV3JuGmA== - dependencies: - bn.js "^5.2.0" - -"@cosmjs/proto-signing@^0.29.0": - version "0.29.2" - resolved "https://registry.npmjs.org/@cosmjs/proto-signing/-/proto-signing-0.29.2.tgz" - integrity sha512-+YU1u/SVbvBTiWXkUPca/HNKChSOHuVMrWbhNOzEJgJphYVYwCXabpSFguCymJ1lOFwa0WXIykVqsIzQdEgMQw== - dependencies: - "@cosmjs/amino" "^0.29.2" - "@cosmjs/crypto" "^0.29.2" - "@cosmjs/encoding" "^0.29.2" - "@cosmjs/math" "^0.29.2" - "@cosmjs/utils" "^0.29.2" - cosmjs-types "^0.5.2" - long "^4.0.0" - -"@cosmjs/socket@^0.29.2": - version "0.29.2" - resolved "https://registry.npmjs.org/@cosmjs/socket/-/socket-0.29.2.tgz" - integrity sha512-SllIOXmn5x3wWfcknv5gmd25kNS2aJmiHEjOM1D+ZUACXzLZBqKTNolg5+8e0yVfR+4yxsJS9w5ocINrY6j0rA== - dependencies: - "@cosmjs/stream" "^0.29.2" - isomorphic-ws "^4.0.1" - ws "^7" - xstream "^11.14.0" - -"@cosmjs/stream@^0.29.2": - version "0.29.2" - resolved "https://registry.npmjs.org/@cosmjs/stream/-/stream-0.29.2.tgz" - integrity sha512-ov0N6paYO1VVBl9gOu+i7RJyMR7wAWkN+xcxLN123+UHzRgTPWggJ18RqUCZ2Z87hKWHCkzD8pagi8Rf4uY7cg== - dependencies: - xstream "^11.14.0" - -"@cosmjs/tendermint-rpc@^0.29.0": - version "0.29.2" - resolved "https://registry.npmjs.org/@cosmjs/tendermint-rpc/-/tendermint-rpc-0.29.2.tgz" - integrity sha512-l3SFzBhJwN5+7gg7elknSFhw1e+YN7QjVTanMZJ0hPH5njeIxaUkabk2y3fqWMBxoUkuCsmxJEIeCSByX/6R8A== - dependencies: - "@cosmjs/crypto" "^0.29.2" - "@cosmjs/encoding" "^0.29.2" - "@cosmjs/json-rpc" "^0.29.2" - "@cosmjs/math" "^0.29.2" - "@cosmjs/socket" "^0.29.2" - "@cosmjs/stream" "^0.29.2" - "@cosmjs/utils" "^0.29.2" - axios "^0.21.2" - readonly-date "^1.0.0" - xstream "^11.14.0" - -"@cosmjs/utils@^0.29.2": - version "0.29.2" - resolved "https://registry.npmjs.org/@cosmjs/utils/-/utils-0.29.2.tgz" - integrity sha512-gckp8mbNXF8XCAEwCzH90fpaA0K2O9CC5Rg5v75zsRySYkAaoJIm9f+f8yW2qn6ADge2BnmIT1IkAfmswThCJQ== - -"@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/common@^2.6.3": - version "2.6.5" - resolved "https://registry.npmjs.org/@ethereumjs/common/-/common-2.6.5.tgz" - integrity sha512-lRyVQOeCDaIVtgfbowla32pzeDv2Obr8oR8Put5RdUBNRGr1VGPGQNGP6elWIpgK3YdpzqTOh4GyUGOureVeeA== - dependencies: - crc-32 "^1.2.0" - ethereumjs-util "^7.1.5" - -"@ethereumjs/tx@3.5.1": - version "3.5.1" - resolved "https://registry.npmjs.org/@ethereumjs/tx/-/tx-3.5.1.tgz" - integrity sha512-xzDrTiu4sqZXUcaBxJ4n4W5FrppwxLxZB4ZDGVLtxSQR4lVuOnFR6RcUHdg1mpUhAPVrmnzLJpxaeXnPxIyhWA== - dependencies: - "@ethereumjs/common" "^2.6.3" - ethereumjs-util "^7.1.4" - -"@ethersproject/abi@5.6.1", "@ethersproject/abi@^5.6.0": - version "5.6.1" - resolved "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.6.1.tgz" - integrity sha512-0cqssYh6FXjlwKWBmLm3+zH2BNARoS5u/hxbz+LpQmcDB3w0W553h2btWui1/uZp2GBM/SI3KniTuMcYyHpA5w== - dependencies: - "@ethersproject/address" "^5.6.0" - "@ethersproject/bignumber" "^5.6.0" - "@ethersproject/bytes" "^5.6.0" - "@ethersproject/constants" "^5.6.0" - "@ethersproject/hash" "^5.6.0" - "@ethersproject/keccak256" "^5.6.0" - "@ethersproject/logger" "^5.6.0" - "@ethersproject/properties" "^5.6.0" - "@ethersproject/strings" "^5.6.0" - -"@ethersproject/abi@5.7.0", "@ethersproject/abi@^5.7.0": - version "5.7.0" - resolved "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.7.0.tgz" - 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.6.0", "@ethersproject/abstract-provider@^5.6.0": - version "5.6.0" - resolved "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.6.0.tgz" - integrity sha512-oPMFlKLN+g+y7a79cLK3WiLcjWFnZQtXWgnLAbHZcN3s7L4v90UHpTOrLk+m3yr0gt+/h9STTM6zrr7PM8uoRw== - dependencies: - "@ethersproject/bignumber" "^5.6.0" - "@ethersproject/bytes" "^5.6.0" - "@ethersproject/logger" "^5.6.0" - "@ethersproject/networks" "^5.6.0" - "@ethersproject/properties" "^5.6.0" - "@ethersproject/transactions" "^5.6.0" - "@ethersproject/web" "^5.6.0" - -"@ethersproject/abstract-provider@5.7.0", "@ethersproject/abstract-provider@^5.7.0": - version "5.7.0" - resolved "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz" - 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.6.0", "@ethersproject/abstract-signer@^5.6.0": - version "5.6.0" - resolved "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.6.0.tgz" - integrity sha512-WOqnG0NJKtI8n0wWZPReHtaLkDByPL67tn4nBaDAhmVq8sjHTPbCdz4DRhVu/cfTOvfy9w3iq5QZ7BX7zw56BQ== - dependencies: - "@ethersproject/abstract-provider" "^5.6.0" - "@ethersproject/bignumber" "^5.6.0" - "@ethersproject/bytes" "^5.6.0" - "@ethersproject/logger" "^5.6.0" - "@ethersproject/properties" "^5.6.0" - -"@ethersproject/abstract-signer@5.7.0", "@ethersproject/abstract-signer@^5.7.0": - version "5.7.0" - resolved "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.7.0.tgz" - 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.0", "@ethersproject/address@^5.6.0": - version "5.6.0" - resolved "https://registry.npmjs.org/@ethersproject/address/-/address-5.6.0.tgz" - integrity sha512-6nvhYXjbXsHPS+30sHZ+U4VMagFC/9zAk6Gd/h3S21YW4+yfb0WfRtaAIZ4kfM4rrVwqiy284LP0GtL5HXGLxQ== - dependencies: - "@ethersproject/bignumber" "^5.6.0" - "@ethersproject/bytes" "^5.6.0" - "@ethersproject/keccak256" "^5.6.0" - "@ethersproject/logger" "^5.6.0" - "@ethersproject/rlp" "^5.6.0" - -"@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.6.0", "@ethersproject/base64@^5.6.0": - version "5.6.0" - resolved "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.6.0.tgz" - integrity sha512-2Neq8wxJ9xHxCF9TUgmKeSh9BXJ6OAxWfeGWvbauPh8FuHEjamgHilllx8KkSd5ErxyHIX7Xv3Fkcud2kY9ezw== - dependencies: - "@ethersproject/bytes" "^5.6.0" - -"@ethersproject/base64@5.7.0", "@ethersproject/base64@^5.7.0": - version "5.7.0" - resolved "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.7.0.tgz" - integrity sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ== - dependencies: - "@ethersproject/bytes" "^5.7.0" - -"@ethersproject/basex@5.6.0", "@ethersproject/basex@^5.6.0": - version "5.6.0" - resolved "https://registry.npmjs.org/@ethersproject/basex/-/basex-5.6.0.tgz" - integrity sha512-qN4T+hQd/Md32MoJpc69rOwLYRUXwjTlhHDIeUkUmiN/JyWkkLLMoG0TqvSQKNqZOMgN5stbUYN6ILC+eD7MEQ== - dependencies: - "@ethersproject/bytes" "^5.6.0" - "@ethersproject/properties" "^5.6.0" - -"@ethersproject/basex@5.7.0", "@ethersproject/basex@^5.7.0": - version "5.7.0" - resolved "https://registry.npmjs.org/@ethersproject/basex/-/basex-5.7.0.tgz" - integrity sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw== - dependencies: - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/properties" "^5.7.0" - -"@ethersproject/bignumber@5.6.0", "@ethersproject/bignumber@^5.6.0": - version "5.6.0" - resolved "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.6.0.tgz" - integrity sha512-VziMaXIUHQlHJmkv1dlcd6GY2PmT0khtAqaMctCIDogxkrarMzA9L94KN1NeXqqOfFD6r0sJT3vCTOFSmZ07DA== - dependencies: - "@ethersproject/bytes" "^5.6.0" - "@ethersproject/logger" "^5.6.0" - bn.js "^4.11.9" - -"@ethersproject/bignumber@5.7.0", "@ethersproject/bignumber@^5.7.0": - version "5.7.0" - resolved "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.7.0.tgz" - 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.6.1", "@ethersproject/bytes@^5.6.0": - version "5.6.1" - resolved "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.6.1.tgz" - integrity sha512-NwQt7cKn5+ZE4uDn+X5RAXLp46E1chXoaMmrxAyA0rblpxz8t58lVkrHXoRIn0lz1joQElQ8410GqhTqMOwc6g== - dependencies: - "@ethersproject/logger" "^5.6.0" - -"@ethersproject/bytes@5.7.0", "@ethersproject/bytes@^5.6.1", "@ethersproject/bytes@^5.7.0": - version "5.7.0" - resolved "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.7.0.tgz" - integrity sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A== - dependencies: - "@ethersproject/logger" "^5.7.0" - -"@ethersproject/constants@5.6.0", "@ethersproject/constants@^5.6.0": - version "5.6.0" - resolved "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.6.0.tgz" - integrity sha512-SrdaJx2bK0WQl23nSpV/b1aq293Lh0sUaZT/yYKPDKn4tlAbkH96SPJwIhwSwTsoQQZxuh1jnqsKwyymoiBdWA== - dependencies: - "@ethersproject/bignumber" "^5.6.0" - -"@ethersproject/constants@5.7.0", "@ethersproject/constants@^5.7.0": - version "5.7.0" - resolved "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.7.0.tgz" - integrity sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA== - dependencies: - "@ethersproject/bignumber" "^5.7.0" - -"@ethersproject/contracts@5.6.0": - version "5.6.0" - resolved "https://registry.npmjs.org/@ethersproject/contracts/-/contracts-5.6.0.tgz" - integrity sha512-74Ge7iqTDom0NX+mux8KbRUeJgu1eHZ3iv6utv++sLJG80FVuU9HnHeKVPfjd9s3woFhaFoQGf3B3iH/FrQmgw== - dependencies: - "@ethersproject/abi" "^5.6.0" - "@ethersproject/abstract-provider" "^5.6.0" - "@ethersproject/abstract-signer" "^5.6.0" - "@ethersproject/address" "^5.6.0" - "@ethersproject/bignumber" "^5.6.0" - "@ethersproject/bytes" "^5.6.0" - "@ethersproject/constants" "^5.6.0" - "@ethersproject/logger" "^5.6.0" - "@ethersproject/properties" "^5.6.0" - "@ethersproject/transactions" "^5.6.0" - -"@ethersproject/contracts@5.7.0": - version "5.7.0" - resolved "https://registry.npmjs.org/@ethersproject/contracts/-/contracts-5.7.0.tgz" - 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.6.0", "@ethersproject/hash@^5.6.0": - version "5.6.0" - resolved "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.6.0.tgz" - integrity sha512-fFd+k9gtczqlr0/BruWLAu7UAOas1uRRJvOR84uDf4lNZ+bTkGl366qvniUZHKtlqxBRU65MkOobkmvmpHU+jA== - dependencies: - "@ethersproject/abstract-signer" "^5.6.0" - "@ethersproject/address" "^5.6.0" - "@ethersproject/bignumber" "^5.6.0" - "@ethersproject/bytes" "^5.6.0" - "@ethersproject/keccak256" "^5.6.0" - "@ethersproject/logger" "^5.6.0" - "@ethersproject/properties" "^5.6.0" - "@ethersproject/strings" "^5.6.0" - -"@ethersproject/hash@5.7.0", "@ethersproject/hash@^5.7.0": - version "5.7.0" - resolved "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.7.0.tgz" - 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.6.0", "@ethersproject/hdnode@^5.6.0": - version "5.6.0" - resolved "https://registry.npmjs.org/@ethersproject/hdnode/-/hdnode-5.6.0.tgz" - integrity sha512-61g3Jp3nwDqJcL/p4nugSyLrpl/+ChXIOtCEM8UDmWeB3JCAt5FoLdOMXQc3WWkc0oM2C0aAn6GFqqMcS/mHTw== - dependencies: - "@ethersproject/abstract-signer" "^5.6.0" - "@ethersproject/basex" "^5.6.0" - "@ethersproject/bignumber" "^5.6.0" - "@ethersproject/bytes" "^5.6.0" - "@ethersproject/logger" "^5.6.0" - "@ethersproject/pbkdf2" "^5.6.0" - "@ethersproject/properties" "^5.6.0" - "@ethersproject/sha2" "^5.6.0" - "@ethersproject/signing-key" "^5.6.0" - "@ethersproject/strings" "^5.6.0" - "@ethersproject/transactions" "^5.6.0" - "@ethersproject/wordlists" "^5.6.0" - -"@ethersproject/hdnode@5.7.0", "@ethersproject/hdnode@^5.7.0": - version "5.7.0" - resolved "https://registry.npmjs.org/@ethersproject/hdnode/-/hdnode-5.7.0.tgz" - 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.6.0", "@ethersproject/json-wallets@^5.6.0": - version "5.6.0" - resolved "https://registry.npmjs.org/@ethersproject/json-wallets/-/json-wallets-5.6.0.tgz" - integrity sha512-fmh86jViB9r0ibWXTQipxpAGMiuxoqUf78oqJDlCAJXgnJF024hOOX7qVgqsjtbeoxmcLwpPsXNU0WEe/16qPQ== - dependencies: - "@ethersproject/abstract-signer" "^5.6.0" - "@ethersproject/address" "^5.6.0" - "@ethersproject/bytes" "^5.6.0" - "@ethersproject/hdnode" "^5.6.0" - "@ethersproject/keccak256" "^5.6.0" - "@ethersproject/logger" "^5.6.0" - "@ethersproject/pbkdf2" "^5.6.0" - "@ethersproject/properties" "^5.6.0" - "@ethersproject/random" "^5.6.0" - "@ethersproject/strings" "^5.6.0" - "@ethersproject/transactions" "^5.6.0" - aes-js "3.0.0" - scrypt-js "3.0.1" - -"@ethersproject/json-wallets@5.7.0", "@ethersproject/json-wallets@^5.7.0": - version "5.7.0" - resolved "https://registry.npmjs.org/@ethersproject/json-wallets/-/json-wallets-5.7.0.tgz" - 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.6.0", "@ethersproject/keccak256@^5.6.0": - version "5.6.0" - resolved "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.6.0.tgz" - integrity sha512-tk56BJ96mdj/ksi7HWZVWGjCq0WVl/QvfhFQNeL8fxhBlGoP+L80uDCiQcpJPd+2XxkivS3lwRm3E0CXTfol0w== - dependencies: - "@ethersproject/bytes" "^5.6.0" - js-sha3 "0.8.0" - -"@ethersproject/keccak256@5.7.0", "@ethersproject/keccak256@^5.6.1", "@ethersproject/keccak256@^5.7.0": - version "5.7.0" - resolved "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.7.0.tgz" - integrity sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg== - dependencies: - "@ethersproject/bytes" "^5.7.0" - js-sha3 "0.8.0" - -"@ethersproject/logger@5.6.0", "@ethersproject/logger@^5.6.0": - version "5.6.0" - resolved "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.6.0.tgz" - integrity sha512-BiBWllUROH9w+P21RzoxJKzqoqpkyM1pRnEKG69bulE9TSQD8SAIvTQqIMZmmCO8pUNkgLP1wndX1gKghSpBmg== - -"@ethersproject/logger@5.7.0", "@ethersproject/logger@^5.7.0": - version "5.7.0" - resolved "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.7.0.tgz" - integrity sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig== - -"@ethersproject/networks@5.6.2", "@ethersproject/networks@^5.6.0": - version "5.6.2" - resolved "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.6.2.tgz" - integrity sha512-9uEzaJY7j5wpYGTojGp8U89mSsgQLc40PCMJLMCnFXTs7nhBveZ0t7dbqWUNrepWTszDbFkYD6WlL8DKx5huHA== - dependencies: - "@ethersproject/logger" "^5.6.0" - -"@ethersproject/networks@5.7.1", "@ethersproject/networks@^5.7.0": - version "5.7.1" - resolved "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.7.1.tgz" - integrity sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ== - dependencies: - "@ethersproject/logger" "^5.7.0" - -"@ethersproject/pbkdf2@5.6.0", "@ethersproject/pbkdf2@^5.6.0": - version "5.6.0" - resolved "https://registry.npmjs.org/@ethersproject/pbkdf2/-/pbkdf2-5.6.0.tgz" - integrity sha512-Wu1AxTgJo3T3H6MIu/eejLFok9TYoSdgwRr5oGY1LTLfmGesDoSx05pemsbrPT2gG4cQME+baTSCp5sEo2erZQ== - dependencies: - "@ethersproject/bytes" "^5.6.0" - "@ethersproject/sha2" "^5.6.0" - -"@ethersproject/pbkdf2@5.7.0", "@ethersproject/pbkdf2@^5.7.0": - version "5.7.0" - resolved "https://registry.npmjs.org/@ethersproject/pbkdf2/-/pbkdf2-5.7.0.tgz" - integrity sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw== - dependencies: - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/sha2" "^5.7.0" - -"@ethersproject/properties@5.6.0", "@ethersproject/properties@^5.6.0": - version "5.6.0" - resolved "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.6.0.tgz" - integrity sha512-szoOkHskajKePTJSZ46uHUWWkbv7TzP2ypdEK6jGMqJaEt2sb0jCgfBo0gH0m2HBpRixMuJ6TBRaQCF7a9DoCg== - dependencies: - "@ethersproject/logger" "^5.6.0" - -"@ethersproject/properties@5.7.0", "@ethersproject/properties@^5.7.0": - version "5.7.0" - resolved "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.7.0.tgz" - integrity sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw== - dependencies: - "@ethersproject/logger" "^5.7.0" - -"@ethersproject/providers@5.6.4": - version "5.6.4" - resolved "https://registry.npmjs.org/@ethersproject/providers/-/providers-5.6.4.tgz" - integrity sha512-WAdknnaZ52hpHV3qPiJmKx401BLpup47h36Axxgre9zT+doa/4GC/Ne48ICPxTm0BqndpToHjpLP1ZnaxyE+vw== - dependencies: - "@ethersproject/abstract-provider" "^5.6.0" - "@ethersproject/abstract-signer" "^5.6.0" - "@ethersproject/address" "^5.6.0" - "@ethersproject/basex" "^5.6.0" - "@ethersproject/bignumber" "^5.6.0" - "@ethersproject/bytes" "^5.6.0" - "@ethersproject/constants" "^5.6.0" - "@ethersproject/hash" "^5.6.0" - "@ethersproject/logger" "^5.6.0" - "@ethersproject/networks" "^5.6.0" - "@ethersproject/properties" "^5.6.0" - "@ethersproject/random" "^5.6.0" - "@ethersproject/rlp" "^5.6.0" - "@ethersproject/sha2" "^5.6.0" - "@ethersproject/strings" "^5.6.0" - "@ethersproject/transactions" "^5.6.0" - "@ethersproject/web" "^5.6.0" - bech32 "1.1.4" - ws "7.4.6" - -"@ethersproject/providers@5.7.1": - version "5.7.1" - resolved "https://registry.npmjs.org/@ethersproject/providers/-/providers-5.7.1.tgz" - integrity sha512-vZveG/DLyo+wk4Ga1yx6jSEHrLPgmTt+dFv0dv8URpVCRf0jVhalps1jq/emN/oXnMRsC7cQgAF32DcXLL7BPQ== - 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.6.0", "@ethersproject/random@^5.6.0": - version "5.6.0" - resolved "https://registry.npmjs.org/@ethersproject/random/-/random-5.6.0.tgz" - integrity sha512-si0PLcLjq+NG/XHSZz90asNf+YfKEqJGVdxoEkSukzbnBgC8rydbgbUgBbBGLeHN4kAJwUFEKsu3sCXT93YMsw== - dependencies: - "@ethersproject/bytes" "^5.6.0" - "@ethersproject/logger" "^5.6.0" - -"@ethersproject/random@5.7.0", "@ethersproject/random@^5.7.0": - version "5.7.0" - resolved "https://registry.npmjs.org/@ethersproject/random/-/random-5.7.0.tgz" - integrity sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ== - dependencies: - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - -"@ethersproject/rlp@5.6.0", "@ethersproject/rlp@^5.6.0": - version "5.6.0" - resolved "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.6.0.tgz" - integrity sha512-dz9WR1xpcTL+9DtOT/aDO+YyxSSdO8YIS0jyZwHHSlAmnxA6cKU3TrTd4Xc/bHayctxTgGLYNuVVoiXE4tTq1g== - dependencies: - "@ethersproject/bytes" "^5.6.0" - "@ethersproject/logger" "^5.6.0" - -"@ethersproject/rlp@5.7.0", "@ethersproject/rlp@^5.7.0": - version "5.7.0" - resolved "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.7.0.tgz" - integrity sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w== - dependencies: - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - -"@ethersproject/sha2@5.6.0", "@ethersproject/sha2@^5.6.0": - version "5.6.0" - resolved "https://registry.npmjs.org/@ethersproject/sha2/-/sha2-5.6.0.tgz" - integrity sha512-1tNWCPFLu1n3JM9t4/kytz35DkuF9MxqkGGEHNauEbaARdm2fafnOyw1s0tIQDPKF/7bkP1u3dbrmjpn5CelyA== - dependencies: - "@ethersproject/bytes" "^5.6.0" - "@ethersproject/logger" "^5.6.0" - hash.js "1.1.7" - -"@ethersproject/sha2@5.7.0", "@ethersproject/sha2@^5.7.0": - version "5.7.0" - resolved "https://registry.npmjs.org/@ethersproject/sha2/-/sha2-5.7.0.tgz" - 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.6.0", "@ethersproject/signing-key@^5.6.0": - version "5.6.0" - resolved "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.6.0.tgz" - integrity sha512-S+njkhowmLeUu/r7ir8n78OUKx63kBdMCPssePS89So1TH4hZqnWFsThEd/GiXYp9qMxVrydf7KdM9MTGPFukA== - dependencies: - "@ethersproject/bytes" "^5.6.0" - "@ethersproject/logger" "^5.6.0" - "@ethersproject/properties" "^5.6.0" - bn.js "^4.11.9" - elliptic "6.5.4" - hash.js "1.1.7" - -"@ethersproject/signing-key@5.7.0", "@ethersproject/signing-key@^5.6.2", "@ethersproject/signing-key@^5.7.0": - version "5.7.0" - resolved "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.7.0.tgz" - 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.6.0": - version "5.6.0" - resolved "https://registry.npmjs.org/@ethersproject/solidity/-/solidity-5.6.0.tgz" - integrity sha512-YwF52vTNd50kjDzqKaoNNbC/r9kMDPq3YzDWmsjFTRBcIF1y4JCQJ8gB30wsTfHbaxgxelI5BfxQSxD/PbJOww== - dependencies: - "@ethersproject/bignumber" "^5.6.0" - "@ethersproject/bytes" "^5.6.0" - "@ethersproject/keccak256" "^5.6.0" - "@ethersproject/logger" "^5.6.0" - "@ethersproject/sha2" "^5.6.0" - "@ethersproject/strings" "^5.6.0" - -"@ethersproject/solidity@5.7.0": - version "5.7.0" - resolved "https://registry.npmjs.org/@ethersproject/solidity/-/solidity-5.7.0.tgz" - 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.6.0", "@ethersproject/strings@^5.6.0": - version "5.6.0" - resolved "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.6.0.tgz" - integrity sha512-uv10vTtLTZqrJuqBZR862ZQjTIa724wGPWQqZrofaPI/kUsf53TBG0I0D+hQ1qyNtllbNzaW+PDPHHUI6/65Mg== - dependencies: - "@ethersproject/bytes" "^5.6.0" - "@ethersproject/constants" "^5.6.0" - "@ethersproject/logger" "^5.6.0" - -"@ethersproject/strings@5.7.0", "@ethersproject/strings@^5.7.0": - version "5.7.0" - resolved "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.7.0.tgz" - 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.6.0", "@ethersproject/transactions@^5.6.0": - version "5.6.0" - resolved "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.6.0.tgz" - integrity sha512-4HX+VOhNjXHZyGzER6E/LVI2i6lf9ejYeWD6l4g50AdmimyuStKc39kvKf1bXWQMg7QNVh+uC7dYwtaZ02IXeg== - dependencies: - "@ethersproject/address" "^5.6.0" - "@ethersproject/bignumber" "^5.6.0" - "@ethersproject/bytes" "^5.6.0" - "@ethersproject/constants" "^5.6.0" - "@ethersproject/keccak256" "^5.6.0" - "@ethersproject/logger" "^5.6.0" - "@ethersproject/properties" "^5.6.0" - "@ethersproject/rlp" "^5.6.0" - "@ethersproject/signing-key" "^5.6.0" - -"@ethersproject/transactions@5.7.0", "@ethersproject/transactions@^5.7.0": - version "5.7.0" - resolved "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.7.0.tgz" - 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.6.0": - version "5.6.0" - resolved "https://registry.npmjs.org/@ethersproject/units/-/units-5.6.0.tgz" - integrity sha512-tig9x0Qmh8qbo1w8/6tmtyrm/QQRviBh389EQ+d8fP4wDsBrJBf08oZfoiz1/uenKK9M78yAP4PoR7SsVoTjsw== - dependencies: - "@ethersproject/bignumber" "^5.6.0" - "@ethersproject/constants" "^5.6.0" - "@ethersproject/logger" "^5.6.0" - -"@ethersproject/units@5.7.0": - version "5.7.0" - resolved "https://registry.npmjs.org/@ethersproject/units/-/units-5.7.0.tgz" - integrity sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg== - dependencies: - "@ethersproject/bignumber" "^5.7.0" - "@ethersproject/constants" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - -"@ethersproject/wallet@5.6.0": - version "5.6.0" - resolved "https://registry.npmjs.org/@ethersproject/wallet/-/wallet-5.6.0.tgz" - integrity sha512-qMlSdOSTyp0MBeE+r7SUhr1jjDlC1zAXB8VD84hCnpijPQiSNbxr6GdiLXxpUs8UKzkDiNYYC5DRI3MZr+n+tg== - dependencies: - "@ethersproject/abstract-provider" "^5.6.0" - "@ethersproject/abstract-signer" "^5.6.0" - "@ethersproject/address" "^5.6.0" - "@ethersproject/bignumber" "^5.6.0" - "@ethersproject/bytes" "^5.6.0" - "@ethersproject/hash" "^5.6.0" - "@ethersproject/hdnode" "^5.6.0" - "@ethersproject/json-wallets" "^5.6.0" - "@ethersproject/keccak256" "^5.6.0" - "@ethersproject/logger" "^5.6.0" - "@ethersproject/properties" "^5.6.0" - "@ethersproject/random" "^5.6.0" - "@ethersproject/signing-key" "^5.6.0" - "@ethersproject/transactions" "^5.6.0" - "@ethersproject/wordlists" "^5.6.0" - -"@ethersproject/wallet@5.7.0": - version "5.7.0" - resolved "https://registry.npmjs.org/@ethersproject/wallet/-/wallet-5.7.0.tgz" - 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.6.0", "@ethersproject/web@^5.6.0": - version "5.6.0" - resolved "https://registry.npmjs.org/@ethersproject/web/-/web-5.6.0.tgz" - integrity sha512-G/XHj0hV1FxI2teHRfCGvfBUHFmU+YOSbCxlAMqJklxSa7QMiHFQfAxvwY2PFqgvdkxEKwRNr/eCjfAPEm2Ctg== - dependencies: - "@ethersproject/base64" "^5.6.0" - "@ethersproject/bytes" "^5.6.0" - "@ethersproject/logger" "^5.6.0" - "@ethersproject/properties" "^5.6.0" - "@ethersproject/strings" "^5.6.0" - -"@ethersproject/web@5.7.1", "@ethersproject/web@^5.7.0": - version "5.7.1" - resolved "https://registry.npmjs.org/@ethersproject/web/-/web-5.7.1.tgz" - 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.6.0", "@ethersproject/wordlists@^5.6.0": - version "5.6.0" - resolved "https://registry.npmjs.org/@ethersproject/wordlists/-/wordlists-5.6.0.tgz" - integrity sha512-q0bxNBfIX3fUuAo9OmjlEYxP40IB8ABgb7HjEZCL5IKubzV3j30CWi2rqQbjTS2HfoyQbfINoKcTVWP4ejwR7Q== - dependencies: - "@ethersproject/bytes" "^5.6.0" - "@ethersproject/hash" "^5.6.0" - "@ethersproject/logger" "^5.6.0" - "@ethersproject/properties" "^5.6.0" - "@ethersproject/strings" "^5.6.0" - -"@ethersproject/wordlists@5.7.0", "@ethersproject/wordlists@^5.7.0": - version "5.7.0" - resolved "https://registry.npmjs.org/@ethersproject/wordlists/-/wordlists-5.7.0.tgz" - 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" - -"@graphql-typed-document-node/core@^3.1.1": - version "3.1.1" - resolved "https://registry.npmjs.org/@graphql-typed-document-node/core/-/core-3.1.1.tgz" - integrity sha512-NQ17ii0rK1b34VZonlmT2QMJFI70m0TRwbknO/ihlbatXyaktDhN/98vBiUU6kNBPljqGqyIrl2T4nY2RpFANg== - -"@improbable-eng/grpc-web-node-http-transport@^0.15.0": - version "0.15.0" - resolved "https://registry.npmjs.org/@improbable-eng/grpc-web-node-http-transport/-/grpc-web-node-http-transport-0.15.0.tgz" - integrity sha512-HLgJfVolGGpjc9DWPhmMmXJx8YGzkek7jcCFO1YYkSOoO81MWRZentPOd/JiKiZuU08wtc4BG+WNuGzsQB5jZA== - -"@improbable-eng/grpc-web-react-native-transport@^0.15.0": - version "0.15.0" - resolved "https://registry.npmjs.org/@improbable-eng/grpc-web-react-native-transport/-/grpc-web-react-native-transport-0.15.0.tgz" - integrity sha512-Xk+abATz3eacJ0gA5sRYpyMCA+z/37ht4u6AsbtfcE3SXLYIPbTQ2iLQYyELAoyUWgAyEQxZ3iTs6OpR4z06FQ== - -"@improbable-eng/grpc-web@^0.13.0": - version "0.13.0" - resolved "https://registry.npmjs.org/@improbable-eng/grpc-web/-/grpc-web-0.13.0.tgz" - integrity sha512-vaxxT+Qwb7GPqDQrBV4vAAfH0HywgOLw6xGIKXd9Q8hcV63CQhmS3p4+pZ9/wVvt4Ph3ZDK9fdC983b9aGMUFg== - dependencies: - browser-headers "^0.4.0" - -"@improbable-eng/grpc-web@^0.14.0", "@improbable-eng/grpc-web@^0.14.1": - version "0.14.1" - resolved "https://registry.npmjs.org/@improbable-eng/grpc-web/-/grpc-web-0.14.1.tgz" - integrity sha512-XaIYuunepPxoiGVLLHmlnVminUGzBTnXr8Wv7khzmLWbNw4TCwJKX09GSMJlKhu/TRk6gms0ySFxewaETSBqgw== - dependencies: - browser-headers "^0.4.1" - -"@improbable-eng/grpc-web@^0.15.0": - version "0.15.0" - resolved "https://registry.npmjs.org/@improbable-eng/grpc-web/-/grpc-web-0.15.0.tgz" - integrity sha512-ERft9/0/8CmYalqOVnJnpdDry28q+j+nAlFFARdjyxXDJ+Mhgv9+F600QC8BR9ygOfrXRlAk6CvST2j+JCpQPg== - dependencies: - browser-headers "^0.4.1" - -"@injectivelabs/chain-api@^1.8.0-rc8": - version "1.8.0-rc8" - resolved "https://registry.npmjs.org/@injectivelabs/chain-api/-/chain-api-1.8.0-rc8.tgz" - integrity sha512-91jXK/6kZDeajbj4hFK+AiU8jrWoQDFqm5E1oGUA11s9CnFbz/G6RwuLWV+ZgOuOg3c/mTRVZ19XZjgsT+BWhw== - dependencies: - "@improbable-eng/grpc-web" "^0.13.0" - google-protobuf "^3.13.0" - -"@injectivelabs/exceptions@^1.0.23": - version "1.0.23" - resolved "https://registry.npmjs.org/@injectivelabs/exceptions/-/exceptions-1.0.23.tgz" - integrity sha512-W+AOZOLsB4GETOhVkIBDid02ApxQghY1qo0hUpZwMWoiVD57emETdNPqR6WFYYkGaDhWTliiIyUkhBUqsuxUzA== - dependencies: - "@improbable-eng/grpc-web" "^0.15.0" - "@injectivelabs/ts-types" "^1.0.13" - http-status-codes "^2.2.0" - link-module-alias "^1.2.0" - shx "^0.3.2" - -"@injectivelabs/exchange-api@^2.2.77": - version "2.2.77" - resolved "https://registry.npmjs.org/@injectivelabs/exchange-api/-/exchange-api-2.2.77.tgz" - integrity sha512-/48dzUEMDIfuncl//vi+bSXhhiAk7pRPC21Ar/OqHDo46eXfm2bcVxUOI6f524lEbgeNxAlsUxtl3R/VpTXTvQ== - dependencies: - "@improbable-eng/grpc-web" "^0.14.0" - google-protobuf "^3.14.0" - -"@injectivelabs/indexer-api@^1.0.21": - version "1.0.21" - resolved "https://registry.npmjs.org/@injectivelabs/indexer-api/-/indexer-api-1.0.21.tgz" - integrity sha512-AwDTe+o2tVM8cmKCez/8rQKrR2AUjpD82jQ5IwMmLP4wvhnFJ1fRYWY+I+QgAwdULgN3bQs3jjYZg55iqS3GkQ== - dependencies: - "@improbable-eng/grpc-web" "^0.14.0" - google-protobuf "^3.14.0" - -"@injectivelabs/networks@^1.0.32": - version "1.0.32" - resolved "https://registry.npmjs.org/@injectivelabs/networks/-/networks-1.0.32.tgz" - integrity sha512-xzTcrElwmmB7Lta5SgdSgbHZSKWgNtpFJ8sst3WsStJpu6Tz26GKzGH+PDWX8Py+1NJxVuo4RPTPpltv2Ft6Jg== - dependencies: - "@injectivelabs/exceptions" "^1.0.23" - "@injectivelabs/utils" "^1.0.29" - link-module-alias "^1.2.0" - shx "^0.3.2" - -"@injectivelabs/sdk-ts@^1.0.75": - version "1.0.173" - resolved "https://registry.npmjs.org/@injectivelabs/sdk-ts/-/sdk-ts-1.0.173.tgz" - integrity sha512-ibxWOgx/o2aObnXbC8BUeFtCyJ6hrb735VBUe4LYXj7jYgMX8RzpPG/gPxnpuqFmo2ooZt/iPKgWOoVQY6Hglw== - dependencies: - "@apollo/client" "^3.5.8" - "@cosmjs/amino" "^0.29.0" - "@cosmjs/proto-signing" "^0.29.0" - "@cosmjs/tendermint-rpc" "^0.29.0" - "@ethersproject/bytes" "^5.7.0" - "@improbable-eng/grpc-web" "^0.15.0" - "@improbable-eng/grpc-web-node-http-transport" "^0.15.0" - "@improbable-eng/grpc-web-react-native-transport" "^0.15.0" - "@injectivelabs/chain-api" "^1.8.0-rc8" - "@injectivelabs/exceptions" "^1.0.23" - "@injectivelabs/exchange-api" "^2.2.77" - "@injectivelabs/indexer-api" "^1.0.21" - "@injectivelabs/networks" "^1.0.32" - "@injectivelabs/token-metadata" "^1.0.46" - "@injectivelabs/ts-types" "^1.0.13" - "@injectivelabs/utils" "^1.0.29" - "@metamask/eth-sig-util" "^4.0.1" - "@types/google-protobuf" "^3.15.5" - axios "^0.27.2" - bech32 "^2.0.0" - bip39 "^3.0.4" - eth-crypto "^2.3.0" - ethereumjs-abi "^0.6.8" - ethereumjs-util "^7.1.4" - ethers "^5.6.4" - ethjs-util "^0.1.6" - google-protobuf "^3.21.0" - graphql "^16.3.0" - http-status-codes "^2.2.0" - jscrypto "^1.0.3" - keccak256 "^1.0.6" - link-module-alias "^1.2.0" - secp256k1 "^4.0.3" - shx "^0.3.2" - snakecase-keys "^5.4.1" - -"@injectivelabs/token-metadata@^1.0.46": - version "1.0.46" - resolved "https://registry.npmjs.org/@injectivelabs/token-metadata/-/token-metadata-1.0.46.tgz" - integrity sha512-FlyUFxPnIPW5sOhrL8zUA2+Pz4+vaCIXwo13JMtxU5oH8xyhijO4XVJwJzzlO5IU6WL85o8JG5rZqMkTFPrdxw== - dependencies: - "@injectivelabs/networks" "^1.0.32" - "@injectivelabs/ts-types" "^1.0.13" - "@types/lodash.values" "^4.3.6" - copyfiles "^2.4.1" - jsonschema "^1.4.0" - link-module-alias "^1.2.0" - lodash "^4.17.21" - lodash.values "^4.3.0" - shx "^0.3.2" - -"@injectivelabs/ts-types@^1.0.13": - version "1.0.13" - resolved "https://registry.npmjs.org/@injectivelabs/ts-types/-/ts-types-1.0.13.tgz" - integrity sha512-qBJchLmXHvefuA7Yh6iyHbfPFDP9ldCAWfgHMW095BI+iycNxHRQSpf1VctkARv/pqhLlsEvDDlHA8MnfQ51kQ== - dependencies: - link-module-alias "^1.2.0" - shx "^0.3.2" - -"@injectivelabs/utils@^1.0.29": - version "1.0.29" - resolved "https://registry.npmjs.org/@injectivelabs/utils/-/utils-1.0.29.tgz" - integrity sha512-5TuRPNRp/jnZXy50P7UToPSTCtSicE0g8nIMdx1Jj0RNPMOc8JG5JV+SSY/tqssFljjrPkzHXBD9kVgW0viO8g== - dependencies: - "@injectivelabs/exceptions" "^1.0.23" - "@injectivelabs/ts-types" "^1.0.13" - axios "^0.21.1" - bignumber.js "^9.0.1" - link-module-alias "^1.2.0" - shx "^0.3.2" - snakecase-keys "^5.1.2" - store2 "^2.12.0" - -"@jridgewell/resolve-uri@^3.0.3": - version "3.1.0" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" - integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== - -"@jridgewell/sourcemap-codec@^1.4.10": - version "1.4.14" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" - integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== - -"@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" - -"@metamask/eth-sig-util@^4.0.1": - version "4.0.1" - resolved "https://registry.npmjs.org/@metamask/eth-sig-util/-/eth-sig-util-4.0.1.tgz" - 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/ed25519@^1.7.0": - version "1.7.1" - resolved "https://registry.npmjs.org/@noble/ed25519/-/ed25519-1.7.1.tgz" - integrity sha512-Rk4SkJFaXZiznFyC/t77Q0NKS4FL7TLJJsVG2V2oiEq3kJVeTdxysEe/yRWSpnWMe808XRDJ+VFh5pt/FN5plw== - -"@noble/hashes@1.1.3", "@noble/hashes@^1", "@noble/hashes@^1.1.2", "@noble/hashes@~1.1.1": - version "1.1.3" - resolved "https://registry.npmjs.org/@noble/hashes/-/hashes-1.1.3.tgz" - integrity sha512-CE0FCR57H2acVI5UOzIGSSIYxZ6v/HOhDR0Ro9VLyhnzLwx0o8W1mmgaqlEUx4049qJDlIBRztv5k+MM8vbO3A== - -"@noble/secp256k1@^1.6.3": - version "1.7.0" - resolved "https://registry.npmjs.org/@noble/secp256k1/-/secp256k1-1.7.0.tgz" - integrity sha512-kbacwGSsH/CTout0ZnZWxnW1B+jH/7r/WAAKLBtrRJ/+CUH7lgmQzl3GTrQua3SGKWNSDsS6lmjnDpIJ5Dxyaw== - -"@openzeppelin/contracts@^4.7.3": - version "4.7.3" - resolved "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-4.7.3.tgz" - integrity sha512-dGRS0agJzu8ybo44pCIf3xBaPQN/65AIXNgK8+4gzKd5kbvlqyxryUYVLJv7fK98Seyd2hDZzVEHSWAh0Bt1Yw== - -"@project-serum/anchor@^0.25.0": - version "0.25.0" - resolved "https://registry.yarnpkg.com/@project-serum/anchor/-/anchor-0.25.0.tgz#88ee4843336005cf5a64c80636ce626f0996f503" - integrity sha512-E6A5Y/ijqpfMJ5psJvbw0kVTzLZFUcOFgs6eSM2M2iWE1lVRF18T6hWZVNl6zqZsoz98jgnNHtVGJMs+ds9A7A== - dependencies: - "@project-serum/borsh" "^0.2.5" - "@solana/web3.js" "^1.36.0" - base64-js "^1.5.1" - bn.js "^5.1.2" - bs58 "^4.0.1" - buffer-layout "^1.2.2" - camelcase "^5.3.1" - cross-fetch "^3.1.5" - crypto-hash "^1.3.0" - eventemitter3 "^4.0.7" - js-sha256 "^0.9.0" - pako "^2.0.3" - snake-case "^3.0.4" - superstruct "^0.15.4" - toml "^3.0.0" - -"@project-serum/borsh@^0.2.5": - version "0.2.5" - resolved "https://registry.yarnpkg.com/@project-serum/borsh/-/borsh-0.2.5.tgz#6059287aa624ecebbfc0edd35e4c28ff987d8663" - integrity sha512-UmeUkUoKdQ7rhx6Leve1SssMR/Ghv8qrEiyywyxSWg7ooV7StdpPBhciiy5eB3T0qU1BXvdRNC8TdrkxK7WC5Q== - dependencies: - bn.js "^5.1.2" - buffer-layout "^1.2.0" - -"@protobufjs/aspromise@^1.1.1", "@protobufjs/aspromise@^1.1.2": - version "1.1.2" - resolved "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz" - integrity sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ== - -"@protobufjs/base64@^1.1.2": - version "1.1.2" - resolved "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz" - integrity sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg== - -"@protobufjs/codegen@^2.0.4": - version "2.0.4" - resolved "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz" - integrity sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg== - -"@protobufjs/eventemitter@^1.1.0": - version "1.1.0" - resolved "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz" - integrity sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q== - -"@protobufjs/fetch@^1.1.0": - version "1.1.0" - resolved "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz" - integrity sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ== - dependencies: - "@protobufjs/aspromise" "^1.1.1" - "@protobufjs/inquire" "^1.1.0" - -"@protobufjs/float@^1.0.2": - version "1.0.2" - resolved "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz" - integrity sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ== - -"@protobufjs/inquire@^1.1.0": - version "1.1.0" - resolved "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz" - integrity sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q== - -"@protobufjs/path@^1.1.2": - version "1.1.2" - resolved "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz" - integrity sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA== - -"@protobufjs/pool@^1.1.0": - version "1.1.0" - resolved "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz" - integrity sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw== - -"@protobufjs/utf8@^1.1.0": - version "1.1.0" - resolved "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz" - integrity sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw== - -"@scure/base@~1.1.0": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@scure/base/-/base-1.1.1.tgz#ebb651ee52ff84f420097055f4bf46cfba403938" - integrity sha512-ZxOhsSyxYwLJj3pLZCefNitxsj093tb2vq90mp2txoYeBqbcjDjqFhyM8eUjq/uFm6zJ+mUuqxlS2FkuSY1MTA== - -"@scure/bip39@1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@scure/bip39/-/bip39-1.1.0.tgz#92f11d095bae025f166bef3defcc5bf4945d419a" - integrity sha512-pwrPOS16VeTKg98dYXQyIjJEcWfz7/1YJIwxUEPFfQPtc86Ym/1sVgQ2RLoD43AazMk2l/unK4ITySSpW2+82w== - dependencies: - "@noble/hashes" "~1.1.1" - "@scure/base" "~1.1.0" - -"@solana/buffer-layout-utils@^0.2.0": - version "0.2.0" - resolved "https://registry.yarnpkg.com/@solana/buffer-layout-utils/-/buffer-layout-utils-0.2.0.tgz#b45a6cab3293a2eb7597cceb474f229889d875ca" - integrity sha512-szG4sxgJGktbuZYDg2FfNmkMi0DYQoVjN2h7ta1W1hPrwzarcFLBq9UpX1UjNXsNpT9dn+chgprtWGioUAr4/g== - dependencies: - "@solana/buffer-layout" "^4.0.0" - "@solana/web3.js" "^1.32.0" - bigint-buffer "^1.1.5" - bignumber.js "^9.0.1" - -"@solana/buffer-layout@^4.0.0": - version "4.0.0" - resolved "https://registry.npmjs.org/@solana/buffer-layout/-/buffer-layout-4.0.0.tgz" - integrity sha512-lR0EMP2HC3+Mxwd4YcnZb0smnaDw7Bl2IQWZiTevRH5ZZBZn6VRWn3/92E3qdU4SSImJkA6IDHawOHAnx/qUvQ== - dependencies: - buffer "~6.0.3" - -"@solana/spl-token@^0.3.5": - version "0.3.6" - resolved "https://registry.yarnpkg.com/@solana/spl-token/-/spl-token-0.3.6.tgz#35473ad2ed71fe91e5754a2ac72901e1b8b26a42" - integrity sha512-P9pTXjDIRvVbjr3J0mCnSamYqLnICeds7IoH1/Ro2R9OBuOHdp5pqKZoscfZ3UYrgnCWUc1bc9M2m/YPHjw+1g== - dependencies: - "@solana/buffer-layout" "^4.0.0" - "@solana/buffer-layout-utils" "^0.2.0" - buffer "^6.0.3" - -"@solana/web3.js@^1.32.0", "@solana/web3.js@^1.36.0", "@solana/web3.js@^1.66.2": - version "1.66.2" - resolved "https://registry.yarnpkg.com/@solana/web3.js/-/web3.js-1.66.2.tgz#80b43c5868b846124fe3ebac7d3943930c3fa60c" - integrity sha512-RyaHMR2jGmaesnYP045VLeBGfR/gAW3cvZHzMFGg7bkO+WOYOYp1nEllf0/la4U4qsYGKCsO9eEevR5fhHiVHg== - dependencies: - "@babel/runtime" "^7.12.5" - "@noble/ed25519" "^1.7.0" - "@noble/hashes" "^1.1.2" - "@noble/secp256k1" "^1.6.3" - "@solana/buffer-layout" "^4.0.0" - bigint-buffer "^1.1.5" - bn.js "^5.0.0" - borsh "^0.7.0" - bs58 "^4.0.1" - buffer "6.0.1" - fast-stable-stringify "^1.0.0" - jayson "^3.4.4" - node-fetch "2" - rpc-websockets "^7.5.0" - superstruct "^0.14.2" - -"@terra-money/legacy.proto@npm:@terra-money/terra.proto@^0.1.7": - version "0.1.7" - resolved "https://registry.npmjs.org/@terra-money/terra.proto/-/terra.proto-0.1.7.tgz" - integrity sha512-NXD7f6pQCulvo6+mv6MAPzhOkUzRjgYVuHZE/apih+lVnPG5hDBU0rRYnOGGofwvKT5/jQoOENnFn/gioWWnyQ== - dependencies: - google-protobuf "^3.17.3" - long "^4.0.0" - protobufjs "~6.11.2" - -"@terra-money/terra.js@^3.1.3": - version "3.1.7" - resolved "https://registry.npmjs.org/@terra-money/terra.js/-/terra.js-3.1.7.tgz" - integrity sha512-z7NwVI1gh0846pgQJaPHya6SRKLd/dHWR5UwWG6T2Pf24I2EjCo8YY5Fay30pCvHTYA2NBFgnWfXEZ/31TfB1Q== - dependencies: - "@terra-money/legacy.proto" "npm:@terra-money/terra.proto@^0.1.7" - "@terra-money/terra.proto" "^2.1.0" - axios "^0.27.2" - bech32 "^2.0.0" - bip32 "^2.0.6" - bip39 "^3.0.3" - bufferutil "^4.0.3" - decimal.js "^10.2.1" - jscrypto "^1.0.1" - readable-stream "^3.6.0" - secp256k1 "^4.0.2" - tmp "^0.2.1" - utf-8-validate "^5.0.5" - ws "^7.5.9" - -"@terra-money/terra.proto@^2.1.0": - version "2.1.0" - resolved "https://registry.npmjs.org/@terra-money/terra.proto/-/terra.proto-2.1.0.tgz" - integrity sha512-rhaMslv3Rkr+QsTQEZs64FKA4QlfO0DfQHaR6yct/EovenMkibDEQ63dEL6yJA6LCaEQGYhyVB9JO9pTUA8ybw== - dependencies: - "@improbable-eng/grpc-web" "^0.14.1" - google-protobuf "^3.17.3" - long "^4.0.0" - protobufjs "~6.11.2" - -"@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.3" - resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.3.tgz#472eaab5f15c1ffdd7f8628bd4c4f753995ec79e" - integrity sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ== - -"@typechain/ethers-v5@^10.1.1": - version "10.1.1" - resolved "https://registry.yarnpkg.com/@typechain/ethers-v5/-/ethers-v5-10.1.1.tgz#fdb527d8854129cea5f139d76c6c6e1c9bb040ec" - integrity sha512-o6nffJBxwmeX1ZiZpdnP/tqGd/7M7iYvQC88ZXaFFoyAGh7eYncynzVjOJV0XmaKzAc6puqyqZrnva+gJbk4sw== - dependencies: - lodash "^4.17.15" - ts-essentials "^7.0.1" - -"@types/argparse@^2.0.10": - version "2.0.10" - resolved "https://registry.yarnpkg.com/@types/argparse/-/argparse-2.0.10.tgz#664e84808accd1987548d888b9d21b3e9c996a6c" - integrity sha512-C4wahC3gz3vQtvPazrJ5ONwmK1zSDllQboiWvpMM/iOswCYfBREFnjFbq/iWKIVOCl8+m5Pk6eva6/ZSsDuIGA== - -"@types/bn.js@5.1.0", "@types/bn.js@^5.1.0": - version "5.1.0" - resolved "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.0.tgz" - integrity sha512-QSSVYj7pYFN49kW77o2s9xTCwZ8F2xLbjLLSEVh8D2F4JUhZtPAGOFLTD+ffqksBx/u4cE/KImFjyhqCjn/LIA== - dependencies: - "@types/node" "*" - -"@types/bn.js@^4.11.3": - version "4.11.6" - resolved "https://registry.npmjs.org/@types/bn.js/-/bn.js-4.11.6.tgz" - integrity sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg== - dependencies: - "@types/node" "*" - -"@types/chai@^4.3.3": - version "4.3.3" - resolved "https://registry.npmjs.org/@types/chai/-/chai-4.3.3.tgz" - integrity sha512-hC7OMnszpxhZPduX+m+nrx+uFoLkWOMiR4oa/AZF3MuSETYTZmFfJAHqZEM8MVlvfG7BEUcgvtwoCTxBp6hm3g== - -"@types/connect@^3.4.33": - version "3.4.35" - resolved "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz" - integrity sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ== - dependencies: - "@types/node" "*" - -"@types/google-protobuf@^3.15.5": - version "3.15.6" - resolved "https://registry.npmjs.org/@types/google-protobuf/-/google-protobuf-3.15.6.tgz" - integrity sha512-pYVNNJ+winC4aek+lZp93sIKxnXt5qMkuKmaqS3WGuTq0Bw1ZDYNBgzG5kkdtwcv+GmYJGo3yEg6z2cKKAiEdw== - -"@types/json5@^0.0.29": - version "0.0.29" - resolved "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz" - integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== - -"@types/lodash.values@^4.3.6": - version "4.3.7" - resolved "https://registry.npmjs.org/@types/lodash.values/-/lodash.values-4.3.7.tgz" - integrity sha512-Moex9/sWxtKEa+BKiH5zvmhfcieDlcz4wRxMhO/oJ2qOKUdujoU6dQjUTxWA8jwEREpHXmiY4HCwNRpycW8JQA== - dependencies: - "@types/lodash" "*" - -"@types/lodash@*": - version "4.14.186" - resolved "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.186.tgz" - integrity sha512-eHcVlLXP0c2FlMPm56ITode2AgLMSa6aJ05JTTbYbI+7EMkCEE5qk2E41d5g2lCVTqRe0GnnRFurmlCsDODrPw== - -"@types/long@^4.0.1", "@types/long@^4.0.2": - version "4.0.2" - resolved "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz" - integrity sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA== - -"@types/mocha@^9.1.1": - version "9.1.1" - resolved "https://registry.npmjs.org/@types/mocha/-/mocha-9.1.1.tgz" - integrity sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw== - -"@types/node@*", "@types/node@>=13.7.0", "@types/node@^18.0.3": - version "18.11.0" - resolved "https://registry.npmjs.org/@types/node/-/node-18.11.0.tgz" - integrity sha512-IOXCvVRToe7e0ny7HpT/X9Rb2RYtElG1a+VshjwT00HxrM2dWBApHQoqsI6WiY7Q03vdf2bCrIGzVrkF/5t10w== - -"@types/node@10.12.18": - version "10.12.18" - resolved "https://registry.npmjs.org/@types/node/-/node-10.12.18.tgz" - integrity sha512-fh+pAqt4xRzPfqA6eh3Z2y6fyZavRIumvjhaCL753+TVkGKGhpPeyrJG2JftD0T9q4GF00KjefsQ+PQNDdWQaQ== - -"@types/node@11.11.6": - version "11.11.6" - resolved "https://registry.npmjs.org/@types/node/-/node-11.11.6.tgz" - integrity sha512-Exw4yUWMBXM3X+8oqzJNRqZSwUAaS4+7NdvHqQuFi/d+synz++xmX3QIf+BFqneW8N31R8Ky+sikfZUXq07ggQ== - -"@types/node@^12.12.54": - version "12.20.55" - resolved "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz" - integrity sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ== - -"@types/node@^18.11.17": - version "18.11.17" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.11.17.tgz#5c009e1d9c38f4a2a9d45c0b0c493fe6cdb4bcb5" - integrity sha512-HJSUJmni4BeDHhfzn6nF0sVmd1SMezP7/4F0Lq+aXzmp2xm9O7WXrUtHW/CHlYVtZUbByEvWidHqRtcJXGF2Ng== - -"@types/pbkdf2@^3.0.0": - version "3.1.0" - resolved "https://registry.npmjs.org/@types/pbkdf2/-/pbkdf2-3.1.0.tgz" - integrity sha512-Cf63Rv7jCQ0LaL8tNXmEyqTHuIJxRdlS5vMh1mj5voN4+QFhVZnlZruezqpWYDiJ8UTzhP0VmeLXCmBk66YrMQ== - dependencies: - "@types/node" "*" - -"@types/prettier@^2.1.1": - version "2.7.1" - resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.7.1.tgz#dfd20e2dc35f027cdd6c1908e80a5ddc7499670e" - integrity sha512-ri0UmynRRvZiiUJdiz38MmIblKK+oH30MztdBVR95dv/Ubw6neWSb8u1XpRb72L4qsZOhz+L+z9JD40SJmfWow== - -"@types/secp256k1@^4.0.1": - version "4.0.3" - resolved "https://registry.npmjs.org/@types/secp256k1/-/secp256k1-4.0.3.tgz" - integrity sha512-Da66lEIFeIz9ltsdMZcpQvmrmmoqrfju8pm1BH8WbYjZSwUgCwXLb9C+9XYogwBITnbsSaMdVPb2ekf7TV+03w== - dependencies: - "@types/node" "*" - -"@types/ws@^7.4.4": - version "7.4.7" - resolved "https://registry.npmjs.org/@types/ws/-/ws-7.4.7.tgz" - integrity sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww== - dependencies: - "@types/node" "*" - -"@ungap/promise-all-settled@1.1.2": - version "1.1.2" - resolved "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz" - integrity sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q== - -"@wry/context@^0.6.0": - version "0.6.1" - resolved "https://registry.npmjs.org/@wry/context/-/context-0.6.1.tgz" - integrity sha512-LOmVnY1iTU2D8tv4Xf6MVMZZ+juIJ87Kt/plMijjN20NMAXGmH4u8bS1t0uT74cZ5gwpocYueV58YwyI8y+GKw== - dependencies: - tslib "^2.3.0" - -"@wry/context@^0.7.0": - version "0.7.0" - resolved "https://registry.npmjs.org/@wry/context/-/context-0.7.0.tgz" - integrity sha512-LcDAiYWRtwAoSOArfk7cuYvFXytxfVrdX7yxoUmK7pPITLk5jYh2F8knCwS7LjgYL8u1eidPlKKV6Ikqq0ODqQ== - dependencies: - tslib "^2.3.0" - -"@wry/equality@^0.5.0": - version "0.5.3" - resolved "https://registry.npmjs.org/@wry/equality/-/equality-0.5.3.tgz" - integrity sha512-avR+UXdSrsF2v8vIqIgmeTY0UR91UT+IyablCyKe/uk22uOJ8fusKZnH9JH9e1/EtLeNJBtagNmL3eJdnOV53g== - dependencies: - tslib "^2.3.0" - -"@wry/trie@^0.3.0": - version "0.3.2" - resolved "https://registry.npmjs.org/@wry/trie/-/trie-0.3.2.tgz" - integrity sha512-yRTyhWSls2OY/pYLfwff867r8ekooZ4UI+/gxot5Wj8EFwSf2rG+n+Mo/6LoLQm1TKA4GRj2+LCpbfS937dClQ== - dependencies: - tslib "^2.3.0" - -"@xpla/xpla.js@^0.2.1": - version "0.2.1" - resolved "https://registry.npmjs.org/@xpla/xpla.js/-/xpla.js-0.2.1.tgz" - integrity sha512-+2v9/rxnRaaZBShT232bB3sow0JMe5ghIzLUPy7XJQasf6fu3mmVgMUIl9QCrILkuTZwh3yNsFOvkZTPH28Fmw== - dependencies: - "@ethersproject/bytes" "^5.6.1" - "@ethersproject/keccak256" "^5.6.1" - "@ethersproject/signing-key" "^5.6.2" - "@terra-money/legacy.proto" "npm:@terra-money/terra.proto@^0.1.7" - "@terra-money/terra.proto" "^2.1.0" - axios "^0.26.1" - bech32 "^2.0.0" - bip32 "^2.0.6" - bip39 "^3.0.3" - bufferutil "^4.0.3" - crypto-addr-codec "^0.1.7" - decimal.js "^10.2.1" - elliptic "^6.5.4" - ethereumjs-util "^7.1.5" - jscrypto "^1.0.1" - readable-stream "^3.6.0" - secp256k1 "^4.0.2" - tmp "^0.2.1" - utf-8-validate "^5.0.5" - ws "^7.5.8" - -JSONStream@^1.3.5: - version "1.3.5" - resolved "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz" - integrity sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ== - dependencies: - jsonparse "^1.2.0" - through ">=2.2.7 <3" - -accepts@~1.3.8: - version "1.3.8" - resolved "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz" - integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== - dependencies: - mime-types "~2.1.34" - negotiator "0.6.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@7.1.1: - version "7.1.1" - resolved "https://registry.npmjs.org/acorn/-/acorn-7.1.1.tgz" - integrity sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg== - -acorn@^8.4.1: - version "8.8.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.1.tgz#0a3f9cbecc4ec3bea6f0a80b66ae8dd2da250b73" - integrity sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA== - -aes-js@3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz" - integrity sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw== - -algo-msgpack-with-bigint@^2.1.1: - version "2.1.1" - resolved "https://registry.npmjs.org/algo-msgpack-with-bigint/-/algo-msgpack-with-bigint-2.1.1.tgz" - integrity sha512-F1tGh056XczEaEAqu7s+hlZUDWwOBT70Eq0lfMpBP2YguSQVyxRbprLq5rELXKQOyOaixTWYhMeMQMzP0U5FoQ== - -algosdk@^1.15.0: - version "1.22.0" - resolved "https://registry.npmjs.org/algosdk/-/algosdk-1.22.0.tgz" - integrity sha512-oj2G1ucLyqfTAPM9iIWiSfU0Jmwx1gaafqlC2RaWcwHx86cwnFTwEf/haFQ9yoirkIozVlZYTYtv+Ltkj3il8w== - dependencies: - algo-msgpack-with-bigint "^2.1.1" - buffer "^6.0.2" - hi-base32 "^0.5.1" - js-sha256 "^0.9.0" - js-sha3 "^0.8.0" - js-sha512 "^0.8.0" - json-bigint "^1.0.0" - superagent "^6.1.0" - tweetnacl "^1.0.3" - vlq "^2.0.4" - optionalDependencies: - fsevents "2.1.2" - -ansi-colors@4.1.1: - version "4.1.1" - resolved "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz" - integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== - -ansi-regex@^5.0.1: - version "5.0.1" - resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" - integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== - -ansi-styles@^3.2.1: - version "3.2.1" - resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz" - 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.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" - integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== - dependencies: - color-convert "^2.0.1" - -anymatch@~3.1.2: - version "3.1.2" - resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz" - integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== - dependencies: - normalize-path "^3.0.0" - picomatch "^2.0.4" - -aptos@^1.3.16: - version "1.3.17" - resolved "https://registry.yarnpkg.com/aptos/-/aptos-1.3.17.tgz#bdfb8ab9790b52abbeefd862721007b4d13c9302" - integrity sha512-SPgWR9D0nHwLNpvxH943T9ieA2/Q0AVVsvT/qTUuWQSImxkxMVkb++XyWhiFyQpnZDqo6o2o0/fZakeUkqrc8w== - dependencies: - "@noble/hashes" "1.1.3" - "@scure/bip39" "1.1.0" - axios "0.27.2" - form-data "4.0.0" - tweetnacl "1.0.3" - -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-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-flatten@1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz" - integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== - -arrify@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz" - integrity sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA== - -assertion-error@^1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz" - integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== - -asynckit@^0.4.0: - version "0.4.0" - resolved "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz" - integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== - -axios@0.27.2, axios@^0.27.2: - version "0.27.2" - resolved "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz" - integrity sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ== - dependencies: - follow-redirects "^1.14.9" - form-data "^4.0.0" - -axios@^0.21.1, axios@^0.21.2: - version "0.21.4" - resolved "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz" - integrity sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg== - dependencies: - follow-redirects "^1.14.0" - -axios@^0.24.0: - version "0.24.0" - resolved "https://registry.npmjs.org/axios/-/axios-0.24.0.tgz" - integrity sha512-Q6cWsys88HoPgAaFAVUb0WpPk0O8iTeisR9IMqy9G8AbO4NlpVknrnQS03zzF9PGAWgO3cgletO3VjV/P7VztA== - dependencies: - follow-redirects "^1.14.4" - -axios@^0.26.1: - version "0.26.1" - resolved "https://registry.npmjs.org/axios/-/axios-0.26.1.tgz" - integrity sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA== - dependencies: - follow-redirects "^1.14.8" - -axios@^1.1.3: - version "1.1.3" - resolved "https://registry.npmjs.org/axios/-/axios-1.1.3.tgz" - integrity sha512-00tXVRwKx/FZr/IDVFt4C+f9FYairX517WoGCL6dpOntqLkZofjhu43F/Xl44UOpqa+9sLFDrG/XAnFsUYgkDA== - dependencies: - follow-redirects "^1.15.0" - form-data "^4.0.0" - proxy-from-env "^1.1.0" - -balanced-match@^1.0.0: - version "1.0.2" - resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" - integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== - -base-x@^3.0.2, base-x@^3.0.8: - version "3.0.9" - resolved "https://registry.npmjs.org/base-x/-/base-x-3.0.9.tgz" - integrity sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ== - dependencies: - safe-buffer "^5.0.1" - -base64-js@^1.3.0, base64-js@^1.3.1, base64-js@^1.5.1: - version "1.5.1" - resolved "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz" - integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== - -bech32@1.1.4, bech32@^1.1.4: - version "1.1.4" - resolved "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz" - integrity sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ== - -bech32@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/bech32/-/bech32-2.0.0.tgz" - integrity sha512-LcknSilhIGatDAsY1ak2I8VtGaHNhgMSYVxFrGLXv+xLHytaKZKcaUJJUE7qmBr7h33o5YQwP55pMI0xmkpJwg== - -big-integer@1.6.36: - version "1.6.36" - resolved "https://registry.npmjs.org/big-integer/-/big-integer-1.6.36.tgz" - integrity sha512-t70bfa7HYEA1D9idDbmuv7YbsbVkQ+Hp+8KFSul4aE5e/i1bjCNIRYJZlA8Q8p0r9T8cF/RVvwUgRA//FydEyg== - -bigint-buffer@^1.1.5: - version "1.1.5" - resolved "https://registry.npmjs.org/bigint-buffer/-/bigint-buffer-1.1.5.tgz" - integrity sha512-trfYco6AoZ+rKhKnxA0hgX0HAbVP/s808/EuDSe2JDzUnCp/xAsli35Orvk67UrTEcwuxZqYZDmfA2RXJgxVvA== - dependencies: - bindings "^1.3.0" - -bignumber.js@^9.0.0, bignumber.js@^9.0.1: - version "9.1.0" - resolved "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.0.tgz" - integrity sha512-4LwHK4nfDOraBCtst+wOWIHbu1vhvAPJK8g8nROd4iuc3PSEjWif/qwbkh8jwCJz6yDBvtU4KPynETgrfh7y3A== - -binary-extensions@^2.0.0: - version "2.2.0" - resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz" - integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== - -binary-parser@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/binary-parser/-/binary-parser-2.2.1.tgz#4edc6da2dc56db73fa5ba450dfe6382ede8294ce" - integrity sha512-5ATpz/uPDgq5GgEDxTB4ouXCde7q2lqAQlSdBRQVl/AJnxmQmhIfyxJx+0MGu//D5rHQifkfGbWWlaysG0o9NA== - -bindings@^1.3.0, bindings@^1.5.0: - version "1.5.0" - resolved "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz" - integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== - dependencies: - file-uri-to-path "1.0.0" - -bip32@^2.0.6: - version "2.0.6" - resolved "https://registry.npmjs.org/bip32/-/bip32-2.0.6.tgz" - integrity sha512-HpV5OMLLGTjSVblmrtYRfFFKuQB+GArM0+XP8HGWfJ5vxYBqo+DesvJwOdC2WJ3bCkZShGf0QIfoIpeomVzVdA== - dependencies: - "@types/node" "10.12.18" - bs58check "^2.1.1" - create-hash "^1.2.0" - create-hmac "^1.1.7" - tiny-secp256k1 "^1.1.3" - typeforce "^1.11.5" - wif "^2.0.6" - -bip39@^3.0.3, bip39@^3.0.4: - version "3.0.4" - resolved "https://registry.npmjs.org/bip39/-/bip39-3.0.4.tgz" - integrity sha512-YZKQlb752TrUWqHWj7XAwCSjYEgGAk+/Aas3V7NyjQeZYsztO8JnQUaCWhcnL4T+jL8nvB8typ2jRPzTlgugNw== - dependencies: - "@types/node" "11.11.6" - create-hash "^1.1.0" - pbkdf2 "^3.0.9" - randombytes "^2.0.1" - -bip66@^1.1.5: - version "1.1.5" - resolved "https://registry.npmjs.org/bip66/-/bip66-1.1.5.tgz" - integrity sha512-nemMHz95EmS38a26XbbdxIYj5csHd3RMP3H5bwQknX0WYHF01qhpufP42mLOwVICuH2JmhIhXiWs89MfUGL7Xw== - dependencies: - safe-buffer "^5.0.1" - -blakejs@^1.1.0: - version "1.2.1" - resolved "https://registry.npmjs.org/blakejs/-/blakejs-1.2.1.tgz" - integrity sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ== - -bn.js@5.2.1, bn.js@^5.0.0, bn.js@^5.1.2, bn.js@^5.2.0, bn.js@^5.2.1: - version "5.2.1" - resolved "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz" - integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ== - -bn.js@^4.11.0, 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== - -body-parser@1.20.1: - version "1.20.1" - resolved "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz" - integrity sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw== - dependencies: - bytes "3.1.2" - content-type "~1.0.4" - 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.11.0" - raw-body "2.5.1" - type-is "~1.6.18" - unpipe "1.0.0" - -borsh@^0.7.0: - version "0.7.0" - resolved "https://registry.npmjs.org/borsh/-/borsh-0.7.0.tgz" - integrity sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA== - dependencies: - bn.js "^5.2.0" - bs58 "^4.0.0" - text-encoding-utf-8 "^1.0.2" - -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" - 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.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz" - integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== - dependencies: - balanced-match "^1.0.0" - -braces@~3.0.2: - version "3.0.2" - resolved "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz" - integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== - dependencies: - fill-range "^7.0.1" - -brorand@^1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz" - integrity sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w== - -browser-headers@^0.4.0, browser-headers@^0.4.1: - version "0.4.1" - resolved "https://registry.npmjs.org/browser-headers/-/browser-headers-0.4.1.tgz" - integrity sha512-CA9hsySZVo9371qEHjHZtYxV2cFtVj5Wj/ZHi8ooEsrtm4vOnl9Y9HmyYWk9q+05d7K3rdoAE0j3MVEFVvtQtg== - -browser-stdout@1.3.1: - version "1.3.1" - resolved "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz" - integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== - -browserify-aes@^1.0.6, browserify-aes@^1.2.0: - version "1.2.0" - resolved "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz" - 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, bs58@^4.0.1: - version "4.0.1" - resolved "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz" - integrity sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw== - dependencies: - base-x "^3.0.2" - -bs58check@<3.0.0, bs58check@^2.1.1, bs58check@^2.1.2: - version "2.1.2" - resolved "https://registry.npmjs.org/bs58check/-/bs58check-2.1.2.tgz" - 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, buffer-from@^1.1.0: - version "1.1.2" - resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz" - integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== - -buffer-layout@^1.2.0, buffer-layout@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/buffer-layout/-/buffer-layout-1.2.2.tgz#b9814e7c7235783085f9ca4966a0cfff112259d5" - integrity sha512-kWSuLN694+KTk8SrYvCqwP2WcgQjoRCiF5b4QDvkkz8EmgD+aWAIceGFKMIAdmF/pH+vpgNV3d3kAKorcdAmWA== - -buffer-xor@^1.0.3: - version "1.0.3" - resolved "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz" - integrity sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ== - -buffer@6.0.1: - version "6.0.1" - resolved "https://registry.npmjs.org/buffer/-/buffer-6.0.1.tgz" - integrity sha512-rVAXBwEcEoYtxnHSO5iWyhzV/O1WMtkUYWlfdLS7FjU4PnSJJHEfHXi/uHPI5EwltmOA794gN3bm3/pzuctWjQ== - dependencies: - base64-js "^1.3.1" - ieee754 "^1.2.1" - -buffer@6.0.3, buffer@^6.0.2, buffer@^6.0.3, buffer@~6.0.3: - version "6.0.3" - resolved "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz" - integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== - dependencies: - base64-js "^1.3.1" - ieee754 "^1.2.1" - -bufferutil@^4.0.1, bufferutil@^4.0.3: - version "4.0.6" - resolved "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.6.tgz" - integrity sha512-jduaYOYtnio4aIAyc6UbvPCVcgq7nYpVnucyxr6eCYg/Woad9Hf/oxxBRDnGGjPfjUm6j5O/uBWhIu4iLebFaw== - dependencies: - node-gyp-build "^4.3.0" - -bytes@3.1.2: - version "3.1.2" - resolved "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz" - integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== - -call-bind@^1.0.0: - version "1.0.2" - resolved "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz" - integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== - dependencies: - function-bind "^1.1.1" - get-intrinsic "^1.0.2" - -camelcase@^5.3.1: - version "5.3.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" - integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== - -camelcase@^6.0.0: - version "6.3.0" - resolved "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz" - integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== - -capability@^0.2.5: - version "0.2.5" - resolved "https://registry.npmjs.org/capability/-/capability-0.2.5.tgz" - integrity sha512-rsJZYVCgXd08sPqwmaIqjAd5SUTfonV0z/gDJ8D6cN8wQphky1kkAYEqQ+hmDxTw7UihvBfjUVUSY+DBEe44jg== - -chai@^4.3.6: - version "4.3.6" - resolved "https://registry.npmjs.org/chai/-/chai-4.3.6.tgz" - integrity sha512-bbcp3YfHCUzMOvKqsztczerVgBKSsEijCySNlHHbX3VG1nskvqjz5Rfso1gGwD6w6oOV3eI60pKuMOV5MV7p3Q== - dependencies: - assertion-error "^1.1.0" - check-error "^1.0.2" - deep-eql "^3.0.1" - get-func-name "^2.0.0" - loupe "^2.3.1" - pathval "^1.1.1" - type-detect "^4.0.5" - -chalk@^2.4.1, chalk@^2.4.2: - version "2.4.2" - resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" - 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: - version "4.1.2" - resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -check-error@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz" - integrity sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA== - -chokidar@3.5.3: - version "3.5.3" - resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz" - 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" - -cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: - version "1.0.4" - resolved "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz" - integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== - dependencies: - inherits "^2.0.1" - safe-buffer "^5.0.1" - -cliui@^7.0.2: - version "7.0.4" - resolved "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz" - 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.npmjs.org/color-convert/-/color-convert-1.9.3.tgz" - 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.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" - 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.npmjs.org/color-name/-/color-name-1.1.3.tgz" - integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== - -color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - -combined-stream@^1.0.8: - version "1.0.8" - resolved "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz" - integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== - dependencies: - delayed-stream "~1.0.0" - -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@^2.20.3: - version "2.20.3" - resolved "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz" - integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== - -component-emitter@^1.3.0: - version "1.3.0" - resolved "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz" - integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" - integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== - -content-disposition@0.5.4: - version "0.5.4" - resolved "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz" - integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== - dependencies: - safe-buffer "5.2.1" - -content-type@~1.0.4: - version "1.0.4" - resolved "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz" - integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== - -cookie-signature@1.0.6: - version "1.0.6" - resolved "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz" - integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== - -cookie@0.5.0: - version "0.5.0" - resolved "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz" - integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== - -cookiejar@^2.1.2: - version "2.1.3" - resolved "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.3.tgz" - integrity sha512-JxbCBUdrfr6AQjOXrxoTvAMJO4HBTUIlBzslcJPAz+/KT8yk53fXun51u+RenNYvad/+Vc2DIz5o9UxlCDymFQ== - -copyfiles@^2.4.1: - version "2.4.1" - resolved "https://registry.npmjs.org/copyfiles/-/copyfiles-2.4.1.tgz" - integrity sha512-fereAvAvxDrQDOXybk3Qu3dPbOoKoysFMWtkY3mv5BsL8//OSZVL5DCLYqgRfY5cWirgRzlC+WSrxp6Bo3eNZg== - dependencies: - glob "^7.0.5" - minimatch "^3.0.3" - mkdirp "^1.0.4" - noms "0.0.0" - through2 "^2.0.1" - untildify "^4.0.0" - yargs "^16.1.0" - -core-util-is@~1.0.0: - version "1.0.3" - resolved "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz" - integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== - -cosmjs-types@^0.5.2: - version "0.5.2" - resolved "https://registry.npmjs.org/cosmjs-types/-/cosmjs-types-0.5.2.tgz" - integrity sha512-zxCtIJj8v3Di7s39uN4LNcN3HIE1z0B9Z0SPE8ZNQR0oSzsuSe1ACgxoFkvhkS7WBasCAFcglS11G2hyfd5tPg== - dependencies: - long "^4.0.0" - protobufjs "~6.11.2" - -crc-32@^1.2.0: - version "1.2.2" - resolved "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz" - 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.npmjs.org/create-hash/-/create-hash-1.2.0.tgz" - 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.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz" - 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@^3.1.5: - version "3.1.5" - resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.5.tgz#e1389f44d9e7ba767907f7af8454787952ab534f" - integrity sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw== - dependencies: - node-fetch "2.6.7" - -crypto-addr-codec@^0.1.7: - version "0.1.7" - resolved "https://registry.npmjs.org/crypto-addr-codec/-/crypto-addr-codec-0.1.7.tgz" - integrity sha512-X4hzfBzNhy4mAc3UpiXEC/L0jo5E8wAa9unsnA8nNXYzXjCcGk83hfC5avJWCSGT8V91xMnAS9AKMHmjw5+XCg== - dependencies: - base-x "^3.0.8" - big-integer "1.6.36" - blakejs "^1.1.0" - bs58 "^4.0.1" - ripemd160-min "0.0.6" - safe-buffer "^5.2.0" - sha3 "^2.1.1" - -crypto-hash@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/crypto-hash/-/crypto-hash-1.3.0.tgz#b402cb08f4529e9f4f09346c3e275942f845e247" - integrity sha512-lyAZ0EMyjDkVvz8WOeVnuCPvKVBXcMv1l5SVqO1yC7PzTwrD/pPje/BIRbWhMoPe436U+Y2nD7f5bFx0kt+Sbg== - -debug@2.6.9: - version "2.6.9" - resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" - integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== - dependencies: - ms "2.0.0" - -debug@4.3.4, debug@^4.1.1, debug@^4.3.1: - version "4.3.4" - resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" - integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== - dependencies: - ms "2.1.2" - -decamelize@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz" - integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== - -decimal.js@^10.2.1: - version "10.4.2" - resolved "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.2.tgz" - integrity sha512-ic1yEvwT6GuvaYwBLLY6/aFFgjZdySKTE8en/fkU3QICTmRtgtSlFn0u0BXN06InZwtfCelR7j8LRiDI/02iGA== - -deep-eql@^3.0.1: - version "3.0.1" - resolved "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz" - integrity sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw== - 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== - -define-properties@^1.1.3: - version "1.1.4" - resolved "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz" - integrity sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA== - dependencies: - has-property-descriptors "^1.0.0" - object-keys "^1.1.1" - -delay@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/delay/-/delay-5.0.0.tgz" - integrity sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw== - -delayed-stream@~1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" - integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== - -depd@2.0.0, depd@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz" - integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== - -depd@~1.1.2: - version "1.1.2" - resolved "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz" - integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ== - -destroy@1.2.0: - version "1.2.0" - resolved "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz" - integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== - -diff@5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz" - integrity sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w== - -diff@^3.1.0: - version "3.5.0" - resolved "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz" - integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA== - -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== - -dot-case@^3.0.4: - version "3.0.4" - resolved "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz" - integrity sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w== - dependencies: - no-case "^3.0.4" - tslib "^2.0.3" - -dotenv@^16.0.3: - version "16.0.3" - resolved "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz" - integrity sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ== - -drbg.js@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/drbg.js/-/drbg.js-1.0.1.tgz" - integrity sha512-F4wZ06PvqxYLFEZKkFxTDcns9oFNk34hvmJSEwdzsxVQ8YI5YaxtACgQatkYgv2VI2CFkUd2Y+xosPQnHv809g== - dependencies: - browserify-aes "^1.0.6" - create-hash "^1.1.2" - create-hmac "^1.1.4" - -eccrypto@1.1.6: - version "1.1.6" - resolved "https://registry.npmjs.org/eccrypto/-/eccrypto-1.1.6.tgz" - integrity sha512-d78ivVEzu7Tn0ZphUUaL43+jVPKTMPFGtmgtz1D0LrFn7cY3K8CdrvibuLz2AAkHBLKZtR8DMbB2ukRYFk987A== - dependencies: - acorn "7.1.1" - elliptic "6.5.4" - es6-promise "4.2.8" - nan "2.14.0" - optionalDependencies: - secp256k1 "3.7.1" - -ee-first@1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz" - integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== - -elliptic@6.5.4, elliptic@^6.4.0, elliptic@^6.4.1, elliptic@^6.5.2, elliptic@^6.5.3, elliptic@^6.5.4: - version "6.5.4" - resolved "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz" - 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.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz" - integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== - -encodeurl@~1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz" - integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== - -error-polyfill@^0.1.3: - version "0.1.3" - resolved "https://registry.npmjs.org/error-polyfill/-/error-polyfill-0.1.3.tgz" - integrity sha512-XHJk60ufE+TG/ydwp4lilOog549iiQF2OAPhkk9DdiYWMrltz5yhDz/xnKuenNwP7gy3dsibssO5QpVhkrSzzg== - dependencies: - capability "^0.2.5" - o3 "^1.0.3" - u3 "^0.1.1" - -es6-promise@4.2.8, es6-promise@^4.0.3: - version "4.2.8" - resolved "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz" - integrity sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w== - -es6-promisify@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz" - integrity sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ== - dependencies: - es6-promise "^4.0.3" - -escalade@^3.1.1: - version "3.1.1" - resolved "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz" - integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== - -escape-html@~1.0.3: - version "1.0.3" - resolved "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz" - integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== - -escape-string-regexp@4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" - integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== - -escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" - integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== - -etag@~1.8.1: - version "1.8.1" - resolved "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz" - integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== - -eth-crypto@^2.3.0: - version "2.3.0" - resolved "https://registry.npmjs.org/eth-crypto/-/eth-crypto-2.3.0.tgz" - integrity sha512-kTRdMuqIO4OBuk5XKL3FNQ6HVQV54dc/mxGgSoeUscp+7eiZ3C5xBsBj2DGY2HM9Woa0sMuzvpi6HwjyXL6E8w== - dependencies: - "@babel/runtime" "7.17.9" - "@ethereumjs/tx" "3.5.1" - "@types/bn.js" "5.1.0" - eccrypto "1.1.6" - ethereumjs-util "7.1.4" - ethers "5.6.4" - secp256k1 "4.0.3" - -ethereum-cryptography@^0.1.3: - version "0.1.3" - resolved "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz" - 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" - -ethereumjs-abi@^0.6.8: - version "0.6.8" - resolved "https://registry.npmjs.org/ethereumjs-abi/-/ethereumjs-abi-0.6.8.tgz" - integrity sha512-Tx0r/iXI6r+lRsdvkFDlut0N08jWMnKRZ6Gkq+Nmw75lZe4e6o3EkSnkaBP5NF6+m5PTGAr9JP43N3LyeoglsA== - dependencies: - bn.js "^4.11.8" - ethereumjs-util "^6.0.0" - -ethereumjs-util@7.1.4: - version "7.1.4" - resolved "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.4.tgz" - integrity sha512-p6KmuPCX4mZIqsQzXfmSx9Y0l2hqf+VkAiwSisW3UKUFdk8ZkAt+AYaor83z2nSi6CU2zSsXMlD80hAbNEGM0A== - 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" - -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.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz" - 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.4: - version "5.6.4" - resolved "https://registry.npmjs.org/ethers/-/ethers-5.6.4.tgz" - integrity sha512-62UIfxAQXdf67TeeOaoOoPctm5hUlYgfd0iW3wxfj7qRYKDcvvy0f+sJ3W2/Pyx77R8dblvejA8jokj+lS+ATQ== - dependencies: - "@ethersproject/abi" "5.6.1" - "@ethersproject/abstract-provider" "5.6.0" - "@ethersproject/abstract-signer" "5.6.0" - "@ethersproject/address" "5.6.0" - "@ethersproject/base64" "5.6.0" - "@ethersproject/basex" "5.6.0" - "@ethersproject/bignumber" "5.6.0" - "@ethersproject/bytes" "5.6.1" - "@ethersproject/constants" "5.6.0" - "@ethersproject/contracts" "5.6.0" - "@ethersproject/hash" "5.6.0" - "@ethersproject/hdnode" "5.6.0" - "@ethersproject/json-wallets" "5.6.0" - "@ethersproject/keccak256" "5.6.0" - "@ethersproject/logger" "5.6.0" - "@ethersproject/networks" "5.6.2" - "@ethersproject/pbkdf2" "5.6.0" - "@ethersproject/properties" "5.6.0" - "@ethersproject/providers" "5.6.4" - "@ethersproject/random" "5.6.0" - "@ethersproject/rlp" "5.6.0" - "@ethersproject/sha2" "5.6.0" - "@ethersproject/signing-key" "5.6.0" - "@ethersproject/solidity" "5.6.0" - "@ethersproject/strings" "5.6.0" - "@ethersproject/transactions" "5.6.0" - "@ethersproject/units" "5.6.0" - "@ethersproject/wallet" "5.6.0" - "@ethersproject/web" "5.6.0" - "@ethersproject/wordlists" "5.6.0" - -ethers@^5.6.4, ethers@^5.7.1: - version "5.7.1" - resolved "https://registry.npmjs.org/ethers/-/ethers-5.7.1.tgz" - integrity sha512-5krze4dRLITX7FpU8J4WscXqADiKmyeNlylmmDLbS95DaZpBhDe2YSwRQwKXWNyXcox7a3gBgm/MkGXV1O1S/Q== - 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.1" - "@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-util@0.1.6, ethjs-util@^0.1.6: - version "0.1.6" - resolved "https://registry.npmjs.org/ethjs-util/-/ethjs-util-0.1.6.tgz" - integrity sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w== - dependencies: - is-hex-prefixed "1.0.0" - strip-hex-prefix "1.0.0" - -eventemitter3@^4.0.7: - version "4.0.7" - resolved "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz" - integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== - -evp_bytestokey@^1.0.3: - version "1.0.3" - resolved "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz" - integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== - dependencies: - md5.js "^1.3.4" - safe-buffer "^5.1.1" - -express@^4.18.2: - version "4.18.2" - resolved "https://registry.npmjs.org/express/-/express-4.18.2.tgz" - integrity sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ== - dependencies: - accepts "~1.3.8" - array-flatten "1.1.1" - body-parser "1.20.1" - content-disposition "0.5.4" - content-type "~1.0.4" - cookie "0.5.0" - cookie-signature "1.0.6" - debug "2.6.9" - depd "2.0.0" - encodeurl "~1.0.2" - escape-html "~1.0.3" - etag "~1.8.1" - finalhandler "1.2.0" - fresh "0.5.2" - http-errors "2.0.0" - merge-descriptors "1.0.1" - methods "~1.1.2" - on-finished "2.4.1" - parseurl "~1.3.3" - path-to-regexp "0.1.7" - proxy-addr "~2.0.7" - qs "6.11.0" - range-parser "~1.2.1" - safe-buffer "5.2.1" - send "0.18.0" - serve-static "1.15.0" - setprototypeof "1.2.0" - statuses "2.0.1" - type-is "~1.6.18" - utils-merge "1.0.1" - vary "~1.1.2" - -eyes@^0.1.8: - version "0.1.8" - resolved "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz" - integrity sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ== - -fast-safe-stringify@^2.0.7: - version "2.1.1" - resolved "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz" - integrity sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA== - -fast-stable-stringify@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/fast-stable-stringify/-/fast-stable-stringify-1.0.0.tgz" - integrity sha512-wpYMUmFu5f00Sm0cj2pfivpmawLZ0NKdviQ4w9zJeR8JVtOpOxHmLaJuj0vxvGqMJQWyP/COUkF75/57OKyRag== - -file-uri-to-path@1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz" - integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== - -fill-range@^7.0.1: - version "7.0.1" - resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz" - integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== - dependencies: - to-regex-range "^5.0.1" - -finalhandler@1.2.0: - version "1.2.0" - resolved "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz" - integrity sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg== - dependencies: - debug "2.6.9" - encodeurl "~1.0.2" - escape-html "~1.0.3" - on-finished "2.4.1" - parseurl "~1.3.3" - statuses "2.0.1" - unpipe "~1.0.0" - -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.npmjs.org/find-up/-/find-up-5.0.0.tgz" - integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== - dependencies: - locate-path "^6.0.0" - path-exists "^4.0.0" - -flat@^5.0.2: - version "5.0.2" - resolved "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz" - integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== - -follow-redirects@^1.14.0, follow-redirects@^1.14.4, follow-redirects@^1.14.8, follow-redirects@^1.14.9, follow-redirects@^1.15.0: - version "1.15.2" - resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz" - integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== - -form-data@4.0.0, form-data@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz" - integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.8" - mime-types "^2.1.12" - -form-data@^3.0.0: - version "3.0.1" - resolved "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz" - integrity sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.8" - mime-types "^2.1.12" - -formidable@^1.2.2: - version "1.2.6" - resolved "https://registry.npmjs.org/formidable/-/formidable-1.2.6.tgz" - integrity sha512-KcpbcpuLNOwrEjnbpMC0gS+X8ciDoZE1kkqzat4a8vrprf+s9pKNQ/QIwWfbfs4ltgmFl3MD177SNTkve3BwGQ== - -forwarded@0.2.0: - version "0.2.0" - resolved "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz" - integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== - -fresh@0.5.2: - version "0.5.2" - resolved "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz" - integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== - -fs-extra@^7.0.0: - 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.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" - integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== - -fsevents@2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.2.tgz#4c0a1fb34bc68e543b4b82a9ec392bfbda840805" - integrity sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA== - -fsevents@~2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" - integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== - -function-bind@^1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz" - integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== - -get-caller-file@^2.0.5: - version "2.0.5" - resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz" - integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== - -get-func-name@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz" - integrity sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig== - -get-intrinsic@^1.0.2, get-intrinsic@^1.1.1: - version "1.1.3" - resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz" - integrity sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A== - dependencies: - function-bind "^1.1.1" - has "^1.0.3" - has-symbols "^1.0.3" - -glob-parent@~5.1.2: - version "5.1.2" - resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" - 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, glob@^7.0.0, glob@^7.0.5, glob@^7.1.3: - version "7.2.0" - resolved "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz" - 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" - -globalthis@^1.0.1: - version "1.0.3" - resolved "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz" - integrity sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA== - dependencies: - define-properties "^1.1.3" - -google-protobuf@^3.13.0, google-protobuf@^3.14.0, google-protobuf@^3.17.3, google-protobuf@^3.21.0: - version "3.21.2" - resolved "https://registry.npmjs.org/google-protobuf/-/google-protobuf-3.21.2.tgz" - integrity sha512-3MSOYFO5U9mPGikIYCzK0SaThypfGgS6bHqrUGXG3DPHCrb+txNqeEcns1W0lkGfk0rCyNXm7xB9rMxnCiZOoA== - -graceful-fs@^4.1.2, graceful-fs@^4.1.6: - version "4.2.10" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" - integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== - -graphql-tag@^2.12.6: - version "2.12.6" - resolved "https://registry.npmjs.org/graphql-tag/-/graphql-tag-2.12.6.tgz" - integrity sha512-FdSNcu2QQcWnM2VNvSCCDCVS5PpPqpzgFT8+GXzqJuoDd0CBncxCY278u4mhRO7tMgo2JjgJA5aZ+nWSQ/Z+xg== - dependencies: - tslib "^2.1.0" - -graphql@^16.3.0: - version "16.6.0" - resolved "https://registry.npmjs.org/graphql/-/graphql-16.6.0.tgz" - integrity sha512-KPIBPDlW7NxrbT/eh4qPXz5FiFdL5UbaA0XUNz2Rp3Z3hqBSkbj0GVjwFDztsWVauZUWsbKHgMg++sk8UX0bkw== - -has-flag@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz" - integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== - -has-flag@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" - integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== - -has-property-descriptors@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz" - integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ== - dependencies: - get-intrinsic "^1.1.1" - -has-symbols@^1.0.3: - version "1.0.3" - resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz" - integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== - -has@^1.0.3: - version "1.0.3" - resolved "https://registry.npmjs.org/has/-/has-1.0.3.tgz" - integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== - dependencies: - function-bind "^1.1.1" - -hash-base@^3.0.0: - version "3.1.0" - resolved "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz" - 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.npmjs.org/hash.js/-/hash.js-1.1.7.tgz" - 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.npmjs.org/he/-/he-1.2.0.tgz" - integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== - -hi-base32@^0.5.1: - version "0.5.1" - resolved "https://registry.npmjs.org/hi-base32/-/hi-base32-0.5.1.tgz" - integrity sha512-EmBBpvdYh/4XxsnUybsPag6VikPYnN30td+vQk+GI3qpahVEG9+gTkG0aXVxTjBqQ5T6ijbWIu77O+C5WFWsnA== - -hmac-drbg@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz" - integrity sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg== - dependencies: - hash.js "^1.0.3" - minimalistic-assert "^1.0.0" - minimalistic-crypto-utils "^1.0.1" - -hoist-non-react-statics@^3.3.2: - version "3.3.2" - resolved "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz" - integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== - dependencies: - react-is "^16.7.0" - -http-errors@2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz" - 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-errors@^1.7.2: - version "1.8.1" - resolved "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz" - integrity sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g== - dependencies: - depd "~1.1.2" - inherits "2.0.4" - setprototypeof "1.2.0" - statuses ">= 1.5.0 < 2" - toidentifier "1.0.1" - -http-status-codes@^2.2.0: - version "2.2.0" - resolved "https://registry.npmjs.org/http-status-codes/-/http-status-codes-2.2.0.tgz" - integrity sha512-feERVo9iWxvnejp3SEfm/+oNG517npqL2/PIA8ORjyOZjGC7TwCRQsZylciLS64i6pJ0wRYz3rkXLRwbtFa8Ng== - -iconv-lite@0.4.24: - version "0.4.24" - resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz" - integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== - dependencies: - safer-buffer ">= 2.1.2 < 3" - -ieee754@^1.2.1: - version "1.2.1" - resolved "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz" - integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" - 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.1, inherits@~2.0.3: - version "2.0.4" - resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -interpret@^1.0.0: - version "1.4.0" - resolved "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz" - integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA== - -ipaddr.js@1.9.1: - version "1.9.1" - resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz" - integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== - -is-binary-path@~2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz" - integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== - dependencies: - binary-extensions "^2.0.0" - -is-core-module@^2.9.0: - version "2.10.0" - resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz" - integrity sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg== - dependencies: - has "^1.0.3" - -is-extglob@^2.1.1: - version "2.1.1" - resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" - integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== - -is-fullwidth-code-point@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz" - integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== - -is-glob@^4.0.1, is-glob@~4.0.1: - version "4.0.3" - resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" - integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== - dependencies: - is-extglob "^2.1.1" - -is-hex-prefixed@1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz" - integrity sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA== - -is-number@^7.0.0: - version "7.0.0" - resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" - integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== - -is-plain-obj@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz" - integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== - -is-unicode-supported@^0.1.0: - version "0.1.0" - resolved "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz" - integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== - -isarray@0.0.1: - version "0.0.1" - resolved "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" - integrity sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ== - -isarray@~1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" - integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== - -isomorphic-ws@^4.0.1: - version "4.0.1" - resolved "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz" - integrity sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w== - -jayson@^3.4.4: - version "3.7.0" - resolved "https://registry.npmjs.org/jayson/-/jayson-3.7.0.tgz" - integrity sha512-tfy39KJMrrXJ+mFcMpxwBvFDetS8LAID93+rycFglIQM4kl3uNR3W4lBLE/FFhsoUCEox5Dt2adVpDm/XtebbQ== - dependencies: - "@types/connect" "^3.4.33" - "@types/node" "^12.12.54" - "@types/ws" "^7.4.4" - JSONStream "^1.3.5" - commander "^2.20.3" - delay "^5.0.0" - es6-promisify "^5.0.0" - eyes "^0.1.8" - isomorphic-ws "^4.0.1" - json-stringify-safe "^5.0.1" - lodash "^4.17.20" - uuid "^8.3.2" - ws "^7.4.5" - -js-base64@^3.6.1: - version "3.7.2" - resolved "https://registry.npmjs.org/js-base64/-/js-base64-3.7.2.tgz" - integrity sha512-NnRs6dsyqUXejqk/yv2aiXlAvOs56sLkX6nUdeaNezI5LFFLlsZjOThmwnrcwh5ZZRwZlCMnVAY3CvhIhoVEKQ== - -js-sha256@^0.9.0: - version "0.9.0" - resolved "https://registry.npmjs.org/js-sha256/-/js-sha256-0.9.0.tgz" - integrity sha512-sga3MHh9sgQN2+pJ9VYZ+1LPwXOxuBJBA5nrR5/ofPfuiJBE2hnjsaN8se8JznOmGLN2p49Pe5U/ttafcs/apA== - -js-sha3@0.8.0, 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-sha512@^0.8.0: - version "0.8.0" - resolved "https://registry.npmjs.org/js-sha512/-/js-sha512-0.8.0.tgz" - integrity sha512-PWsmefG6Jkodqt+ePTvBZCSMFgN7Clckjd0O7su3I0+BW2QWUTJNzjktHsztGLhncP2h8mcF9V9Y2Ha59pAViQ== - -"js-tokens@^3.0.0 || ^4.0.0": - version "4.0.0" - resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" - integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== - -js-yaml@4.1.0: - version "4.1.0" - resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz" - integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== - dependencies: - argparse "^2.0.1" - -jscrypto@^1.0.1, jscrypto@^1.0.3: - version "1.0.3" - resolved "https://registry.npmjs.org/jscrypto/-/jscrypto-1.0.3.tgz" - integrity sha512-lryZl0flhodv4SZHOqyb1bx5sKcJxj0VBo0Kzb4QMAg3L021IC9uGpl0RCZa+9KJwlRGSK2C80ITcwbe19OKLQ== - -json-bigint@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz" - integrity sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ== - dependencies: - bignumber.js "^9.0.0" - -json-stringify-safe@^5.0.1: - version "5.0.1" - resolved "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz" - integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== - -json5@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz" - integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== - dependencies: - minimist "^1.2.0" - -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" - -jsonparse@^1.2.0: - version "1.3.1" - resolved "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz" - integrity sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg== - -jsonschema@^1.4.0: - version "1.4.1" - resolved "https://registry.npmjs.org/jsonschema/-/jsonschema-1.4.1.tgz" - integrity sha512-S6cATIPVv1z0IlxdN+zUk5EPjkGCdnhN4wVSBlvoUO1tOLJootbo9CquNJmbIh4yikWHiUedhRYrNPn1arpEmQ== - -keccak256@^1.0.6: - version "1.0.6" - resolved "https://registry.npmjs.org/keccak256/-/keccak256-1.0.6.tgz" - integrity sha512-8GLiM01PkdJVGUhR1e6M/AvWnSqYS0HaERI+K/QtStGDGlSTx2B1zTqZk4Zlqu5TxHJNTxWAdP9Y+WI50OApUw== - dependencies: - bn.js "^5.2.0" - buffer "^6.0.3" - keccak "^3.0.2" - -keccak@^3.0.0, keccak@^3.0.2: - version "3.0.2" - resolved "https://registry.npmjs.org/keccak/-/keccak-3.0.2.tgz" - integrity sha512-PyKKjkH53wDMLGrvmRGSNWgmSxZOUqbnXwKL9tmgbFYA1iAYqW21kfR7mZXV0MlESiefxQQE9X9fTa3X+2MPDQ== - dependencies: - node-addon-api "^2.0.0" - node-gyp-build "^4.2.0" - readable-stream "^3.6.0" - -libsodium-wrappers@^0.7.6: - version "0.7.10" - resolved "https://registry.npmjs.org/libsodium-wrappers/-/libsodium-wrappers-0.7.10.tgz" - integrity sha512-pO3F1Q9NPLB/MWIhehim42b/Fwb30JNScCNh8TcQ/kIc+qGLQch8ag8wb0keK3EP5kbGakk1H8Wwo7v+36rNQg== - dependencies: - libsodium "^0.7.0" - -libsodium@^0.7.0: - version "0.7.10" - resolved "https://registry.npmjs.org/libsodium/-/libsodium-0.7.10.tgz" - integrity sha512-eY+z7hDrDKxkAK+QKZVNv92A5KYkxfvIshtBJkmg5TSiCnYqZP3i9OO9whE79Pwgm4jGaoHgkM4ao/b9Cyu4zQ== - -link-module-alias@^1.2.0: - version "1.2.0" - resolved "https://registry.npmjs.org/link-module-alias/-/link-module-alias-1.2.0.tgz" - integrity sha512-ahPjXepbSVKbahTB6LxR//VHm8HPfI+QQygCH+E82spBY4HR5VPJTvlhKBc9F7muVxnS6C1rRfoPOXAbWO/fyw== - dependencies: - chalk "^2.4.1" - -locate-path@^6.0.0: - version "6.0.0" - resolved "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz" - 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.values@^4.3.0: - version "4.3.0" - resolved "https://registry.npmjs.org/lodash.values/-/lodash.values-4.3.0.tgz" - integrity sha512-r0RwvdCv8id9TUblb/O7rYPwVy6lerCbcawrfdo9iC/1t1wsNMJknO79WNBgwkH0hIeJ08jmvvESbFpNb4jH0Q== - -lodash@^4.17.15, lodash@^4.17.20, lodash@^4.17.21: - version "4.17.21" - resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" - integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== - -log-symbols@4.1.0: - version "4.1.0" - resolved "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz" - integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== - dependencies: - chalk "^4.1.0" - is-unicode-supported "^0.1.0" - -long@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/long/-/long-4.0.0.tgz" - integrity sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA== - -long@^5.0.0: - version "5.2.0" - resolved "https://registry.npmjs.org/long/-/long-5.2.0.tgz" - integrity sha512-9RTUNjK60eJbx3uz+TEGF7fUr29ZDxR5QzXcyDpeSfeH28S9ycINflOgOlppit5U+4kNTe83KQnMEerw7GmE8w== - -loose-envify@^1.4.0: - version "1.4.0" - resolved "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz" - integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== - dependencies: - js-tokens "^3.0.0 || ^4.0.0" - -loupe@^2.3.1: - version "2.3.4" - resolved "https://registry.npmjs.org/loupe/-/loupe-2.3.4.tgz" - integrity sha512-OvKfgCC2Ndby6aSTREl5aCCPTNIzlDfQZvZxNUrBrihDhL3xcrYegTblhmEiCrg2kKQz4XsFIaemE5BF4ybSaQ== - dependencies: - get-func-name "^2.0.0" - -lower-case@^2.0.2: - version "2.0.2" - resolved "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz" - integrity sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg== - dependencies: - tslib "^2.0.3" - -lru-cache@^6.0.0: - version "6.0.0" - resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz" - integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== - dependencies: - yallist "^4.0.0" - -make-error@^1.1.1: - version "1.3.6" - resolved "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz" - integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== - -map-obj@^4.1.0: - version "4.3.0" - resolved "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz" - integrity sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ== - -md5.js@^1.3.4: - version "1.3.5" - resolved "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz" - 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.npmjs.org/media-typer/-/media-typer-0.3.0.tgz" - integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== - -merge-descriptors@1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz" - integrity sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w== - -methods@^1.1.2, methods@~1.1.2: - version "1.1.2" - resolved "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz" - integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== - -mime-db@1.52.0: - version "1.52.0" - resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" - integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== - -mime-types@^2.1.12, mime-types@~2.1.24, mime-types@~2.1.34: - version "2.1.35" - resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz" - integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== - dependencies: - mime-db "1.52.0" - -mime@1.6.0: - version "1.6.0" - resolved "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz" - integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== - -mime@^2.4.6: - version "2.6.0" - resolved "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz" - integrity sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg== - -minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz" - integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== - -minimalistic-crypto-utils@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz" - integrity sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg== - -minimatch@5.0.1: - version "5.0.1" - resolved "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz" - integrity sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g== - dependencies: - brace-expansion "^2.0.1" - -minimatch@^3.0.3, minimatch@^3.0.4: - 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" - -minimist@^1.2.0, minimist@^1.2.3, minimist@^1.2.6: - version "1.2.7" - resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz" - integrity sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g== - -mkdirp@^0.5.1: - version "0.5.6" - resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz" - integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== - dependencies: - minimist "^1.2.6" - -mkdirp@^1.0.4: - version "1.0.4" - resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz" - integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== - -mocha@^10.0.0: - version "10.0.0" - resolved "https://registry.npmjs.org/mocha/-/mocha-10.0.0.tgz" - integrity sha512-0Wl+elVUD43Y0BqPZBzZt8Tnkw9CMUdNYnUsTfOM1vuhJVZL+kiesFYsqwBkEEuEixaiPe5ZQdqDgX2jddhmoA== - dependencies: - "@ungap/promise-all-settled" "1.1.2" - 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" - -ms@2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz" - integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== - -ms@2.1.2: - version "2.1.2" - resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - -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== - -mustache@^4.0.0: - version "4.2.0" - resolved "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz" - integrity sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ== - -nan@2.14.0, nan@^2.13.2, nan@^2.14.0: - version "2.14.0" - resolved "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz" - integrity sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg== - -nanoid@3.3.3: - version "3.3.3" - resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz" - integrity sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w== - -near-api-js@^1.0.0: - version "1.1.0" - resolved "https://registry.npmjs.org/near-api-js/-/near-api-js-1.1.0.tgz" - integrity sha512-qYKv1mYsaDZc2uYndhS+ttDhR9+60qFc+ZjD6lWsAxr3ZskMjRwPffDGQZYhC7BRDQMe1HEbk6d5mf+TVm0Lqg== - dependencies: - bn.js "5.2.1" - borsh "^0.7.0" - bs58 "^4.0.0" - depd "^2.0.0" - error-polyfill "^0.1.3" - http-errors "^1.7.2" - js-sha256 "^0.9.0" - mustache "^4.0.0" - node-fetch "^2.6.1" - text-encoding-utf-8 "^1.0.2" - tweetnacl "^1.0.1" - -negotiator@0.6.3: - version "0.6.3" - resolved "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz" - integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== - -no-case@^3.0.4: - version "3.0.4" - resolved "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz" - integrity sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg== - dependencies: - lower-case "^2.0.2" - tslib "^2.0.3" - -node-addon-api@^2.0.0: - version "2.0.2" - resolved "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz" - integrity sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA== - -node-fetch@2, node-fetch@2.6.7, node-fetch@^2.6.1: - version "2.6.7" - resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz" - integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== - dependencies: - whatwg-url "^5.0.0" - -node-gyp-build@^4.2.0, node-gyp-build@^4.3.0: - version "4.5.0" - resolved "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.5.0.tgz" - integrity sha512-2iGbaQBV+ITgCz76ZEjmhUKAKVf7xfY1sRl4UiKQspfZMH2h06SyhNsnSVy50cwkFQDGLyif6m/6uFXHkOZ6rg== - -noms@0.0.0: - version "0.0.0" - resolved "https://registry.npmjs.org/noms/-/noms-0.0.0.tgz" - integrity sha512-lNDU9VJaOPxUmXcLb+HQFeUgQQPtMI24Gt6hgfuMHRJgMRHMF/qZ4HJD3GDru4sSw9IQl2jPjAYnQrdIeLbwow== - dependencies: - inherits "^2.0.1" - readable-stream "~1.0.31" - -normalize-path@^3.0.0, normalize-path@~3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" - integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== - -o3@^1.0.3: - version "1.0.3" - resolved "https://registry.npmjs.org/o3/-/o3-1.0.3.tgz" - integrity sha512-f+4n+vC6s4ysy7YO7O2gslWZBUu8Qj2i2OUJOvjRxQva7jVjYjB29jrr9NCjmxZQR0gzrOcv1RnqoYOeMs5VRQ== - dependencies: - capability "^0.2.5" - -object-assign@^4.1.1: - version "4.1.1" - resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" - integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== - -object-inspect@^1.9.0: - version "1.12.2" - resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz" - integrity sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ== - -object-keys@^1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz" - integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== - -on-finished@2.4.1: - version "2.4.1" - resolved "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz" - integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== - dependencies: - ee-first "1.1.1" - -once@^1.3.0: - version "1.4.0" - resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz" - integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== - dependencies: - wrappy "1" - -optimism@^0.16.1: - version "0.16.1" - resolved "https://registry.npmjs.org/optimism/-/optimism-0.16.1.tgz" - integrity sha512-64i+Uw3otrndfq5kaoGNoY7pvOhSsjFEN4bdEFh80MWVk/dbgJfMv7VFDeCT8LxNAlEVhQmdVEbfE7X2nWNIIg== - dependencies: - "@wry/context" "^0.6.0" - "@wry/trie" "^0.3.0" - -p-limit@^3.0.2: - version "3.1.0" - resolved "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz" - integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== - dependencies: - yocto-queue "^0.1.0" - -p-locate@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz" - integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== - dependencies: - p-limit "^3.0.2" - -pako@^2.0.3: - version "2.1.0" - resolved "https://registry.yarnpkg.com/pako/-/pako-2.1.0.tgz#266cc37f98c7d883545d11335c00fbd4062c9a86" - integrity sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug== - -parseurl@~1.3.3: - version "1.3.3" - resolved "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz" - integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== - -path-exists@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz" - integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== - -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" - integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== - -path-parse@^1.0.7: - version "1.0.7" - resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" - integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== - -path-to-regexp@0.1.7: - version "0.1.7" - resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz" - integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== - -pathval@^1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz" - integrity sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ== - -pbkdf2@^3.0.17, pbkdf2@^3.0.9: - version "3.1.2" - resolved "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz" - 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: - version "2.3.1" - resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" - integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== - -prettier@^2.3.1: - version "2.7.1" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.7.1.tgz#e235806850d057f97bb08368a4f7d899f7760c64" - integrity sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g== - -process-nextick-args@~2.0.0: - version "2.0.1" - resolved "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz" - integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== - -prop-types@^15.7.2: - version "15.8.1" - resolved "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz" - integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== - dependencies: - loose-envify "^1.4.0" - object-assign "^4.1.1" - react-is "^16.13.1" - -protobufjs@^7.0.0: - version "7.1.2" - resolved "https://registry.npmjs.org/protobufjs/-/protobufjs-7.1.2.tgz" - integrity sha512-4ZPTPkXCdel3+L81yw3dG6+Kq3umdWKh7Dc7GW/CpNk4SX3hK58iPCWeCyhVTDrbkNeKrYNZ7EojM5WDaEWTLQ== - dependencies: - "@protobufjs/aspromise" "^1.1.2" - "@protobufjs/base64" "^1.1.2" - "@protobufjs/codegen" "^2.0.4" - "@protobufjs/eventemitter" "^1.1.0" - "@protobufjs/fetch" "^1.1.0" - "@protobufjs/float" "^1.0.2" - "@protobufjs/inquire" "^1.1.0" - "@protobufjs/path" "^1.1.2" - "@protobufjs/pool" "^1.1.0" - "@protobufjs/utf8" "^1.1.0" - "@types/node" ">=13.7.0" - long "^5.0.0" - -protobufjs@~6.11.2: - version "6.11.3" - resolved "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.3.tgz" - integrity sha512-xL96WDdCZYdU7Slin569tFX712BxsxslWwAfAhCYjQKGTq7dAU91Lomy6nLLhh/dyGhk/YH4TwTSRxTzhuHyZg== - dependencies: - "@protobufjs/aspromise" "^1.1.2" - "@protobufjs/base64" "^1.1.2" - "@protobufjs/codegen" "^2.0.4" - "@protobufjs/eventemitter" "^1.1.0" - "@protobufjs/fetch" "^1.1.0" - "@protobufjs/float" "^1.0.2" - "@protobufjs/inquire" "^1.1.0" - "@protobufjs/path" "^1.1.2" - "@protobufjs/pool" "^1.1.0" - "@protobufjs/utf8" "^1.1.0" - "@types/long" "^4.0.1" - "@types/node" ">=13.7.0" - long "^4.0.0" - -proxy-addr@~2.0.7: - version "2.0.7" - resolved "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz" - integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== - dependencies: - forwarded "0.2.0" - ipaddr.js "1.9.1" - -proxy-from-env@^1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz" - integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== - -qs@6.11.0, qs@^6.9.4: - version "6.11.0" - resolved "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz" - integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== - dependencies: - side-channel "^1.0.4" - -randombytes@^2.0.1, randombytes@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz" - integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== - dependencies: - safe-buffer "^5.1.0" - -range-parser@~1.2.1: - version "1.2.1" - resolved "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz" - integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== - -raw-body@2.5.1: - version "2.5.1" - resolved "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz" - integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig== - dependencies: - bytes "3.1.2" - http-errors "2.0.0" - iconv-lite "0.4.24" - unpipe "1.0.0" - -react-is@^16.13.1, react-is@^16.7.0: - version "16.13.1" - resolved "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz" - integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== - -readable-stream@^3.6.0: - version "3.6.0" - resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz" - integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== - dependencies: - inherits "^2.0.3" - string_decoder "^1.1.1" - util-deprecate "^1.0.1" - -readable-stream@~1.0.31: - version "1.0.34" - resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz" - integrity sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg== - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.1" - isarray "0.0.1" - string_decoder "~0.10.x" - -readable-stream@~2.3.6: - version "2.3.7" - resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz" - integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== - 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" - -readdirp@~3.6.0: - version "3.6.0" - resolved "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz" - integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== - dependencies: - picomatch "^2.2.1" - -readonly-date@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/readonly-date/-/readonly-date-1.0.0.tgz" - integrity sha512-tMKIV7hlk0h4mO3JTmmVuIlJVXjKk3Sep9Bf5OH0O+758ruuVkUy2J9SttDLm91IEX/WHlXPSpxMGjPj4beMIQ== - -rechoir@^0.6.2: - version "0.6.2" - resolved "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz" - integrity sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw== - dependencies: - resolve "^1.1.6" - -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== - -regenerator-runtime@^0.13.4: - version "0.13.10" - resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.10.tgz" - integrity sha512-KepLsg4dU12hryUO7bp/axHAKvwGOCV0sGloQtpagJ12ai+ojVDqkeGSiRX1zlq+kjIMZ1t7gpze+26QqtdGqw== - -require-directory@^2.1.1: - version "2.1.1" - resolved "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz" - integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== - -resolve@^1.1.6: - version "1.22.1" - resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz" - integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== - dependencies: - is-core-module "^2.9.0" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - -response-iterator@^0.2.6: - version "0.2.6" - resolved "https://registry.npmjs.org/response-iterator/-/response-iterator-0.2.6.tgz" - integrity sha512-pVzEEzrsg23Sh053rmDUvLSkGXluZio0qu8VT6ukrYuvtjVfCbDZH9d6PGXb8HZfzdNZt8feXv/jvUzlhRgLnw== - -rimraf@^3.0.0: - version "3.0.2" - resolved "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz" - integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== - dependencies: - glob "^7.1.3" - -ripemd160-min@0.0.6: - version "0.0.6" - resolved "https://registry.npmjs.org/ripemd160-min/-/ripemd160-min-0.0.6.tgz" - integrity sha512-+GcJgQivhs6S9qvLogusiTcS9kQUfgR75whKuy5jIhuiOfQuJ8fjqxV6EGD5duH1Y/FawFUMtMhyeq3Fbnib8A== - -ripemd160@^2.0.0, ripemd160@^2.0.1: - version "2.0.2" - resolved "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz" - 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.npmjs.org/rlp/-/rlp-2.2.7.tgz" - integrity sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ== - dependencies: - bn.js "^5.2.0" - -rpc-websockets@^7.5.0: - version "7.5.0" - resolved "https://registry.npmjs.org/rpc-websockets/-/rpc-websockets-7.5.0.tgz" - integrity sha512-9tIRi1uZGy7YmDjErf1Ax3wtqdSSLIlnmL5OtOzgd5eqPKbsPpwDP5whUDO2LQay3Xp0CcHlcNSGzacNRluBaQ== - dependencies: - "@babel/runtime" "^7.17.2" - eventemitter3 "^4.0.7" - uuid "^8.3.2" - ws "^8.5.0" - optionalDependencies: - bufferutil "^4.0.1" - utf-8-validate "^5.0.2" - -rxjs@^7.5.6: - version "7.5.7" - resolved "https://registry.npmjs.org/rxjs/-/rxjs-7.5.7.tgz" - integrity sha512-z9MzKh/UcOqB3i20H6rtrlaE/CgjLOvheWK/9ILrbhROGTweAi1BaFsTT9FbwZi5Trr1qNRs+MXkhmR06awzQA== - dependencies: - tslib "^2.1.0" - -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.0: - version "5.2.1" - resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" - integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== - -safe-buffer@~5.1.0, safe-buffer@~5.1.1: - version "5.1.2" - resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" - integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== - -"safer-buffer@>= 2.1.2 < 3": - version "2.1.2" - resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" - integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== - -scrypt-js@3.0.1, scrypt-js@^3.0.0: - version "3.0.1" - resolved "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz" - integrity sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA== - -secp256k1@3.7.1: - version "3.7.1" - resolved "https://registry.npmjs.org/secp256k1/-/secp256k1-3.7.1.tgz" - integrity sha512-1cf8sbnRreXrQFdH6qsg2H71Xw91fCCS9Yp021GnUNJzWJS/py96fS4lHbnTnouLp08Xj6jBoBB6V78Tdbdu5g== - dependencies: - bindings "^1.5.0" - bip66 "^1.1.5" - bn.js "^4.11.8" - create-hash "^1.2.0" - drbg.js "^1.0.1" - elliptic "^6.4.1" - nan "^2.14.0" - safe-buffer "^5.1.2" - -secp256k1@4.0.3, secp256k1@^4.0.1, secp256k1@^4.0.2, secp256k1@^4.0.3: - version "4.0.3" - resolved "https://registry.npmjs.org/secp256k1/-/secp256k1-4.0.3.tgz" - integrity sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA== - dependencies: - elliptic "^6.5.4" - node-addon-api "^2.0.0" - node-gyp-build "^4.2.0" - -semver@^7.3.2: - version "7.3.8" - resolved "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz" - integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A== - dependencies: - lru-cache "^6.0.0" - -send@0.18.0: - version "0.18.0" - resolved "https://registry.npmjs.org/send/-/send-0.18.0.tgz" - integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg== - 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.0: - version "6.0.0" - resolved "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz" - integrity sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag== - dependencies: - randombytes "^2.1.0" - -serve-static@1.15.0: - version "1.15.0" - resolved "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz" - integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== - dependencies: - encodeurl "~1.0.2" - escape-html "~1.0.3" - parseurl "~1.3.3" - send "0.18.0" - -setimmediate@^1.0.5: - version "1.0.5" - resolved "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz" - integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA== - -setprototypeof@1.2.0: - version "1.2.0" - resolved "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz" - integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== - -sha.js@^2.4.0, sha.js@^2.4.8: - version "2.4.11" - resolved "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz" - integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== - dependencies: - inherits "^2.0.1" - safe-buffer "^5.0.1" - -sha3@^2.1.1: - version "2.1.4" - resolved "https://registry.npmjs.org/sha3/-/sha3-2.1.4.tgz" - integrity sha512-S8cNxbyb0UGUM2VhRD4Poe5N58gJnJsLJ5vC7FYWGUmGhcsj4++WaIOBFVDxlG0W3To6xBuiRh+i0Qp2oNCOtg== - dependencies: - buffer "6.0.3" - -shelljs@^0.8.5: - version "0.8.5" - resolved "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz" - integrity sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow== - dependencies: - glob "^7.0.0" - interpret "^1.0.0" - rechoir "^0.6.2" - -shx@^0.3.2: - version "0.3.4" - resolved "https://registry.npmjs.org/shx/-/shx-0.3.4.tgz" - integrity sha512-N6A9MLVqjxZYcVn8hLmtneQWIJtp8IKzMP4eMnx+nqkvXoqinUPCbUFLp2UcWTEIUONhlk0ewxr/jaVGlc+J+g== - dependencies: - minimist "^1.2.3" - shelljs "^0.8.5" - -side-channel@^1.0.4: - version "1.0.4" - resolved "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz" - integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== - dependencies: - call-bind "^1.0.0" - get-intrinsic "^1.0.2" - object-inspect "^1.9.0" - -snake-case@^3.0.4: - version "3.0.4" - resolved "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz" - integrity sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg== - dependencies: - dot-case "^3.0.4" - tslib "^2.0.3" - -snakecase-keys@^5.1.2, snakecase-keys@^5.4.1: - version "5.4.4" - resolved "https://registry.npmjs.org/snakecase-keys/-/snakecase-keys-5.4.4.tgz" - integrity sha512-YTywJG93yxwHLgrYLZjlC75moVEX04LZM4FHfihjHe1FCXm+QaLOFfSf535aXOAd0ArVQMWUAe8ZPm4VtWyXaA== - dependencies: - map-obj "^4.1.0" - snake-case "^3.0.4" - type-fest "^2.5.2" - -source-map-support@^0.5.6: - version "0.5.21" - resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz" - 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.npmjs.org/source-map/-/source-map-0.6.1.tgz" - integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== - -statuses@2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz" - integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== - -"statuses@>= 1.5.0 < 2": - version "1.5.0" - resolved "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz" - integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== - -store2@^2.12.0: - version "2.14.2" - resolved "https://registry.npmjs.org/store2/-/store2-2.14.2.tgz" - integrity sha512-siT1RiqlfQnGqgT/YzXVUNsom9S0H1OX+dpdGN1xkyYATo4I6sep5NmsRD/40s3IIOvlCq6akxkqG82urIZW1w== - -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@^4.1.0, string-width@^4.2.0: - version "4.2.3" - resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" - 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_decoder@^1.1.1: - 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" - -string_decoder@~0.10.x: - version "0.10.31" - resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz" - integrity sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ== - -string_decoder@~1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz" - integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== - dependencies: - safe-buffer "~5.1.0" - -strip-ansi@^6.0.0, strip-ansi@^6.0.1: - version "6.0.1" - resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -strip-bom@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz" - integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== - -strip-hex-prefix@1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz" - integrity sha512-q8d4ue7JGEiVcypji1bALTos+0pWtyGlivAWyPuTkHzuTCJqrK9sWxYQZUq6Nq3cuyv3bm734IhHvHtGGURU6A== - dependencies: - is-hex-prefixed "1.0.0" - -strip-json-comments@3.1.1: - version "3.1.1" - resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz" - integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== - -superagent@^6.1.0: - version "6.1.0" - resolved "https://registry.npmjs.org/superagent/-/superagent-6.1.0.tgz" - integrity sha512-OUDHEssirmplo3F+1HWKUrUjvnQuA+nZI6i/JJBdXb5eq9IyEQwPyPpqND+SSsxf6TygpBEkUjISVRN4/VOpeg== - dependencies: - component-emitter "^1.3.0" - cookiejar "^2.1.2" - debug "^4.1.1" - fast-safe-stringify "^2.0.7" - form-data "^3.0.0" - formidable "^1.2.2" - methods "^1.1.2" - mime "^2.4.6" - qs "^6.9.4" - readable-stream "^3.6.0" - semver "^7.3.2" - -superstruct@^0.14.2: - version "0.14.2" - resolved "https://registry.npmjs.org/superstruct/-/superstruct-0.14.2.tgz" - integrity sha512-nPewA6m9mR3d6k7WkZ8N8zpTWfenFH3q9pA2PkuiZxINr9DKB2+40wEQf0ixn8VaGuJ78AB6iWOtStI+/4FKZQ== - -superstruct@^0.15.4: - version "0.15.5" - resolved "https://registry.yarnpkg.com/superstruct/-/superstruct-0.15.5.tgz#0f0a8d3ce31313f0d84c6096cd4fa1bfdedc9dab" - integrity sha512-4AOeU+P5UuE/4nOUkmcQdW5y7i9ndt1cQd/3iUe+LTz3RxESf/W/5lg4B74HbDMMv8PHnPnGCQFH45kBcrQYoQ== - -supports-color@8.1.1: - version "8.1.1" - resolved "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz" - integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== - dependencies: - has-flag "^4.0.0" - -supports-color@^5.3.0: - version "5.5.0" - resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz" - integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== - dependencies: - has-flag "^3.0.0" - -supports-color@^7.1.0: - version "7.2.0" - resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" - 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.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz" - integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== - -symbol-observable@^2.0.3: - version "2.0.3" - resolved "https://registry.npmjs.org/symbol-observable/-/symbol-observable-2.0.3.tgz" - integrity sha512-sQV7phh2WCYAn81oAkakC5qjq2Ml0g8ozqz03wOGnx9dDlG1de6yrF+0RAzSJD8fPUow3PTSMf2SAbOGxb93BA== - -symbol-observable@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/symbol-observable/-/symbol-observable-4.0.0.tgz" - integrity sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ== - -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" - -text-encoding-utf-8@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/text-encoding-utf-8/-/text-encoding-utf-8-1.0.2.tgz" - integrity sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg== - -through2@^2.0.1: - version "2.0.5" - resolved "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz" - integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== - dependencies: - readable-stream "~2.3.6" - xtend "~4.0.1" - -"through@>=2.2.7 <3": - version "2.3.8" - resolved "https://registry.npmjs.org/through/-/through-2.3.8.tgz" - integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== - -tiny-secp256k1@^1.1.3: - version "1.1.6" - resolved "https://registry.npmjs.org/tiny-secp256k1/-/tiny-secp256k1-1.1.6.tgz" - integrity sha512-FmqJZGduTyvsr2cF3375fqGHUovSwDi/QytexX1Se4BPuPZpTE5Ftp5fg+EFSuEf3lhZqgCRjEG3ydUQ/aNiwA== - dependencies: - bindings "^1.3.0" - bn.js "^4.11.8" - create-hmac "^1.1.7" - elliptic "^6.4.0" - nan "^2.13.2" - -tmp@^0.2.1: - version "0.2.1" - resolved "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz" - integrity sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ== - dependencies: - rimraf "^3.0.0" - -to-regex-range@^5.0.1: - version "5.0.1" - resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" - integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== - dependencies: - is-number "^7.0.0" - -toidentifier@1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz" - integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== - -toml@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/toml/-/toml-3.0.0.tgz#342160f1af1904ec9d204d03a5d61222d762c5ee" - integrity sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w== - -tr46@~0.0.3: - version "0.0.3" - resolved "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz" - integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== - -ts-command-line-args@^2.2.0: - version "2.3.1" - resolved "https://registry.yarnpkg.com/ts-command-line-args/-/ts-command-line-args-2.3.1.tgz#b6188e42efc6cf7a8898e438a873fbb15505ddd6" - integrity sha512-FR3y7pLl/fuUNSmnPhfLArGqRrpojQgIEEOVzYx9DhTmfIN7C9RWSfpkJEF4J+Gk7aVx5pak8I7vWZsaN4N84g== - 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-invariant@^0.10.3: - version "0.10.3" - resolved "https://registry.npmjs.org/ts-invariant/-/ts-invariant-0.10.3.tgz" - integrity sha512-uivwYcQaxAucv1CzRp2n/QdYPo4ILf9VXgH19zEIjFx2EJufV16P0JtJVpYHy89DItG6Kwj2oIUjrcK5au+4tQ== - dependencies: - tslib "^2.1.0" - -ts-mocha@^10.0.0: - version "10.0.0" - resolved "https://registry.npmjs.org/ts-mocha/-/ts-mocha-10.0.0.tgz" - integrity sha512-VRfgDO+iiuJFlNB18tzOfypJ21xn2xbuZyDvJvqpTbWgkAgD17ONGr8t+Tl8rcBtOBdjXp5e/Rk+d39f7XBHRw== - dependencies: - ts-node "7.0.1" - optionalDependencies: - tsconfig-paths "^3.5.0" - -ts-node@7.0.1: - version "7.0.1" - resolved "https://registry.npmjs.org/ts-node/-/ts-node-7.0.1.tgz" - integrity sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw== - dependencies: - arrify "^1.0.0" - buffer-from "^1.1.0" - diff "^3.1.0" - make-error "^1.1.1" - minimist "^1.2.0" - mkdirp "^0.5.1" - source-map-support "^0.5.6" - yn "^2.0.0" - -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" - -tsconfig-paths@^3.5.0: - version "3.14.1" - resolved "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz" - integrity sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ== - dependencies: - "@types/json5" "^0.0.29" - json5 "^1.0.1" - minimist "^1.2.6" - strip-bom "^3.0.0" - -tslib@^2.0.3, tslib@^2.1.0, tslib@^2.3.0: - version "2.4.0" - resolved "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz" - integrity sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ== - -tweetnacl-util@^0.15.1: - version "0.15.1" - resolved "https://registry.npmjs.org/tweetnacl-util/-/tweetnacl-util-0.15.1.tgz" - integrity sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw== - -tweetnacl@1.0.3, tweetnacl@^1.0.1, tweetnacl@^1.0.3: - version "1.0.3" - resolved "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz" - integrity sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw== - -type-detect@^4.0.0, type-detect@^4.0.5: - version "4.0.8" - resolved "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz" - integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== - -type-fest@^2.5.2: - version "2.19.0" - resolved "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz" - integrity sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA== - -type-is@~1.6.18: - version "1.6.18" - resolved "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz" - integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== - dependencies: - media-typer "0.3.0" - mime-types "~2.1.24" - -typechain@^8.1.1: - version "8.1.1" - resolved "https://registry.yarnpkg.com/typechain/-/typechain-8.1.1.tgz#9c2e8012c2c4c586536fc18402dcd7034c4ff0bd" - integrity sha512-uF/sUvnXTOVF2FHKhQYnxHk4su4JjZR8vr4mA2mBaRwHTbwh0jIlqARz9XJr1tA0l7afJGvEa1dTSi4zt039LQ== - 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" - -typeforce@^1.11.5: - version "1.18.0" - resolved "https://registry.npmjs.org/typeforce/-/typeforce-1.18.0.tgz" - integrity sha512-7uc1O8h1M1g0rArakJdf0uLRSSgFcYexrVoKo+bzJd32gd4gDy2L/Z+8/FjPnU9ydY3pEnVPtr9FyscYY60K1g== - -typescript@^4.8.3: - version "4.8.4" - resolved "https://registry.npmjs.org/typescript/-/typescript-4.8.4.tgz" - integrity sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ== - -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== - -u3@^0.1.1: - version "0.1.1" - resolved "https://registry.npmjs.org/u3/-/u3-0.1.1.tgz" - integrity sha512-+J5D5ir763y+Am/QY6hXNRlwljIeRMZMGs0cT6qqZVVzzT3X3nFPXVyPOFRMOR4kupB0T8JnCdpWdp6Q/iXn3w== - -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== - -unpipe@1.0.0, unpipe@~1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" - integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== - -untildify@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz" - integrity sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw== - -utf-8-validate@^5.0.2, utf-8-validate@^5.0.5: - version "5.0.9" - resolved "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.9.tgz" - integrity sha512-Yek7dAy0v3Kl0orwMlvi7TPtiCNrdfHNd7Gcc/pLq4BLXqfAmd0J7OWMizUQnTTJsyjKn02mU7anqwfmUP4J8Q== - dependencies: - node-gyp-build "^4.3.0" - -util-deprecate@^1.0.1, util-deprecate@~1.0.1: - version "1.0.2" - resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" - integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== - -utils-merge@1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz" - integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== - -uuid@^8.3.2: - version "8.3.2" - resolved "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz" - 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== - -vary@~1.1.2: - version "1.1.2" - resolved "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz" - integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== - -vlq@^2.0.4: - version "2.0.4" - resolved "https://registry.npmjs.org/vlq/-/vlq-2.0.4.tgz" - integrity sha512-aodjPa2wPQFkra1G8CzJBTHXhgk3EVSwxSWXNPr1fgdFLUb8kvLV1iEb6rFgasIsjP82HWI6dsb5Io26DDnasA== - -webidl-conversions@^3.0.0: - version "3.0.1" - resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz" - integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== - -whatwg-url@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz" - integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== - dependencies: - tr46 "~0.0.3" - webidl-conversions "^3.0.0" - -wif@^2.0.6: - version "2.0.6" - resolved "https://registry.npmjs.org/wif/-/wif-2.0.6.tgz" - integrity sha512-HIanZn1zmduSF+BQhkE+YXIbEiH0xPr1012QbFEGB0xsKqJii0/SqJjyn8dFv6y36kOznMgMB+LGcbZTJ1xACQ== - dependencies: - bs58check "<3.0.0" - -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.npmjs.org/workerpool/-/workerpool-6.2.1.tgz" - integrity sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw== - -wrap-ansi@^7.0.0: - version "7.0.0" - resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" - 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.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" - integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== - -ws@7.4.6, ws@^7, ws@^7.4.5: - version "7.4.6" - resolved "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz" - integrity sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A== - -ws@^7.5.8, ws@^7.5.9: - version "7.5.9" - resolved "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz" - integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== - -ws@^8.5.0: - version "8.9.0" - resolved "https://registry.npmjs.org/ws/-/ws-8.9.0.tgz" - integrity sha512-Ja7nszREasGaYUYCI2k4lCKIRTt+y7XuqVoHR44YpI49TtryyqbqvDMn5eqfW7e6HzTukDRIsXqzVHScqRcafg== - -xstream@^11.14.0: - version "11.14.0" - resolved "https://registry.npmjs.org/xstream/-/xstream-11.14.0.tgz" - integrity sha512-1bLb+kKKtKPbgTK6i/BaoAn03g47PpFstlbe1BA+y3pNS/LfvcaghS5BFf9+EE1J+KwSQsEpfJvFN5GqFtiNmw== - dependencies: - globalthis "^1.0.1" - symbol-observable "^2.0.3" - -xtend@~4.0.1: - version "4.0.2" - resolved "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz" - integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== - -y18n@^5.0.5: - version "5.0.8" - resolved "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz" - integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== - -yallist@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz" - integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== - -yargs-parser@20.2.4: - version "20.2.4" - resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz" - integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA== - -yargs-parser@^20.2.2: - version "20.2.9" - resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz" - integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== - -yargs-unparser@2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz" - 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, yargs@^16.1.0: - version "16.2.0" - resolved "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz" - 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== - -yn@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/yn/-/yn-2.0.0.tgz" - integrity sha512-uTv8J/wiWTgUTg+9vLTi//leUl5vDQS6uii/emeTb2ssY7vl6QWf2fFbIIGjnhjvbdKlU0ed7QPgY1htTC86jQ== - -yocto-queue@^0.1.0: - version "0.1.0" - resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz" - integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== - -zen-observable-ts@^1.2.5: - version "1.2.5" - resolved "https://registry.npmjs.org/zen-observable-ts/-/zen-observable-ts-1.2.5.tgz" - integrity sha512-QZWQekv6iB72Naeake9hS1KxHlotfRpe+WGNbNx5/ta+R3DNjVO2bswf63gXlWDcs+EMd7XY8HfVQyP1X6T4Zg== - dependencies: - zen-observable "0.8.15" - -zen-observable@0.8.15: - version "0.8.15" - resolved "https://registry.npmjs.org/zen-observable/-/zen-observable-0.8.15.tgz" - integrity sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ==